rj-action-library/Runtime/Math/Geometry/TriangleTest.cs

113 lines
1.9 KiB
C#

using Godot;
using System.Collections;
using System.Collections.Generic;
namespace Rokojori
{
[Tool]
[GlobalClass]
public partial class TriangleTest:Node3D
{
[Export]
public bool alignUp = false;
[Export]
public bool shrink = false;
[Export]
public float shrinkDistance = 0;
[Export]
public bool scale = false;
[Export]
public float scaleAmount = 1;
[ExportGroup("Source")]
[Export]
public Node3D sA;
[Export]
public Node3D sB;
[Export]
public Node3D sC;
[ExportGroup("Target")]
[Export]
public Node3D tA;
[Export]
public Node3D tB;
[Export]
public Node3D tC;
[Export]
public Vector3 offset = Vector3.Zero;
public override void _Process( double delta )
{
if ( alignUp )
{
AlignUp();
}
if ( shrink )
{
Shrink();
}
if ( scale )
{
ScaleFromCenter();
}
}
void AlignUp()
{
var s = GetSourceTriangle();
var r = s.GetXZAlignmentRotation();
RJLog.Log( s.normal, r );
s.Rotate( r, s.center );
SetTargetTriangle( s );
}
void Shrink()
{
var s = GetSourceTriangle();
s = s.Offset( shrinkDistance );
if ( s == null )
{
RJLog.Log( "Shrinking failed" );
SetTargetTriangle( GetSourceTriangle() );
return;
}
SetTargetTriangle( s );
}
void ScaleFromCenter()
{
var s = GetSourceTriangle();
s.ScaleFromCenter( scaleAmount );
SetTargetTriangle( s );
}
Triangle3 GetSourceTriangle()
{
return new Triangle3( sA.GlobalPosition, sB.GlobalPosition, sC.GlobalPosition );
}
void SetTargetTriangle( Triangle3 t )
{
tA.GlobalPosition = t.a + offset;
tB.GlobalPosition = t.b + offset;
tC.GlobalPosition = t.c + offset;
}
}
}