summaryrefslogtreecommitdiff
path: root/common/shaders/camera_common.wgsl
blob: bd29775f12672ce036986529661feccfe28d0582 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
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));
}