From 818f818f583881156eb279c71b1359bf2c4f3580 Mon Sep 17 00:00:00 2001 From: pryazha Date: Sun, 12 Oct 2025 15:25:23 +0500 Subject: change identation, maybe will change back, add own gl functions loading, and glx example --- camera.h | 91 ++++++++++++++++------------------------------------------------ 1 file changed, 22 insertions(+), 69 deletions(-) (limited to 'camera.h') diff --git a/camera.h b/camera.h index b71f22a..b760f7f 100644 --- a/camera.h +++ b/camera.h @@ -1,69 +1,22 @@ -mat4 camera_get_view_mat(camera_t camera) -{ - mat4 view = mat4_make_transl(v3_inv(camera.position)); - view = mat4_rotate(view, camera.angles); - return view; -} - -void camera_get_vecs(camera_t camera, v3 *left, v3 *up, v3 *front) -{ - f32 angle = deg2rad(camera.angles.x); - f32 cp = cosf(angle); - f32 sp = sinf(angle); - - angle = deg2rad(camera.angles.y); - f32 cy = cosf(angle); - f32 sy = sinf(angle); - - angle = deg2rad(camera.angles.z); - f32 cr = cosf(angle); - f32 sr = sinf(angle); - - *left = (v3){cy*cr, -cy*sr, sy}; - *up = (v3){sp*sy*cr+cp*sr, -sp*sy*sr+cp*cr, -sp*cy}; - *front = (v3){-cp*sy*cr+sp*sr, cp*sy*sr+sp*cr, cp*cy}; -} - -mat4 camera_lookat(camera_t camera, v3 target, v3 world_up) -{ - v3 front = v3_norm(v3_sub(camera.position, target)); - v3 right = v3_norm(v3_cross(world_up, front)); - v3 up = v3_cross(front, right); - - mat4 translate = mat4_make_transl(v3_inv(camera.position)); - mat4 rotate = mat4_transp(mat4_make_rotate(right, up, front)); - mat4 result = mat4_mul(rotate, translate); - - return result; -} - -mat4 ortho(f32 l, f32 r, f32 b, f32 t, f32 n, f32 f) -{ - mat4 ortho = MAT4_IDENTITY; - ortho.c0.x = 2.0f/(r-l); - ortho.c1.y = 2.0f/(t-b); - ortho.c2.z = -2.0f/(f-n); - ortho.c3.x = -(r+l)/(r-l); - ortho.c3.y = -(t+b)/(t-b); - ortho.c3.z = -(f+n)/(f-n); - return ortho; -} - -mat4 perspective(camera_t camera, f32 aspect_ratio) -{ - f32 n = camera.near; - f32 f = camera.far; - - f32 r = n*tanf(deg2rad(camera.fov/2.0f)); - f32 t = r/aspect_ratio; - - mat4 perspective = MAT4_IDENTITY; - perspective.c0.x = n/r; - perspective.c1.y = n/t; - perspective.c2.z = -(f+n)/(f-n); - perspective.c2.w = -1.0f; - perspective.c3.z = (-2.0f*f*n)/(f-n); - perspective.c3.w = 0.0f; - - return perspective; -} +#ifndef camera_h +#define camera_h + +#include "prbm.h" + +struct camera { + v3 pos; + v3 angles; + f32 fov; + f32 near; + f32 far; +}; + +struct camera create_default_camera(void); +mat get_camera_view_mat(struct camera cam); +void get_camera_vectors(struct camera camera, v3 *l, v3 *u, v3 *f); +mat camera_lookat(struct camera camera, v3 target, v3 world_up); +mat ortho(f32 l, f32 r, f32 b, f32 t, f32 n, f32 f); +mat perspective(f32 near, f32 far, f32 fov, f32 aspect_ratio); +mat camera_perspective(struct camera camera, f32 aspect_ratio); + +#endif -- cgit v1.2.3-70-g09d2