diff options
Diffstat (limited to 'src/camera.c')
| -rw-r--r-- | src/camera.c | 69 |
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); } |