Mesh_Entities!

This commit is contained in:
2025-03-26 23:40:35 +01:00
parent 74268015a0
commit b6b1371af5
12 changed files with 145 additions and 31 deletions

View File

@@ -31,7 +31,6 @@ Node_Render_Data :: struct {
enabled : bool = true;
transform: Transform;
material : Entity_Material;
has_sampled_animation: bool;
// Buffers
transform_buffer: Buffer_Handle;
@@ -45,9 +44,11 @@ Renderable :: struct {
visible: bool = true;
type : Renderable_Type; @DontSerialize
model: *Model; @DontSerialize
model: Model_Handle; @DontSerialize
nodes: [MAX_NODES] Node_Render_Data; @DontSerialize
num_nodes: s64; @DontSerialize
//node_buffer : Buffer_Handle; // Structure buffer with all transform + material // TODO
}
MAX_CHILDREN :: 16;
@@ -114,8 +115,10 @@ set_parent :: (e: *Entity, parent: *Entity, node_name: string = "") {
set_base_color :: (e: *Entity, color: Vector4, node_name: string = "") {
if e.renderable.type == .MODEL {
model := get_model_by_handle(e.renderable.model);
for i: 0..e.renderable.num_nodes-1 {
actual_node := e.renderable.model.nodes[i];
actual_node := model.nodes[i];
if node_name.count == 0 || node_name == actual_node.name {
data := *e.renderable.nodes[i];
if data.material_buffer > 0 {
@@ -140,13 +143,15 @@ set_node_enabled :: (e: *Entity, node_name: string, enabled : bool) {
}
}
load_model_into_entity :: (e: *Entity, model: *Model) {
load_model_into_entity :: (e: *Entity, handle: Model_Handle) {
model := get_model_by_handle(handle);
e.renderable.type = .MODEL;
assert(model.nodes.count <= MAX_NODES);
e.renderable.num_nodes = model.nodes.count;
e.renderable.model = model;
e.renderable.model = handle;
for *model.nodes {
data : Node_Render_Data;

42
core/mesh_entity.jai Normal file
View File

@@ -0,0 +1,42 @@
Mesh_Entity :: struct {
using #as entity: Entity;
entity.flags = .RENDERABLE;
entity.type = Mesh_Entity;
model_path: string;
}
init_entity :: (e: *Mesh_Entity) {
if e.model_path.count > 0 {
load_model_into_entity(e, get_or_load_model(e.model_path));
}
}
mesh_entity_files : [..] Mesh_Entity_Info;
Mesh_Entity_Info :: struct {
full_path: string;
}
mesh_entity_visitor :: (info : *File_Visit_Info, files: *[..] Mesh_Entity_Info) {
if info.is_directory
return;
path, basename, ext := path_decomp (info.full_name);
// Entity text files
if ext == "fbx" {
file_info : Mesh_Entity_Info;
file_info.full_path = copy_string(info.full_name);
array_add(files, file_info);
}
}
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);
}
}

View File

@@ -194,7 +194,11 @@ ray_entity_intersect :: (ray: Ray, e: *Entity) -> bool, float, Vector3 {
closest : float = 10000000;
closest_normal : Vector3;
for n: e.renderable.model.nodes {
if e.renderable.model == 0 return false, 0.0, .{};
model := get_model_by_handle(e.renderable.model);
for n: model.nodes {
render_node := e.renderable.nodes[it_index];
for handle: n.meshes {
m := parray_get(*engine.renderer.meshes, handle);

View File

@@ -248,9 +248,11 @@ update_entity_node :: (e: *Entity, model_node: Node, index: s64, parent_matrix:
n.transform.world_matrix = parent_matrix * n.transform.model_matrix;
model := get_model_by_handle(e.renderable.model);
for children_index: 0..model_node.children.count-1 {
index := model_node.children[children_index]-1;
mn := e.renderable.model.nodes[index];
mn := model.nodes[index];
update_entity_node(e, mn, xx index, n.transform.world_matrix);
}
}
@@ -270,9 +272,12 @@ update_entity_transform :: (e: *Entity, parent_matrix: Matrix4 = Matrix4_Identit
}
if e.flags & .RENDERABLE {
for model_node, i: e.renderable.model.nodes {
if model_node.parent == 0 {
update_entity_node(e, model_node, i, e.transform.world_matrix);
if e.renderable.model != 0 {
model := get_model_by_handle(e.renderable.model);
for model_node, i: model.nodes {
if model_node.parent == 0 {
update_entity_node(e, model_node, i, e.transform.world_matrix);
}
}
}
}