diff options
| author | skal <pascal.massimino@gmail.com> | 2026-02-08 17:23:52 +0100 |
|---|---|---|
| committer | skal <pascal.massimino@gmail.com> | 2026-02-08 17:23:52 +0100 |
| commit | 41b64071beba9dd62a2a8f4e915ea104605a4964 (patch) | |
| tree | 96e72f2ff6da2b17b304714486cd2741d75a31f9 /src/3d | |
| parent | 45f942ea79647be9f05fe1fe43548b030d191d45 (diff) | |
fix(3d): Handle user_data meshes in visual debug wireframe rendering
- Check user_data before calling GetMeshAsset() in renderer_draw.cc
- Prevents crash when rendering manually loaded OBJ meshes with --debug
- Remove duplicate wireframe call in test_mesh.cc (now handled by renderer)
- Keep add_mesh_normals() call (not auto-handled by renderer)
Fixes: Bus error when running 'test_mesh house.obj --debug'
Root cause: GetMeshAsset(0) on non-asset meshes
Test: All 32 tests pass, test_mesh works with --debug flag
Diffstat (limited to 'src/3d')
| -rw-r--r-- | src/3d/renderer_draw.cc | 33 |
1 files changed, 24 insertions, 9 deletions
diff --git a/src/3d/renderer_draw.cc b/src/3d/renderer_draw.cc index 7a95924..2b19787 100644 --- a/src/3d/renderer_draw.cc +++ b/src/3d/renderer_draw.cc @@ -1,9 +1,9 @@ // This file is part of the 64k demo project. // It implements the drawing logic for Renderer3D. +#include "3d/plane_data.h" // Include for PlaneData struct #include "3d/renderer.h" #include "util/asset_manager_utils.h" -#include "3d/plane_data.h" // Include for PlaneData struct #include <algorithm> #include <vector> @@ -59,11 +59,13 @@ void Renderer3D::update_uniforms(const Scene& scene, const Camera& camera, float plane_distance = 0.0f; if (obj.type == ObjectType::PLANE && obj.shared_user_data) { - // Safely cast shared_user_data to PlaneData* and get distance - plane_distance = static_cast<PlaneData*>(obj.shared_user_data.get())->distance; + // Safely cast shared_user_data to PlaneData* and get distance + plane_distance = + static_cast<PlaneData*>(obj.shared_user_data.get())->distance; } - data.params = vec4(type_id, plane_distance, obj.local_extent.x, obj.local_extent.y); + data.params = + vec4(type_id, plane_distance, obj.local_extent.x, obj.local_extent.y); obj_data.push_back(data); if (obj_data.size() >= kMaxObjects) break; @@ -197,12 +199,25 @@ void Renderer3D::draw(WGPURenderPassEncoder pass, const Scene& scene, if (obj.type == ObjectType::TORUS) { extent = vec3(1.5f, 0.5f, 1.5f); } else if (obj.type == ObjectType::MESH) { - MeshAsset mesh = GetMeshAsset(obj.mesh_asset_id); - if (mesh.num_indices > 0) { + if (obj.user_data) { + // Manually loaded mesh (e.g., test_mesh tool) + struct MeshData { + std::vector<MeshVertex> vertices; + std::vector<uint32_t> indices; + }; + auto* data = (MeshData*)obj.user_data; visual_debug_.add_mesh_wireframe( - obj.get_model_matrix(), mesh.num_vertices, mesh.vertices, - mesh.num_indices, mesh.indices, - vec3(0.0f, 1.0f, 1.0f)); // Cyan wireframe + obj.get_model_matrix(), (uint32_t)data->vertices.size(), + data->vertices.data(), (uint32_t)data->indices.size(), + data->indices.data(), vec3(0.0f, 1.0f, 1.0f)); // Cyan wireframe + } else { + MeshAsset mesh = GetMeshAsset(obj.mesh_asset_id); + if (mesh.num_indices > 0) { + visual_debug_.add_mesh_wireframe( + obj.get_model_matrix(), mesh.num_vertices, mesh.vertices, + mesh.num_indices, mesh.indices, + vec3(0.0f, 1.0f, 1.0f)); // Cyan wireframe + } } } else { extent = vec3(1.0f, 1.0f, 1.0f); |
