summaryrefslogtreecommitdiff
path: root/src/camera.c
diff options
context:
space:
mode:
authorFreya Murphy <freya@freyacat.org>2025-12-11 10:49:50 -0500
committerFreya Murphy <freya@freyacat.org>2025-12-11 10:51:40 -0500
commitfa8fa6784559ed0fc8d780e36880273f77e272c4 (patch)
tree7456a4e9148d47e409ba837bafdc6238b6c757db /src/camera.c
parentadd ubos (diff)
downloadvoxel-fa8fa6784559ed0fc8d780e36880273f77e272c4.tar.gz
voxel-fa8fa6784559ed0fc8d780e36880273f77e272c4.tar.bz2
voxel-fa8fa6784559ed0fc8d780e36880273f77e272c4.zip
i did a lot
Diffstat (limited to 'src/camera.c')
-rw-r--r--src/camera.c69
1 files changed, 60 insertions, 9 deletions
diff --git a/src/camera.c b/src/camera.c
index ec486d7..a841faa 100644
--- a/src/camera.c
+++ b/src/camera.c
@@ -1,18 +1,19 @@
-#include "cglm/vec3.h"
+#include <GLFW/glfw3.h>
#include <math.h>
#include "voxel.h"
#include "window.h"
-Camera camera_init(void)
+void camera_init(Camera *camera)
{
- Camera camera = { 0 };
- camera.fov = 70;
- camera.near = 0.1;
- camera.far = 1000;
- camera.look_speed = 100;
- camera.move_speed = 4.317;
- return camera;
+ camera->fov = 70;
+ camera->near = 0.1;
+ camera->far = 1000;
+ camera->look_speed = 100;
+ camera->move_speed = 4.317 * 10;
+ glm_vec3_zero(camera->position);
+ glm_vec3_zero(camera->rotation);
+ camera->frustum = camera_frustum(camera);
}
void camera_proj(Camera *camera, mat4 proj)
@@ -143,4 +144,54 @@ void camera_update(Camera *camera)
{
camera_update_rotation(camera);
camera_update_movement(camera);
+ camera->frustum = camera_frustum(camera);
+}
+
+Frustum camera_frustum(Camera *camera)
+{
+ Frustum frustum;
+ mat4 proj_view;
+
+ camera_proj_view(camera, proj_view);
+ glm_mat4_transpose(proj_view);
+
+ // left
+ glm_vec4_add(proj_view[3], proj_view[0], frustum.left);
+
+ // right
+ glm_vec4_sub(proj_view[3], proj_view[0], frustum.right);
+
+ // bottom
+ glm_vec4_add(proj_view[3], proj_view[1], frustum.bottom);
+
+ // top
+ glm_vec4_sub(proj_view[3], proj_view[1], frustum.top);
+
+ // near
+ glm_vec4_add(proj_view[3], proj_view[2], frustum.near);
+
+ // far
+ glm_vec4_sub(proj_view[3], proj_view[2], frustum.far);
+
+ return frustum;
+}
+
+bool aabb_in_plane(AABB *aabb, Plane plane)
+{
+ vec3 p;
+ float f;
+
+ p[0] = plane[0] >= 0 ? aabb->max[0] : aabb->min[0];
+ p[1] = plane[1] >= 0 ? aabb->max[1] : aabb->min[1];
+ p[2] = plane[2] >= 0 ? aabb->max[2] : aabb->min[2];
+ f = glm_vec3_dot(p, plane) + plane[3];
+
+ return f >= 0.0f;
+}
+
+bool aabb_in_frustum(AABB *aabb, Frustum *frustum)
+{
+ return aabb_in_plane(aabb, frustum->near) && aabb_in_plane(aabb, frustum->far) &&
+ aabb_in_plane(aabb, frustum->left) && aabb_in_plane(aabb, frustum->right) &&
+ aabb_in_plane(aabb, frustum->top) && aabb_in_plane(aabb, frustum->bottom);
}