Mesh_Entities!
This commit is contained in:
@@ -97,7 +97,10 @@ sync_engine_buffers :: () {
|
||||
if it.flags & .RENDERABLE {
|
||||
if it.renderable.type == {
|
||||
case .MODEL; {
|
||||
for n, i: it.renderable.model.nodes {
|
||||
if it.renderable.model == 0 continue;
|
||||
|
||||
model := get_model_by_handle(it.renderable.model);
|
||||
for n, i: model.nodes {
|
||||
if n.meshes.count > 0 {
|
||||
node_data := *it.renderable.nodes[i];
|
||||
upload_data_to_buffer(engine.renderer, node_data.transform_buffer, *node_data.transform.world_matrix, size_of(Matrix4));
|
||||
|
||||
@@ -1,5 +1,10 @@
|
||||
Node_Handle :: #type, distinct u32;
|
||||
Material_Handle :: #type, distinct u32;
|
||||
Model_Handle :: #type, isa u32;
|
||||
|
||||
Model_Asset :: struct {
|
||||
path: string;
|
||||
}
|
||||
|
||||
MAX_BONES :: 128;
|
||||
MAX_WEIGHTS :: 4;
|
||||
@@ -66,7 +71,9 @@ Model :: struct {
|
||||
materials : [..] Model_Material;
|
||||
}
|
||||
|
||||
get_first_mesh_from_model :: (model: Model) -> Mesh_Handle, bool {
|
||||
get_first_mesh_from_model :: (handle: Model_Handle) -> Mesh_Handle, bool {
|
||||
model := get_model_by_handle(handle);
|
||||
|
||||
for model.nodes {
|
||||
for m: it.meshes {
|
||||
return m, true;
|
||||
@@ -377,7 +384,9 @@ parse_fbx_node :: (model: *Model, fbx_node: *ufbx_node) {
|
||||
// }
|
||||
//}
|
||||
|
||||
array_add(*node.meshes, parray_add(*engine.renderer.meshes, mesh));
|
||||
array_add(*node.meshes, parray_add(*engine.renderer.meshes, mesh));struct {
|
||||
path: string;
|
||||
}
|
||||
array_add(*node.material_defaults, model.materials[mesh_mat.material.typed_id]); // @Incomplete
|
||||
}
|
||||
}
|
||||
@@ -580,7 +589,7 @@ load_fbx_texture :: (map: ufbx_material_map, format: Format) -> Texture_Handle {
|
||||
return 0;
|
||||
}
|
||||
|
||||
load_fbx :: (path: string) -> *Model, bool {
|
||||
load_fbx :: (path: string) -> Model_Handle, bool {
|
||||
opts : ufbx_load_opts = .{};
|
||||
opts.load_external_files = true;
|
||||
opts.generate_missing_normals = true;
|
||||
@@ -597,10 +606,11 @@ load_fbx :: (path: string) -> *Model, bool {
|
||||
|
||||
if scene == null {
|
||||
log_error("FBX '%' could not be loaded", path);
|
||||
return null, false;
|
||||
return 0, false;
|
||||
}
|
||||
|
||||
model, locator := find_and_occupy_empty_slot(*engine.renderer.model_lib);
|
||||
model : Model;
|
||||
|
||||
model.path = copy_string(path);
|
||||
model.name = copy_string(path);
|
||||
|
||||
@@ -643,24 +653,27 @@ load_fbx :: (path: string) -> *Model, bool {
|
||||
|
||||
for i: 0..scene.nodes.count-1 {
|
||||
node := scene.nodes.data[i];
|
||||
parse_fbx_node(model, node);
|
||||
parse_fbx_node(*model, node);
|
||||
}
|
||||
|
||||
// Load animations
|
||||
array_resize(*model.animations, xx scene.anim_stacks.count);
|
||||
for 0..model.animations.count-1 {
|
||||
parse_anim_stack(*model.animations[it], scene.anim_stacks.data[it], scene, model);
|
||||
parse_anim_stack(*model.animations[it], scene.anim_stacks.data[it], scene, *model);
|
||||
}
|
||||
|
||||
ufbx_free_scene(scene);
|
||||
|
||||
return model, false;
|
||||
array_add(*engine.renderer.model_lib, model);
|
||||
handle := cast(Model_Handle)engine.renderer.model_lib.count;
|
||||
|
||||
return handle, false;
|
||||
}
|
||||
|
||||
get_or_load_model :: (path: string) -> *Model {
|
||||
get_or_load_model :: (path: string) -> Model_Handle {
|
||||
for * engine.renderer.model_lib {
|
||||
if it.path == path {
|
||||
return it;
|
||||
return xx (it_index + 1);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -586,7 +586,7 @@ Renderer :: struct {
|
||||
fonts : [..] Font;
|
||||
|
||||
render_graph : *Render_Graph;
|
||||
model_lib : Bucket_Array(Model, 128);
|
||||
model_lib : Static_Array(Model, 128);
|
||||
|
||||
callbacks : struct {
|
||||
get_custom_material_parameter_mapping: (mapping_str: string) -> bool, Material_Mapping_Info;
|
||||
@@ -605,7 +605,7 @@ Renderer :: struct {
|
||||
render_target_height: u32;
|
||||
|
||||
default_models : struct {
|
||||
sphere: Model;
|
||||
sphere: Model_Handle;
|
||||
}
|
||||
|
||||
default_meshes : struct {
|
||||
@@ -1627,6 +1627,12 @@ create_material_from_pipeline :: (pipeline: Pipeline_State_Handle) -> Material_O
|
||||
return material;
|
||||
}
|
||||
|
||||
get_model_by_handle :: (handle: Model_Handle) -> *Model {
|
||||
if handle == 0 return null;
|
||||
|
||||
return *engine.renderer.model_lib[handle-1];
|
||||
}
|
||||
|
||||
check_for_shader_modifications :: () {
|
||||
changed, needs_wait, wait_seconds := process_changes(*engine.renderer.watcher);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user