Camera initcam(V3 pos, F32 fov, F32 near, F32 far, F32 yaw, F32 pitch, F32 roll) { Camera c = { .pos = pos, .fov = fov, .near = near, .far = far, .yaw = yaw, .pitch = pitch, .roll = roll, }; return c; } MAT4 getfpviewmat(Camera *c) { MAT4 v; v = translmat4(MAT4_IDENTITY, invv3(c->pos)); v = rotatemat4(v, v3(c->pitch, c->yaw, c->roll)); return v; } void getfpvecs(Camera *c, V3 *l, V3 *u, V3 *f) { F32 angle, cp, sp, cy, sy, cr, sr; angle = DEG2RAD*c->pitch; cp = f32cos(angle); sp = f32sin(angle); angle = DEG2RAD*c->yaw; cy = f32cos(angle); sy = f32sin(angle); angle = DEG2RAD*c->roll; cr = f32cos(angle); sr = f32sin(angle); *l = v3(cy*cr, -cy*sr, sy); *u = v3(sp*sy*cr+cp*sr, -sp*sy*sr+cp*cr, -sp*cy); *f = v3(-cp*sy*cr+sp*sr, cp*sy*sr+sp*cr, cp*cy); } MAT4 lookat(Camera c, V3 t, V3 wup) { V3 f, r, u; MAT4 transl, rotate, res; f = normv3(subv3(c.pos, t)); r = normv3(crossv3(wup, f)); u = crossv3(f, r); transl = translmat4(MAT4_IDENTITY, invv3(c.pos)); rotate = transpmat4(rotateaxismat4(r, u, f)); res = mulmat4(rotate, transl); return res; } MAT4 ortho(F32 l, F32 r, F32 b, F32 t, F32 n, F32 f) { MAT4 res; res = MAT4_IDENTITY; res.m0.x = 2.0f/(r-l); res.m1.y = 2.0f/(t-b); res.m2.z = -2.0f/(f-n); res.m3.x = -(r+l)/(r-l); res.m3.y = -(t+b)/(t-b); res.m3.z = -(f+n)/(f-n); return res; } MAT4 persp(F32 fov, F32 ar, F32 n, F32 f) { F32 r, t; MAT4 res; r = n*f32tan(fov/2.0f*DEG2RAD); t = r/ar; res = MAT4_IDENTITY; res.m0.x = n/r; res.m1.y = n/t; res.m2.z = -(f+n)/(f-n); res.m2.w = -1.0f; res.m3.z = (-2.0f*f*n)/(f-n); res.m3.w = 0.0f; return res; } MAT4 camera_persp(Camera c, F32 ar) { MAT4 res; res = persp(c.fov, ar, c.near, c.far); return res; }