using Godot; using Rokojori; using System.Collections.Generic; namespace Rokojori { [Tool] public class Gizmos { #if TOOLS public static void AddArc( List 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 linePoints, Vector3 center, Vector3 axisA, Vector3 axisB, int segments = 32 ) { AddArc( linePoints, center, axisA, axisB, 0, Mathf.Tau, segments ); } public static void AddSphere( List 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 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 linePoints, Vector3 scale, int segments = 32 ) { AddCircle( linePoints, Vector3.Zero, Vector3.Right * scale.X, Vector3.Forward * scale.Z, segments ); } public static void AddCone( List 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 } }