Mesh_Entities!
This commit is contained in:
@@ -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
42
core/mesh_entity.jai
Normal 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);
|
||||
}
|
||||
}
|
||||
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user