summaryrefslogtreecommitdiff
path: root/src/extend/camera.c
blob: 377a09ed58085a3c1943b2fa7ba748ffb414d279 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
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);
	}
}