diff --git a/src/CRE/config.hpp b/src/CRE/config.hpp new file mode 100644 index 00000000..754ddbca --- /dev/null +++ b/src/CRE/config.hpp @@ -0,0 +1,6 @@ +/* + by korenkonder + GitHub/GitLab: korenkonder +*/ + +#define DISPLAY_IBL (0) diff --git a/src/CRE/light_param.cpp b/src/CRE/light_param.cpp index d2b349a2..e03b1d29 100644 --- a/src/CRE/light_param.cpp +++ b/src/CRE/light_param.cpp @@ -89,6 +89,12 @@ void light_param_data_storage_data_init() { light_param_data_storage_data = new light_param_data_storage; } +#if DISPLAY_IBL +GLuint light_param_data_storage_data_get_ibl_texture(int32_t index) { + return light_param_data_storage_data->textures[index]; +} +#endif + std::string light_param_data_storage_data_get_name() { return light_param_data_storage_data->get_name(); } diff --git a/src/CRE/light_param.hpp b/src/CRE/light_param.hpp index b0d40eeb..4d01a0e0 100644 --- a/src/CRE/light_param.hpp +++ b/src/CRE/light_param.hpp @@ -15,6 +15,7 @@ #include "../KKdLib/light_param/ibl.hpp" #include "../KKdLib/light_param/light.hpp" #include "../KKdLib/light_param/wind.hpp" +#include "config.hpp" #include "data.hpp" #include "file_handler.hpp" #include @@ -31,6 +32,9 @@ enum light_param_data_storage_flags { extern void light_param_data_storage_data_init(); extern void light_param_data_storage_data_free_file_handlers(); +#if DISPLAY_IBL +extern GLuint light_param_data_storage_data_get_ibl_texture(int32_t index); +#endif extern std::string light_param_data_storage_data_get_name(); extern int32_t light_param_data_storage_data_get_pv_id(); extern int32_t light_param_data_storage_data_get_stage_index(); diff --git a/src/CRE/shader_dev.cpp b/src/CRE/shader_dev.cpp index 3c663202..1c08b60f 100644 --- a/src/CRE/shader_dev.cpp +++ b/src/CRE/shader_dev.cpp @@ -12,6 +12,9 @@ enum shader_dev_sub_enum { SHADER_DEV_SUB_SHADER_FFP = 0, SHADER_DEV_SUB_GLITTER_PT_WIREFRAME, +#if DISPLAY_IBL + SHADER_DEV_SUB_CUBEMAP_DISPLAY, +#endif SHADER_DEV_SUB_SHADER_END, }; @@ -23,10 +26,26 @@ static const int32_t glitter_particle_wireframe_fpt_unival_max[] = { -1, }; +#if DISPLAY_IBL +static const int32_t cubemap_display_vpt_unival_max[] = { + -1, +}; + +static const int32_t cubemap_display_fpt_unival_max[] = { + -1, +}; +#endif + static const uniform_name GLITTER_PT_WIREFRAME_uniform[] = { U_INVALID, }; +#if DISPLAY_IBL +static const uniform_name CUBEMAP_DISPLAY_uniform[] = { + U_INVALID, +}; +#endif + #define shader_sub_table_struct(sub_index, vp, fp) \ { \ SHADER_DEV_SUB_##sub_index, \ @@ -41,6 +60,13 @@ static const shader_sub_table GLITTER_PT_WIREFRAME_table[] = { glitter_particle_wireframe, glitter_particle_wireframe), }; +#if DISPLAY_IBL +static const shader_sub_table CUBEMAP_DISPLAY_table[] = { + shader_sub_table_struct(CUBEMAP_DISPLAY, + cubemap_display, cubemap_display), +}; +#endif + #undef shader_sub_table_struct #define shader_table_struct(n) \ @@ -63,6 +89,9 @@ const shader_table shader_dev_table[] = { 0, }, shader_table_struct(GLITTER_PT_WIREFRAME), +#if DISPLAY_IBL + shader_table_struct(CUBEMAP_DISPLAY), +#endif }; #undef shader_table_struct diff --git a/src/CRE/shader_dev.hpp b/src/CRE/shader_dev.hpp index 462ba3aa..92a856c2 100644 --- a/src/CRE/shader_dev.hpp +++ b/src/CRE/shader_dev.hpp @@ -6,11 +6,15 @@ #pragma once #include "../KKdLib/default.hpp" +#include "config.hpp" #include "shader.hpp" enum shader_dev_enum { SHADER_DEV_FFP = 0, SHADER_DEV_GLITTER_PT_WIREFRAME, +#if DISPLAY_IBL + SHADER_DEV_CUBEMAP_DISPLAY, +#endif SHADER_DEV_END, SHADER_DEV_MAX, }; diff --git a/src/ReDIVA/app.cpp b/src/ReDIVA/app.cpp index 09fc3443..afcfcec8 100644 --- a/src/ReDIVA/app.cpp +++ b/src/ReDIVA/app.cpp @@ -15,6 +15,7 @@ #include "../CRE/auth_3d.hpp" #include "../CRE/camera.hpp" #include "../CRE/clear_color.hpp" +#include "../CRE/config.hpp" #include "../CRE/customize_item_table.hpp" #include "../CRE/data.hpp" #include "../CRE/effect.hpp" @@ -181,6 +182,20 @@ uint32_t spr_fnt_24_set_id; // 4 uint32_t spr_fnt_bold24_set_id; // 472 uint32_t spr_fnt_cmn_set_id; // 43 +#if DISPLAY_IBL +struct cubemap_display_batch_shader_data { + vec4 g_vp[4]; + vec4 g_texture_lod; +}; + +bool display_ibl = false; +int32_t ibl_index = 0; +int32_t ibl_scale = 1; +GLuint ibl_vao; +GL::ArrayBuffer ibl_vbo; +GL::UniformBuffer cubemap_display_ubo; +#endif + static bool app_init(const app_init_struct& ais); static void app_main_loop(render_context* rctx); static void app_free(); @@ -367,10 +382,82 @@ bool render_data::load() { gl_state_get_error(); gl_state_set_viewport(0, 0, width, height); + +#if DISPLAY_IBL + const float_t box_vertices[] = { + -1.0f, 1.0f, -1.0f, + -1.0f, -1.0f, -1.0f, + 1.0f, -1.0f, -1.0f, + 1.0f, -1.0f, -1.0f, + 1.0f, 1.0f, -1.0f, + -1.0f, 1.0f, -1.0f, + + -1.0f, -1.0f, 1.0f, + -1.0f, -1.0f, -1.0f, + -1.0f, 1.0f, -1.0f, + -1.0f, 1.0f, -1.0f, + -1.0f, 1.0f, 1.0f, + -1.0f, -1.0f, 1.0f, + + 1.0f, -1.0f, -1.0f, + 1.0f, -1.0f, 1.0f, + 1.0f, 1.0f, 1.0f, + 1.0f, 1.0f, 1.0f, + 1.0f, 1.0f, -1.0f, + 1.0f, -1.0f, -1.0f, + + -1.0f, -1.0f, 1.0f, + -1.0f, 1.0f, 1.0f, + 1.0f, 1.0f, 1.0f, + 1.0f, 1.0f, 1.0f, + 1.0f, -1.0f, 1.0f, + -1.0f, -1.0f, 1.0f, + + -1.0f, 1.0f, -1.0f, + 1.0f, 1.0f, -1.0f, + 1.0f, 1.0f, 1.0f, + 1.0f, 1.0f, 1.0f, + -1.0f, 1.0f, 1.0f, + -1.0f, 1.0f, -1.0f, + + -1.0f, -1.0f, -1.0f, + -1.0f, -1.0f, 1.0f, + 1.0f, -1.0f, -1.0f, + 1.0f, -1.0f, -1.0f, + -1.0f, -1.0f, 1.0f, + 1.0f, -1.0f, 1.0f + }; + + glGenVertexArrays(1, &ibl_vao); + gl_state_bind_vertex_array(ibl_vao, true); + + ibl_vbo.Create(sizeof(box_vertices), box_vertices); + ibl_vbo.Bind(true); + + glEnableVertexAttribArray(0); + glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, sizeof(float_t) * 3, (void*)0); + + gl_state_bind_array_buffer(0); + gl_state_bind_vertex_array(0); + + cubemap_display_ubo.Create(sizeof(cubemap_display_batch_shader_data)); +#endif + return true; } void render_data::unload() { +#if DISPLAY_IBL + cubemap_display_ubo.Destroy(); + + ibl_vbo.Destroy(); + + if (ibl_vao) { + glDeleteVertexArrays(1, &ibl_vao); + ibl_vao = 0; + } +#endif + #if BAKE_VIDEO if (GLAD_WGL_NV_DX_interop2) wglDXCloseDeviceNV(d3d_device); @@ -1052,6 +1139,26 @@ static void render_context_ctrl(render_context* rctx) { game_state_set_game_state_next(GAME_STATE_APP_ERROR); else if (Input::IsKeyTapped(GLFW_KEY_F9)) // Added game_state_set_game_state_next(GAME_STATE_DATA_EDIT); // Added +#if DISPLAY_IBL + else if (Input::IsKeyTapped(GLFW_KEY_L)) + display_ibl ^= true; + else if (Input::IsKeyTapped(GLFW_KEY_1)) + ibl_index = 0; + else if (Input::IsKeyTapped(GLFW_KEY_2)) + ibl_index = 1; + else if (Input::IsKeyTapped(GLFW_KEY_3)) + ibl_index = 2; + else if (Input::IsKeyTapped(GLFW_KEY_4)) + ibl_index = 3; + else if (Input::IsKeyTapped(GLFW_KEY_5)) + ibl_index = 4; + else if (Input::IsKeyTapped(GLFW_KEY_6)) + ibl_index = 5; + else if (Input::IsKeyTapped(GLFW_KEY_7)) + ibl_scale = max_def(ibl_scale - 1, 1); + else if (Input::IsKeyTapped(GLFW_KEY_8)) + ibl_scale = min_def(ibl_scale + 1, 64); +#endif classes_process_ctrl(classes, classes_count); @@ -1103,6 +1210,37 @@ static void render_context_disp(render_context* rctx) { rctx->disp(); +#if DISPLAY_IBL + if (display_ibl) { + rctx->screen_buffer.Bind(); + + mat4 mat; + mat4_translate_y(1.4f, &mat); + mat4_scale_rot(&mat, 1.125f, 1.125f, 1.125f, &mat); + mat4_mul(&mat, &rctx->camera->view, &mat); + //mat4_clear_trans(&mat, &mat); + mat4_mul(&mat, &rctx->camera->projection, &mat); + + cubemap_display_batch_shader_data shader_data = {}; + mat4_transpose(&mat, &mat); + shader_data.g_vp[0] = mat.row0; + shader_data.g_vp[1] = mat.row1; + shader_data.g_vp[2] = mat.row2; + shader_data.g_vp[3] = mat.row3; + shader_data.g_texture_lod.x = ibl_index == 1 ? 1.0f : 0.0f; + shader_data.g_texture_lod.y = 1.0f / (float_t)ibl_scale; + rctx_ptr->glitter_batch_ubo.WriteMemory(shader_data); + + rctx_ptr->glitter_batch_ubo.Bind(3); + shaders_dev.set(SHADER_DEV_CUBEMAP_DISPLAY); + gl_state_bind_vertex_array(ibl_vao); + gl_state_active_bind_texture_cube_map(0, + light_param_data_storage_data_get_ibl_texture(max_def(ibl_index - 1, 0))); + shaders_dev.draw_arrays(GL_TRIANGLES, 0, 36); + gl_state_bind_vertex_array(0); + } +#endif + #if BAKE_PNG || BAKE_VIDEO fbo_blit(rctx->screen_buffer.fbos[0], 0, 0, 0, rctx->sprite_width, rctx->sprite_height,