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) { if (newBonesStore.newBones[i].parent == null) { SetBonePositionAndRotation(newBonesStore.newBones, newBonesStore.newBones[i], newPositions, newRotations); } } 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); }
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); }