diff options
author | chai <chaifix@163.com> | 2020-02-25 23:41:30 +0800 |
---|---|---|
committer | chai <chaifix@163.com> | 2020-02-25 23:41:30 +0800 |
commit | 1a94259666a0d98e98e6999f19cf07475b618e65 (patch) | |
tree | 502450d9ce77dca2234898badaf22a43ecf89d7e /src/extend/camera.c | |
parent | 87b9482459c1a27b8756514473ae392453db39ec (diff) |
*camera
Diffstat (limited to 'src/extend/camera.c')
-rw-r--r-- | src/extend/camera.c | 67 |
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; +} |