summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorchai <chaifix@163.com>2020-02-26 22:52:19 +0800
committerchai <chaifix@163.com>2020-02-26 22:52:19 +0800
commit372d77e436d21312ef1a0df622964751716963a3 (patch)
tree1a71865fea6fb9f2f532422c4b83959fff17ea76 /src
parent27687536844ed3b045bba1abd1aae8bb3692f6cb (diff)
*misc
Diffstat (limited to 'src')
-rw-r--r--src/core/clip.c2
-rw-r--r--src/core/device.c6
-rw-r--r--src/core/limits.h2
-rw-r--r--src/core/rasterizer.c20
-rw-r--r--src/core/shader.c15
-rw-r--r--src/core/shader.h10
-rw-r--r--src/example/03_texture/03_texture.c44
-rw-r--r--src/example/example.h5
-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
-rw-r--r--src/extern/wog.c4
-rw-r--r--src/extern/wog.h72
-rw-r--r--src/gizmo/gizmo.c83
-rw-r--r--src/gizmo/gizmo.h12
-rw-r--r--src/main.c66
-rw-r--r--src/shaders/common.c1
-rw-r--r--src/shaders/common.h6
-rw-r--r--src/shaders/pbr.c2
22 files changed, 346 insertions, 89 deletions
diff --git a/src/core/clip.c b/src/core/clip.c
index 48c376d..eb42fb7 100644
--- a/src/core/clip.c
+++ b/src/core/clip.c
@@ -190,7 +190,7 @@ static bool clip_against_plane(
, byte* dst_data[]
, uint prim_vcount/*minimum number of primitive vertices*/
) {
- bool varying = varying_flag & VARYING_ANY;
+ bool varying = (varying_flag & VARYING_ANY) != 0;
int idx = 0;
ClippedVert *prev, *curr;
uint previ, curri;
diff --git a/src/core/device.c b/src/core/device.c
index 70ae11f..6b2bb7c 100644
--- a/src/core/device.c
+++ b/src/core/device.c
@@ -22,7 +22,7 @@ typedef struct {
} VertexAttr;
static struct {
- Mat4 matrices[3][MATRIXDEPTH];
+ Mat4 matrices[3][MATRIX_DEPTH];
uint matrix_top[3];
ssr_MatrixMode matrix_mode;
@@ -155,13 +155,13 @@ void ssr_loadidentity() {
}
void ssr_pushmatrix() {
- ssr_assert(MATRIXTOP < MATRIXDEPTH - 1);
+ ssr_assert(MATRIXTOP < MATRIX_DEPTH - 1);
++MATRIXTOP;
MATRIX = MATRIXSTACK[MATRIXTOP - 1];
}
void ssr_popmatrix() {
- MATRIXTOP = clamp(--MATRIXTOP, 0, MATRIXDEPTH - 1);
+ MATRIXTOP = clamp(--MATRIXTOP, 0, MATRIX_DEPTH - 1);
}
/*http://warmcat.org/chai/blog/?p=559*/
diff --git a/src/core/limits.h b/src/core/limits.h
index 4ef0b75..229f535 100644
--- a/src/core/limits.h
+++ b/src/core/limits.h
@@ -1,6 +1,6 @@
#ifndef _SOFTSHADEROOM_LIMITS_H_
#define _SOFTSHADEROOM_LIMITS_H_
-#define MATRIXDEPTH 32
+#define MATRIX_DEPTH 32
#endif \ No newline at end of file
diff --git a/src/core/rasterizer.c b/src/core/rasterizer.c
index d6a9fc1..d926cb0 100644
--- a/src/core/rasterizer.c
+++ b/src/core/rasterizer.c
@@ -237,15 +237,15 @@ void ssrR_line(
) {
ssr_assert(CA && CB && program && uniforms);
- Vec3 SA, SB;
- vec4_dividew(CA, &SA); ssrU_viewport(&SA, &SA);
- vec4_dividew(CB, &SB); ssrU_viewport(&SB, &SB);
+ Vec4 SA, SB;
+ vec4_dividewnoz(CA, &SA); ssrU_viewport(&SA, &SA);
+ vec4_dividewnoz(CB, &SB); ssrU_viewport(&SB, &SB);
FragmentShader frag_shader = program->fragmentshader;
int x0 = SA.x, y0 = SA.y;
int x1 = SB.x, y1 = SB.y;
- float wA = 1 / CA->w, wB = 1 / CB->w;
+ float wA = SA.w, wB = SB.w;
float zA = SA.z, zB = SB.z;
bool steep = FALSE;
@@ -262,6 +262,8 @@ void ssrR_line(
swapf(zA, zB);
}
+ float inv_wA = 1 / wA, inv_wB = 1 / wB;
+
bool depth_test = ssr_isenable(ENABLE_DEPTHTEST);
bool blend = ssr_isenable(ENABLE_BLEND);
bool write_depth = ssr_isenable(ENABLE_WRITEDEPTH);
@@ -274,15 +276,15 @@ void ssrR_line(
#define discardif(condition) if(condition) continue
- float t, depth;
+ float t, z, w, depth;
Vec2 c;
int x, y, px, py;
for (x = x0; x <= x1; ++x) {
t = (x - x0) / (float)(x1 - x0);
y = y0 + (y1 - y0)*t;
/*caculate center*/
- c.x = (1 - t) * wA;
- c.y = t * wB;
+ c.x = (1 - t) * inv_wA;
+ c.y = t * inv_wB;
discardif(compare(c.x+c.y, 0));
c.x /= (c.x + c.y);
t = 1 - c.x;
@@ -295,7 +297,9 @@ void ssrR_line(
py = y;
}
if (depth_test) {
- ssrS_lerpnum(t, &zA, &zB, &depth);
+ ssrS_lerpnum(t, &zA, &zB, &z);
+ ssrS_lerpnum(t, &wA, &wB, &w);
+ depth = z / w;
pass_depth_test = ssr_testdepth(px, py, depth);
}
if (stencil_test) {
diff --git a/src/core/shader.c b/src/core/shader.c
index 899a160..b523df7 100644
--- a/src/core/shader.c
+++ b/src/core/shader.c
@@ -267,35 +267,40 @@ Vec4* ssrS_bcpvec4(Vec3* bc, Vec4* A, Vec4* B, Vec4* C, Vec4* out) {
return out;
}
-void ssrS_lerpnum(float t, float* A, float* B, float* out) {
+float* ssrS_lerpnum(float t, float* A, float* B, float* out) {
*out = lerp(*A, *B, t);
+ return out;
}
-void ssrS_lerpcolor(float t, Color A, Color B, Color* out) {
+Color* ssrS_lerpcolor(float t, Color A, Color B, Color* out) {
*out = ssr_color(
lerp(COLOR_R(A), COLOR_R(B), t),
lerp(COLOR_G(A), COLOR_G(B), t),
lerp(COLOR_B(A), COLOR_B(B), t),
lerp(COLOR_A(A), COLOR_A(B), t)
);
+ return out;
}
-void ssrS_lerpvec2(float t, Vec2* A, Vec2* B, Vec2* out) {
+Vec2* ssrS_lerpvec2(float t, Vec2* A, Vec2* B, Vec2* out) {
out->x = lerp(A->x, B->x, t);
out->y = lerp(A->y, B->y, t);
+ return out;
}
-void ssrS_lerpvec3(float t, Vec3* A, Vec3* B, Vec3* out) {
+Vec3* ssrS_lerpvec3(float t, Vec3* A, Vec3* B, Vec3* out) {
out->x = lerp(A->x, B->x, t);
out->y = lerp(A->y, B->y, t);
out->z = lerp(A->z, B->z, t);
+ return out;
}
-void ssrS_lerpvec4(float t, Vec4* A, Vec4* B, Vec4* out) {
+Vec4* ssrS_lerpvec4(float t, Vec4* A, Vec4* B, Vec4* out) {
out->x = lerp(A->x, B->x, t);
out->y = lerp(A->y, B->y, t);
out->z = lerp(A->z, B->z, t);
out->w = lerp(A->w, B->w, t);
+ return out;
}
static Color32 _out_color[RENDER_TARGET_COUNT];
diff --git a/src/core/shader.h b/src/core/shader.h
index 26606b8..70b4ce9 100644
--- a/src/core/shader.h
+++ b/src/core/shader.h
@@ -113,11 +113,11 @@ Vec2* ssrS_bcpvec2(Vec3* bc, Vec2* A, Vec2* B, Vec2* C, Vec2* out);
Vec3* ssrS_bcpvec3(Vec3* bc, Vec3* A, Vec3* B, Vec3* C, Vec3* out);
Vec4* ssrS_bcpvec4(Vec3* bc, Vec4* A, Vec4* B, Vec4* C, Vec4* out);
-void ssrS_lerpcolor(float t, Color A, Color B, Color* out);
-void ssrS_lerpnum(float t, float* A, float* B, float* out);
-void ssrS_lerpvec2(float t, Vec2* A, Vec2* B, Vec2* out);
-void ssrS_lerpvec3(float t, Vec3* A, Vec3* B, Vec3* out);
-void ssrS_lerpvec4(float t, Vec4* A, Vec4* B, Vec4* out);
+Color* ssrS_lerpcolor(float t, Color A, Color B, Color* out);
+float* ssrS_lerpnum(float t, float* A, float* B, float* out);
+Vec2* ssrS_lerpvec2(float t, Vec2* A, Vec2* B, Vec2* out);
+Vec3* ssrS_lerpvec3(float t, Vec3* A, Vec3* B, Vec3* out);
+Vec4* ssrS_lerpvec4(float t, Vec4* A, Vec4* B, Vec4* out);
typedef enum {
REGTYPE_NUM = 1,
diff --git a/src/example/03_texture/03_texture.c b/src/example/03_texture/03_texture.c
index c09efe0..b390825 100644
--- a/src/example/03_texture/03_texture.c
+++ b/src/example/03_texture/03_texture.c
@@ -41,16 +41,7 @@ static Texture* cyborg_albedo;
static Mesh* cyborg_mesh;
void onload_texture(void* data) {
- //ssr_matrixmode(MATRIX_PROJECTION);
- //ssr_loadidentity();
- //ssr_perspective(90, ssr_getaspect(), 0.1, 10);
- //ssr_ortho(-5, 5, -4, 4, 0.1, 10);
-
- ssr_bindvertices(verts, 8, cube, 12);
- ssr_useprogram(&ssr_built_in_shader_pbr);
- ssr_enable(ENABLE_BACKFACECULL | ENABLE_DEPTHTEST | ENABLE_WRITEDEPTH | ENABLE_BLEND);
-
- ssr_setblendfunc(BLEND_SRC_ALPHA, BLEND_ONE_MINUS_SRC_ALPHA);
+ CameraConfig* conf = (CameraConfig*)data;
mech_albedo = texture_loadfromfile("res/dieselpunk/mech_basecolor.tga");
mech_normal = texture_loadfromfile("res/dieselpunk/mech_normal.tga");
@@ -67,40 +58,30 @@ void onload_texture(void* data) {
}
void onevent_texture(void* data) {
+ wog_Event* e = (wog_Event*)data;
}
-static float _t = 0;
-static Quat q;
-
void onupdate_texture(void*data) {
- uint dt = *(uint*)data;
- _t += dt / 1000.f;
-
- //ssr_matrixmode(MATRIX_VIEW);
- //ssr_loadidentity();
- //float distance = 2;
- //Vec3 p = { 0, 0, 10 }, target = { 0, 0, 0 };
- ////Vec3 p = { 0, 0, 700}, target = { 0, 0, 0 };
- //ssr_lookat(&p, &target, &vec3up);
-
ssr_matrixmode(MATRIX_MODEL);
ssr_loadidentity();
- //ssr_translate(0, 0, -700);
- //ssr_rotate(_t * 10, 0, 1, 0);
Vec3 light = {1, 0, 0};
ssr_setuniformvec3(0, &light);
Mat4 world2object;
ssr_getm(&world2object);
- //mat4_invertgeneral3d(&world2object, &world2object);
- //mat4_transpose(&world2object, &world2object); // transpose it
ssr_setuniformmat4(0, &world2object);
}
void ondraw_texture(void*data) {
- ssr_clearcolor(0);
+ ssr_bindvertices(verts, 8, cube, 12);
+ ssr_useprogram(&ssr_built_in_shader_pbr);
+ ssr_enable(ENABLE_BACKFACECULL | ENABLE_DEPTHTEST | ENABLE_WRITEDEPTH | ENABLE_BLEND);
+
+ ssr_setblendfunc(BLEND_SRC_ALPHA, BLEND_ONE_MINUS_SRC_ALPHA);
+
+ ssr_clearcolor(0xff202020);
ssr_cleardepth();
ssr_clearstencil(0);
/*
@@ -108,6 +89,7 @@ void ondraw_texture(void*data) {
ssr_setstencilfunc(STENCILFUNC_ALWAYS, 1, 0xff);
ssr_setstencilop(STENCILOP_KEEP, STENCILOP_KEEP, STENCILOP_REPLACE);
*/
+
/*render mech*/
ssr_setuniformtex(0, mech_albedo);
ssr_setuniformtex(1, mech_normal);
@@ -129,8 +111,8 @@ void ondraw_texture(void*data) {
ssr_bindvertices(ground_mesh->vertices, ground_mesh->vert_count, ground_mesh->triangles, ground_mesh->tris_count);
ssr_draw(PRIMITIVE_TRIANGLE);
+ //ssr_setuniformtex(0, cyborg_albedo);
+ //ssr_bindvertices(cyborg_mesh->vertices, cyborg_mesh->vert_count, cyborg_mesh->triangles, cyborg_mesh->tris_count);
+ //ssr_draw(PRIMITIVE_TRIANGLE);
- //ssr_setuniformtex(0, cyborg_albedo);
- //ssr_bindvertices(cyborg_mesh->vertices, cyborg_mesh->vert_count, cyborg_mesh->triangles, cyborg_mesh->tris_count);
- //ssr_draw(PRIMITIVE_TRIANGLE);
}
diff --git a/src/example/example.h b/src/example/example.h
index bcf9ebc..8e2874d 100644
--- a/src/example/example.h
+++ b/src/example/example.h
@@ -3,7 +3,8 @@
#include "../ssr.h"
#include "../util/type.h"
-//#include "SDL2/SDL.h"
+#include "../extend/camera.h"
+#include "../gizmo/gizmo.h"
#define EXAMPLE(i)\
extern void onload_##i(void*);\
@@ -11,7 +12,7 @@ extern void onevent_##i(void*);\
extern void onupdate_##i(void*);\
extern void ondraw_##i(void*);
-#define EXAMPLECUR texture
+#define CURRENT_EXAMPLE texture
/*All examples*/
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
diff --git a/src/extern/wog.c b/src/extern/wog.c
index 04a84c7..0578439 100644
--- a/src/extern/wog.c
+++ b/src/extern/wog.c
@@ -86,7 +86,8 @@ void wog_handleEvent(wog_Window* window, MSG* msg, wog_Event* e)
return ;
}
- case WM_KEYDOWN:
+ case WM_KEYDOWN:
+ case WM_SYSKEYDOWN:
if ((wParam >= 0) && (wParam <= 255))
{
zero_mem(e, sizeof(wog_Event));
@@ -98,6 +99,7 @@ void wog_handleEvent(wog_Window* window, MSG* msg, wog_Event* e)
break;
case WM_KEYUP:
+ case WM_SYSKEYUP:
if ((wParam >= 0) && (wParam <= 255))
{
zero_mem(e, sizeof(wog_Event));
diff --git a/src/extern/wog.h b/src/extern/wog.h
index 0b2540e..35bd51d 100644
--- a/src/extern/wog.h
+++ b/src/extern/wog.h
@@ -55,6 +55,78 @@ typedef struct wog_Event
//};
}wog_Event;
+//* VK_0 - VK_9 are the same as ASCII '0' - '9' (0x30 - 0x39)
+ //* 0x40 : unassigned
+ //* VK_A - VK_Z are the same as ASCII 'A' - 'Z' (0x41 - 0x5A)
+
+//定义数据字符0~9
+#define VK_0 0x30
+#define VK_1 0x31
+#define VK_2 0x32
+#define VK_3 0x33
+#define VK_4 0x34
+#define VK_5 0x35
+#define VK_6 0x36
+#define VK_7 0x37
+#define VK_8 0x38
+#define VK_9 0x39
+
+//定义数据字符A~Z
+#define VK_A 0x41
+#define VK_B 0x42
+#define VK_C 0x43
+#define VK_D 0x44
+#define VK_E 0x45
+#define VK_F 0x46
+#define VK_G 0x47
+#define VK_H 0x48
+#define VK_I 0x49
+#define VK_J 0x4A
+#define VK_K 0x4B
+#define VK_L 0x4C
+#define VK_M 0x4D
+#define VK_N 0x4E
+#define VK_O 0x4F
+#define VK_P 0x50
+#define VK_Q 0x51
+#define VK_R 0x52
+#define VK_S 0x53
+#define VK_T 0x54
+#define VK_U 0x55
+#define VK_V 0x56
+#define VK_W 0x57
+#define VK_X 0x58
+#define VK_Y 0x59
+#define VK_Z 0x5A
+
+//定义数据字符a~z
+#define VK_a 0x61
+#define VK_b 0x62
+#define VK_c 0x63
+#define VK_d 0x64
+#define VK_e 0x65
+#define VK_f 0x66
+#define VK_g 0x67
+#define VK_h 0x68
+#define VK_i 0x69
+#define VK_j 0x6A
+#define VK_k 0x6B
+#define VK_l 0x6C
+#define VK_m 0x6D
+#define VK_n 0x6E
+#define VK_o 0x6F
+#define VK_p 0x70
+#define VK_q 0x71
+#define VK_r 0x72
+#define VK_s 0x73
+#define VK_t 0x74
+#define VK_u 0x75
+#define VK_v 0x76
+#define VK_w 0x77
+#define VK_x 0x78
+#define VK_y 0x79
+#define VK_z 0x7A
+
typedef struct {
int width, height, channels;
unsigned char* buffer;
diff --git a/src/gizmo/gizmo.c b/src/gizmo/gizmo.c
new file mode 100644
index 0000000..e3eaaf1
--- /dev/null
+++ b/src/gizmo/gizmo.c
@@ -0,0 +1,83 @@
+#include "gizmo.h"
+#include "../core/device.h"
+#include "../math/math.h"
+#include "../shaders/common.h"
+
+struct {
+ bool show_grid, g_pressing;
+} gizmo_state;
+
+void gizmo_init() {
+ gizmo_state.show_grid = FALSE;
+ gizmo_state.g_pressing = FALSE;
+}
+
+void gizmo_onevent(wog_Event* e, float dt) {
+ if (e == NULL) return;
+ if (e->type == WOG_EKEYDOWN) {
+ if (e->key == VK_G && !gizmo_state.g_pressing) {
+ gizmo_state.show_grid = !gizmo_state.show_grid;
+ gizmo_state.g_pressing = TRUE;
+ }
+ }
+ else if (e->type == WOG_EKEYUP) {
+ if(e->key == VK_G)
+ gizmo_state.g_pressing = FALSE;
+ }
+}
+
+void gizmo_onupdate(float dt) {
+}
+
+void gizmo_ondraw() {
+ if (gizmo_state.show_grid)
+ gizmo_grid();
+}
+
+// varying
+#define _color reg_v4_00
+static void vert(UniformCollection* uniforms, VertexShaderIn* in, Vec4* clipcoord) {
+ static Vec4 p; p.xyz = in->vertex->position; p.w = 1;
+ object2clip(&p, clipcoord);
+ color_tocolor32(in->vertex->color, _color);
+}
+static bool frag(UniformCollection* uniforms, FragmentShaderIn* in, Color32* color) {
+ *color = *_color;
+ return 1;
+}
+static Program line_shader = {
+ vert, frag,
+ VARYING_V4_00
+};
+
+void gizmo_grid() {
+ Vert verts[] = {
+ {0, {-10000, 0, 0}, vec3zero, vec4zero, vec2zero, 0xffff0000},
+ {1, {10000, 0, 0}, vec3zero, vec4zero, vec2zero, 0xffff0000},
+ {2, {0, -10000, 0}, vec3zero, vec4zero, vec2zero, 0xff00ff00},
+ {3, {0, 10000, 0}, vec3zero, vec4zero, vec2zero, 0xff00ff00},
+ {4, {0, 0, -10000}, vec3zero, vec4zero, vec2zero, 0xff0000ff},
+ {5, {0, 0, 10000}, vec3zero, vec4zero, vec2zero, 0xff0000ff},
+ };
+ int grid[] = { 0, 1, 2, 3, 4, 5 };
+ ssr_bindvertices(&verts, 6, &grid, 3);
+ ssr_matrixmode(MATRIX_MODEL);
+ ssr_loadidentity();
+ ssr_useprogram(&line_shader);
+ ssr_draw(PRIMITIVE_LINE);
+ ssr_unuseprogram();
+}
+
+void gizmo_line(Vec3 start, Vec3 end, Color32 color) {
+ Vert verts[] = {
+ {0, start, vec3zero, vec4zero, vec2zero, color32_tocolor(&color)},
+ {1, end, vec3zero, vec4zero, vec2zero, color32_tocolor(&color)},
+ };
+ int line[] = { 0, 1};
+ ssr_bindvertices(&verts, 2, &line, 1);
+ ssr_matrixmode(MATRIX_MODEL);
+ ssr_loadidentity();
+ ssr_useprogram(&line_shader);
+ ssr_draw(PRIMITIVE_LINE);
+ ssr_unuseprogram();
+}
diff --git a/src/gizmo/gizmo.h b/src/gizmo/gizmo.h
index 9e416d0..e95880b 100644
--- a/src/gizmo/gizmo.h
+++ b/src/gizmo/gizmo.h
@@ -1,7 +1,9 @@
#ifndef _SOFTSHADEROOM_GIZMO_H_
#define _SOFTSHADEROOM_GIZMO_H_
+#include "../extern/wog.h"
#include "../math/math.h"
+#include "../core/vert.h"
/*gizmos for visualizing*/
@@ -10,8 +12,16 @@ typedef enum GizmoIcon2d {
ICON2D_CAMERA,
}GizmoIcon2d;
-void gizmo_icon2d(float x, float y, float z, GizmoIcon2d icon);
+void gizmo_init();
+
+void gizmo_onevent(wog_Event* e, float dt);
+void gizmo_onupdate(float dt);
+void gizmo_ondraw();
+void gizmo_grid();
+
+void gizmo_icon2d(float x, float y, float z, GizmoIcon2d icon);
+void gizmo_line(Vec3 start, Vec3 end, Color32 color);
#endif \ No newline at end of file
diff --git a/src/main.c b/src/main.c
index b0ee5df..4645ad7 100644
--- a/src/main.c
+++ b/src/main.c
@@ -7,10 +7,26 @@
#include "extern/wog.h"
#include "shaders/common.h"
#include "extend/camera.h"
+#include "extend/scene.h"
+
+#define TITLE "Soft Shade Room"
#define SCREEN_WIDTH 600.f
#define SCREEN_HEIGHT 480.f
+static char* instruction =
+"/*********************************************/\n"
+"/* SoftShadeRoom */\n"
+"/* chai */\n"
+"/*********************************************/\n"
+"Instructions:\n"
+"RightMouseButton+MouseMove: look around\n"
+"MiddleMouseButton+MouseMove: move around\n"
+"MouseScroll: zoom in\\zoom out\n"
+"Shift+Above Operation: speed up\n"
+"key-g: show\\hide grid\n"
+"----------------------------------------------\n";
+
typedef void(*F)(void*);
F onload;
@@ -18,20 +34,21 @@ F onupdate;
F onevent;
F ondraw;
-/*https://stackoverflow.com/questions/1489932/how-to-concatenate-twice-with-the-c-preprocessor-and-expand-a-macro-as-in-arg*/
-#define SETEXAMPLEF(f, e) \
+#define SET_EXAMPLE_FUNC(f, e) \
f = f##_##e;
-#define SETEXAMPLE(i) \
- SETEXAMPLEF(onload, i)\
- SETEXAMPLEF(ondraw, i)\
- SETEXAMPLEF(onevent, i)\
- SETEXAMPLEF(onupdate, i)
+#define SET_EXAMPLE(i) \
+ SET_EXAMPLE_FUNC(onload, i)\
+ SET_EXAMPLE_FUNC(ondraw, i)\
+ SET_EXAMPLE_FUNC(onevent, i)\
+ SET_EXAMPLE_FUNC(onupdate, i)
int main(int argc, char* argv[]) {
- wog_Window* wnd = wog_createWindow("Soft Shade Room", SCREEN_WIDTH, SCREEN_HEIGHT, 500, 500, 0);
+ printf(instruction);
+
+ SET_EXAMPLE(CURRENT_EXAMPLE);
+ wog_Window* wnd = wog_createWindow(TITLE, SCREEN_WIDTH, SCREEN_HEIGHT, 500, 500, 0);
wog_Surface* surface = wog_getsurface(wnd); // ARGB format
- Camera* camera;
/* init ssr */
ssr_Config config = {
SCREEN_WIDTH, SCREEN_HEIGHT,
@@ -39,19 +56,24 @@ int main(int argc, char* argv[]) {
surface->buffer
};
ssr_init(&config);
- SETEXAMPLE(EXAMPLECUR);
/*set up global camera*/
- CameraConfig cam_config = { /*default camera setting*/
- {0, 0, 800},
+ CameraConfig cam_config = {
+ {0, 10, 800},
{0, 0, 0},
- 60, SCREEN_WIDTH / SCREEN_HEIGHT, 0.1, 1500,
+ 60, SCREEN_WIDTH / SCREEN_HEIGHT, 0.1, 100000,
{5, 5}, {150, 150},
4000,
};
onload(&cam_config);
- camera = camera_create(wnd, &cam_config);
+ scene.main_camera = camera_create(wnd, &cam_config);
+ gizmo_init();
wog_show(wnd);
+ _screen_params.x = SCREEN_WIDTH;
+ _screen_params.y = SCREEN_HEIGHT;
+ _screen_params.z = 1 / SCREEN_WIDTH;
+ _screen_params.w = 1 / SCREEN_HEIGHT;
+
/* main loop */
uint prev = wog_tick();
uint dt = 0;
@@ -62,9 +84,15 @@ int main(int argc, char* argv[]) {
while (1) {
/*handle events*/
while (wog_pollEvent(wnd, &e)) {
- camera_onevent(camera, &e, _dt);
+ camera_onevent(scene.main_camera, &e, _dt);
+ gizmo_onevent(&e, _dt);
if (e.type == WOG_ECLOSE) {
goto quit;
+ }
+ else if (e.type == WOG_EKEYDOWN) {
+ if (e.key == VK_ESCAPE) {
+ goto quit;
+ }
} else {
onevent(&e);
}
@@ -86,12 +114,14 @@ int main(int argc, char* argv[]) {
/*update*/
_dt = dt / 1000.f;
- camera_onupdate(camera, _dt);
+ camera_onupdate(scene.main_camera, _dt);
+ gizmo_onupdate(_dt);
onupdate(&_dt);
/*draw*/
- camera_ondraw(camera);
+ camera_ondraw(scene.main_camera);
ondraw(NULL);
+ gizmo_ondraw();
ssr_present();
wog_updateSurface(wnd);
@@ -99,7 +129,7 @@ int main(int argc, char* argv[]) {
}
quit:
- camera_destroy(camera);
+ camera_destroy(scene.main_camera);
wog_destroyWindow(wnd);
return 0;
diff --git a/src/shaders/common.c b/src/shaders/common.c
index 411c7e4..333b433 100644
--- a/src/shaders/common.c
+++ b/src/shaders/common.c
@@ -2,6 +2,7 @@
Vec4 _proj_params;
Vec2 _time;
+Vec4 _screen_params;
Vec3 unpacknormal(Color32 c32) {
Vec3 normal = {
diff --git a/src/shaders/common.h b/src/shaders/common.h
index 36f80c0..61066e5 100644
--- a/src/shaders/common.h
+++ b/src/shaders/common.h
@@ -35,6 +35,12 @@ Vec4 _proj_params;
// duration
Vec2 _time;
+// width
+// height
+// 1 / width
+// 1 / height
+Vec4 _screen_params;
+
/************************************************************************/
/* functions */
/************************************************************************/
diff --git a/src/shaders/pbr.c b/src/shaders/pbr.c
index 666f758..9bb051d 100644
--- a/src/shaders/pbr.c
+++ b/src/shaders/pbr.c
@@ -56,7 +56,7 @@ static bool frag(UniformCollection* uniforms, FragmentShaderIn* in, Color32* col
//vec3_scale(&c, roughness, &c);
color32_saturate(&c);
*color = c;
- vec3_scale(color, 1 - depth, color);
+ //vec3_scale(color, 1 - depth, color);
return 1;
}