From 939346c89687250d1f67a30bfda0b353b5965d5d Mon Sep 17 00:00:00 2001 From: Onek8 Date: Sun, 11 May 2025 17:03:13 +0000 Subject: [PATCH 01/23] moisesjpelaez - Fix camera spawn position in Blender 4.2.x --- leenkx/blender/lnx/exporter.py | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/leenkx/blender/lnx/exporter.py b/leenkx/blender/lnx/exporter.py index 40b6375..e698636 100644 --- a/leenkx/blender/lnx/exporter.py +++ b/leenkx/blender/lnx/exporter.py @@ -324,6 +324,20 @@ class LeenkxExporter: def export_object_transform(self, bobject: bpy.types.Object, o): wrd = bpy.data.worlds['Lnx'] + # HACK: In Blender 4.2.x, each camera must be selected to ensure its matrix is correctly assigned + if bpy.app.version >= (4, 2, 0) and bobject.type == 'CAMERA' and bobject.users_scene: + current_scene = bpy.context.window.scene + + bpy.context.window.scene = bobject.users_scene[0] + bpy.context.view_layer.update() + + bobject.select_set(True) + bpy.context.view_layer.update() + bobject.select_set(False) + + bpy.context.window.scene = current_scene + bpy.context.view_layer.update() + # Static transform o['transform'] = {'values': LeenkxExporter.write_matrix(bobject.matrix_local)} From 5d559734b9dc9ad58261daed83fd70d9d30be021 Mon Sep 17 00:00:00 2001 From: Onek8 Date: Sun, 11 May 2025 17:13:05 +0000 Subject: [PATCH 02/23] t3du - Add LN_array_index_list.py --- .../lnx/logicnode/array/LN_array_index_list.py | 13 +++++++++++++ 1 file changed, 13 insertions(+) create mode 100644 leenkx/blender/lnx/logicnode/array/LN_array_index_list.py diff --git a/leenkx/blender/lnx/logicnode/array/LN_array_index_list.py b/leenkx/blender/lnx/logicnode/array/LN_array_index_list.py new file mode 100644 index 0000000..18f706c --- /dev/null +++ b/leenkx/blender/lnx/logicnode/array/LN_array_index_list.py @@ -0,0 +1,13 @@ +from lnx.logicnode.lnx_nodes import * + +class ArrayIndexNode(LnxLogicTreeNode): + """Returns the array index list of the given value as an array.""" + bl_idname = 'LNArrayIndexListNode' + bl_label = 'Array Index List' + lnx_version = 1 + + def lnx_init(self, context): + self.add_input('LnxNodeSocketArray', 'Array') + self.add_input('LnxDynamicSocket', 'Value') + + self.add_output('LnxNodeSocketArray', 'Array') \ No newline at end of file From ea7cf849b82681b115ebebc2e69d3afeb1bceb81 Mon Sep 17 00:00:00 2001 From: Onek8 Date: Sun, 11 May 2025 17:14:38 +0000 Subject: [PATCH 03/23] t3du - Add ArrayIndexListNode.hx --- .../leenkx/logicnode/ArrayIndexListNode.hx | 26 +++++++++++++++++++ 1 file changed, 26 insertions(+) create mode 100644 leenkx/Sources/leenkx/logicnode/ArrayIndexListNode.hx diff --git a/leenkx/Sources/leenkx/logicnode/ArrayIndexListNode.hx b/leenkx/Sources/leenkx/logicnode/ArrayIndexListNode.hx new file mode 100644 index 0000000..47318ed --- /dev/null +++ b/leenkx/Sources/leenkx/logicnode/ArrayIndexListNode.hx @@ -0,0 +1,26 @@ +package leenkx.logicnode; + +class ArrayIndexListNode extends LogicNode { + + public function new(tree: LogicTree) { + super(tree); + } + + override function get(from: Int): Dynamic { + var array: Array = inputs[0].get(); + array = array.map(item -> Std.string(item)); + var value: Dynamic = inputs[1].get(); + var from: Int = 0; + + var arrayList: Array = []; + + var index: Int = array.indexOf(Std.string(value), from); + + while(index != -1){ + arrayList.push(index); + index = array.indexOf(Std.string(value), index+1); + } + + return arrayList; + } +} \ No newline at end of file From 29761ec9e6865607d94b2de3b46e576dc652a886 Mon Sep 17 00:00:00 2001 From: Onek8 Date: Sun, 11 May 2025 17:38:02 +0000 Subject: [PATCH 04/23] moisesjpelaez - Oimo Physics --- .../Sources/leenkx/logicnode/AddPhysicsConstraintNode.hx | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/leenkx/Sources/leenkx/logicnode/AddPhysicsConstraintNode.hx b/leenkx/Sources/leenkx/logicnode/AddPhysicsConstraintNode.hx index 734f6fb..8590b83 100644 --- a/leenkx/Sources/leenkx/logicnode/AddPhysicsConstraintNode.hx +++ b/leenkx/Sources/leenkx/logicnode/AddPhysicsConstraintNode.hx @@ -2,9 +2,11 @@ package leenkx.logicnode; import iron.object.Object; -#if lnx_physics +#if lnx_bullet import leenkx.trait.physics.PhysicsConstraint; import leenkx.trait.physics.bullet.PhysicsConstraint.ConstraintType; +#elseif lnx_oimo +// TODO #end class AddPhysicsConstraintNode extends LogicNode { @@ -25,7 +27,7 @@ class AddPhysicsConstraintNode extends LogicNode { if (pivotObject == null || rb1 == null || rb2 == null) return; -#if lnx_physics +#if lnx_bullet var disableCollisions: Bool = inputs[4].get(); var breakable: Bool = inputs[5].get(); @@ -108,6 +110,8 @@ class AddPhysicsConstraintNode extends LogicNode { } pivotObject.addTrait(con); } +#elseif lnx_oimo +// TODO #end runOutput(0); } From 86de9617f3c4a189f4e6b4ea98688ef3d62dcc8c Mon Sep 17 00:00:00 2001 From: Onek8 Date: Sun, 11 May 2025 17:39:01 +0000 Subject: [PATCH 05/23] moisesjpelaez - Oimo Physics --- leenkx/Sources/leenkx/logicnode/AddRigidBodyNode.hx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/leenkx/Sources/leenkx/logicnode/AddRigidBodyNode.hx b/leenkx/Sources/leenkx/logicnode/AddRigidBodyNode.hx index 874235b..3df20cf 100644 --- a/leenkx/Sources/leenkx/logicnode/AddRigidBodyNode.hx +++ b/leenkx/Sources/leenkx/logicnode/AddRigidBodyNode.hx @@ -4,7 +4,7 @@ import iron.object.Object; #if lnx_physics import leenkx.trait.physics.RigidBody; -import leenkx.trait.physics.bullet.RigidBody.Shape; +import leenkx.trait.physics.RigidBody.Shape; #end From 6ac06cc504012ddbeb8f76cda659743f9f8586c1 Mon Sep 17 00:00:00 2001 From: Onek8 Date: Sun, 11 May 2025 17:40:38 +0000 Subject: [PATCH 06/23] moisesjpelaez - Oimo Physics --- leenkx/Sources/leenkx/logicnode/GoToLocationNode.hx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/leenkx/Sources/leenkx/logicnode/GoToLocationNode.hx b/leenkx/Sources/leenkx/logicnode/GoToLocationNode.hx index b553a79..9d2e05b 100644 --- a/leenkx/Sources/leenkx/logicnode/GoToLocationNode.hx +++ b/leenkx/Sources/leenkx/logicnode/GoToLocationNode.hx @@ -1,7 +1,7 @@ package leenkx.logicnode; #if lnx_physics -import leenkx.trait.physics.bullet.PhysicsWorld; +import leenkx.trait.physics.PhysicsWorld; #end import leenkx.trait.navigation.Navigation; import iron.object.Object; From 808dcef8179dfc676fb90da164bf8c2eb8b45e94 Mon Sep 17 00:00:00 2001 From: Onek8 Date: Sun, 11 May 2025 17:41:38 +0000 Subject: [PATCH 07/23] moisesjpelaez - Oimo Physics --- leenkx/Sources/leenkx/logicnode/PhysicsConstraintNode.hx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/leenkx/Sources/leenkx/logicnode/PhysicsConstraintNode.hx b/leenkx/Sources/leenkx/logicnode/PhysicsConstraintNode.hx index 0bce755..0547aaf 100644 --- a/leenkx/Sources/leenkx/logicnode/PhysicsConstraintNode.hx +++ b/leenkx/Sources/leenkx/logicnode/PhysicsConstraintNode.hx @@ -1,7 +1,7 @@ package leenkx.logicnode; #if lnx_physics -import leenkx.trait.physics.bullet.PhysicsConstraint.ConstraintAxis; +import leenkx.trait.physics.PhysicsConstraint.ConstraintAxis; #end class PhysicsConstraintNode extends LogicNode { From 335f3541f17aa519fcae664635b92da193c1e253 Mon Sep 17 00:00:00 2001 From: Onek8 Date: Sun, 11 May 2025 17:44:49 +0000 Subject: [PATCH 08/23] moisesjpelaez - Oimo Physics --- .../leenkx/trait/physics/KinematicCharacterController.hx | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/leenkx/Sources/leenkx/trait/physics/KinematicCharacterController.hx b/leenkx/Sources/leenkx/trait/physics/KinematicCharacterController.hx index 71c48e5..ad6d2df 100644 --- a/leenkx/Sources/leenkx/trait/physics/KinematicCharacterController.hx +++ b/leenkx/Sources/leenkx/trait/physics/KinematicCharacterController.hx @@ -10,6 +10,10 @@ class KinematicCharacterController extends iron.Trait { public function new() { typedef KinematicCharacterController = leenkx.trait.physics.bullet.KinematicCharacterController; + #else + + typedef KinematicCharacterController = leenkx.trait.physics.oimo.KinematicCharacterController; + #end #end From b8c8ccad9db4bc3998d62f243b9824318ec0ce63 Mon Sep 17 00:00:00 2001 From: Onek8 Date: Sun, 11 May 2025 17:46:28 +0000 Subject: [PATCH 09/23] moisesjpelaez - Oimo Physics --- leenkx/Sources/leenkx/trait/physics/PhysicsConstraint.hx | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/leenkx/Sources/leenkx/trait/physics/PhysicsConstraint.hx b/leenkx/Sources/leenkx/trait/physics/PhysicsConstraint.hx index 5ac6d91..1d6ea38 100644 --- a/leenkx/Sources/leenkx/trait/physics/PhysicsConstraint.hx +++ b/leenkx/Sources/leenkx/trait/physics/PhysicsConstraint.hx @@ -3,17 +3,16 @@ package leenkx.trait.physics; #if (!lnx_physics) class PhysicsConstraint extends iron.Trait { public function new() { super(); } } +@:enum abstract ConstraintAxis(Int) from Int to Int { } #else #if lnx_bullet - typedef PhysicsConstraint = leenkx.trait.physics.bullet.PhysicsConstraint; - + typedef ConstraintAxis = armory.trait.physics.bullet.PhysicsConstraint.ConstraintAxis; #else - typedef PhysicsConstraint = leenkx.trait.physics.oimo.PhysicsConstraint; - + typedef ConstraintAxis = armory.trait.physics.oimo.PhysicsConstraint.ConstraintAxis; #end #end From c42e4c09a837b8e8148f8b45008576508c93b484 Mon Sep 17 00:00:00 2001 From: Onek8 Date: Sun, 11 May 2025 17:46:49 +0000 Subject: [PATCH 10/23] moisesjpelaez - Oimo Physics --- leenkx/Sources/leenkx/trait/physics/PhysicsConstraint.hx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/leenkx/Sources/leenkx/trait/physics/PhysicsConstraint.hx b/leenkx/Sources/leenkx/trait/physics/PhysicsConstraint.hx index 1d6ea38..eeb5358 100644 --- a/leenkx/Sources/leenkx/trait/physics/PhysicsConstraint.hx +++ b/leenkx/Sources/leenkx/trait/physics/PhysicsConstraint.hx @@ -9,10 +9,10 @@ class PhysicsConstraint extends iron.Trait { public function new() { super(); } #if lnx_bullet typedef PhysicsConstraint = leenkx.trait.physics.bullet.PhysicsConstraint; - typedef ConstraintAxis = armory.trait.physics.bullet.PhysicsConstraint.ConstraintAxis; + typedef ConstraintAxis = leenkx.trait.physics.bullet.PhysicsConstraint.ConstraintAxis; #else typedef PhysicsConstraint = leenkx.trait.physics.oimo.PhysicsConstraint; - typedef ConstraintAxis = armory.trait.physics.oimo.PhysicsConstraint.ConstraintAxis; + typedef ConstraintAxis = leenkx.trait.physics.oimo.PhysicsConstraint.ConstraintAxis; #end #end From cde2bead97a03a0f1ed5fcecf8d47f833adbf6b5 Mon Sep 17 00:00:00 2001 From: Onek8 Date: Sun, 11 May 2025 17:47:56 +0000 Subject: [PATCH 11/23] moisesjpelaez - Oimo Physics --- leenkx/Sources/leenkx/trait/physics/PhysicsWorld.hx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/leenkx/Sources/leenkx/trait/physics/PhysicsWorld.hx b/leenkx/Sources/leenkx/trait/physics/PhysicsWorld.hx index 3e35a03..8bc8c29 100644 --- a/leenkx/Sources/leenkx/trait/physics/PhysicsWorld.hx +++ b/leenkx/Sources/leenkx/trait/physics/PhysicsWorld.hx @@ -9,11 +9,11 @@ class PhysicsWorld extends iron.Trait { public function new() { super(); } } #if lnx_bullet typedef PhysicsWorld = leenkx.trait.physics.bullet.PhysicsWorld; - + typedef Hit = leenkx.trait.physics.bullet.PhysicsWorld.Hit; #else typedef PhysicsWorld = leenkx.trait.physics.oimo.PhysicsWorld; - + typedef Hit = leenkx.trait.physics.oimo.PhysicsWorld.Hit; #end #end From 7969286fdc366449986e9426cbed69729bd6ec50 Mon Sep 17 00:00:00 2001 From: Onek8 Date: Sun, 11 May 2025 17:49:43 +0000 Subject: [PATCH 12/23] moisesjpelaez - Oimo Physics --- leenkx/Sources/leenkx/trait/physics/RigidBody.hx | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/leenkx/Sources/leenkx/trait/physics/RigidBody.hx b/leenkx/Sources/leenkx/trait/physics/RigidBody.hx index 7247531..2742418 100644 --- a/leenkx/Sources/leenkx/trait/physics/RigidBody.hx +++ b/leenkx/Sources/leenkx/trait/physics/RigidBody.hx @@ -3,17 +3,20 @@ package leenkx.trait.physics; #if (!lnx_physics) class RigidBody extends iron.Trait { public function new() { super(); } } +@:enum abstract Shape(Int) from Int to Int { } #else #if lnx_bullet typedef RigidBody = leenkx.trait.physics.bullet.RigidBody; - + typedef Shape = leenkx.trait.physics.bullet.RigidBody.Shape; + #else typedef RigidBody = leenkx.trait.physics.oimo.RigidBody; - + typedef Shape = leenkx.trait.physics.oimo.RigidBody.Shape; + #end #end From 8aeaa0368e23e947d4dce360396d8e5b52ffd9b1 Mon Sep 17 00:00:00 2001 From: Onek8 Date: Sun, 11 May 2025 17:50:43 +0000 Subject: [PATCH 13/23] moisesjpelaez - Oimo Physics --- leenkx/Sources/leenkx/trait/physics/PhysicsWorld.hx | 1 + 1 file changed, 1 insertion(+) diff --git a/leenkx/Sources/leenkx/trait/physics/PhysicsWorld.hx b/leenkx/Sources/leenkx/trait/physics/PhysicsWorld.hx index 8bc8c29..db6f28a 100644 --- a/leenkx/Sources/leenkx/trait/physics/PhysicsWorld.hx +++ b/leenkx/Sources/leenkx/trait/physics/PhysicsWorld.hx @@ -2,6 +2,7 @@ package leenkx.trait.physics; #if (!lnx_physics) +class Hit { } class PhysicsWorld extends iron.Trait { public function new() { super(); } } #else From 6d4c1a680bf2b00f4cf5803d174898724a90799f Mon Sep 17 00:00:00 2001 From: Onek8 Date: Sun, 11 May 2025 19:37:04 +0000 Subject: [PATCH 14/23] moisesjpelaez - Oimo Physics --- leenkx/blender/lnx/exporter.py | 21 ++++++++++----------- 1 file changed, 10 insertions(+), 11 deletions(-) diff --git a/leenkx/blender/lnx/exporter.py b/leenkx/blender/lnx/exporter.py index e698636..ffb2434 100644 --- a/leenkx/blender/lnx/exporter.py +++ b/leenkx/blender/lnx/exporter.py @@ -1566,8 +1566,7 @@ class LeenkxExporter: log.error(e.message) else: # Assume it was caused because of encountering n-gons - log.error(f"""object {bobject.name} contains n-gons in its mesh, so it's impossible to compute tanget space for normal mapping. -Make sure the mesh only has tris/quads.""") + log.error(f"""object {bobject.name} contains n-gons in its mesh, so it's impossible to compute tanget space for normal mapping. Make sure the mesh only has tris/quads.""") tangdata = np.empty(num_verts * 3, dtype=' Date: Sun, 11 May 2025 19:41:09 +0000 Subject: [PATCH 15/23] moisesjpelaez - Oimo Physics --- leenkx/blender/lnx/props.py | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/leenkx/blender/lnx/props.py b/leenkx/blender/lnx/props.py index 267cb30..23be0a8 100644 --- a/leenkx/blender/lnx/props.py +++ b/leenkx/blender/lnx/props.py @@ -197,38 +197,38 @@ def init_properties(): items=[('Bullet', 'Bullet', 'Bullet'), ('Oimo', 'Oimo', 'Oimo')], name="Physics Engine", default='Bullet', update=assets.invalidate_compiler_cache) - bpy.types.World.lnx_bullet_dbg_draw_wireframe = BoolProperty( + bpy.types.World.lnx_physics_dbg_draw_wireframe = BoolProperty( name="Collider Wireframes", default=False, description="Draw wireframes of the physics collider meshes and suspensions of raycast vehicle simulations" ) - bpy.types.World.lnx_bullet_dbg_draw_raycast = BoolProperty( - name="Trace Raycast", default=False, + bpy.types.World.lnx_physics_dbg_draw_raycast = BoolProperty( + name="Raycasts", default=False, description="Draw raycasts to trace the results" ) - bpy.types.World.lnx_bullet_dbg_draw_aabb = BoolProperty( + bpy.types.World.lnx_physics_dbg_draw_aabb = BoolProperty( name="Axis-aligned Minimum Bounding Boxes", default=False, description="Draw axis-aligned minimum bounding boxes (AABBs) of the physics collider meshes" ) - bpy.types.World.lnx_bullet_dbg_draw_contact_points = BoolProperty( + bpy.types.World.lnx_physics_dbg_draw_contact_points = BoolProperty( name="Contact Points", default=False, description="Visualize contact points of multiple colliders" ) - bpy.types.World.lnx_bullet_dbg_draw_constraints = BoolProperty( + bpy.types.World.lnx_physics_dbg_draw_constraints = BoolProperty( name="Constraints", default=False, description="Draw axis gizmos for important constraint points" ) - bpy.types.World.lnx_bullet_dbg_draw_constraint_limits = BoolProperty( + bpy.types.World.lnx_physics_dbg_draw_constraint_limits = BoolProperty( name="Constraint Limits", default=False, description="Draw additional constraint information such as distance or angle limits" ) - bpy.types.World.lnx_bullet_dbg_draw_normals = BoolProperty( + bpy.types.World.lnx_physics_dbg_draw_normals = BoolProperty( name="Face Normals", default=False, description=( "Draw the normal vectors of the triangles of the physics collider meshes." - " This only works for mesh collision shapes" + " This only works with Bullet physics, for mesh collision shapes" ) ) - bpy.types.World.lnx_bullet_dbg_draw_axis_gizmo = BoolProperty( + bpy.types.World.lnx_physics_dbg_draw_axis_gizmo = BoolProperty( name="Axis Gizmos", default=False, description=( "Draw a small axis gizmo at the origin of the collision shape." From 68900fb9924b04b0ae31c39778e3ffd14da1fbdc Mon Sep 17 00:00:00 2001 From: Onek8 Date: Sun, 11 May 2025 19:43:09 +0000 Subject: [PATCH 16/23] moisesjpelaez - Fix Bloom condition --- leenkx/blender/lnx/props_ui.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/leenkx/blender/lnx/props_ui.py b/leenkx/blender/lnx/props_ui.py index 3198918..ff564b3 100644 --- a/leenkx/blender/lnx/props_ui.py +++ b/leenkx/blender/lnx/props_ui.py @@ -1907,7 +1907,7 @@ class LNX_PT_RenderPathPostProcessPanel(bpy.types.Panel): col.prop(rpdat, "rp_bloom") _col = col.column() _col.enabled = rpdat.rp_bloom - if bpy.app.version <= (4, 2, 4): + if bpy.app.version < (4, 3, 0): _col.prop(rpdat, 'lnx_bloom_follow_blender') if not rpdat.lnx_bloom_follow_blender: _col.prop(rpdat, 'lnx_bloom_threshold') From 2732210fc99de4f3912af1a718fc5c9eaa9fad92 Mon Sep 17 00:00:00 2001 From: Onek8 Date: Sun, 11 May 2025 19:46:28 +0000 Subject: [PATCH 17/23] moisesjpelaez - Oimo Physics --- leenkx/blender/lnx/props_ui.py | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/leenkx/blender/lnx/props_ui.py b/leenkx/blender/lnx/props_ui.py index ff564b3..c266d9c 100644 --- a/leenkx/blender/lnx/props_ui.py +++ b/leenkx/blender/lnx/props_ui.py @@ -2749,20 +2749,20 @@ class LNX_PT_BulletDebugDrawingPanel(bpy.types.Panel): layout.use_property_decorate = False wrd = bpy.data.worlds['Lnx'] - if wrd.lnx_physics_engine != 'Bullet': + if wrd.lnx_physics_engine != 'Bullet' and wrd.lnx_physics_engine != 'Oimo': row = layout.row() row.alert = True - row.label(text="Physics debug drawing is only supported for the Bullet physics engine") + row.label(text="Physics debug drawing is only supported for the Bullet and Oimo physics engines") col = layout.column(align=False) - col.prop(wrd, "lnx_bullet_dbg_draw_wireframe") - col.prop(wrd, "lnx_bullet_dbg_draw_raycast") - col.prop(wrd, "lnx_bullet_dbg_draw_aabb") - col.prop(wrd, "lnx_bullet_dbg_draw_contact_points") - col.prop(wrd, "lnx_bullet_dbg_draw_constraints") - col.prop(wrd, "lnx_bullet_dbg_draw_constraint_limits") - col.prop(wrd, "lnx_bullet_dbg_draw_normals") - col.prop(wrd, "lnx_bullet_dbg_draw_axis_gizmo") + col.prop(wrd, "lnx_physics_dbg_draw_wireframe") + col.prop(wrd, "lnx_physics_dbg_draw_raycast") + col.prop(wrd, "lnx_physics_dbg_draw_aabb") + col.prop(wrd, "lnx_physics_dbg_draw_contact_points") + col.prop(wrd, "lnx_physics_dbg_draw_constraints") + col.prop(wrd, "lnx_physics_dbg_draw_constraint_limits") + col.prop(wrd, "lnx_physics_dbg_draw_normals") + col.prop(wrd, "lnx_physics_dbg_draw_axis_gizmo") def draw_custom_node_menu(self, context): """Extension of the node context menu. From 290289f41310c7a8e7b5b6e8f6cb6ebc9672b4e2 Mon Sep 17 00:00:00 2001 From: Onek8 Date: Sun, 11 May 2025 20:37:34 +0000 Subject: [PATCH 18/23] Update leenkx/Sources/leenkx/trait/physics/bullet/PhysicsWorld.hx --- .../trait/physics/bullet/PhysicsWorld.hx | 42 ++++++++----------- 1 file changed, 18 insertions(+), 24 deletions(-) diff --git a/leenkx/Sources/leenkx/trait/physics/bullet/PhysicsWorld.hx b/leenkx/Sources/leenkx/trait/physics/bullet/PhysicsWorld.hx index 39ad145..e2bea17 100644 --- a/leenkx/Sources/leenkx/trait/physics/bullet/PhysicsWorld.hx +++ b/leenkx/Sources/leenkx/trait/physics/bullet/PhysicsWorld.hx @@ -71,7 +71,6 @@ class PhysicsWorld extends Trait { public var convexHitPointWorld = new Vec4(); public var convexHitNormalWorld = new Vec4(); var pairCache: Bool = false; - public var drawRaycasts: Bool = false; static var nullvec = true; static var vec1: bullet.Bt.Vector3 = null; @@ -102,7 +101,7 @@ class PhysicsWorld extends Trait { - public function new(timeScale = 1.0, maxSteps = 10, solverIterations = 10, debugDrawMode: DebugDrawMode = NoDebug, drawRaycasts: Bool = false) { + public function new(timeScale = 1.0, maxSteps = 10, solverIterations = 10, debugDrawMode: DebugDrawMode = NoDebug) { super(); if (nullvec) { @@ -121,7 +120,6 @@ class PhysicsWorld extends Trait { this.timeScale = timeScale; this.maxSteps = maxSteps; this.solverIterations = solverIterations; - this.drawRaycasts = drawRaycasts; // First scene if (active == null) { @@ -408,14 +406,6 @@ class PhysicsWorld extends Trait { var worldDyn: bullet.Bt.DynamicsWorld = world; var worldCol: bullet.Bt.CollisionWorld = worldDyn; - if (this.drawRaycasts && this.debugDrawHelper != null) { - this.debugDrawHelper.drawRayCast( - rayFrom.x(), rayFrom.y(), rayFrom.z(), - rayTo.x(), rayTo.y(), rayTo.z(), - 0.73, 0.341, 1.0 - ); - } - worldCol.rayTest(rayFrom, rayTo, rayCallback); var rb: RigidBody = null; var hitInfo: Hit = null; @@ -441,6 +431,16 @@ class PhysicsWorld extends Trait { #end } + if (getDebugDrawMode() & DrawRayCast != 0) { + debugDrawHelper.rayCast({ + from: from, + to: to, + hasHit: rc.hasHit(), + hitPoint: hitPointWorld, + hitNormal: hitNormalWorld + }); + } + #if js bullet.Bt.Ammo.destroy(rayCallback); #else @@ -519,22 +519,14 @@ class PhysicsWorld extends Trait { public function setDebugDrawMode(debugDrawMode: DebugDrawMode) { if (debugDrawHelper == null) { - // Initialize if helper is null AND (standard debug mode is requested OR our custom raycast drawing is requested) - if (debugDrawMode != NoDebug || this.drawRaycasts) { - initDebugDrawing(); - } - else { - // Helper is null and no debug drawing needed, so exit + if (debugDrawMode == NoDebug) { return; } + initDebugDrawing(debugDrawMode); } - // If we reached here, the helper is initialized (or was already) - // Now set the standard Bullet debug mode on the actual drawer #if js - // Ensure drawer exists before setting mode (might have just been initialized) - var drawer = world.getDebugDrawer(); - if (drawer != null) drawer.setDebugMode(debugDrawMode); + world.getDebugDrawer().setDebugMode(debugDrawMode); #elseif hl hlDebugDrawer_setDebugMode(debugDrawMode); #end @@ -554,8 +546,8 @@ class PhysicsWorld extends Trait { #end } - function initDebugDrawing() { - debugDrawHelper = new DebugDrawHelper(this); + function initDebugDrawing(debugDrawMode: DebugDrawMode) { + debugDrawHelper = new DebugDrawHelper(this, debugDrawMode); #if js final drawer = new bullet.Bt.DebugDrawer(); @@ -691,6 +683,8 @@ enum abstract DebugDrawMode(Int) from Int to Int { **/ var DrawFrames = 1 << 15; + var DrawRayCast = 1 << 16; + @:op(~A) public inline function bitwiseNegate(): DebugDrawMode { return ~this; } From 3d8bd77c59dbfb3bdf70720af907368dabaec982 Mon Sep 17 00:00:00 2001 From: Onek8 Date: Mon, 12 May 2025 04:08:17 +0000 Subject: [PATCH 19/23] Update leenkx/Sources/leenkx/trait/physics/bullet/DebugDrawHelper.hx --- .../trait/physics/bullet/DebugDrawHelper.hx | 127 ++++++++++++++---- 1 file changed, 99 insertions(+), 28 deletions(-) diff --git a/leenkx/Sources/leenkx/trait/physics/bullet/DebugDrawHelper.hx b/leenkx/Sources/leenkx/trait/physics/bullet/DebugDrawHelper.hx index 8c347a3..1520d6d 100644 --- a/leenkx/Sources/leenkx/trait/physics/bullet/DebugDrawHelper.hx +++ b/leenkx/Sources/leenkx/trait/physics/bullet/DebugDrawHelper.hx @@ -1,5 +1,8 @@ package leenkx.trait.physics.bullet; +#if lnx_bullet +import leenkx.trait.physics.bullet.PhysicsWorld.DebugDrawMode; + import bullet.Bt.Vector3; import kha.FastFloat; @@ -18,14 +21,19 @@ class DebugDrawHelper { static inline var contactPointNormalColor = 0xffffffff; static inline var contactPointDrawLifetime = true; + final rayCastColor: Vec4 = new Vec4(0.0, 1.0, 0.0); + final rayCastHitColor: Vec4 = new Vec4(1.0, 0.0, 0.0); + final rayCastHitPointColor: Vec4 = new Vec4(1.0, 1.0, 0.0); + final physicsWorld: PhysicsWorld; final lines: Array = []; final texts: Array = []; var font: kha.Font = null; - var debugMode: PhysicsWorld.DebugDrawMode = NoDebug; + var rayCasts:Array = []; + var debugDrawMode: DebugDrawMode = NoDebug; - public function new(physicsWorld: PhysicsWorld) { + public function new(physicsWorld: PhysicsWorld, debugDrawMode: DebugDrawMode) this.physicsWorld = physicsWorld; #if lnx_ui @@ -35,6 +43,11 @@ class DebugDrawHelper { #end iron.App.notifyOnRender2D(onRender); + if (debugDrawMode & DrawRayCast != 0) { + iron.App.notifyOnUpdate(function () { + rayCasts.resize(0); + }); + } } public function drawLine(from: bullet.Bt.Vector3, to: bullet.Bt.Vector3, color: bullet.Bt.Vector3) { @@ -63,25 +76,6 @@ class DebugDrawHelper { } } - // Draws raycast in its own function because - // something is conflicting with the btVector3 and JS pointer wrapping - public function drawRayCast(fx:FastFloat, fy:FastFloat, fz:FastFloat, tx:FastFloat, ty:FastFloat, tz:FastFloat, r:FastFloat, g:FastFloat, b:FastFloat) { - final fromScreenSpace = worldToScreenFast(new Vec4(fx, fy, fz, 1.0)); - final toScreenSpace = worldToScreenFast(new Vec4(tx, ty, tz, 1.0)); - - // TO DO: May still go off screen sides. - if (fromScreenSpace.w == 1 || toScreenSpace.w == 1) { - final color = kha.Color.fromFloats(r, g, b, 1.0); - lines.push({ - fromX: fromScreenSpace.x, - fromY: fromScreenSpace.y, - toX: toScreenSpace.x, - toY: toScreenSpace.y, - color: color - }); - } - } - public function drawContactPoint(pointOnB: Vector3, normalOnB: Vector3, distance: kha.FastFloat, lifeTime: Int, color: Vector3) { #if js pointOnB = js.Syntax.code("Ammo.wrapPointer({0}, Ammo.btVector3)", pointOnB); @@ -126,7 +120,62 @@ class DebugDrawHelper { x: contactPointScreenSpace.x, y: contactPointScreenSpace.y, color: color, - text: Std.string(lifeTime), + text: Std.string(lifeTime), // lifeTime: number of frames the contact point existed + }); + } + } + } + + public function rayCast(rayCastData:TRayCastData) { + rayCasts.push(rayCastData); + } + + function drawRayCast(f: Vec4, t: Vec4, hit: Bool) { + final from = worldToScreenFast(f.clone()); + final to = worldToScreenFast(t.clone()); + var c: kha.Color; + + if (from.w == 1 && to.w == 1) { + if (hit) c = kha.Color.fromFloats(rayCastHitColor.x, rayCastHitColor.y, rayCastHitColor.z); + else c = kha.Color.fromFloats(rayCastColor.x, rayCastColor.y, rayCastColor.z); + + lines.push({ + fromX: from.x, + fromY: from.y, + toX: to.x, + toY: to.y, + color: c + }); + } + } + + function drawHitPoint(hp: Vec4) { + final hitPoint = worldToScreenFast(hp.clone()); + final c = kha.Color.fromFloats(rayCastHitPointColor.x, rayCastHitPointColor.y, rayCastHitPointColor.z); + + if (hitPoint.w == 1) { + lines.push({ + fromX: hitPoint.x - contactPointSizePx, + fromY: hitPoint.y - contactPointSizePx, + toX: hitPoint.x + contactPointSizePx, + toY: hitPoint.y + contactPointSizePx, + color: c + }); + + lines.push({ + fromX: hitPoint.x - contactPointSizePx, + fromY: hitPoint.y + contactPointSizePx, + toX: hitPoint.x + contactPointSizePx, + toY: hitPoint.y - contactPointSizePx, + color: c + }); + + if (font != null) { + texts.push({ + x: hitPoint.x, + y: hitPoint.y, + color: c, + text: 'RAYCAST HIT' }); } } @@ -155,13 +204,13 @@ class DebugDrawHelper { }); } - public function setDebugMode(debugMode: PhysicsWorld.DebugDrawMode) { - this.debugMode = debugMode; + public function setDebugMode(debugDrawMode: DebugDrawMode) { + this.debugDrawMode = debugDrawMode; } - public function getDebugMode(): PhysicsWorld.DebugDrawMode { + public function getDebugMode(): DebugDrawMode { #if js - return debugMode; + return DebugDrawMode; #elseif hl return physicsWorld.getDebugDrawMode(); #else @@ -170,7 +219,7 @@ class DebugDrawHelper { } function onRender(g: kha.graphics2.Graphics) { - if (getDebugMode() == NoDebug && !physicsWorld.drawRaycasts) { + if (getDebugMode() == NoDebug) { return; } @@ -179,7 +228,9 @@ class DebugDrawHelper { // will cause Bullet to call the btIDebugDraw callbacks), but this way // we can ensure that--within a frame--the function will not be called // before some user-specific physics update, which would result in a - // one-frame drawing delay... + // one-frame drawing delay... Ideally we would ensure that debugDrawWorld() + // is called when all other (late) update callbacks are already executed... + physicsWorld.world.debugDrawWorld(); g.opacity = 1.0; @@ -199,6 +250,17 @@ class DebugDrawHelper { } texts.resize(0); } + + if (debugDrawMode & DrawRayCast != 0) { + for (rayCastData in rayCasts) { + if (rayCastData.hasHit) { + drawRayCast(rayCastData.from, rayCastData.hitPoint, true); + drawHitPoint(rayCastData.hitPoint); + } else { + drawRayCast(rayCastData.from, rayCastData.to, false); + } + } + } } /** @@ -241,3 +303,12 @@ class TextData { public var color: kha.Color; public var text: String; } + +@:structInit +typedef TRayCastData = { + var from: Vec4; + var to: Vec4; + var hasHit: Bool; + @:optional var hitPoint: Vec4; + @:optional var hitNormal: Vec4; +} \ No newline at end of file From 7b8d73cd841501fc8709ef6c913f14dd8549a8e0 Mon Sep 17 00:00:00 2001 From: Onek8 Date: Mon, 12 May 2025 07:29:05 +0000 Subject: [PATCH 20/23] Update leenkx/Sources/leenkx/trait/physics/bullet/DebugDrawHelper.hx --- leenkx/Sources/leenkx/trait/physics/bullet/DebugDrawHelper.hx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/leenkx/Sources/leenkx/trait/physics/bullet/DebugDrawHelper.hx b/leenkx/Sources/leenkx/trait/physics/bullet/DebugDrawHelper.hx index 1520d6d..464c339 100644 --- a/leenkx/Sources/leenkx/trait/physics/bullet/DebugDrawHelper.hx +++ b/leenkx/Sources/leenkx/trait/physics/bullet/DebugDrawHelper.hx @@ -33,7 +33,7 @@ class DebugDrawHelper { var rayCasts:Array = []; var debugDrawMode: DebugDrawMode = NoDebug; - public function new(physicsWorld: PhysicsWorld, debugDrawMode: DebugDrawMode) + public function new(physicsWorld: PhysicsWorld, debugDrawMode: DebugDrawMode) { this.physicsWorld = physicsWorld; #if lnx_ui From 2f9694632dcd2227163ba56a6028b5da457f5405 Mon Sep 17 00:00:00 2001 From: Onek8 Date: Mon, 12 May 2025 07:31:37 +0000 Subject: [PATCH 21/23] Update leenkx/Sources/leenkx/trait/physics/bullet/DebugDrawHelper.hx --- leenkx/Sources/leenkx/trait/physics/bullet/DebugDrawHelper.hx | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/leenkx/Sources/leenkx/trait/physics/bullet/DebugDrawHelper.hx b/leenkx/Sources/leenkx/trait/physics/bullet/DebugDrawHelper.hx index 464c339..4228387 100644 --- a/leenkx/Sources/leenkx/trait/physics/bullet/DebugDrawHelper.hx +++ b/leenkx/Sources/leenkx/trait/physics/bullet/DebugDrawHelper.hx @@ -311,4 +311,6 @@ typedef TRayCastData = { var hasHit: Bool; @:optional var hitPoint: Vec4; @:optional var hitNormal: Vec4; -} \ No newline at end of file +} + +#end \ No newline at end of file From 8ee2aaa70ab05522450e9c9332f8052d5599fd86 Mon Sep 17 00:00:00 2001 From: Onek8 Date: Mon, 12 May 2025 07:39:22 +0000 Subject: [PATCH 22/23] Update leenkx/Sources/leenkx/trait/physics/bullet/DebugDrawHelper.hx --- leenkx/Sources/leenkx/trait/physics/bullet/DebugDrawHelper.hx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/leenkx/Sources/leenkx/trait/physics/bullet/DebugDrawHelper.hx b/leenkx/Sources/leenkx/trait/physics/bullet/DebugDrawHelper.hx index 4228387..b7ce809 100644 --- a/leenkx/Sources/leenkx/trait/physics/bullet/DebugDrawHelper.hx +++ b/leenkx/Sources/leenkx/trait/physics/bullet/DebugDrawHelper.hx @@ -210,7 +210,7 @@ class DebugDrawHelper { public function getDebugMode(): DebugDrawMode { #if js - return DebugDrawMode; + return debugDrawMode; #elseif hl return physicsWorld.getDebugDrawMode(); #else From 30cab4d79bfe6f0bae7c2ad8e9f0c60cfa5ae6fd Mon Sep 17 00:00:00 2001 From: Onek8 Date: Tue, 13 May 2025 16:55:45 +0000 Subject: [PATCH 23/23] Update leenkx/Sources/leenkx/trait/physics/bullet/DebugDrawHelper.hx --- leenkx/Sources/leenkx/trait/physics/bullet/DebugDrawHelper.hx | 1 + 1 file changed, 1 insertion(+) diff --git a/leenkx/Sources/leenkx/trait/physics/bullet/DebugDrawHelper.hx b/leenkx/Sources/leenkx/trait/physics/bullet/DebugDrawHelper.hx index b7ce809..8b067a3 100644 --- a/leenkx/Sources/leenkx/trait/physics/bullet/DebugDrawHelper.hx +++ b/leenkx/Sources/leenkx/trait/physics/bullet/DebugDrawHelper.hx @@ -35,6 +35,7 @@ class DebugDrawHelper { public function new(physicsWorld: PhysicsWorld, debugDrawMode: DebugDrawMode) { this.physicsWorld = physicsWorld; + this.debugDrawMode = debugDrawMode; #if lnx_ui iron.data.Data.getFont(Canvas.defaultFontName, function(defaultFont: kha.Font) {