// Camera parameters and helpers for SDF raymarching effects struct CameraParams { inv_view: mat4x4, fov: f32, near_plane: f32, far_plane: f32, aspect_ratio: f32, } struct Ray { origin: vec3, direction: vec3, } // Generate camera ray for given UV coordinates (-1 to 1) fn getCameraRay(cam: CameraParams, uv: vec2) -> Ray { let cam_pos = vec3(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(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 { return vec3(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 { return -normalize(vec3(cam.inv_view[2].x, cam.inv_view[2].y, cam.inv_view[2].z)); } // Extract camera up vector fn getCameraUp(cam: CameraParams) -> vec3 { return normalize(vec3(cam.inv_view[1].x, cam.inv_view[1].y, cam.inv_view[1].z)); } // Extract camera right vector fn getCameraRight(cam: CameraParams) -> vec3 { return normalize(vec3(cam.inv_view[0].x, cam.inv_view[0].y, cam.inv_view[0].z)); }