Files
Fishing2/Assets/FImpossible Creations/Shared Tools/GUI Helpers/FGUI_Handles.cs

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