Null safe logic nodes

This commit is contained in:
luboslenco 2018-06-14 14:52:05 +02:00
parent e7768afe38
commit e05ca352dd
48 changed files with 67 additions and 21 deletions

View file

@ -12,7 +12,7 @@ class AddTraitNode extends LogicNode {
var object:Object = inputs[1].get();
var trait:Dynamic = inputs[2].get();
if (object == null) return;
if (object == null || trait == null) return;
object.addTrait(trait);

View file

@ -16,7 +16,7 @@ class AppendTransformNode extends LogicNode {
var object:Object = inputs[1].get();
var matrix:Mat4 = inputs[2].get();
if (object == null) return;
if (object == null || matrix == null) return;
object.transform.multMatrix(matrix);

View file

@ -15,7 +15,7 @@ class ApplyForceAtLocationNode extends LogicNode {
var force:Vec4 = inputs[2].get();
var location:Vec4 = inputs[3].get();
if (object == null) return;
if (object == null || force == null || location == null) return;
#if arm_physics
var rb:RigidBody = object.getTrait(RigidBody);

View file

@ -14,7 +14,7 @@ class ApplyForceNode extends LogicNode {
var object:Object = inputs[1].get();
var force:Vec4 = inputs[2].get();
if (object == null) return;
if (object == null || force == null) return;
#if arm_physics
var rb:RigidBody = object.getTrait(RigidBody);

View file

@ -15,7 +15,7 @@ class ApplyImpulseAtLocationNode extends LogicNode {
var impulse:Vec4 = inputs[2].get();
var location:Vec4 = inputs[3].get();
if (object == null) return;
if (object == null || impulse == null || location == null) return;
#if arm_physics
var rb:RigidBody = object.getTrait(RigidBody);

View file

@ -14,7 +14,7 @@ class ApplyImpulseNode extends LogicNode {
var object:Object = inputs[1].get();
var impulse:Vec4 = inputs[2].get();
if (object == null) return;
if (object == null || impulse == null) return;
#if arm_physics
var rb:RigidBody = object.getTrait(RigidBody);

View file

@ -8,6 +8,7 @@ class ArrayAddNode extends LogicNode {
override function run() {
var ar:Array<Dynamic> = inputs[1].get();
if (ar == null) return;
if (inputs.length > 2) {
for (i in 2...inputs.length) {

View file

@ -8,6 +8,7 @@ class ArrayAddUniqueNode extends LogicNode {
override function run() {
var ar:Array<Dynamic> = inputs[1].get();
if (ar == null) return;
if (inputs.length > 2) {
for (i in 2...inputs.length) {

View file

@ -8,6 +8,8 @@ class ArrayGetNode extends LogicNode {
override function get(from:Int):Dynamic {
var ar:Array<Dynamic> = inputs[0].get();
if (ar == null) return null;
var i:Int = inputs[1].get();
if (i < 0) i = ar.length + i;
if (i < 0 || i > ar.length - 1) {

View file

@ -10,6 +10,8 @@ class ArrayLoopNode extends LogicNode {
override function run() {
var ar:Array<Dynamic> = inputs[1].get();
if (ar == null) return;
for (val in ar) {
value = val;
runOutputs(0);

View file

@ -8,6 +8,8 @@ class ArrayPopNode extends LogicNode {
override function get(from:Int):Dynamic {
var ar:Array<Dynamic> = inputs[0].get();
if (ar == null) return null;
return ar.pop();
}
}

View file

@ -10,6 +10,8 @@ class ArrayRemoveNode extends LogicNode {
override function run() {
var ar:Array<Dynamic> = inputs[1].get();
if (ar == null) return;
var i:Int = inputs[2].get();
if (i < 0) i = ar.length + i;

View file

@ -10,6 +10,8 @@ class ArrayRemoveValueNode extends LogicNode {
override function run() {
var ar:Array<Dynamic> = inputs[1].get();
if (ar == null) return;
var val:Dynamic = inputs[2].get();
removedValue = val;

View file

@ -8,6 +8,8 @@ class ArraySetNode extends LogicNode {
override function run() {
var ar:Array<Dynamic> = inputs[1].get();
if (ar == null) return;
var i:Int = inputs[2].get();
var value:Dynamic = inputs[3].get();

View file

@ -8,6 +8,8 @@ class ArrayShiftNode extends LogicNode {
override function get(from:Int):Dynamic {
var ar:Array<Dynamic> = inputs[0].get();
if (ar == null) return null;
return ar.shift();
}
}

View file

@ -11,8 +11,9 @@ class CallFunctionNode extends LogicNode {
}
override function run() {
var object:Object = inputs[1].get();
if (object == null) return;
var funName:String = inputs[2].get();
result = Reflect.callMethod(object, Reflect.field(object, funName), null);

View file

@ -18,6 +18,8 @@ class CastPhysicsRayNode extends LogicNode {
var vfrom:Vec4 = inputs[0].get();
var vto:Vec4 = inputs[1].get();
if (vfrom == null || vto == null) return null;
#if arm_physics
var physics = armory.trait.physics.PhysicsWorld.active;
var rb = physics.rayCast(vfrom, vto);

View file

@ -12,6 +12,8 @@ class GetDistanceNode extends LogicNode {
var object1:Object = inputs[0].get();
var object2:Object = inputs[1].get();
if (object1 == null || object2 == null) return 0;
return iron.math.Vec4.distance(object1.transform.world.getLoc(), object2.transform.world.getLoc());
}
}

View file

@ -11,6 +11,7 @@ class GetFirstContactNode extends LogicNode {
override function get(from:Int):Dynamic {
var object:Object = inputs[0].get();
if (object == null) return;
#if arm_physics
var physics = armory.trait.physics.PhysicsWorld.active;

View file

@ -14,8 +14,7 @@ class GoToLocationNode extends LogicNode {
var object:Object = inputs[1].get();
var location:Vec4 = inputs[2].get();
if (location == null) return;
if (object == null) return;
if (object == null || location == null) return;
#if arm_navigation
// Assume navmesh exists..

View file

@ -13,6 +13,8 @@ class HasContactNode extends LogicNode {
var object1:Object = inputs[0].get();
var object2:Object = inputs[1].get();
if (object1 == null || object2 == null) return false;
#if arm_physics
var physics = armory.trait.physics.PhysicsWorld.active;
var rb2 = object2.getTrait(RigidBody);

View file

@ -16,6 +16,8 @@ class MatrixMathNode extends LogicNode {
var m1:Mat4 = inputs[0].get();
var m2:Mat4 = inputs[1].get();
if (m1 == null || m2 == null) return null;
m.setFrom(m1);
switch (property0) {
case "Multiply":

View file

@ -10,6 +10,7 @@ class PauseSoundNode extends LogicNode {
override function run() {
var object:SpeakerObject = cast(inputs[1].get(), SpeakerObject);
if (object == null) return;
object.pause();
super.run();
}

View file

@ -15,7 +15,7 @@ class PickLocationNode extends LogicNode {
var object:Object = inputs[0].get();
var coords:Vec4 = inputs[1].get();
if (object == null) null;
if (object == null || coords == null) null;
#if arm_physics
var physics = armory.trait.physics.PhysicsWorld.active;

View file

@ -13,6 +13,8 @@ class PickObjectNode extends LogicNode {
override function get(from:Int):Dynamic {
var coords:Vec4 = inputs[0].get();
if (coords == null) return null;
#if arm_physics
var physics = armory.trait.physics.PhysicsWorld.active;
var rb = physics.pickClosest(coords.x, coords.y);

View file

@ -10,6 +10,7 @@ class PlaySoundNode extends LogicNode {
override function run() {
var object:SpeakerObject = cast(inputs[1].get(), SpeakerObject);
if (object == null) return;
object.play();
super.run();
}

View file

@ -10,6 +10,7 @@ class RemoveTraitNode extends LogicNode {
override function run() {
var trait:Dynamic = inputs[1].get();
if (trait == null) return;
trait.remove();
super.run();

View file

@ -18,7 +18,7 @@ class RotateObjectNode extends LogicNode {
var object:Object = inputs[1].get();
var vec:Vec4 = inputs[2].get();
if (object == null) return;
if (object == null || vec == null) return;
q.fromEuler(vec.x, vec.y, vec.z);

View file

@ -15,7 +15,7 @@ class ScaleObjectNode extends LogicNode {
var object:Object = inputs[1].get();
var vec:Vec4 = inputs[2].get();
if (object == null) return;
if (object == null || vec == null) return;
object.transform.scale.add(vec);
object.transform.buildMatrix();

View file

@ -16,6 +16,8 @@ class ScreenToWorldSpaceNode extends LogicNode {
override function get(from:Int):Dynamic {
var v1:Vec4 = inputs[0].get();
if (v1 == null) return null;
var cam = iron.Scene.active.camera;
v.setFrom(v1);
m.getInverse(cam.P);

View file

@ -10,6 +10,7 @@ class SeparateColorNode extends LogicNode {
override function get(from:Int):Dynamic {
var vector:Vec4 = inputs[0].get();
if (vector == null) return 0.0;
if (from == 0) return vector.x;
else if (from == 1) return vector.y;

View file

@ -12,6 +12,7 @@ class SeparateTransformNode extends LogicNode {
override function get(from:Int):Dynamic {
var matrix:Mat4 = inputs[0].get();
if (matrix == null) return null;
var loc = new Vec4();
var rot = new Quat();

View file

@ -10,6 +10,7 @@ class SeparateVectorNode extends LogicNode {
override function get(from:Int):Dynamic {
var vector:Vec4 = inputs[0].get();
if (vector == null) return 0.0;
if (from == 0) return vector.x;
else if (from == 1) return vector.y;

View file

@ -12,6 +12,8 @@ class SetGravityNode extends LogicNode {
override function run() {
var gravity:Vec4 = inputs[1].get();
if (gravity == null) return;
#if arm_physics
var physics = armory.trait.physics.PhysicsWorld.active;

View file

@ -14,7 +14,7 @@ class SetLocationNode extends LogicNode {
var object:Object = inputs[1].get();
var vec:Vec4 = inputs[2].get();
if (object == null) return;
if (object == null || vec == null) return;
object.transform.loc.setFrom(vec);
object.transform.buildMatrix();

View file

@ -22,6 +22,8 @@ class SetMaterialImageParamNode extends LogicNode {
override function run() {
mat = inputs[1].get();
node = inputs[2].get();
if (mat == null || node == null) return;
var name = inputs[3].get();
iron.data.Data.getImage(name, function(img:kha.Image) {
image = img;

View file

@ -14,7 +14,7 @@ class SetRotationNode extends LogicNode {
var object:Object = inputs[1].get();
var vec:Vec4 = inputs[2].get();
if (object == null) return;
if (object == null || vec == null) return;
object.transform.rot.fromEuler(vec.x, vec.y, vec.z);
object.transform.buildMatrix();

View file

@ -14,7 +14,7 @@ class SetScaleNode extends LogicNode {
var object:Object = inputs[1].get();
var vec:Vec4 = inputs[2].get();
if (object == null) return;
if (object == null || vec == null) return;
object.transform.scale.setFrom(vec);
object.transform.buildMatrix();

View file

@ -14,7 +14,7 @@ class SetTransformNode extends LogicNode {
var object:Object = inputs[1].get();
var matrix:Mat4 = inputs[2].get();
if (object == null) return;
if (object == null || matrix == null) return;
object.transform.setMatrix(matrix);

View file

@ -17,7 +17,7 @@ class SetVelocityNode extends LogicNode {
var angular:Vec4 = inputs[4].get();
var angularFactor:Vec4 = inputs[5].get();
if (object == null) return;
if (object == null || linear == null || linearFactor == null || angular == null || angularFactor == null) return;
#if arm_physics
var rb:RigidBody = object.getTrait(RigidBody);

View file

@ -10,6 +10,7 @@ class StopSoundNode extends LogicNode {
override function run() {
var object:SpeakerObject = cast(inputs[1].get(), SpeakerObject);
if (object == null) return;
object.stop();
super.run();
}

View file

@ -18,8 +18,9 @@ class TransformNode extends LogicNode {
override function get(from:Int):Dynamic {
var loc:Vec4 = inputs[0].get();
var rot:Vec4 = inputs[1].get();
q.fromEuler(rot.x, rot.y, rot.z);
var scale:Vec4 = inputs[2].get();
if (loc == null || rot == null || scale == null) return null;
q.fromEuler(rot.x, rot.y, rot.z);
value.compose(loc, q, scale);
return value;
}

View file

@ -15,7 +15,7 @@ class TranslateObjectNode extends LogicNode {
var object:Object = inputs[1].get();
var vec:Vec4 = inputs[2].get();
if (object == null) return;
if (object == null || vec == null) return;
object.transform.loc.add(vec);
object.transform.buildMatrix();

View file

@ -12,8 +12,8 @@ class VectorClampToSizeNode extends LogicNode {
override function get(from:Int):Dynamic {
v = inputs[0].get();
var fmin = inputs[1].get();
var fmax = inputs[2].get();
var fmin:kha.FastFloat = inputs[1].get();
var fmax:kha.FastFloat = inputs[2].get();
v.clamp(fmin, fmax);

View file

@ -13,6 +13,8 @@ class VectorFromTransformNode extends LogicNode {
override function get(from:Int):Dynamic {
var m:Mat4 = inputs[0].get();
if (m == null) return null;
switch (property0) {
case "Up":
return m.up();

View file

@ -14,6 +14,7 @@ class VectorMathNode extends LogicNode {
override function get(from:Int):Dynamic {
var v1:Vec4 = inputs[0].get();
var v2:Vec4 = inputs[1].get();
if (v1 == null || v2 == null) return null;
v.setFrom(v1);
var f = 0.0;
switch (property0) {

View file

@ -48,6 +48,7 @@ class VectorMixNode extends LogicNode {
var k:Float = inputs[0].get(); //Factor
var v1:Vec4 = inputs[1].get();
var v2:Vec4 = inputs[2].get();
if (v1 == null || v2 == null) return null;
var f = ease(k);
v.x = v1.x + (v2.x - v1.x) * f;
v.y = v1.y + (v2.y - v1.y) * f;

View file

@ -13,6 +13,7 @@ class WorldToScreenSpaceNode extends LogicNode {
override function get(from:Int):Dynamic {
var v1:Vec4 = inputs[0].get();
if (v1 == null) return null;
var cam = iron.Scene.active.camera;
v.setFrom(v1);