A game about forced loneliness, made by TACStudios
at master 77 lines 2.8 kB view raw
1using System.Collections.Generic; 2using UnityEngine; 3 4namespace UnityEditor.U2D.Animation 5{ 6 internal static class CharacterPartCacheExtensions 7 { 8 public static void SyncSpriteSheetSkeleton(this CharacterPartCache characterPart) 9 { 10 var skinningCache = characterPart.skinningCache; 11 var character = skinningCache.character; 12 var characterSkeleton = character.skeleton; 13 var spriteSkeleton = characterPart.sprite.GetSkeleton(); 14 var spriteSkeletonBones = spriteSkeleton.bones; 15 var characterPartBones = characterPart.bones; 16 17 if (spriteSkeletonBones.Length != characterPartBones.Length) 18 return; 19 20 for (var i = 0; i < characterPartBones.Length; ++i) 21 { 22 var spriteBone = spriteSkeletonBones[i]; 23 var characterBone = characterPartBones[i]; 24 var childWorldPose = spriteBone.GetChildrenWoldPose(); 25 26 spriteBone.position = spriteSkeleton.localToWorldMatrix.MultiplyPoint3x4( 27 characterPart.worldToLocalMatrix.MultiplyPoint3x4(characterBone.position)); 28 spriteBone.rotation = characterBone.rotation; 29 spriteBone.length = characterBone.length; 30 spriteBone.guid = characterBone.guid; 31 spriteBone.name = characterBone.name; 32 spriteBone.depth = characterBone.depth; 33 spriteBone.bindPoseColor = characterBone.bindPoseColor; 34 35 spriteBone.SetChildrenWorldPose(childWorldPose); 36 } 37 38 if (characterSkeleton.isPosePreview) 39 spriteSkeleton.SetPosePreview(); 40 else 41 spriteSkeleton.SetDefaultPose(); 42 } 43 44 public static void DissociateUnusedBones(this CharacterPartCache characterPart) 45 { 46 var skinningCache = characterPart.skinningCache; 47 var bones = characterPart.bones; 48 49 if (bones.Length == 0) 50 return; 51 52 Debug.Assert(characterPart.sprite != null); 53 54 var mesh = characterPart.sprite.GetMesh(); 55 56 Debug.Assert(mesh != null); 57 58 var weights = mesh.vertexWeights; 59 var newBonesSet = new HashSet<BoneCache>(); 60 61 foreach (var weight in weights) 62 { 63 foreach (var channel in weight) 64 if (channel.enabled) 65 newBonesSet.Add(bones[channel.boneIndex]); 66 } 67 68 bones = new List<BoneCache>(newBonesSet).ToArray(); 69 70 characterPart.bones = bones; 71 72 characterPart.sprite.UpdateMesh(bones); 73 74 skinningCache.events.characterPartChanged.Invoke(characterPart); 75 } 76 } 77}