113 lines
4.2 KiB
C#
113 lines
4.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, float lineWidth = 1f, float fillAlpha = 0f )
|
|
{
|
|
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();
|
|
|
|
Vector3 p = from + dir * baseRatio;
|
|
|
|
if( lineWidth <= 1f )
|
|
{
|
|
Handles.DrawLine( from, to );
|
|
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 );
|
|
}
|
|
else
|
|
{
|
|
Handles.DrawAAPolyLine( lineWidth, from, to );
|
|
Handles.DrawAAPolyLine( lineWidth, to, p + rot * Vector3.right * ratio );
|
|
Handles.DrawAAPolyLine( lineWidth, from, p + rot * Vector3.right * ratio );
|
|
Handles.DrawAAPolyLine( lineWidth, to, p - rot * Vector3.right * ratio );
|
|
Handles.DrawAAPolyLine( lineWidth, from, p - rot * Vector3.right * ratio );
|
|
}
|
|
|
|
if ( fillAlpha > 0f)
|
|
{
|
|
Color preC = Handles.color;
|
|
Handles.color = new Color( preC.r, preC.g, preC.b, fillAlpha * preC.a );
|
|
Handles.DrawAAConvexPolygon( from, p + rot * Vector3.right * ratio, to, p - rot * Vector3.right * ratio, from );
|
|
Handles.color = preC;
|
|
}
|
|
}
|
|
|
|
public static void DrawBoneHandle( Vector3 from, Vector3 to, float fatness = 1f, bool faceCamera = false, float width = 1f, float arrowOffset = 1f, float lineWidth = 1f, float fillAlpha = 0f )
|
|
{
|
|
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, lineWidth, fillAlpha );
|
|
}
|
|
|
|
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
|