A game about forced loneliness, made by TACStudios
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}