6 typedef struct camera camera
;
13 float fov
, nearz
, farz
;
27 static main_camera
, gate_camera
;
29 VG_STATIC
void camera_lerp_angles( v3f a
, v3f b
, float t
, v3f d
)
31 d
[0] = vg_alerpf( a
[0], b
[0], t
);
32 d
[1] = vg_lerpf( a
[1], b
[1], t
);
33 d
[2] = vg_lerpf( a
[2], b
[2], t
);
36 VG_STATIC
void camera_lerp( camera
*a
, camera
*b
, float t
, camera
*d
)
38 v3_lerp( a
->pos
, b
->pos
, t
, d
->pos
);
39 d
->angles
[0] = vg_alerpf( a
->angles
[0], b
->angles
[0], t
);
40 d
->angles
[1] = vg_lerpf( a
->angles
[1], b
->angles
[1], t
);
41 d
->angles
[2] = vg_lerpf( a
->angles
[2], b
->angles
[2], t
);
42 d
->fov
= vg_lerpf( a
->fov
, b
->fov
, t
);
46 * 1) [angles, pos] -> transform
48 VG_STATIC
void camera_update_transform( camera
*cam
)
50 v4f qyaw
, qpitch
, qcam
;
51 q_axis_angle( qyaw
, (v3f
){ 0.0f
, 1.0f
, 0.0f
}, -cam
->angles
[0] );
52 q_axis_angle( qpitch
, (v3f
){ 1.0f
, 0.0f
, 0.0f
}, -cam
->angles
[1] );
54 q_mul( qyaw
, qpitch
, qcam
);
55 q_m3x3( qcam
, cam
->transform
);
56 v3_copy( cam
->pos
, cam
->transform
[3] );
60 * 2) [transform] -> transform_inverse, view matrix
62 VG_STATIC
void camera_update_view( camera
*cam
)
64 m4x4_copy( cam
->mtx
.v
, cam
->mtx_prev
.v
);
65 m4x3_invert_affine( cam
->transform
, cam
->transform_inverse
);
66 m4x3_expand( cam
->transform_inverse
, cam
->mtx
.v
);
70 * 3) [fov,nearz,farz] -> projection matrix
72 VG_STATIC
void camera_update_projection( camera
*cam
)
74 m4x4_copy( cam
->mtx
.p
, cam
->mtx_prev
.p
);
75 m4x4_projection( cam
->mtx
.p
, cam
->fov
,
76 (float)vg
.window_x
/ (float)vg
.window_y
,
77 cam
->nearz
, cam
->farz
);
81 * 4) [projection matrix, view matrix] -> previous pv, new pv
83 VG_STATIC
void camera_finalize( camera
*cam
)
85 m4x4_copy( cam
->mtx
.pv
, cam
->mtx_prev
.pv
);
86 m4x4_mul( cam
->mtx
.p
, cam
->mtx
.v
, cam
->mtx
.pv
);
90 * http://www.terathon.com/lengyel/Lengyel-Oblique.pdf
92 VG_STATIC
void m4x4_clip_projection( m4x4f mat
, v4f plane
)
96 (vg_signf(plane
[0]) + mat
[2][0]) / mat
[0][0],
97 (vg_signf(plane
[1]) + mat
[2][1]) / mat
[1][1],
99 (1.0f
+ mat
[2][2]) / mat
[3][2]
102 v4_muls( plane
, 2.0f
/ v4_dot(plane
,c
), c
);
106 mat
[2][2] = c
[2] + 1.0f
;
111 * Undoes the above operation
113 VG_STATIC
void m4x4_reset_clipping( m4x4f mat
, float ffar
, float fnear
)
117 mat
[2][2] = -(ffar
+ fnear
) / (ffar
- fnear
);
118 mat
[3][2] = -2.0f
* ffar
* fnear
/ (ffar
- fnear
);
121 #endif /* CAMERA_H */