rokojori_action_library/Tools/Gizmos.cs

82 lines
2.6 KiB
C#
Raw Normal View History

2024-09-14 06:41:52 +00:00
using Godot;
using Rokojori;
using System.Collections.Generic;
namespace Rokojori
{
[Tool]
2026-10-05 19:25:04 +00:00
public class Gizmos
2024-09-14 06:41:52 +00:00
{
2026-10-05 19:25:04 +00:00
#if TOOLS
2024-09-14 06:41:52 +00:00
2026-10-05 19:25:04 +00:00
public static void AddArc( List<Vector3> linePoints, Vector3 center, Vector3 axisA, Vector3 axisB, float angleStart, float angleEnd, int segments )
{
var last = center + axisA * Mathf.Cos( angleStart ) + axisB * Mathf.Sin( angleStart );
2024-09-14 06:41:52 +00:00
2026-10-05 19:25:04 +00:00
for ( int i = 1; i <= segments; i++ )
{
var t = angleStart + ( angleEnd - angleStart ) * ( i / (float) segments );
var point = center + axisA * Mathf.Cos( t ) + axisB * Mathf.Sin( t );
linePoints.Add( last );
linePoints.Add( point );
last = point;
}
}
public static void AddCircle( List<Vector3> linePoints, Vector3 center, Vector3 axisA, Vector3 axisB, int segments = 32 )
{
AddArc( linePoints, center, axisA, axisB, 0, Mathf.Tau, segments );
}
public static void AddSphere( List<Vector3> linePoints, Vector3 scale, int segments = 32 )
{
var right = Vector3.Right * scale.X;
var up = Vector3.Up * scale.Y;
var forward = Vector3.Forward * scale.Z;
AddCircle( linePoints, Vector3.Zero, right, forward, segments );
AddCircle( linePoints, Vector3.Zero, right, up, segments );
AddCircle( linePoints, Vector3.Zero, forward, up, segments );
}
public static void AddDome( List<Vector3> linePoints, Vector3 scale, int segments = 32 )
{
var right = Vector3.Right * scale.X;
var up = Vector3.Up * scale.Y;
var forward = Vector3.Forward * scale.Z;
AddCircle( linePoints, Vector3.Zero, right, forward, segments );
AddArc( linePoints, Vector3.Zero, right, up, 0, Mathf.Pi, Mathf.Max( 2, segments / 2 ) );
AddArc( linePoints, Vector3.Zero, forward, up, 0, Mathf.Pi, Mathf.Max( 2, segments / 2 ) );
}
public static void AddDisc( List<Vector3> linePoints, Vector3 scale, int segments = 32 )
{
AddCircle( linePoints, Vector3.Zero, Vector3.Right * scale.X, Vector3.Forward * scale.Z, segments );
}
public static void AddCone( List<Vector3> linePoints, Vector3 scale, int segments = 32, int spokes = 8 )
{
var apex = Vector3.Zero;
var baseCenter = Vector3.Up * scale.Y;
var right = Vector3.Right * scale.X;
var forward = Vector3.Forward * scale.Z;
AddCircle( linePoints, baseCenter, right, forward, segments );
for ( int i = 0; i < spokes; i++ )
{
var t = i / (float) spokes * Mathf.Tau;
var basePoint = baseCenter + right * Mathf.Cos( t ) + forward * Mathf.Sin( t );
linePoints.Add( apex );
linePoints.Add( basePoint );
}
}
#endif
2024-09-14 06:41:52 +00:00
}
}