From a67219045991e10fcbde03eb8ba294dfb9120333 Mon Sep 17 00:00:00 2001 From: Zack Buhman Date: Fri, 30 Jan 2026 10:10:31 -0600 Subject: [PATCH] render instance controllers --- Makefile | 2 - collada/header.py | 3 + include/collada_scene.hpp | 9 ++- include/collada_types.hpp | 4 +- rc/main.rc | 1 - src/collada_scene.cpp | 77 ++++++++++++------- .../curve_interpolation.cpp | 4 +- 7 files changed, 67 insertions(+), 33 deletions(-) diff --git a/Makefile b/Makefile index 528ab1b..8d96dfa 100644 --- a/Makefile +++ b/Makefile @@ -79,8 +79,6 @@ src/scenes/%.cpp: scenes/%.DAE include/scenes/%.hpp @mkdir -p $(@D) PYTHONPATH=. python -m collada.main $< $@ $(<:.DAE=.vtx) $(<:.DAE=.idx) $(<:.DAE=.vjw) rc/$(notdir $(<:.DAE=.rc)) $(notdir $(<:.DAE=.mk)) -# $(BUILD_TYPE)/curve_interpolation.res \ - OBJS = \ $(BUILD_TYPE)/main.res \ $(BUILD_TYPE)/robot_player.obj \ diff --git a/collada/header.py b/collada/header.py index d9b37f7..aabaa49 100644 --- a/collada/header.py +++ b/collada/header.py @@ -933,6 +933,7 @@ def render_controller(state, collada, controller): assert type(controller.control_element) == types.Skin skin = controller.control_element geometry = collada.lookup(skin.source, types.Geometry) + geometry_name = sanitize_name(state, geometry.id, geometry) vertex_index_table = state.geometry__vertex_index_tables[geometry.id] # this is a special index buffer that contains mixed floats/ints, # and needs to be packed accordingly @@ -948,6 +949,8 @@ def render_controller(state, collada, controller): yield f"controller const controller_{controller_name} = {{" yield ".skin = {" + yield f".geometry = &geometry_{geometry_name}," + yield "" yield f".inverse_bind_matrices = inverse_bind_matrices_{controller_name}," yield "" yield f".vertex_buffer_offset = {vertex_buffer_offset}," diff --git a/include/collada_scene.hpp b/include/collada_scene.hpp index 8649f9f..63a0ccd 100644 --- a/include/collada_scene.hpp +++ b/include/collada_scene.hpp @@ -65,8 +65,13 @@ namespace collada_scene { node_instance const& node_instance, int light_index); - void render_geometries(collada::instance_geometry const * const instance_geometries, - int const instance_geometries_count); + void render_geometry(collada::geometry const& geometry, + collada::instance_material const * const instance_materials, + int const instance_materials_count); + void render_instance_geometries(collada::instance_geometry const * const instance_geometries, + int const instance_geometries_count); + void render_instance_controllers(collada::instance_controller const * const instance_controllers, + int const instance_controllers_count); void set_material(collada::effect const& effect); void set_color_or_texture(collada::color_or_texture const& color_or_texture, ID3D10EffectVectorVariable * pVectorVariable, diff --git a/include/collada_types.hpp b/include/collada_types.hpp index 3626d8b..85db681 100644 --- a/include/collada_types.hpp +++ b/include/collada_types.hpp @@ -258,6 +258,8 @@ namespace collada { }; struct skin { + geometry const * const geometry; // source + matrix const * const inverse_bind_matrices; // one per joint int const vertex_buffer_offset; @@ -271,7 +273,7 @@ namespace collada { struct instance_controller { controller const * const controller; - //node const * const skeleton; + //node const * const skeleton; // a reference to the root of the joint heirarchy int const * const joint_node_indices; // one per joint int const joint_count; diff --git a/rc/main.rc b/rc/main.rc index 7374c09..22dd08e 100644 --- a/rc/main.rc +++ b/rc/main.rc @@ -14,4 +14,3 @@ RES_COLLADA_SCENE_FXO RCDATA "collada_scene.fxo" RES_MODELS_CURVE_INTERPOLATION_VTX RCDATA "scenes/curve_interpolation/curve_interpolation.vtx" RES_MODELS_CURVE_INTERPOLATION_IDX RCDATA "scenes/curve_interpolation/curve_interpolation.idx" RES_MODELS_CURVE_INTERPOLATION_VJW RCDATA "scenes/curve_interpolation/curve_interpolation.vjw" - \ No newline at end of file diff --git a/src/collada_scene.cpp b/src/collada_scene.cpp index 63060cf..9bd88a2 100644 --- a/src/collada_scene.cpp +++ b/src/collada_scene.cpp @@ -422,37 +422,61 @@ namespace collada_scene { } } - void scene_state::render_geometries(instance_geometry const * const instance_geometries, - int const instance_geometries_count) + void scene_state::render_geometry(geometry const& geometry, + instance_material const * const instance_materials, + int const instance_materials_count) + { + mesh const& mesh = geometry.mesh; + + UINT strides[1] = { 3 * 3 * 4 }; + UINT offsets[1] = { (UINT)mesh.vertex_buffer_offset }; + g_pd3dDevice->IASetVertexBuffers(0, m_numBuffers, m_pVertexBuffers, strides, offsets); + g_pd3dDevice->IASetIndexBuffer(m_pIndexBuffer, DXGI_FORMAT_R32_UINT, mesh.index_buffer_offset); + + D3D10_TECHNIQUE_DESC techDesc; + g_pTechniqueBlinn->GetDesc(&techDesc); + + for (int j = 0; j < instance_materials_count; j++) { + instance_material const& instance_material = instance_materials[j]; + triangles const& triangles = mesh.triangles[instance_material.element_index]; + set_material(*instance_material.material->effect); + int texture_channels[4] = { + instance_material.emission.input_set, + instance_material.ambient.input_set, + instance_material.diffuse.input_set, + instance_material.specular.input_set, + }; + g_pTextureChannelVariable->SetIntVector(texture_channels); + + g_pTechniqueBlinn->GetPassByIndex(0)->Apply(0); + g_pd3dDevice->IASetInputLayout(m_pVertexLayouts[triangles.inputs_index]); + g_pd3dDevice->DrawIndexed(triangles.count * 3, triangles.index_offset, 0); + } + } + + void scene_state::render_instance_geometries(instance_geometry const * const instance_geometries, + int const instance_geometries_count) { for (int i = 0; i < instance_geometries_count; i++) { instance_geometry const &instance_geometry = instance_geometries[i]; - mesh const& mesh = instance_geometry.geometry->mesh; + geometry const& geometry = *instance_geometry.geometry; - UINT strides[1] = { 3 * 3 * 4 }; - UINT offsets[1] = { (UINT)mesh.vertex_buffer_offset }; - g_pd3dDevice->IASetVertexBuffers(0, m_numBuffers, m_pVertexBuffers, strides, offsets); - g_pd3dDevice->IASetIndexBuffer(m_pIndexBuffer, DXGI_FORMAT_R32_UINT, mesh.index_buffer_offset); + render_geometry(geometry, + instance_geometry.instance_materials, + instance_geometry.instance_materials_count); + } + } - D3D10_TECHNIQUE_DESC techDesc; - g_pTechniqueBlinn->GetDesc(&techDesc); + void scene_state::render_instance_controllers(instance_controller const * const instance_controllers, + int const instance_controllers_count) + { + for (int i = 0; i < instance_controllers_count; i++) { + instance_controller const &instance_controller = instance_controllers[i]; + geometry const& geometry = *instance_controller.controller->skin.geometry; - for (int j = 0; j < instance_geometry.instance_materials_count; j++) { - instance_material const& instance_material = instance_geometry.instance_materials[j]; - triangles const& triangles = mesh.triangles[instance_material.element_index]; - set_material(*instance_material.material->effect); - int texture_channels[4] = { - instance_material.emission.input_set, - instance_material.ambient.input_set, - instance_material.diffuse.input_set, - instance_material.specular.input_set, - }; - g_pTextureChannelVariable->SetIntVector(texture_channels); - - g_pTechniqueBlinn->GetPassByIndex(0)->Apply(0); - g_pd3dDevice->IASetInputLayout(m_pVertexLayouts[triangles.inputs_index]); - g_pd3dDevice->DrawIndexed(triangles.count * 3, triangles.index_offset, 0); - } + render_geometry(geometry, + instance_controller.instance_materials, + instance_controller.instance_materials_count); } } @@ -728,7 +752,8 @@ namespace collada_scene { g_pWorldVariable->SetMatrix((float *)&node_instance.world); - render_geometries(node.instance_geometries, node.instance_geometries_count); + render_instance_geometries(node.instance_geometries, node.instance_geometries_count); + render_instance_controllers(node.instance_controllers, node.instance_controllers_count); } } } diff --git a/src/scenes/curve_interpolation/curve_interpolation.cpp b/src/scenes/curve_interpolation/curve_interpolation.cpp index ca6088d..e0b53f4 100644 --- a/src/scenes/curve_interpolation/curve_interpolation.cpp +++ b/src/scenes/curve_interpolation/curve_interpolation.cpp @@ -1592,6 +1592,8 @@ matrix const inverse_bind_matrices_geom_box001_skin1[] = { controller const controller_geom_box001_skin1 = { .skin = { + .geometry = &geometry_geom_box001, + .inverse_bind_matrices = inverse_bind_matrices_geom_box001_skin1, .vertex_buffer_offset = 0, @@ -1993,8 +1995,8 @@ instance_light const instance_lights_node_geosphere[] = { channel const * const node_channels_node_geosphere[] = { &node_channel_node_geosphere_scale, - &node_channel_node_geosphere_scaleaxisrotation, &node_channel_node_geosphere_inversescaleaxisrotation, + &node_channel_node_geosphere_scaleaxisrotation, }; node const node_node_geosphere = {