forked from LeenkxTeam/LNXSDK
Add leenkx/Sources/leenkx/logicnode/SetObjectDelayedLocationNode.hx
This commit is contained in:
@ -0,0 +1,74 @@
|
|||||||
|
package leenkx.logicnode;
|
||||||
|
|
||||||
|
import iron.object.Object;
|
||||||
|
import iron.math.Vec4;
|
||||||
|
import iron.math.Mat4;
|
||||||
|
import iron.system.Time;
|
||||||
|
|
||||||
|
class SetObjectDelayedLocationNode extends LogicNode {
|
||||||
|
public var use_local_space: Bool = false;
|
||||||
|
|
||||||
|
private var initialOffset: Vec4 = null;
|
||||||
|
private var targetPos: Vec4 = new Vec4();
|
||||||
|
private var currentPos: Vec4 = new Vec4();
|
||||||
|
private var deltaVec: Vec4 = new Vec4();
|
||||||
|
private var tempVec: Vec4 = new Vec4();
|
||||||
|
|
||||||
|
private var lastParent: Object = null;
|
||||||
|
private var invParentMatrix: Mat4 = null;
|
||||||
|
|
||||||
|
public function new(tree: LogicTree) {
|
||||||
|
super(tree);
|
||||||
|
}
|
||||||
|
|
||||||
|
override function run(from: Int) {
|
||||||
|
var follower: Object = inputs[1].get();
|
||||||
|
var target: Object = inputs[2].get();
|
||||||
|
var delay: Float = inputs[3].get();
|
||||||
|
|
||||||
|
if (follower == null || target == null || delay == null) return runOutput(0);
|
||||||
|
|
||||||
|
if (initialOffset == null) {
|
||||||
|
initialOffset = new Vec4();
|
||||||
|
var followerPos = follower.transform.world.getLoc();
|
||||||
|
var targetPos = target.transform.world.getLoc();
|
||||||
|
initialOffset.setFrom(followerPos);
|
||||||
|
initialOffset.sub(targetPos);
|
||||||
|
}
|
||||||
|
|
||||||
|
targetPos.setFrom(target.transform.world.getLoc());
|
||||||
|
currentPos.setFrom(follower.transform.world.getLoc());
|
||||||
|
|
||||||
|
tempVec.setFrom(targetPos).add(initialOffset);
|
||||||
|
|
||||||
|
deltaVec.setFrom(tempVec).sub(currentPos);
|
||||||
|
|
||||||
|
if (deltaVec.length() < 0.001 && delay < 0.01) {
|
||||||
|
runOutput(0);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (delay == 0.0) {
|
||||||
|
currentPos.setFrom(tempVec);
|
||||||
|
} else {
|
||||||
|
var smoothFactor = Math.exp(-Time.delta / Math.max(0.0001, delay));
|
||||||
|
currentPos.x = tempVec.x + (currentPos.x - tempVec.x) * smoothFactor;
|
||||||
|
currentPos.y = tempVec.y + (currentPos.y - tempVec.y) * smoothFactor;
|
||||||
|
currentPos.z = tempVec.z + (currentPos.z - tempVec.z) * smoothFactor;
|
||||||
|
}
|
||||||
|
if (use_local_space && follower.parent != null) {
|
||||||
|
if (follower.parent != lastParent || invParentMatrix == null) {
|
||||||
|
lastParent = follower.parent;
|
||||||
|
invParentMatrix = Mat4.identity();
|
||||||
|
invParentMatrix.getInverse(follower.parent.transform.world);
|
||||||
|
}
|
||||||
|
tempVec.setFrom(currentPos);
|
||||||
|
tempVec.applymat(invParentMatrix);
|
||||||
|
follower.transform.loc.set(tempVec.x, tempVec.y, tempVec.z);
|
||||||
|
} else {
|
||||||
|
follower.transform.loc.set(currentPos.x, currentPos.y, currentPos.z);
|
||||||
|
}
|
||||||
|
follower.transform.buildMatrix();
|
||||||
|
runOutput(0);
|
||||||
|
}
|
||||||
|
}
|
Reference in New Issue
Block a user