82 lines
2.6 KiB
C#
82 lines
2.6 KiB
C#
|
|
using Godot;
|
|
using Rokojori;
|
|
using System.Collections.Generic;
|
|
|
|
namespace Rokojori
|
|
{
|
|
[Tool]
|
|
public class Gizmos
|
|
{
|
|
#if TOOLS
|
|
|
|
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 );
|
|
|
|
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
|
|
}
|
|
} |