暫無描述
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.

BoneDrawingUtility.cs 3.0KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. using UnityEngine;
  2. namespace UnityEditor.U2D.Animation
  3. {
  4. internal static class BoneDrawingUtility
  5. {
  6. public static float GetBoneRadius(Vector3 position, float scale = 1.0f)
  7. {
  8. if (Camera.current != null)
  9. {
  10. return 0.15f * scale * HandleUtility.GetHandleSize(position);
  11. }
  12. return 10f * scale / Handles.matrix.GetColumn(0).magnitude;
  13. }
  14. public static void DrawBoneNode(Vector3 position, Vector3 forward, Color color, float scale = 1.0f)
  15. {
  16. BatchedDrawing.RegisterSolidDisc(position, -forward, GetBoneRadius(position, scale) * 0.3f, color);
  17. }
  18. public static void DrawBone(Vector3 position, Vector3 endPosition, Vector3 forward, Color color, float scale = 1.0f)
  19. {
  20. var right = Vector3.right;
  21. var v = endPosition - position;
  22. if (v.sqrMagnitude != 0)
  23. right = v.normalized;
  24. var up = Vector3.Cross(right, forward).normalized;
  25. var radius = GetBoneRadius(position, scale) * 0.5f;
  26. var numSamples = 12;
  27. if (v.sqrMagnitude <= radius * radius)
  28. BatchedDrawing.RegisterSolidArc(position, -forward, up, 360f, radius, color, numSamples * 2);
  29. else
  30. {
  31. BatchedDrawing.RegisterSolidArc(position, -forward, up, 180f, radius, color, numSamples);
  32. BatchedDrawing.RegisterLine(position, endPosition, forward, radius * 2f, 0f, color);
  33. }
  34. }
  35. public static void DrawBoneOutline(Vector3 position, Vector3 endPosition, Vector3 forward, Color color, float outlineScale = 1.35f, float scale = 1.0f)
  36. {
  37. outlineScale = Mathf.Max(1f, outlineScale);
  38. var right = Vector3.right;
  39. var v = endPosition - position;
  40. if (v.sqrMagnitude != 0)
  41. right = v.normalized;
  42. var up = Vector3.Cross(right, forward).normalized;
  43. var radius = GetBoneRadius(position, scale) * 0.5f;
  44. var outlineWidth = radius * (outlineScale - 1f);
  45. const int numSamples = 12;
  46. if (v.sqrMagnitude <= radius * radius)
  47. BatchedDrawing.RegisterSolidArcWithOutline(position, -forward, up, 360f, radius, outlineScale, color, numSamples * 2);
  48. else
  49. {
  50. BatchedDrawing.RegisterSolidArcWithOutline(position, -forward, up, 180f, radius, outlineScale, color, numSamples);
  51. BatchedDrawing.RegisterSolidArcWithOutline(endPosition, -forward, -up, 180f, outlineWidth, 0f, color, numSamples);
  52. BatchedDrawing.RegisterLine(position + up * (radius + outlineWidth * 0.5f), endPosition + up * (outlineWidth * 0.5f), forward, outlineWidth, outlineWidth, color);
  53. BatchedDrawing.RegisterLine(position - up * (radius + outlineWidth * 0.5f), endPosition - up * (outlineWidth * 0.5f), forward, outlineWidth, outlineWidth, color);
  54. }
  55. }
  56. }
  57. }