rj-action-library/Runtime/Procedural/ConnectionPinTester.cs

192 lines
4.5 KiB
C#

using System.Collections;
using System.Collections.Generic;
using Godot;
using System;
namespace Rokojori
{
[Tool]
[GlobalClass]
public partial class ConnectionPinTester:Node3D
{
[Export]
public ConnectionPin fromPin;
[Export]
public Node3D toParent;
[Export]
public ConnectionPin toPin;
[Export]
public bool update = false;
[Export]
public bool updateAlways = false;
[Export]
public Vector3 eulerRotation;
[Export]
public bool diff_reverse = false;
[Export]
public bool mult_reverse = false;
[Export]
public Vector4 targetPin;
[Export]
public Vector4 currentPin;
[Export]
public Vector4 needed;
[Export]
public Vector4 oldApplying;
[Export]
public Vector4 applyingTargetApplied;
[Export]
public Vector4 pinApplyied;
[Export]
public Node3D applyingTarget;
[Export]
public Node3D forwardTarget;
[Export]
public Vector3 customRotationEulers;
[Export]
public bool rotateBefore;
public override void _Process( double delta )
{
Connect3();
}
void Connect3()
{
if ( ! ( update || updateAlways ) )
{
return;
}
update = false;
ConnectionPin.Connect( toParent, toPin, fromPin );
}
void Connect2()
{
if ( ! ( update || updateAlways ) )
{
return;
}
update = false;
var targetRotation = fromPin.GetGlobalQuaternion();
var currentPinRotation = toPin.GetGlobalQuaternion();
var parentRotation = applyingTarget.GetGlobalQuaternion();
var pinToParent = diff_reverse ?
Math3D.GetQuaternionDifference( currentPinRotation, parentRotation ) :
Math3D.GetQuaternionDifference( parentRotation, currentPinRotation );
var forward = fromPin.GlobalForward();
var up = fromPin.GlobalUp();
var customRotation = Quaternion.FromEuler( customRotationEulers / 180 * Mathf.Pi ) * pinToParent;
forwardTarget.GlobalPosition = applyingTarget.GlobalPosition + forward;
targetPin = targetRotation.AsVector4();
currentPin = currentPinRotation.AsVector4();
needed = pinToParent.AsVector4();
oldApplying = parentRotation.AsVector4();
applyingTargetApplied = Vector4.One * -1;
pinApplyied = Vector4.One * -1;
applyingTarget.LookTowards( forward, up, customRotation );
var offset = ( fromPin.GlobalPosition - toPin.GlobalPosition );
applyingTarget.GlobalTranslate( offset );
}
void Connect()
{
if ( ! ( update || updateAlways ) )
{
return;
}
update = false;
var eulerRads = eulerRotation / 180 * Mathf.Pi;
var targetRotation = fromPin.GetGlobalQuaternion();
var currentRotation = toPin.GetGlobalQuaternion();
//toPin.SetGlobalQuaternion( targetRotation );
var neededRotation = diff_reverse ?
Math3D.GetQuaternionDifference( currentRotation, targetRotation ) :
Math3D.GetQuaternionDifference( targetRotation, currentRotation );
var oldRotation = applyingTarget.GetGlobalQuaternion();
var resultRotation = mult_reverse ? neededRotation * currentRotation :
oldRotation * neededRotation;
var pinResultRotation = mult_reverse ? neededRotation * currentRotation :
currentRotation * neededRotation;
RJLog.Log(
"Target:", targetRotation, "\n",
"Current:", currentRotation, "\n",
"Needed:", neededRotation, "\n",
"OldRotation:", oldRotation, "\n",
"Applied:", resultRotation,"\n",
"Pin:", pinResultRotation
);
targetPin = targetRotation.AsVector4();
currentPin = currentRotation.AsVector4();
needed = neededRotation.AsVector4();
oldApplying = oldRotation.AsVector4();
applyingTargetApplied = resultRotation.AsVector4();
pinApplyied = pinResultRotation.AsVector4();
applyingTarget.SetGlobalQuaternion( resultRotation );
//var positionOffset = fromPin.GlobalPosition - toPin.GlobalPosition;
//toParent.GlobalPosition += positionOffset;
//toPin.SetGlobalQuaternion( currentRotation * neededRotation );
//Math3D.SetGlobalRotation( toPin, targetRotation );
}
}
}