93 lines
3.2 KiB
C#
93 lines
3.2 KiB
C#
#if UNITY_EDITOR
|
|
|
|
using UnityEditor;
|
|
using UnityEngine;
|
|
|
|
namespace FIMSpace.FEditor
|
|
{
|
|
|
|
public static class FGUI_Handles
|
|
{
|
|
|
|
public static void DrawArrow(Vector3 position, Quaternion direction, float scale = 1f, float width = 5f, float stripeLength = 1f)
|
|
{
|
|
Vector3[] points = new Vector3[8];
|
|
|
|
// Low base dots
|
|
points[0] = new Vector3(-0.12f, 0f, 0f);
|
|
points[1] = new Vector3(0.12f, 0f, 0f);
|
|
|
|
// Pre tip right triangle dot
|
|
points[2] = new Vector3(0.12f, 0f, 0.4f + 1 * stripeLength);
|
|
// Tip right side
|
|
points[3] = new Vector3(0.4f, 0f, 0.32f + 1 * stripeLength);
|
|
// Tip
|
|
points[4] = new Vector3(0.0f, 0f, 1f + 1 * stripeLength);
|
|
// Tip left side
|
|
points[5] = new Vector3(-0.4f, 0f, 0.32f + 1 * stripeLength);
|
|
// Pre tip left triangle dot
|
|
points[6] = new Vector3(-0.12f, 0f, 0.4f + 1 * stripeLength);
|
|
points[7] = points[0];
|
|
|
|
|
|
Matrix4x4 rotation = Matrix4x4.TRS(Vector3.zero, direction, Vector3.one * scale);
|
|
|
|
for (int i = 0; i < points.Length; i++)
|
|
{
|
|
points[i] = rotation.MultiplyPoint(points[i]);
|
|
points[i] += position;
|
|
}
|
|
|
|
if (width <= 0f)
|
|
Handles.DrawPolyLine(points);
|
|
else
|
|
Handles.DrawAAPolyLine(width, points);
|
|
}
|
|
|
|
public static void DrawBoneHandle(Vector3 from, Vector3 to, Vector3 forward, float fatness = 1f, float width = 1f, float arrowOffset = 1f)
|
|
{
|
|
Vector3 dir = (to - from);
|
|
float ratio = dir.magnitude / 7f; ratio *= fatness;
|
|
float baseRatio = ratio * 0.75f * arrowOffset;
|
|
ratio *= width;
|
|
Quaternion rot = (dir == Vector3.zero ? rot = Quaternion.identity : rot = Quaternion.LookRotation(dir, forward));
|
|
dir.Normalize();
|
|
Handles.DrawLine(from, to);
|
|
|
|
Vector3 p = from + dir * baseRatio;
|
|
Handles.DrawLine(to, p + rot * Vector3.right * ratio);
|
|
Handles.DrawLine(from, p + rot * Vector3.right * ratio);
|
|
Handles.DrawLine(to, p - rot * Vector3.right * ratio);
|
|
Handles.DrawLine(from, p - rot * Vector3.right * ratio);
|
|
}
|
|
|
|
public static void DrawBoneHandle(Vector3 from, Vector3 to, float fatness = 1f, bool faceCamera = false, float width = 1f, float arrowOffset = 1f)
|
|
{
|
|
Vector3 forw = (to - from).normalized;
|
|
|
|
if (faceCamera)
|
|
{
|
|
if (SceneView.lastActiveSceneView != null)
|
|
if (SceneView.lastActiveSceneView.camera)
|
|
forw = (to - SceneView.lastActiveSceneView.camera.transform.position).normalized;
|
|
}
|
|
|
|
DrawBoneHandle(from, to, forw, fatness, width, arrowOffset);
|
|
}
|
|
|
|
public static void DrawRay(Vector3 pos, Vector3 dir)
|
|
{
|
|
Handles.DrawLine(pos, pos + dir);
|
|
}
|
|
|
|
public static void DrawDottedRay(Vector3 pos, Vector3 dir, float scale = 2f)
|
|
{
|
|
Handles.DrawDottedLine(pos, pos + dir, scale);
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
#endif
|