summaryrefslogtreecommitdiff
path: root/common
diff options
context:
space:
mode:
authorskal <pascal.massimino@gmail.com>2026-02-14 19:05:34 +0100
committerskal <pascal.massimino@gmail.com>2026-02-14 19:05:34 +0100
commitb8d4a815453acac752c6fb3c56d047e39a76fd05 (patch)
treee8b49ac34aed2b5cfbdbdc4a4c99903fbd709cef /common
parent57aeae226617dbce364716f2d4e7c4aaa6271c1d (diff)
feat(gpu): add SDF camera infrastructure and effect base class
Add unified camera system for SDF raymarching effects: - CameraParams struct (80 bytes): inv_view matrix + FOV/near/far/aspect - SDFEffect base class: manages camera uniform, provides update_camera() helpers - camera_common.wgsl: getCameraRay(), position/forward/up/right extractors - SDFTestEffect: working example with orbiting camera + animated sphere Refactor effect headers: - Extract class definitions from demo_effects.h to individual .h files - Update includes in .cc files to use specific headers - Cleaner compilation dependencies, faster incremental builds Documentation: - Add SDF_EFFECT_GUIDE.md with complete workflow - Update ARCHITECTURE.md, UNIFORM_BUFFER_GUIDELINES.md - Update EFFECT_WORKFLOW.md, CONTRIBUTING.md Tests: 34/34 passing, SDFTestEffect validated Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Diffstat (limited to 'common')
-rw-r--r--common/shaders/camera_common.wgsl52
1 files changed, 52 insertions, 0 deletions
diff --git a/common/shaders/camera_common.wgsl b/common/shaders/camera_common.wgsl
new file mode 100644
index 0000000..bd29775
--- /dev/null
+++ b/common/shaders/camera_common.wgsl
@@ -0,0 +1,52 @@
+// Camera parameters and helpers for SDF raymarching effects
+
+struct CameraParams {
+ inv_view: mat4x4<f32>,
+ fov: f32,
+ near_plane: f32,
+ far_plane: f32,
+ aspect_ratio: f32,
+}
+
+struct Ray {
+ origin: vec3<f32>,
+ direction: vec3<f32>,
+}
+
+// Generate camera ray for given UV coordinates (-1 to 1)
+fn getCameraRay(cam: CameraParams, uv: vec2<f32>) -> Ray {
+ let cam_pos = vec3<f32>(cam.inv_view[3].x, cam.inv_view[3].y, cam.inv_view[3].z);
+
+ // Compute ray direction from FOV and aspect ratio
+ let tan_fov = tan(cam.fov * 0.5);
+ let ndc = vec3<f32>(uv.x * cam.aspect_ratio * tan_fov, uv.y * tan_fov, -1.0);
+
+ // Transform direction by inverse view matrix (rotation only)
+ let dir = normalize(
+ cam.inv_view[0].xyz * ndc.x +
+ cam.inv_view[1].xyz * ndc.y +
+ cam.inv_view[2].xyz * ndc.z
+ );
+
+ return Ray(cam_pos, dir);
+}
+
+// Extract camera position from inverse view matrix
+fn getCameraPosition(cam: CameraParams) -> vec3<f32> {
+ return vec3<f32>(cam.inv_view[3].x, cam.inv_view[3].y, cam.inv_view[3].z);
+}
+
+// Extract camera forward vector (view direction)
+fn getCameraForward(cam: CameraParams) -> vec3<f32> {
+ return -normalize(vec3<f32>(cam.inv_view[2].x, cam.inv_view[2].y, cam.inv_view[2].z));
+}
+
+// Extract camera up vector
+fn getCameraUp(cam: CameraParams) -> vec3<f32> {
+ return normalize(vec3<f32>(cam.inv_view[1].x, cam.inv_view[1].y, cam.inv_view[1].z));
+}
+
+// Extract camera right vector
+fn getCameraRight(cam: CameraParams) -> vec3<f32> {
+ return normalize(vec3<f32>(cam.inv_view[0].x, cam.inv_view[0].y, cam.inv_view[0].z));
+}