No Description
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

CharacterPartCacheExtensions.cs 2.7KB

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