mirror of
https://github.com/EsotericSoftware/spine-runtimes.git
synced 2026-03-26 22:49:01 +08:00
[unity] Minor cleanup of Skeleton Baking.
This commit is contained in:
parent
488e6a8b2c
commit
331228e5e4
@ -543,7 +543,7 @@ namespace Spine.Unity.Editor {
|
|||||||
Vector3[] verts = ExtractVerts(floatVerts);
|
Vector3[] verts = ExtractVerts(floatVerts);
|
||||||
|
|
||||||
int[] triangles = attachment.Triangles;
|
int[] triangles = attachment.Triangles;
|
||||||
Color color = new Color(attachment.R, attachment.G, attachment.B, attachment.A);
|
Color color = attachment.GetColor();
|
||||||
|
|
||||||
if (mesh == null)
|
if (mesh == null)
|
||||||
mesh = new Mesh();
|
mesh = new Mesh();
|
||||||
@ -596,7 +596,7 @@ namespace Spine.Unity.Editor {
|
|||||||
}
|
}
|
||||||
|
|
||||||
internal static Mesh ExtractWeightedMeshAttachment (string name, MeshAttachment attachment, int slotIndex, SkeletonData skeletonData, List<Transform> boneList, Mesh mesh = null) {
|
internal static Mesh ExtractWeightedMeshAttachment (string name, MeshAttachment attachment, int slotIndex, SkeletonData skeletonData, List<Transform> boneList, Mesh mesh = null) {
|
||||||
if (attachment.Bones == null)
|
if (!attachment.IsWeighted())
|
||||||
throw new System.ArgumentException("Mesh is not weighted.", "attachment");
|
throw new System.ArgumentException("Mesh is not weighted.", "attachment");
|
||||||
|
|
||||||
Skeleton skeleton = new Skeleton(skeletonData);
|
Skeleton skeleton = new Skeleton(skeletonData);
|
||||||
|
|||||||
@ -44,17 +44,24 @@ namespace Spine.Unity.Editor {
|
|||||||
EditorGUIUtility.wideMode = true;
|
EditorGUIUtility.wideMode = true;
|
||||||
EditorGUILayout.LabelField("Spine Skeleton Prefab Baking", EditorStyles.boldLabel);
|
EditorGUILayout.LabelField("Spine Skeleton Prefab Baking", EditorStyles.boldLabel);
|
||||||
|
|
||||||
const string BakingWarningMessage = "\nThe main use of Baking is to export Spine projects to be used without the Spine Runtime (ie: for sale on the Asset Store, or background objects that are animated only with a wind noise generator)" +
|
const string BakingWarningMessage = "\nSkeleton baking is not the primary use case for Spine skeletons." +
|
||||||
|
"\nUse baking if you have specialized uses, such as simplified skeletons with movement driven by physics." +
|
||||||
|
|
||||||
"\n\nBaking does not support the following:" +
|
"\n\nBaked Skeletons do not support the following:" +
|
||||||
"\n\tDisabled transform inheritance" +
|
"\n\tDisabled rotation or scale inheritance" +
|
||||||
"\n\tShear" +
|
"\n\tLocal Shear" +
|
||||||
|
"\n\tAll Constraint types" +
|
||||||
|
"\n\tWeighted mesh verts with more than 4 bound bones" +
|
||||||
|
|
||||||
|
"\n\nBaked Animations do not support the following:" +
|
||||||
|
"\n\tMesh Deform Keys" +
|
||||||
"\n\tColor Keys" +
|
"\n\tColor Keys" +
|
||||||
"\n\tDraw Order Keys" +
|
"\n\tDraw Order Keys" +
|
||||||
"\n\tAll Constraint types" +
|
|
||||||
|
|
||||||
"\n\nCurves are sampled at 60fps and are not realtime." +
|
"\n\nAnimation Curves are sampled at 60fps and are not realtime." +
|
||||||
"\nPlease read SkeletonBaker.cs comments for full details.\n";
|
"\nConstraint animations are also baked into animation curves." +
|
||||||
|
"\nSee SkeletonBaker.cs comments for full details.\n";
|
||||||
|
|
||||||
EditorGUILayout.HelpBox(BakingWarningMessage, MessageType.Info, true);
|
EditorGUILayout.HelpBox(BakingWarningMessage, MessageType.Info, true);
|
||||||
|
|
||||||
EditorGUI.BeginChangeCheck();
|
EditorGUI.BeginChangeCheck();
|
||||||
@ -69,52 +76,69 @@ namespace Spine.Unity.Editor {
|
|||||||
if (skeletonDataAsset == null) return;
|
if (skeletonDataAsset == null) return;
|
||||||
var skeletonData = skeletonDataAsset.GetSkeletonData(false);
|
var skeletonData = skeletonDataAsset.GetSkeletonData(false);
|
||||||
if (skeletonData == null) return;
|
if (skeletonData == null) return;
|
||||||
|
bool hasExtraSkins = skeletonData.Skins.Count > 1;
|
||||||
|
|
||||||
using (new SpineInspectorUtility.BoxScope(false)) {
|
using (new SpineInspectorUtility.BoxScope(false)) {
|
||||||
EditorGUILayout.LabelField(skeletonDataAsset.name, EditorStyles.boldLabel);
|
EditorGUILayout.LabelField(skeletonDataAsset.name, EditorStyles.boldLabel);
|
||||||
using (new SpineInspectorUtility.IndentScope()) {
|
using (new SpineInspectorUtility.IndentScope()) {
|
||||||
EditorGUILayout.LabelField(SpineInspectorUtility.TempContent("Bones: " + skeletonData.Bones.Count, Icons.bone));
|
EditorGUILayout.LabelField(SpineInspectorUtility.TempContent("Bones: " + skeletonData.Bones.Count, Icons.bone));
|
||||||
|
EditorGUILayout.LabelField(SpineInspectorUtility.TempContent("Slots: " + skeletonData.Slots.Count, Icons.slotRoot));
|
||||||
|
|
||||||
|
if (hasExtraSkins) {
|
||||||
|
EditorGUILayout.LabelField(SpineInspectorUtility.TempContent("Skins: " + skeletonData.Skins.Count, Icons.skinsRoot));
|
||||||
|
EditorGUILayout.LabelField(SpineInspectorUtility.TempContent("Current skin attachments: " + (bakeSkin == null ? 0 : bakeSkin.Attachments.Count), Icons.skinPlaceholder));
|
||||||
|
} else if (skeletonData.Skins.Count == 1) {
|
||||||
|
EditorGUILayout.LabelField(SpineInspectorUtility.TempContent("Skins: 1 (only default Skin)", Icons.skinsRoot));
|
||||||
|
}
|
||||||
|
|
||||||
int totalAttachments = 0;
|
int totalAttachments = 0;
|
||||||
foreach (var s in skeletonData.Skins) totalAttachments += s.Attachments.Count;
|
foreach (var s in skeletonData.Skins)
|
||||||
|
totalAttachments += s.Attachments.Count;
|
||||||
EditorGUILayout.LabelField(SpineInspectorUtility.TempContent("Total Attachments: " + totalAttachments, Icons.genericAttachment));
|
EditorGUILayout.LabelField(SpineInspectorUtility.TempContent("Total Attachments: " + totalAttachments, Icons.genericAttachment));
|
||||||
EditorGUILayout.LabelField(SpineInspectorUtility.TempContent("Current skin attachments: " + (bakeSkin == null ? 0 : bakeSkin.Attachments.Count), Icons.skinPlaceholder));
|
|
||||||
EditorGUILayout.LabelField(SpineInspectorUtility.TempContent("Animations: " + skeletonData.Animations.Count, Icons.animation));
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
using (new SpineInspectorUtility.BoxScope(false)) {
|
using (new SpineInspectorUtility.BoxScope(false)) {
|
||||||
EditorGUILayout.LabelField("Settings", EditorStyles.boldLabel);
|
EditorGUILayout.LabelField("Animations", EditorStyles.boldLabel);
|
||||||
|
EditorGUILayout.LabelField(SpineInspectorUtility.TempContent("Animations: " + skeletonData.Animations.Count, Icons.animation));
|
||||||
|
|
||||||
using (new SpineInspectorUtility.IndentScope()) {
|
using (new SpineInspectorUtility.IndentScope()) {
|
||||||
bakeAnimations = EditorGUILayout.Toggle(SpineInspectorUtility.TempContent("Bake Animations", Icons.animationRoot), bakeAnimations);
|
bakeAnimations = EditorGUILayout.Toggle(SpineInspectorUtility.TempContent("Bake Animations", Icons.animationRoot), bakeAnimations);
|
||||||
bakeIK = EditorGUILayout.Toggle(SpineInspectorUtility.TempContent("Bake IK", Icons.constraintIK), bakeIK);
|
using (new EditorGUI.DisabledScope(!bakeAnimations)) {
|
||||||
bakeEventOptions = (SendMessageOptions)EditorGUILayout.EnumPopup(SpineInspectorUtility.TempContent("Event Options", Icons.userEvent), bakeEventOptions);
|
using (new SpineInspectorUtility.IndentScope()) {
|
||||||
|
bakeIK = EditorGUILayout.Toggle(SpineInspectorUtility.TempContent("Bake IK", Icons.constraintIK), bakeIK);
|
||||||
|
bakeEventOptions = (SendMessageOptions)EditorGUILayout.EnumPopup(SpineInspectorUtility.TempContent("Event Options", Icons.userEvent), bakeEventOptions);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
EditorGUILayout.Space();
|
EditorGUILayout.Space();
|
||||||
|
|
||||||
EditorGUI.BeginChangeCheck();
|
|
||||||
EditorGUILayout.PropertyField(so.FindProperty("skinToBake"));
|
|
||||||
if (EditorGUI.EndChangeCheck()) {
|
|
||||||
so.ApplyModifiedProperties();
|
|
||||||
Repaint();
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!string.IsNullOrEmpty(skinToBake) && UnityEngine.Event.current.type == EventType.Repaint)
|
if (!string.IsNullOrEmpty(skinToBake) && UnityEngine.Event.current.type == EventType.Repaint)
|
||||||
bakeSkin = skeletonData.FindSkin(skinToBake) ?? skeletonData.DefaultSkin;
|
bakeSkin = skeletonData.FindSkin(skinToBake) ?? skeletonData.DefaultSkin;
|
||||||
|
|
||||||
var prefabIcon = EditorGUIUtility.FindTexture("PrefabModel Icon");
|
var prefabIcon = EditorGUIUtility.FindTexture("PrefabModel Icon");
|
||||||
|
|
||||||
if (SpineInspectorUtility.LargeCenteredButton(SpineInspectorUtility.TempContent(string.Format("Bake Skin ({0})", (bakeSkin == null ? "default" : bakeSkin.Name)), prefabIcon))) {
|
if (hasExtraSkins) {
|
||||||
SkeletonBaker.BakeToPrefab(skeletonDataAsset, new ExposedList<Skin>(new [] { bakeSkin }), "", bakeAnimations, bakeIK, bakeEventOptions);
|
EditorGUI.BeginChangeCheck();
|
||||||
}
|
EditorGUILayout.PropertyField(so.FindProperty("skinToBake"));
|
||||||
|
if (EditorGUI.EndChangeCheck()) {
|
||||||
|
so.ApplyModifiedProperties();
|
||||||
|
Repaint();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (SpineInspectorUtility.LargeCenteredButton(SpineInspectorUtility.TempContent(string.Format("Bake Skeleton with Skin ({0})", (bakeSkin == null ? "default" : bakeSkin.Name)), prefabIcon))) {
|
||||||
|
SkeletonBaker.BakeToPrefab(skeletonDataAsset, new ExposedList<Skin>(new[] { bakeSkin }), "", bakeAnimations, bakeIK, bakeEventOptions);
|
||||||
|
}
|
||||||
|
|
||||||
if (skeletonData.Skins.Count > 1) {
|
|
||||||
if (SpineInspectorUtility.LargeCenteredButton(SpineInspectorUtility.TempContent(string.Format("Bake All ({0} skins)", skeletonData.Skins.Count), prefabIcon))) {
|
if (SpineInspectorUtility.LargeCenteredButton(SpineInspectorUtility.TempContent(string.Format("Bake All ({0} skins)", skeletonData.Skins.Count), prefabIcon))) {
|
||||||
SkeletonBaker.BakeToPrefab(skeletonDataAsset, skeletonData.Skins, "", bakeAnimations, bakeIK, bakeEventOptions);
|
SkeletonBaker.BakeToPrefab(skeletonDataAsset, skeletonData.Skins, "", bakeAnimations, bakeIK, bakeEventOptions);
|
||||||
}
|
}
|
||||||
}
|
} else {
|
||||||
|
if (SpineInspectorUtility.LargeCenteredButton(SpineInspectorUtility.TempContent("Bake Skeleton", prefabIcon))) {
|
||||||
|
SkeletonBaker.BakeToPrefab(skeletonDataAsset, new ExposedList<Skin>(new[] { bakeSkin }), "", bakeAnimations, bakeIK, bakeEventOptions);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user