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
|
#if arm_physics
|
||||||
var physics = armory.trait.physics.PhysicsWorld.active;
|
var physics = armory.trait.physics.PhysicsWorld.active;
|
||||||
var rb1 = object1.getTrait(RigidBody);
|
var rb1 = object1.getTrait(RigidBody);
|
||||||
if (rb1 != null) {
|
var rbs = physics.getContacts(rb1);
|
||||||
|
if (rb1 != null && rbs != null) {
|
||||||
var rb2 = object2.getTrait(RigidBody);
|
var rb2 = object2.getTrait(RigidBody);
|
||||||
var rbs = physics.getContacts(rb1);
|
for (rb in rbs) {
|
||||||
if (rbs != null) {
|
if (rb == rb2) {
|
||||||
for (rb in rbs) {
|
contact = true;
|
||||||
if (rb == rb2) {
|
break;
|
||||||
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