130 lines
2.5 KiB
C#
130 lines
2.5 KiB
C#
using System.Collections;
|
|
using System.Collections.Generic;
|
|
using Godot;
|
|
using System;
|
|
|
|
|
|
|
|
namespace Rokojori
|
|
{
|
|
[Tool]
|
|
[GlobalClass]
|
|
public partial class ConnectionCircle:Node3D
|
|
#if TOOLS
|
|
, GizmoDrawer
|
|
#endif
|
|
{
|
|
[Export]
|
|
public bool updateAlways = false;
|
|
|
|
[Export]
|
|
public Node3D root;
|
|
|
|
[Export]
|
|
public float radius = 1;
|
|
float _radius = -1;
|
|
|
|
[Export( PropertyHint.Range, "2,64") ]
|
|
public int divisions = 16;
|
|
int _divisions = -1;
|
|
|
|
[Export]
|
|
public float editorGizmoSize = 1;
|
|
|
|
float _editorGizmoSize = 1;
|
|
|
|
public Pose GetLocalPose( int index )
|
|
{
|
|
var p = new Pose();
|
|
var state = index / (float)( divisions );
|
|
var radians = state * Mathf.Pi * 2f;
|
|
var angle = Mathf.RadToDeg( radians );
|
|
|
|
p.rotation = Quaternion.FromEuler( new Vector3( 0, -radians , 0 ) );
|
|
p.position = p.rotation * Vector3.Forward * radius;
|
|
|
|
// RJLog.Log( radians, angle, p.rotation, p.position );
|
|
|
|
return p;
|
|
}
|
|
|
|
public Pose GetGlobalPose( int index )
|
|
{
|
|
return GetLocalPose( index ).ToGlobal( this );
|
|
}
|
|
|
|
#if TOOLS
|
|
|
|
|
|
public void DrawGizmo( EditorNode3DGizmoPlugin gizmoPlugin, EditorNode3DGizmo gizmo )
|
|
{
|
|
gizmo.Clear();
|
|
|
|
|
|
var material = gizmoPlugin.GetMaterial( "main", gizmo );
|
|
|
|
for ( int i = 0; i < divisions; i++ )
|
|
{
|
|
var p = GetLocalPose( i );
|
|
|
|
var center = p.position;
|
|
var up = p.position + p.up * editorGizmoSize;
|
|
var forward = p.position + p.forward * editorGizmoSize;
|
|
var right = p.position + p.right * radius * 4f / divisions;
|
|
var left = p.position - p.right * radius * 4f / divisions;
|
|
|
|
/*gizmo.AddLines( new Vector3[]
|
|
{
|
|
center, forward
|
|
},
|
|
material
|
|
);*/
|
|
|
|
gizmo.AddLines( new Vector3[]
|
|
{
|
|
center, up,
|
|
center, forward,
|
|
right, left,
|
|
right, forward,
|
|
left, forward,
|
|
up, forward
|
|
|
|
},
|
|
material
|
|
);
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
public override void _Process( double delta )
|
|
{
|
|
var changed = false;
|
|
|
|
if ( editorGizmoSize != _editorGizmoSize ||
|
|
radius != _radius ||
|
|
divisions != _divisions
|
|
)
|
|
{
|
|
_editorGizmoSize = editorGizmoSize;
|
|
_radius = radius;
|
|
_divisions = divisions;
|
|
|
|
changed = true;
|
|
}
|
|
|
|
if ( changed )
|
|
{
|
|
UpdateGizmos();
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
#endif
|
|
|
|
}
|
|
} |