diff options
| author | skal <pascal.massimino@gmail.com> | 2026-02-02 16:52:25 +0100 |
|---|---|---|
| committer | skal <pascal.massimino@gmail.com> | 2026-02-02 16:52:25 +0100 |
| commit | a4bfd2f1aae7274eaeb632a8b60a75357da7b410 (patch) | |
| tree | eeb881f20e0ba891dc27e4ca018ec3fd4712ef74 /src/3d/renderer.cc | |
| parent | 2184a1043d1a071cdc78303b2247145bf3f18c0b (diff) | |
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.
Diffstat (limited to 'src/3d/renderer.cc')
| -rw-r--r-- | src/3d/renderer.cc | 27 |
1 files changed, 17 insertions, 10 deletions
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<f32>(p, 1.0); let clip_pos = globals.view_proj * world_pos; @@ -104,21 +113,16 @@ fn get_dist(p: vec3<f32>, obj_type: f32) -> f32 { fn map_scene(p: vec3<f32>, 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<f32>(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<f32>, skip_idx: u32) -> f32 { fn calc_shadow(ro: vec3<f32>, rd: vec3<f32>, 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 } |
