Physics improvements
This commit is contained in:
@@ -9,6 +9,9 @@ Mesh_Entity :: struct {
|
|||||||
init_entity :: (e: *Mesh_Entity) {
|
init_entity :: (e: *Mesh_Entity) {
|
||||||
if e.model_path.count > 0 {
|
if e.model_path.count > 0 {
|
||||||
load_model_into_entity(e, get_or_load_model(e.model_path));
|
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) {
|
mesh_entity_visitor :: (info : *File_Visit_Info, files: *[..] Mesh_Entity_Info) {
|
||||||
if info.is_directory
|
if info.is_directory return;
|
||||||
return;
|
|
||||||
path, basename, ext := path_decomp (info.full_name);
|
path, basename, ext := path_decomp (info.full_name);
|
||||||
|
|
||||||
// Entity text files
|
// Entity text files
|
||||||
@@ -35,8 +38,4 @@ find_all_mesh_entities :: () {
|
|||||||
path := "../assets/models/level_design/";
|
path := "../assets/models/level_design/";
|
||||||
|
|
||||||
visit_files(path, true, *mesh_entity_files, mesh_entity_visitor);
|
visit_files(path, true, *mesh_entity_files, mesh_entity_visitor);
|
||||||
|
|
||||||
for mesh_entity_files {
|
|
||||||
print(it.full_path);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
@@ -43,9 +43,19 @@ Collision_Layers :: enum_flags {
|
|||||||
ALL :: .LAYER1 | LAYER2 | .LAYER3 | .LAYER4 | .LAYER5 | .LAYER6 | .LAYER7 | .LAYER8 | .LAYER9 | .LAYER10;
|
ALL :: .LAYER1 | LAYER2 | .LAYER3 | .LAYER4 | .LAYER5 | .LAYER6 | .LAYER7 | .LAYER8 | .LAYER9 | .LAYER10;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Collider_Bake_Mode :: enum {
|
||||||
|
AABB;
|
||||||
|
|
||||||
|
FULL_MESH;
|
||||||
|
|
||||||
|
ONLY_FACING_UP;
|
||||||
|
}
|
||||||
|
|
||||||
Collider :: struct {
|
Collider :: struct {
|
||||||
type : Collider_Type;
|
type : Collider_Type;
|
||||||
|
|
||||||
|
bake_mode: Collider_Bake_Mode;
|
||||||
|
|
||||||
layer: Collision_Layers = .LAYER1;
|
layer: Collision_Layers = .LAYER1;
|
||||||
collides_with_layers: Collision_Layers = .LAYER1;
|
collides_with_layers: Collision_Layers = .LAYER1;
|
||||||
|
|
||||||
@@ -78,19 +88,43 @@ Physics_Body :: struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
update_mesh_collider :: (e: *Entity) {
|
update_mesh_collider :: (e: *Entity) {
|
||||||
if e.collider.mesh.vertices.count == 0 {
|
if e.collider.bake_mode == {
|
||||||
array_resize(*e.collider.mesh.vertices, 8);
|
case .AABB; {
|
||||||
}
|
if e.collider.mesh.vertices.count == 0 {
|
||||||
|
array_resize(*e.collider.mesh.vertices, 8);
|
||||||
|
}
|
||||||
|
|
||||||
m := e.transform.model_matrix;
|
m := e.transform.model_matrix;
|
||||||
e.collider.mesh.vertices[0] = transform_position(e.collider.aabb.min, m);
|
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[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[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[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[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[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[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);
|
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;
|
e.collider.mesh.is_baked = true;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -384,9 +384,7 @@ parse_fbx_node :: (model: *Model, fbx_node: *ufbx_node) {
|
|||||||
// }
|
// }
|
||||||
//}
|
//}
|
||||||
|
|
||||||
array_add(*node.meshes, parray_add(*engine.renderer.meshes, mesh));struct {
|
array_add(*node.meshes, parray_add(*engine.renderer.meshes, mesh));
|
||||||
path: string;
|
|
||||||
}
|
|
||||||
array_add(*node.material_defaults, model.materials[mesh_mat.material.typed_id]); // @Incomplete
|
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 {
|
get_or_load_model :: (path: string) -> Model_Handle {
|
||||||
for * engine.renderer.model_lib {
|
for * engine.renderer.model_lib {
|
||||||
if it.path == path {
|
if it.path == path {
|
||||||
return xx (it_index + 1);
|
return cast(Model_Handle)(it_index + 1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user