summaryrefslogtreecommitdiff
path: root/src/extend/camera.c
diff options
context:
space:
mode:
authorchai <chaifix@163.com>2020-02-25 23:41:30 +0800
committerchai <chaifix@163.com>2020-02-25 23:41:30 +0800
commit1a94259666a0d98e98e6999f19cf07475b618e65 (patch)
tree502450d9ce77dca2234898badaf22a43ecf89d7e /src/extend/camera.c
parent87b9482459c1a27b8756514473ae392453db39ec (diff)
*camera
Diffstat (limited to 'src/extend/camera.c')
-rw-r--r--src/extend/camera.c67
1 files changed, 45 insertions, 22 deletions
diff --git a/src/extend/camera.c b/src/extend/camera.c
index e580b79..15bcc58 100644
--- a/src/extend/camera.c
+++ b/src/extend/camera.c
@@ -1,31 +1,38 @@
+#include "../shaders/common.h"
+#include "../core/device.h"
#include "camera.h"
-// A unity editor style camera
-void camera_init(Camera* cam, wog_Window* wnd) {
+Camera* camera_create(wog_Window* wnd, CameraConfig* config) {
+ Camera* cam = ssrM_new(Camera);
+
cam->is_viewdirty = cam->is_projdirty = TRUE;
// camera local = world
cam->transform.parent = NULL ;
- cam->transform.localposition = vec3_make(0, 0, 800);
+ cam->transform.localposition = config->position;
cam->transform.localscale = vec3_make(1, 1, 1);
- cam->transform.localrotation = quat_make(0, 0, 0);
+ quat_fromeuler(&config->euler, &cam->transform.localrotation);
- cam->near = 1;
- cam->far = 5500;
- cam->aspect = 600/480.f;
- cam->fov = 60;
- cam->zoom_speed = 4000;
+ cam->near = config->near;
+ cam->far = config->far;
+ cam->aspect = config->aspect;
+ cam->fov = config->fov;
+ cam->zoom_speed = config->zoom_speed;
cam->look_around = FALSE;
cam->move_around = FALSE;
- cam->rotate_sensitivity.x = 5;
- cam->rotate_sensitivity.y = 5;
- cam->move_sensitivity.x = 150;
- cam->move_sensitivity.y = 150;
- cam->euler.yaw = cam->euler.pitch = cam->euler.roll = 0;
-
+ cam->rotate_sensitivity = config->rotate_sensitivity;
+ cam->move_sensitivity = config->move_sensitivity;
+ cam->euler = cam->euler;
cam->wnd = wnd;
+
+ return cam;
+}
+
+void camera_destroy(Camera* cam) {
+ if(cam == NULL) return ;
+ ssrM_free(cam);
}
void camera_getmatrix(Camera* cam, Mat4* view, Mat4* proj) {
@@ -35,21 +42,21 @@ void camera_getmatrix(Camera* cam, Mat4* view, Mat4* proj) {
void camera_getviewmatrix(Camera* cam, Mat4* out) {
if (!cam->is_viewdirty) {
- if (out)*out = cam->view_matrix;
+ if (out)*out = cam->cached_view_matrix;
return;
}
- transform_getinvmatrixnoscale(&cam->transform, &cam->view_matrix);
- if(out) *out = cam->view_matrix;
+ transform_getinvmatrixnoscale(&cam->transform, &cam->cached_view_matrix);
+ if(out) *out = cam->cached_view_matrix;
cam->is_viewdirty = FALSE;
}
void camera_getprojmatrix(Camera* cam, Mat4* out) {
if (!cam->is_projdirty) {
- if (out)*out = cam->proj_matrix;
+ if (out)*out = cam->cached_proj_matrix;
return;
}
- mat4_setperspective(cam->fov, cam->aspect, cam->near, cam->far, &cam->proj_matrix);
- if(out) *out = cam->proj_matrix;
+ mat4_setperspective(cam->fov, cam->aspect, cam->near, cam->far, &cam->cached_proj_matrix);
+ if(out) *out = cam->cached_proj_matrix;
cam->is_projdirty = FALSE;
}
@@ -123,4 +130,20 @@ void camera_onupdate(Camera* cam, float dt) {
_onlookaround(cam, dt);
if (cam->move_around)
_onmovearound(cam, dt);
-} \ No newline at end of file
+}
+
+void camera_ondraw(Camera* cam) {
+ /*set vp matrix*/
+ ssr_matrixmode(MATRIX_PROJECTION);
+ camera_getprojmatrix(&cam, NULL);
+ ssr_loadmatrix(&cam->cached_proj_matrix);
+ ssr_matrixmode(MATRIX_VIEW);
+ camera_getviewmatrix(&cam, NULL);
+ ssr_loadmatrix(&cam->cached_view_matrix);
+ ssr_matrixmode(MATRIX_MODEL);
+ /*set builtin variables*/
+ _proj_params.x = cam->near;
+ _proj_params.y = cam->far;
+ _proj_params.z = cam->fov;
+ _proj_params.w = cam->aspect;
+}