From 5dbdb0a359d51355e4031d2e5dd576796f422d0a Mon Sep 17 00:00:00 2001 From: skal Date: Mon, 2 Feb 2026 16:25:01 +0100 Subject: fix(3d): Resolve missing shadows on floor plane - Switched floor from rasterized CUBE to SDF PLANE for consistent shadow mapping. - Implemented skip_idx in map_scene to properly prevent self-shadowing. - Standardized soft shadow logic with improved bias and step size. - Increased object elevation and adjusted light direction for more visible shadows. - Enabled debug boxes in test_3d_render. --- src/tests/test_3d_render.cc | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) (limited to 'src/tests') diff --git a/src/tests/test_3d_render.cc b/src/tests/test_3d_render.cc index 3084edc..141b1b7 100644 --- a/src/tests/test_3d_render.cc +++ b/src/tests/test_3d_render.cc @@ -137,18 +137,18 @@ void setup_scene() { g_scene.clear(); srand(12345); // Fixed seed - // Large floor, use CUBE type to exclude from SDF calculations - Object3D floor(ObjectType::CUBE); + // Large floor, use PLANE type + Object3D floor(ObjectType::PLANE); floor.position = vec3(0, -2.0f, 0); - floor.scale = vec3(20.0f, 0.5f, 20.0f); + floor.scale = vec3(100.0f, 1.0f, 100.0f); floor.color = vec4(0.9f, 0.9f, 0.9f, 1.0f); // Brighter white for better shadow contrast g_scene.add_object(floor); // Center object Object3D center(ObjectType::TORUS); - center.position = vec3(0, 0, 0); - center.scale = vec3(1.5f, 1.5f, 1.5f); + center.position = vec3(0, 1.0f, 0); // Higher + center.scale = vec3(2.5f, 2.5f, 2.5f); // Larger center.color = vec4(1, 0, 0, 1); g_scene.add_object(center); @@ -163,12 +163,12 @@ void setup_scene() { Object3D obj(type); float angle = (rand() % 360) * 0.01745f; - float dist = 3.0f + (rand() % 100) * 0.05f; - float height = -1.0f + (rand() % 100) * 0.04f; + float dist = 4.0f + (rand() % 100) * 0.06f; + float height = 0.5f + (rand() % 100) * 0.04f; // Higher obj.position = vec3(std::cos(angle) * dist, height, std::sin(angle) * dist); - float s = 0.3f + (rand() % 100) * 0.005f; + float s = 0.5f + (rand() % 100) * 0.005f; obj.scale = vec3(s, s, s); obj.color = vec4((rand() % 100) / 100.0f, (rand() % 100) / 100.0f, @@ -242,6 +242,10 @@ int main(int argc, char** argv) { g_scene.objects[i].position.y = std::sin(time * 3.0f + i) * 1.5f; } +#if !defined(STRIP_ALL) + Renderer3D::SetDebugEnabled(true); +#endif + WGPUSurfaceTexture surface_tex; wgpuSurfaceGetCurrentTexture(g_surface, &surface_tex); if (surface_tex.status == -- cgit v1.2.3