Logic nodes round 3

This commit is contained in:
Lubos Lenco 2017-04-08 00:34:45 +02:00
parent ac7bfb1b8e
commit 3478cf22e4
132 changed files with 1770 additions and 178 deletions

View 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; }
}

View 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; }
}

View 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;
}
}

View file

@ -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

View 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;
}
}

View 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;
}
}

View 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;
}
}

View 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;
}
}

View file

@ -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;
}

View 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;
}
}

View 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;
}
}

View 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;
}
}

View 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);
}
}

View 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;
}
}

View 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);
}
}

View 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);
}
}

View file

@ -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;
}
}

View 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;
}
}

View file

@ -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;
}
}

View file

@ -2,6 +2,7 @@ package armory.logicnode;
import armory.trait.internal.Navigation;
import armory.object.Object;
import armory.math.Vec4;
class GoToLocationNode extends Node {

View file

@ -0,0 +1,13 @@
package armory.logicnode;
class GroupOutputNode extends Node {
public function new(tree:LogicTree) {
super(tree);
}
override function run() {
super.run();
}
}

View 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;
}
}

View file

@ -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;
}
}

View file

@ -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;

View file

@ -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;
}
}

View 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();
}
}

View 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();
}
}
}

View 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();
}
}

View 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();
}
}

View 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);
}
}

View 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();
}
}

View 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;
}
}

View 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;
}
}

View 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));
}
}

View 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);
}
}

View 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;
}
}

View 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;
}
}

View 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;
}
}

View 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();
}
}

View 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;
}
}

View file

@ -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

View 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')

View 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')

View 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')

View file

@ -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)

View file

@ -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')

View file

@ -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')

View 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')

View file

@ -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')

View 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')

View 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')

View 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')

View 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')

View 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')

View 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')

View 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')

View 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')

View 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')

View file

@ -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')

View file

@ -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')

View file

@ -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')

View file

@ -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')

View file

@ -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')

View file

@ -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')

View file

@ -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')

View file

@ -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')

View file

@ -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')

View file

@ -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')

View file

@ -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')

View file

@ -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')

View file

@ -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')

View file

@ -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')

View file

@ -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')

View 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')

View file

@ -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')

View 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')

View file

@ -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')

View file

@ -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')

View file

@ -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')

View file

@ -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')

View file

@ -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')

View file

@ -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')

View file

@ -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')

View file

@ -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')

View 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')

View 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')

View file

@ -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')

View file

@ -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')

View file

@ -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')

View file

@ -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')

View file

@ -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')

View file

@ -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')

View file

@ -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')

View file

@ -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')

View file

@ -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')

View file

@ -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')

View file

@ -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')

View 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')

View 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')

View file

@ -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