summaryrefslogtreecommitdiff
path: root/archive/src/core/camera.c
diff options
context:
space:
mode:
authoromniscient <17525998+omnisci3nce@users.noreply.github.com>2024-10-05 12:48:05 +1000
committeromniscient <17525998+omnisci3nce@users.noreply.github.com>2024-10-05 12:48:05 +1000
commitdfb6adbcbcc7d50b770b6d5ea82efdd8f8c32e25 (patch)
treea470b91a90716d7ea46fde53ed395449c24583a2 /archive/src/core/camera.c
parent54354e32c6498cc7f8839ab4deb1208d37216cc5 (diff)
delete documentation workflow
Diffstat (limited to 'archive/src/core/camera.c')
-rw-r--r--archive/src/core/camera.c90
1 files changed, 90 insertions, 0 deletions
diff --git a/archive/src/core/camera.c b/archive/src/core/camera.c
new file mode 100644
index 0000000..77ddad6
--- /dev/null
+++ b/archive/src/core/camera.c
@@ -0,0 +1,90 @@
+#include "camera.h"
+
+#include "input.h"
+#include "keys.h"
+#include "maths.h"
+
+#define CAMERA_SPEED 0.2
+#define CAMERA_SENSITIVITY 0.5
+
+Camera Camera_Create(Vec3 pos, Vec3 front, Vec3 up, f32 fov) {
+ Camera c = { .position = pos, .front = front, .up = up, .fov = fov };
+ return c;
+}
+
+Mat4 Camera_ViewProj(Camera* c, f32 lens_height, f32 lens_width, Mat4* out_view, Mat4* out_proj) {
+ Mat4 proj = mat4_perspective(c->fov, lens_width / lens_height, 0.1, 1000.0);
+ Vec3 camera_direction = vec3_add(c->position, c->front);
+ Mat4 view = mat4_look_at(c->position, camera_direction, c->up);
+ if (out_view) {
+ *out_view = view;
+ }
+ if (out_proj) {
+ *out_proj = proj;
+ }
+ return mat4_mult(view, proj);
+}
+
+void FlyCamera_Update(Camera* camera) {
+ static f32 yaw = 0.0;
+ static f32 pitch = 0.0;
+
+ // Keyboard
+ f32 speed = CAMERA_SPEED;
+ Vec3 horizontal = vec3_cross(camera->front, camera->up);
+ if (key_is_pressed(KEYCODE_A) || key_is_pressed(KEYCODE_KEY_LEFT)) {
+ Vec3 displacement = vec3_mult(horizontal, -speed);
+ camera->position = vec3_add(camera->position, displacement);
+ }
+ if (key_is_pressed(KEYCODE_D) || key_is_pressed(KEYCODE_KEY_RIGHT)) {
+ Vec3 displacement = vec3_mult(horizontal, speed);
+ camera->position = vec3_add(camera->position, displacement);
+ }
+ if (key_is_pressed(KEYCODE_W) || key_is_pressed(KEYCODE_KEY_UP)) {
+ Vec3 displacement = vec3_mult(camera->front, speed);
+ camera->position = vec3_add(camera->position, displacement);
+ }
+ if (key_is_pressed(KEYCODE_S) || key_is_pressed(KEYCODE_KEY_DOWN)) {
+ Vec3 displacement = vec3_mult(camera->front, -speed);
+ camera->position = vec3_add(camera->position, displacement);
+ }
+ if (key_is_pressed(KEYCODE_Q)) {
+ Vec3 displacement = vec3_mult(camera->up, speed);
+ camera->position = vec3_add(camera->position, displacement);
+ }
+ if (key_is_pressed(KEYCODE_E)) {
+ Vec3 displacement = vec3_mult(camera->up, -speed);
+ camera->position = vec3_add(camera->position, displacement);
+ }
+
+ // Mouse
+ if (MouseBtn_Held(MOUSEBTN_LEFT)) {
+ mouse_state mouse = Input_GetMouseState();
+ // printf("Delta x: %d Delta y %d\n",mouse.x_delta, mouse.y_delta );
+
+ f32 x_offset = mouse.x_delta;
+ f32 y_offset = -mouse.y_delta;
+
+ f32 sensitivity = CAMERA_SENSITIVITY; // change this value to your liking
+ x_offset *= sensitivity;
+ y_offset *= sensitivity;
+
+ yaw += x_offset;
+ pitch += y_offset;
+
+ // make sure that when pitch is out of bounds, screen doesn't get flipped
+ if (pitch > 89.0f) pitch = 89.0f;
+ if (pitch < -89.0f) pitch = -89.0f;
+
+ Vec3 front;
+ front.x = cos(deg_to_rad(yaw) * cos(deg_to_rad(pitch)));
+ front.y = sin(deg_to_rad(pitch));
+ front.z = sin(deg_to_rad(yaw)) * cos(deg_to_rad(pitch));
+ front = vec3_normalise(front);
+ camera->front.x = front.x;
+ camera->front.y = front.y;
+ camera->front.z = front.z;
+ }
+
+ // TODO: Right mouse => pan in screen space
+}