diff options
Diffstat (limited to 'src/extend')
-rw-r--r-- | src/extend/camera.c | 24 | ||||
-rw-r--r-- | src/extend/light.c | 0 | ||||
-rw-r--r-- | src/extend/light.h | 25 | ||||
-rw-r--r-- | src/extend/scene.c | 5 | ||||
-rw-r--r-- | src/extend/scene.h | 17 | ||||
-rw-r--r-- | src/extend/transform.h | 14 |
6 files changed, 73 insertions, 12 deletions
diff --git a/src/extend/camera.c b/src/extend/camera.c index 6426193..6b4c0d1 100644 --- a/src/extend/camera.c +++ b/src/extend/camera.c @@ -15,6 +15,8 @@ typedef struct Camera { Vec2 rotate_sensitivity; Vec2 move_sensitivity; Euler euler; + bool speedup; + float speedupv; /*events*/ bool look_around; Vec2 mouse_prev; @@ -39,12 +41,14 @@ Camera* camera_create(wog_Window* wnd, CameraConfig* config) { cam->aspect = config->aspect; cam->fov = config->fov; cam->zoom_speed = config->zoom_speed; + cam->speedup = FALSE; + cam->speedupv = 10; cam->look_around = FALSE; cam->move_around = FALSE; cam->rotate_sensitivity = config->rotate_sensitivity; cam->move_sensitivity = config->move_sensitivity; - cam->euler = cam->euler; + cam->euler = config->euler; cam->wnd = wnd; return cam; @@ -84,7 +88,7 @@ static void _onwheelscroll(Camera* cam, int wheel, float dt) { Quat rot; transform_getrotation(&cam->transform, &rot); Vec3 forward = {0,0,-1}; quat_applytovec3(&rot, &forward, &forward); - vec3_scale(&forward, cam->zoom_speed * wheel * dt, &forward); + vec3_scale(&forward, cam->zoom_speed * wheel * dt * (cam->speedup ? cam->speedupv : 1), &forward); vec3_plus(&forward, &cam->transform.localposition, &cam->transform.localposition); cam->is_viewdirty = TRUE; } @@ -96,8 +100,8 @@ static void _onlookaround(Camera* cam,float dt) { int x, y; wog_getMouse(cam->wnd, &x, &y); float dx = cam->mouse_prev.x - x, dy = y - cam->mouse_prev.y; - angle.x = dy * cam->rotate_sensitivity.y * dt; - angle.y = dx * cam->rotate_sensitivity.x * dt; + angle.x = dy * cam->rotate_sensitivity.y * dt * (cam->speedup ? cam->speedupv : 1); + angle.y = dx * cam->rotate_sensitivity.x * dt * (cam->speedup ? cam->speedupv : 1); cam->euler.pitch -= angle.x; cam->euler.yaw += angle.y; //printf("%f %f\n", cam->euler.pitch, cam->euler.yaw); @@ -111,8 +115,8 @@ static void _onmovearound(Camera* cam, float dt) { int x, y; wog_getMouse(cam->wnd, &x, &y); Vec3 dd = { cam->mouse_prev.x - x, y - cam->mouse_prev.y , 0}; - dd.x *= cam->move_sensitivity.x * dt; - dd.y *= cam->move_sensitivity.y * dt; + dd.x *= cam->move_sensitivity.x * dt * (cam->speedup ? cam->speedupv : 1); + dd.y *= cam->move_sensitivity.y * dt * (cam->speedup ? cam->speedupv : 1); quat_applytovec3(&cam->transform.localrotation, &dd, &dd); //printf("%f %f %f\n", dd.x, dd.y, dd.z); vec3_plus(&cam->transform.localposition, &dd, &cam->transform.localposition); @@ -143,6 +147,14 @@ void camera_onevent(Camera* cam, wog_Event* e, float dt) { if (e->button == WOG_MOUSE_MIDDLE) cam->move_around = FALSE; } + else if (e->type == WOG_EKEYDOWN) { + if (!cam->speedup && e->key == VK_SHIFT) + cam->speedup = TRUE; + } + else if (e->type == WOG_EKEYUP) { + if (e->key == VK_SHIFT) + cam->speedup = FALSE; + } } void camera_onupdate(Camera* cam, float dt) { diff --git a/src/extend/light.c b/src/extend/light.c new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/src/extend/light.c diff --git a/src/extend/light.h b/src/extend/light.h new file mode 100644 index 0000000..410dd72 --- /dev/null +++ b/src/extend/light.h @@ -0,0 +1,25 @@ +#ifndef _SOFTSHADEROOM_LIGHT_H_ +#define _SOFTSHADEROOM_LIGHT_H_ + +#include "../math/math.h" +#include "../core/texture.h" +#include "transform.h" + +typedef enum { + LIGHT_POINT, + LIGHT_DIRECTION, + LIGHT_SPOT, +} LightMode; + +typedef struct { + Transform transform; + LightMode mode; + Color32 color; + float range; +} Light; + +// LUT for lights +Texture* light_attenuation_tex; +Texture* light_cookie_tex; + +#endif
\ No newline at end of file diff --git a/src/extend/scene.c b/src/extend/scene.c new file mode 100644 index 0000000..1723928 --- /dev/null +++ b/src/extend/scene.c @@ -0,0 +1,5 @@ +#include "scene.h" + +Scene scene; + + diff --git a/src/extend/scene.h b/src/extend/scene.h new file mode 100644 index 0000000..9c30115 --- /dev/null +++ b/src/extend/scene.h @@ -0,0 +1,17 @@ +#ifndef _SOFTSHADEROOM_SCENE_H_ +#define _SOFTSHADEROOM_SCENE_H_ + +#include "light.h" +#include "camera.h" + +#define LIGHT_LIMIT 4 + +typedef struct { + Camera* main_camera; + Light lights[LIGHT_LIMIT]; int light_count; +} Scene; + +// singleton +extern Scene scene; + +#endif
\ No newline at end of file diff --git a/src/extend/transform.h b/src/extend/transform.h index cef4344..f9d650c 100644 --- a/src/extend/transform.h +++ b/src/extend/transform.h @@ -1,11 +1,11 @@ -#include "../math/math.h" +#ifndef _SOFTSHADEROOM_TRANSFORM_H_ +#define _SOFTSHADEROOM_TRANSFORM_H_ +#include "../math/math.h" typedef struct Transform Transform; -/* -** TransformҪעÒâ°´ scale -> rotation -> position ˳Ðò¼ÆËã -*/ -typedef struct Transform { + +struct Transform { /*local*/ Vec3 localposition; Vec3 localscale; @@ -15,7 +15,7 @@ typedef struct Transform { Vec3 cached_position; Vec3 cached_scale; Quat cached_rotation; -} Transform; +}; void transform_translate(Transform* trans, Vec3* v); @@ -30,3 +30,5 @@ void transform_setdirty(Transform* trans); void transform_getinvmatrixnoscale(Transform* transform, Mat4* worldToLocal); void transform_localtoworlddir(Transform* trans, Vec3* dir, Vec3* out); + +#endif
\ No newline at end of file |