summaryrefslogtreecommitdiff
path: root/src/3d/renderer.cc
diff options
context:
space:
mode:
Diffstat (limited to 'src/3d/renderer.cc')
-rw-r--r--src/3d/renderer.cc16
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);
}