From f50f5733c248c6609412cb86340bfa211dde5d45 Mon Sep 17 00:00:00 2001 From: korenkonder Date: Tue, 9 Apr 2024 18:59:13 +0300 Subject: [PATCH] FogDw --- src/ReDIVA/classes/graphics.cpp | 10 +- src/ReDIVA/classes/graphics/fog.cpp | 145 --------- src/ReDIVA/classes/graphics/fog.hpp | 13 - src/ReDIVA/graphics/fog.cpp | 481 ++++++++++++++++++++++++++++ src/ReDIVA/graphics/fog.hpp | 12 + src/ReDIVA/graphics/light.cpp | 17 +- 6 files changed, 501 insertions(+), 177 deletions(-) delete mode 100644 src/ReDIVA/classes/graphics/fog.cpp delete mode 100644 src/ReDIVA/classes/graphics/fog.hpp create mode 100644 src/ReDIVA/graphics/fog.cpp create mode 100644 src/ReDIVA/graphics/fog.hpp diff --git a/src/ReDIVA/classes/graphics.cpp b/src/ReDIVA/classes/graphics.cpp index 10b0e9aa..2f540c47 100644 --- a/src/ReDIVA/classes/graphics.cpp +++ b/src/ReDIVA/classes/graphics.cpp @@ -5,9 +5,9 @@ #include "graphics.hpp" #include "../graphics/face_light.hpp" +#include "../graphics/fog.hpp" #include "../graphics/light.hpp" #include "graphics/background_color.hpp" -#include "graphics/fog.hpp" #include "graphics/glitter.hpp" #include "graphics/post_process.hpp" #include "graphics/render_settings.hpp" @@ -58,11 +58,11 @@ classes_data graphics_classes[] = { { "Fog##Graphics", CLASSES_IN_CONTEXT_MENU, - graphics_fog_init, - graphics_fog_imgui, - graphics_fog_dispose, + (classes_init_func)fog_dw_init, + CLASSES_DATA_NO_FUNC, + CLASSES_DATA_NO_FUNC, { - (class_flags)(CLASS_DISPOSED | CLASS_HIDDEN), + CLASS_DW, false, CLASS_DATA_NO_DATA, }, diff --git a/src/ReDIVA/classes/graphics/fog.cpp b/src/ReDIVA/classes/graphics/fog.cpp deleted file mode 100644 index 2d97405f..00000000 --- a/src/ReDIVA/classes/graphics/fog.cpp +++ /dev/null @@ -1,145 +0,0 @@ -/* - by korenkonder - GitHub/GitLab: korenkonder -*/ - -#include "fog.hpp" -#include "../../imgui_helper.hpp" - -struct data_view_fog { - render_context* rctx; - int32_t group; - - data_view_fog(); - ~data_view_fog(); -}; - -extern int32_t width; -extern int32_t height; - -static const char* graphics_fog_window_title = "Fog##Graphics"; - -bool graphics_fog_init(class_data* data, render_context* rctx) { - graphics_fog_dispose(data); - data_view_fog* fog = new data_view_fog; - if (fog) - fog->rctx = rctx; - data->data = fog; - return true; -} - -void graphics_fog_imgui(class_data* data) { - ImGuiIO& io = ImGui::GetIO(); - ImGuiStyle& style = ImGui::GetStyle(); - ImFont* font = ImGui::GetFont(); - - float_t w = min_def((float_t)width, 300.0f); - float_t h = min_def((float_t)height, 344.0f); - - ImGui::SetNextWindowPos({ 0, 0 }, ImGuiCond_Appearing); - ImGui::SetNextWindowSize({ w, h }, ImGuiCond_Appearing); - - data->imgui_focus = false; - bool open = data->flags & CLASS_HIDDEN ? false : true; - bool collapsed = !ImGui::Begin(graphics_fog_window_title, &open, 0); - if (!open) { - enum_or(data->flags, CLASS_HIDE); - ImGui::End(); - return; - } - else if (collapsed) { - ImGui::End(); - return; - } - - data_view_fog* fog = (data_view_fog*)data->data; - if (!fog) { - ImGui::End(); - return; - } - - render_context* rctx = fog->rctx; - ::fog* fog_data = &rctx->fog[fog->group]; - - if (ImGui::ButtonEnterKeyPressed("Reset")) - light_param_data_storage_data_set_stage( - light_param_data_storage_data_get_stage_index(), LIGHT_PARAM_DATA_STORAGE_FOG); - - const char* fog_group_labels[] = { - "0: DEPTH", - "1: HEIGHT", - "2: BUMP", - }; - - ImGui::TextCentered("GROUP"); - ImGui::GetContentRegionAvailSetNextItemWidth(); - ImGui::ComboBox("##Group", fog_group_labels, 3, - &fog->group, 0, false, &data->imgui_focus); - - const char* fog_type_labels[] = { - "NONE", - "LINEAR", - "EXP", - "EXP2", - }; - - ImGui::TextCentered("TYPE"); - - fog_type type = fog_data->get_type(); - ImGui::GetContentRegionAvailSetNextItemWidth(); - ImGui::ComboBox("##Type", fog_type_labels, FOG_EXP2, - (int32_t*)&type, 0, true, &data->imgui_focus); - fog_data->set_type(type); - - ImGui::TextCentered("DENSITY"); - - float_t density = fog_data->get_density(); - ImGui::GetContentRegionAvailSetNextItemWidth(); - ImGui::SliderFloatButton("##Density", &density, 0.01f, 0.0f, 1.0f, 0.1f, "%.3f", 0); - fog_data->set_density(density); - - ImGui::TextCentered("LINEAR"); - - ImGui::PushID("Linear"); - float_t start = fog_data->get_start(); - ImGui::ColumnSliderFloatButton("START", &start, 0.1f, -100.0f, 1000.0f, 1.0f, "%.2f", 0); - fog_data->set_start(start); - - float_t end = fog_data->get_end(); - ImGui::ColumnSliderFloatButton("END", &end, 0.1f, -100.0f, 1000.0f, 1.0f, "%.2f", 0); - fog_data->set_end(end); - ImGui::PopID(); - - ImGui::TextCentered("COLOR"); - - ImGui::PushID("Color"); - vec4 color; - fog_data->get_color(color); - ImGui::GetContentRegionAvailSetNextItemWidth(); - ImGui::ColumnSliderFloatButton("R", &color.x, 0.01f, 0.0f, 8.0f, 0.1f, "%.2f", 0); - ImGui::ColumnSliderFloatButton("G", &color.y, 0.01f, 0.0f, 8.0f, 0.1f, "%.2f", 0); - ImGui::ColumnSliderFloatButton("B", &color.z, 0.01f, 0.0f, 8.0f, 0.1f, "%.2f", 0); - fog_data->set_color(color); - ImGui::PopID(); - - ImGui::GetContentRegionAvailSetNextItemWidth(); - - data->imgui_focus |= ImGui::IsWindowFocused(); - ImGui::End(); -} - -bool graphics_fog_dispose(class_data* data) { - data_view_fog* fog = (data_view_fog*)data->data; - if (fog) - delete fog; - data->data = 0; - return true; -} - -data_view_fog::data_view_fog() : rctx(), group() { - -} - -data_view_fog::~data_view_fog() { - -} diff --git a/src/ReDIVA/classes/graphics/fog.hpp b/src/ReDIVA/classes/graphics/fog.hpp deleted file mode 100644 index 112e584e..00000000 --- a/src/ReDIVA/classes/graphics/fog.hpp +++ /dev/null @@ -1,13 +0,0 @@ -/* - by korenkonder - GitHub/GitLab: korenkonder -*/ - -#pragma once - -#include "../../../KKdLib/default.hpp" -#include "../../classes.hpp" - -extern bool graphics_fog_init(class_data* data, render_context* rctx); -extern void graphics_fog_imgui(class_data* data); -extern bool graphics_fog_dispose(class_data* data); diff --git a/src/ReDIVA/graphics/fog.cpp b/src/ReDIVA/graphics/fog.cpp new file mode 100644 index 00000000..3d74ebc9 --- /dev/null +++ b/src/ReDIVA/graphics/fog.cpp @@ -0,0 +1,481 @@ +/* + by korenkonder + GitHub/GitLab: korenkonder +*/ + +#include "fog.hpp" +#include "../../CRE/light_param/fog.hpp" +#include "../../CRE/light_param.hpp" +#include "../../CRE/render_context.hpp" + +extern render_context* rctx_ptr; + +class FogDw : public dw::Shell { +public: + class GroupListBox : public dw::SelectionAdapter { + public: + FogDw* fog_dw; + dw::ListBox* group; + + GroupListBox(FogDw* fog_dw, dw::Widget* parent); + virtual ~GroupListBox(); + + virtual void Callback(dw::SelectionListener::CallbackData* data) override; + }; + + class TypeListBox : public dw::SelectionAdapter { + public: + FogDw* fog_dw; + dw::ListBox* type; + + TypeListBox(FogDw* fog_dw, dw::Widget* parent); + virtual ~TypeListBox(); + + virtual void Callback(dw::SelectionListener::CallbackData* data) override; + }; + + class DensitySlider : public dw::SelectionAdapter { + public: + FogDw* fog_dw; + dw::Slider* density; + + DensitySlider(FogDw* fog_dw, dw::Widget* parent); + virtual ~DensitySlider(); + + virtual void Callback(dw::SelectionListener::CallbackData* data) override; + }; + + class LinearSlider : public dw::SelectionAdapter { + public: + FogDw* fog_dw; + dw::Slider* start; + dw::Slider* end; + + LinearSlider(FogDw* fog_dw, dw::Widget* parent); + virtual ~LinearSlider(); + + virtual void Callback(dw::SelectionListener::CallbackData* data) override; + }; + + class ColorSlider : public dw::SelectionAdapter { + public: + FogDw* fog_dw; + dw::Slider* r; + dw::Slider* g; + dw::Slider* b; + + ColorSlider(FogDw* fog_dw, dw::Widget* parent); + virtual ~ColorSlider(); + + virtual void Callback(dw::SelectionListener::CallbackData* data) override; + }; + + class IoButton : public dw::SelectionAdapter { + public: + FogDw* fog_dw; + int64_t field_10; + dw::Button* save; + dw::Button* load; + + IoButton(FogDw* fog_dw, dw::Widget* parent); + virtual ~IoButton(); + + virtual void Callback(dw::SelectionListener::CallbackData* data) override; + + static void LoadCallback(dw::Widget* data); + static void SaveCallback(dw::Widget* data); + }; + + class CutLightEnableButton : public dw::SelectionAdapter { + public: + FogDw* fog_dw; + dw::Button* set_for_each_cut; + + CutLightEnableButton(FogDw* fog_dw, dw::Widget* parent); + virtual ~CutLightEnableButton(); + + virtual void Callback(dw::SelectionListener::CallbackData* data) override; + }; + + GroupListBox* group_list_box; + TypeListBox* type_list_box; + DensitySlider* density; + LinearSlider* linear_slider; + ColorSlider* color_slider; + IoButton* io_button; + CutLightEnableButton* cut_light_enable_button; + + FogDw(); + virtual ~FogDw() override; + + virtual void Hide() override; + + virtual void ResetData(); +}; + +FogDw* fog_dw ; + +fog_id fog_dw_id = FOG_DEPTH; +bool fog_dw_set_for_each_cut = false; + +rectangle fog_dw_rect = { 0.0f, vec2(300.0f, 320.0f) }; + +static FogDw* fog_dw_get(); +static fog* fog_dw_get_fog(); + +void fog_dw_init(dw::Widget* data) { + if (!fog_dw) { + fog_dw = new FogDw; + fog_dw->sub_1402F38B0(); + } + else + fog_dw->Disp(); +} + +FogDw::GroupListBox::GroupListBox(FogDw* fog_dw, dw::Widget* parent) { + this->fog_dw = fog_dw; + group = 0; + + dw::Composite* comp = dynamic_cast(parent); + if (comp) { + dw::Label* label = new dw::Label(comp); + label->SetText("ID"); + + group = new dw::ListBox(comp, dw::MULTISELECT); + + const char* fog_id_labels[] = { + "0:DEPTH", + "1:HEIGHT", + "2:BUMP", + }; + + for (const char*& i : fog_id_labels) + group->AddItem(i); + + group->SetItemIndex(fog_dw_id); + group->AddSelectionListener(this); + } +} + +FogDw::GroupListBox::~GroupListBox() { + +} + +void FogDw::GroupListBox::Callback(dw::SelectionListener::CallbackData* data) { + dw::Slider* slider = dynamic_cast(data->widget); + if (slider) { + fog* fog = fog_dw_get_fog(); + fog->set_density(slider->scroll_bar->value); + } +} + +FogDw::TypeListBox::TypeListBox(FogDw* fog_dw, dw::Widget* parent) { + this->fog_dw = fog_dw; + type = 0; + + dw::Composite* comp = dynamic_cast(parent); + if (comp) { + fog* fog = fog_dw_get_fog(); + + dw::Label* label = new dw::Label(comp); + label->SetText("TYPE"); + + type = new dw::ListBox(comp, dw::MULTISELECT); + + const char* fog_type_labels[] = { + "OFF", + "PARALLEL", + "POINT", + "SPOT", + }; + + for (const char*& i : fog_type_labels) + type->AddItem(i); + + type->SetItemIndex(fog->get_type()); + type->AddSelectionListener(this); + } +} + +FogDw::TypeListBox::~TypeListBox() { + +} + +void FogDw::TypeListBox::Callback(dw::SelectionListener::CallbackData* data) { + dw::ListBox* list_box = dynamic_cast(data->widget); + if (list_box) { + fog* fog = fog_dw_get_fog(); + fog->set_type((fog_type)list_box->list->selected_item); + fog_dw->ResetData(); + } +} + +FogDw::DensitySlider::DensitySlider(FogDw* fog_dw, dw::Widget* parent) { + this->fog_dw = fog_dw; + density = 0; + + dw::Composite* comp = dynamic_cast(parent); + if (comp) { + fog* fog = fog_dw_get_fog(); + + dw::Label* label = new dw::Label(comp); + label->SetText("DENSITY"); + + density = dw::Slider::Create(comp); + density->SetText("DENSITY"); + density->format = "%4.3f"; + density->SetParams(fog->get_density(), 0.0f, 1.0f, 0.1f, 0.01f, 0.1f); + density->AddSelectionListener(this); + } +} + +FogDw::DensitySlider::~DensitySlider() { + +} + +void FogDw::DensitySlider::Callback(dw::SelectionListener::CallbackData* data) { + dw::Slider* slider = dynamic_cast(data->widget); + if (slider) { + fog* fog = fog_dw_get_fog(); + fog->set_density(slider->scroll_bar->value); + } +} + +FogDw::LinearSlider::LinearSlider(FogDw* fog_dw, dw::Widget* parent) { + this->fog_dw = fog_dw; + start = 0; + end = 0; + + dw::Composite* comp = dynamic_cast(parent); + if (comp) { + fog* fog = fog_dw_get_fog(); + + dw::Label* label = new dw::Label(comp); + label->SetText("LINEAR"); + + start = dw::Slider::Create(comp, (dw::Flags)(dw::FLAG_800 + | dw::HORIZONTAL), 0.0f, 0.0f, 176.0f, 20.0f); + start->SetText("START"); + start->format = "%6.2f"; + start->SetParams(fog->get_end(), -100.0f, 1000.0f, 200.0f, 0.1f, 1.0f); + start->callback_data.i64 = 0; + start->AddSelectionListener(this); + start->AddSelectionListener(this); + + end = dw::Slider::Create(comp, (dw::Flags)(dw::FLAG_800 + | dw::HORIZONTAL), 0.0f, 0.0f, 176.0f, 20.0f); + end->SetText("END"); + end->format = "%6.2f"; + end->SetParams(fog->get_end(), -100.0f, 1000.0f, 200.0f, 0.1f, 1.0f); + end->callback_data.i64 = 1; + end->AddSelectionListener(this); + } +} + +FogDw::LinearSlider::~LinearSlider() { + +} + +void FogDw::LinearSlider::Callback(dw::SelectionListener::CallbackData* data) { + dw::Slider* slider = dynamic_cast(data->widget); + if (slider) { + fog* fog = fog_dw_get_fog(); + + switch (slider->callback_data.i32) { + case 0: + fog->set_start(slider->scroll_bar->value); + break; + case 1: + fog->set_end(slider->scroll_bar->value); + break; + } + } +} + +FogDw::ColorSlider::ColorSlider(FogDw* fog_dw, dw::Widget* parent) { + this->fog_dw = fog_dw; + r = 0; + g = 0; + b = 0; + + dw::Composite* comp = dynamic_cast(parent); + if (comp) { + fog* fog = fog_dw_get_fog(); + + vec4 value; + fog->get_color(value); + + dw::Label* label = new dw::Label(comp); + label->SetText("COLOR"); + + r = dw::Slider::Create(comp); + r->SetText("R"); + r->format = "%3.2f"; + r->SetParams(value.y, 0.0f, 8.0f, 0.8f, 0.01f, 0.1f); + r->callback_data.i64 = 1; + r->AddSelectionListener(this); + + g = dw::Slider::Create(comp); + g->SetText("G"); + g->format = "%3.2f"; + g->SetParams(value.y, 0.0f, 8.0f, 0.8f, 0.01f, 0.1f); + g->callback_data.i64 = 1; + g->AddSelectionListener(this); + + b = dw::Slider::Create(comp); + b->SetText("B"); + b->format = "%3.2f"; + b->SetParams(value.z, 0.0f, 8.0f, 0.8f, 0.01f, 0.1f); + b->callback_data.i64 = 2; + b->AddSelectionListener(this); + } +} + +FogDw::ColorSlider::~ColorSlider() { + +} + +void FogDw::ColorSlider::Callback(dw::SelectionListener::CallbackData* data) { + dw::Slider* slider = dynamic_cast(data->widget); + if (slider) { + fog* fog = fog_dw_get_fog(); + fog->set_density(slider->scroll_bar->value); + } +} + +FogDw::IoButton::IoButton(FogDw* fog_dw, dw::Widget* parent) { + this->fog_dw = fog_dw; + field_10 = 0; + save = 0; + load = 0; + + dw::Composite* comp = dynamic_cast(parent); + if (comp) { + dw::Composite* _comp = new dw::Composite(comp); + _comp->layout = new dw::RowLayout(dw::HORIZONTAL); + + save = new dw::Button(_comp, dw::FLAG_8); + save->SetText("SAVE"); + save->callback_data.v64 = fog_dw; + save->callback = FogDw::IoButton::SaveCallback; + + load = new dw::Button(_comp, dw::FLAG_8); + load->SetText("LOAD"); + load->callback_data.v64 = fog_dw; + load->callback = FogDw::IoButton::LoadCallback; + } +} + +FogDw::IoButton::~IoButton() { + +} + +void FogDw::IoButton::Callback(dw::SelectionListener::CallbackData* data) { + dw::Slider* slider = dynamic_cast(data->widget); + if (slider) { + fog* fog = fog_dw_get_fog(); + fog->set_density(slider->scroll_bar->value); + } +} + +void FogDw::IoButton::LoadCallback(dw::Widget* data) { + +} + +void FogDw::IoButton::SaveCallback(dw::Widget* data) { + +} + +FogDw::CutLightEnableButton::CutLightEnableButton(FogDw* fog_dw, dw::Widget* parent) { + this->fog_dw = fog_dw; + set_for_each_cut = 0; + + dw::Composite* comp = dynamic_cast(parent); + if (comp) { +#if DW_TRANSLATE + const char* set_for_each_cut_text = u8"Set for each PV cut"; +#else + const char* set_for_each_cut_text = u8"PVのカットごとに設定"; +#endif + + set_for_each_cut = new dw::Button(comp, dw::CHECKBOX); + set_for_each_cut->SetText(set_for_each_cut_text); + set_for_each_cut->SetValue(fog_dw_set_for_each_cut); + set_for_each_cut->callback_data.i64 = 0; + set_for_each_cut->AddSelectionListener(this); + } +} + +FogDw::CutLightEnableButton::~CutLightEnableButton() { + +} + +void FogDw::CutLightEnableButton::Callback(dw::SelectionListener::CallbackData* data) { + dw::Button* button = dynamic_cast(data->widget); + if (button && !button->callback_data.i32) + fog_dw_set_for_each_cut = button->value; +} + +FogDw::FogDw() { + SetText("FOG"); + + fog* fog = fog_dw_get_fog(); + + io_button = new FogDw::IoButton(this, this); + cut_light_enable_button = new FogDw::CutLightEnableButton(this, this); + group_list_box = new FogDw::GroupListBox(this, this); + type_list_box = new FogDw::TypeListBox(this, this); + + switch (fog->get_type()) { + case 0: + default: + density = 0; + linear_slider = 0; + color_slider = 0; + break; + case 1: + density = new FogDw::DensitySlider(this, this); + linear_slider = new FogDw::LinearSlider(this, this); + color_slider = new FogDw::ColorSlider(this, this); + break; + case 2: + density = new FogDw::DensitySlider(this, this); + linear_slider = new FogDw::LinearSlider(this, this); + color_slider = new FogDw::ColorSlider(this, this); + break; + case 3: + density = new FogDw::DensitySlider(this, this); + linear_slider = new FogDw::LinearSlider(this, this); + color_slider = new FogDw::ColorSlider(this, this); + break; + } + + UpdateLayout(); + + rect.pos = fog_dw_rect.pos; + SetSize(fog_dw_rect.size); +} + +FogDw::~FogDw() { + +} + +void FogDw::Hide() { + dw::Shell::Hide(); + fog_dw = 0; +} + +void FogDw::ResetData() { + fog_dw_rect = rect; + dw::Shell::Hide(); + fog_dw = 0; + fog_dw_init(0); +} + +static FogDw* fog_dw_get() { + return fog_dw; +} + +static fog* fog_dw_get_fog() { + return &rctx_ptr->fog[fog_dw_id]; +} diff --git a/src/ReDIVA/graphics/fog.hpp b/src/ReDIVA/graphics/fog.hpp new file mode 100644 index 00000000..a7a2537a --- /dev/null +++ b/src/ReDIVA/graphics/fog.hpp @@ -0,0 +1,12 @@ +/* + by korenkonder + GitHub/GitLab: korenkonder +*/ + +#pragma once + +#include "../../KKdLib/default.hpp" +#include "../classes.hpp" +#include "../dw.hpp" + +extern void fog_dw_init(dw::Widget* data = 0); diff --git a/src/ReDIVA/graphics/light.cpp b/src/ReDIVA/graphics/light.cpp index d9d0a29a..5bc28b5f 100644 --- a/src/ReDIVA/graphics/light.cpp +++ b/src/ReDIVA/graphics/light.cpp @@ -9,7 +9,6 @@ #include "../../CRE/render_context.hpp" #include "../../CRE/stage.hpp" #include "../../CRE/task.hpp" -#include "../dw.hpp" extern render_context* rctx_ptr; @@ -1044,16 +1043,6 @@ LightDw::LightDw() { position_slider = new LightDw::PositionSlider(this, comp); break; case LIGHT_SPOT: - break; - } - if (!( - 1)) { - goto LABEL_113; - } - - if (!(type_list_box->type->list->selected_item - 2)) { - goto LABEL_113; - } - if (type_list_box->type->list->selected_item == 3) { ambient_slider = new LightDw::AmbientSlider(this, comp); diffuse_slider = new LightDw::DiffuseSlider(this, comp); specular_slider = new LightDw::SpecularSlider(this, comp); @@ -1079,9 +1068,9 @@ LightDw::LightDw() { exponent_slider = new LightDw::ExponentSlider(this, comp); cutoff_slider = new LightDw::CutoffSlider(this, comp); attenuation_slider = new LightDw::AttenuationSlider(this, comp); + break; } -LABEL_113: comp->UpdateLayout(); float_t size_y = comp->rect.size.y; @@ -1096,9 +1085,9 @@ LightDw::~LightDw() { } void LightDw::Hide() { - light_dw_rect = this->parent_shell->rect; + light_dw_rect = parent_shell->rect; dw::Shell::Hide(); - light_dw = 0i64; + light_dw = 0; if (!light_dw_task.ready) light_dw_task.del(); }