summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorskal <pascal.massimino@gmail.com>2026-02-08 17:23:52 +0100
committerskal <pascal.massimino@gmail.com>2026-02-08 17:23:52 +0100
commit41b64071beba9dd62a2a8f4e915ea104605a4964 (patch)
tree96e72f2ff6da2b17b304714486cd2741d75a31f9 /src
parent45f942ea79647be9f05fe1fe43548b030d191d45 (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')
-rw-r--r--src/3d/renderer_draw.cc33
-rw-r--r--src/tests/test_mesh.cc6
2 files changed, 25 insertions, 14 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);
diff --git a/src/tests/test_mesh.cc b/src/tests/test_mesh.cc
index 0865f80..2129bc8 100644
--- a/src/tests/test_mesh.cc
+++ b/src/tests/test_mesh.cc
@@ -386,11 +386,7 @@ int main(int argc, char** argv) {
dbg.add_mesh_normals(g_scene.objects[1].get_model_matrix(),
(uint32_t)data->vertices.size(),
data->vertices.data());
- dbg.add_mesh_wireframe(g_scene.objects[1].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));
+ // Wireframe is now handled automatically by renderer
}
#endif /* !defined(STRIP_ALL) */