summaryrefslogtreecommitdiff
path: root/camera.h
diff options
context:
space:
mode:
authorpryazha <pryadeiniv@mail.ru>2025-10-12 15:25:23 +0500
committerpryazha <pryadeiniv@mail.ru>2025-10-12 15:25:23 +0500
commit818f818f583881156eb279c71b1359bf2c4f3580 (patch)
tree874e8d2fdc5334bc70925aa87923791f7662ddb8 /camera.h
parent3cf987880e384140bf996c37f820ddeea38bc60e (diff)
change identation, maybe will change back, add own gl functions loading, and glx example
Diffstat (limited to 'camera.h')
-rw-r--r--camera.h83
1 files changed, 18 insertions, 65 deletions
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;
-}
+#ifndef camera_h
+#define camera_h
-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);
+#include "prbm.h"
- angle = deg2rad(camera.angles.y);
- f32 cy = cosf(angle);
- f32 sy = sinf(angle);
+struct camera {
+ v3 pos;
+ v3 angles;
+ f32 fov;
+ f32 near;
+ f32 far;
+};
- angle = deg2rad(camera.angles.z);
- f32 cr = cosf(angle);
- f32 sr = sinf(angle);
+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);
- *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;
-}
+#endif