113 lines
1.9 KiB
C#
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;
|
|
}
|
|
|
|
}
|
|
}
|