SpriteBoneData ISpriteMeshData.GetBoneData(int index) { var worldToLocalMatrix = sprite.worldToLocalMatrix; //We expect m_Bones to contain character's bones references if character exists. Sprite's skeleton bones otherwise. if (skinningCache.hasCharacter) { worldToLocalMatrix = sprite.GetCharacterPart().worldToLocalMatrix; } SpriteBoneData spriteBoneData = null; var bone = m_Bones[index]; if (bone == null) { spriteBoneData = new SpriteBoneData(); } else { spriteBoneData = new SpriteBoneData() { name = bone.name, parentId = bone.parentBone == null ? -1 : m_Bones.IndexOf(bone.parentBone), localPosition = bone.localPosition, localRotation = bone.localRotation, position = worldToLocalMatrix.MultiplyPoint3x4(bone.position), endPosition = worldToLocalMatrix.MultiplyPoint3x4(bone.endPosition), depth = bone.depth, length = bone.localLength }; } return(spriteBoneData); }
public override bool ApplyRevert(bool apply) { if (apply) { var meshDataProvider = spriteEditor.GetDataProvider <ISpriteMeshDataProvider>(); var boneDataProvider = spriteEditor.GetDataProvider <ISpriteBoneDataProvider>(); foreach (var spriteMeshData in m_SpriteMeshCache) { spriteMeshData.SortTrianglesByDepth(); List <Vertex2DMetaData> vmd = new List <Vertex2DMetaData>(spriteMeshData.vertices.Count); foreach (var v in spriteMeshData.vertices) { vmd.Add(new Vertex2DMetaData() { position = v.position - spriteMeshData.frame.position, boneWeight = v.editableBoneWeight.ToBoneWeight(true) }); } List <Vector2Int> emd = new List <Vector2Int>(spriteMeshData.edges.Count); foreach (var e in spriteMeshData.edges) { emd.Add(new Vector2Int(e.index1, e.index2)); } meshDataProvider.SetVertices(spriteMeshData.spriteID, vmd.ToArray()); meshDataProvider.SetIndices(spriteMeshData.spriteID, spriteMeshData.indices.ToArray()); meshDataProvider.SetEdges(spriteMeshData.spriteID, emd.ToArray()); List <SpriteBone> bones = boneDataProvider.GetBones(spriteMeshData.spriteID); for (int i = 0; i < bones.Count; ++i) { SpriteBone original = bones[i]; SpriteBoneData bone = spriteMeshData.bones[i]; Vector3 position = original.position; position.z = bone.depth; original.position = position; bones[i] = original; } boneDataProvider.SetBones(spriteMeshData.spriteID, bones); } } return(true); }
public void OnInspectorGUI() { Debug.Assert(spriteMeshData != null); Debug.Assert(selection != null); Debug.Assert(selection.Count == 1); SpriteBoneData bone = spriteMeshData.bones[selection.single]; EditorGUI.BeginChangeCheck(); float depth = (float)EditorGUILayout.IntField("Bone Depth", Mathf.RoundToInt(bone.depth)); if (EditorGUI.EndChangeCheck()) { Undo.RegisterCompleteObjectUndo(undoableObject, "Edit Depth"); bone.depth = depth; } }