From 4012a5b3c16fcaecd936fa1c61479af1d2383f13 Mon Sep 17 00:00:00 2001 From: korenkonder Date: Sat, 9 Dec 2023 10:23:42 +0300 Subject: [PATCH] Integrate shaders --- res/ft_shaders.farc | Bin 0 -> 131216 bytes src/DivaGL/DivaGL.rc | 13 +- src/DivaGL/DivaGL.vcxproj | 14 +- src/DivaGL/Glitter/render_scene.cpp | 2 +- src/DivaGL/dllmain.cpp | 2 +- src/DivaGL/hook.cpp | 24 +- src/DivaGL/inject.cpp | 14 +- src/DivaGL/mdl/disp_manager.cpp | 6 +- src/DivaGL/mdl/draw_object.cpp | 4 +- src/DivaGL/render.cpp | 6 +- src/DivaGL/render_manager.cpp | 20 +- src/DivaGL/resource.h | 11 + src/DivaGL/{shader_glsl.cpp => shader.cpp} | 92 +++---- src/DivaGL/{shader_glsl.hpp => shader.hpp} | 38 +-- .../{shader_glsl_ft.cpp => shader_ft.cpp} | 220 ++++++++-------- .../{shader_glsl_ft.hpp => shader_ft.hpp} | 8 +- src/DivaGL/shader_table.cpp | 237 ------------------ src/DivaGL/shader_table.hpp | 218 ---------------- src/DivaGL/sprite.cpp | 2 +- src/DivaGL/task_effect.cpp | 2 +- src/DivaGL/wrap.cpp | 2 +- 21 files changed, 248 insertions(+), 687 deletions(-) create mode 100644 res/ft_shaders.farc create mode 100644 src/DivaGL/resource.h rename src/DivaGL/{shader_glsl.cpp => shader.cpp} (91%) rename src/DivaGL/{shader_glsl.hpp => shader.hpp} (76%) rename src/DivaGL/{shader_glsl_ft.cpp => shader_ft.cpp} (90%) rename src/DivaGL/{shader_glsl_ft.hpp => shader_ft.hpp} (90%) delete mode 100644 src/DivaGL/shader_table.cpp delete mode 100644 src/DivaGL/shader_table.hpp diff --git a/res/ft_shaders.farc b/res/ft_shaders.farc new file mode 100644 index 0000000000000000000000000000000000000000..eaf24701022d8731e919a3bc2a8ea2aaff9f4904 GIT binary patch literal 131216 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‚nR7#NL2U_(@NPVkNGj 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 ?_#v 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 L+HEZKVSV>sU<*CV literal 0 HcmV?d00001 diff --git a/src/DivaGL/DivaGL.rc b/src/DivaGL/DivaGL.rc index caea5e7..2a12ab7 100644 --- a/src/DivaGL/DivaGL.rc +++ b/src/DivaGL/DivaGL.rc @@ -1,13 +1,4 @@ -#define IDR_VERSION2 101 - -#ifdef APSTUDIO_INVOKED -#ifndef APSTUDIO_READONLY_SYMBOLS -#define _APS_NEXT_RESOURCE_VALUE 102 -#define _APS_NEXT_COMMAND_VALUE 40001 -#define _APS_NEXT_CONTROL_VALUE 1000 -#define _APS_NEXT_SYMED_VALUE 101 -#endif -#endif +#include "resource.h" #define APSTUDIO_READONLY_SYMBOLS #include "winres.h" @@ -44,3 +35,5 @@ BEGIN VALUE "Translation", 0x9, 1200 END END + +IDR_FT_SHADERS_FARC1 ft_shaders_farc "..\\..\\res\\ft_shaders.farc" diff --git a/src/DivaGL/DivaGL.vcxproj b/src/DivaGL/DivaGL.vcxproj index 8d9fbdd..d77eac3 100644 --- a/src/DivaGL/DivaGL.vcxproj +++ b/src/DivaGL/DivaGL.vcxproj @@ -274,9 +274,8 @@ del "$(SolutionDir)bin\$(TargetName).lib" - - - + + @@ -318,10 +317,10 @@ del "$(SolutionDir)bin\$(TargetName).lib" + - - - + + @@ -339,5 +338,8 @@ del "$(SolutionDir)bin\$(TargetName).lib" {4c9636b9-e5b6-41e5-9afc-5b33cc9633de} + + + \ No newline at end of file diff --git a/src/DivaGL/Glitter/render_scene.cpp b/src/DivaGL/Glitter/render_scene.cpp index 30f0423..a3c7df1 100644 --- a/src/DivaGL/Glitter/render_scene.cpp +++ b/src/DivaGL/Glitter/render_scene.cpp @@ -6,7 +6,7 @@ #include "glitter.hpp" #include "../gl_state.hpp" #include "../render_context.hpp" -#include "../shader_glsl_ft.hpp" +#include "../shader_ft.hpp" #include "../wrap.hpp" namespace Glitter { diff --git a/src/DivaGL/dllmain.cpp b/src/DivaGL/dllmain.cpp index cb8be0a..a229a9b 100644 --- a/src/DivaGL/dllmain.cpp +++ b/src/DivaGL/dllmain.cpp @@ -8,7 +8,6 @@ #include "hook.hpp" #include "inject.hpp" #include "print.hpp" -#include "shader_table.hpp" #include "wrap.hpp" #include #include @@ -88,6 +87,7 @@ void FASTCALL divagl_main() { #if defined(DINPUT8_DLL) load_original_dll(); LoadLibraryW(L"plugins\\DivaSound.dva"); + LoadLibraryW(L"plugins\\Patches.dva"); LoadLibraryW(L"plugins\\TLAC.dva"); #endif //Sleep(5000); diff --git a/src/DivaGL/hook.cpp b/src/DivaGL/hook.cpp index e9ce94c..2b9f3de 100644 --- a/src/DivaGL/hook.cpp +++ b/src/DivaGL/hook.cpp @@ -9,7 +9,8 @@ #include "rob/rob.hpp" #include "auth_3d.hpp" #include "camera.hpp" -#include "shader_glsl_ft.hpp" +#include "resource.h" +#include "shader_ft.hpp" #include "sprite.hpp" #include "stage.hpp" #include "task_effect.hpp" @@ -87,6 +88,25 @@ HOOK(void, FASTCALL, rndr__RenderManager__render_all, 0x0000000140502CA0) { render_manager->render_all(); } +HOOK(void, FASTCALL, shader_free, 0x00000001405E4DB0) { + shaders_ft.unload(); +} + +HOOK(void, FASTCALL, shader_load_all_shaders, 0x00000001405E4FC0) { + extern size_t dll_handle; + HRSRC res = FindResourceA((HMODULE)dll_handle, MAKEINTRESOURCEA(IDR_FT_SHADERS_FARC1), "ft_shaders_farc"); + if (res) { + DWORD size = SizeofResource((HMODULE)dll_handle, res); + HGLOBAL data = LoadResource((HMODULE)dll_handle, res); + + farc f; + f.read(data, size); + shaders_ft.load(&f, false, "ft", shader_ft_table, shader_ft_table_size, + shader_ft_bind_func_table, shader_ft_bind_func_table_size, + shader_ft_get_index_by_name); + } +} + HOOK(int32_t, FASTCALL, shader_get_index_by_name, 0x00000001405E4ED0, const char* name) { return shaders_ft.get_index_by_name(name); } @@ -117,6 +137,8 @@ void hook_funcs() { INSTALL_HOOK(rndr__RenderManager__render_ctrl); INSTALL_HOOK(rndr__RenderManager__render_all); + INSTALL_HOOK(shader_free); + INSTALL_HOOK(shader_load_all_shaders); INSTALL_HOOK(shader_get_index_by_name); INSTALL_HOOK(env_set_blend_color); diff --git a/src/DivaGL/inject.cpp b/src/DivaGL/inject.cpp index 8779d7f..d957cc1 100644 --- a/src/DivaGL/inject.cpp +++ b/src/DivaGL/inject.cpp @@ -6,8 +6,7 @@ #include "inject.hpp" #include "gl.hpp" #include "print.hpp" -#include "shader_table.hpp" -#include "shader_glsl_ft.hpp" +#include "shader_ft.hpp" #include "sprite.hpp" #include @@ -54,10 +53,6 @@ void inject_uint64_t(void* address, uint64_t data) { extern size_t glut_handle; static patch_struct patch_data[] = { - { (void*)0x00000001405E4CE0, (uint64_t)&shader_set, }, - { (void*)0x00000001405E4FC0, (uint64_t)&shader_load_all_shaders, }, - { (void*)0x00000001405E4DB0, (uint64_t)&shader_free, }, - { (void*)0x00000001405E4B50, (uint64_t)&shader_bind, }, { (void*)0x00000001401D3860, (uint64_t)&printf_proxy, }, { (void*)0x00000001400DE640, (uint64_t)&printf_proxy, }, { (void*)0x0000000140442FB4, (uint64_t)&gl_state_get, }, @@ -87,13 +82,6 @@ void inject_patches() { *(uint64_t*)&buf[0x02] = (uint64_t)&glut_create_context; inject_data((void*)(glut_handle + 0x0000A970), buf, 0x0C); - inject_uint64_t((void*)&shader_name_bind_func_table[0].bind_func, (uint64_t)&shader_bind_blinn); - inject_uint64_t((void*)&shader_name_bind_func_table[1].bind_func, (uint64_t)&shader_bind_cloth); - inject_uint64_t((void*)&shader_name_bind_func_table[2].bind_func, (uint64_t)&shader_bind_hair); - inject_uint64_t((void*)&shader_name_bind_func_table[3].bind_func, (uint64_t)&shader_bind_membrane); - inject_uint64_t((void*)&shader_name_bind_func_table[4].bind_func, (uint64_t)&shader_bind_eye_ball); - inject_uint64_t((void*)&shader_name_bind_func_table[5].bind_func, (uint64_t)&shader_bind_tone_map); - // Patch font shader index inject_uint32_t((void*)0x00000001401982D8, SHADER_FT_FONT); } diff --git a/src/DivaGL/mdl/disp_manager.cpp b/src/DivaGL/mdl/disp_manager.cpp index c9b139f..98565f4 100644 --- a/src/DivaGL/mdl/disp_manager.cpp +++ b/src/DivaGL/mdl/disp_manager.cpp @@ -7,7 +7,7 @@ #include "../gl_state.hpp" #include "../object.hpp" #include "../render_manager.hpp" -#include "../shader_glsl_ft.hpp" +#include "../shader_ft.hpp" #include "../sprite.hpp" #include "../stage.hpp" #include "../uniform.hpp" @@ -1449,7 +1449,7 @@ namespace mdl { uniform_value_reset(); gl_state_bind_vertex_array(0); - shader_glsl::unbind(); + shader::unbind(); gl_state_set_blend_func(GL_ONE, GL_ZERO); for (int32_t i = 0; i < 5; i++) gl_state_bind_sampler(i, 0); @@ -1533,7 +1533,7 @@ namespace mdl { } uniform_value_reset(); - shader_glsl::unbind(); + shader::unbind(); gl_state_set_blend_func(GL_ONE, GL_ZERO); } diff --git a/src/DivaGL/mdl/draw_object.cpp b/src/DivaGL/mdl/draw_object.cpp index c9101e2..3dafba6 100644 --- a/src/DivaGL/mdl/draw_object.cpp +++ b/src/DivaGL/mdl/draw_object.cpp @@ -5,7 +5,7 @@ #include "draw_object.hpp" #include "../light_param/light.hpp" -#include "../shader_glsl_ft.hpp" +#include "../shader_ft.hpp" #include "../texture.hpp" static bool draw_object_blend_set( @@ -146,7 +146,7 @@ namespace mdl { shaders_ft.draw_arrays(GL_LINES, 0, etc->count); break; } - shader_glsl::unbind(); + shader::unbind(); uniform_value_reset(); rctx->obj_batch.g_material_state_diffuse = g_material_state_diffuse; diff --git a/src/DivaGL/render.cpp b/src/DivaGL/render.cpp index 3366236..261909a 100644 --- a/src/DivaGL/render.cpp +++ b/src/DivaGL/render.cpp @@ -8,7 +8,7 @@ #include "gl_state.hpp" #include "render_context.hpp" #include "render_context.hpp" -#include "shader_glsl_ft.hpp" +#include "shader_ft.hpp" #include "texture.hpp" extern bool task_stage_is_modern; @@ -188,7 +188,7 @@ namespace rndr { render_post_width_scale, render_post_height_scale, 0.0f, 0.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f); } - shader_glsl::unbind(); + shader::unbind(); for (int32_t i = 0; i < 8; i++) gl_state_bind_sampler(i, 0); @@ -207,7 +207,7 @@ namespace rndr { } void Render::calc_exposure_chara_data() { - shader_glsl::unbind(); + shader::unbind(); gl_state_set_color_mask(GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE); gl_state_set_depth_mask(GL_FALSE); diff --git a/src/DivaGL/render_manager.cpp b/src/DivaGL/render_manager.cpp index 8746ae8..61d1cea 100644 --- a/src/DivaGL/render_manager.cpp +++ b/src/DivaGL/render_manager.cpp @@ -14,7 +14,7 @@ #include "render.hpp" #include "render_context.hpp" #include "render_texture.hpp" -#include "shader_glsl_ft.hpp" +#include "shader_ft.hpp" #include "sprite.hpp" #include "stage_param.hpp" #include "task_effect.hpp" @@ -343,7 +343,7 @@ namespace rndr { glClearDLL(GL_COLOR_BUFFER_BIT); } } - shader_glsl::unbind(); + shader::unbind(); gl_state_bind_framebuffer(0); gl_state_end_event(); } @@ -439,7 +439,7 @@ namespace rndr { } draw_pass_sss_filter(sss); - shader_glsl::unbind(); + shader::unbind(); gl_state_bind_framebuffer(0); gl_state_end_event(); } @@ -512,7 +512,7 @@ namespace rndr { glClearDLL(GL_COLOR_BUFFER_BIT); glClearColorDLL(clear_color.x, clear_color.y, clear_color.z, clear_color.w); } - shader_glsl::unbind(); + shader::unbind(); gl_state_bind_framebuffer(0); gl_state_end_event(); } @@ -559,7 +559,7 @@ namespace rndr { glClearDLL(GL_COLOR_BUFFER_BIT); glClearColorDLL(clear_color.x, clear_color.y, clear_color.z, clear_color.w); } - shader_glsl::unbind(); + shader::unbind(); gl_state_bind_framebuffer(0); gl_state_end_event(); } @@ -570,7 +570,7 @@ namespace rndr { for (draw_pre_process& i : pre_process) if (i.func) i.func(i.data); - shader_glsl::unbind(); + shader::unbind(); gl_state_bind_framebuffer(0); gl_state_end_event(); } @@ -645,7 +645,7 @@ namespace rndr { gl_state_disable_blend(); gl_state_enable_depth_test(); gl_state_set_depth_mask(GL_TRUE); - shader_glsl::unbind(); + shader::unbind(); gl_state_bind_framebuffer(0); gl_state_get_error(); gl_state_end_event(); @@ -831,7 +831,7 @@ namespace rndr { if (shadow) draw_pass_3d_shadow_reset(); pass_sprite_surf(); - shader_glsl::unbind(); + shader::unbind(); gl_state_bind_framebuffer(0); } @@ -923,7 +923,7 @@ namespace rndr { 0, 0, rctx->sprite_width, rctx->sprite_height, rctx->screen_x_offset, rctx->screen_y_offset, rctx->sprite_width, rctx->sprite_height, GL_COLOR_BUFFER_BIT, GL_LINEAR); - shader_glsl::unbind(); + shader::unbind(); gl_state_bind_framebuffer(0); gl_state_end_event(); } @@ -1244,7 +1244,7 @@ static void draw_pass_shadow_filter(RenderTexture* a1, RenderTexture* a2, gl_state_active_bind_texture_2d(0, v9); gl_state_bind_vertex_array(rctx->common_vao); shaders_ft.draw_arrays(GL_TRIANGLE_STRIP, 0, 4); - shader_glsl::unbind(); + shader::unbind(); texture_params_restore(&tex_params[0], &tex_params[1], 0); } diff --git a/src/DivaGL/resource.h b/src/DivaGL/resource.h new file mode 100644 index 0000000..3c488bf --- /dev/null +++ b/src/DivaGL/resource.h @@ -0,0 +1,11 @@ +#define IDR_VERSION2 101 +#define IDR_FT_SHADERS_FARC1 102 + +#ifdef APSTUDIO_INVOKED +#ifndef APSTUDIO_READONLY_SYMBOLS +#define _APS_NEXT_RESOURCE_VALUE 103 +#define _APS_NEXT_COMMAND_VALUE 40001 +#define _APS_NEXT_CONTROL_VALUE 1000 +#define _APS_NEXT_SYMED_VALUE 101 +#endif +#endif diff --git a/src/DivaGL/shader_glsl.cpp b/src/DivaGL/shader.cpp similarity index 91% rename from src/DivaGL/shader_glsl.cpp rename to src/DivaGL/shader.cpp index 6bbe7aa..86ab8d6 100644 --- a/src/DivaGL/shader_glsl.cpp +++ b/src/DivaGL/shader.cpp @@ -3,7 +3,7 @@ GitHub/GitLab: korenkonder */ -#include "shader_glsl.hpp" +#include "shader.hpp" #include "../KKdLib/io/file_stream.hpp" #include "../KKdLib/io/path.hpp" #include "../KKdLib/hash.hpp" @@ -32,20 +32,20 @@ static GLuint shader_compile(const char* vert, const char* frag, const char* vp, static GLuint shader_compile_binary(const char* vert, const char* frag, const char* vp, const char* fp, program_binary* bin, GLsizei* buffer_size, void** binary); static bool shader_load_binary_shader(program_binary* bin, GLuint* program); -static void shader_glsl_update_data(shader_glsl_set_data* set); +static void shader_update_data(shader_set_data* set); -int32_t shader_glsl::bind(shader_glsl_set_data* set, uint32_t sub_index) { +int32_t shader::bind(shader_set_data* set, uint32_t sub_index) { set->curr_shader = 0; if (num_sub < 1) return -1; int32_t sub_shader_index = 0; - for (shader_glsl_sub* i = sub; i->sub_index != sub_index; i++) + for (shader_sub* i = sub; i->sub_index != sub_index; i++) if (++sub_shader_index >= num_sub) return -1; - shader_glsl_sub* sub_shader = &sub[sub_shader_index]; + shader_sub* sub_shader = &sub[sub_shader_index]; int32_t unival_shad_curr = 1; int32_t unival_shad = 0; @@ -67,7 +67,7 @@ int32_t shader_glsl::bind(shader_glsl_set_data* set, uint32_t sub_index) { } } - shader_glsl_sub_shader* shader = &sub_shader->shaders[unival_shad]; + shader_sub_shader* shader = &sub_shader->shaders[unival_shad]; set->curr_shader = shader; gl_state_use_program(shader->program); @@ -78,7 +78,7 @@ int32_t shader_glsl::bind(shader_glsl_set_data* set, uint32_t sub_index) { return 0; } -bool shader_glsl::parse_define(const char* data, char** temp, size_t* temp_size) { +bool shader::parse_define(const char* data, char** temp, size_t* temp_size) { if (!data) return false; @@ -120,7 +120,7 @@ bool shader_glsl::parse_define(const char* data, char** temp, size_t* temp_size) return true; } -bool shader_glsl::parse_define(const char* data, int32_t num_uniform, +bool shader::parse_define(const char* data, int32_t num_uniform, int32_t* uniform_value, char** temp, size_t* temp_size) { if (!data) return false; @@ -179,7 +179,7 @@ bool shader_glsl::parse_define(const char* data, int32_t num_uniform, return true; } -char* shader_glsl::parse_include(char* data, farc* f) { +char* shader::parse_include(char* data, farc* f) { if (!data || !f) return data; @@ -290,25 +290,25 @@ char* shader_glsl::parse_include(char* data, farc* f) { return temp_data; } -void shader_glsl::unbind() { +void shader::unbind() { gl_state_use_program(0); } -shader_glsl_set_data::shader_glsl_set_data() : size(), shaders(), curr_shader(), +shader_set_data::shader_set_data() : size(), shaders(), curr_shader(), primitive_restart(), primitive_restart_index(), get_index_by_name_func() { } -void shader_glsl_set_data::disable_primitive_restart() { +void shader_set_data::disable_primitive_restart() { primitive_restart = false; } -void shader_glsl_set_data::draw_arrays(GLenum mode, GLint first, GLsizei count) { - shader_glsl_update_data(this); +void shader_set_data::draw_arrays(GLenum mode, GLint first, GLsizei count) { + shader_update_data(this); glDrawArraysDLL(mode, first, count); } -void shader_glsl_set_data::draw_elements(GLenum mode, +void shader_set_data::draw_elements(GLenum mode, GLsizei count, GLenum type, const void* indices) { switch (mode) { case GL_TRIANGLE_STRIP: @@ -333,7 +333,7 @@ void shader_glsl_set_data::draw_elements(GLenum mode, break; } - shader_glsl_update_data(this); + shader_update_data(this); glDrawElementsDLL(mode, count, type, indices); switch (mode) { @@ -343,7 +343,7 @@ void shader_glsl_set_data::draw_elements(GLenum mode, } } -void shader_glsl_set_data::draw_range_elements(GLenum mode, +void shader_set_data::draw_range_elements(GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const void* indices) { switch (mode) { case GL_TRIANGLE_STRIP: @@ -368,7 +368,7 @@ void shader_glsl_set_data::draw_range_elements(GLenum mode, break; } - shader_glsl_update_data(this); + shader_update_data(this); glDrawRangeElements(mode, start, end, count, type, indices); switch (mode) { @@ -378,11 +378,11 @@ void shader_glsl_set_data::draw_range_elements(GLenum mode, } } -void shader_glsl_set_data::enable_primitive_restart() { +void shader_set_data::enable_primitive_restart() { primitive_restart = true; } -int32_t shader_glsl_set_data::get_index_by_name(const char* name) { +int32_t shader_set_data::get_index_by_name(const char* name) { if (get_index_by_name_func) { int32_t index = get_index_by_name_func(name); if (index != -1) @@ -395,9 +395,9 @@ int32_t shader_glsl_set_data::get_index_by_name(const char* name) { return -1; } -void shader_glsl_set_data::load(farc* f, bool ignore_cache, - const char* name, const shader_glsl_table* shaders_table, const size_t size, - const shader_glsl_bind_func* bind_func_table, const size_t bind_func_table_size, +void shader_set_data::load(farc* f, bool ignore_cache, + const char* name, const shader_table* shaders_table, const size_t size, + const shader_bind_func* bind_func_table, const size_t bind_func_table_size, PFNSHADERGLSLGETINDEXFUNCPROC get_index_by_name) { if (!this || !f || !shaders_table || !size) return; @@ -433,22 +433,22 @@ void shader_glsl_set_data::load(farc* f, bool ignore_cache, std::vector vec_vert; std::vector vec_frag; std::vector program_data_binary; - shader_glsl* shaders = force_malloc(size); + shader* shaders = force_malloc(size); this->shaders = shaders; this->size = size; for (size_t i = 0; i < size; i++) { - shader_glsl* shader = &shaders[i]; + shader* shader = &shaders[i]; shader->name = shaders_table[i].name; shader->name_index = shaders_table[i].name_index; shader->num_sub = shaders_table[i].num_sub; - shader->sub = force_malloc(shader->num_sub); + shader->sub = force_malloc(shader->num_sub); shader->num_uniform = shaders_table[i].num_uniform; shader->use_uniform = shaders_table[i].use_uniform; shader->use_permut = shaders_table[i].use_permut; int32_t num_sub = shader->num_sub; - const shader_glsl_sub_table* sub_table = shaders_table[i].sub; - shader_glsl_sub* sub = shader->sub; + const shader_sub_table* sub_table = shaders_table[i].sub; + shader_sub* sub = shader->sub; vec_vert.resize(shader->num_uniform); vec_frag.resize(shader->num_uniform); int32_t* vec_vert_data = vec_vert.data(); @@ -508,8 +508,8 @@ void shader_glsl_set_data::load(farc* f, bool ignore_cache, } strcat_s(shader_cache_file_name, sizeof(shader_cache_file_name), ".bin"); - vert_data = shader_glsl::parse_include(vert_data, f); - frag_data = shader_glsl::parse_include(frag_data, f); + vert_data = shader::parse_include(vert_data, f); + frag_data = shader::parse_include(frag_data, f); uint64_t vert_data_hash = hash_utf8_fnv1a64m(vert_data); uint64_t frag_data_hash = hash_utf8_fnv1a64m(frag_data); @@ -541,7 +541,7 @@ void shader_glsl_set_data::load(farc* f, bool ignore_cache, if (!ignore_cache) program_data_binary.reserve(unival_shad_count); - shader_glsl_sub_shader* shaders = force_malloc(unival_shad_count); + shader_sub_shader* shaders = force_malloc(unival_shad_count); sub->shaders = shaders; if (shaders) { strcpy_s(vert_buf, sizeof(vert_buf), sub_table->vp); @@ -578,9 +578,9 @@ void shader_glsl_set_data::load(farc* f, bool ignore_cache, } if (!bin || !shader_load_binary_shader(bin, &shaders[k].program)) { - bool vert_succ = shader_glsl::parse_define(vert_data, num_uniform, + bool vert_succ = shader::parse_define(vert_data, num_uniform, vec_vert_data, &temp_vert, &temp_vert_size); - bool frag_succ = shader_glsl::parse_define(frag_data, num_uniform, + bool frag_succ = shader::parse_define(frag_data, num_uniform, vec_frag_data, &temp_frag, &temp_frag_size); if (ignore_cache) @@ -610,7 +610,7 @@ void shader_glsl_set_data::load(farc* f, bool ignore_cache, } else { program_data_binary.reserve(1); - shader_glsl_sub_shader* shaders = force_malloc(); + shader_sub_shader* shaders = force_malloc(); sub->shaders = shaders; if (shaders) { strcpy_s(vert_buf, sizeof(vert_buf), sub_table->vp); @@ -619,8 +619,8 @@ void shader_glsl_set_data::load(farc* f, bool ignore_cache, strcat_s(frag_buf, sizeof(vert_buf), "..frag"); if (!bin || !shader_load_binary_shader(bin, &shaders[0].program)) { - bool vert_succ = shader_glsl::parse_define(vert_data, &temp_vert, &temp_vert_size); - bool frag_succ = shader_glsl::parse_define(frag_data, &temp_frag, &temp_frag_size); + bool vert_succ = shader::parse_define(vert_data, &temp_vert, &temp_vert_size); + bool frag_succ = shader::parse_define(frag_data, &temp_frag, &temp_frag_size); if (ignore_cache) shaders[0].program = shader_compile(vert_succ ? temp_vert : 0, @@ -704,28 +704,28 @@ void shader_glsl_set_data::load(farc* f, bool ignore_cache, this->get_index_by_name_func = get_index_by_name; } -void shader_glsl_set_data::set(uint32_t index) { +void shader_set_data::set(uint32_t index) { if (this && index && index != -1) { - shader_glsl* shader = &shaders[index]; + shader* shader = &shaders[index]; if (shader->bind_func) shader->bind_func(this, shader); else shader->bind(this, shader->sub[0].sub_index); } else - shader_glsl::unbind(); + shader::unbind(); } -void shader_glsl_set_data::unload() { +void shader_set_data::unload() { size_t size = this->size; - shader_glsl* shaders = this->shaders; + shader* shaders = this->shaders; for (size_t i = 0; i < size; i++) { - shader_glsl* shader = &shaders[i]; + shader* shader = &shaders[i]; if (!shader->sub) continue; int32_t num_sub = shader->num_sub; - shader_glsl_sub* sub = shader->sub; + shader_sub* sub = shader->sub; for (size_t j = 0; j < num_sub; j++, sub++) { int32_t unival_shad_count = 1; if (shader->num_uniform > 0) { @@ -742,7 +742,7 @@ void shader_glsl_set_data::unload() { } if (sub->shaders) { - shader_glsl_sub_shader* shaders = sub->shaders; + shader_sub_shader* shaders = sub->shaders; for (size_t k = 0; k < unival_shad_count; k++) glDeleteProgram(shaders[k].program); free(shaders); @@ -973,12 +973,12 @@ static bool shader_load_binary_shader(program_binary* bin, GLuint* program) { return true; } -static void shader_glsl_update_data(shader_glsl_set_data* set) { +static void shader_update_data(shader_set_data* set) { if (!set) return; if (set->curr_shader) { - shader_glsl_sub_shader* shader = set->curr_shader; + shader_sub_shader* shader = set->curr_shader; if (shader->uniform_val_update) { glUniform1iv(0, SHADER_MAX_UNIFORM_VALUES, (GLint*)shader->uniform_val); shader->uniform_val_update = false; diff --git a/src/DivaGL/shader_glsl.hpp b/src/DivaGL/shader.hpp similarity index 76% rename from src/DivaGL/shader_glsl.hpp rename to src/DivaGL/shader.hpp index b8bc9a0..6592e54 100644 --- a/src/DivaGL/shader_glsl.hpp +++ b/src/DivaGL/shader.hpp @@ -24,7 +24,7 @@ #define SHADER_MAX_UNIFORM_BLOCK_SIZE 65536 #define SHADER_MAX_UNIFORM_VALUES 16 -struct shader_glsl_sub_table { +struct shader_sub_table { uint32_t sub_index; const int32_t* vp_unival_max; const int32_t* fp_unival_max; @@ -32,52 +32,52 @@ struct shader_glsl_sub_table { const char* fp; }; -struct shader_glsl_table { +struct shader_table { const char* name; uint32_t name_index; int32_t num_sub; - const shader_glsl_sub_table* sub; + const shader_sub_table* sub; int32_t num_uniform; const uniform_name* use_uniform; const bool* use_permut; }; -struct shader_glsl; -struct shader_glsl_set_data; +struct shader; +struct shader_set_data; typedef int32_t (*PFNSHADERGLSLGETINDEXFUNCPROC)(const char* name); -typedef void (*PFNSHADERGLSLBINDFUNCPROC)(shader_glsl_set_data* set, shader_glsl* shad); +typedef void (*PFNSHADERGLSLBINDFUNCPROC)(shader_set_data* set, shader* shad); -struct shader_glsl_bind_func { +struct shader_bind_func { uint32_t name_index; PFNSHADERGLSLBINDFUNCPROC bind_func; }; -struct shader_glsl_sub_shader { +struct shader_sub_shader { GLuint program; int32_t uniform_val[SHADER_MAX_UNIFORM_VALUES]; bool uniform_val_update; }; -struct shader_glsl_sub { +struct shader_sub { uint32_t sub_index; const int32_t* vp_unival_max; const int32_t* fp_unival_max; - shader_glsl_sub_shader* shaders; + shader_sub_shader* shaders; }; -struct shader_glsl { +struct shader { const char* name; uint32_t name_index; int32_t num_sub; - shader_glsl_sub* sub; + shader_sub* sub; int32_t num_uniform; const uniform_name* use_uniform; const bool* use_permut; PFNSHADERGLSLBINDFUNCPROC bind_func; - int32_t bind(shader_glsl_set_data* set, uint32_t sub_index); + int32_t bind(shader_set_data* set, uint32_t sub_index); static bool parse_define(const char* data, char** temp, size_t* temp_size); static bool parse_define(const char* data, int32_t num_uniform, @@ -86,16 +86,16 @@ struct shader_glsl { static void unbind(); }; -struct shader_glsl_set_data { +struct shader_set_data { size_t size; - shader_glsl* shaders; - shader_glsl_sub_shader* curr_shader; + shader* shaders; + shader_sub_shader* curr_shader; GLboolean primitive_restart; GLuint primitive_restart_index; PFNSHADERGLSLGETINDEXFUNCPROC get_index_by_name_func; - shader_glsl_set_data(); + shader_set_data(); void disable_primitive_restart(); void draw_arrays(GLenum mode, GLint first, GLsizei count); @@ -106,8 +106,8 @@ struct shader_glsl_set_data { void enable_primitive_restart(); int32_t get_index_by_name(const char* name); void load(farc* f, bool ignore_cache, const char* name, - const shader_glsl_table* shaders_table, const size_t size, - const shader_glsl_bind_func* bind_func_table, const size_t bind_func_table_size, + const shader_table* shaders_table, const size_t size, + const shader_bind_func* bind_func_table, const size_t bind_func_table_size, PFNSHADERGLSLGETINDEXFUNCPROC get_index_by_name); void set(uint32_t index); void unload(); diff --git a/src/DivaGL/shader_glsl_ft.cpp b/src/DivaGL/shader_ft.cpp similarity index 90% rename from src/DivaGL/shader_glsl_ft.cpp rename to src/DivaGL/shader_ft.cpp index 46b7528..60c302b 100644 --- a/src/DivaGL/shader_glsl_ft.cpp +++ b/src/DivaGL/shader_ft.cpp @@ -3,7 +3,7 @@ GitHub/GitLab: korenkonder */ -#include "shader_glsl_ft.hpp" +#include "shader_ft.hpp" #include "../KKdLib/str_utils.hpp" #include "gl_state.hpp" #include "render_context.hpp" @@ -1002,7 +1002,7 @@ static const int32_t sprite_fpt_unival_max[] = { 3, 3, 2, }; -static const shader_glsl_sub_table BLINN_table[] = { +static const shader_sub_table BLINN_table[] = { { SHADER_FT_SUB_BLINN_VERT, blinn_vert_vpt_unival_max, @@ -1019,7 +1019,7 @@ static const shader_glsl_sub_table BLINN_table[] = { }, }; -static const shader_glsl_sub_table ITEM_table[] = { +static const shader_sub_table ITEM_table[] = { { SHADER_FT_SUB_ITEM_BLINN, item_blinn_vpt_unival_max, @@ -1029,7 +1029,7 @@ static const shader_glsl_sub_table ITEM_table[] = { }, }; -static const shader_glsl_sub_table STAGE_table[] = { +static const shader_sub_table STAGE_table[] = { { SHADER_FT_SUB_STAGE_BLINN, stage_blinn_vpt_unival_max, @@ -1039,7 +1039,7 @@ static const shader_glsl_sub_table STAGE_table[] = { }, }; -static const shader_glsl_sub_table SKIN_table[] = { +static const shader_sub_table SKIN_table[] = { { SHADER_FT_SUB_SKIN_DEFAULT, skin_default_vpt_unival_max, @@ -1049,7 +1049,7 @@ static const shader_glsl_sub_table SKIN_table[] = { }, }; -static const shader_glsl_sub_table SSS_SKIN_table[] = { +static const shader_sub_table SSS_SKIN_table[] = { { SHADER_FT_SUB_SSS_SKIN, sss_skin_vpt_unival_max, @@ -1059,7 +1059,7 @@ static const shader_glsl_sub_table SSS_SKIN_table[] = { }, }; -/*static const shader_glsl_sub_table SSS_FILT_table[] = { +/*static const shader_sub_table SSS_FILT_table[] = { { SHADER_FT_SUB_SSS_FILTER, sss_filter_vpt_unival_max, @@ -1069,7 +1069,7 @@ static const shader_glsl_sub_table SSS_SKIN_table[] = { }, };*/ -static const shader_glsl_sub_table SSS_FILT_table[] = { +static const shader_sub_table SSS_FILT_table[] = { { SHADER_FT_SUB_SSS_FILTER_MIN, sss_filter_min_vpt_unival_max, @@ -1093,7 +1093,7 @@ static const shader_glsl_sub_table SSS_FILT_table[] = { }, }; -/*static const shader_glsl_sub_table HAIR_table[] = { +/*static const shader_sub_table HAIR_table[] = { { SHADER_FT_SUB_HAIR_DEFAULT, hair_default_vpt_unival_max, @@ -1117,7 +1117,7 @@ static const shader_glsl_sub_table SSS_FILT_table[] = { }, };*/ -static const shader_glsl_sub_table HAIR_table[] = { +static const shader_sub_table HAIR_table[] = { { SHADER_FT_SUB_HAIR_DEFAULT, hair_default_vpt_unival_max, @@ -1134,7 +1134,7 @@ static const shader_glsl_sub_table HAIR_table[] = { }, }; -static const shader_glsl_sub_table CLOTH_table[] = { +static const shader_sub_table CLOTH_table[] = { { SHADER_FT_SUB_CLOTH_DEFAULT, cloth_default_vpt_unival_max, @@ -1158,7 +1158,7 @@ static const shader_glsl_sub_table CLOTH_table[] = { }, }; -static const shader_glsl_sub_table TIGHTS_table[] = { +static const shader_sub_table TIGHTS_table[] = { { SHADER_FT_SUB_TIGHTS, tights_vpt_unival_max, @@ -1168,7 +1168,7 @@ static const shader_glsl_sub_table TIGHTS_table[] = { }, }; -static const shader_glsl_sub_table SKY_table[] = { +static const shader_sub_table SKY_table[] = { { SHADER_FT_SUB_SKY_DEFAULT, sky_default_vpt_unival_max, @@ -1178,7 +1178,7 @@ static const shader_glsl_sub_table SKY_table[] = { }, }; -/*static const shader_glsl_sub_table EYEBALL_table[] = { +/*static const shader_sub_table EYEBALL_table[] = { { SHADER_FT_SUB_EYE_BALL, eye_ball_vpt_unival_max, @@ -1188,7 +1188,7 @@ static const shader_glsl_sub_table SKY_table[] = { }, };*/ -/*static const shader_glsl_sub_table EYELENS_table[] = { +/*static const shader_sub_table EYELENS_table[] = { { SHADER_FT_SUB_EYE_LENS, eye_lens_vpt_unival_max, @@ -1198,7 +1198,7 @@ static const shader_glsl_sub_table SKY_table[] = { }, };*/ -static const shader_glsl_sub_table GLASEYE_table[] = { +static const shader_sub_table GLASEYE_table[] = { { SHADER_FT_SUB_GLASS_EYE, glass_eye_vpt_unival_max, @@ -1208,7 +1208,7 @@ static const shader_glsl_sub_table GLASEYE_table[] = { }, }; -/*static const shader_glsl_sub_table MEMBRAN_table[] = { +/*static const shader_sub_table MEMBRAN_table[] = { { SHADER_FT_SUB_MEMBRANE, membrane_vpt_unival_max, @@ -1218,7 +1218,7 @@ static const shader_glsl_sub_table GLASEYE_table[] = { }, };*/ -/*static const shader_glsl_sub_table SHDMAP_table[] = { +/*static const shader_sub_table SHDMAP_table[] = { { SHADER_FT_SUB_SHADOWMAP, shadowmap_vpt_unival_max, @@ -1228,7 +1228,7 @@ static const shader_glsl_sub_table GLASEYE_table[] = { }, };*/ -/*static const shader_glsl_sub_table ESM_table[] = { +/*static const shader_sub_table ESM_table[] = { { SHADER_FT_SUB_ESM, esm_vpt_unival_max, @@ -1238,7 +1238,7 @@ static const shader_glsl_sub_table GLASEYE_table[] = { }, };*/ -static const shader_glsl_sub_table ESMGAUSS_table[] = { +static const shader_sub_table ESMGAUSS_table[] = { { SHADER_FT_SUB_ESM_GAUSS, esm_gauss_vpt_unival_max, @@ -1248,7 +1248,7 @@ static const shader_glsl_sub_table ESMGAUSS_table[] = { }, }; -/*static const shader_glsl_sub_table ESMFILT_table[] = { +/*static const shader_sub_table ESMFILT_table[] = { { SHADER_FT_SUB_ESM_FILTER, esm_filter_vpt_unival_max, @@ -1258,7 +1258,7 @@ static const shader_glsl_sub_table ESMGAUSS_table[] = { }, };*/ -static const shader_glsl_sub_table ESMFILT_table[] = { +static const shader_sub_table ESMFILT_table[] = { { SHADER_FT_SUB_ESM_FILTER_MIN, esm_filter_min_vpt_unival_max, @@ -1275,7 +1275,7 @@ static const shader_glsl_sub_table ESMFILT_table[] = { }, }; -static const shader_glsl_sub_table LITPROJ_table[] = { +static const shader_sub_table LITPROJ_table[] = { { SHADER_FT_SUB_LIT_PROJ, lit_proj_vpt_unival_max, @@ -1285,7 +1285,7 @@ static const shader_glsl_sub_table LITPROJ_table[] = { }, }; -static const shader_glsl_sub_table SIMPLE_table[] = { +static const shader_sub_table SIMPLE_table[] = { { SHADER_FT_SUB_SIMPLE, simple_vpt_unival_max, @@ -1295,7 +1295,7 @@ static const shader_glsl_sub_table SIMPLE_table[] = { }, }; -static const shader_glsl_sub_table SIL_table[] = { +static const shader_sub_table SIL_table[] = { { SHADER_FT_SUB_SILHOUETTE, silhouette_vpt_unival_max, @@ -1305,7 +1305,7 @@ static const shader_glsl_sub_table SIL_table[] = { }, }; -static const shader_glsl_sub_table LAMBERT_table[] = { +static const shader_sub_table LAMBERT_table[] = { { SHADER_FT_SUB_LAMBERT, lambert_vpt_unival_max, @@ -1315,7 +1315,7 @@ static const shader_glsl_sub_table LAMBERT_table[] = { }, }; -static const shader_glsl_sub_table CONSTANT_table[] = { +static const shader_sub_table CONSTANT_table[] = { { SHADER_FT_SUB_CONSTANT, constant_vpt_unival_max, @@ -1325,7 +1325,7 @@ static const shader_glsl_sub_table CONSTANT_table[] = { }, }; -/*static const shader_glsl_sub_table PEEL_table[] = { +/*static const shader_sub_table PEEL_table[] = { { SHADER_FT_SUB_PEEL, peel_vpt_unival_max, @@ -1335,7 +1335,7 @@ static const shader_glsl_sub_table CONSTANT_table[] = { }, };*/ -static const shader_glsl_sub_table TONEMAP_table[] = { +static const shader_sub_table TONEMAP_table[] = { { SHADER_FT_SUB_TONEMAP, tone_map_vpt_unival_max, @@ -1352,7 +1352,7 @@ static const shader_glsl_sub_table TONEMAP_table[] = { }, }; -/*static const shader_glsl_sub_table REDUCE_table[] = { +/*static const shader_sub_table REDUCE_table[] = { { SHADER_FT_SUB_REDUCE_TEX, reduce_tex_vpt_unival_max, @@ -1362,7 +1362,7 @@ static const shader_glsl_sub_table TONEMAP_table[] = { }, };*/ -static const shader_glsl_sub_table REDUCE_table[] = { +static const shader_sub_table REDUCE_table[] = { { SHADER_FT_SUB_REDUCE_TEX_REDUCE_2, reduce_tex_reduce_2_vpt_unival_max, @@ -1421,7 +1421,7 @@ static const shader_glsl_sub_table REDUCE_table[] = { }, }; -/*static const shader_glsl_sub_table MAGNIFY_table[] = { +/*static const shader_sub_table MAGNIFY_table[] = { { SHADER_FT_SUB_MAGNIFY, magnify_vpt_unival_max, @@ -1431,7 +1431,7 @@ static const shader_glsl_sub_table REDUCE_table[] = { }, };*/ -static const shader_glsl_sub_table MAGNIFY_table[] = { +static const shader_sub_table MAGNIFY_table[] = { { SHADER_FT_SUB_MAGNIFY_LINEAR, magnify_linear_vpt_unival_max, @@ -1469,7 +1469,7 @@ static const shader_glsl_sub_table MAGNIFY_table[] = { }, }; -/*static const shader_glsl_sub_table MLAA_table[] = { +/*static const shader_sub_table MLAA_table[] = { { SHADER_FT_SUB_MLAA, mlaa_vpt_unival_max, @@ -1479,7 +1479,7 @@ static const shader_glsl_sub_table MAGNIFY_table[] = { }, };*/ -static const shader_glsl_sub_table MLAA_table[] = { +static const shader_sub_table MLAA_table[] = { { SHADER_FT_SUB_MLAA_EDGE, mlaa_edge_vpt_unival_max, @@ -1503,7 +1503,7 @@ static const shader_glsl_sub_table MLAA_table[] = { }, }; -static const shader_glsl_sub_table CONTOUR_table[] = { +static const shader_sub_table CONTOUR_table[] = { { SHADER_FT_SUB_CONTOUR, contour_vpt_unival_max, @@ -1513,7 +1513,7 @@ static const shader_glsl_sub_table CONTOUR_table[] = { }, }; -static const shader_glsl_sub_table CONTOUR_NPR_table[] = { +static const shader_sub_table CONTOUR_NPR_table[] = { { SHADER_FT_SUB_CONTOUR_NPR, contour_npr_vpt_unival_max, @@ -1523,7 +1523,7 @@ static const shader_glsl_sub_table CONTOUR_NPR_table[] = { }, }; -/*static const shader_glsl_sub_table EXPOSURE_table[] = { +/*static const shader_sub_table EXPOSURE_table[] = { { SHADER_FT_SUB_EXPOSURE, exposure_vpt_unival_max, @@ -1533,7 +1533,7 @@ static const shader_glsl_sub_table CONTOUR_NPR_table[] = { }, };*/ -static const shader_glsl_sub_table EXPOSURE_table[] = { +static const shader_sub_table EXPOSURE_table[] = { { SHADER_FT_SUB_EXPOSURE_MINIFY, exposure_minify_vpt_unival_max, @@ -1557,7 +1557,7 @@ static const shader_glsl_sub_table EXPOSURE_table[] = { }, }; -/*static const shader_glsl_sub_table GAUSS_table[] = { +/*static const shader_sub_table GAUSS_table[] = { { SHADER_FT_SUB_PP_GAUSS, pp_gauss_vpt_unival_max, @@ -1567,7 +1567,7 @@ static const shader_glsl_sub_table EXPOSURE_table[] = { }, };*/ -static const shader_glsl_sub_table GAUSS_table[] = { +static const shader_sub_table GAUSS_table[] = { { SHADER_FT_SUB_PP_GAUSS_USUAL, pp_gauss_usual_vpt_unival_max, @@ -1584,7 +1584,7 @@ static const shader_glsl_sub_table GAUSS_table[] = { }, }; -static const shader_glsl_sub_table SUN_table[] = { +static const shader_sub_table SUN_table[] = { { SHADER_FT_SUB_SUN, sun_vpt_unival_max, @@ -1594,7 +1594,7 @@ static const shader_glsl_sub_table SUN_table[] = { }, }; -static const shader_glsl_sub_table SUN_NO_TEXTURED_table[] = { +static const shader_sub_table SUN_NO_TEXTURED_table[] = { { SHADER_FT_SUB_SUN_NO_TEXTURED, sun_no_textured_vpt_unival_max, @@ -1604,7 +1604,7 @@ static const shader_glsl_sub_table SUN_NO_TEXTURED_table[] = { }, }; -/*static const shader_glsl_sub_table FADE_table[] = { +/*static const shader_sub_table FADE_table[] = { { SHADER_FT_SUB_FADE, fade_vpt_unival_max, @@ -1614,7 +1614,7 @@ static const shader_glsl_sub_table SUN_NO_TEXTURED_table[] = { }, };*/ -static const shader_glsl_sub_table WATER01_table[] = { +static const shader_sub_table WATER01_table[] = { { SHADER_FT_SUB_WATER01, water01_vpt_unival_max, @@ -1624,7 +1624,7 @@ static const shader_glsl_sub_table WATER01_table[] = { }, }; -/*static const shader_glsl_sub_table WATER02_table[] = { +/*static const shader_sub_table WATER02_table[] = { { SHADER_FT_SUB_WATER02, water02_vpt_unival_max, @@ -1634,7 +1634,7 @@ static const shader_glsl_sub_table WATER01_table[] = { }, };*/ -/*static const shader_glsl_sub_table WATRING_table[] = { +/*static const shader_sub_table WATRING_table[] = { { SHADER_FT_SUB_WATER_RING, water_ring_vpt_unival_max, @@ -1644,7 +1644,7 @@ static const shader_glsl_sub_table WATER01_table[] = { }, };*/ -static const shader_glsl_sub_table W_PTCL_table[] = { +static const shader_sub_table W_PTCL_table[] = { { SHADER_FT_SUB_WATER_PARTICLE, water_particle_vpt_unival_max, @@ -1654,7 +1654,7 @@ static const shader_glsl_sub_table W_PTCL_table[] = { }, }; -/*static const shader_glsl_sub_table SNOW_PT_table[] = { +/*static const shader_sub_table SNOW_PT_table[] = { { SHADER_FT_SUB_SNOW_PARTICLE, snow_particle_vpt_unival_max, @@ -1664,7 +1664,7 @@ static const shader_glsl_sub_table W_PTCL_table[] = { }, };*/ -static const shader_glsl_sub_table SNOW_PT_table[] = { +static const shader_sub_table SNOW_PT_table[] = { { SHADER_FT_SUB_SNOW_PARTICLE, snow_particle_vpt_unival_max, @@ -1681,7 +1681,7 @@ static const shader_glsl_sub_table SNOW_PT_table[] = { }, }; -static const shader_glsl_sub_table LEAF_PT_table[] = { +static const shader_sub_table LEAF_PT_table[] = { { SHADER_FT_SUB_LEAF_PARTICLE, leaf_particle_vpt_unival_max, @@ -1691,7 +1691,7 @@ static const shader_glsl_sub_table LEAF_PT_table[] = { }, }; -static const shader_glsl_sub_table STAR_table[] = { +static const shader_sub_table STAR_table[] = { { SHADER_FT_SUB_STAR, star_vpt_unival_max, @@ -1708,7 +1708,7 @@ static const shader_glsl_sub_table STAR_table[] = { }, }; -/*static const shader_glsl_sub_table SNORING_table[] = { +/*static const shader_sub_table SNORING_table[] = { { SHADER_FT_SUB_SNOW_RING, snow_ring_vpt_unival_max, @@ -1718,7 +1718,7 @@ static const shader_glsl_sub_table STAR_table[] = { }, }; -static const shader_glsl_sub_table SN_FOOT_table[] = { +static const shader_sub_table SN_FOOT_table[] = { { SHADER_FT_SUB_SNOW_FOOTPRINT, snow_footprint_vpt_unival_max, @@ -1728,7 +1728,7 @@ static const shader_glsl_sub_table SN_FOOT_table[] = { }, }; -static const shader_glsl_sub_table SN_TSL_table[] = { +static const shader_sub_table SN_TSL_table[] = { { SHADER_FT_SUB_SNOW_TEX_SPACE_LIGHT, snow_tex_space_light_vpt_unival_max, @@ -1738,7 +1738,7 @@ static const shader_glsl_sub_table SN_TSL_table[] = { }, }; -static const shader_glsl_sub_table SN_NRM_table[] = { +static const shader_sub_table SN_NRM_table[] = { { SHADER_FT_SUB_SNOW_CALC_NORMAL, snow_calc_normal_vpt_unival_max, @@ -1748,7 +1748,7 @@ static const shader_glsl_sub_table SN_NRM_table[] = { }, };*/ -static const shader_glsl_sub_table FLOOR_table[] = { +static const shader_sub_table FLOOR_table[] = { { SHADER_FT_SUB_FLOOR, floor_vpt_unival_max, @@ -1758,7 +1758,7 @@ static const shader_glsl_sub_table FLOOR_table[] = { }, }; -static const shader_glsl_sub_table PUDDLE_table[] = { +static const shader_sub_table PUDDLE_table[] = { { SHADER_FT_SUB_PUDDLE, puddle_vpt_unival_max, @@ -1768,7 +1768,7 @@ static const shader_glsl_sub_table PUDDLE_table[] = { }, }; -static const shader_glsl_sub_table S_REFL_table[] = { +static const shader_sub_table S_REFL_table[] = { { SHADER_FT_SUB_SIMPLE_REFLECT, simple_reflect_vpt_unival_max, @@ -1778,7 +1778,7 @@ static const shader_glsl_sub_table S_REFL_table[] = { }, }; -static const shader_glsl_sub_table S_REFR_table[] = { +static const shader_sub_table S_REFR_table[] = { { SHADER_FT_SUB_SIMPLE_REFRACT, simple_refract_vpt_unival_max, @@ -1788,7 +1788,7 @@ static const shader_glsl_sub_table S_REFR_table[] = { }, }; -static const shader_glsl_sub_table RIPEMIT_table[] = { +static const shader_sub_table RIPEMIT_table[] = { { SHADER_FT_SUB_RIPPLE_EMIT, ripple_emit_vpt_unival_max, @@ -1798,7 +1798,7 @@ static const shader_glsl_sub_table RIPEMIT_table[] = { }, }; -static const shader_glsl_sub_table RAIN_table[] = { +static const shader_sub_table RAIN_table[] = { { SHADER_FT_SUB_RAIN, rain_vpt_unival_max, @@ -1808,7 +1808,7 @@ static const shader_glsl_sub_table RAIN_table[] = { }, }; -/*static const shader_glsl_sub_table VOLLIT_table[] = { +/*static const shader_sub_table VOLLIT_table[] = { { SHADER_FT_SUB_VOLUME_LIGHT, volume_light_vpt_unival_max, @@ -1818,7 +1818,7 @@ static const shader_glsl_sub_table RAIN_table[] = { }, };*/ -/*static const shader_glsl_sub_table FENCE_table[] = { +/*static const shader_sub_table FENCE_table[] = { { SHADER_FT_SUB_FENCE_ALPHA, fence_alpha_vpt_unival_max, @@ -1828,7 +1828,7 @@ static const shader_glsl_sub_table RAIN_table[] = { }, };*/ -static const shader_glsl_sub_table RIPPLE_table[] = { +static const shader_sub_table RIPPLE_table[] = { { SHADER_FT_SUB_RIPPLE, ripple_vpt_unival_max, @@ -1838,7 +1838,7 @@ static const shader_glsl_sub_table RIPPLE_table[] = { }, }; -static const shader_glsl_sub_table FOGPTCL_table[] = { +static const shader_sub_table FOGPTCL_table[] = { { SHADER_FT_SUB_FOG_PTCL, fog_ptcl_vpt_unival_max, @@ -1848,7 +1848,7 @@ static const shader_glsl_sub_table FOGPTCL_table[] = { }, }; -static const shader_glsl_sub_table PARTICL_table[] = { +static const shader_sub_table PARTICL_table[] = { { SHADER_FT_SUB_PARTICLE, particle_vpt_unival_max, @@ -1858,7 +1858,7 @@ static const shader_glsl_sub_table PARTICL_table[] = { }, }; -static const shader_glsl_sub_table GLITTER_PT_table[] = { +static const shader_sub_table GLITTER_PT_table[] = { { SHADER_FT_SUB_GLITTER_PARTICLE, glitter_particle_vpt_unival_max, @@ -1868,7 +1868,7 @@ static const shader_glsl_sub_table GLITTER_PT_table[] = { }, }; -/*static const shader_glsl_sub_table SHOW_VEC_table[] = { +/*static const shader_sub_table SHOW_VEC_table[] = { { SHADER_FT_SUB_SHOW_VECTOR, show_vector_vpt_unival_max, @@ -1878,7 +1878,7 @@ static const shader_glsl_sub_table GLITTER_PT_table[] = { }, };*/ -static const shader_glsl_sub_table FONT_table[] = { +static const shader_sub_table FONT_table[] = { { SHADER_FT_SUB_FONT, font_vpt_unival_max, @@ -1888,7 +1888,7 @@ static const shader_glsl_sub_table FONT_table[] = { }, }; -static const shader_glsl_sub_table MOVIE_table[] = { +static const shader_sub_table MOVIE_table[] = { { SHADER_FT_SUB_MOVIE, movie_vpt_unival_max, @@ -1898,7 +1898,7 @@ static const shader_glsl_sub_table MOVIE_table[] = { }, }; -/*static const shader_glsl_sub_table IMGFILT_table[] = { +/*static const shader_sub_table IMGFILT_table[] = { { SHADER_FT_SUB_IMGFILTER, imgfilter_vpt_unival_max, @@ -1908,7 +1908,7 @@ static const shader_glsl_sub_table MOVIE_table[] = { }, };*/ -static const shader_glsl_sub_table IMGFILT_table[] = { +static const shader_sub_table IMGFILT_table[] = { { SHADER_FT_SUB_BOX4, box4_vpt_unival_max, @@ -1932,7 +1932,7 @@ static const shader_glsl_sub_table IMGFILT_table[] = { }, }; -static const shader_glsl_sub_table SPRITE_table[] = { +static const shader_sub_table SPRITE_table[] = { { SHADER_FT_SUB_SPRITE, sprite_vpt_unival_max, @@ -2883,14 +2883,14 @@ struct glass_eye_struct { { \ #n, \ SHADER_FT_##n, \ - sizeof(n##_table) / sizeof(shader_glsl_sub_table), \ + sizeof(n##_table) / sizeof(shader_sub_table), \ n##_table, \ sizeof(n##_uniform) / sizeof(uniform_name), \ n##_uniform, \ n##_permut, \ } -const shader_glsl_table shader_ft_table[] = { +const shader_table shader_ft_table[] = { { "SHADER_FFP", SHADER_FT_FFP, @@ -2969,27 +2969,27 @@ const shader_glsl_table shader_ft_table[] = { #undef shader_table_struct const size_t shader_ft_table_size = - sizeof(shader_ft_table) / sizeof(shader_glsl_table); + sizeof(shader_ft_table) / sizeof(shader_table); static void glass_eye_calc(glass_eye_struct* glass_eye); static void glass_eye_set(glass_eye_struct* glass_eye); -static void shader_bind_blinn(shader_glsl_set_data* set, shader_glsl* shad); -static void shader_bind_cloth(shader_glsl_set_data* set, shader_glsl* shad); -static void shader_bind_hair(shader_glsl_set_data* set, shader_glsl* shad); -static void shader_bind_eye_ball(shader_glsl_set_data* set, shader_glsl* shad); -static void shader_bind_tone_map(shader_glsl_set_data* set, shader_glsl* shad); -static void shader_bind_sss_filter(shader_glsl_set_data* set, shader_glsl* shad); // Added -static void shader_bind_esm_filter(shader_glsl_set_data* set, shader_glsl* shad); // Added -static void shader_bind_reduce_tex(shader_glsl_set_data* set, shader_glsl* shad); // Added -static void shader_bind_magnify(shader_glsl_set_data* set, shader_glsl* shad); // Added -static void shader_bind_mlaa(shader_glsl_set_data* set, shader_glsl* shad); // Added -static void shader_bind_exposure(shader_glsl_set_data* set, shader_glsl* shad); // Added -static void shader_bind_gauss(shader_glsl_set_data* set, shader_glsl* shad); // Added -static void shader_bind_snow_particle(shader_glsl_set_data* set, shader_glsl* shad); // Added -static void shader_bind_star(shader_glsl_set_data* set, shader_glsl* shad); // Added -static void shader_bind_imgfilter(shader_glsl_set_data* set, shader_glsl* shad); // Added +static void shader_bind_blinn(shader_set_data* set, shader* shad); +static void shader_bind_cloth(shader_set_data* set, shader* shad); +static void shader_bind_hair(shader_set_data* set, shader* shad); +static void shader_bind_eye_ball(shader_set_data* set, shader* shad); +static void shader_bind_tone_map(shader_set_data* set, shader* shad); +static void shader_bind_sss_filter(shader_set_data* set, shader* shad); // Added +static void shader_bind_esm_filter(shader_set_data* set, shader* shad); // Added +static void shader_bind_reduce_tex(shader_set_data* set, shader* shad); // Added +static void shader_bind_magnify(shader_set_data* set, shader* shad); // Added +static void shader_bind_mlaa(shader_set_data* set, shader* shad); // Added +static void shader_bind_exposure(shader_set_data* set, shader* shad); // Added +static void shader_bind_gauss(shader_set_data* set, shader* shad); // Added +static void shader_bind_snow_particle(shader_set_data* set, shader* shad); // Added +static void shader_bind_star(shader_set_data* set, shader* shad); // Added +static void shader_bind_imgfilter(shader_set_data* set, shader* shad); // Added -const shader_glsl_bind_func shader_ft_bind_func_table[] = { +const shader_bind_func shader_ft_bind_func_table[] = { { SHADER_FT_BLINN, shader_bind_blinn, @@ -3054,9 +3054,9 @@ const shader_glsl_bind_func shader_ft_bind_func_table[] = { }; const size_t shader_ft_bind_func_table_size = - sizeof(shader_ft_bind_func_table) / sizeof(shader_glsl_bind_func); + sizeof(shader_ft_bind_func_table) / sizeof(shader_bind_func); -shader_glsl_set_data shaders_ft; +shader_set_data shaders_ft; static glass_eye_struct glass_eye = { { 5.0f, 5.0f, 0.5f, 0.5f }, @@ -3184,21 +3184,21 @@ static void glass_eye_set(glass_eye_struct* glass_eye) { rctx->glass_eye_batch_ubo.Bind(4); } -static void shader_bind_blinn(shader_glsl_set_data* set, shader_glsl* shad) { +static void shader_bind_blinn(shader_set_data* set, shader* shad) { shad->bind(set, uniform->arr[U_NORMAL] ? SHADER_FT_SUB_BLINN_FRAG : SHADER_FT_SUB_BLINN_VERT); } -static void shader_bind_cloth(shader_glsl_set_data* set, shader_glsl* shad) { +static void shader_bind_cloth(shader_set_data* set, shader* shad) { shad->bind(set, uniform->arr[U_NPR] ? SHADER_FT_SUB_CLOTH_NPR1 : (uniform->arr[U_ANISO] ? SHADER_FT_SUB_CLOTH_ANISO : SHADER_FT_SUB_CLOTH_DEFAULT)); } -static void shader_bind_hair(shader_glsl_set_data* set, shader_glsl* shad) { +static void shader_bind_hair(shader_set_data* set, shader* shad) { shad->bind(set, uniform->arr[U_NPR] ? SHADER_FT_SUB_HAIR_NPR1 : SHADER_FT_SUB_HAIR_DEFAULT); } -static void shader_bind_eye_ball(shader_glsl_set_data* set, shader_glsl* shad) { +static void shader_bind_eye_ball(shader_set_data* set, shader* shad) { uniform->arr[U18] = 0; if (set->shaders[SHADER_FT_GLASEYE].bind(set, SHADER_FT_SUB_GLASS_EYE) >= 0) { glass_eye_calc(&glass_eye); @@ -3206,12 +3206,12 @@ static void shader_bind_eye_ball(shader_glsl_set_data* set, shader_glsl* shad) { } } -static void shader_bind_tone_map(shader_glsl_set_data* set, shader_glsl* shad) { +static void shader_bind_tone_map(shader_set_data* set, shader* shad) { shad->bind(set, uniform->arr[U_NPR] == 1 ? SHADER_FT_SUB_TONEMAP_NPR1 : SHADER_FT_SUB_TONEMAP); } -static void shader_bind_sss_filter(shader_glsl_set_data* set, shader_glsl* shad) { // Added +static void shader_bind_sss_filter(shader_set_data* set, shader* shad) { // Added switch (uniform->arr[U_SSS_FILTER]) { case 0: shad->bind(set, uniform->arr[U_NPR] @@ -3223,7 +3223,7 @@ static void shader_bind_sss_filter(shader_glsl_set_data* set, shader_glsl* shad) } } -static void shader_bind_esm_filter(shader_glsl_set_data* set, shader_glsl* shad) { // Added +static void shader_bind_esm_filter(shader_set_data* set, shader* shad) { // Added switch (uniform->arr[U_ESM_FILTER]) { case 0: shad->bind(set, SHADER_FT_SUB_ESM_FILTER_MIN); @@ -3234,7 +3234,7 @@ static void shader_bind_esm_filter(shader_glsl_set_data* set, shader_glsl* shad) } } -static void shader_bind_reduce_tex(shader_glsl_set_data* set, shader_glsl* shad) { // Added +static void shader_bind_reduce_tex(shader_set_data* set, shader* shad) { // Added switch (uniform->arr[U_REDUCE]) { case 0: switch (uniform->arr[U_ALPHA_MASK]) { @@ -3291,7 +3291,7 @@ static void shader_bind_reduce_tex(shader_glsl_set_data* set, shader_glsl* shad) } } -static void shader_bind_magnify(shader_glsl_set_data* set, shader_glsl* shad) { // Added +static void shader_bind_magnify(shader_set_data* set, shader* shad) { // Added switch (uniform->arr[U_MAGNIFY]) { case 0: shad->bind(set, SHADER_FT_SUB_MAGNIFY_LINEAR); @@ -3311,7 +3311,7 @@ static void shader_bind_magnify(shader_glsl_set_data* set, shader_glsl* shad) { } } -static void shader_bind_mlaa(shader_glsl_set_data* set, shader_glsl* shad) { // Added +static void shader_bind_mlaa(shader_set_data* set, shader* shad) { // Added switch (uniform->arr[U_MLAA]) { case 0: shad->bind(set, SHADER_FT_SUB_MLAA_EDGE); @@ -3325,7 +3325,7 @@ static void shader_bind_mlaa(shader_glsl_set_data* set, shader_glsl* shad) { // } } -static void shader_bind_exposure(shader_glsl_set_data* set, shader_glsl* shad) { // Added +static void shader_bind_exposure(shader_set_data* set, shader* shad) { // Added switch (uniform->arr[U_EXPOSURE]) { case 0: shad->bind(set, SHADER_FT_SUB_EXPOSURE_MINIFY); @@ -3339,7 +3339,7 @@ static void shader_bind_exposure(shader_glsl_set_data* set, shader_glsl* shad) { } } -static void shader_bind_gauss(shader_glsl_set_data* set, shader_glsl* shad) { // Added +static void shader_bind_gauss(shader_set_data* set, shader* shad) { // Added switch (uniform->arr[U_GAUSS]) { case 0: shad->bind(set, SHADER_FT_SUB_PP_GAUSS_USUAL); @@ -3350,7 +3350,7 @@ static void shader_bind_gauss(shader_glsl_set_data* set, shader_glsl* shad) { // } } -static void shader_bind_snow_particle(shader_glsl_set_data* set, shader_glsl* shad) { // Added +static void shader_bind_snow_particle(shader_set_data* set, shader* shad) { // Added switch (uniform->arr[U_SNOW_PARTICLE]) { case 0: shad->bind(set, SHADER_FT_SUB_SNOW_PARTICLE_CPU); @@ -3361,7 +3361,7 @@ static void shader_bind_snow_particle(shader_glsl_set_data* set, shader_glsl* sh } } -static void shader_bind_star(shader_glsl_set_data* set, shader_glsl* shad) { // Added +static void shader_bind_star(shader_set_data* set, shader* shad) { // Added switch (uniform->arr[U_STAR]) { case 0: shad->bind(set, SHADER_FT_SUB_STAR); @@ -3372,7 +3372,7 @@ static void shader_bind_star(shader_glsl_set_data* set, shader_glsl* shad) { // } } -static void shader_bind_imgfilter(shader_glsl_set_data* set, shader_glsl* shad) { +static void shader_bind_imgfilter(shader_set_data* set, shader* shad) { switch (uniform->arr[U_IMAGE_FILTER]) { case 0: shad->bind(set, SHADER_FT_SUB_BOX4); diff --git a/src/DivaGL/shader_glsl_ft.hpp b/src/DivaGL/shader_ft.hpp similarity index 90% rename from src/DivaGL/shader_glsl_ft.hpp rename to src/DivaGL/shader_ft.hpp index b3e24e6..4b4c41e 100644 --- a/src/DivaGL/shader_glsl_ft.hpp +++ b/src/DivaGL/shader_ft.hpp @@ -6,7 +6,7 @@ #pragma once #include "../KKdLib/default.hpp" -#include "shader_glsl.hpp" +#include "shader.hpp" enum shader_ft_enum { SHADER_FT_FFP = 0, @@ -77,11 +77,11 @@ enum shader_ft_enum { SHADER_FT_MAX, }; -extern const shader_glsl_table shader_ft_table[]; +extern const shader_table shader_ft_table[]; extern const size_t shader_ft_table_size; -extern const shader_glsl_bind_func shader_ft_bind_func_table[]; +extern const shader_bind_func shader_ft_bind_func_table[]; extern const size_t shader_ft_bind_func_table_size; -extern shader_glsl_set_data shaders_ft; +extern shader_set_data shaders_ft; extern int32_t shader_ft_get_index_by_name(const char* name); diff --git a/src/DivaGL/shader_table.cpp b/src/DivaGL/shader_table.cpp deleted file mode 100644 index 41b7bc4..0000000 --- a/src/DivaGL/shader_table.cpp +++ /dev/null @@ -1,237 +0,0 @@ -/* - by korenkonder - GitHub/GitLab: korenkonder -*/ - -#include "shader_table.hpp" -#include "../KKdLib/mat.hpp" -#include "render_context.hpp" -#include "render_texture.hpp" -#include "shader_glsl_ft.hpp" -#include "types.hpp" -#include "wrap.hpp" - -Shader* shaders = (Shader*)0x000000014CC57C10; -ShaderTable* shader_table = (ShaderTable*)0x0000000140A41D20; -ShaderBindFunc* shader_name_bind_func_table = (ShaderBindFunc*)0x0000000140A40F50; -int32_t* current_vp = (int32_t*)0x000000014CC587B0; -int32_t* current_fp = (int32_t*)0x000000014CC587B4; - -void FASTCALL shader_set(ShaderName name) { - if (!name) { - shader_unbind(); - return; - } - - glProgramEnvParameter4fARB(GL_FRAGMENT_PROGRAM_ARB, 24, - (float)uniform->arr[U_TEXTURE_BLEND], 0.0, 0.0, 0.0); - - Shader* shad = &shaders[name]; - if (shad->bind_func) - shad->bind_func(shad); - else - shader_bind(shad, shad->sub->sub_name); -} - -void FASTCALL shader_bind_blinn(Shader* shad) { - shader_bind(shad, uniform->arr[U_NORMAL] ? BLINN_FRAG : BLINN_VERT); -} - -void FASTCALL shader_bind_cloth(Shader* shad) { - shader_bind(shad, uniform->arr[U_NPR] ? CLOTH_NPR1 - : (uniform->arr[U_ANISO] ? CLOTH_ANISO : CLOTH_DEFAULT)); -} - -void FASTCALL shader_bind_hair(Shader* shad) { - shader_bind(shad, uniform->arr[U_NPR] ? HAIR_NPR1 - : (uniform->arr[U_ANISO] ? HAIR_ANISO : HAIR_DEFAULT)); -} - -void FASTCALL shader_bind_membrane(Shader* shad) { - uniform->arr[U_MEMBRANE] = 3; - if (shader_bind(shad, MEMBRANE) < 0) - return; - - uint32_t(FASTCALL * sub_140192E00)() = (uint32_t(FASTCALL*)())0x0000000140192E00; - uint32_t v1 = sub_140192E00(); - mat4 mat = mat4_identity; - mat4_mul_rotate_x(&mat, (float_t)((v1 & 0x1FF) * (M_PI / 256.0)), &mat); - mat4_mul_rotate_z(&mat, (float_t)((v1 % 0x168) * (M_PI / 180.0)), &mat); - - vec4 vec = { 1.0f, 0.0f, 0.0f, 0.0f }; - mat4_transform_vector(&mat, &vec, &vec); - - glProgramLocalParameter4fARB(GL_FRAGMENT_PROGRAM_ARB, 10, vec.x, vec.y, vec.z, 0.0); -} - -void FASTCALL shader_bind_eye_ball(Shader* shad) { - uniform->arr[U18] = 0; - if (shader_bind(&shaders[_GLASEYE], GLASS_EYE) >= 0) { - float* glass_eye = (float*)0x0000000140CA2D70; - void (FASTCALL * glass_eye_calc)(float* glass_eye) = (void (FASTCALL*)(float* glass_eye))0x00000001405E53D0; - void (FASTCALL * glass_eye_set)(float* glass_eye) = (void (FASTCALL*)(float* glass_eye))0x00000001405E4750; - glass_eye_calc(glass_eye); - glass_eye_set(glass_eye); - } -} - -void FASTCALL shader_bind_tone_map(Shader* shad) { - shader_bind(shad, uniform->arr[U_NPR] == 1 ? TONEMAP_NPR1 : TONEMAP); -} - -int32_t FASTCALL shader_bind(Shader* shad, SubShaderName name) { - int32_t num_sub = shad->num_sub; - int32_t subshader_index = 0; - if (num_sub <= 0) - return -1; - - for (SubShader* i = shad->sub; i->sub_name != name; i++) { - subshader_index++; - if (subshader_index >= num_sub) - return -1; - } - - SubShader* subshader = &shad->sub[subshader_index]; - if (!subshader) - return -1; - - int32_t num_uniform = shad->num_uniform; - int32_t unival_vp_curr = 1; - int32_t unival_fp_curr = 1; - int32_t unival_vp = 0; - int32_t unival_fp = 0; - if (num_uniform > 0) { - int32_t* vp_unival_max = subshader->vp_unival_max; - int32_t* fp_unival_max = subshader->fp_unival_max; - for (size_t i = 0; i < num_uniform; i++) { - int32_t unival = uniform->arr[shad->use_uniform[i]]; - unival_vp += unival_vp_curr * min_def(unival, vp_unival_max[i]); - unival_fp += unival_fp_curr * min_def(unival, fp_unival_max[i]); - unival_vp_curr *= vp_unival_max[i] + 1; - unival_fp_curr *= fp_unival_max[i] + 1; - } - } - - int32_t vp = subshader->vp[unival_vp]; - int32_t fp = subshader->fp[unival_fp]; - if (*current_vp != vp) { - glBindProgramARB(GL_VERTEX_PROGRAM_ARB, vp); - *current_vp = vp; - } - - if (*current_fp != fp) { - glBindProgramARB(GL_FRAGMENT_PROGRAM_ARB, fp); - *current_fp = fp; - } - - glEnableDLL(GL_VERTEX_PROGRAM_ARB); - glEnableDLL(GL_FRAGMENT_PROGRAM_ARB); - return 0; -} - -void FASTCALL shader_unbind() { - if (current_vp) { - if (*current_vp) - glDisableDLL(GL_VERTEX_PROGRAM_ARB); - *current_vp = 0; - } - - if (current_fp) { - if (*current_fp) - glDisableDLL(GL_FRAGMENT_PROGRAM_ARB); - *current_fp = 0; - } -} - -void FASTCALL shader_load_all_shaders() { - { - farc f; - f.read("plugins\\divagl_ft_shaders.farc", true, false); - shaders_ft.load(&f, false, "ft", shader_ft_table, shader_ft_table_size, - shader_ft_bind_func_table, shader_ft_bind_func_table_size, - shader_ft_get_index_by_name); - } - return; - - void (FASTCALL * shader_load_program_file)(GLuint program, const char* file_name, bool vertex_program) - = (void (FASTCALL*)(GLuint program, const char* file_name, bool vertex_program))0x00000001405E52D0; - - ShaderTable* shaders_table = &shader_table[_BLINN]; - Shader* shader = &shaders[_BLINN]; - int32_t curr_shader = SHADER_END - 1; - do { - shader->name = shaders_table->name; - shader->name_index = shaders_table->name_index; - shader->num_sub = shaders_table->num_sub; - int32_t num_sub = shaders_table->num_sub; - - const SubShaderTable* sub_table = shaders_table->sub; - SubShader* sub = (SubShader*)_operator_new(sizeof(SubShader) * num_sub); - memset(sub, 0, sizeof(SubShader) * num_sub); - shader->sub = sub; - shader->num_uniform = shaders_table->num_uniform; - shader->use_uniform = shaders_table->use_uniform; - - for (int32_t i = 0; i < num_sub; i++, sub_table++, sub++) { - sub->sub_name = sub_table->sub_name; - sub->vp_unival_max = (int32_t*)sub_table->vp_unival_max; - sub->fp_unival_max = (int32_t*)sub_table->fp_unival_max; - sub->num_vp = sub_table->num_vp; - sub->num_fp = sub_table->num_fp; - sub->vp = (GLuint*)_operator_new(sizeof(GLuint) * sub_table->num_vp); - sub->fp = (GLuint*)_operator_new(sizeof(GLuint) * sub_table->num_fp); - - glGenProgramsARB((GLsizei)sub_table->num_vp, (GLuint*)sub->vp); - glGenProgramsARB((GLsizei)sub_table->num_fp, (GLuint*)sub->fp); - - for (int32_t j = 0; j < sub_table->num_vp; j++) - shader_load_program_file(sub->vp[j], sub_table->vp[j], true); - - for (int32_t j = 0; j < sub_table->num_fp; j++) - shader_load_program_file(sub->fp[j], sub_table->fp[j], false); - } - shader->bind_func = 0; - - ShaderBindFunc* bind_func_table = shader_name_bind_func_table; - ShaderName bind_func_name = _BLINN; - while (shader->name_index != bind_func_name) { - bind_func_name = (++bind_func_table)->name_index; - if (bind_func_table->name_index == SHADER_END) - break; - } - shader->bind_func = bind_func_table->bind_func; - shader++; - shaders_table++; - curr_shader--; - } while (curr_shader); -} - -void FASTCALL shader_free() { - shaders_ft.unload(); - return; - Shader* shader = &shaders[SHADER_FFP]; - for (int32_t i = 0; i < SHADER_END; i++, shader++) { - if (!shader->sub) - continue; - - for (int32_t j = 0; j < shader->num_sub; j++) { - SubShader* sub = shader->sub; - if (sub[j].vp) { - glDeleteProgramsARB(sub[j].num_vp, sub[j].vp); - _operator_delete(sub[j].vp); - sub[j].vp = 0; - } - - if (sub[j].fp) { - glDeleteProgramsARB(sub[j].num_fp, sub[j].fp); - _operator_delete(sub[j].fp); - sub[j].fp = 0; - } - } - - if (shader->sub) { - _operator_delete(shader->sub); - shader->sub = 0; - } - } -} diff --git a/src/DivaGL/shader_table.hpp b/src/DivaGL/shader_table.hpp deleted file mode 100644 index 7f27a4f..0000000 --- a/src/DivaGL/shader_table.hpp +++ /dev/null @@ -1,218 +0,0 @@ -/* - by korenkonder - GitHub/GitLab: korenkonder -*/ - -#pragma once - -#include "../KKdLib/default.hpp" -#include "gl.hpp" -#include "uniform.hpp" - -enum SubShaderName { - SHADER_SUB_FFP = 0, - BLINN_VERT = 1, - BLINN_FRAG = 2, - ITEM_BLINN = 3, - STAGE_BLINN = 4, - SKIN_DEFAULT = 5, - SSS_SKIN = 6, - SSS_FILTER = 7, - HAIR_DEFAULT = 8, - HAIR_ANISO = 9, - HAIR_NPR1 = 10, - CLOTH_DEFAULT = 11, - CLOTH_ANISO = 12, - CLOTH_NPR1 = 13, - TIGHTS = 14, - SKY_DEFAULT = 15, - EYE_BALL = 16, - EYE_LENS = 17, - GLASS_EYE = 18, - MEMBRANE = 19, - SHADOWMAP = 20, - ESM = 21, - ESM_GAUSS = 22, - ESM_FILTER = 23, - LIT_PROJ = 24, - SIMPLE = 25, - SILHOUETTE = 26, - LAMBERT = 27, - CONSTANT = 28, - PEEL = 29, - TONEMAP = 30, - TONEMAP_NPR1 = 31, - REDUCE_TEX = 32, - MAGNIFY = 33, - MLAA = 34, - CONTOUR = 35, - EXPOSURE = 36, - PP_GAUSS = 37, - SUN = 38, - FADE = 39, - WATER01 = 40, - WATER02 = 41, - WATER_RING = 42, - WATER_PARTICLE = 43, - SNOW_PARTICLE = 44, - LEAF_PARTICLE = 45, - STAR = 46, - SNOW_RING = 47, - SNOW_FOOTPRINT = 48, - SNOW_TEX_SPACE_LIGHT = 49, - SNOW_CALC_NORMAL = 50, - FLOOR = 51, - PUDDLE = 52, - SIMPLE_REFLECT = 53, - SIMPLE_REFRACT = 54, - RIPPLE_EMIT = 55, - RAIN = 56, - VOLUME_LIGHT = 57, - FENCE_ALPHA = 58, - RIPPLE = 59, - FOG_PTCL = 60, - PARTICLE = 61, - GLITTER_PARTICLE = 62, - SHOW_VECTOR = 63, - FONT = 64, - MOVIE = 65, - IMGFILTER = 66, - SPRITE = 67, -}; - -enum ShaderName { - SHADER_FFP = 0, - _BLINN = 1, - _ITEM = 2, - _STAGE = 3, - _SKIN = 4, - _SSS_SKIN = 5, - _SSS_FILT = 6, - _HAIR = 7, - _CLOTH = 8, - _TIGHTS = 9, - _SKY = 10, - _EYEBALL = 11, - _EYELENS = 12, - _GLASEYE = 13, - _MEMBRAN = 14, - _SHDMAP = 15, - _ESM = 16, - _ESMGAUSS = 17, - _ESMFILT = 18, - _LITPROJ = 19, - _SIMPLE = 20, - _SIL = 21, - _LAMBERT = 22, - _CONSTANT = 23, - _PEEL = 24, - _TONEMAP = 25, - _REDUCE = 26, - _MAGNIFY = 27, - _MLAA = 28, - _CONTOUR = 29, - _EXPOSURE = 30, - _GAUSS = 31, - _SUN = 32, - _FADE = 33, - _WATER01 = 34, - _WATER02 = 35, - _WATRING = 36, - _W_PTCL = 37, - _SNOW_PT = 38, - _LEAF_PT = 39, - _STAR = 40, - _SNORING = 41, - _SN_FOOT = 42, - _SN_TSL = 43, - _SN_NRM = 44, - _FLOOR = 45, - _PUDDLE = 46, - _S_REFL = 47, - _S_REFR = 48, - _RIPEMIT = 49, - _RAIN = 50, - _VOLLIT = 51, - _FENCE = 52, - _RIPPLE = 53, - _FOGPTCL = 54, - _PARTICL = 55, - _GLITTER_PT = 56, - _SHOWVEC = 57, - _FONT = 58, - _MOVIE = 59, - _IMGFILT = 60, - _SPRITE = 61, - SHADER_END = 62, -}; - -struct SubShaderTable { - SubShaderName sub_name; - int32_t padding; - const int32_t* vp_unival_max; - const int32_t* fp_unival_max; - int32_t num_vp; - int32_t num_fp; - const char** vp; - const char** fp; -}; - -struct ShaderTable { - const char* name; - ShaderName name_index; - int32_t num_sub; - const SubShaderTable* sub; - int32_t num_uniform; - int32_t padding; - uniform_name* use_uniform; -}; - -struct SubShader { - SubShaderName sub_name; - int32_t padding; - int32_t* vp_unival_max; - int32_t* fp_unival_max; - int32_t num_vp; - int32_t num_fp; - GLuint* vp; - GLuint* fp; -}; - -struct Shader; - -typedef void (FASTCALL* PFNSHADERBINDFUNCPROC)(Shader* shad); - -struct Shader { - const char* name; - ShaderName name_index; - int32_t num_sub; - SubShader* sub; - int32_t num_uniform; - int32_t padding; - uniform_name* use_uniform; - PFNSHADERBINDFUNCPROC bind_func; -}; - -struct ShaderBindFunc { - ShaderName name_index; - int32_t padding; - PFNSHADERBINDFUNCPROC bind_func; -}; - -extern Shader* shaders; -extern ShaderTable* shader_table; -extern ShaderBindFunc* shader_name_bind_func_table; -extern int32_t* current_vp; -extern int32_t* current_fp; - -extern void FASTCALL shader_set(ShaderName name); // 0x00000001405E4CE0 -extern void FASTCALL shader_bind_blinn(Shader* shad); // 0x00000001405E4320 -extern void FASTCALL shader_bind_cloth(Shader* shad); // 0x00000001405E4340 -extern void FASTCALL shader_bind_hair(Shader* shad); // 0x00000001405E4370 -extern void FASTCALL shader_bind_membrane(Shader* shas); // 0x00000001405E43A0 -extern void FASTCALL shader_bind_eye_ball(Shader* shad); // 0x00000001405E4530 -extern void FASTCALL shader_bind_tone_map(Shader* shad); // 0x00000001405E4580 -extern int32_t FASTCALL shader_bind(Shader* shad, SubShaderName name); // 0x00000001405E4B50 -extern void FASTCALL shader_unbind(); // 0x00000001405E5660 -extern void FASTCALL shader_load_all_shaders(); // 0x00000001405E4FC0 -extern void FASTCALL shader_free(); // 0x00000001405E4DB0 diff --git a/src/DivaGL/sprite.cpp b/src/DivaGL/sprite.cpp index 9a507d8..a1768ba 100644 --- a/src/DivaGL/sprite.cpp +++ b/src/DivaGL/sprite.cpp @@ -5,7 +5,7 @@ #include "sprite.hpp" #include "render_context.hpp" -#include "shader_glsl_ft.hpp" +#include "shader_ft.hpp" #include struct sprite_draw_vertex { diff --git a/src/DivaGL/task_effect.cpp b/src/DivaGL/task_effect.cpp index 59b115d..42c7990 100644 --- a/src/DivaGL/task_effect.cpp +++ b/src/DivaGL/task_effect.cpp @@ -12,7 +12,7 @@ #include "gl_element_array_buffer.hpp" #include "render_context.hpp" #include "render_manager.hpp" -#include "shader_glsl_ft.hpp" +#include "shader_ft.hpp" #include "stage_param.hpp" #include "texture.hpp" #include diff --git a/src/DivaGL/wrap.cpp b/src/DivaGL/wrap.cpp index ddd49da..f9ab7ef 100644 --- a/src/DivaGL/wrap.cpp +++ b/src/DivaGL/wrap.cpp @@ -9,7 +9,7 @@ #include "../KKdLib/vec.hpp" #include "inject.hpp" #include "print.hpp" -#include "shader_glsl_ft.hpp" +#include "uniform.hpp" #include #include