+static void camera_lerp_angles( v3f a, v3f b, float t, v3f d ){
+ d[0] = vg_alerpf( a[0], b[0], t );
+ d[1] = vg_lerpf( a[1], b[1], t );
+ d[2] = vg_lerpf( a[2], b[2], t );
+}
+
+/* lerp position, fov, and angles */
+static void camera_lerp( camera *a, camera *b, float t, camera *d ){
+ v3_lerp( a->pos, b->pos, t, d->pos );
+ camera_lerp_angles( a->angles, b->angles, t, d->angles );
+ d->fov = vg_lerpf( a->fov, b->fov, t );
+}
+
+static void camera_copy( camera *a, camera *d ){
+ v3_copy( a->pos, d->pos );
+ v3_copy( a->angles, d->angles );
+ d->fov = a->fov;
+}
+
+static void m4x3_transform_camera( m4x3f m, camera *cam ){
+ m4x3_mulv( m, cam->pos, cam->pos );
+
+ v3f v0;
+ v3_angles_vector( cam->angles, v0 );
+ m3x3_mulv( m, v0, v0 );
+ v3_normalize( v0 );
+ v3_angles( v0, cam->angles );
+}
+
+/*
+ * 1) [angles, pos] -> transform
+ */
+static void camera_update_transform( camera *cam )