From c7f9d50e55ee339ff61ec8111fb503fda08cec7c Mon Sep 17 00:00:00 2001 From: luboslenco Date: Fri, 7 Dec 2018 13:48:28 +0100 Subject: [PATCH] Add On Contact (Array) node --- .../armory/logicnode/OnContactArrayNode.hx | 58 +++++++++++++++++++ Sources/armory/logicnode/OnContactNode.hx | 14 ++--- .../arm/logicnode/physics_on_contact_array.py | 25 ++++++++ 3 files changed, 89 insertions(+), 8 deletions(-) create mode 100644 Sources/armory/logicnode/OnContactArrayNode.hx create mode 100644 blender/arm/logicnode/physics_on_contact_array.py diff --git a/Sources/armory/logicnode/OnContactArrayNode.hx b/Sources/armory/logicnode/OnContactArrayNode.hx new file mode 100644 index 00000000..33084a3d --- /dev/null +++ b/Sources/armory/logicnode/OnContactArrayNode.hx @@ -0,0 +1,58 @@ +package armory.logicnode; + +import iron.object.Object; +import armory.trait.physics.RigidBody; + +class OnContactArrayNode extends LogicNode { + + 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 objects:Array = inputs[1].get(); + + if (object1 == null) object1 = tree.object; + if (objects == null)return; + + var contact = false; + +#if arm_physics + var physics = armory.trait.physics.PhysicsWorld.active; + var rb1 = object1.getTrait(RigidBody); + var rbs = physics.getContacts(rb1); + if (rb1 != null && rbs != null) { + for (object2 in objects) { + var rb2 = object2.getTrait(RigidBody); + for (rb in rbs) { + if (rb == rb2) { + contact = true; + break; + } + } + if (contact) 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) runOutput(0); + } +} diff --git a/Sources/armory/logicnode/OnContactNode.hx b/Sources/armory/logicnode/OnContactNode.hx index 8e7b69dc..f944b61a 100644 --- a/Sources/armory/logicnode/OnContactNode.hx +++ b/Sources/armory/logicnode/OnContactNode.hx @@ -26,15 +26,13 @@ class OnContactNode extends LogicNode { #if arm_physics var physics = armory.trait.physics.PhysicsWorld.active; var rb1 = object1.getTrait(RigidBody); - if (rb1 != null) { + var rbs = physics.getContacts(rb1); + if (rb1 != null && rbs != null) { var rb2 = object2.getTrait(RigidBody); - var rbs = physics.getContacts(rb1); - if (rbs != null) { - for (rb in rbs) { - if (rb == rb2) { - contact = true; - break; - } + for (rb in rbs) { + if (rb == rb2) { + contact = true; + break; } } } diff --git a/blender/arm/logicnode/physics_on_contact_array.py b/blender/arm/logicnode/physics_on_contact_array.py new file mode 100644 index 00000000..5910ceef --- /dev/null +++ b/blender/arm/logicnode/physics_on_contact_array.py @@ -0,0 +1,25 @@ +import bpy +from bpy.props import * +from bpy.types import Node, NodeSocket +from arm.logicnode.arm_nodes import * + +class OnContactArrayNode(Node, ArmLogicTreeNode): + '''On contact array node''' + bl_idname = 'LNOnContactArrayNode' + bl_label = 'On Contact (Array)' + 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('ArmNodeSocketArray', 'Objects') + self.outputs.new('ArmNodeSocketAction', 'Out') + + def draw_buttons(self, context, layout): + layout.prop(self, 'property0') + +add_node(OnContactArrayNode, category='Physics')