Example #1
0
 internal override void OnCreate()
 {
     m_SkeletonController                = new SkeletonController();
     m_SkeletonController.view           = new SkeletonView(new GUIWrapper());
     m_SkeletonController.view.InvalidID = 0;
     m_SkeletonController.selection      = skinningCache.skeletonSelection;
     m_SkeletonToolView = new SkeletonToolView();
     m_SkeletonToolView.onBoneNameChanged  += BoneNameChanged;
     m_SkeletonToolView.onBoneDepthChanged += BoneDepthChanged;
     m_RectBoneSelector.selection           = skinningCache.skeletonSelection;
     m_RectSelectionTool.rectSelector       = m_RectBoneSelector;
     m_RectSelectionTool.cacheUndo          = skinningCache;
     m_RectSelectionTool.onSelectionUpdate += () =>
     {
         skinningCache.events.boneSelectionChanged.Invoke();
     };
     m_UnselectTool.cacheUndo   = skinningCache;
     m_UnselectTool.selection   = skinningCache.skeletonSelection;
     m_UnselectTool.onUnselect += () =>
     {
         skinningCache.events.boneSelectionChanged.Invoke();
     };
 }
        public NewBonesStore PasteSkeletonBones(SpriteCache sprite, List <SpriteBone> spriteBones, bool flipX, bool flipY, float scale = 1.0f)
        {
            NewBonesStore newBonesStore = new NewBonesStore();

            newBonesStore.newBones = skinningCache.CreateBoneCacheFromSpriteBones(spriteBones.ToArray(), scale);
            if (newBonesStore.newBones.Length == 0)
            {
                return(null);
            }

            if (sprite == null || (skinningCache.mode == SkinningMode.SpriteSheet && skinningCache.hasCharacter))
            {
                return(null);
            }

            var spriteRect = sprite.textureRect;
            var skeleton   = skinningCache.GetEffectiveSkeleton(sprite);

            var rectPosition = spriteRect.position;

            if (skinningCache.mode == SkinningMode.Character)
            {
                var characterPart = sprite.GetCharacterPart();
                if (characterPart == null)
                {
                    return(null);
                }
                rectPosition = characterPart.position;
            }

            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], rectPosition, spriteRect, 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];
            }

            if (skinningCache.mode == SkinningMode.SpriteSheet)
            {
                newBonesStore.MapAllExistingBones();
                skeleton.SetBones(newBonesStore.newBones);
            }
            else
            {
                var existingBoneNames = skeleton.bones.Select(x => x.name).ToList();

                skeleton.AddBones(newBonesStore.newBones);

                var bones = skeleton.bones;

                // Update names of all newly pasted bones
                foreach (var bone in newBonesStore.newBones)
                {
                    if (existingBoneNames.Contains(bone.name))
                    {
                        var oldBoneName = bone.name;
                        bone.name = SkeletonController.AutoBoneName(bone.parentBone, bones);
                        existingBoneNames.Add(bone.name);
                        newBonesStore.newBoneNameDict.Add(oldBoneName, bone.name);
                    }
                    else
                    {
                        newBonesStore.newBoneNameDict.Add(bone.name, bone.name);
                    }
                }

                skeleton.SetDefaultPose();
            }

            skinningCache.events.skeletonTopologyChanged.Invoke(skeleton);
            return(newBonesStore);
        }