diff options
author | pryazha <pryadeiniv@mail.ru> | 2025-03-19 08:46:04 +0500 |
---|---|---|
committer | pryazha <pryadeiniv@mail.ru> | 2025-03-19 08:46:04 +0500 |
commit | b1389bad67cccd3da6815c2d5a436c177f09594b (patch) | |
tree | 393dee77b5faef3cfd6e78eda8ac07273cdcc85e /prge_camera.c | |
parent | 34821e9fefb0d7cbf9e72a2457b2901edbbe03bb (diff) |
window, texture, model, camera and gui (silly button)
Diffstat (limited to 'prge_camera.c')
-rw-r--r-- | prge_camera.c | 103 |
1 files changed, 103 insertions, 0 deletions
diff --git a/prge_camera.c b/prge_camera.c new file mode 100644 index 0000000..242b33d --- /dev/null +++ b/prge_camera.c @@ -0,0 +1,103 @@ +Camera camera_init(V3 pos, F32 fov, F32 near, F32 far, + F32 yaw, F32 pitch, F32 roll) +{ + Camera c; + + c.pos = pos; + c.fov = fov; + c.near = near; + c.far = far; + c.yaw = yaw; + c.pitch = pitch; + c.roll = roll; + + return c; +} + +MAT4 camera_get_view_matrix_first_person(Camera *c) +{ + MAT4 v; + + v = mat4transl(MAT4_IDENTITY, v3inv(c->pos)); + v = mat4rotate(v, v3(c->pitch, c->yaw, c->roll)); + + return v; +} + +void camera_get_vectors_first_person(Camera *c, V3 *r, 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); + + *r = 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 camera_look_at(Camera c, V3 t, V3 wup) +{ + V3 f, r, u; + MAT4 transl, rotate, res; + + f = v3norm(v3sub(c.pos, t)); + r = v3norm(v3cross(wup, f)); + u = v3cross(f, r); + + transl = mat4transl(MAT4_IDENTITY, v3inv(c.pos)); + rotate = mat4transp(mat4_change_basis(r, u, f)); + res = mat4mul(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; +} |