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