summaryrefslogtreecommitdiff
path: root/src/extend
diff options
context:
space:
mode:
Diffstat (limited to 'src/extend')
-rw-r--r--src/extend/camera.c24
-rw-r--r--src/extend/light.c0
-rw-r--r--src/extend/light.h25
-rw-r--r--src/extend/scene.c5
-rw-r--r--src/extend/scene.h17
-rw-r--r--src/extend/transform.h14
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