From 0c534ee632b667599cd6c7628b01e0e29525f7f8 Mon Sep 17 00:00:00 2001 From: Onek8 Date: Wed, 1 Oct 2025 01:42:51 +0000 Subject: [PATCH 01/17] Update leenkx/Sources/iron/object/ParticleSystem.hx --- leenkx/Sources/iron/object/ParticleSystem.hx | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/leenkx/Sources/iron/object/ParticleSystem.hx b/leenkx/Sources/iron/object/ParticleSystem.hx index 5fab3a7..bd66660 100644 --- a/leenkx/Sources/iron/object/ParticleSystem.hx +++ b/leenkx/Sources/iron/object/ParticleSystem.hx @@ -71,11 +71,12 @@ class ParticleSystem { Data.getParticle(sceneName, pref.particle, function(b: ParticleData) { data = b; r = data.raw; - if (r.dynamic_emitter != null){ - dynamicEmitter = r.dynamic_emitter; - } else { - dynamicEmitter = true; + var dyn: Null = r.dynamic_emitter; + var dynValue: Bool = true; + if (dyn != null) { + dynValue = dyn; } + dynamicEmitter = dynValue; if (Scene.active.raw.gravity != null) { gx = Scene.active.raw.gravity[0] * r.weight_gravity; gy = Scene.active.raw.gravity[1] * r.weight_gravity; From 5cf33724e454decb8802f533cfda7ddf89e45ebd Mon Sep 17 00:00:00 2001 From: LeenkxTeam Date: Fri, 3 Oct 2025 05:02:28 +0000 Subject: [PATCH 02/17] Update leenkx/Sources/leenkx/trait/physics/bullet/PhysicsWorld.hx --- .../trait/physics/bullet/PhysicsWorld.hx | 32 +++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/leenkx/Sources/leenkx/trait/physics/bullet/PhysicsWorld.hx b/leenkx/Sources/leenkx/trait/physics/bullet/PhysicsWorld.hx index d845a29..214a349 100644 --- a/leenkx/Sources/leenkx/trait/physics/bullet/PhysicsWorld.hx +++ b/leenkx/Sources/leenkx/trait/physics/bullet/PhysicsWorld.hx @@ -7,6 +7,7 @@ import iron.system.Time; import iron.math.Vec4; import iron.math.Quat; import iron.math.RayCaster; +import iron.object.Object; class Hit { @@ -72,6 +73,10 @@ class PhysicsWorld extends Trait { public var convexHitNormalWorld = new Vec4(); var pairCache: Bool = false; + // Performance optimization: Global RigidBody trait cache + public static var rigidBodyCache: Map = new Map(); + public static var cacheObjectRefs: Map = new Map(); // Track trait counts + static var nullvec = true; static var vec1: bullet.Bt.Vector3 = null; static var vec2: bullet.Bt.Vector3 = null; @@ -148,6 +153,33 @@ class PhysicsWorld extends Trait { }); } + + public static function getCachedRigidBody(object: Object): RigidBody { + if (object == null) return null; + + var shouldUpdate = false; + var cachedTraitCount = cacheObjectRefs.get(object); + + if (cachedTraitCount == null || cachedTraitCount != object.traits.length) { + shouldUpdate = true; + } else if (rigidBodyCache.get(object) == null) { + var rb = object.getTrait(RigidBody); + if (rb != null) shouldUpdate = true; + } + + if (shouldUpdate) { + var rb = object.getTrait(RigidBody); + rigidBodyCache.set(object, rb); + cacheObjectRefs.set(object, object.traits.length); + } + + return rigidBodyCache.get(object); + } + + public static inline function hasContactWith(contacts: Array, target: RigidBody): Bool { + return contacts != null && target != null && contacts.indexOf(target) >= 0; + } + public function reset() { for (rb in active.rbMap) removeRigidBody(rb); } From 506a0a02450068975a616fdfc6ba8bff0164506d Mon Sep 17 00:00:00 2001 From: LeenkxTeam Date: Fri, 3 Oct 2025 05:03:29 +0000 Subject: [PATCH 03/17] Add leenkx/Sources/leenkx/logicnode/AnyContactNode.hx --- .../leenkx/logicnode/AnyContactNode.hx | 48 +++++++++++++++++++ 1 file changed, 48 insertions(+) create mode 100644 leenkx/Sources/leenkx/logicnode/AnyContactNode.hx diff --git a/leenkx/Sources/leenkx/logicnode/AnyContactNode.hx b/leenkx/Sources/leenkx/logicnode/AnyContactNode.hx new file mode 100644 index 0000000..97a58b3 --- /dev/null +++ b/leenkx/Sources/leenkx/logicnode/AnyContactNode.hx @@ -0,0 +1,48 @@ +package leenkx.logicnode; + +import iron.object.Object; +import leenkx.trait.physics.RigidBody; + +class AnyContactNode 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(); + if (object1 == null) object1 = tree.object; + if (object1 == null) return; + + var contact = false; + + #if lnx_physics + var rb1 = leenkx.trait.physics.PhysicsWorld.getCachedRigidBody(object1); + if (rb1 != null) { + var physics = leenkx.trait.physics.PhysicsWorld.active; + var rbs = physics.getContacts(rb1); + + contact = (rbs != null && rbs.length > 0); + } + #end + + var shouldTrigger = false; + switch (property0) { + case "begin": + shouldTrigger = contact && !lastContact; + case "overlap": + shouldTrigger = contact; + case "end": + shouldTrigger = !contact && lastContact; + } + + lastContact = contact; + + if (shouldTrigger) runOutput(0); + } +} From c908e6cad258b350d509002e203fdb1b41b66112 Mon Sep 17 00:00:00 2001 From: LeenkxTeam Date: Fri, 3 Oct 2025 05:04:18 +0000 Subject: [PATCH 04/17] Update leenkx/Sources/leenkx/logicnode/OnContactNode.hx --- .../Sources/leenkx/logicnode/OnContactNode.hx | 24 +++++++------------ 1 file changed, 9 insertions(+), 15 deletions(-) diff --git a/leenkx/Sources/leenkx/logicnode/OnContactNode.hx b/leenkx/Sources/leenkx/logicnode/OnContactNode.hx index b8935e7..e88b0f6 100644 --- a/leenkx/Sources/leenkx/logicnode/OnContactNode.hx +++ b/leenkx/Sources/leenkx/logicnode/OnContactNode.hx @@ -23,22 +23,16 @@ class OnContactNode extends LogicNode { var contact = false; -#if lnx_physics - var physics = leenkx.trait.physics.PhysicsWorld.active; - var rb1 = object1.getTrait(RigidBody); - if (rb1 != null) { - var rbs = physics.getContacts(rb1); - if (rbs != null) { - var rb2 = object2.getTrait(RigidBody); - for (rb in rbs) { - if (rb == rb2) { - contact = true; - break; - } - } + #if lnx_physics + var rb1 = leenkx.trait.physics.PhysicsWorld.getCachedRigidBody(object1); + var rb2 = leenkx.trait.physics.PhysicsWorld.getCachedRigidBody(object2); + + if (rb1 != null && rb2 != null) { + var physics = leenkx.trait.physics.PhysicsWorld.active; + var rbs = physics.getContacts(rb1); + contact = leenkx.trait.physics.PhysicsWorld.hasContactWith(rbs, rb2); } - } -#end + #end var b = false; switch (property0) { From e05d9d0237ad52fe29e27a900d874fc4b8e0f94b Mon Sep 17 00:00:00 2001 From: LeenkxTeam Date: Fri, 3 Oct 2025 05:04:48 +0000 Subject: [PATCH 05/17] Update leenkx/Sources/leenkx/logicnode/HasContactNode.hx --- leenkx/Sources/leenkx/logicnode/HasContactNode.hx | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/leenkx/Sources/leenkx/logicnode/HasContactNode.hx b/leenkx/Sources/leenkx/logicnode/HasContactNode.hx index f801dd9..5f8d958 100644 --- a/leenkx/Sources/leenkx/logicnode/HasContactNode.hx +++ b/leenkx/Sources/leenkx/logicnode/HasContactNode.hx @@ -16,10 +16,14 @@ class HasContactNode extends LogicNode { if (object1 == null || object2 == null) return false; #if lnx_physics - var physics = leenkx.trait.physics.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; + var rb1 = leenkx.trait.physics.PhysicsWorld.getCachedRigidBody(object1); + var rb2 = leenkx.trait.physics.PhysicsWorld.getCachedRigidBody(object2); + + if (rb1 != null && rb2 != null) { + var physics = leenkx.trait.physics.PhysicsWorld.active; + var rbs = physics.getContacts(rb1); + return leenkx.trait.physics.PhysicsWorld.hasContactWith(rbs, rb2); + } #end return false; } From b9b387803fd8f0cad4f15ba155ed9460ec19b18a Mon Sep 17 00:00:00 2001 From: LeenkxTeam Date: Fri, 3 Oct 2025 05:06:23 +0000 Subject: [PATCH 06/17] Add leenkx/blender/lnx/logicnode/physics/LN_any_contact.py --- .../lnx/logicnode/physics/LN_any_contact.py | 25 +++++++++++++++++++ 1 file changed, 25 insertions(+) create mode 100644 leenkx/blender/lnx/logicnode/physics/LN_any_contact.py diff --git a/leenkx/blender/lnx/logicnode/physics/LN_any_contact.py b/leenkx/blender/lnx/logicnode/physics/LN_any_contact.py new file mode 100644 index 0000000..f915979 --- /dev/null +++ b/leenkx/blender/lnx/logicnode/physics/LN_any_contact.py @@ -0,0 +1,25 @@ +from lnx.logicnode.lnx_nodes import * + +class AnyContactNode(LnxLogicTreeNode): + """Activates the output when the rigid body of the connected object makes contact with + any other rigid body. + """ + bl_idname = 'LNAnyContactNode' + bl_label = 'Any Contact' + lnx_section = 'contact' + lnx_version = 1 + + property0: HaxeEnumProperty( + 'property0', + items = [('begin', 'Begin', 'Contact with any object begins'), + ('overlap', 'Overlap', 'Contact with any object is happening'), + ('end', 'End', 'Contact with any object ends')], + name='', default='begin') + + def lnx_init(self, context): + self.add_input('LnxNodeSocketObject', 'RB') + + self.add_output('LnxNodeSocketAction', 'Out') + + def draw_buttons(self, context, layout): + layout.prop(self, 'property0') From 027021815abefcf7e1ffd8bedd3e8699513b8352 Mon Sep 17 00:00:00 2001 From: LeenkxTeam Date: Fri, 3 Oct 2025 05:35:48 +0000 Subject: [PATCH 07/17] Update leenkx/Sources/leenkx/logicnode/HasContactNode.hx --- leenkx/Sources/leenkx/logicnode/HasContactNode.hx | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/leenkx/Sources/leenkx/logicnode/HasContactNode.hx b/leenkx/Sources/leenkx/logicnode/HasContactNode.hx index 5f8d958..f58f413 100644 --- a/leenkx/Sources/leenkx/logicnode/HasContactNode.hx +++ b/leenkx/Sources/leenkx/logicnode/HasContactNode.hx @@ -16,13 +16,12 @@ class HasContactNode extends LogicNode { if (object1 == null || object2 == null) return false; #if lnx_physics - var rb1 = leenkx.trait.physics.PhysicsWorld.getCachedRigidBody(object1); - var rb2 = leenkx.trait.physics.PhysicsWorld.getCachedRigidBody(object2); + var rb1 = leenkx.trait.physics.PhysicsCache.getCachedRigidBody(object1); + var rb2 = leenkx.trait.physics.PhysicsCache.getCachedRigidBody(object2); if (rb1 != null && rb2 != null) { - var physics = leenkx.trait.physics.PhysicsWorld.active; - var rbs = physics.getContacts(rb1); - return leenkx.trait.physics.PhysicsWorld.hasContactWith(rbs, rb2); + var rbs = leenkx.trait.physics.PhysicsCache.getCachedContacts(rb1); + return leenkx.trait.physics.PhysicsCache.hasContactWith(rbs, rb2); } #end return false; From 2ec6f43cc54bb7d905078d02f72c10b14731d3e2 Mon Sep 17 00:00:00 2001 From: LeenkxTeam Date: Fri, 3 Oct 2025 05:36:14 +0000 Subject: [PATCH 08/17] Update leenkx/Sources/leenkx/logicnode/OnContactNode.hx --- leenkx/Sources/leenkx/logicnode/OnContactNode.hx | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/leenkx/Sources/leenkx/logicnode/OnContactNode.hx b/leenkx/Sources/leenkx/logicnode/OnContactNode.hx index e88b0f6..b7b5418 100644 --- a/leenkx/Sources/leenkx/logicnode/OnContactNode.hx +++ b/leenkx/Sources/leenkx/logicnode/OnContactNode.hx @@ -24,13 +24,12 @@ class OnContactNode extends LogicNode { var contact = false; #if lnx_physics - var rb1 = leenkx.trait.physics.PhysicsWorld.getCachedRigidBody(object1); - var rb2 = leenkx.trait.physics.PhysicsWorld.getCachedRigidBody(object2); + var rb1 = leenkx.trait.physics.PhysicsCache.getCachedRigidBody(object1); + var rb2 = leenkx.trait.physics.PhysicsCache.getCachedRigidBody(object2); if (rb1 != null && rb2 != null) { - var physics = leenkx.trait.physics.PhysicsWorld.active; - var rbs = physics.getContacts(rb1); - contact = leenkx.trait.physics.PhysicsWorld.hasContactWith(rbs, rb2); + var rbs = leenkx.trait.physics.PhysicsCache.getCachedContacts(rb1); + contact = leenkx.trait.physics.PhysicsCache.hasContactWith(rbs, rb2); } #end From 28579e14d745c7c2f4e828f4838ab065548ddbf0 Mon Sep 17 00:00:00 2001 From: LeenkxTeam Date: Fri, 3 Oct 2025 05:37:06 +0000 Subject: [PATCH 09/17] Update leenkx/Sources/leenkx/logicnode/AnyContactNode.hx --- leenkx/Sources/leenkx/logicnode/AnyContactNode.hx | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/leenkx/Sources/leenkx/logicnode/AnyContactNode.hx b/leenkx/Sources/leenkx/logicnode/AnyContactNode.hx index 97a58b3..eb1fba8 100644 --- a/leenkx/Sources/leenkx/logicnode/AnyContactNode.hx +++ b/leenkx/Sources/leenkx/logicnode/AnyContactNode.hx @@ -22,11 +22,9 @@ class AnyContactNode extends LogicNode { var contact = false; #if lnx_physics - var rb1 = leenkx.trait.physics.PhysicsWorld.getCachedRigidBody(object1); + var rb1 = leenkx.trait.physics.PhysicsCache.getCachedRigidBody(object1); if (rb1 != null) { - var physics = leenkx.trait.physics.PhysicsWorld.active; - var rbs = physics.getContacts(rb1); - + var rbs = leenkx.trait.physics.PhysicsCache.getCachedContacts(rb1); contact = (rbs != null && rbs.length > 0); } #end From 5c2d29d7cefbb5755997eab18c04ae3929508ce1 Mon Sep 17 00:00:00 2001 From: LeenkxTeam Date: Fri, 3 Oct 2025 05:37:50 +0000 Subject: [PATCH 10/17] Update leenkx/Sources/leenkx/trait/physics/bullet/PhysicsWorld.hx --- .../trait/physics/bullet/PhysicsWorld.hx | 35 ++----------------- 1 file changed, 3 insertions(+), 32 deletions(-) diff --git a/leenkx/Sources/leenkx/trait/physics/bullet/PhysicsWorld.hx b/leenkx/Sources/leenkx/trait/physics/bullet/PhysicsWorld.hx index 214a349..5eb1032 100644 --- a/leenkx/Sources/leenkx/trait/physics/bullet/PhysicsWorld.hx +++ b/leenkx/Sources/leenkx/trait/physics/bullet/PhysicsWorld.hx @@ -7,7 +7,6 @@ import iron.system.Time; import iron.math.Vec4; import iron.math.Quat; import iron.math.RayCaster; -import iron.object.Object; class Hit { @@ -73,10 +72,6 @@ class PhysicsWorld extends Trait { public var convexHitNormalWorld = new Vec4(); var pairCache: Bool = false; - // Performance optimization: Global RigidBody trait cache - public static var rigidBodyCache: Map = new Map(); - public static var cacheObjectRefs: Map = new Map(); // Track trait counts - static var nullvec = true; static var vec1: bullet.Bt.Vector3 = null; static var vec2: bullet.Bt.Vector3 = null; @@ -150,36 +145,10 @@ class PhysicsWorld extends Trait { iron.Scene.active.notifyOnRemove(function() { sceneRemoved = true; + leenkx.trait.physics.PhysicsCache.clearCache(); }); } - - public static function getCachedRigidBody(object: Object): RigidBody { - if (object == null) return null; - - var shouldUpdate = false; - var cachedTraitCount = cacheObjectRefs.get(object); - - if (cachedTraitCount == null || cachedTraitCount != object.traits.length) { - shouldUpdate = true; - } else if (rigidBodyCache.get(object) == null) { - var rb = object.getTrait(RigidBody); - if (rb != null) shouldUpdate = true; - } - - if (shouldUpdate) { - var rb = object.getTrait(RigidBody); - rigidBodyCache.set(object, rb); - cacheObjectRefs.set(object, object.traits.length); - } - - return rigidBodyCache.get(object); - } - - public static inline function hasContactWith(contacts: Array, target: RigidBody): Bool { - return contacts != null && target != null && contacts.indexOf(target) >= 0; - } - public function reset() { for (rb in active.rbMap) removeRigidBody(rb); } @@ -335,6 +304,8 @@ class PhysicsWorld extends Trait { var t = Time.fixedStep * timeScale * Time.scale; if (t == 0.0) return; // Simulation paused + leenkx.trait.physics.PhysicsCache.clearContactsCache(); + #if lnx_debug var startTime = kha.Scheduler.realTime(); #end From 6f383e2ab298058158ed630902cc92cd18224b84 Mon Sep 17 00:00:00 2001 From: LeenkxTeam Date: Fri, 3 Oct 2025 05:38:54 +0000 Subject: [PATCH 11/17] Update leenkx/Sources/leenkx/trait/physics/PhysicsWorld.hx --- .../leenkx/trait/physics/PhysicsWorld.hx | 55 +++++++++++++++++++ 1 file changed, 55 insertions(+) diff --git a/leenkx/Sources/leenkx/trait/physics/PhysicsWorld.hx b/leenkx/Sources/leenkx/trait/physics/PhysicsWorld.hx index db6f28a..f8532e1 100644 --- a/leenkx/Sources/leenkx/trait/physics/PhysicsWorld.hx +++ b/leenkx/Sources/leenkx/trait/physics/PhysicsWorld.hx @@ -1,5 +1,7 @@ package leenkx.trait.physics; +import iron.object.Object; + #if (!lnx_physics) class Hit { } @@ -11,10 +13,63 @@ class PhysicsWorld extends iron.Trait { public function new() { super(); } } typedef PhysicsWorld = leenkx.trait.physics.bullet.PhysicsWorld; typedef Hit = leenkx.trait.physics.bullet.PhysicsWorld.Hit; + typedef RigidBody = leenkx.trait.physics.bullet.RigidBody; #else typedef PhysicsWorld = leenkx.trait.physics.oimo.PhysicsWorld; typedef Hit = leenkx.trait.physics.oimo.PhysicsWorld.Hit; + typedef RigidBody = leenkx.trait.physics.oimo.RigidBody; #end + typedef RigidBodyCacheEntry = { + var rb: RigidBody; + var traitCount: Int; + } + + class PhysicsCache { + + static var rigidBodyCache: Map = new Map(); + static var contactsCache: Map> = new Map(); + static var contactsCacheFrame: Int = 0; + + public static function getCachedRigidBody(object: Object): RigidBody { + if (object == null) return null; + + var entry = rigidBodyCache.get(object); + + if (entry == null || entry.traitCount != object.traits.length) { + var rb = object.getTrait(RigidBody); + rigidBodyCache.set(object, { rb: rb, traitCount: object.traits.length }); + return rb; + } + + return entry.rb; + } + + public static function getCachedContacts(rb: RigidBody): Array { + if (rb == null || PhysicsWorld.active == null) return null; + + var cached = contactsCache.get(rb); + if (cached != null) return cached; + + var contacts = PhysicsWorld.active.getContacts(rb); + contactsCache.set(rb, contacts); + return contacts; + } + + public static inline function hasContactWith(contacts: Array, target: RigidBody): Bool { + return contacts != null && target != null && contacts.indexOf(target) >= 0; + } + + public static function clearCache() { + rigidBodyCache.clear(); + contactsCache.clear(); + } + + public static function clearContactsCache() { + contactsCacheFrame++; + contactsCache.clear(); + } + } + #end From dbe6d0829af97bfb4c5d72aa206786f61c4403d9 Mon Sep 17 00:00:00 2001 From: LeenkxTeam Date: Fri, 3 Oct 2025 07:51:07 +0000 Subject: [PATCH 12/17] Add leenkx/Sources/leenkx/trait/physics/PhysicsCache.hx --- .../leenkx/trait/physics/PhysicsCache.hx | 98 +++++++++++++++++++ 1 file changed, 98 insertions(+) create mode 100644 leenkx/Sources/leenkx/trait/physics/PhysicsCache.hx diff --git a/leenkx/Sources/leenkx/trait/physics/PhysicsCache.hx b/leenkx/Sources/leenkx/trait/physics/PhysicsCache.hx new file mode 100644 index 0000000..1d36104 --- /dev/null +++ b/leenkx/Sources/leenkx/trait/physics/PhysicsCache.hx @@ -0,0 +1,98 @@ +package leenkx.trait.physics; + +import iron.object.Object; + +class PhysicsCache { + #if lnx_physics + static var rbCache: Map = new Map(); + static var contactsCache: Map> = new Map(); + static var physicsFrame: Int = 0; + static var lastQueryFrame: Int = -1; + #end + + public static function getCachedRigidBody(object: Object): Dynamic { + #if (!lnx_physics) + return null; + #else + if (object == null) return null; + + var cached = rbCache.get(object.uid); + if (cached != null) return cached; + + #if lnx_bullet + var rb = object.getTrait(leenkx.trait.physics.bullet.RigidBody); + #else + var rb = object.getTrait(leenkx.trait.physics.oimo.RigidBody); + #end + + if (rb != null) rbCache.set(object.uid, rb); + return rb; + #end + } + + public static function getCachedContacts(rb: Dynamic): Array { + #if (!lnx_physics) + return null; + #else + if (rb == null) return null; + + var rbObjectId = (rb.object != null) ? rb.object.uid : -1; + + if (rbObjectId == -1) { + #if lnx_bullet + if (leenkx.trait.physics.bullet.PhysicsWorld.active == null) return null; + return leenkx.trait.physics.bullet.PhysicsWorld.active.getContacts(rb); + #else + if (leenkx.trait.physics.oimo.PhysicsWorld.active == null) return null; + return leenkx.trait.physics.oimo.PhysicsWorld.active.getContacts(rb); + #end + } + + if (lastQueryFrame == physicsFrame) { + var cached = contactsCache.get(rbObjectId); + if (cached != null) return cached; + } + + lastQueryFrame = physicsFrame; + + var cached = contactsCache.get(rbObjectId); + if (cached != null) return cached; + + #if lnx_bullet + if (leenkx.trait.physics.bullet.PhysicsWorld.active == null) return null; + var contacts = leenkx.trait.physics.bullet.PhysicsWorld.active.getContacts(rb); + #else + if (leenkx.trait.physics.oimo.PhysicsWorld.active == null) return null; + var contacts = leenkx.trait.physics.oimo.PhysicsWorld.active.getContacts(rb); + #end + + if (contacts != null) { + contactsCache.set(rbObjectId, contacts); + } + + return contacts; + #end + } + + public static inline function hasContactWith(contacts: Array, target: Dynamic): Bool { + #if (!lnx_physics) + return false; + #else + return contacts != null && target != null && contacts.indexOf(target) >= 0; + #end + } + + public static function clearCache() { + #if lnx_physics + rbCache.clear(); + contactsCache.clear(); + #end + } + + public static function clearContactsCache() { + #if lnx_physics + physicsFrame++; + contactsCache.clear(); + #end + } +} From 9894cc20f2fe0f43626c560f79c342eee21bfa24 Mon Sep 17 00:00:00 2001 From: LeenkxTeam Date: Fri, 3 Oct 2025 07:51:32 +0000 Subject: [PATCH 13/17] Update leenkx/Sources/leenkx/trait/physics/PhysicsWorld.hx --- .../leenkx/trait/physics/PhysicsWorld.hx | 57 ------------------- 1 file changed, 57 deletions(-) diff --git a/leenkx/Sources/leenkx/trait/physics/PhysicsWorld.hx b/leenkx/Sources/leenkx/trait/physics/PhysicsWorld.hx index f8532e1..84d386e 100644 --- a/leenkx/Sources/leenkx/trait/physics/PhysicsWorld.hx +++ b/leenkx/Sources/leenkx/trait/physics/PhysicsWorld.hx @@ -1,7 +1,5 @@ package leenkx.trait.physics; -import iron.object.Object; - #if (!lnx_physics) class Hit { } @@ -10,66 +8,11 @@ class PhysicsWorld extends iron.Trait { public function new() { super(); } } #else #if lnx_bullet - typedef PhysicsWorld = leenkx.trait.physics.bullet.PhysicsWorld; typedef Hit = leenkx.trait.physics.bullet.PhysicsWorld.Hit; - typedef RigidBody = leenkx.trait.physics.bullet.RigidBody; #else - typedef PhysicsWorld = leenkx.trait.physics.oimo.PhysicsWorld; typedef Hit = leenkx.trait.physics.oimo.PhysicsWorld.Hit; - typedef RigidBody = leenkx.trait.physics.oimo.RigidBody; #end - typedef RigidBodyCacheEntry = { - var rb: RigidBody; - var traitCount: Int; - } - - class PhysicsCache { - - static var rigidBodyCache: Map = new Map(); - static var contactsCache: Map> = new Map(); - static var contactsCacheFrame: Int = 0; - - public static function getCachedRigidBody(object: Object): RigidBody { - if (object == null) return null; - - var entry = rigidBodyCache.get(object); - - if (entry == null || entry.traitCount != object.traits.length) { - var rb = object.getTrait(RigidBody); - rigidBodyCache.set(object, { rb: rb, traitCount: object.traits.length }); - return rb; - } - - return entry.rb; - } - - public static function getCachedContacts(rb: RigidBody): Array { - if (rb == null || PhysicsWorld.active == null) return null; - - var cached = contactsCache.get(rb); - if (cached != null) return cached; - - var contacts = PhysicsWorld.active.getContacts(rb); - contactsCache.set(rb, contacts); - return contacts; - } - - public static inline function hasContactWith(contacts: Array, target: RigidBody): Bool { - return contacts != null && target != null && contacts.indexOf(target) >= 0; - } - - public static function clearCache() { - rigidBodyCache.clear(); - contactsCache.clear(); - } - - public static function clearContactsCache() { - contactsCacheFrame++; - contactsCache.clear(); - } - } - #end From 5eb735ada2103bf310193423b601896815062049 Mon Sep 17 00:00:00 2001 From: LeenkxTeam Date: Fri, 3 Oct 2025 07:52:01 +0000 Subject: [PATCH 14/17] Update leenkx/Sources/leenkx/trait/physics/bullet/PhysicsWorld.hx --- leenkx/Sources/leenkx/trait/physics/bullet/PhysicsWorld.hx | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/leenkx/Sources/leenkx/trait/physics/bullet/PhysicsWorld.hx b/leenkx/Sources/leenkx/trait/physics/bullet/PhysicsWorld.hx index 5eb1032..ba076d5 100644 --- a/leenkx/Sources/leenkx/trait/physics/bullet/PhysicsWorld.hx +++ b/leenkx/Sources/leenkx/trait/physics/bullet/PhysicsWorld.hx @@ -7,6 +7,7 @@ import iron.system.Time; import iron.math.Vec4; import iron.math.Quat; import iron.math.RayCaster; +import leenkx.trait.physics.PhysicsCache; class Hit { @@ -145,7 +146,7 @@ class PhysicsWorld extends Trait { iron.Scene.active.notifyOnRemove(function() { sceneRemoved = true; - leenkx.trait.physics.PhysicsCache.clearCache(); + PhysicsCache.clearCache(); }); } @@ -304,7 +305,7 @@ class PhysicsWorld extends Trait { var t = Time.fixedStep * timeScale * Time.scale; if (t == 0.0) return; // Simulation paused - leenkx.trait.physics.PhysicsCache.clearContactsCache(); + PhysicsCache.clearContactsCache(); #if lnx_debug var startTime = kha.Scheduler.realTime(); From 2ddc938db8483225b08133e172f0c50564a5d2e4 Mon Sep 17 00:00:00 2001 From: LeenkxTeam Date: Fri, 3 Oct 2025 07:55:14 +0000 Subject: [PATCH 15/17] Update leenkx/Sources/leenkx/logicnode/AnyContactNode.hx --- leenkx/Sources/leenkx/logicnode/AnyContactNode.hx | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/leenkx/Sources/leenkx/logicnode/AnyContactNode.hx b/leenkx/Sources/leenkx/logicnode/AnyContactNode.hx index eb1fba8..76d32b4 100644 --- a/leenkx/Sources/leenkx/logicnode/AnyContactNode.hx +++ b/leenkx/Sources/leenkx/logicnode/AnyContactNode.hx @@ -1,12 +1,14 @@ package leenkx.logicnode; - import iron.object.Object; + +#if lnx_physics +import leenkx.trait.physics.PhysicsCache; import leenkx.trait.physics.RigidBody; +#end class AnyContactNode extends LogicNode { public var property0: String; - var lastContact = false; public function new(tree: LogicTree) { @@ -22,9 +24,9 @@ class AnyContactNode extends LogicNode { var contact = false; #if lnx_physics - var rb1 = leenkx.trait.physics.PhysicsCache.getCachedRigidBody(object1); + var rb1 = PhysicsCache.getCachedRigidBody(object1); if (rb1 != null) { - var rbs = leenkx.trait.physics.PhysicsCache.getCachedContacts(rb1); + var rbs = PhysicsCache.getCachedContacts(rb1); contact = (rbs != null && rbs.length > 0); } #end From f2c4be63360ee2a4cc689920a84c84087dd4f797 Mon Sep 17 00:00:00 2001 From: LeenkxTeam Date: Fri, 3 Oct 2025 07:55:46 +0000 Subject: [PATCH 16/17] Update leenkx/Sources/leenkx/logicnode/HasContactNode.hx --- .../Sources/leenkx/logicnode/HasContactNode.hx | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/leenkx/Sources/leenkx/logicnode/HasContactNode.hx b/leenkx/Sources/leenkx/logicnode/HasContactNode.hx index f58f413..d04f05c 100644 --- a/leenkx/Sources/leenkx/logicnode/HasContactNode.hx +++ b/leenkx/Sources/leenkx/logicnode/HasContactNode.hx @@ -1,7 +1,10 @@ package leenkx.logicnode; - import iron.object.Object; + +#if lnx_physics +import leenkx.trait.physics.PhysicsCache; import leenkx.trait.physics.RigidBody; +#end class HasContactNode extends LogicNode { @@ -15,15 +18,15 @@ class HasContactNode extends LogicNode { if (object1 == null || object2 == null) return false; -#if lnx_physics - var rb1 = leenkx.trait.physics.PhysicsCache.getCachedRigidBody(object1); - var rb2 = leenkx.trait.physics.PhysicsCache.getCachedRigidBody(object2); + #if lnx_physics + var rb1 = PhysicsCache.getCachedRigidBody(object1); + var rb2 = PhysicsCache.getCachedRigidBody(object2); if (rb1 != null && rb2 != null) { - var rbs = leenkx.trait.physics.PhysicsCache.getCachedContacts(rb1); - return leenkx.trait.physics.PhysicsCache.hasContactWith(rbs, rb2); + var rbs = PhysicsCache.getCachedContacts(rb1); + return PhysicsCache.hasContactWith(rbs, rb2); } -#end + #end return false; } } From 48f5575e4ebd69fc69d11df65b81074b8e1eb769 Mon Sep 17 00:00:00 2001 From: LeenkxTeam Date: Fri, 3 Oct 2025 07:56:12 +0000 Subject: [PATCH 17/17] Update leenkx/Sources/leenkx/logicnode/OnContactNode.hx --- leenkx/Sources/leenkx/logicnode/OnContactNode.hx | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/leenkx/Sources/leenkx/logicnode/OnContactNode.hx b/leenkx/Sources/leenkx/logicnode/OnContactNode.hx index b7b5418..263f9cf 100644 --- a/leenkx/Sources/leenkx/logicnode/OnContactNode.hx +++ b/leenkx/Sources/leenkx/logicnode/OnContactNode.hx @@ -1,7 +1,11 @@ package leenkx.logicnode; - import iron.object.Object; + +#if lnx_physics +import leenkx.trait.physics.PhysicsCache; import leenkx.trait.physics.RigidBody; +#end + class OnContactNode extends LogicNode { @@ -24,12 +28,12 @@ class OnContactNode extends LogicNode { var contact = false; #if lnx_physics - var rb1 = leenkx.trait.physics.PhysicsCache.getCachedRigidBody(object1); - var rb2 = leenkx.trait.physics.PhysicsCache.getCachedRigidBody(object2); + var rb1 = PhysicsCache.getCachedRigidBody(object1); + var rb2 = PhysicsCache.getCachedRigidBody(object2); if (rb1 != null && rb2 != null) { - var rbs = leenkx.trait.physics.PhysicsCache.getCachedContacts(rb1); - contact = leenkx.trait.physics.PhysicsCache.hasContactWith(rbs, rb2); + var rbs = PhysicsCache.getCachedContacts(rb1); + contact = PhysicsCache.hasContactWith(rbs, rb2); } #end