From a4bfd2f1aae7274eaeb632a8b60a75357da7b410 Mon Sep 17 00:00:00 2001 From: skal Date: Mon, 2 Feb 2026 16:52:25 +0100 Subject: fix(3d): Tighten torus bounding box and restore object textures - Adjusted Torus proxy hull in vs_main to fit unit dimensions (1.4x0.4x1.4). - Updated VisualDebug to support per-object local extents, improving wireframe accuracy. - Restored procedural floor grid and SDF bump mapping in the fragment shader. - Added varied scaling to test scene objects to verify transform robustness. --- src/3d/renderer.cc | 27 +++++++++++++++++---------- src/3d/visual_debug.cc | 18 +++++++++++------- src/3d/visual_debug.h | 3 ++- 3 files changed, 30 insertions(+), 18 deletions(-) (limited to 'src/3d') diff --git a/src/3d/renderer.cc b/src/3d/renderer.cc index 021374a..45276ea 100644 --- a/src/3d/renderer.cc +++ b/src/3d/renderer.cc @@ -61,8 +61,17 @@ fn vs_main(@builtin(vertex_index) vertex_index: u32, vec3(-1.0, -1.0, -1.0), vec3(-1.0, 1.0, 1.0), vec3(-1.0, 1.0, -1.0) ); - let p = pos[vertex_index]; + var p = pos[vertex_index]; let obj = object_data.objects[instance_index]; + let obj_type = obj.params.x; + + // Tight fit for Torus proxy hull (major radius 1.0, minor 0.4) + if (obj_type == 3.0) { + p.x = p.x * 1.5; + p.z = p.z * 1.5; + p.y = p.y * 0.5; + } + let world_pos = obj.model * vec4(p, 1.0); let clip_pos = globals.view_proj * world_pos; @@ -104,21 +113,16 @@ fn get_dist(p: vec3, obj_type: f32) -> f32 { fn map_scene(p: vec3, skip_idx: u32) -> f32 { var d = 1000.0; let count = u32(globals.params.x); - for (var i = 0u; i < count; i = i + 1u) { if (i == skip_idx) { continue; } let obj = object_data.objects[i]; let obj_type = obj.params.x; if (obj_type <= 0.0) { continue; } - let q = (obj.inv_model * vec4(p, 1.0)).xyz; - - // Extraction of approx min scale for distance normalization let scale_x = length(obj.model[0].xyz); let scale_y = length(obj.model[1].xyz); let scale_z = length(obj.model[2].xyz); let s = min(scale_x, min(scale_y, scale_z)); - d = min(d, get_dist(q, obj_type) * s); } return d; @@ -127,13 +131,12 @@ fn map_scene(p: vec3, skip_idx: u32) -> f32 { fn calc_shadow(ro: vec3, rd: vec3, tmin: f32, tmax: f32, skip_idx: u32) -> f32 { var res = 1.0; var t = tmin; - if (t < 0.1) { t = 0.1; } // Robust bias to avoid self-shadowing - + if (t < 0.05) { t = 0.05; } for (var i = 0; i < 32; i = i + 1) { let h = map_scene(ro + rd * t, skip_idx); if (h < 0.001) { return 0.0; } res = min(res, 16.0 * h / t); // Standard k=16 - t = t + clamp(h, 0.02, 0.5); + t = t + clamp(h, 0.02, 0.4); if (t > tmax) { break; } } return clamp(res, 0.0, 1.0); @@ -517,7 +520,11 @@ void Renderer3D::draw(WGPURenderPassEncoder pass, const Scene& scene, #if !defined(STRIP_ALL) if (s_debug_enabled_) { for (const auto& obj : scene.objects) { - visual_debug_.add_box(obj.get_model_matrix(), + vec3 extent(1.0f, 1.0f, 1.0f); + if (obj.type == ObjectType::TORUS) { + extent = vec3(1.5f, 0.5f, 1.5f); + } + visual_debug_.add_box(obj.get_model_matrix(), extent, vec3(1.0f, 1.0f, 0.0f)); // Yellow boxes } diff --git a/src/3d/visual_debug.cc b/src/3d/visual_debug.cc index 99d4b9f..c6c5c51 100644 --- a/src/3d/visual_debug.cc +++ b/src/3d/visual_debug.cc @@ -173,13 +173,17 @@ void VisualDebug::create_pipeline(WGPUTextureFormat format) { wgpuShaderModuleRelease(shader_module); } -void VisualDebug::add_box(const mat4& transform, const vec3& color) { - // 8 corners of unit cube [-1, 1] - vec4 p[] = { - transform * vec4(-1, -1, -1, 1), transform * vec4(1, -1, -1, 1), - transform * vec4(1, 1, -1, 1), transform * vec4(-1, 1, -1, 1), - transform * vec4(-1, -1, 1, 1), transform * vec4(1, -1, 1, 1), - transform * vec4(1, 1, 1, 1), transform * vec4(-1, 1, 1, 1)}; +void VisualDebug::add_box(const mat4& transform, const vec3& local_extent, + const vec3& color) { + float lx = local_extent.x; + float ly = local_extent.y; + float lz = local_extent.z; + + // 8 corners of transformed box + vec4 p[] = {transform * vec4(-lx, -ly, -lz, 1), transform * vec4(lx, -ly, -lz, 1), + transform * vec4(lx, ly, -lz, 1), transform * vec4(-lx, ly, -lz, 1), + transform * vec4(-lx, -ly, lz, 1), transform * vec4(lx, -ly, lz, 1), + transform * vec4(lx, ly, lz, 1), transform * vec4(-lx, ly, lz, 1)}; // 12 edges (each 2 vertices) DebugLine edges[] = { diff --git a/src/3d/visual_debug.h b/src/3d/visual_debug.h index a58d913..456cb10 100644 --- a/src/3d/visual_debug.h +++ b/src/3d/visual_debug.h @@ -22,7 +22,8 @@ class VisualDebug { void shutdown(); // Queue a wireframe box for rendering this frame - void add_box(const mat4& transform, const vec3& color); + void add_box(const mat4& transform, const vec3& local_extent, + const vec3& color); // Render all queued primitives and clear the queue void render(WGPURenderPassEncoder pass, const mat4& view_proj); -- cgit v1.2.3