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;
            }
        }