private List <SpriteBoneData> CreateSpriteBoneData()
        {
            var spriteBones = new SpriteBone[2]
            {
                new SpriteBone()
                {
                    name     = "root",
                    parentId = -1,
                    position = Vector2.one,
                    rotation = Quaternion.Euler(0.0f, 0.0f, 30.0f),
                    length   = 1.0f
                },
                new SpriteBone()
                {
                    name     = "child1",
                    parentId = 0,
                    position = Vector3.up,
                    rotation = Quaternion.Euler(0.0f, 0.0f, 60.0f),
                    length   = 1.5f
                }
            };

            return(MeshModuleUtility.CreateSpriteBoneData(spriteBones.ToList(), Matrix4x4.identity));
        }
示例#2
0
        public void OnPasteActivated(bool bone, bool mesh, bool flipX, bool flipY)
        {
            var copyBuffer = m_CopyToolStringStore.stringStore;

            if (!SkinningCopyUtility.CanDeserializeStringToSkinningCopyData(copyBuffer))
            {
                Debug.LogError(TextContent.copyError1);
                return;
            }

            var skinningCopyData = SkinningCopyUtility.DeserializeStringToSkinningCopyData(copyBuffer);

            if (skinningCopyData == null || skinningCopyData.copyData.Count == 0)
            {
                Debug.LogError(TextContent.copyError2);
                return;
            }

            var scale = 1f;

            if (skinningCopyData.pixelsPerUnit > 0f)
            {
                scale = pixelsPerUnit / skinningCopyData.pixelsPerUnit;
            }

            var sprites      = skinningCache.GetSprites();
            var copyMultiple = skinningCopyData.copyData.Count > 1;

            if (copyMultiple && skinningCopyData.copyData.Count != sprites.Length && mesh)
            {
                Debug.LogError(String.Format(TextContent.copyError3, sprites.Length, skinningCopyData.copyData.Count));
                return;
            }

            using (skinningCache.UndoScope(TextContent.pasteData))
            {
                NewBonesStore newBonesStore = null;
                if (bone && copyMultiple && skinningCache.hasCharacter)
                {
                    newBonesStore = new NewBonesStore();
                    var skinningSpriteData = skinningCopyData.copyData[0];
                    newBonesStore.newBones = skinningCache.CreateBoneCacheFromSpriteBones(skinningSpriteData.spriteBones.Select(y => y.spriteBone).ToArray(), scale);
                    if (flipX || flipY)
                    {
                        var characterRect = new Rect(Vector2.zero, skinningCache.character.dimension);
                        var newPositions  = new Vector3[newBonesStore.newBones.Length];
                        var newRotations  = new Quaternion[newBonesStore.newBones.Length];
                        for (var i = 0; i < newBonesStore.newBones.Length; ++i)
                        {
                            newPositions[i] = GetFlippedBonePosition(newBonesStore.newBones[i], Vector2.zero, characterRect, flipX, flipY);
                            newRotations[i] = GetFlippedBoneRotation(newBonesStore.newBones[i], flipX, flipY);
                        }
                        for (var i = 0; i < newBonesStore.newBones.Length; ++i)
                        {
                            newBonesStore.newBones[i].position = newPositions[i];
                            newBonesStore.newBones[i].rotation = newRotations[i];
                        }
                    }
                    newBonesStore.MapAllExistingBones();
                    var skeleton = skinningCache.character.skeleton;
                    skeleton.SetBones(newBonesStore.newBones);
                    skinningCache.events.skeletonTopologyChanged.Invoke(skeleton);
                }

                foreach (var skinningSpriteData in skinningCopyData.copyData)
                {
                    SpriteCache sprite = null;
                    if (!String.IsNullOrEmpty(skinningSpriteData.spriteName))
                    {
                        sprite = sprites.FirstOrDefault(x => x.name == skinningSpriteData.spriteName);
                    }
                    if (sprite == null && (skinningCopyData.copyData.Count == 1 || String.IsNullOrEmpty(skinningSpriteData.spriteName)))
                    {
                        sprite = skinningCache.selectedSprite;
                    }
                    if (sprite == null)
                    {
                        continue;
                    }

                    if (bone && (!skinningCache.hasCharacter || !copyMultiple))
                    {
                        var spriteBones = new SpriteBone[skinningSpriteData.spriteBones.Count];
                        for (int i = 0; i < skinningSpriteData.spriteBones.Count; ++i)
                        {
                            var order = skinningSpriteData.spriteBones[i].order;
                            spriteBones[order] = skinningSpriteData.spriteBones[i].spriteBone;
                            var parentId = spriteBones[order].parentId;
                            if (parentId >= 0)
                            {
                                spriteBones[order].parentId = skinningSpriteData.spriteBones[parentId].order;
                            }
                        }
                        newBonesStore = PasteSkeletonBones(sprite, spriteBones.ToList(), flipX, flipY, scale);
                    }

                    if (mesh && meshTool != null)
                    {
                        PasteMesh(sprite, skinningSpriteData, flipX, flipY, scale, newBonesStore);
                    }
                }

                if (newBonesStore != null && newBonesStore.newBones != null)
                {
                    skinningCache.skeletonSelection.elements = newBonesStore.newBones;
                    skinningCache.events.boneSelectionChanged.Invoke();
                }
            }
            skinningCache.events.paste.Invoke(bone, mesh, flipX, flipY);
        }
        private static IEnumerable <TestCaseData> BoneMetadataCases()
        {
            var originalMetadata = new SpriteBone[5]
            {
                new SpriteBone()
                {
                    name     = "root",
                    parentId = -1,
                    position = Vector2.one,
                    rotation = Quaternion.Euler(0.0f, 0.0f, 30.0f),
                    length   = 1.0f
                },
                new SpriteBone()
                {
                    name     = "child1",
                    parentId = 0,
                    position = Vector3.up,
                    rotation = Quaternion.Euler(0.0f, 0.0f, 60.0f),
                    length   = 1.5f
                },
                new SpriteBone()
                {
                    name     = "child2",
                    parentId = 1,
                    position = Vector3.right,
                    rotation = Quaternion.identity,
                    length   = 1.5f
                },
                new SpriteBone()
                {
                    name     = "child3",
                    parentId = 1,
                    position = Vector3.left,
                    rotation = Quaternion.Euler(0.0f, 0.0f, 120.0f),
                    length   = 2.5f
                },
                new SpriteBone()
                {
                    name     = "child4",
                    parentId = 3,
                    position = Vector3.up,
                    rotation = Quaternion.identity,
                    length   = 1.0f
                }
            };

            var expectedPositions = new List <Vector2>();

            expectedPositions.Add(new Vector2(1f, 1f));
            expectedPositions.Add(new Vector2(0.5f, 1.8660f));
            expectedPositions.Add(new Vector2(0.5f, 2.8660f));
            expectedPositions.Add(new Vector2(0.5f, 0.8660f));
            expectedPositions.Add(new Vector2(1f, 0f));

            var expectedEndPositions = new List <Vector2>();

            expectedEndPositions.Add(new Vector2(1.8660f, 1.5f));
            expectedEndPositions.Add(new Vector2(0.5f, 3.3660f));
            expectedEndPositions.Add(new Vector2(0.5f, 4.3660f));
            expectedEndPositions.Add(new Vector2(-1.6650f, -0.383974f));
            expectedEndPositions.Add(new Vector2(0.133974f, -0.5f));

            var testcase = new TestCaseData(originalMetadata.ToList(), expectedPositions, expectedEndPositions);

            testcase.SetName("Normal Hierarchical order");
            yield return(testcase);

            originalMetadata = new SpriteBone[5]
            {
                new SpriteBone()
                {
                    name     = "child4",
                    parentId = 1,
                    position = Vector3.up,
                    rotation = Quaternion.identity,
                    length   = 1.0f
                },
                new SpriteBone()
                {
                    name     = "child3",
                    parentId = 3,
                    position = Vector3.left,
                    rotation = Quaternion.Euler(0.0f, 0.0f, 120.0f),
                    length   = 2.5f
                },
                new SpriteBone()
                {
                    name     = "child2",
                    parentId = 3,
                    position = Vector3.right,
                    rotation = Quaternion.identity,
                    length   = 1.5f
                },
                new SpriteBone()
                {
                    name     = "child1",
                    parentId = 4,
                    position = Vector3.up,
                    rotation = Quaternion.Euler(0.0f, 0.0f, 60.0f),
                    length   = 1.5f
                },
                new SpriteBone()
                {
                    name     = "root",
                    parentId = -1,
                    position = Vector2.one,
                    rotation = Quaternion.Euler(0.0f, 0.0f, 30.0f),
                    length   = 1.0f
                }
            };

            expectedPositions = new List <Vector2>();
            expectedPositions.Add(new Vector2(1f, 0f));
            expectedPositions.Add(new Vector2(0.5f, 0.8660f));
            expectedPositions.Add(new Vector2(0.5f, 2.8660f));
            expectedPositions.Add(new Vector2(0.5f, 1.8660f));
            expectedPositions.Add(new Vector2(1f, 1f));

            expectedEndPositions = new List <Vector2>();
            expectedEndPositions.Add(new Vector2(0.133974f, -0.5f));
            expectedEndPositions.Add(new Vector2(-1.6650f, -0.383974f));
            expectedEndPositions.Add(new Vector2(0.5f, 4.3660f));
            expectedEndPositions.Add(new Vector2(0.5f, 3.3660f));
            expectedEndPositions.Add(new Vector2(1.8660f, 1.5f));

            testcase = new TestCaseData(originalMetadata.ToList(), expectedPositions, expectedEndPositions);
            testcase.SetName("Reversed Hierarchical order");
            yield return(testcase);
        }