diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/core/device.c | 34 | ||||
-rw-r--r-- | src/core/shader.h | 1 | ||||
-rw-r--r-- | src/example/03_texture/03_texture.c | 51 | ||||
-rw-r--r-- | src/extend/camera.c | 30 | ||||
-rw-r--r-- | src/extern/wog.c | 47 | ||||
-rw-r--r-- | src/extern/wog.h | 2 | ||||
-rw-r--r-- | src/main.c | 2 | ||||
-rw-r--r-- | src/platform/win.c | 20 | ||||
-rw-r--r-- | src/platform/win.h | 6 | ||||
-rw-r--r-- | src/shaders/common/core.c | 10 | ||||
-rw-r--r-- | src/shaders/common/core.h | 18 | ||||
-rw-r--r-- | src/shaders/pbr.c | 26 |
12 files changed, 135 insertions, 112 deletions
diff --git a/src/core/device.c b/src/core/device.c index 5ff39ef..b810c04 100644 --- a/src/core/device.c +++ b/src/core/device.c @@ -500,7 +500,23 @@ static struct { extern ClippedBuffer clip_buffer; /*clipping result*/ static bool is_back_face(Vec4* c0, Vec4* c1, Vec4*c2) { +#define OPENGL_BACKFACE_CULLING 0 /*cull in ndc*/ +#if OPENGL_BACKFACE_CULLING + /*opengl backface culling algrithm*/ + float w0 = max(1 / c0->w, 0), w1 = 1 / c1->w, w2 = 1 / c2->w; + Vec2 a = { c0->x * w0, c0->y * w0 }; + Vec2 b = { c1->x * w1, c1->y * w1 }; + Vec2 c = { c2->x * w2, c2->y * w2 }; + float signed_area = 0; + signed_area += a.x * b.y - a.y * b.x; + signed_area += b.x * c.y - b.y * c.x; + signed_area += c.x * a.y - c.y * a.x; + if (signed_area <= 0) { + return TRUE; + } + return FALSE; +#else float w0 = 1 / c0->w, w1 = 1 / c1->w, w2 = 1 / c2->w; bool all_front = w0 > 0 && w1 > 0 && w2 > 0; if (all_front) @@ -511,25 +527,11 @@ static bool is_back_face(Vec4* c0, Vec4* c1, Vec4*c2) { ac.x = c2->x * w2 - c0->x * w0; ac.y = c2->y * w2 - c0->y * w0; if (ab.x * ac.y - ab.y * ac.x <= 0) { - return TRUE; + return TRUE; } } return FALSE; - /*OpenGL algrithm*/ - /* - float w0 = max(1 / c0->w, 0), w1 = 1 / c1->w, w2 = 1 / c2->w; - Vec2 a = { c0->x * w0, c0->y * w0 }; - Vec2 b = { c1->x * w1, c1->y * w1 }; - Vec2 c = { c2->x * w2, c2->y * w2 }; - float signed_area = 0; - signed_area += a.x * b.y - a.y * b.x; - signed_area += b.x * c.y - b.y * c.x; - signed_area += c.x * a.y - c.y * a.x; - if (signed_area <= 0) { - return TRUE; - } - return FALSE; - */ +#endif } static void render_prims_triangle(uint varying_flag) { diff --git a/src/core/shader.h b/src/core/shader.h index be3819f..335eead 100644 --- a/src/core/shader.h +++ b/src/core/shader.h @@ -160,6 +160,7 @@ ActiveReg active_regs[REG_TOTAL]; int open_regsi[REG_TOTAL]; /*active registers during a draw call*/ +/*reference pointers*/ float *reg_num_00, *reg_num_01, *reg_num_02, *reg_num_03; Vec2 *reg_v2_00, *reg_v2_01, *reg_v2_02, *reg_v2_03, *reg_v2_04, *reg_v2_05, *reg_v2_06, *reg_v2_07; Vec3 *reg_v3_00, *reg_v3_01, *reg_v3_02, *reg_v3_03, *reg_v3_04, *reg_v3_05, *reg_v3_06, *reg_v3_07, *reg_v3_08, *reg_v3_09, *reg_v3_10, *reg_v3_11; diff --git a/src/example/03_texture/03_texture.c b/src/example/03_texture/03_texture.c index 23597c9..66643bb 100644 --- a/src/example/03_texture/03_texture.c +++ b/src/example/03_texture/03_texture.c @@ -48,23 +48,24 @@ Texture* base_color_texs[]; EXAMPLE void onload_texture(void* data) { CameraConfig* conf = (CameraConfig*)data; - //mech_albedo = texture_loadfromfile("res/dieselpunk/mech_basecolor.tga"); - //mech_albedo = texture_loadfromfile("res/station/textures/projekt_Gas_BaseColor.png"); - mech_albedo = texture_loadfromfile("res/townscaper/town_diffuse.jpg"); - mech_normal = texture_loadfromfile("res/dieselpunk/mech_normal.tga"); - mech_roughness = texture_loadfromfile("res/dieselpunk/mech_roughness.tga"); - mech_metalness = texture_loadfromfile("res/dieselpunk/mech_metalness.tga"); - mech_mesh = mesh_loadfromobj("res/townscaper/town.obj"); - //mech_mesh = mesh_loadfromobj("res/gun/gun.obj"); - //mech_mesh = mesh_loadfromobj("res/station/station.obj"); - //mech_mesh = mesh_loadfromobj("res/gun/triangle.obj"); - ground_albedo = texture_loadfromfile("res/dieselpunk/ground_basecolor.tga"); - ground_mesh = mesh_loadfromobj("res/dieselpunk/ground.obj"); - yingham_albedo = texture_loadfromfile("res/dieselpunk/yingham_basecolor.tga"); - yingham_mesh = mesh_loadfromobj("res/dieselpunk/yingham.obj"); - - cyborg_albedo = texture_loadfromfile("res/cyborg/cyborg_diffuse.png"); - cyborg_mesh = mesh_loadfromobj("res/cyborg/cyborg.obj"); + mech_albedo = texture_loadfromfile("assets/dieselpunk/mech_basecolor.tga"); + //mech_albedo = texture_loadfromfile("assets/station/textuassets/projekt_Gas_BaseColor.png"); + //mech_albedo = texture_loadfromfile("assets/townscaper/town_diffuse.jpg"); + mech_normal = texture_loadfromfile("assets/dieselpunk/mech_normal.tga"); + mech_roughness = texture_loadfromfile("assets/dieselpunk/mech_roughness.tga"); + mech_metalness = texture_loadfromfile("assets/dieselpunk/mech_metalness.tga"); + mech_mesh = mesh_loadfromobj("assets/dieselpunk/mech.obj"); + //mech_mesh = mesh_loadfromobj("assets/townscaper/town.obj"); + //mech_mesh = mesh_loadfromobj("assets/gun/gun.obj"); + //mech_mesh = mesh_loadfromobj("assets/station/station.obj"); + //mech_mesh = mesh_loadfromobj("assets/gun/triangle.obj"); + ground_albedo = texture_loadfromfile("assets/dieselpunk/ground_basecolor.tga"); + ground_mesh = mesh_loadfromobj("assets/dieselpunk/ground.obj"); + yingham_albedo = texture_loadfromfile("assets/dieselpunk/yingham_basecolor.tga"); + yingham_mesh = mesh_loadfromobj("assets/dieselpunk/yingham.obj"); + + cyborg_albedo = texture_loadfromfile("assets/cyborg/cyborg_diffuse.png"); + cyborg_mesh = mesh_loadfromobj("assets/cyborg/cyborg.obj"); } EXAMPLE void onevent_texture(void* data) { @@ -74,7 +75,7 @@ EXAMPLE void onevent_texture(void* data) { EXAMPLE void onupdate_texture(void*data) { ssr_matrixmode(MATRIX_MODEL); ssr_loadidentity(); - ssr_scale(100,100,100); + //ssr_scale(100,100,100); Vec3 light = {1, 0, 0}; ssr_setuniformvec3(0, &light); @@ -120,14 +121,16 @@ EXAMPLE void ondraw_texture(void*data) { ssr_setstencilop(STENCILOP_KEEP, STENCILOP_KEEP, STENCILOP_KEEP); */ /*render yingham*/ - //ssr_setuniformtex(0, yingham_albedo); - //ssr_bindvertices(yingham_mesh->vertices, yingham_mesh->vert_count, yingham_mesh->triangles, yingham_mesh->tris_count); - //ssr_draw(PRIMITIVE_TRIANGLE); + ssr_setuniformtex(0, yingham_albedo); + ssr_bindvertices(yingham_mesh->vertices, yingham_mesh->vert_count); + ssr_bindindices(yingham_mesh->triangles, yingham_mesh->tris_count); + ssr_draw(PRIMITIVE_TRIANGLE); /*render ground*/ - //ssr_setuniformtex(0, ground_albedo); - //ssr_bindvertices(ground_mesh->vertices, ground_mesh->vert_count, ground_mesh->triangles, ground_mesh->tris_count); - //ssr_draw(PRIMITIVE_TRIANGLE); + ssr_setuniformtex(0, ground_albedo); + ssr_bindvertices(ground_mesh->vertices, ground_mesh->vert_count); + ssr_bindindices(ground_mesh->triangles, ground_mesh->tris_count); + ssr_draw(PRIMITIVE_TRIANGLE); //draw_tbn(mech_mesh, VISUAL_ALL, 4); diff --git a/src/extend/camera.c b/src/extend/camera.c index d148cd8..e481831 100644 --- a/src/extend/camera.c +++ b/src/extend/camera.c @@ -1,6 +1,7 @@ #include "../shaders/common/core.h" #include "../core/device.h" #include "camera.h" +#include "../platform/win.h" //#define USE_CURSOR_WHEEL_ICON @@ -8,14 +9,10 @@ typedef enum { CursorType_Arrow = 0, CursorType_Hand, CursorType_Eye, - CursorType_ZoomIn, - CursorType_ZoomOut, }CursorType; static Wog_Cursor cursor_hand; static Wog_Cursor cursor_eye; -static Wog_Cursor cursor_zoomIn; -static Wog_Cursor cursor_zoomOut; // A unity editor style camera typedef struct Camera { @@ -71,10 +68,14 @@ Camera* camera_create(wog_Window* wnd, CameraConfig* config) { cam->wheel_scroll = 0; - cursor_hand = LoadImageA(NULL, "PanView.ico", IMAGE_ICON, 0, 0, LR_DEFAULTCOLOR | LR_CREATEDIBSECTION | LR_LOADFROMFILE); - cursor_eye = LoadImageA(NULL, "OrbitView.ico", IMAGE_ICON, 0, 0, LR_DEFAULTCOLOR | LR_CREATEDIBSECTION | LR_LOADFROMFILE); - cursor_zoomIn = LoadImageA(NULL, "ZoomIn.ico", IMAGE_ICON, 0, 0, LR_DEFAULTCOLOR | LR_CREATEDIBSECTION | LR_LOADFROMFILE); - cursor_zoomOut = LoadImageA(NULL, "ZoomOut.ico", IMAGE_ICON, 0, 0, LR_DEFAULTCOLOR | LR_CREATEDIBSECTION | LR_LOADFROMFILE); + HINSTANCE hInstance = wog_get_instance(); + +// cursor_hand = LoadImage(hInstance, "icon.ico", IMAGE_ICON, 0, 0, LR_LOADFROMFILE | LR_DEFAULTSIZE | LR_SHARED); + cursor_hand = LoadIcon(hInstance, "pan_view.ico"); + cursor_eye = LoadIcon(hInstance, "orbit_view.ico"); + + //int size; + //void *p = resource_get("pan_view.ico", &size); return cam; } @@ -173,19 +174,6 @@ void camera_onevent(Camera* cam, wog_Event* e, float dt) { return ; //printf("%d\n",e->type); if (e->type == WOG_EMOUSEWHEEL) { -#if defined(USE_CURSOR_WHEEL_ICON) - if (e->wheel > 0) - { - setMouseCursor(CursorType_ZoomIn, cursor_zoomIn); - } - else if (e->wheel < 0) - { - setMouseCursor(CursorType_ZoomOut, cursor_zoomOut); - } - if(cam->wheel_scroll <= 0) - wog_setMouseCapture(cam->wnd); - cam->wheel_scroll = 0.3; -#endif _onwheelscroll(cam, e->wheel, dt); } else if (e->type == WOG_EMOUSEBUTTONDOWN) { diff --git a/src/extern/wog.c b/src/extern/wog.c index 4892f99..194f893 100644 --- a/src/extern/wog.c +++ b/src/extern/wog.c @@ -37,9 +37,12 @@ #define min(a, b) (a < b ? a : b) #define clamp(x, minv, maxv) (max(minv, min(x, maxv))) +static HINSTANCE g_hinstance = NULL; + typedef struct wog_Window { HWND hwnd; // Window handler + HINSTANCE hInstance; HDC hdc; // Device Context HDC mdc; // Memory Device Contexts #if WOG_API == WOG_GDI @@ -55,7 +58,6 @@ typedef struct wog_GLContext }wog_GLContext; #endif - // A mouse capture count is used void wog_setMouseCapture(wog_Window* wnd) { @@ -299,10 +301,11 @@ static int registerWindowClass() windowClass.cbSize = sizeof(WNDCLASSEX); // Size Of The windowClass Structure windowClass.style = CS_HREDRAW | CS_VREDRAW | CS_OWNDC; // Redraws The Window For Any Movement / Resizing windowClass.lpfnWndProc = (WNDPROC)(WindowProc); // WindowProc Handles Messages - windowClass.hInstance = GetModuleHandle(0); // Set The Instance + windowClass.hInstance = g_hinstance; // Set The Instance windowClass.hbrBackground = (HBRUSH)(COLOR_APPWORKSPACE); // Class Background Brush Color windowClass.hCursor = LoadCursor(NULL, IDC_ARROW); // Load The Arrow Pointer windowClass.lpszClassName = WINDOW_CLASS; // Sets The Applications Classname + windowClass.hIcon = (HICON)LoadIcon(g_hinstance, "icon.ico"); if (RegisterClassEx(&windowClass) == 0) // Did Registering The Class Fail? { @@ -357,6 +360,11 @@ wog_Window* wog_createWindow(const char* title, int width, int height, int x, in { int client_w = width, client_h = height; + if (g_hinstance == NULL) + { + g_hinstance = GetModuleHandle(NULL); + } + if (! registerWindowClass()) { printf("Register window class failed.\n"); @@ -395,6 +403,8 @@ wog_Window* wog_createWindow(const char* title, int width, int height, int x, in wnd ); + wnd->hInstance = g_hinstance; + if (wnd->hwnd == 0) return 0; @@ -625,22 +635,24 @@ int console_main(int argc, char* argv[]) */ int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrev, LPSTR szCmdLine, int sw) { - char* temp = GetCommandLine(); - int len = strlen(temp) + 1; - char* cmd = stack_alloc(char, len); - strcpy(cmd, temp); - cmd[len - 1] = '\0'; + g_hinstance = hInst; - int argc = 0; - char** argv = 0; - argc = ParseCommandLine(cmd, 0); - ParseCommandLine(cmd, 0); - argv = stack_alloc(char*, argc + 1); - ParseCommandLine(cmd, argv); + char* temp = GetCommandLine(); + int len = strlen(temp) + 1; + char* cmd = stack_alloc(char, len); + strcpy(cmd, temp); + cmd[len - 1] = '\0'; - int status = console_main(argc, argv); + int argc = 0; + char** argv = 0; + argc = ParseCommandLine(cmd, 0); + ParseCommandLine(cmd, 0); + argv = stack_alloc(char*, argc + 1); + ParseCommandLine(cmd, argv); - return status; + int status = console_main(argc, argv); + + return status; } @@ -714,3 +726,8 @@ void wog_setcursorImage(wog_Window* wnd, Wog_Cursor icon) { SetCursor(icon); } + +HINSTANCE wog_get_instance() +{ + return g_hinstance; +} diff --git a/src/extern/wog.h b/src/extern/wog.h index c5e5c06..89c98fb 100644 --- a/src/extern/wog.h +++ b/src/extern/wog.h @@ -214,4 +214,6 @@ void wog_setcursorImage(wog_Window* wnd, Wog_Cursor icon); void wog_setMouseCapture(wog_Window* wnd); void wog_releaseMouseCapture(wog_Window* wnd); +HINSTANCE wog_get_instance(); + #endif
\ No newline at end of file @@ -59,7 +59,7 @@ bool setup(const char* name) { _setup(onupdate); _setup(onevent); _setup(ondraw); -#undef _set +#undef _setup return onload && onupdate && onevent && ondraw; } diff --git a/src/platform/win.c b/src/platform/win.c new file mode 100644 index 0000000..da864b2 --- /dev/null +++ b/src/platform/win.c @@ -0,0 +1,20 @@ +#include "win.h" +#include "../util/assert.h" +#include <windows.h> + +void* resource_get(const char* name, int* out_size) { + HRSRC handle = FindResource(0, name, "RESOURCE"); + assert(handle); + + HGLOBAL data = LoadResource(0, handle); + assert(data); + + void *ptr = LockResource(data); + assert(ptr); + + DWORD t_size = SizeofResource(0, handle); + assert(t_size); + + *out_size = t_size; + return ptr; +} diff --git a/src/platform/win.h b/src/platform/win.h new file mode 100644 index 0000000..bc2a10c --- /dev/null +++ b/src/platform/win.h @@ -0,0 +1,6 @@ +#ifndef RESOURCE_H_ +#define RESOURCE_H_ + +void* resource_get(const char* name, int* out_size); + +#endif
\ No newline at end of file diff --git a/src/shaders/common/core.c b/src/shaders/common/core.c index ffaa649..91bb6c0 100644 --- a/src/shaders/common/core.c +++ b/src/shaders/common/core.c @@ -4,7 +4,7 @@ Vec4 _proj_params; Vec2 _time; Vec4 _screen_params; -Vec3 unpacknormal(Color32 c32) { +Vec3 decode_normal(Color32 c32) { Vec3 normal = { c32.r * 2 - 1, c32.g * 2 - 1, @@ -15,16 +15,16 @@ Vec3 unpacknormal(Color32 c32) { Mat4 mat4(Vec4* c1, Vec4* c2, Vec4* c3, Vec4* c4); -Vec2 texsize(Texture* texture) { +Vec2 texture_size(Texture* texture) { Vec2 size = {texture->width, texture->height}; return size; } -float linear01Depth(float depth) { +float linear_01_depth(float depth) { float n = _proj_params.x, f = _proj_params.y; return n / ((n-f)*depth + f); } -float linearEyeDepth(float depth) { - return _proj_params.y * linear01Depth(depth); +float linear_eye_depth(float depth) { + return _proj_params.y * linear_01_depth(depth); }
\ No newline at end of file diff --git a/src/shaders/common/core.h b/src/shaders/common/core.h index ef58897..216af15 100644 --- a/src/shaders/common/core.h +++ b/src/shaders/common/core.h @@ -34,24 +34,24 @@ Vec4 _screen_params; /************************************************************************/ /*shader built in functions*/ -Vec3 unpacknormal(Color32 c32); +Vec3 decode_normal(Color32 c32); Mat4 mat4(Vec4* c1, Vec4* c2, Vec4* c3, Vec4* c4); Mat3 mat3(Vec3* c1, Vec3* c2, Vec3* c3); -Vec2 texsize(Texture* texture); +Vec2 texture_size(Texture* texture); #define discardif(cond) \ -do{ \ -if(cond) return 0; \ +do{ \ +if(cond) return 0; \ }while(0) #define discard() return 0 -#define keep() return 1 +#define put() return 1 #define MVP_PROCESS \ do{ \ -static Vec4 p; p.xyz = in->position; p.w = 1; \ -internal_mat4_mulvec4(g_uniforms->mvp, &p, clipcoord); \ +static Vec4 p; p.xyz = in->position; p.w = 1; \ +internal_mat4_mulvec4(g_uniforms->mvp, &p, clipcoord); \ }while(0) #define object2clip(pos, out) internal_mat4_mulvec4(_mvp_matrix, pos, out); @@ -66,7 +66,7 @@ out_v3->x = color.x * 2 - 1; \ out_v3->y = color.y * 2 - 1; \ out_v3->z = color.z * 2 - 1; -float linear01Depth(float depth); -float linearEyeDepth(float depth); +float linear_01_depth(float depth); +float linear_eye_depth(float depth); #endif
\ No newline at end of file diff --git a/src/shaders/pbr.c b/src/shaders/pbr.c index a917f95..9f148ee 100644 --- a/src/shaders/pbr.c +++ b/src/shaders/pbr.c @@ -24,46 +24,30 @@ static void vert( Vertex* in, Vec4* clipcoord) { object2clip(&p, clipcoord); Vec3 worldnormal = mat4_mulvec3(*_object2world, in->normal); worldnormal = vec3_normalize(worldnormal); - //*rough = 1 - internal_vec3_dot(&worldnormal, light); - //*vnormal = in->normal; *_texcoord = in->texcoord; _clip_pos->x = clipcoord->z; _clip_pos->y = clipcoord->w; } static bool frag( Vec4* color) { - //internal_vec3_normalize(light, light); - //internal_vec3_normalize(vnormal, vnormal); - //float roughness = *rough; - //(*color).r = 1; - //(*color).g = 1; - //(*color).b = 1; - //(*color).a = 1; - //return 1; - //float rough = 1- internal_vec3_dot(&in->normal, light); float depth = _clip_pos->x / _clip_pos->y; depth = (depth + 1) / 2; - depth = linear01Depth(depth); + depth = linear_01_depth(depth); Vec4 c = tex2d(_albedo_tex, _texcoord); - //Color32 nc = tex2d(noramltex, in->texcoord); - //internal_vec3_scale(&c, roughness, &c); *color = vec4_saturate(c); - //*color = vec4(1,1,1,1); - //*color = vec4(depth, depth, depth, 1); - //internal_vec3_scale(color, 1 - depth, color); - return 1; + put(); } Program ssr_built_in_shader_pbr = { vert, frag, - VARYING_NUM_00 | + //VARYING_NUM_00 | //VARYING_V3_00 | //VARYING_V3_01 | //VARYING_V3_02 | //VARYING_V3_03 | //VARYING_V3_04 | //VARYING_V4_00 | - VARYING_V2_00 | - VARYING_V3_05 | + VARYING_V2_00 | + //VARYING_V3_05 | VARYING_V2_01 }; |