From 58835f20e81adca89e9af9bd2f9e44db3cd67cec Mon Sep 17 00:00:00 2001 From: korenkonder Date: Thu, 12 Dec 2024 03:01:22 +0300 Subject: [PATCH] ReflectRefractDw --- src/CRE/render_manager.cpp | 8 ++ src/CRE/render_manager.hpp | 2 + src/ReDIVA/classes/graphics.cpp | 57 ++++++++ src/ReDIVA/graphics/material.cpp | 4 +- src/ReDIVA/graphics/reflect_refract.cpp | 174 ++++++++++++++++++++++++ src/ReDIVA/graphics/reflect_refract.hpp | 10 ++ src/ReDIVA/graphics/shadow.cpp | 1 + src/ReDIVA/shared.cpp | 2 +- 8 files changed, 255 insertions(+), 3 deletions(-) create mode 100644 src/ReDIVA/graphics/reflect_refract.cpp create mode 100644 src/ReDIVA/graphics/reflect_refract.hpp diff --git a/src/CRE/render_manager.cpp b/src/CRE/render_manager.cpp index 68bb0b54..32f2697e 100644 --- a/src/CRE/render_manager.cpp +++ b/src/CRE/render_manager.cpp @@ -139,6 +139,14 @@ namespace rndr { } } + reflect_refract_resolution_mode RenderManager::get_reflect_resolution_mode() { + return (reflect_refract_resolution_mode)tex_index[0]; + } + + reflect_refract_resolution_mode RenderManager::get_refract_resolution_mode() { + return (reflect_refract_resolution_mode)tex_index[1]; + } + RenderTexture& RenderManager::get_render_texture(int32_t index) { return render_textures[render_manager_render_texture_index_array[index][tex_index[index]]]; } diff --git a/src/CRE/render_manager.hpp b/src/CRE/render_manager.hpp index bb133bda..8d1f4fa1 100644 --- a/src/CRE/render_manager.hpp +++ b/src/CRE/render_manager.hpp @@ -94,6 +94,8 @@ namespace rndr { void add_pre_process(int32_t type, draw_pre_process_func func, void* data); void clear_pre_process(int32_t type); + reflect_refract_resolution_mode get_reflect_resolution_mode(); + reflect_refract_resolution_mode get_refract_resolution_mode(); RenderTexture& get_render_texture(int32_t index); void reset(); void resize(int32_t width, int32_t height); diff --git a/src/ReDIVA/classes/graphics.cpp b/src/ReDIVA/classes/graphics.cpp index d5b0de47..fdec7dc3 100644 --- a/src/ReDIVA/classes/graphics.cpp +++ b/src/ReDIVA/classes/graphics.cpp @@ -12,6 +12,7 @@ #include "../graphics/light.hpp" #include "../graphics/material.hpp" #include "../graphics/post_process.hpp" +#include "../graphics/reflect_refract.hpp" #include "../graphics/render_settings.hpp" #include "../graphics/shadow.hpp" #include "graphics/background_color.hpp" @@ -143,6 +144,62 @@ classes_data graphics_classes[] = { 0, 0, }, + { + "Ripple Effect##Graphics", + CLASSES_IN_CONTEXT_MENU, + CLASSES_DATA_NO_FUNC, + CLASSES_DATA_NO_FUNC, + CLASSES_DATA_NO_FUNC, + { + CLASS_DW, + false, + CLASS_DATA_NO_DATA, + }, + 0, + 0, + }, + { + "Rain Effect##Graphics", + CLASSES_IN_CONTEXT_MENU, + CLASSES_DATA_NO_FUNC, + CLASSES_DATA_NO_FUNC, + CLASSES_DATA_NO_FUNC, + { + CLASS_DW, + false, + CLASS_DATA_NO_DATA, + }, + 0, + 0, + }, + { + "Snow Effect##Graphics", + CLASSES_IN_CONTEXT_MENU, + CLASSES_DATA_NO_FUNC, + CLASSES_DATA_NO_FUNC, + CLASSES_DATA_NO_FUNC, + { + CLASS_DW, + false, + CLASS_DATA_NO_DATA, + }, + 0, + 0, + }, + { + "Reflect/Refract##Graphics", + CLASSES_IN_CONTEXT_MENU, + (classes_init_func)reflect_refract_dw_init, + CLASSES_DATA_NO_FUNC, + CLASSES_DATA_NO_FUNC, + { + CLASS_DW, + false, + CLASS_DATA_NO_DATA, + }, + 0, + 0, + }, { "Glitter##Graphics", CLASSES_IN_CONTEXT_MENU, diff --git a/src/ReDIVA/graphics/material.cpp b/src/ReDIVA/graphics/material.cpp index c321c9c9..d9631460 100644 --- a/src/ReDIVA/graphics/material.cpp +++ b/src/ReDIVA/graphics/material.cpp @@ -527,7 +527,7 @@ void MaterialDw::ResetMaterialArray() { } void MaterialDw::SetValue(bool own) { - obj_material_data* material_data = MaterialDw::GetMaterial(own); + obj_material_data* material_data = GetMaterial(own); if (!material_data) return; @@ -573,7 +573,7 @@ void MaterialDw::UpdateObjectMeshes() { return; object_meshes->ClearItems(); - obj* obj = MaterialDw::GetObj(); + obj* obj = GetObj(); if (obj) { ResetMaterialArray(); for (int32_t i = 0; i < obj->num_material; i++) { diff --git a/src/ReDIVA/graphics/reflect_refract.cpp b/src/ReDIVA/graphics/reflect_refract.cpp new file mode 100644 index 00000000..f204dfee --- /dev/null +++ b/src/ReDIVA/graphics/reflect_refract.cpp @@ -0,0 +1,174 @@ +/* + by korenkonder + GitHub/GitLab: korenkonder +*/ + +#include "reflect_refract.hpp" +#include "../../CRE/light_param/face.hpp" +#include "../../CRE/light_param.hpp" +#include "../../CRE/render_context.hpp" +#include "../dw.hpp" + +extern render_context* rctx_ptr; + +class ReflectRefractDw : public dw::Shell { +public: + dw::RowLayout* vertical_layout; + dw::RowLayout* horizontal_layout; + + ReflectRefractDw(); + virtual ~ReflectRefractDw() override; + virtual void Draw() override; + + virtual void Hide() override; + + static void ReflectBlurFilterCallback(dw::ListBox* data); + static void ReflectBlurNumCallback(dw::Slider* data); + static void ReflectResolutionCallback(dw::ListBox* data); + static void RefractResolutionCallback(dw::ListBox* data); +}; + +ReflectRefractDw* reflect_refract_dw; + +void reflect_refract_dw_init() { + if (!reflect_refract_dw) { + reflect_refract_dw = new ReflectRefractDw; + reflect_refract_dw->UpdateLayout(); + reflect_refract_dw->sub_1402F38B0(); + } + else + reflect_refract_dw->Disp(); +} + +ReflectRefractDw::ReflectRefractDw() { + const reflect_refract_resolution_mode reflect_resolution_mode + = rctx_ptr->render_manager->get_reflect_resolution_mode(); + const reflect_refract_resolution_mode refract_resolution_mode + = rctx_ptr->render_manager->get_reflect_resolution_mode(); // Intentional! + const int32_t reflect_blur_num = rctx_ptr->render_manager->reflect_blur_num; + const blur_filter_mode reflect_blur_filter = rctx_ptr->render_manager->reflect_blur_filter; + + SetText("REFLECT/REFRACT"); + + rect.pos = 0.0f; + SetSize({ 320.0f, 200.0f }); + + const float_t glyph_height = font.GetFontGlyphHeight(); + + vertical_layout = new dw::RowLayout(dw::VERTICAL); + horizontal_layout = new dw::RowLayout(dw::HORIZONTAL); + + dw::Composite* comp = new dw::Composite(this); + comp->layout = vertical_layout; + + dw::Group* reflect_group = new dw::Group(comp); + reflect_group->SetText("REFLECT"); + + dw::Composite* reflect_comp = new dw::Composite(reflect_group); + reflect_comp->layout = horizontal_layout; + + (new dw::Label(reflect_comp, dw::FLAG_4000))->SetText("RESOLUTION "); + + dw::ListBox* reflect_resolution = new dw::ListBox(reflect_comp, + (dw::Flags)(dw::FLAG_800 | dw::VERTICAL | dw::MULTISELECT)); + reflect_resolution->SetText("listbox0"); + reflect_resolution->AddItem("256x256"); + reflect_resolution->AddItem("512x256"); + reflect_resolution->AddItem("512x512"); + reflect_resolution->AddSelectionListener(new dw::SelectionListenerOnHook( + (dw::Widget::Callback)ReflectRefractDw::ReflectResolutionCallback)); + reflect_resolution->SetItemIndex(reflect_resolution_mode); + reflect_resolution->SetMaxItems(3); + + dw::Slider* reflect_blur_num_slider = dw::Slider::Create(reflect_group, + (dw::Flags)(dw::FLAG_800 | dw::HORIZONTAL), 0.0f, 0.0f, 100.0f, glyph_height, "BLUR NUM"); + reflect_blur_num_slider->SetParams((float_t)reflect_blur_num, 0.0f, 10.0f, 2.0f, 1.0f, 1.0f); + reflect_blur_num_slider->format = "%4.0f"; + reflect_blur_num_slider->AddSelectionListener(new dw::SelectionListenerOnHook( + (dw::Widget::Callback)ReflectRefractDw::ReflectBlurNumCallback)); + reflect_blur_num_slider->callback_data.v64 = this; + + dw::Composite* reflect_blur_filter_comp = new dw::Composite(reflect_group); + reflect_blur_filter_comp->layout = horizontal_layout; + + (new dw::Label(reflect_blur_filter_comp, dw::FLAG_4000))->SetText("BLUR FILTER "); + + dw::ListBox* reflect_blur_filter_list_box = new dw::ListBox(reflect_blur_filter_comp, + (dw::Flags)(dw::FLAG_800 | dw::VERTICAL | dw::MULTISELECT)); + reflect_blur_filter_list_box->SetText("listbox0"); + reflect_blur_filter_list_box->AddItem("4"); + reflect_blur_filter_list_box->AddItem("9"); + reflect_blur_filter_list_box->AddItem("16"); + reflect_blur_filter_list_box->AddItem("32"); + reflect_blur_filter_list_box->AddSelectionListener(new dw::SelectionListenerOnHook( + (dw::Widget::Callback)ReflectRefractDw::ReflectBlurFilterCallback)); + reflect_blur_filter_list_box->SetItemIndex(reflect_blur_filter); + reflect_blur_filter_list_box->SetMaxItems(7); + + dw::Group* refract_group = new dw::Group(comp); + refract_group->SetText("REFRACT"); + + dw::Composite* refract_comp = new dw::Composite(refract_group); + refract_comp->layout = horizontal_layout; + + (new dw::Label(refract_comp, dw::FLAG_4000))->SetText("RESOLUTION "); + + dw::ListBox* refract_resolution = new dw::ListBox(refract_comp, + (dw::Flags)(dw::FLAG_800 | dw::VERTICAL | dw::MULTISELECT)); + refract_resolution->SetText("listbox0"); + refract_resolution->AddItem("256x256"); + refract_resolution->AddItem("512x256"); + refract_resolution->AddItem("512x512"); + refract_resolution->AddSelectionListener(new dw::SelectionListenerOnHook( + (dw::Widget::Callback)ReflectRefractDw::RefractResolutionCallback)); + refract_resolution->SetItemIndex(refract_resolution_mode); + refract_resolution->SetMaxItems(3); +} + +ReflectRefractDw::~ReflectRefractDw() { + +} + +void ReflectRefractDw::Draw() { + dw::Shell::Draw(); +} + +void ReflectRefractDw::Hide() { + SetDisp(); +} + +void ReflectRefractDw::ReflectBlurFilterCallback(dw::ListBox* data) { + rctx_ptr->render_manager->reflect_blur_filter = (blur_filter_mode)(int32_t)data->list->selected_item; +} + +void ReflectRefractDw::ReflectBlurNumCallback(dw::Slider* data) { + rctx_ptr->render_manager->reflect_blur_num = (int32_t)data->GetValue(); +} + +void ReflectRefractDw::ReflectResolutionCallback(dw::ListBox* data) { + switch (data->list->selected_item) { + case 0: + rctx_ptr->render_manager->set_reflect_resolution_mode(REFLECT_REFRACT_RESOLUTION_256x256); + break; + case 1: + rctx_ptr->render_manager->set_reflect_resolution_mode(REFLECT_REFRACT_RESOLUTION_512x256); + break; + case 2: + rctx_ptr->render_manager->set_reflect_resolution_mode(REFLECT_REFRACT_RESOLUTION_512x512); + break; + } +} + +void ReflectRefractDw::RefractResolutionCallback(dw::ListBox* data) { + switch (data->list->selected_item) { + case 0: + rctx_ptr->render_manager->set_refract_resolution_mode(REFLECT_REFRACT_RESOLUTION_256x256); + break; + case 1: + rctx_ptr->render_manager->set_refract_resolution_mode(REFLECT_REFRACT_RESOLUTION_512x256); + break; + case 2: + rctx_ptr->render_manager->set_refract_resolution_mode(REFLECT_REFRACT_RESOLUTION_512x512); + break; + } +} diff --git a/src/ReDIVA/graphics/reflect_refract.hpp b/src/ReDIVA/graphics/reflect_refract.hpp new file mode 100644 index 00000000..7dd7ad15 --- /dev/null +++ b/src/ReDIVA/graphics/reflect_refract.hpp @@ -0,0 +1,10 @@ +/* + by korenkonder + GitHub/GitLab: korenkonder +*/ + +#pragma once + +#include "../../KKdLib/default.hpp" + +extern void reflect_refract_dw_init(); diff --git a/src/ReDIVA/graphics/shadow.cpp b/src/ReDIVA/graphics/shadow.cpp index 6a348cd2..8827a3ea 100644 --- a/src/ReDIVA/graphics/shadow.cpp +++ b/src/ReDIVA/graphics/shadow.cpp @@ -46,6 +46,7 @@ ShadowDw* shadow_dw; void shadow_dw_init() { if (!shadow_dw) { shadow_dw = new ShadowDw; + shadow_dw->UpdateLayout(); shadow_dw->sub_1402F38B0(); } else diff --git a/src/ReDIVA/shared.cpp b/src/ReDIVA/shared.cpp index 02a3f197..0ff6e62f 100644 --- a/src/ReDIVA/shared.cpp +++ b/src/ReDIVA/shared.cpp @@ -35,7 +35,7 @@ classes_data classes[] = { CLASS_DATA_NO_DATA, }, graphics_classes, - 11, + 15, }, { "Information",