Add On Contact (Array) node
This commit is contained in:
parent
13bb02e337
commit
c7f9d50e55
58
Sources/armory/logicnode/OnContactArrayNode.hx
Normal file
58
Sources/armory/logicnode/OnContactArrayNode.hx
Normal 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);
|
||||
}
|
||||
}
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
25
blender/arm/logicnode/physics_on_contact_array.py
Normal file
25
blender/arm/logicnode/physics_on_contact_array.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 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')
|
Loading…
Reference in a new issue