Logic nodes round 3
This commit is contained in:
parent
ac7bfb1b8e
commit
3478cf22e4
10
Sources/armory/logicnode/ActiveCameraNode.hx
Normal file
10
Sources/armory/logicnode/ActiveCameraNode.hx
Normal file
|
@ -0,0 +1,10 @@
|
|||
package armory.logicnode;
|
||||
|
||||
class ActiveCameraNode extends Node {
|
||||
|
||||
public function new(tree:LogicTree) {
|
||||
super(tree);
|
||||
}
|
||||
|
||||
override function get(from:Int):Dynamic { return armory.Scene.active.camera; }
|
||||
}
|
10
Sources/armory/logicnode/ActiveSceneNode.hx
Normal file
10
Sources/armory/logicnode/ActiveSceneNode.hx
Normal file
|
@ -0,0 +1,10 @@
|
|||
package armory.logicnode;
|
||||
|
||||
class ActiveSceneNode extends Node {
|
||||
|
||||
public function new(tree:LogicTree) {
|
||||
super(tree);
|
||||
}
|
||||
|
||||
override function get(from:Int):Dynamic { return armory.Scene.active; }
|
||||
}
|
20
Sources/armory/logicnode/AnimationStateNode.hx
Normal file
20
Sources/armory/logicnode/AnimationStateNode.hx
Normal file
|
@ -0,0 +1,20 @@
|
|||
package armory.logicnode;
|
||||
|
||||
import armory.object.Object;
|
||||
|
||||
class AnimationStateNode extends Node {
|
||||
|
||||
public function new(tree:LogicTree) {
|
||||
super(tree);
|
||||
}
|
||||
|
||||
override function get(from:Int):Dynamic {
|
||||
var object:Object = inputs[0].get();
|
||||
|
||||
if (object == null) object = tree.object;
|
||||
|
||||
if (from == 0) return !object.animation.player.paused; // is playing
|
||||
else if (from == 1) return object.animation.player.timeIndex;
|
||||
else return object.animation.player.current.name;
|
||||
}
|
||||
}
|
|
@ -17,7 +17,6 @@ class ApplyImpulseNode extends Node {
|
|||
if (object == null) object = tree.object;
|
||||
|
||||
#if arm_physics
|
||||
var physics = armory.trait.internal.PhysicsWorld.active;
|
||||
var rb:RigidBody = object.getTrait(RigidBody);
|
||||
rb.applyImpulse(impulse);
|
||||
#end
|
||||
|
|
27
Sources/armory/logicnode/ArrayBooleanNode.hx
Normal file
27
Sources/armory/logicnode/ArrayBooleanNode.hx
Normal file
|
@ -0,0 +1,27 @@
|
|||
package armory.logicnode;
|
||||
|
||||
class ArrayBooleanNode extends Node {
|
||||
|
||||
public var value:Array<Bool> = [];
|
||||
var initialized = false;
|
||||
|
||||
public function new(tree:LogicTree) {
|
||||
super(tree);
|
||||
}
|
||||
|
||||
override function get(from:Int):Dynamic {
|
||||
if (!initialized) {
|
||||
initialized = true;
|
||||
for (inp in inputs) {
|
||||
var val:Bool = inp.get();
|
||||
value.push(val);
|
||||
}
|
||||
}
|
||||
|
||||
return from == 0 ? value : value.length;
|
||||
}
|
||||
|
||||
override function set(value:Dynamic) {
|
||||
this.value = value;
|
||||
}
|
||||
}
|
29
Sources/armory/logicnode/ArrayColorNode.hx
Normal file
29
Sources/armory/logicnode/ArrayColorNode.hx
Normal file
|
@ -0,0 +1,29 @@
|
|||
package armory.logicnode;
|
||||
|
||||
import armory.math.Vec4;
|
||||
|
||||
class ArrayColorNode extends Node {
|
||||
|
||||
public var value:Array<Vec4> = [];
|
||||
var initialized = false;
|
||||
|
||||
public function new(tree:LogicTree) {
|
||||
super(tree);
|
||||
}
|
||||
|
||||
override function get(from:Int):Dynamic {
|
||||
if (!initialized) {
|
||||
initialized = true;
|
||||
for (inp in inputs) {
|
||||
var val:Vec4 = inp.get();
|
||||
value.push(val);
|
||||
}
|
||||
}
|
||||
|
||||
return from == 0 ? value : value.length;
|
||||
}
|
||||
|
||||
override function set(value:Dynamic) {
|
||||
this.value = value;
|
||||
}
|
||||
}
|
27
Sources/armory/logicnode/ArrayFloatNode.hx
Normal file
27
Sources/armory/logicnode/ArrayFloatNode.hx
Normal file
|
@ -0,0 +1,27 @@
|
|||
package armory.logicnode;
|
||||
|
||||
class ArrayFloatNode extends Node {
|
||||
|
||||
public var value:Array<Float> = [];
|
||||
var initialized = false;
|
||||
|
||||
public function new(tree:LogicTree) {
|
||||
super(tree);
|
||||
}
|
||||
|
||||
override function get(from:Int):Dynamic {
|
||||
if (!initialized) {
|
||||
initialized = true;
|
||||
for (inp in inputs) {
|
||||
var val:Float = inp.get();
|
||||
value.push(val);
|
||||
}
|
||||
}
|
||||
|
||||
return from == 0 ? value : value.length;
|
||||
}
|
||||
|
||||
override function set(value:Dynamic) {
|
||||
this.value = value;
|
||||
}
|
||||
}
|
27
Sources/armory/logicnode/ArrayIntegerNode.hx
Normal file
27
Sources/armory/logicnode/ArrayIntegerNode.hx
Normal file
|
@ -0,0 +1,27 @@
|
|||
package armory.logicnode;
|
||||
|
||||
class ArrayIntegerNode extends Node {
|
||||
|
||||
public var value:Array<Int> = [];
|
||||
var initialized = false;
|
||||
|
||||
public function new(tree:LogicTree) {
|
||||
super(tree);
|
||||
}
|
||||
|
||||
override function get(from:Int):Dynamic {
|
||||
if (!initialized) {
|
||||
initialized = true;
|
||||
for (inp in inputs) {
|
||||
var val:Int = inp.get();
|
||||
value.push(val);
|
||||
}
|
||||
}
|
||||
|
||||
return from == 0 ? value : value.length;
|
||||
}
|
||||
|
||||
override function set(value:Dynamic) {
|
||||
this.value = value;
|
||||
}
|
||||
}
|
|
@ -3,12 +3,21 @@ package armory.logicnode;
|
|||
class ArrayNode extends Node {
|
||||
|
||||
public var value:Array<Dynamic> = [];
|
||||
var initialized = false;
|
||||
|
||||
public function new(tree:LogicTree) {
|
||||
super(tree);
|
||||
}
|
||||
|
||||
override function get(from:Int):Dynamic {
|
||||
override function get(from:Int):Dynamic {
|
||||
if (!initialized) {
|
||||
initialized = true;
|
||||
for (inp in inputs) {
|
||||
var val:Dynamic = inp.get();
|
||||
value.push(val);
|
||||
}
|
||||
}
|
||||
|
||||
return from == 0 ? value : value.length;
|
||||
}
|
||||
|
||||
|
|
29
Sources/armory/logicnode/ArrayObjectNode.hx
Normal file
29
Sources/armory/logicnode/ArrayObjectNode.hx
Normal file
|
@ -0,0 +1,29 @@
|
|||
package armory.logicnode;
|
||||
|
||||
import armory.object.Object;
|
||||
|
||||
class ArrayObjectNode extends Node {
|
||||
|
||||
public var value:Array<Object> = [];
|
||||
var initialized = false;
|
||||
|
||||
public function new(tree:LogicTree) {
|
||||
super(tree);
|
||||
}
|
||||
|
||||
override function get(from:Int):Dynamic {
|
||||
if (!initialized) {
|
||||
initialized = true;
|
||||
for (inp in inputs) {
|
||||
var val:Object = inp.get();
|
||||
value.push(val);
|
||||
}
|
||||
}
|
||||
|
||||
return from == 0 ? value : value.length;
|
||||
}
|
||||
|
||||
override function set(value:Dynamic) {
|
||||
this.value = value;
|
||||
}
|
||||
}
|
27
Sources/armory/logicnode/ArrayStringNode.hx
Normal file
27
Sources/armory/logicnode/ArrayStringNode.hx
Normal file
|
@ -0,0 +1,27 @@
|
|||
package armory.logicnode;
|
||||
|
||||
class ArrayStringNode extends Node {
|
||||
|
||||
public var value:Array<String> = [];
|
||||
var initialized = false;
|
||||
|
||||
public function new(tree:LogicTree) {
|
||||
super(tree);
|
||||
}
|
||||
|
||||
override function get(from:Int):Dynamic {
|
||||
if (!initialized) {
|
||||
initialized = true;
|
||||
for (inp in inputs) {
|
||||
var val:String = inp.get();
|
||||
value.push(val);
|
||||
}
|
||||
}
|
||||
|
||||
return from == 0 ? value : value.length;
|
||||
}
|
||||
|
||||
override function set(value:Dynamic) {
|
||||
this.value = value;
|
||||
}
|
||||
}
|
29
Sources/armory/logicnode/ArrayVectorNode.hx
Normal file
29
Sources/armory/logicnode/ArrayVectorNode.hx
Normal file
|
@ -0,0 +1,29 @@
|
|||
package armory.logicnode;
|
||||
|
||||
import armory.math.Vec4;
|
||||
|
||||
class ArrayVectorNode extends Node {
|
||||
|
||||
public var value:Array<Vec4> = [];
|
||||
var initialized = false;
|
||||
|
||||
public function new(tree:LogicTree) {
|
||||
super(tree);
|
||||
}
|
||||
|
||||
override function get(from:Int):Dynamic {
|
||||
if (!initialized) {
|
||||
initialized = true;
|
||||
for (inp in inputs) {
|
||||
var val:Vec4 = inp.get();
|
||||
value.push(val);
|
||||
}
|
||||
}
|
||||
|
||||
return from == 0 ? value : value.length;
|
||||
}
|
||||
|
||||
override function set(value:Dynamic) {
|
||||
this.value = value;
|
||||
}
|
||||
}
|
24
Sources/armory/logicnode/CallGroupNode.hx
Normal file
24
Sources/armory/logicnode/CallGroupNode.hx
Normal file
|
@ -0,0 +1,24 @@
|
|||
package armory.logicnode;
|
||||
|
||||
class CallGroupNode extends Node {
|
||||
|
||||
public var property0:String;
|
||||
var instance:LogicTree = null;
|
||||
|
||||
public function new(tree:LogicTree) {
|
||||
super(tree);
|
||||
}
|
||||
|
||||
override function run() {
|
||||
|
||||
// Experimental only
|
||||
if (instance != null) tree.object.removeTrait(instance);
|
||||
|
||||
var classType = Type.resolveClass(property0);
|
||||
instance = Type.createInstance(classType, []);
|
||||
|
||||
tree.object.addTrait(instance);
|
||||
|
||||
runOutputs(0);
|
||||
}
|
||||
}
|
26
Sources/armory/logicnode/ExpressionNode.hx
Normal file
26
Sources/armory/logicnode/ExpressionNode.hx
Normal file
|
@ -0,0 +1,26 @@
|
|||
package armory.logicnode;
|
||||
|
||||
class ExpressionNode extends Node {
|
||||
|
||||
public var property0:String;
|
||||
var result:Dynamic;
|
||||
|
||||
public function new(tree:LogicTree) {
|
||||
super(tree);
|
||||
}
|
||||
|
||||
override function run() {
|
||||
|
||||
var expr = property0;
|
||||
var parser = new hscript.Parser();
|
||||
var ast = parser.parseString(expr);
|
||||
var interp = new hscript.Interp();
|
||||
result = interp.execute(ast);
|
||||
|
||||
runOutputs(0);
|
||||
}
|
||||
|
||||
override function get(from:Int):Dynamic {
|
||||
return result;
|
||||
}
|
||||
}
|
19
Sources/armory/logicnode/GetChildNode.hx
Normal file
19
Sources/armory/logicnode/GetChildNode.hx
Normal file
|
@ -0,0 +1,19 @@
|
|||
package armory.logicnode;
|
||||
|
||||
import armory.object.Object;
|
||||
|
||||
class GetChildNode extends Node {
|
||||
|
||||
public function new(tree:LogicTree) {
|
||||
super(tree);
|
||||
}
|
||||
|
||||
override function get(from:Int):Dynamic {
|
||||
var object:Object = inputs[0].get();
|
||||
var childName:String = inputs[1].get();
|
||||
|
||||
if (object == null) object = tree.object;
|
||||
|
||||
return object.getChild(childName);
|
||||
}
|
||||
}
|
17
Sources/armory/logicnode/GetDistanceNode.hx
Normal file
17
Sources/armory/logicnode/GetDistanceNode.hx
Normal file
|
@ -0,0 +1,17 @@
|
|||
package armory.logicnode;
|
||||
|
||||
import armory.object.Object;
|
||||
|
||||
class GetDistanceNode extends Node {
|
||||
|
||||
public function new(tree:LogicTree) {
|
||||
super(tree);
|
||||
}
|
||||
|
||||
override function get(from:Int):Dynamic {
|
||||
var object1:Object = inputs[0].get();
|
||||
var object2:Object = inputs[1].get();
|
||||
|
||||
return armory.math.Vec4.distance3d(object1.transform.loc, object2.transform.loc);
|
||||
}
|
||||
}
|
|
@ -11,6 +11,8 @@ class GetNameNode extends Node {
|
|||
override function get(from:Int):Dynamic {
|
||||
var object:Object = inputs[0].get();
|
||||
|
||||
if (object == null) object = tree.object;
|
||||
|
||||
return object.name;
|
||||
}
|
||||
}
|
||||
|
|
18
Sources/armory/logicnode/GetParentNode.hx
Normal file
18
Sources/armory/logicnode/GetParentNode.hx
Normal file
|
@ -0,0 +1,18 @@
|
|||
package armory.logicnode;
|
||||
|
||||
import armory.object.Object;
|
||||
|
||||
class GetParentNode extends Node {
|
||||
|
||||
public function new(tree:LogicTree) {
|
||||
super(tree);
|
||||
}
|
||||
|
||||
override function get(from:Int):Dynamic {
|
||||
var object:Object = inputs[0].get();
|
||||
|
||||
if (object == null) object = tree.object;
|
||||
|
||||
return object.parent;
|
||||
}
|
||||
}
|
|
@ -11,6 +11,8 @@ class GetVisibleNode extends Node {
|
|||
override function get(from:Int):Dynamic {
|
||||
var object:Object = inputs[0].get();
|
||||
|
||||
if (object == null) object = tree.object;
|
||||
|
||||
return object.visible;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -2,6 +2,7 @@ package armory.logicnode;
|
|||
|
||||
import armory.trait.internal.Navigation;
|
||||
import armory.object.Object;
|
||||
import armory.math.Vec4;
|
||||
|
||||
class GoToLocationNode extends Node {
|
||||
|
||||
|
|
13
Sources/armory/logicnode/GroupOutputNode.hx
Normal file
13
Sources/armory/logicnode/GroupOutputNode.hx
Normal file
|
@ -0,0 +1,13 @@
|
|||
package armory.logicnode;
|
||||
|
||||
class GroupOutputNode extends Node {
|
||||
|
||||
public function new(tree:LogicTree) {
|
||||
super(tree);
|
||||
}
|
||||
|
||||
override function run() {
|
||||
|
||||
super.run();
|
||||
}
|
||||
}
|
24
Sources/armory/logicnode/HasContactNode.hx
Normal file
24
Sources/armory/logicnode/HasContactNode.hx
Normal file
|
@ -0,0 +1,24 @@
|
|||
package armory.logicnode;
|
||||
|
||||
import armory.object.Object;
|
||||
import armory.trait.internal.RigidBody;
|
||||
|
||||
class HasContactNode extends Node {
|
||||
|
||||
public function new(tree:LogicTree) {
|
||||
super(tree);
|
||||
}
|
||||
|
||||
override function get(from:Int):Dynamic {
|
||||
var object1:Object = inputs[0].get();
|
||||
var object2:Object = inputs[1].get();
|
||||
|
||||
#if arm_physics
|
||||
var physics = armory.trait.internal.PhysicsWorld.active;
|
||||
var rb2 = object2.getTrait(RigidBody);
|
||||
var rbs = physics.getContacts(object1.getTrait(RigidBody));
|
||||
if (rbs != null) for (rb in rbs) if (rb == rb2) return true;
|
||||
#end
|
||||
return false;
|
||||
}
|
||||
}
|
|
@ -14,11 +14,15 @@ class InputCoordsNode extends Node {
|
|||
if (from == 0) {
|
||||
coords.x = armory.system.Input.x;
|
||||
coords.y = armory.system.Input.y;
|
||||
return coords;
|
||||
}
|
||||
else if (from == 1) {
|
||||
coords.x = armory.system.Input.movementX;
|
||||
coords.y = armory.system.Input.movementY;
|
||||
return coords;
|
||||
}
|
||||
else {
|
||||
return armory.system.Input.wheelDelta;
|
||||
}
|
||||
return coords;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -9,8 +9,8 @@ class MathNode extends Node {
|
|||
}
|
||||
|
||||
override function get(from:Int):Dynamic {
|
||||
var v1:Dynamic = inputs[0].get();
|
||||
var v2:Dynamic = inputs[1].get();
|
||||
var v1:Float = inputs[0].get();
|
||||
var v2:Float = inputs[1].get();
|
||||
switch (property0) {
|
||||
case "Add":
|
||||
return v1 + v2;
|
||||
|
|
|
@ -4,19 +4,22 @@ import armory.object.Object;
|
|||
|
||||
class ObjectNode extends Node {
|
||||
|
||||
public var property0:String;
|
||||
public var objectName:String;
|
||||
public var value:Object;
|
||||
|
||||
public function new(tree:LogicTree) {
|
||||
public function new(tree:LogicTree, objectName:String = "") {
|
||||
this.objectName = objectName;
|
||||
super(tree);
|
||||
}
|
||||
|
||||
override function get(from:Int):Dynamic {
|
||||
value = armory.Scene.active.getChild(property0);
|
||||
if (inputs.length > 0) return inputs[0].get();
|
||||
value = armory.Scene.active.getChild(objectName);
|
||||
return value;
|
||||
}
|
||||
|
||||
override function set(value:Dynamic) {
|
||||
this.value = value;
|
||||
if (inputs.length > 0) inputs[0].set(value);
|
||||
else this.value = value;
|
||||
}
|
||||
}
|
||||
|
|
54
Sources/armory/logicnode/OnContactNode.hx
Normal file
54
Sources/armory/logicnode/OnContactNode.hx
Normal file
|
@ -0,0 +1,54 @@
|
|||
package armory.logicnode;
|
||||
|
||||
import armory.object.Object;
|
||||
import armory.trait.internal.RigidBody;
|
||||
|
||||
class OnContactNode extends Node {
|
||||
|
||||
public var property0:String;
|
||||
var lastContact = false;
|
||||
|
||||
public function new(tree:LogicTree) {
|
||||
super(tree);
|
||||
|
||||
tree.notifyOnUpdate(update);
|
||||
}
|
||||
|
||||
function update() {
|
||||
var object1:Object = inputs[0].get();
|
||||
var object2:Object = inputs[1].get();
|
||||
|
||||
if (object1 == null) object1 = tree.object;
|
||||
if (object2 == null) object2 = tree.object;
|
||||
|
||||
var contact = false;
|
||||
|
||||
#if arm_physics
|
||||
var physics = armory.trait.internal.PhysicsWorld.active;
|
||||
var rb2 = object2.getTrait(RigidBody);
|
||||
var rbs = physics.getContacts(object1.getTrait(RigidBody));
|
||||
if (rbs != null) {
|
||||
for (rb in rbs) {
|
||||
if (rb == rb2) {
|
||||
contact = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
#end
|
||||
|
||||
var b = false;
|
||||
switch (property0) {
|
||||
case "Begin":
|
||||
b = contact && !lastContact;
|
||||
case "End":
|
||||
b = !contact && lastContact;
|
||||
case "Overlap":
|
||||
b = contact;
|
||||
}
|
||||
|
||||
lastContact = contact;
|
||||
|
||||
if (b) run();
|
||||
}
|
||||
}
|
27
Sources/armory/logicnode/OnTimerNode.hx
Normal file
27
Sources/armory/logicnode/OnTimerNode.hx
Normal file
|
@ -0,0 +1,27 @@
|
|||
package armory.logicnode;
|
||||
|
||||
class OnTimerNode extends Node {
|
||||
|
||||
var duration = 0.0;
|
||||
var repeat = false;
|
||||
|
||||
public function new(tree:LogicTree) {
|
||||
super(tree);
|
||||
|
||||
tree.notifyOnUpdate(update);
|
||||
}
|
||||
|
||||
function update() {
|
||||
|
||||
if (duration <= 0.0) {
|
||||
duration = inputs[0].get();
|
||||
repeat = inputs[1].get();
|
||||
}
|
||||
|
||||
duration -= armory.system.Time.delta;
|
||||
if (duration <= 0.0) {
|
||||
if (!repeat) tree.removeUpdate(update);
|
||||
run();
|
||||
}
|
||||
}
|
||||
}
|
52
Sources/armory/logicnode/OnVolumeTriggerNode.hx
Normal file
52
Sources/armory/logicnode/OnVolumeTriggerNode.hx
Normal file
|
@ -0,0 +1,52 @@
|
|||
package armory.logicnode;
|
||||
|
||||
import armory.object.Object;
|
||||
import armory.math.Vec4;
|
||||
|
||||
class OnVolumeTriggerNode extends Node {
|
||||
|
||||
public var property0:String;
|
||||
var lastOverlap = false;
|
||||
|
||||
var l1 = new Vec4();
|
||||
var l2 = new Vec4();
|
||||
|
||||
public function new(tree:LogicTree) {
|
||||
super(tree);
|
||||
|
||||
tree.notifyOnUpdate(update);
|
||||
}
|
||||
|
||||
function update() {
|
||||
var object:Object = inputs[0].get();
|
||||
var volume:Object = inputs[1].get();
|
||||
|
||||
if (object == null) object = tree.object;
|
||||
if (volume == null) volume = tree.object;
|
||||
|
||||
var t1 = object.transform;
|
||||
var t2 = volume.transform;
|
||||
l1.set(t1.absx(), t1.absy(), t1.absz());
|
||||
l2.set(t2.absx(), t2.absy(), t2.absz());
|
||||
var s1 = t1.size;
|
||||
var s2 = t2.size;
|
||||
|
||||
var overlap = l1.x + s1.x / 2 > l2.x - s2.x / 2 && l1.x - s1.x / 2 < l2.x + s2.x &&
|
||||
l1.y + s1.y / 2 > l2.y - s2.y / 2 && l1.y - s1.y / 2 < l2.y + s2.y &&
|
||||
l1.z + s1.z / 2 > l2.z - s2.z / 2 && l1.z - s1.z / 2 < l2.z + s2.z;
|
||||
|
||||
var b = false;
|
||||
switch (property0) {
|
||||
case "Enter":
|
||||
b = overlap && !lastOverlap;
|
||||
case "Leave":
|
||||
b = !overlap && lastOverlap;
|
||||
case "Overlap":
|
||||
b = overlap;
|
||||
}
|
||||
|
||||
lastOverlap = overlap;
|
||||
|
||||
if (b) run();
|
||||
}
|
||||
}
|
20
Sources/armory/logicnode/PauseActionNode.hx
Normal file
20
Sources/armory/logicnode/PauseActionNode.hx
Normal file
|
@ -0,0 +1,20 @@
|
|||
package armory.logicnode;
|
||||
|
||||
import armory.object.Object;
|
||||
|
||||
class PauseActionNode extends Node {
|
||||
|
||||
public function new(tree:LogicTree) {
|
||||
super(tree);
|
||||
}
|
||||
|
||||
override function run() {
|
||||
var object:Object = inputs[1].get();
|
||||
|
||||
if (object == null) object = tree.object;
|
||||
|
||||
object.animation.player.pause();
|
||||
|
||||
super.run();
|
||||
}
|
||||
}
|
23
Sources/armory/logicnode/PlayActionNode.hx
Normal file
23
Sources/armory/logicnode/PlayActionNode.hx
Normal file
|
@ -0,0 +1,23 @@
|
|||
package armory.logicnode;
|
||||
|
||||
import armory.object.Object;
|
||||
|
||||
class PlayActionNode extends Node {
|
||||
|
||||
public function new(tree:LogicTree) {
|
||||
super(tree);
|
||||
}
|
||||
|
||||
override function run() {
|
||||
var object:Object = inputs[1].get();
|
||||
var action:String = inputs[2].get();
|
||||
|
||||
if (object == null) object = tree.object;
|
||||
|
||||
object.animation.player.play(action, function() {
|
||||
runOutputs(1);
|
||||
});
|
||||
|
||||
runOutputs(0);
|
||||
}
|
||||
}
|
16
Sources/armory/logicnode/PlaySoundNode.hx
Normal file
16
Sources/armory/logicnode/PlaySoundNode.hx
Normal file
|
@ -0,0 +1,16 @@
|
|||
package armory.logicnode;
|
||||
|
||||
import armory.object.SpeakerObject;
|
||||
|
||||
class PlaySoundNode extends Node {
|
||||
|
||||
public function new(tree:LogicTree) {
|
||||
super(tree);
|
||||
}
|
||||
|
||||
override function run() {
|
||||
var object:SpeakerObject = cast(inputs[1].get(), SpeakerObject);
|
||||
object.play();
|
||||
super.run();
|
||||
}
|
||||
}
|
12
Sources/armory/logicnode/RandomBooleanNode.hx
Normal file
12
Sources/armory/logicnode/RandomBooleanNode.hx
Normal file
|
@ -0,0 +1,12 @@
|
|||
package armory.logicnode;
|
||||
|
||||
class RandomBooleanNode extends Node {
|
||||
|
||||
public function new(tree:LogicTree) {
|
||||
super(tree);
|
||||
}
|
||||
|
||||
override function get(from:Int):Dynamic {
|
||||
return Std.random(2) == 0;
|
||||
}
|
||||
}
|
21
Sources/armory/logicnode/RandomColorNode.hx
Normal file
21
Sources/armory/logicnode/RandomColorNode.hx
Normal file
|
@ -0,0 +1,21 @@
|
|||
package armory.logicnode;
|
||||
|
||||
import armory.math.Vec4;
|
||||
|
||||
class RandomColorNode extends Node {
|
||||
|
||||
var v = new Vec4();
|
||||
|
||||
public function new(tree:LogicTree) {
|
||||
super(tree);
|
||||
}
|
||||
|
||||
override function get(from:Int):Dynamic {
|
||||
var r = Math.random();
|
||||
var g = Math.random();
|
||||
var b = Math.random();
|
||||
// var a = Math.random();
|
||||
v.set(r, g, b);
|
||||
return v;
|
||||
}
|
||||
}
|
14
Sources/armory/logicnode/RandomFloatNode.hx
Normal file
14
Sources/armory/logicnode/RandomFloatNode.hx
Normal file
|
@ -0,0 +1,14 @@
|
|||
package armory.logicnode;
|
||||
|
||||
class RandomFloatNode extends Node {
|
||||
|
||||
public function new(tree:LogicTree) {
|
||||
super(tree);
|
||||
}
|
||||
|
||||
override function get(from:Int):Dynamic {
|
||||
var min:Float = inputs[0].get();
|
||||
var max:Float = inputs[1].get();
|
||||
return min + (Math.random() * (max - min));
|
||||
}
|
||||
}
|
14
Sources/armory/logicnode/RandomIntegerNode.hx
Normal file
14
Sources/armory/logicnode/RandomIntegerNode.hx
Normal file
|
@ -0,0 +1,14 @@
|
|||
package armory.logicnode;
|
||||
|
||||
class RandomIntegerNode extends Node {
|
||||
|
||||
public function new(tree:LogicTree) {
|
||||
super(tree);
|
||||
}
|
||||
|
||||
override function get(from:Int):Dynamic {
|
||||
var min:Int = inputs[0].get();
|
||||
var max:Int = inputs[1].get();
|
||||
return min + Std.random(max - min);
|
||||
}
|
||||
}
|
22
Sources/armory/logicnode/RandomVectorNode.hx
Normal file
22
Sources/armory/logicnode/RandomVectorNode.hx
Normal file
|
@ -0,0 +1,22 @@
|
|||
package armory.logicnode;
|
||||
|
||||
import armory.math.Vec4;
|
||||
|
||||
class RandomVectorNode extends Node {
|
||||
|
||||
var v = new Vec4();
|
||||
|
||||
public function new(tree:LogicTree) {
|
||||
super(tree);
|
||||
}
|
||||
|
||||
override function get(from:Int):Dynamic {
|
||||
var min:Float = inputs[0].get();
|
||||
var max:Float = inputs[1].get();
|
||||
var x = min + (Math.random() * (max - min));
|
||||
var y = min + (Math.random() * (max - min));
|
||||
var z = min + (Math.random() * (max - min));
|
||||
v.set(x, y, z);
|
||||
return v;
|
||||
}
|
||||
}
|
26
Sources/armory/logicnode/ScriptNode.hx
Normal file
26
Sources/armory/logicnode/ScriptNode.hx
Normal file
|
@ -0,0 +1,26 @@
|
|||
package armory.logicnode;
|
||||
|
||||
class ScriptNode extends Node {
|
||||
|
||||
public var property0:String;
|
||||
var result:Dynamic;
|
||||
|
||||
public function new(tree:LogicTree) {
|
||||
super(tree);
|
||||
}
|
||||
|
||||
override function run() {
|
||||
|
||||
var expr = property0;
|
||||
var parser = new hscript.Parser();
|
||||
var ast = parser.parseString(expr);
|
||||
var interp = new hscript.Interp();
|
||||
result = interp.execute(ast);
|
||||
|
||||
runOutputs(0);
|
||||
}
|
||||
|
||||
override function get(from:Int):Dynamic {
|
||||
return result;
|
||||
}
|
||||
}
|
18
Sources/armory/logicnode/SeparateColorNode.hx
Normal file
18
Sources/armory/logicnode/SeparateColorNode.hx
Normal file
|
@ -0,0 +1,18 @@
|
|||
package armory.logicnode;
|
||||
|
||||
import armory.math.Vec4;
|
||||
|
||||
class SeparateColorNode extends Node {
|
||||
|
||||
public function new(tree:LogicTree) {
|
||||
super(tree);
|
||||
}
|
||||
|
||||
override function get(from:Int):Dynamic {
|
||||
var vector:Vec4 = inputs[0].get();
|
||||
|
||||
if (from == 0) vector.x;
|
||||
else if (from == 1) vector.y;
|
||||
else vector.z;
|
||||
}
|
||||
}
|
33
Sources/armory/logicnode/SetVelocityNode.hx
Normal file
33
Sources/armory/logicnode/SetVelocityNode.hx
Normal file
|
@ -0,0 +1,33 @@
|
|||
package armory.logicnode;
|
||||
|
||||
import armory.object.Object;
|
||||
import armory.math.Vec4;
|
||||
import armory.trait.internal.RigidBody;
|
||||
|
||||
class SetVelocityNode extends Node {
|
||||
|
||||
public function new(tree:LogicTree) {
|
||||
super(tree);
|
||||
}
|
||||
|
||||
override function run() {
|
||||
var object:Object = inputs[1].get();
|
||||
var linear:Vec4 = inputs[2].get();
|
||||
var linearFactor:Vec4 = inputs[3].get();
|
||||
var angular:Vec4 = inputs[4].get();
|
||||
var angularFactor:Vec4 = inputs[5].get();
|
||||
|
||||
if (object == null) object = tree.object;
|
||||
|
||||
#if arm_physics
|
||||
var rb:RigidBody = object.getTrait(RigidBody);
|
||||
rb.activate();
|
||||
rb.setLinearVelocity(linear.x, linear.y, linear.z);
|
||||
rb.setLinearFactor(linearFactor.x, linearFactor.y, linearFactor.z);
|
||||
rb.setAngularVelocity(angular.x, angular.y, angular.z);
|
||||
rb.setAngularFactor(angularFactor.x, angularFactor.y, angularFactor.z);
|
||||
#end
|
||||
|
||||
super.run();
|
||||
}
|
||||
}
|
32
Sources/armory/logicnode/VectorMathNode.hx
Normal file
32
Sources/armory/logicnode/VectorMathNode.hx
Normal file
|
@ -0,0 +1,32 @@
|
|||
package armory.logicnode;
|
||||
|
||||
import armory.math.Vec4;
|
||||
|
||||
class VectorMathNode extends Node {
|
||||
|
||||
public var property0:String;
|
||||
var v = new Vec4();
|
||||
|
||||
public function new(tree:LogicTree) {
|
||||
super(tree);
|
||||
}
|
||||
|
||||
override function get(from:Int):Dynamic {
|
||||
var v1:Vec4 = inputs[0].get();
|
||||
var v2:Vec4 = inputs[1].get();
|
||||
v.setFrom(v1);
|
||||
var f = 0.0;
|
||||
switch (property0) {
|
||||
case "Add":
|
||||
v.add(v2);
|
||||
case "Dot Product":
|
||||
f = v.dot(v2);
|
||||
v.set(f, f, f);
|
||||
case "Normalize":
|
||||
v.normalize();
|
||||
}
|
||||
|
||||
if (from == 0) return v;
|
||||
else return f;
|
||||
}
|
||||
}
|
|
@ -175,17 +175,11 @@ def on_load_post(context):
|
|||
props.init_properties_on_load()
|
||||
make_renderer.reload_blend_data()
|
||||
|
||||
# Check for blender.py scripts in enabled libraries
|
||||
# for fp in appended_py_paths:
|
||||
# sys.path.remove(fp)
|
||||
# appended_py_paths = []
|
||||
|
||||
wrd = bpy.data.worlds['Arm']
|
||||
for lib in wrd.my_librarytraitlist:
|
||||
if lib.enabled_prop:
|
||||
fp = arm.utils.get_fp() + '/Libraries/' + lib.name
|
||||
if fp not in appended_py_paths and os.path.exists(fp + '/blender.py'):
|
||||
# if os.path.exists(fp + '/blender.py'):
|
||||
sys.path.append(fp)
|
||||
appended_py_paths.append(fp)
|
||||
import blender
|
||||
|
|
18
blender/arm/logicnode/animation_animation_state.py
Normal file
18
blender/arm/logicnode/animation_animation_state.py
Normal file
|
@ -0,0 +1,18 @@
|
|||
import bpy
|
||||
from bpy.props import *
|
||||
from bpy.types import Node, NodeSocket
|
||||
from arm.logicnode.arm_nodes import *
|
||||
|
||||
class AnimationStateNode(Node, ArmLogicTreeNode):
|
||||
'''Animation state node'''
|
||||
bl_idname = 'LNAnimationStateNode'
|
||||
bl_label = 'Animation State'
|
||||
bl_icon = 'GAME'
|
||||
|
||||
def init(self, context):
|
||||
self.inputs.new('ArmNodeSocketObject', 'Object')
|
||||
self.outputs.new('NodeSocketBool', 'Is Playing')
|
||||
self.outputs.new('NodeSocketString', 'Action')
|
||||
self.outputs.new('NodeSocketInt', 'Frame')
|
||||
|
||||
add_node(AnimationStateNode, category='Animation')
|
17
blender/arm/logicnode/animation_pause_action.py
Normal file
17
blender/arm/logicnode/animation_pause_action.py
Normal file
|
@ -0,0 +1,17 @@
|
|||
import bpy
|
||||
from bpy.props import *
|
||||
from bpy.types import Node, NodeSocket
|
||||
from arm.logicnode.arm_nodes import *
|
||||
|
||||
class PauseActionNode(Node, ArmLogicTreeNode):
|
||||
'''Pause action node'''
|
||||
bl_idname = 'LNPauseActionNode'
|
||||
bl_label = 'Pause Action'
|
||||
bl_icon = 'GAME'
|
||||
|
||||
def init(self, context):
|
||||
self.inputs.new('ArmNodeSocketOperator', 'In')
|
||||
self.inputs.new('ArmNodeSocketObject', 'Object')
|
||||
self.outputs.new('ArmNodeSocketOperator', 'Out')
|
||||
|
||||
add_node(PauseActionNode, category='Animation')
|
19
blender/arm/logicnode/animation_play_action.py
Normal file
19
blender/arm/logicnode/animation_play_action.py
Normal file
|
@ -0,0 +1,19 @@
|
|||
import bpy
|
||||
from bpy.props import *
|
||||
from bpy.types import Node, NodeSocket
|
||||
from arm.logicnode.arm_nodes import *
|
||||
|
||||
class PlayActionNode(Node, ArmLogicTreeNode):
|
||||
'''Play action node'''
|
||||
bl_idname = 'LNPlayActionNode'
|
||||
bl_label = 'Play Action'
|
||||
bl_icon = 'GAME'
|
||||
|
||||
def init(self, context):
|
||||
self.inputs.new('ArmNodeSocketOperator', 'In')
|
||||
self.inputs.new('ArmNodeSocketObject', 'Object')
|
||||
self.inputs.new('NodeSocketString', 'Clip')
|
||||
self.outputs.new('ArmNodeSocketOperator', 'Out')
|
||||
self.outputs.new('ArmNodeSocketOperator', 'Done')
|
||||
|
||||
add_node(PlayActionNode, category='Animation')
|
|
@ -1,22 +1,106 @@
|
|||
import bpy.types
|
||||
from bpy.props import *
|
||||
from nodeitems_utils import NodeItem
|
||||
|
||||
nodes = []
|
||||
category_items = {}
|
||||
category_items['Event'] = []
|
||||
category_items['Value'] = []
|
||||
category_items['Variable'] = []
|
||||
category_items['Input'] = []
|
||||
category_items['Logic'] = []
|
||||
category_items['Operator'] = []
|
||||
category_items['Native'] = []
|
||||
category_items['Physics'] = []
|
||||
category_items['Navmesh'] = []
|
||||
category_items['Animation'] = []
|
||||
category_items['Sound'] = []
|
||||
|
||||
object_sockets = dict()
|
||||
array_nodes = dict()
|
||||
|
||||
class ArmLogicTreeNode:
|
||||
@classmethod
|
||||
def poll(cls, ntree):
|
||||
return ntree.bl_idname == 'ArmLogicTreeType'
|
||||
|
||||
class ArmOperatorSocket(bpy.types.NodeSocket):
|
||||
bl_idname = 'ArmNodeSocketOperator'
|
||||
bl_label = 'Operator Socket'
|
||||
|
||||
def draw(self, context, layout, node, text):
|
||||
layout.label(self.name)
|
||||
|
||||
def draw_color(self, context, node):
|
||||
return (0.8, 0.3, 0.3, 1)
|
||||
|
||||
class ArmObjectSocket(bpy.types.NodeSocket):
|
||||
bl_idname = 'ArmNodeSocketObject'
|
||||
bl_label = 'Object Socket'
|
||||
default_value = StringProperty(name='Object', default='')
|
||||
|
||||
def __init__(self):
|
||||
global object_sockets
|
||||
# Buckle up..
|
||||
# Match id strings to socket dict to retrieve socket in eyedropper operator
|
||||
object_sockets[str(id(self))] = self
|
||||
|
||||
def draw(self, context, layout, node, text):
|
||||
if self.is_output:
|
||||
layout.label(self.name)
|
||||
else:
|
||||
row = layout.row(align = True)
|
||||
row.prop_search(self, 'default_value', bpy.context.scene, 'objects', icon='NONE', text='')
|
||||
op = row.operator('arm.node_eyedrop', text='', icon='EYEDROPPER', emboss=True)
|
||||
op.socket_index = str(id(self))
|
||||
|
||||
def draw_color(self, context, node):
|
||||
return (0.15, 0.55, 0.75, 1)
|
||||
|
||||
class ArmNodeEyedropButton(bpy.types.Operator):
|
||||
'''Pick selected object'''
|
||||
bl_idname = 'arm.node_eyedrop'
|
||||
bl_label = 'Eyedrop'
|
||||
socket_index = StringProperty(name='Socket Index', default='')
|
||||
|
||||
def execute(self, context):
|
||||
global object_sockets
|
||||
obj = bpy.context.active_object
|
||||
if obj != None:
|
||||
object_sockets[self.socket_index].default_value = obj.name
|
||||
return{'FINISHED'}
|
||||
|
||||
class ArmNodeAddInputButton(bpy.types.Operator):
|
||||
'''Add new input'''
|
||||
bl_idname = 'arm.node_add_input'
|
||||
bl_label = 'Add Input'
|
||||
node_index = StringProperty(name='Node Index', default='')
|
||||
socket_type = StringProperty(name='Socket Type', default='NodeSocketShader')
|
||||
|
||||
def execute(self, context):
|
||||
global array_nodes
|
||||
array_nodes[self.node_index].inputs.new(self.socket_type, '')
|
||||
return{'FINISHED'}
|
||||
|
||||
class ArmNodeRemoveInputButton(bpy.types.Operator):
|
||||
'''Remove last input'''
|
||||
bl_idname = 'arm.node_remove_input'
|
||||
bl_label = 'Remove Input'
|
||||
node_index = StringProperty(name='Node Index', default='')
|
||||
|
||||
def execute(self, context):
|
||||
global array_nodes
|
||||
inps = array_nodes[self.node_index].inputs
|
||||
if len(inps) > 0:
|
||||
inps.remove(inps.values()[-1])
|
||||
return{'FINISHED'}
|
||||
|
||||
def add_node(node_class, category):
|
||||
global nodes
|
||||
nodes.append(node_class)
|
||||
category_items[category].append(NodeItem(node_class.bl_idname))
|
||||
global nodes
|
||||
nodes.append(node_class)
|
||||
category_items[category].append(NodeItem(node_class.bl_idname))
|
||||
|
||||
bpy.utils.register_class(ArmOperatorSocket)
|
||||
bpy.utils.register_class(ArmObjectSocket)
|
||||
bpy.utils.register_class(ArmNodeEyedropButton)
|
||||
bpy.utils.register_class(ArmNodeAddInputButton)
|
||||
bpy.utils.register_class(ArmNodeRemoveInputButton)
|
||||
|
|
|
@ -10,6 +10,6 @@ class OnInitNode(Node, ArmLogicTreeNode):
|
|||
bl_icon = 'CURVE_PATH'
|
||||
|
||||
def init(self, context):
|
||||
self.outputs.new('NodeSocketShader', 'Out')
|
||||
self.outputs.new('ArmNodeSocketOperator', 'Out')
|
||||
|
||||
add_node(OnInitNode, category='Event')
|
||||
|
|
|
@ -16,7 +16,7 @@ class OnInputNode(Node, ArmLogicTreeNode):
|
|||
name='', default='Down')
|
||||
|
||||
def init(self, context):
|
||||
self.outputs.new('NodeSocketShader', 'Out')
|
||||
self.outputs.new('ArmNodeSocketOperator', 'Out')
|
||||
|
||||
def draw_buttons(self, context, layout):
|
||||
layout.prop(self, 'property0')
|
||||
|
|
17
blender/arm/logicnode/event_on_timer.py
Normal file
17
blender/arm/logicnode/event_on_timer.py
Normal file
|
@ -0,0 +1,17 @@
|
|||
import bpy
|
||||
from bpy.props import *
|
||||
from bpy.types import Node, NodeSocket
|
||||
from arm.logicnode.arm_nodes import *
|
||||
|
||||
class OnTimerNode(Node, ArmLogicTreeNode):
|
||||
'''On timer node'''
|
||||
bl_idname = 'LNOnTimerNode'
|
||||
bl_label = 'On Timer'
|
||||
bl_icon = 'CURVE_PATH'
|
||||
|
||||
def init(self, context):
|
||||
self.inputs.new('NodeSocketFloat', 'Duration')
|
||||
self.inputs.new('NodeSocketBool', 'Repeat')
|
||||
self.outputs.new('ArmNodeSocketOperator', 'Out')
|
||||
|
||||
add_node(OnTimerNode, category='Event')
|
|
@ -10,6 +10,6 @@ class OnUpdateNode(Node, ArmLogicTreeNode):
|
|||
bl_icon = 'CURVE_PATH'
|
||||
|
||||
def init(self, context):
|
||||
self.outputs.new('NodeSocketShader', 'Out')
|
||||
self.outputs.new('ArmNodeSocketOperator', 'Out')
|
||||
|
||||
add_node(OnUpdateNode, category='Event')
|
||||
|
|
25
blender/arm/logicnode/event_on_volume_trigger.py
Normal file
25
blender/arm/logicnode/event_on_volume_trigger.py
Normal file
|
@ -0,0 +1,25 @@
|
|||
import bpy
|
||||
from bpy.props import *
|
||||
from bpy.types import Node, NodeSocket
|
||||
from arm.logicnode.arm_nodes import *
|
||||
|
||||
class OnVolumeTriggerNode(Node, ArmLogicTreeNode):
|
||||
'''On volume trigger node'''
|
||||
bl_idname = 'LNOnVolumeTriggerNode'
|
||||
bl_label = 'On Volume Trigger'
|
||||
bl_icon = 'CURVE_PATH'
|
||||
property0 = EnumProperty(
|
||||
items = [('Enter', 'Enter', 'Enter'),
|
||||
('Leave', 'Leave', 'Leave'),
|
||||
('Overlap', 'Overlap', 'Overlap')],
|
||||
name='', default='Enter')
|
||||
|
||||
def init(self, context):
|
||||
self.inputs.new('ArmNodeSocketObject', 'Object')
|
||||
self.inputs.new('NodeSocketShader', 'Object Volume')
|
||||
self.outputs.new('ArmNodeSocketOperator', 'Out')
|
||||
|
||||
def draw_buttons(self, context, layout):
|
||||
layout.prop(self, 'property0')
|
||||
|
||||
add_node(OnVolumeTriggerNode, category='Event')
|
27
blender/arm/logicnode/input_array.py
Normal file
27
blender/arm/logicnode/input_array.py
Normal file
|
@ -0,0 +1,27 @@
|
|||
import bpy
|
||||
from bpy.props import *
|
||||
from bpy.types import Node, NodeSocket
|
||||
from arm.logicnode.arm_nodes import *
|
||||
|
||||
class ArrayNode(Node, ArmLogicTreeNode):
|
||||
'''Array node'''
|
||||
bl_idname = 'LNArrayNode'
|
||||
bl_label = 'Array'
|
||||
bl_icon = 'GAME'
|
||||
|
||||
def __init__(self):
|
||||
array_nodes[str(id(self))] = self
|
||||
|
||||
def init(self, context):
|
||||
self.outputs.new('NodeSocketShader', 'Array')
|
||||
self.outputs.new('NodeSocketInt', 'Length')
|
||||
|
||||
def draw_buttons(self, context, layout):
|
||||
row = layout.row(align=True)
|
||||
|
||||
op = row.operator('arm.node_add_input', text='New', icon='PLUS', emboss=True)
|
||||
op.node_index = str(id(self))
|
||||
op2 = row.operator('arm.node_remove_input', text='', icon='X', emboss=True)
|
||||
op2.node_index = str(id(self))
|
||||
|
||||
add_node(ArrayNode, category='Input')
|
27
blender/arm/logicnode/input_array_boolean.py
Normal file
27
blender/arm/logicnode/input_array_boolean.py
Normal file
|
@ -0,0 +1,27 @@
|
|||
import bpy
|
||||
from bpy.props import *
|
||||
from bpy.types import Node, NodeSocket
|
||||
from arm.logicnode.arm_nodes import *
|
||||
|
||||
class BooleanArrayNode(Node, ArmLogicTreeNode):
|
||||
'''Boolean array node'''
|
||||
bl_idname = 'LNArrayBooleanNode'
|
||||
bl_label = 'Array (Boolean)'
|
||||
bl_icon = 'GAME'
|
||||
|
||||
def __init__(self):
|
||||
array_nodes[str(id(self))] = self
|
||||
|
||||
def init(self, context):
|
||||
self.outputs.new('NodeSocketShader', 'Array')
|
||||
self.outputs.new('NodeSocketInt', 'Length')
|
||||
|
||||
def draw_buttons(self, context, layout):
|
||||
row = layout.row(align=True)
|
||||
|
||||
op = row.operator('arm.node_add_input', text='New', icon='PLUS', emboss=True)
|
||||
op.node_index = str(id(self))
|
||||
op.socket_type = 'NodeSocketBool'
|
||||
op2 = row.operator('arm.node_remove_input', text='', icon='X', emboss=True)
|
||||
|
||||
add_node(BooleanArrayNode, category='Input')
|
27
blender/arm/logicnode/input_array_color.py
Normal file
27
blender/arm/logicnode/input_array_color.py
Normal file
|
@ -0,0 +1,27 @@
|
|||
import bpy
|
||||
from bpy.props import *
|
||||
from bpy.types import Node, NodeSocket
|
||||
from arm.logicnode.arm_nodes import *
|
||||
|
||||
class ColorArrayNode(Node, ArmLogicTreeNode):
|
||||
'''Color array node'''
|
||||
bl_idname = 'LNArrayColorNode'
|
||||
bl_label = 'Array (Color)'
|
||||
bl_icon = 'GAME'
|
||||
|
||||
def __init__(self):
|
||||
array_nodes[str(id(self))] = self
|
||||
|
||||
def init(self, context):
|
||||
self.outputs.new('NodeSocketShader', 'Array')
|
||||
self.outputs.new('NodeSocketInt', 'Length')
|
||||
|
||||
def draw_buttons(self, context, layout):
|
||||
row = layout.row(align=True)
|
||||
|
||||
op = row.operator('arm.node_add_input', text='New', icon='PLUS', emboss=True)
|
||||
op.node_index = str(id(self))
|
||||
op.socket_type = 'NodeSocketColor'
|
||||
op2 = row.operator('arm.node_remove_input', text='', icon='X', emboss=True)
|
||||
|
||||
add_node(ColorArrayNode, category='Input')
|
27
blender/arm/logicnode/input_array_float.py
Normal file
27
blender/arm/logicnode/input_array_float.py
Normal file
|
@ -0,0 +1,27 @@
|
|||
import bpy
|
||||
from bpy.props import *
|
||||
from bpy.types import Node, NodeSocket
|
||||
from arm.logicnode.arm_nodes import *
|
||||
|
||||
class FloatArrayNode(Node, ArmLogicTreeNode):
|
||||
'''Float array node'''
|
||||
bl_idname = 'LNArrayFloatNode'
|
||||
bl_label = 'Array (Float)'
|
||||
bl_icon = 'GAME'
|
||||
|
||||
def __init__(self):
|
||||
array_nodes[str(id(self))] = self
|
||||
|
||||
def init(self, context):
|
||||
self.outputs.new('NodeSocketShader', 'Array')
|
||||
self.outputs.new('NodeSocketInt', 'Length')
|
||||
|
||||
def draw_buttons(self, context, layout):
|
||||
row = layout.row(align=True)
|
||||
|
||||
op = row.operator('arm.node_add_input', text='New', icon='PLUS', emboss=True)
|
||||
op.node_index = str(id(self))
|
||||
op.socket_type = 'NodeSocketFloat'
|
||||
op2 = row.operator('arm.node_remove_input', text='', icon='X', emboss=True)
|
||||
|
||||
add_node(FloatArrayNode, category='Input')
|
27
blender/arm/logicnode/input_array_integer.py
Normal file
27
blender/arm/logicnode/input_array_integer.py
Normal file
|
@ -0,0 +1,27 @@
|
|||
import bpy
|
||||
from bpy.props import *
|
||||
from bpy.types import Node, NodeSocket
|
||||
from arm.logicnode.arm_nodes import *
|
||||
|
||||
class IntegerArrayNode(Node, ArmLogicTreeNode):
|
||||
'''Integer array node'''
|
||||
bl_idname = 'LNArrayIntegerNode'
|
||||
bl_label = 'Array (Integer)'
|
||||
bl_icon = 'GAME'
|
||||
|
||||
def __init__(self):
|
||||
array_nodes[str(id(self))] = self
|
||||
|
||||
def init(self, context):
|
||||
self.outputs.new('NodeSocketShader', 'Array')
|
||||
self.outputs.new('NodeSocketInt', 'Length')
|
||||
|
||||
def draw_buttons(self, context, layout):
|
||||
row = layout.row(align=True)
|
||||
|
||||
op = row.operator('arm.node_add_input', text='New', icon='PLUS', emboss=True)
|
||||
op.node_index = str(id(self))
|
||||
op.socket_type = 'NodeSocketInt'
|
||||
op2 = row.operator('arm.node_remove_input', text='', icon='X', emboss=True)
|
||||
|
||||
add_node(IntegerArrayNode, category='Input')
|
27
blender/arm/logicnode/input_array_object.py
Normal file
27
blender/arm/logicnode/input_array_object.py
Normal file
|
@ -0,0 +1,27 @@
|
|||
import bpy
|
||||
from bpy.props import *
|
||||
from bpy.types import Node, NodeSocket
|
||||
from arm.logicnode.arm_nodes import *
|
||||
|
||||
class ObjectArrayNode(Node, ArmLogicTreeNode):
|
||||
'''Object array node'''
|
||||
bl_idname = 'LNArrayObjectNode'
|
||||
bl_label = 'Array (Object)'
|
||||
bl_icon = 'GAME'
|
||||
|
||||
def __init__(self):
|
||||
array_nodes[str(id(self))] = self
|
||||
|
||||
def init(self, context):
|
||||
self.outputs.new('NodeSocketShader', 'Array')
|
||||
self.outputs.new('NodeSocketInt', 'Length')
|
||||
|
||||
def draw_buttons(self, context, layout):
|
||||
row = layout.row(align=True)
|
||||
|
||||
op = row.operator('arm.node_add_input', text='New', icon='PLUS', emboss=True)
|
||||
op.node_index = str(id(self))
|
||||
op.socket_type = 'ArmNodeSocketObject'
|
||||
op2 = row.operator('arm.node_remove_input', text='', icon='X', emboss=True)
|
||||
|
||||
add_node(ObjectArrayNode, category='Input')
|
27
blender/arm/logicnode/input_array_string.py
Normal file
27
blender/arm/logicnode/input_array_string.py
Normal file
|
@ -0,0 +1,27 @@
|
|||
import bpy
|
||||
from bpy.props import *
|
||||
from bpy.types import Node, NodeSocket
|
||||
from arm.logicnode.arm_nodes import *
|
||||
|
||||
class StringArrayNode(Node, ArmLogicTreeNode):
|
||||
'''String array node'''
|
||||
bl_idname = 'LNArrayStringNode'
|
||||
bl_label = 'Array (String)'
|
||||
bl_icon = 'GAME'
|
||||
|
||||
def __init__(self):
|
||||
array_nodes[str(id(self))] = self
|
||||
|
||||
def init(self, context):
|
||||
self.outputs.new('NodeSocketShader', 'Array')
|
||||
self.outputs.new('NodeSocketInt', 'Length')
|
||||
|
||||
def draw_buttons(self, context, layout):
|
||||
row = layout.row(align=True)
|
||||
|
||||
op = row.operator('arm.node_add_input', text='New', icon='PLUS', emboss=True)
|
||||
op.node_index = str(id(self))
|
||||
op.socket_type = 'NodeSocketString'
|
||||
op2 = row.operator('arm.node_remove_input', text='', icon='X', emboss=True)
|
||||
|
||||
add_node(StringArrayNode, category='Input')
|
27
blender/arm/logicnode/input_array_vector.py
Normal file
27
blender/arm/logicnode/input_array_vector.py
Normal file
|
@ -0,0 +1,27 @@
|
|||
import bpy
|
||||
from bpy.props import *
|
||||
from bpy.types import Node, NodeSocket
|
||||
from arm.logicnode.arm_nodes import *
|
||||
|
||||
class VectorArrayNode(Node, ArmLogicTreeNode):
|
||||
'''Vector array node'''
|
||||
bl_idname = 'LNArrayVectorNode'
|
||||
bl_label = 'Array (Vector)'
|
||||
bl_icon = 'GAME'
|
||||
|
||||
def __init__(self):
|
||||
array_nodes[str(id(self))] = self
|
||||
|
||||
def init(self, context):
|
||||
self.outputs.new('NodeSocketShader', 'Array')
|
||||
self.outputs.new('NodeSocketInt', 'Length')
|
||||
|
||||
def draw_buttons(self, context, layout):
|
||||
row = layout.row(align=True)
|
||||
|
||||
op = row.operator('arm.node_add_input', text='New', icon='PLUS', emboss=True)
|
||||
op.node_index = str(id(self))
|
||||
op.socket_type = 'NodeSocketVector'
|
||||
op2 = row.operator('arm.node_remove_input', text='', icon='X', emboss=True)
|
||||
|
||||
add_node(VectorArrayNode, category='Input')
|
|
@ -10,7 +10,7 @@ class BooleanNode(Node, ArmLogicTreeNode):
|
|||
bl_icon = 'CURVE_PATH'
|
||||
|
||||
def init(self, context):
|
||||
self.inputs.new('NodeSocketBool', "Value")
|
||||
self.outputs.new('NodeSocketBool', "Bool")
|
||||
self.inputs.new('NodeSocketBool', 'Value')
|
||||
self.outputs.new('NodeSocketBool', 'Bool')
|
||||
|
||||
add_node(BooleanNode, category='Variable')
|
||||
add_node(BooleanNode, category='Input')
|
|
@ -10,8 +10,8 @@ class ColorNode(Node, ArmLogicTreeNode):
|
|||
bl_icon = 'CURVE_PATH'
|
||||
|
||||
def init(self, context):
|
||||
self.inputs.new('NodeSocketColor', "Color")
|
||||
self.inputs.new('NodeSocketColor', 'Color')
|
||||
self.inputs[-1].default_value = [0.8, 0.8, 0.8, 1.0]
|
||||
self.outputs.new('NodeSocketColor', "Color")
|
||||
self.outputs.new('NodeSocketColor', 'Color')
|
||||
|
||||
add_node(ColorNode, category='Variable')
|
||||
add_node(ColorNode, category='Input')
|
|
@ -10,7 +10,7 @@ class FloatNode(Node, ArmLogicTreeNode):
|
|||
bl_icon = 'CURVE_PATH'
|
||||
|
||||
def init(self, context):
|
||||
self.inputs.new('NodeSocketFloat', "Value")
|
||||
self.outputs.new('NodeSocketFloat', "Float")
|
||||
self.inputs.new('NodeSocketFloat', 'Value')
|
||||
self.outputs.new('NodeSocketFloat', 'Float')
|
||||
|
||||
add_node(FloatNode, category='Variable')
|
||||
add_node(FloatNode, category='Input')
|
|
@ -10,7 +10,7 @@ class IntegerNode(Node, ArmLogicTreeNode):
|
|||
bl_icon = 'CURVE_PATH'
|
||||
|
||||
def init(self, context):
|
||||
self.inputs.new('NodeSocketInt', "Value")
|
||||
self.outputs.new('NodeSocketInt', "Int")
|
||||
self.inputs.new('NodeSocketInt', 'Value')
|
||||
self.outputs.new('NodeSocketInt', 'Int')
|
||||
|
||||
add_node(IntegerNode, category='Variable')
|
||||
add_node(IntegerNode, category='Input')
|
|
@ -8,12 +8,9 @@ class ObjectNode(Node, ArmLogicTreeNode):
|
|||
bl_idname = 'LNObjectNode'
|
||||
bl_label = 'Object'
|
||||
bl_icon = 'GAME'
|
||||
property0 = StringProperty(name = "Object", default="")
|
||||
|
||||
def init(self, context):
|
||||
self.outputs.new('NodeSocketShader', "Object")
|
||||
self.inputs.new('ArmNodeSocketObject', 'Object')
|
||||
self.outputs.new('ArmNodeSocketObject', 'Object')
|
||||
|
||||
def draw_buttons(self, context, layout):
|
||||
layout.prop_search(self, "property0", context.scene, "objects", text = "")
|
||||
|
||||
add_node(ObjectNode, category='Variable')
|
||||
add_node(ObjectNode, category='Input')
|
|
@ -10,7 +10,7 @@ class StringNode(Node, ArmLogicTreeNode):
|
|||
bl_icon = 'CURVE_PATH'
|
||||
|
||||
def init(self, context):
|
||||
self.inputs.new('NodeSocketString', "Value")
|
||||
self.outputs.new('NodeSocketString', "String")
|
||||
self.inputs.new('NodeSocketString', 'Value')
|
||||
self.outputs.new('NodeSocketString', 'String')
|
||||
|
||||
add_node(StringNode, category='Variable')
|
||||
add_node(StringNode, category='Input')
|
|
@ -10,10 +10,10 @@ class TransformNode(Node, ArmLogicTreeNode):
|
|||
bl_icon = 'SOUND'
|
||||
|
||||
def init(self, context):
|
||||
self.inputs.new('NodeSocketVector', "Location")
|
||||
self.inputs.new('NodeSocketVector', "Rotation")
|
||||
self.inputs.new('NodeSocketVector', "Scale")
|
||||
self.inputs.new('NodeSocketVector', 'Location')
|
||||
self.inputs.new('NodeSocketVector', 'Rotation')
|
||||
self.inputs.new('NodeSocketVector', 'Scale')
|
||||
self.inputs[-1].default_value = [1.0, 1.0, 1.0]
|
||||
self.outputs.new('NodeSocketShader', "Transform")
|
||||
self.outputs.new('NodeSocketShader', 'Transform')
|
||||
|
||||
add_node(TransformNode, category='Variable')
|
||||
add_node(TransformNode, category='Input')
|
|
@ -10,10 +10,10 @@ class VectorNode(Node, ArmLogicTreeNode):
|
|||
bl_icon = 'CURVE_PATH'
|
||||
|
||||
def init(self, context):
|
||||
self.inputs.new('NodeSocketFloat', "X")
|
||||
self.inputs.new('NodeSocketFloat', "Y")
|
||||
self.inputs.new('NodeSocketFloat', "Z")
|
||||
self.inputs.new('NodeSocketFloat', 'X')
|
||||
self.inputs.new('NodeSocketFloat', 'Y')
|
||||
self.inputs.new('NodeSocketFloat', 'Z')
|
||||
|
||||
self.outputs.new('NodeSocketVector', "Vector")
|
||||
self.outputs.new('NodeSocketVector', 'Vector')
|
||||
|
||||
add_node(VectorNode, category='Variable')
|
||||
add_node(VectorNode, category='Input')
|
|
@ -10,10 +10,10 @@ class ArrayLoopNode(Node, ArmLogicTreeNode):
|
|||
bl_icon = 'CURVE_PATH'
|
||||
|
||||
def init(self, context):
|
||||
self.inputs.new('NodeSocketShader', 'In')
|
||||
self.inputs.new('ArmNodeSocketOperator', 'In')
|
||||
self.inputs.new('NodeSocketShader', 'Array')
|
||||
self.outputs.new('NodeSocketShader', 'Loop')
|
||||
self.outputs.new('ArmNodeSocketOperator', 'Loop')
|
||||
self.outputs.new('NodeSocketInt', 'Value')
|
||||
self.outputs.new('NodeSocketShader', 'Done')
|
||||
self.outputs.new('ArmNodeSocketOperator', 'Done')
|
||||
|
||||
add_node(ArrayLoopNode, category='Logic')
|
||||
|
|
|
@ -10,9 +10,9 @@ class BranchNode(Node, ArmLogicTreeNode):
|
|||
bl_icon = 'CURVE_PATH'
|
||||
|
||||
def init(self, context):
|
||||
self.inputs.new('NodeSocketShader', "In")
|
||||
self.inputs.new('NodeSocketBool', "Bool")
|
||||
self.outputs.new('NodeSocketShader', "True")
|
||||
self.outputs.new('NodeSocketShader', "False")
|
||||
self.inputs.new('ArmNodeSocketOperator', 'In')
|
||||
self.inputs.new('NodeSocketBool', 'Bool')
|
||||
self.outputs.new('ArmNodeSocketOperator', 'True')
|
||||
self.outputs.new('ArmNodeSocketOperator', 'False')
|
||||
|
||||
add_node(BranchNode, category='Logic')
|
||||
|
|
|
@ -15,15 +15,15 @@ class GateNode(Node, ArmLogicTreeNode):
|
|||
('Greater Equal', 'Greater Equal', 'Greater Equal'),
|
||||
('Less', 'Less', 'Less'),
|
||||
('Less Equal', 'Less Equal', 'Less Equal')],
|
||||
name="", default='Equal')
|
||||
name='', default='Equal')
|
||||
|
||||
def init(self, context):
|
||||
self.inputs.new('NodeSocketShader', "In")
|
||||
self.inputs.new('NodeSocketShader', "Value")
|
||||
self.inputs.new('NodeSocketShader', "Value")
|
||||
self.outputs.new('NodeSocketFloat', "Out")
|
||||
self.inputs.new('ArmNodeSocketOperator', 'In')
|
||||
self.inputs.new('NodeSocketShader', 'Value')
|
||||
self.inputs.new('NodeSocketShader', 'Value')
|
||||
self.outputs.new('ArmNodeSocketOperator', 'Out')
|
||||
|
||||
def draw_buttons(self, context, layout):
|
||||
layout.prop(self, "property0")
|
||||
layout.prop(self, 'property0')
|
||||
|
||||
add_node(GateNode, category='Logic')
|
||||
|
|
|
@ -10,11 +10,11 @@ class LoopNode(Node, ArmLogicTreeNode):
|
|||
bl_icon = 'CURVE_PATH'
|
||||
|
||||
def init(self, context):
|
||||
self.inputs.new('NodeSocketShader', 'In')
|
||||
self.inputs.new('ArmNodeSocketOperator', 'In')
|
||||
self.inputs.new('NodeSocketInt', 'From')
|
||||
self.inputs.new('NodeSocketInt', 'To')
|
||||
self.outputs.new('NodeSocketShader', 'Loop')
|
||||
self.outputs.new('ArmNodeSocketOperator', 'Loop')
|
||||
self.outputs.new('NodeSocketInt', 'Index')
|
||||
self.outputs.new('NodeSocketShader', 'Done')
|
||||
self.outputs.new('ArmNodeSocketOperator', 'Done')
|
||||
|
||||
add_node(LoopNode, category='Logic')
|
||||
|
|
|
@ -10,9 +10,9 @@ class WhileNode(Node, ArmLogicTreeNode):
|
|||
bl_icon = 'CURVE_PATH'
|
||||
|
||||
def init(self, context):
|
||||
self.inputs.new('NodeSocketShader', 'In')
|
||||
self.inputs.new('ArmNodeSocketOperator', 'In')
|
||||
self.inputs.new('NodeSocketBool', 'Condition')
|
||||
self.outputs.new('NodeSocketShader', 'Loop')
|
||||
self.outputs.new('NodeSocketShader', 'Done')
|
||||
self.outputs.new('ArmNodeSocketOperator', 'Loop')
|
||||
self.outputs.new('ArmNodeSocketOperator', 'Done')
|
||||
|
||||
add_node(WhileNode, category='Logic')
|
||||
|
|
|
@ -10,10 +10,10 @@ class CallFunctionNode(Node, ArmLogicTreeNode):
|
|||
bl_icon = 'GAME'
|
||||
|
||||
def init(self, context):
|
||||
self.inputs.new('NodeSocketShader', 'In')
|
||||
self.inputs.new('NodeSocketShader', 'Object')
|
||||
self.inputs.new('ArmNodeSocketOperator', 'In')
|
||||
self.inputs.new('ArmNodeSocketObject', 'Object')
|
||||
self.inputs.new('NodeSocketString', 'Function')
|
||||
self.outputs.new('NodeSocketShader', 'Out')
|
||||
self.outputs.new('ArmNodeSocketOperator', 'Out')
|
||||
self.outputs.new('NodeSocketShader', 'Result')
|
||||
|
||||
add_node(CallFunctionNode, category='Native')
|
||||
|
|
|
@ -10,9 +10,9 @@ class CallStaticFunctionNode(Node, ArmLogicTreeNode):
|
|||
bl_icon = 'GAME'
|
||||
|
||||
def init(self, context):
|
||||
self.inputs.new('NodeSocketShader', 'In')
|
||||
self.inputs.new('ArmNodeSocketOperator', 'In')
|
||||
self.inputs.new('NodeSocketString', 'Function')
|
||||
self.outputs.new('NodeSocketShader', 'Out')
|
||||
self.outputs.new('ArmNodeSocketOperator', 'Out')
|
||||
self.outputs.new('NodeSocketShader', 'Result')
|
||||
|
||||
add_node(CallStaticFunctionNode, category='Native')
|
||||
|
|
22
blender/arm/logicnode/native_expression.py
Normal file
22
blender/arm/logicnode/native_expression.py
Normal file
|
@ -0,0 +1,22 @@
|
|||
import bpy
|
||||
from bpy.props import *
|
||||
from bpy.types import Node, NodeSocket
|
||||
from arm.logicnode.arm_nodes import *
|
||||
|
||||
class ExpressionNode(Node, ArmLogicTreeNode):
|
||||
'''Expression node'''
|
||||
bl_idname = 'LNExpressionNode'
|
||||
bl_label = 'Expression'
|
||||
bl_icon = 'GAME'
|
||||
|
||||
property0 = StringProperty(name='', default='')
|
||||
|
||||
def init(self, context):
|
||||
self.inputs.new('ArmNodeSocketOperator', 'In')
|
||||
self.outputs.new('ArmNodeSocketOperator', 'Out')
|
||||
self.outputs.new('NodeSocketShader', 'Result')
|
||||
|
||||
def draw_buttons(self, context, layout):
|
||||
layout.prop(self, 'property0')
|
||||
|
||||
add_node(ExpressionNode, category='Native')
|
|
@ -10,8 +10,8 @@ class GetPropertyNode(Node, ArmLogicTreeNode):
|
|||
bl_icon = 'GAME'
|
||||
|
||||
def init(self, context):
|
||||
self.inputs.new('NodeSocketShader', "Object")
|
||||
self.inputs.new('NodeSocketString', "Property")
|
||||
self.outputs.new('NodeSocketShader', "Value")
|
||||
self.inputs.new('ArmNodeSocketObject', 'Object')
|
||||
self.inputs.new('NodeSocketString', 'Property')
|
||||
self.outputs.new('NodeSocketShader', 'Value')
|
||||
|
||||
add_node(GetPropertyNode, category='Native')
|
||||
|
|
26
blender/arm/logicnode/native_script.py
Normal file
26
blender/arm/logicnode/native_script.py
Normal file
|
@ -0,0 +1,26 @@
|
|||
import bpy
|
||||
from bpy.props import *
|
||||
from bpy.types import Node, NodeSocket
|
||||
from arm.logicnode.arm_nodes import *
|
||||
|
||||
class ScriptNode(Node, ArmLogicTreeNode):
|
||||
'''Script node'''
|
||||
bl_idname = 'LNScriptNode'
|
||||
bl_label = 'Script'
|
||||
bl_icon = 'GAME'
|
||||
|
||||
@property
|
||||
def property0(self):
|
||||
return bpy.data.texts[self.property0_].as_string()
|
||||
|
||||
property0_ = StringProperty(name='Text', default='')
|
||||
|
||||
def init(self, context):
|
||||
self.inputs.new('ArmNodeSocketOperator', 'In')
|
||||
self.outputs.new('ArmNodeSocketOperator', 'Out')
|
||||
self.outputs.new('NodeSocketShader', 'Result')
|
||||
|
||||
def draw_buttons(self, context, layout):
|
||||
layout.prop_search(self, 'property0_', bpy.data, 'texts', icon='NONE', text='')
|
||||
|
||||
add_node(ScriptNode, category='Native')
|
|
@ -10,10 +10,10 @@ class SetPropertyNode(Node, ArmLogicTreeNode):
|
|||
bl_icon = 'GAME'
|
||||
|
||||
def init(self, context):
|
||||
self.inputs.new('NodeSocketShader', "In")
|
||||
self.inputs.new('NodeSocketShader', "Object")
|
||||
self.inputs.new('NodeSocketString', "Property")
|
||||
self.inputs.new('NodeSocketShader', "Value")
|
||||
self.outputs.new('NodeSocketShader', "Out")
|
||||
self.inputs.new('ArmNodeSocketOperator', 'In')
|
||||
self.inputs.new('ArmNodeSocketObject', 'Object')
|
||||
self.inputs.new('NodeSocketString', 'Property')
|
||||
self.inputs.new('NodeSocketShader', 'Value')
|
||||
self.outputs.new('ArmNodeSocketOperator', 'Out')
|
||||
|
||||
add_node(SetPropertyNode, category='Native')
|
||||
|
|
|
@ -10,9 +10,9 @@ class GoToLocationNode(Node, ArmLogicTreeNode):
|
|||
bl_icon = 'GAME'
|
||||
|
||||
def init(self, context):
|
||||
self.inputs.new('NodeSocketShader', "In")
|
||||
self.inputs.new('NodeSocketShader', "Object")
|
||||
self.inputs.new('NodeSocketShader', "Location")
|
||||
self.outputs.new('NodeSocketShader', "Out")
|
||||
self.inputs.new('ArmNodeSocketOperator', 'In')
|
||||
self.inputs.new('ArmNodeSocketObject', 'Object')
|
||||
self.inputs.new('NodeSocketShader', 'Location')
|
||||
self.outputs.new('ArmNodeSocketOperator', 'Out')
|
||||
|
||||
add_node(GoToLocationNode, category='Navmesh')
|
||||
|
|
|
@ -10,6 +10,6 @@ class NavigableLocationNode(Node, ArmLogicTreeNode):
|
|||
bl_icon = 'GAME'
|
||||
|
||||
def init(self, context):
|
||||
self.outputs.new('NodeSocketShader', "Location")
|
||||
self.outputs.new('NodeSocketShader', 'Location')
|
||||
|
||||
add_node(NavigableLocationNode, category='Navmesh')
|
||||
|
|
|
@ -10,8 +10,8 @@ class PickLocationNode(Node, ArmLogicTreeNode):
|
|||
bl_icon = 'GAME'
|
||||
|
||||
def init(self, context):
|
||||
self.inputs.new('NodeSocketShader', "Navmesh")
|
||||
self.inputs.new('NodeSocketShader', "Screen Coords")
|
||||
self.outputs.new('NodeSocketShader', "Location")
|
||||
self.inputs.new('ArmNodeSocketObject', 'Navmesh')
|
||||
self.inputs.new('NodeSocketVector', 'Screen Coords')
|
||||
self.outputs.new('NodeSocketVector', 'Location')
|
||||
|
||||
add_node(PickLocationNode, category='Navmesh')
|
||||
|
|
|
@ -10,9 +10,9 @@ class ArrayAddNode(Node, ArmLogicTreeNode):
|
|||
bl_icon = 'GAME'
|
||||
|
||||
def init(self, context):
|
||||
self.inputs.new('NodeSocketShader', "In")
|
||||
self.inputs.new('NodeSocketShader', "Array")
|
||||
self.inputs.new('NodeSocketShader', "Value")
|
||||
self.outputs.new('NodeSocketShader', "Out")
|
||||
self.inputs.new('ArmNodeSocketOperator', 'In')
|
||||
self.inputs.new('NodeSocketShader', 'Array')
|
||||
self.inputs.new('NodeSocketShader', 'Value')
|
||||
self.outputs.new('ArmNodeSocketOperator', 'Out')
|
||||
|
||||
add_node(ArrayAddNode, category='Operator')
|
||||
|
|
|
@ -10,8 +10,8 @@ class ArrayGetNode(Node, ArmLogicTreeNode):
|
|||
bl_icon = 'GAME'
|
||||
|
||||
def init(self, context):
|
||||
self.inputs.new('NodeSocketShader', "Array")
|
||||
self.inputs.new('NodeSocketInt', "Index")
|
||||
self.outputs.new('NodeSocketShader', "Value")
|
||||
self.inputs.new('NodeSocketShader', 'Array')
|
||||
self.inputs.new('NodeSocketInt', 'Index')
|
||||
self.outputs.new('NodeSocketShader', 'Value')
|
||||
|
||||
add_node(ArrayGetNode, category='Operator')
|
||||
|
|
|
@ -10,9 +10,9 @@ class ArrayRemoveNode(Node, ArmLogicTreeNode):
|
|||
bl_icon = 'GAME'
|
||||
|
||||
def init(self, context):
|
||||
self.inputs.new('NodeSocketShader', "In")
|
||||
self.inputs.new('NodeSocketShader', "Array")
|
||||
self.inputs.new('NodeSocketInt', "Index")
|
||||
self.outputs.new('NodeSocketShader', "Out")
|
||||
self.inputs.new('ArmNodeSocketOperator', 'In')
|
||||
self.inputs.new('NodeSocketShader', 'Array')
|
||||
self.inputs.new('NodeSocketInt', 'Index')
|
||||
self.outputs.new('ArmNodeSocketOperator', 'Out')
|
||||
|
||||
add_node(ArrayRemoveNode, category='Operator')
|
||||
|
|
|
@ -10,10 +10,10 @@ class ArraySetNode(Node, ArmLogicTreeNode):
|
|||
bl_icon = 'GAME'
|
||||
|
||||
def init(self, context):
|
||||
self.inputs.new('NodeSocketShader', "In")
|
||||
self.inputs.new('ArmNodeSocketOperator', "In")
|
||||
self.inputs.new('NodeSocketShader', "Array")
|
||||
self.inputs.new('NodeSocketInt', "Index")
|
||||
self.inputs.new('NodeSocketShader', "Value")
|
||||
self.outputs.new('NodeSocketShader', "Out")
|
||||
self.outputs.new('ArmNodeSocketOperator', "Out")
|
||||
|
||||
add_node(ArraySetNode, category='Operator')
|
||||
|
|
26
blender/arm/logicnode/operator_call_group.py
Normal file
26
blender/arm/logicnode/operator_call_group.py
Normal file
|
@ -0,0 +1,26 @@
|
|||
import bpy
|
||||
from bpy.props import *
|
||||
from bpy.types import Node, NodeSocket
|
||||
from arm.logicnode.arm_nodes import *
|
||||
import arm.utils
|
||||
|
||||
class CallGroupNode(Node, ArmLogicTreeNode):
|
||||
'''Call group node'''
|
||||
bl_idname = 'LNCallGroupNode'
|
||||
bl_label = 'Call Group'
|
||||
bl_icon = 'GAME'
|
||||
|
||||
@property
|
||||
def property0(self):
|
||||
return bpy.data.worlds['Arm'].arm_project_package + '.node.' + arm.utils.safe_source_name(self.property0_)
|
||||
|
||||
property0_ = StringProperty(name='Group', default='')
|
||||
|
||||
def init(self, context):
|
||||
self.inputs.new('ArmNodeSocketOperator', 'In')
|
||||
self.outputs.new('ArmNodeSocketOperator', 'Out')
|
||||
|
||||
def draw_buttons(self, context, layout):
|
||||
layout.prop_search(self, 'property0_', bpy.data, 'node_groups', icon='NONE', text='')
|
||||
|
||||
add_node(CallGroupNode, category='Operator')
|
15
blender/arm/logicnode/operator_group_output.py
Normal file
15
blender/arm/logicnode/operator_group_output.py
Normal file
|
@ -0,0 +1,15 @@
|
|||
import bpy
|
||||
from bpy.props import *
|
||||
from bpy.types import Node, NodeSocket
|
||||
from arm.logicnode.arm_nodes import *
|
||||
|
||||
class GroupOutputNode(Node, ArmLogicTreeNode):
|
||||
'''Group output node'''
|
||||
bl_idname = 'LNGroupOutputNode'
|
||||
bl_label = 'Group Output'
|
||||
bl_icon = 'GAME'
|
||||
|
||||
def init(self, context):
|
||||
self.inputs.new('ArmNodeSocketOperator', 'In')
|
||||
|
||||
add_node(GroupOutputNode, category='Operator')
|
|
@ -10,8 +10,8 @@ class PrintNode(Node, ArmLogicTreeNode):
|
|||
bl_icon = 'GAME'
|
||||
|
||||
def init(self, context):
|
||||
self.inputs.new('NodeSocketShader', "In")
|
||||
self.inputs.new('NodeSocketShader', "Value")
|
||||
self.outputs.new('NodeSocketShader', "Out")
|
||||
self.inputs.new('ArmNodeSocketOperator', 'In')
|
||||
self.inputs.new('NodeSocketShader', 'Value')
|
||||
self.outputs.new('ArmNodeSocketOperator', 'Out')
|
||||
|
||||
add_node(PrintNode, category='Operator')
|
||||
|
|
|
@ -10,8 +10,8 @@ class RemoveObjectNode(Node, ArmLogicTreeNode):
|
|||
bl_icon = 'GAME'
|
||||
|
||||
def init(self, context):
|
||||
self.inputs.new('NodeSocketShader', "In")
|
||||
self.inputs.new('NodeSocketShader', "Object")
|
||||
self.outputs.new('NodeSocketShader', "Out")
|
||||
self.inputs.new('ArmNodeSocketOperator', 'In')
|
||||
self.inputs.new('ArmNodeSocketObject', 'Object')
|
||||
self.outputs.new('ArmNodeSocketOperator', 'Out')
|
||||
|
||||
add_node(RemoveObjectNode, category='Operator')
|
||||
|
|
|
@ -10,9 +10,9 @@ class SetNameNode(Node, ArmLogicTreeNode):
|
|||
bl_icon = 'GAME'
|
||||
|
||||
def init(self, context):
|
||||
self.inputs.new('NodeSocketShader', "In")
|
||||
self.inputs.new('NodeSocketShader', "Object")
|
||||
self.inputs.new('NodeSocketString', "Name")
|
||||
self.outputs.new('NodeSocketShader', "Out")
|
||||
self.inputs.new('ArmNodeSocketOperator', 'In')
|
||||
self.inputs.new('ArmNodeSocketObject', 'Object')
|
||||
self.inputs.new('NodeSocketString', 'Name')
|
||||
self.outputs.new('ArmNodeSocketOperator', 'Out')
|
||||
|
||||
add_node(SetNameNode, category='Operator')
|
||||
|
|
|
@ -10,9 +10,9 @@ class SetTransformNode(Node, ArmLogicTreeNode):
|
|||
bl_icon = 'GAME'
|
||||
|
||||
def init(self, context):
|
||||
self.inputs.new('NodeSocketShader', "In")
|
||||
self.inputs.new('NodeSocketShader', "Object")
|
||||
self.inputs.new('NodeSocketShader', "Transform")
|
||||
self.outputs.new('NodeSocketShader', "Out")
|
||||
self.inputs.new('ArmNodeSocketOperator', 'In')
|
||||
self.inputs.new('ArmNodeSocketObject', 'Object')
|
||||
self.inputs.new('NodeSocketShader', 'Transform')
|
||||
self.outputs.new('ArmNodeSocketOperator', 'Out')
|
||||
|
||||
add_node(SetTransformNode, category='Operator')
|
||||
|
|
|
@ -10,9 +10,9 @@ class SetVariableNode(Node, ArmLogicTreeNode):
|
|||
bl_icon = 'GAME'
|
||||
|
||||
def init(self, context):
|
||||
self.inputs.new('NodeSocketShader', "In")
|
||||
self.inputs.new('NodeSocketShader', "Variable")
|
||||
self.inputs.new('NodeSocketShader', "Value")
|
||||
self.outputs.new('NodeSocketShader', "Out")
|
||||
self.inputs.new('ArmNodeSocketOperator', 'In')
|
||||
self.inputs.new('NodeSocketShader', 'Variable')
|
||||
self.inputs.new('NodeSocketShader', 'Value')
|
||||
self.outputs.new('ArmNodeSocketOperator', 'Out')
|
||||
|
||||
add_node(SetVariableNode, category='Operator')
|
||||
|
|
|
@ -10,9 +10,9 @@ class SetVisibleNode(Node, ArmLogicTreeNode):
|
|||
bl_icon = 'GAME'
|
||||
|
||||
def init(self, context):
|
||||
self.inputs.new('NodeSocketShader', "In")
|
||||
self.inputs.new('NodeSocketShader', "Object")
|
||||
self.inputs.new('NodeSocketBool', "Bool")
|
||||
self.outputs.new('NodeSocketShader', "Out")
|
||||
self.inputs.new('ArmNodeSocketOperator', 'In')
|
||||
self.inputs.new('ArmNodeSocketObject', 'Object')
|
||||
self.inputs.new('NodeSocketBool', 'Bool')
|
||||
self.outputs.new('ArmNodeSocketOperator', 'Out')
|
||||
|
||||
add_node(SetVisibleNode, category='Operator')
|
||||
|
|
|
@ -10,8 +10,8 @@ class SleepNode(Node, ArmLogicTreeNode):
|
|||
bl_icon = 'GAME'
|
||||
|
||||
def init(self, context):
|
||||
self.inputs.new('NodeSocketShader', "In")
|
||||
self.inputs.new('NodeSocketFloat', "Time")
|
||||
self.outputs.new('NodeSocketShader', "Out")
|
||||
self.inputs.new('ArmNodeSocketOperator', 'In')
|
||||
self.inputs.new('NodeSocketFloat', 'Time')
|
||||
self.outputs.new('ArmNodeSocketOperator', 'Out')
|
||||
|
||||
add_node(SleepNode, category='Operator')
|
||||
|
|
|
@ -10,10 +10,10 @@ class SpawnObjectNode(Node, ArmLogicTreeNode):
|
|||
bl_icon = 'GAME'
|
||||
|
||||
def init(self, context):
|
||||
self.inputs.new('NodeSocketShader', "In")
|
||||
self.inputs.new('NodeSocketShader', "Object")
|
||||
self.inputs.new('NodeSocketShader', "Tansform")
|
||||
self.outputs.new('NodeSocketShader', "Out")
|
||||
self.outputs.new('NodeSocketShader', "Object")
|
||||
self.inputs.new('ArmNodeSocketOperator', 'In')
|
||||
self.inputs.new('ArmNodeSocketObject', 'Object')
|
||||
self.inputs.new('NodeSocketShader', 'Tansform')
|
||||
self.outputs.new('ArmNodeSocketOperator', 'Out')
|
||||
self.outputs.new('ArmNodeSocketObject', 'Object')
|
||||
|
||||
add_node(SpawnObjectNode, category='Operator')
|
||||
|
|
|
@ -10,9 +10,9 @@ class ApplyImpulseNode(Node, ArmLogicTreeNode):
|
|||
bl_icon = 'GAME'
|
||||
|
||||
def init(self, context):
|
||||
self.inputs.new('NodeSocketShader', "In")
|
||||
self.inputs.new('NodeSocketShader', "Object")
|
||||
self.inputs.new('NodeSocketVector', "Impulse")
|
||||
self.outputs.new('NodeSocketShader', "Out")
|
||||
self.inputs.new('ArmNodeSocketOperator', 'In')
|
||||
self.inputs.new('ArmNodeSocketObject', 'Object')
|
||||
self.inputs.new('NodeSocketVector', 'Impulse')
|
||||
self.outputs.new('ArmNodeSocketOperator', 'Out')
|
||||
|
||||
add_node(ApplyImpulseNode, category='Physics')
|
||||
|
|
|
@ -10,7 +10,7 @@ class GetContactsNode(Node, ArmLogicTreeNode):
|
|||
bl_icon = 'GAME'
|
||||
|
||||
def init(self, context):
|
||||
self.inputs.new('NodeSocketShader', "Object")
|
||||
self.outputs.new('NodeSocketShader', "Array")
|
||||
self.inputs.new('ArmNodeSocketObject', 'Object')
|
||||
self.outputs.new('NodeSocketShader', 'Array')
|
||||
|
||||
add_node(GetContactsNode, category='Physics')
|
||||
|
|
|
@ -10,7 +10,7 @@ class GetFirstContactNode(Node, ArmLogicTreeNode):
|
|||
bl_icon = 'GAME'
|
||||
|
||||
def init(self, context):
|
||||
self.inputs.new('NodeSocketShader', "Object")
|
||||
self.outputs.new('NodeSocketShader', "Object")
|
||||
self.inputs.new('ArmNodeSocketObject', 'Object')
|
||||
self.outputs.new('ArmNodeSocketObject', 'Object')
|
||||
|
||||
add_node(GetFirstContactNode, category='Physics')
|
||||
|
|
17
blender/arm/logicnode/physics_has_contact.py
Normal file
17
blender/arm/logicnode/physics_has_contact.py
Normal file
|
@ -0,0 +1,17 @@
|
|||
import bpy
|
||||
from bpy.props import *
|
||||
from bpy.types import Node, NodeSocket
|
||||
from arm.logicnode.arm_nodes import *
|
||||
|
||||
class HasContactNode(Node, ArmLogicTreeNode):
|
||||
'''Has contact node'''
|
||||
bl_idname = 'LNHasContactNode'
|
||||
bl_label = 'Has Contact'
|
||||
bl_icon = 'GAME'
|
||||
|
||||
def init(self, context):
|
||||
self.inputs.new('ArmNodeSocketObject', 'Object 1')
|
||||
self.inputs.new('ArmNodeSocketObject', 'Object 2')
|
||||
self.outputs.new('NodeSocketBool', 'Bool')
|
||||
|
||||
add_node(HasContactNode, category='Physics')
|
25
blender/arm/logicnode/physics_on_contact.py
Normal file
25
blender/arm/logicnode/physics_on_contact.py
Normal file
|
@ -0,0 +1,25 @@
|
|||
import bpy
|
||||
from bpy.props import *
|
||||
from bpy.types import Node, NodeSocket
|
||||
from arm.logicnode.arm_nodes import *
|
||||
|
||||
class OnContactNode(Node, ArmLogicTreeNode):
|
||||
'''On contact node'''
|
||||
bl_idname = 'LNOnContactNode'
|
||||
bl_label = 'On Contact'
|
||||
bl_icon = 'GAME'
|
||||
property0 = EnumProperty(
|
||||
items = [('Begin', 'Begin', 'Begin'),
|
||||
('End', 'End', 'End'),
|
||||
('Overlap', 'Overlap', 'Overlap')],
|
||||
name='', default='Begin')
|
||||
|
||||
def init(self, context):
|
||||
self.inputs.new('ArmNodeSocketObject', 'Object 1')
|
||||
self.inputs.new('ArmNodeSocketObject', 'Object 2')
|
||||
self.outputs.new('ArmNodeSocketOperator', 'Out')
|
||||
|
||||
def draw_buttons(self, context, layout):
|
||||
layout.prop(self, 'property0')
|
||||
|
||||
add_node(OnContactNode, category='Physics')
|
|
@ -10,7 +10,7 @@ class PickObjectNode(Node, ArmLogicTreeNode):
|
|||
bl_icon = 'GAME'
|
||||
|
||||
def init(self, context):
|
||||
self.inputs.new('NodeSocketShader', "Screen Coords")
|
||||
self.outputs.new('NodeSocketShader', "Object")
|
||||
self.inputs.new('NodeSocketVector', 'Screen Coords')
|
||||
self.outputs.new('ArmNodeSocketObject', 'Object')
|
||||
|
||||
add_node(PickObjectNode, category='Physics')
|
||||
|
|
Some files were not shown because too many files have changed in this diff Show more
Loading…
Reference in a new issue