From 26bec7cc6aa9a67b918bd35a33772baecacb1dc3 Mon Sep 17 00:00:00 2001 From: salmonik Date: Thu, 9 Jul 2026 23:30:38 +0200 Subject: fix floor warping --- src/renderer.rs | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) (limited to 'src') diff --git a/src/renderer.rs b/src/renderer.rs index 3ab67d6..bce3391 100644 --- a/src/renderer.rs +++ b/src/renderer.rs @@ -46,6 +46,14 @@ impl Renderer { let rdx = ray_angle.cos(); let rdy = ray_angle.sin(); + // Floor uses perpendicular distance from the LUT, but needs + // Euclidean distance for correct world-position projection. + // Scale by 1/cos(angle_diff) so that rdx_floor / rdy_floor + // map floor_dist → Euclidean travel along the ray. + let cos_diff = (ray_angle - game.player.angle).cos().abs().max(0.001); + let rdx_floor = rdx / cos_diff; + let rdy_floor = rdy / cos_diff; + // ---- DDA setup ------------------------------------------------- let mut map_x = game.player.x as isize; let mut map_y = game.player.y as isize; @@ -151,8 +159,8 @@ impl Renderer { let gray = darken_fx(0xFF80_8080, self.floor_bright_lut[py]); buffer[py * self.screen_w + sx] = gray; } else { - let fx = game.player.x + floor_dist * rdx; - let fy = game.player.y + floor_dist * rdy; + let fx = game.player.x + floor_dist * rdx_floor; + let fy = game.player.y + floor_dist * rdy_floor; let ftx = ((fx.fract().abs() * TEX_SIZE as f64) as usize).min(TEX_SIZE - 1); let fty = ((fy.fract().abs() * TEX_SIZE as f64) as usize).min(TEX_SIZE - 1); -- cgit v1.2.3