summaryrefslogtreecommitdiff
path: root/src/tests
diff options
context:
space:
mode:
authorskal <pascal.massimino@gmail.com>2026-02-02 16:34:31 +0100
committerskal <pascal.massimino@gmail.com>2026-02-02 16:34:31 +0100
commitfcf1cbe0e520137d729152239c2aed68d9952cc5 (patch)
treeb9c3e46362bd68ee90744413cb8b7283da48b3e2 /src/tests
parent74cab8d6b91168a4681f1c9c19a8e32052d59e7b (diff)
fix(3d): Unify SDF path for all objects and stabilize shadows
- Converted floor in test_3d_render to a large SDF BOX for consistent shading. - Standardized lighting (light_dir = 1,1,1) and normal calculation for all objects. - Fixed calc_shadow bias and skip_idx to reliably prevent self-shadowing. - Improved raymarching robustness in fs_main to find exact SDF hit points.
Diffstat (limited to 'src/tests')
-rw-r--r--src/tests/test_3d_render.cc45
1 files changed, 22 insertions, 23 deletions
diff --git a/src/tests/test_3d_render.cc b/src/tests/test_3d_render.cc
index 11cca46..5b4593d 100644
--- a/src/tests/test_3d_render.cc
+++ b/src/tests/test_3d_render.cc
@@ -137,43 +137,42 @@ void setup_scene() {
g_scene.clear();
srand(12345); // Fixed seed
- // Large floor, use CUBE type
- Object3D floor(ObjectType::CUBE);
+ // Large floor, use BOX type (SDF) for receiving shadows
+ Object3D floor(ObjectType::BOX);
floor.position = vec3(0, -2.0f, 0);
- floor.scale = vec3(50.0f, 0.5f, 50.0f);
- floor.color =
- vec4(0.9f, 0.9f, 0.9f, 1.0f); // Brighter white for better shadow contrast
+ 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);
- // Center object
+ // Large center Torus (SDF)
Object3D center(ObjectType::TORUS);
- center.position = vec3(0, 1.5f, 0); // Elevated
- center.scale = vec3(1.5f, 1.5f, 1.5f);
- center.color = vec4(1, 0, 0, 1);
+ center.position = vec3(0, 1.0f, 0);
+ center.scale = vec3(2.0f, 2.0f, 2.0f);
+ 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.2f, 1.2f, 1.2f);
+ sphere.color = vec4(0.2, 1, 0.2, 1);
+ g_scene.add_object(sphere);
+
// Random objects
- for (int i = 0; i < 30; ++i) {
+ for (int i = 0; i < 20; ++i) {
ObjectType type = ObjectType::SPHERE;
int r = rand() % 3;
- if (r == 1)
- type = ObjectType::TORUS;
- if (r == 2)
- type = ObjectType::BOX;
+ if (r == 1) type = ObjectType::TORUS;
+ if (r == 2) type = ObjectType::BOX;
Object3D obj(type);
float angle = (rand() % 360) * 0.01745f;
- float dist = 4.0f + (rand() % 100) * 0.05f;
- float height = 0.5f + (rand() % 100) * 0.04f; // Elevated
-
+ float dist = 5.0f + (rand() % 100) * 0.08f;
+ float height = 0.5f + (rand() % 100) * 0.04f;
obj.position = vec3(std::cos(angle) * dist, height, std::sin(angle) * dist);
-
- float s = 0.3f + (rand() % 100) * 0.005f;
+ float s = 0.4f + (rand() % 100) * 0.005f;
obj.scale = vec3(s, s, s);
-
- obj.color = vec4((rand() % 100) / 100.0f, (rand() % 100) / 100.0f,
- (rand() % 100) / 100.0f, 1.0f);
-
+ obj.color = vec4((rand()%100)/100.0f, (rand()%100)/100.0f, (rand()%100)/100.0f, 1.0f);
g_scene.add_object(obj);
}
}