192 lines
4.5 KiB
C#
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 );
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
}
|
||
|
}
|