diff options
| author | skal <pascal.massimino@gmail.com> | 2026-02-02 17:39:14 +0100 |
|---|---|---|
| committer | skal <pascal.massimino@gmail.com> | 2026-02-02 17:39:14 +0100 |
| commit | 6847a7e1b54c9f76feef0c4110a897600983416e (patch) | |
| tree | fc2fa82e98c4d8024faf49453cac728d1d8bfb6b | |
| parent | 4eb0a67ad12fdd8c82d7cbc37991b6977cb86568 (diff) | |
fix(3d): Stabilize shadows and isolate floor grid texture
- Reverted floor to BOX (SDF) for robust shadow receipt.
- Updated shader to apply grid pattern ONLY to instance 0 (floor) or PLANE objects.
- Restored noise-based texturing for floating cubes and other SDF primitives.
- Verified that shadows and textures are now correctly applied across all scene elements.
| -rw-r--r-- | src/3d/renderer.cc | 2 | ||||
| -rw-r--r-- | src/tests/test_3d_render.cc | 14 |
2 files changed, 8 insertions, 8 deletions
diff --git a/src/3d/renderer.cc b/src/3d/renderer.cc index d39aac0..abd98b6 100644 --- a/src/3d/renderer.cc +++ b/src/3d/renderer.cc @@ -254,7 +254,7 @@ fn fs_main(in: VertexOutput) -> @location(0) vec4<f32> { normal = normalize(transpose(normal_matrix) * n_local); // Apply texture to SDF color - if (obj_type == 4.0) { // PLANE (used for floor) + if (in.instance_index == 0u || obj_type == 4.0) { // Floor (index 0) or PLANE let uv_grid = p.xz * 0.5; let grid = 0.5 + 0.5 * sin(uv_grid.x * 3.14) * sin(uv_grid.y * 3.14); let grid_val = smoothstep(0.45, 0.55, grid); diff --git a/src/tests/test_3d_render.cc b/src/tests/test_3d_render.cc index a6db71b..e1762ed 100644 --- a/src/tests/test_3d_render.cc +++ b/src/tests/test_3d_render.cc @@ -137,29 +137,29 @@ void setup_scene() { g_scene.clear(); srand(12345); // Fixed seed - // Large floor, use PLANE type - Object3D floor(ObjectType::PLANE); + // Large floor, use BOX type (SDF) at index 0 + Object3D floor(ObjectType::BOX); floor.position = vec3(0, -2.0f, 0); - floor.scale = vec3(25.0f, 1.0f, 25.0f); // Thicker for proxy hull safety + floor.scale = vec3(25.0f, 0.2f, 25.0f); floor.color = vec4(0.8f, 0.8f, 0.8f, 1.0f); g_scene.add_object(floor); // Large center Torus (SDF) Object3D center(ObjectType::TORUS); center.position = vec3(0, 1.0f, 0); - center.scale = vec3(2.5f, 2.5f, 2.5f); // Larger + center.scale = vec3(2.5f, 2.5f, 2.5f); center.color = vec4(1, 0.2, 0.2, 1); g_scene.add_object(center); // Moving Sphere (SDF) Object3D sphere(ObjectType::SPHERE); sphere.position = vec3(4.0f, 2.0f, 0); - sphere.scale = vec3(1.5f, 1.5f, 1.5f); // Larger + sphere.scale = vec3(1.5f, 1.5f, 1.5f); sphere.color = vec4(0.2, 1, 0.2, 1); g_scene.add_object(sphere); // Random objects - for (int i = 0; i < 30; ++i) { // More objects + for (int i = 0; i < 30; ++i) { ObjectType type = ObjectType::SPHERE; int r = rand() % 3; if (r == 1) @@ -169,7 +169,7 @@ void setup_scene() { Object3D obj(type); float angle = (rand() % 360) * 0.01745f; - float dist = 3.0f + (rand() % 100) * 0.05f; // Closer to center + float dist = 3.0f + (rand() % 100) * 0.05f; float height = 0.5f + (rand() % 100) * 0.04f; obj.position = vec3(std::cos(angle) * dist, height, std::sin(angle) * dist); |
