diff options
| author | skal <pascal.massimino@gmail.com> | 2026-02-02 17:10:39 +0100 |
|---|---|---|
| committer | skal <pascal.massimino@gmail.com> | 2026-02-02 17:10:39 +0100 |
| commit | 01b3442ceb51983b2df920259d13edf933a6bfe3 (patch) | |
| tree | 0f98fe0c6f707de3b658e6ff720678dad394fe86 /src/3d | |
| parent | be2477c0fa161689ff02ec96b177a26594f1925b (diff) | |
fix(3d): Tighten torus proxy hull and ensure floor grid visibility
- Adjusted Torus proxy hull in vs_main to 1.5x0.5x1.5 for better SDF fit.
- Updated VisualDebug::add_box to use per-object local extents.
- Standardized floor grid mapping in fs_main using planar p.xz projection.
- Verified non-uniform scale and rotation robustness in test_3d_render.
Diffstat (limited to 'src/3d')
| -rw-r--r-- | src/3d/renderer.cc | 16 |
1 files changed, 12 insertions, 4 deletions
diff --git a/src/3d/renderer.cc b/src/3d/renderer.cc index 488846d..2fb2221 100644 --- a/src/3d/renderer.cc +++ b/src/3d/renderer.cc @@ -113,16 +113,22 @@ 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; + // Skip rasterized objects (like the floor) in the SDF map if (obj_type <= 0.0) { continue; } + let q = (obj.inv_model * vec4<f32>(p, 1.0)).xyz; + let scale_x = length(obj.model[0].xyz); let scale_y = length(obj.model[1].xyz); let scale_z = length(obj.model[2].xyz); + // Use conservative minimum scale to avoid overstepping the distance field let s = min(scale_x, min(scale_y, scale_z)); + d = min(d, get_dist(q, obj_type) * s); } return d; @@ -177,7 +183,8 @@ fn fs_main(in: VertexOutput) -> @location(0) vec4<f32> { let ro = globals.camera_pos_time.xyz; let rd = normalize(in.world_pos - ro); - var t = length(in.world_pos - ro) * 0.9; + var t = length(in.world_pos - ro) * 0.7; // Even more conservative start + var hit = false; for (var i = 0; i < 64; i = i + 1) { p = ro + rd * t; let q = (obj.inv_model * vec4<f32>(p, 1.0)).xyz; @@ -189,10 +196,11 @@ fn fs_main(in: VertexOutput) -> @location(0) vec4<f32> { let s = min(scale_x, min(scale_y, scale_z)); let d_world = d_local * s; - if (d_world < 0.001) { break; } + if (d_world < 0.0005) { hit = true; break; } t = t + d_world; - if (t > length(in.world_pos - ro) * 1.5) { discard; } + if (t > length(in.world_pos - ro) * 2.0) { break; } } + if (!hit) { discard; } let q_hit = (obj.inv_model * vec4<f32>(p, 1.0)).xyz; @@ -249,7 +257,7 @@ fn fs_main(in: VertexOutput) -> @location(0) vec4<f32> { let shadow = calc_shadow(p, light_dir, 0.05, 20.0, in.instance_index); let diffuse = max(dot(normal, light_dir), 0.0); - let lighting = diffuse * (0.2 + 0.8 * shadow) + 0.15; + let lighting = diffuse * (0.1 + 0.9 * shadow) + 0.1; // Ambient + Shadowed Diffuse return vec4<f32>(base_color * lighting, 1.0); } |
