From 7428ee7fedd60f44e80348ad16191531e8ae3196 Mon Sep 17 00:00:00 2001 From: Daniel Bross Date: Sat, 29 Mar 2025 00:18:27 +0100 Subject: [PATCH] Physics improvements --- core/mesh_entity.jai | 11 ++++----- physics/physics.jai | 58 +++++++++++++++++++++++++++++++++++--------- renderer/model.jai | 6 ++--- 3 files changed, 53 insertions(+), 22 deletions(-) diff --git a/core/mesh_entity.jai b/core/mesh_entity.jai index afb6866..db9691a 100644 --- a/core/mesh_entity.jai +++ b/core/mesh_entity.jai @@ -9,6 +9,9 @@ Mesh_Entity :: struct { init_entity :: (e: *Mesh_Entity) { if e.model_path.count > 0 { load_model_into_entity(e, get_or_load_model(e.model_path)); + e.flags |= .COLLISION | .STATIC; + e.collider.type = .MESH; + e.collider.bake_mode = .FULL_MESH; } } @@ -19,8 +22,8 @@ Mesh_Entity_Info :: struct { } mesh_entity_visitor :: (info : *File_Visit_Info, files: *[..] Mesh_Entity_Info) { - if info.is_directory - return; + if info.is_directory return; + path, basename, ext := path_decomp (info.full_name); // Entity text files @@ -35,8 +38,4 @@ find_all_mesh_entities :: () { path := "../assets/models/level_design/"; visit_files(path, true, *mesh_entity_files, mesh_entity_visitor); - - for mesh_entity_files { - print(it.full_path); - } } \ No newline at end of file diff --git a/physics/physics.jai b/physics/physics.jai index 8358b1d..2816dd8 100644 --- a/physics/physics.jai +++ b/physics/physics.jai @@ -43,9 +43,19 @@ Collision_Layers :: enum_flags { ALL :: .LAYER1 | LAYER2 | .LAYER3 | .LAYER4 | .LAYER5 | .LAYER6 | .LAYER7 | .LAYER8 | .LAYER9 | .LAYER10; } +Collider_Bake_Mode :: enum { + AABB; + + FULL_MESH; + + ONLY_FACING_UP; +} + Collider :: struct { type : Collider_Type; + bake_mode: Collider_Bake_Mode; + layer: Collision_Layers = .LAYER1; collides_with_layers: Collision_Layers = .LAYER1; @@ -78,19 +88,43 @@ Physics_Body :: struct { } update_mesh_collider :: (e: *Entity) { - if e.collider.mesh.vertices.count == 0 { - array_resize(*e.collider.mesh.vertices, 8); - } + if e.collider.bake_mode == { + case .AABB; { + if e.collider.mesh.vertices.count == 0 { + array_resize(*e.collider.mesh.vertices, 8); + } - m := e.transform.model_matrix; - e.collider.mesh.vertices[0] = transform_position(e.collider.aabb.min, m); - e.collider.mesh.vertices[1] = transform_position(e.collider.aabb.max, m); - e.collider.mesh.vertices[2] = transform_position(.{e.collider.aabb.min.x, e.collider.aabb.min.y, e.collider.aabb.max.z}, m); - e.collider.mesh.vertices[3] = transform_position(.{e.collider.aabb.max.x, e.collider.aabb.min.y, e.collider.aabb.max.z}, m); - e.collider.mesh.vertices[4] = transform_position(.{e.collider.aabb.max.x, e.collider.aabb.min.y, e.collider.aabb.min.z}, m); - e.collider.mesh.vertices[5] = transform_position(.{e.collider.aabb.min.x, e.collider.aabb.max.y, e.collider.aabb.max.z}, m); - e.collider.mesh.vertices[6] = transform_position(.{e.collider.aabb.max.x, e.collider.aabb.max.y, e.collider.aabb.min.z}, m); - e.collider.mesh.vertices[7] = transform_position(.{e.collider.aabb.min.x, e.collider.aabb.max.y, e.collider.aabb.min.z}, m); + m := e.transform.model_matrix; + e.collider.mesh.vertices[0] = transform_position(e.collider.aabb.min, m); + e.collider.mesh.vertices[1] = transform_position(e.collider.aabb.max, m); + e.collider.mesh.vertices[2] = transform_position(.{e.collider.aabb.min.x, e.collider.aabb.min.y, e.collider.aabb.max.z}, m); + e.collider.mesh.vertices[3] = transform_position(.{e.collider.aabb.max.x, e.collider.aabb.min.y, e.collider.aabb.max.z}, m); + e.collider.mesh.vertices[4] = transform_position(.{e.collider.aabb.max.x, e.collider.aabb.min.y, e.collider.aabb.min.z}, m); + e.collider.mesh.vertices[5] = transform_position(.{e.collider.aabb.min.x, e.collider.aabb.max.y, e.collider.aabb.max.z}, m); + e.collider.mesh.vertices[6] = transform_position(.{e.collider.aabb.max.x, e.collider.aabb.max.y, e.collider.aabb.min.z}, m); + e.collider.mesh.vertices[7] = transform_position(.{e.collider.aabb.min.x, e.collider.aabb.max.y, e.collider.aabb.min.z}, m); + } + case .FULL_MESH; { + //update_entity_transform(e); + + model := get_model_by_handle(e.renderable.model); + if model { + for i: 0..e.renderable.num_nodes-1 { + render_node := e.renderable.nodes[i]; + model_node := model.nodes[i]; + + for mesh_handle: model_node.meshes { + mesh := parray_get(*engine.renderer.meshes, mesh_handle); + + for p: mesh.positions { + position := transform_position(p, render_node.transform.world_matrix); + array_add(*e.collider.mesh.vertices, position); + } + } + } + } + } + } e.collider.mesh.is_baked = true; } diff --git a/renderer/model.jai b/renderer/model.jai index 3ecafff..0f2b3bc 100644 --- a/renderer/model.jai +++ b/renderer/model.jai @@ -384,9 +384,7 @@ parse_fbx_node :: (model: *Model, fbx_node: *ufbx_node) { // } //} - array_add(*node.meshes, parray_add(*engine.renderer.meshes, mesh));struct { - path: string; - } + array_add(*node.meshes, parray_add(*engine.renderer.meshes, mesh)); array_add(*node.material_defaults, model.materials[mesh_mat.material.typed_id]); // @Incomplete } } @@ -673,7 +671,7 @@ load_fbx :: (path: string) -> Model_Handle, bool { get_or_load_model :: (path: string) -> Model_Handle { for * engine.renderer.model_lib { if it.path == path { - return xx (it_index + 1); + return cast(Model_Handle)(it_index + 1); } }