summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorskal <pascal.massimino@gmail.com>2026-03-22 19:31:50 +0100
committerskal <pascal.massimino@gmail.com>2026-03-22 19:31:50 +0100
commitbe5b63ea000daca9458d7b92138ae36fabb9dd96 (patch)
tree69b0205080198e99213ed6390324d8504cdcecae
parent7b89a7130a998017de98dde363a8d9be61d7d44e (diff)
feat(cnn_v3): Phase 4 — type-aware SDF in shadow pass
dfWithID() in gbuf_shadow.wgsl now branches on obj.params.x (ObjectType) instead of using sdBox for everything: 0=CUBE → sdBox(lp, vec3(1)) 1=SPHERE → sdSphere(lp, 1.0) 2=PLANE → sdPlane(lp, vec3(0,1,0), obj.params.y) 3=TORUS → sdTorus(lp, vec2(0.8, 0.2)) 36/36 tests pass.
-rw-r--r--cnn_v3/docs/HOWTO.md2
-rw-r--r--cnn_v3/shaders/gbuf_shadow.wgsl13
2 files changed, 11 insertions, 4 deletions
diff --git a/cnn_v3/docs/HOWTO.md b/cnn_v3/docs/HOWTO.md
index 765d80b..5c5cc2a 100644
--- a/cnn_v3/docs/HOWTO.md
+++ b/cnn_v3/docs/HOWTO.md
@@ -106,7 +106,7 @@ outputs[1] → feat_tex1 (rgba32uint: mat_id, prev.rgb, mip1.rgb, mip2.rgb, s
| Internal scene + animation | ✅ Done | cubes + spheres + 2 lights |
| Pass 2: SDF shadow | ✅ Done | `gbuf_shadow.wgsl`, proxy-box SDF per object |
| Pass 3: Transparency | ❌ TODO | low priority, opaque scenes only |
-| Phase 4: type-aware SDF | ❌ TODO | optional refinement |
+| Phase 4: type-aware SDF | ✅ Done | switch on `obj.params.x` in `dfWithID` |
### Pass 2: SDF shadow raymarching
diff --git a/cnn_v3/shaders/gbuf_shadow.wgsl b/cnn_v3/shaders/gbuf_shadow.wgsl
index 36e7b28..0f5f8b4 100644
--- a/cnn_v3/shaders/gbuf_shadow.wgsl
+++ b/cnn_v3/shaders/gbuf_shadow.wgsl
@@ -35,9 +35,16 @@ fn dfWithID(p: vec3f) -> RayMarchResult {
let n = u32(globals.params.x);
for (var i = 0u; i < n; i++) {
- let obj = object_data.objects[i];
- let lp = (obj.inv_model * vec4f(p, 1.0)).xyz;
- let d = sdBox(lp, vec3f(1.0));
+ let obj = object_data.objects[i];
+ let lp = (obj.inv_model * vec4f(p, 1.0)).xyz;
+ let obj_type = u32(obj.params.x);
+ var d: f32;
+ switch obj_type {
+ case 1u: { d = sdSphere(lp, 1.0); } // SPHERE
+ case 2u: { d = sdPlane(lp, vec3f(0.0, 1.0, 0.0), obj.params.y); } // PLANE
+ case 3u: { d = sdTorus(lp, vec2f(0.8, 0.2)); } // TORUS
+ default: { d = sdBox(lp, vec3f(1.0)); } // CUBE (0) + fallback
+ }
if (d < res.distance) {
res.distance = d;
res.object_id = f32(i + 1u);