summaryrefslogtreecommitdiff
path: root/src/extend/camera.c
diff options
context:
space:
mode:
authorchai <chaifix@163.com>2020-02-22 23:33:06 +0800
committerchai <chaifix@163.com>2020-02-22 23:33:06 +0800
commitb656c9415a8e7e3b5b7d8bf1f3c8a5444f830c79 (patch)
treef4f0578d58e5f12b00d2753efef83aaedc03137e /src/extend/camera.c
parent9c89460e136ed6c6c43704d9a3a15105e0f006b0 (diff)
*misc
Diffstat (limited to 'src/extend/camera.c')
-rw-r--r--src/extend/camera.c55
1 files changed, 55 insertions, 0 deletions
diff --git a/src/extend/camera.c b/src/extend/camera.c
index e69de29..377a09e 100644
--- a/src/extend/camera.c
+++ b/src/extend/camera.c
@@ -0,0 +1,55 @@
+#include "camera.h"
+
+void camera_init(Camera* cam) {
+ cam->is_viewdirty = cam->is_projdirty = TRUE;
+ cam->transform.parent = NULL ;
+ cam->transform.localposition = vec3_make(0, 0, 800);
+ cam->transform.localscale = vec3_make(1, 1, 1);
+ cam->transform.localrotation = quat_make(0, 0, 0);
+ cam->near = 1;
+ cam->far = 1500;
+ cam->aspect = 600/500.f;
+ cam->fov = 90;
+ cam->zoom_speed = 20;
+}
+
+void camera_getmatrix(Camera* cam, Mat4* view, Mat4* proj) {
+ camera_getviewmatrix(cam, view);
+ camera_getprojmatrix(cam, proj);
+}
+
+void camera_getviewmatrix(Camera* cam, Mat4* out) {
+ if (!cam->is_viewdirty) {
+ if (out)*out = cam->view_matrix;
+ return;
+ }
+ transform_getinvmatrixnoscale(&cam->transform, &cam->view_matrix);
+ if(out) *out = cam->view_matrix;
+ cam->is_viewdirty = FALSE;
+}
+
+void camera_getprojmatrix(Camera* cam, Mat4* out) {
+ if (!cam->is_projdirty) {
+ if (out)*out = cam->proj_matrix;
+ return;
+ }
+ mat4_setperspective(cam->fov, cam->aspect, cam->near, cam->far, &cam->proj_matrix);
+ if(out) *out = cam->proj_matrix;
+ cam->is_projdirty = FALSE;
+}
+
+static void _onwheelscroll(Camera* cam, int wheel) {
+ Quat rot; transform_getrotation(&cam->transform, &rot);
+ Vec3 forward = {0,0,-1};
+ quat_applytovec3(&rot, &forward, &forward);
+ vec3_scale(&forward, cam->zoom_speed * wheel, &forward);
+ vec3_plus(&forward, &cam->transform.localposition, &cam->transform.localposition);
+ cam->is_viewdirty = TRUE;
+}
+
+void camera_onevent(Camera* cam, wog_Event* e) {
+ if(e == NULL) return ;
+ if (e->type == WOG_EMOUSEWHEEL) {//zoom in\zoom out
+ _onwheelscroll(cam, e->wheel);
+ }
+}