Add On Contact (Array) node

This commit is contained in:
luboslenco 2018-12-07 13:48:28 +01:00
parent 13bb02e337
commit c7f9d50e55
3 changed files with 89 additions and 8 deletions

View file

@ -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<Object> = 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);
}
}

View file

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

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