From 419ef1b7ca1e17a7d419096cac5753e80a203651 Mon Sep 17 00:00:00 2001 From: Peelep Date: Wed, 19 Feb 2025 20:20:36 +0200 Subject: [PATCH] Add UndoRedo actions to preview sun & env --- editor/plugins/node_3d_editor_plugin.cpp | 237 ++++++++++++++++++----- editor/plugins/node_3d_editor_plugin.h | 29 ++- 2 files changed, 216 insertions(+), 50 deletions(-) diff --git a/editor/plugins/node_3d_editor_plugin.cpp b/editor/plugins/node_3d_editor_plugin.cpp index 3488cefd2f4..a07401c1319 100644 --- a/editor/plugins/node_3d_editor_plugin.cpp +++ b/editor/plugins/node_3d_editor_plugin.cpp @@ -6536,7 +6536,7 @@ Dictionary Node3DEditor::get_state() const { pd["environ_tonemap_enabled"] = environ_tonemap_button->is_pressed(); pd["environ_ao_enabled"] = environ_ao_button->is_pressed(); pd["environ_gi_enabled"] = environ_gi_button->is_pressed(); - pd["sun_max_distance"] = sun_max_distance->get_value(); + pd["sun_shadow_max_distance"] = sun_shadow_max_distance->get_value(); pd["sun_color"] = sun_color->get_pick_color(); pd["sun_energy"] = sun_energy->get_value(); @@ -6661,15 +6661,15 @@ void Node3DEditor::set_state(const Dictionary &p_state) { environ_sky_color->set_pick_color(pd["environ_sky_color"]); environ_ground_color->set_pick_color(pd["environ_ground_color"]); - environ_energy->set_value(pd["environ_energy"]); - environ_glow_button->set_pressed(pd["environ_glow_enabled"]); - environ_tonemap_button->set_pressed(pd["environ_tonemap_enabled"]); - environ_ao_button->set_pressed(pd["environ_ao_enabled"]); - environ_gi_button->set_pressed(pd["environ_gi_enabled"]); - sun_max_distance->set_value(pd["sun_max_distance"]); + environ_energy->set_value_no_signal(pd["environ_energy"]); + environ_glow_button->set_pressed_no_signal(pd["environ_glow_enabled"]); + environ_tonemap_button->set_pressed_no_signal(pd["environ_tonemap_enabled"]); + environ_ao_button->set_pressed_no_signal(pd["environ_ao_enabled"]); + environ_gi_button->set_pressed_no_signal(pd["environ_gi_enabled"]); + sun_shadow_max_distance->set_value_no_signal(pd["sun_shadow_max_distance"]); sun_color->set_pick_color(pd["sun_color"]); - sun_energy->set_value(pd["sun_energy"]); + sun_energy->set_value_no_signal(pd["sun_energy"]); sun_button->set_pressed(pd["sun_enabled"]); environ_button->set_pressed(pd["environ_enabled"]); @@ -8717,6 +8717,7 @@ void Node3DEditor::_bind_methods() { ClassDB::bind_method("_set_subgizmo_selection", &Node3DEditor::_set_subgizmo_selection); ClassDB::bind_method("_clear_subgizmo_selection", &Node3DEditor::_clear_subgizmo_selection); ClassDB::bind_method("_refresh_menu_icons", &Node3DEditor::_refresh_menu_icons); + ClassDB::bind_method("_preview_settings_changed", &Node3DEditor::_preview_settings_changed); ClassDB::bind_method("update_all_gizmos", &Node3DEditor::update_all_gizmos); ClassDB::bind_method("update_transform_gizmo", &Node3DEditor::update_transform_gizmo); @@ -8776,12 +8777,14 @@ void Node3DEditor::_preview_settings_changed() { } { // preview sun + sun_rotation.x = Math::deg_to_rad(-sun_angle_altitude->get_value()); + sun_rotation.y = Math::deg_to_rad(180.0 - sun_angle_azimuth->get_value()); Transform3D t; t.basis = Basis::from_euler(Vector3(sun_rotation.x, sun_rotation.y, 0)); preview_sun->set_transform(t); sun_direction->queue_redraw(); preview_sun->set_param(Light3D::PARAM_ENERGY, sun_energy->get_value()); - preview_sun->set_param(Light3D::PARAM_SHADOW_MAX_DISTANCE, sun_max_distance->get_value()); + preview_sun->set_param(Light3D::PARAM_SHADOW_MAX_DISTANCE, sun_shadow_max_distance->get_value()); preview_sun->set_color(sun_color->get_pick_color()); } @@ -8813,22 +8816,22 @@ void Node3DEditor::_load_default_preview_settings() { // The azimuth choice is arbitrary, but ideally shouldn't be on an axis. sun_rotation = Vector2(-Math::deg_to_rad(60.0), Math::deg_to_rad(150.0)); - sun_angle_altitude->set_value(-Math::rad_to_deg(sun_rotation.x)); - sun_angle_azimuth->set_value(180.0 - Math::rad_to_deg(sun_rotation.y)); + sun_angle_altitude->set_value_no_signal(-Math::rad_to_deg(sun_rotation.x)); + sun_angle_azimuth->set_value_no_signal(180.0 - Math::rad_to_deg(sun_rotation.y)); sun_direction->queue_redraw(); environ_sky_color->set_pick_color(Color(0.385, 0.454, 0.55)); environ_ground_color->set_pick_color(Color(0.2, 0.169, 0.133)); - environ_energy->set_value(1.0); + environ_energy->set_value_no_signal(1.0); if (OS::get_singleton()->get_current_rendering_method() != "gl_compatibility") { - environ_glow_button->set_pressed(true); + environ_glow_button->set_pressed_no_signal(true); } - environ_tonemap_button->set_pressed(true); - environ_ao_button->set_pressed(false); - environ_gi_button->set_pressed(false); - sun_max_distance->set_value(100); + environ_tonemap_button->set_pressed_no_signal(true); + environ_ao_button->set_pressed_no_signal(false); + environ_gi_button->set_pressed_no_signal(false); + sun_shadow_max_distance->set_value_no_signal(100); sun_color->set_pick_color(Color(1, 1, 1)); - sun_energy->set_value(1.0); + sun_energy->set_value_no_signal(1.0); sun_environ_updating = false; } @@ -8861,8 +8864,8 @@ void Node3DEditor::_update_preview_environment() { } } - sun_angle_altitude->set_value(-Math::rad_to_deg(sun_rotation.x)); - sun_angle_azimuth->set_value(180.0 - Math::rad_to_deg(sun_rotation.y)); + sun_angle_altitude->set_value_no_signal(-Math::rad_to_deg(sun_rotation.x)); + sun_angle_azimuth->set_value_no_signal(180.0 - Math::rad_to_deg(sun_rotation.y)); bool disable_env = world_env_count > 0 || !environ_button->is_pressed(); @@ -8893,20 +8896,162 @@ void Node3DEditor::_update_preview_environment() { void Node3DEditor::_sun_direction_input(const Ref &p_event) { Ref mm = p_event; - if (mm.is_valid() && (mm->get_button_mask().has_flag(MouseButtonMask::LEFT))) { + if (mm.is_valid() && mm->get_button_mask().has_flag(MouseButtonMask::LEFT)) { sun_rotation.x += mm->get_relative().y * (0.02 * EDSCALE); sun_rotation.y -= mm->get_relative().x * (0.02 * EDSCALE); sun_rotation.x = CLAMP(sun_rotation.x, -Math_TAU / 4, Math_TAU / 4); - sun_angle_altitude->set_value(-Math::rad_to_deg(sun_rotation.x)); - sun_angle_azimuth->set_value(180.0 - Math::rad_to_deg(sun_rotation.y)); - _preview_settings_changed(); + + EditorUndoRedoManager *undo_redo = EditorUndoRedoManager::get_singleton(); + undo_redo->create_action(TTR("Set Preview Sun Direction"), UndoRedo::MergeMode::MERGE_ENDS); + undo_redo->add_do_method(sun_angle_altitude, "set_value_no_signal", -Math::rad_to_deg(sun_rotation.x)); + undo_redo->add_undo_method(sun_angle_altitude, "set_value_no_signal", sun_angle_altitude->get_value()); + undo_redo->add_do_method(sun_angle_azimuth, "set_value_no_signal", 180.0 - Math::rad_to_deg(sun_rotation.y)); + undo_redo->add_undo_method(sun_angle_azimuth, "set_value_no_signal", sun_angle_azimuth->get_value()); + undo_redo->add_do_method(this, "_preview_settings_changed"); + undo_redo->add_undo_method(this, "_preview_settings_changed"); + undo_redo->commit_action(); } } -void Node3DEditor::_sun_direction_angle_set() { - sun_rotation.x = Math::deg_to_rad(-sun_angle_altitude->get_value()); - sun_rotation.y = Math::deg_to_rad(180.0 - sun_angle_azimuth->get_value()); - _preview_settings_changed(); +void Node3DEditor::_sun_direction_set_altitude(float p_altitude) { + EditorUndoRedoManager *undo_redo = EditorUndoRedoManager::get_singleton(); + undo_redo->create_action(TTR("Set Preview Sun Altitude"), UndoRedo::MergeMode::MERGE_ENDS); + undo_redo->add_do_method(sun_angle_altitude, "set_value_no_signal", p_altitude); + undo_redo->add_undo_method(sun_angle_altitude, "set_value_no_signal", -Math::rad_to_deg(sun_rotation.x)); + undo_redo->add_do_method(this, "_preview_settings_changed"); + undo_redo->add_undo_method(this, "_preview_settings_changed"); + undo_redo->commit_action(); +} + +void Node3DEditor::_sun_direction_set_azimuth(float p_azimuth) { + EditorUndoRedoManager *undo_redo = EditorUndoRedoManager::get_singleton(); + undo_redo->create_action(TTR("Set Preview Sun Azimuth"), UndoRedo::MergeMode::MERGE_ENDS); + undo_redo->add_do_method(sun_angle_azimuth, "set_value_no_signal", p_azimuth); + undo_redo->add_undo_method(sun_angle_azimuth, "set_value_no_signal", 180.0 - Math::rad_to_deg(sun_rotation.y)); + undo_redo->add_do_method(this, "_preview_settings_changed"); + undo_redo->add_undo_method(this, "_preview_settings_changed"); + undo_redo->commit_action(); +} + +void Node3DEditor::_sun_set_color(const Color &p_color) { + EditorUndoRedoManager *undo_redo = EditorUndoRedoManager::get_singleton(); + undo_redo->create_action(TTR("Set Preview Sun Color"), UndoRedo::MergeMode::MERGE_ENDS); + undo_redo->add_do_method(sun_color, "set_pick_color", p_color); + undo_redo->add_undo_method(sun_color, "set_pick_color", preview_sun->get_color()); + undo_redo->add_do_method(this, "_preview_settings_changed"); + undo_redo->add_undo_method(this, "_preview_settings_changed"); + undo_redo->commit_action(); +} + +void Node3DEditor::_sun_set_energy(float p_energy) { + EditorUndoRedoManager *undo_redo = EditorUndoRedoManager::get_singleton(); + undo_redo->create_action(TTR("Set Preview Sun Energy"), UndoRedo::MergeMode::MERGE_ENDS); + undo_redo->add_do_method(sun_energy, "set_value_no_signal", p_energy); + undo_redo->add_undo_method(sun_energy, "set_value_no_signal", preview_sun->get_param(Light3D::PARAM_ENERGY)); + undo_redo->add_do_method(this, "_preview_settings_changed"); + undo_redo->add_undo_method(this, "_preview_settings_changed"); + undo_redo->commit_action(); +} + +void Node3DEditor::_sun_set_shadow_max_distance(float p_shadow_max_distance) { + EditorUndoRedoManager *undo_redo = EditorUndoRedoManager::get_singleton(); + undo_redo->create_action(TTR("Set Preview Sun Max Shadow Distance"), UndoRedo::MergeMode::MERGE_ENDS); + undo_redo->add_do_method(sun_shadow_max_distance, "set_value_no_signal", p_shadow_max_distance); + undo_redo->add_undo_method(sun_shadow_max_distance, "set_value_no_signal", preview_sun->get_param(Light3D::PARAM_SHADOW_MAX_DISTANCE)); + undo_redo->add_do_method(this, "_preview_settings_changed"); + undo_redo->add_undo_method(this, "_preview_settings_changed"); + undo_redo->commit_action(); +} + +void Node3DEditor::_environ_set_sky_color(const Color &p_color) { + EditorUndoRedoManager *undo_redo = EditorUndoRedoManager::get_singleton(); + undo_redo->create_action(TTR("Set Preview Environment Sky Color"), UndoRedo::MergeMode::MERGE_ENDS); + undo_redo->add_do_method(environ_sky_color, "set_pick_color", p_color); + undo_redo->add_undo_method(environ_sky_color, "set_pick_color", sky_material->get_sky_top_color()); + undo_redo->add_do_method(this, "_preview_settings_changed"); + undo_redo->add_undo_method(this, "_preview_settings_changed"); + undo_redo->commit_action(); +} + +void Node3DEditor::_environ_set_ground_color(const Color &p_color) { + EditorUndoRedoManager *undo_redo = EditorUndoRedoManager::get_singleton(); + undo_redo->create_action(TTR("Set Preview Environment Ground Color"), UndoRedo::MergeMode::MERGE_ENDS); + undo_redo->add_do_method(environ_ground_color, "set_pick_color", p_color); + undo_redo->add_undo_method(environ_ground_color, "set_pick_color", sky_material->get_ground_bottom_color()); + undo_redo->add_do_method(this, "_preview_settings_changed"); + undo_redo->add_undo_method(this, "_preview_settings_changed"); + undo_redo->commit_action(); +} + +void Node3DEditor::_environ_set_sky_energy(float p_energy) { + EditorUndoRedoManager *undo_redo = EditorUndoRedoManager::get_singleton(); + undo_redo->create_action(TTR("Set Preview Environment Energy"), UndoRedo::MergeMode::MERGE_ENDS); + undo_redo->add_do_method(environ_energy, "set_value_no_signal", p_energy); + undo_redo->add_undo_method(environ_energy, "set_value_no_signal", sky_material->get_energy_multiplier()); + undo_redo->add_do_method(this, "_preview_settings_changed"); + undo_redo->add_undo_method(this, "_preview_settings_changed"); + undo_redo->commit_action(); +} + +void Node3DEditor::_environ_set_ao() { + EditorUndoRedoManager *undo_redo = EditorUndoRedoManager::get_singleton(); + undo_redo->create_action(TTR("Set Preview Environment Ambient Occlusion")); + undo_redo->add_do_method(environ_ao_button, "set_pressed", environ_ao_button->is_pressed()); + undo_redo->add_undo_method(environ_ao_button, "set_pressed", !environ_ao_button->is_pressed()); + undo_redo->add_do_method(this, "_preview_settings_changed"); + undo_redo->add_undo_method(this, "_preview_settings_changed"); + undo_redo->commit_action(); +} + +void Node3DEditor::_environ_set_glow() { + EditorUndoRedoManager *undo_redo = EditorUndoRedoManager::get_singleton(); + undo_redo->create_action(TTR("Set Preview Environment Glow")); + undo_redo->add_do_method(environ_glow_button, "set_pressed", environ_glow_button->is_pressed()); + undo_redo->add_undo_method(environ_glow_button, "set_pressed", !environ_glow_button->is_pressed()); + undo_redo->add_do_method(this, "_preview_settings_changed"); + undo_redo->add_undo_method(this, "_preview_settings_changed"); + undo_redo->commit_action(); +} + +void Node3DEditor::_environ_set_tonemap() { + EditorUndoRedoManager *undo_redo = EditorUndoRedoManager::get_singleton(); + undo_redo->create_action(TTR("Set Preview Environment Tonemap")); + undo_redo->add_do_method(environ_tonemap_button, "set_pressed", environ_tonemap_button->is_pressed()); + undo_redo->add_undo_method(environ_tonemap_button, "set_pressed", !environ_tonemap_button->is_pressed()); + undo_redo->add_do_method(this, "_preview_settings_changed"); + undo_redo->add_undo_method(this, "_preview_settings_changed"); + undo_redo->commit_action(); +} + +void Node3DEditor::_environ_set_gi() { + EditorUndoRedoManager *undo_redo = EditorUndoRedoManager::get_singleton(); + undo_redo->create_action(TTR("Set Preview Environment Global Illumination")); + undo_redo->add_do_method(environ_gi_button, "set_pressed", environ_gi_button->is_pressed()); + undo_redo->add_undo_method(environ_gi_button, "set_pressed", !environ_gi_button->is_pressed()); + undo_redo->add_do_method(this, "_preview_settings_changed"); + undo_redo->add_undo_method(this, "_preview_settings_changed"); + undo_redo->commit_action(); +} + +void Node3DEditor::PreviewSunEnvPopup::shortcut_input(const Ref &p_event) { + const Ref k = p_event; + if (k.is_valid() && k->is_pressed()) { + bool handled = false; + + if (ED_IS_SHORTCUT("ui_undo", p_event)) { + EditorNode::get_singleton()->undo(); + handled = true; + } + + if (ED_IS_SHORTCUT("ui_redo", p_event)) { + EditorNode::get_singleton()->redo(); + handled = true; + } + + if (handled) { + set_input_as_handled(); + } + } } Node3DEditor::Node3DEditor() { @@ -9337,7 +9482,7 @@ Node3DEditor::Node3DEditor() { current_hover_gizmo_handle_secondary = false; { // Sun/preview environment popup. - sun_environ_popup = memnew(PopupPanel); + sun_environ_popup = memnew(PreviewSunEnvPopup); add_child(sun_environ_popup); HBoxContainer *sun_environ_hb = memnew(HBoxContainer); @@ -9399,7 +9544,7 @@ void fragment() { sun_angle_altitude->set_max(90); sun_angle_altitude->set_min(-90); sun_angle_altitude->set_step(0.1); - sun_angle_altitude->connect(SceneStringName(value_changed), callable_mp(this, &Node3DEditor::_sun_direction_angle_set).unbind(1)); + sun_angle_altitude->connect(SceneStringName(value_changed), callable_mp(this, &Node3DEditor::_sun_direction_set_altitude)); sun_angle_altitude_vbox->add_child(sun_angle_altitude); sun_angle_hbox->add_child(sun_angle_altitude_vbox); VBoxContainer *sun_angle_azimuth_vbox = memnew(VBoxContainer); @@ -9415,7 +9560,7 @@ void fragment() { sun_angle_azimuth->set_step(0.1); sun_angle_azimuth->set_allow_greater(true); sun_angle_azimuth->set_allow_lesser(true); - sun_angle_azimuth->connect(SceneStringName(value_changed), callable_mp(this, &Node3DEditor::_sun_direction_angle_set).unbind(1)); + sun_angle_azimuth->connect(SceneStringName(value_changed), callable_mp(this, &Node3DEditor::_sun_direction_set_azimuth)); sun_angle_azimuth_vbox->add_child(sun_angle_azimuth); sun_angle_hbox->add_child(sun_angle_azimuth_vbox); sun_angle_hbox->add_theme_constant_override("separation", 10); @@ -9424,7 +9569,7 @@ void fragment() { sun_color = memnew(ColorPickerButton); sun_color->set_edit_alpha(false); sun_vb->add_margin_child(TTR("Sun Color"), sun_color); - sun_color->connect("color_changed", callable_mp(this, &Node3DEditor::_preview_settings_changed).unbind(1)); + sun_color->connect("color_changed", callable_mp(this, &Node3DEditor::_sun_set_color)); sun_color->get_popup()->connect("about_to_popup", callable_mp(EditorNode::get_singleton(), &EditorNode::setup_color_picker).bind(sun_color->get_picker())); sun_energy = memnew(EditorSpinSlider); @@ -9432,13 +9577,13 @@ void fragment() { sun_energy->set_min(0); sun_energy->set_step(0.05); sun_vb->add_margin_child(TTR("Sun Energy"), sun_energy); - sun_energy->connect(SceneStringName(value_changed), callable_mp(this, &Node3DEditor::_preview_settings_changed).unbind(1)); + sun_energy->connect(SceneStringName(value_changed), callable_mp(this, &Node3DEditor::_sun_set_energy)); - sun_max_distance = memnew(EditorSpinSlider); - sun_vb->add_margin_child(TTR("Shadow Max Distance"), sun_max_distance); - sun_max_distance->connect(SceneStringName(value_changed), callable_mp(this, &Node3DEditor::_preview_settings_changed).unbind(1)); - sun_max_distance->set_min(1); - sun_max_distance->set_max(4096); + sun_shadow_max_distance = memnew(EditorSpinSlider); + sun_vb->add_margin_child(TTR("Shadow Max Distance"), sun_shadow_max_distance); + sun_shadow_max_distance->connect(SceneStringName(value_changed), callable_mp(this, &Node3DEditor::_sun_set_shadow_max_distance)); + sun_shadow_max_distance->set_min(1); + sun_shadow_max_distance->set_max(4096); sun_add_to_scene = memnew(Button); sun_add_to_scene->set_text(TTR("Add Sun to Scene")); @@ -9472,11 +9617,11 @@ void fragment() { environ_sky_color = memnew(ColorPickerButton); environ_sky_color->set_edit_alpha(false); - environ_sky_color->connect("color_changed", callable_mp(this, &Node3DEditor::_preview_settings_changed).unbind(1)); + environ_sky_color->connect("color_changed", callable_mp(this, &Node3DEditor::_environ_set_sky_color)); environ_sky_color->get_popup()->connect("about_to_popup", callable_mp(EditorNode::get_singleton(), &EditorNode::setup_color_picker).bind(environ_sky_color->get_picker())); environ_vb->add_margin_child(TTR("Sky Color"), environ_sky_color); environ_ground_color = memnew(ColorPickerButton); - environ_ground_color->connect("color_changed", callable_mp(this, &Node3DEditor::_preview_settings_changed).unbind(1)); + environ_ground_color->connect("color_changed", callable_mp(this, &Node3DEditor::_environ_set_ground_color)); environ_ground_color->set_edit_alpha(false); environ_ground_color->get_popup()->connect("about_to_popup", callable_mp(EditorNode::get_singleton(), &EditorNode::setup_color_picker).bind(environ_ground_color->get_picker())); environ_vb->add_margin_child(TTR("Ground Color"), environ_ground_color); @@ -9484,7 +9629,7 @@ void fragment() { environ_energy->set_max(8.0); environ_energy->set_min(0); environ_energy->set_step(0.05); - environ_energy->connect(SceneStringName(value_changed), callable_mp(this, &Node3DEditor::_preview_settings_changed).unbind(1)); + environ_energy->connect(SceneStringName(value_changed), callable_mp(this, &Node3DEditor::_environ_set_sky_energy)); environ_vb->add_margin_child(TTR("Sky Energy"), environ_energy); HBoxContainer *fx_vb = memnew(HBoxContainer); fx_vb->set_h_size_flags(SIZE_EXPAND_FILL); @@ -9493,25 +9638,25 @@ void fragment() { environ_ao_button->set_text(TTR("AO")); environ_ao_button->set_h_size_flags(SIZE_EXPAND_FILL); environ_ao_button->set_toggle_mode(true); - environ_ao_button->connect(SceneStringName(pressed), callable_mp(this, &Node3DEditor::_preview_settings_changed), CONNECT_DEFERRED); + environ_ao_button->connect(SceneStringName(pressed), callable_mp(this, &Node3DEditor::_environ_set_ao), CONNECT_DEFERRED); fx_vb->add_child(environ_ao_button); environ_glow_button = memnew(Button); environ_glow_button->set_text(TTR("Glow")); environ_glow_button->set_h_size_flags(SIZE_EXPAND_FILL); environ_glow_button->set_toggle_mode(true); - environ_glow_button->connect(SceneStringName(pressed), callable_mp(this, &Node3DEditor::_preview_settings_changed), CONNECT_DEFERRED); + environ_glow_button->connect(SceneStringName(pressed), callable_mp(this, &Node3DEditor::_environ_set_glow), CONNECT_DEFERRED); fx_vb->add_child(environ_glow_button); environ_tonemap_button = memnew(Button); environ_tonemap_button->set_text(TTR("Tonemap")); environ_tonemap_button->set_h_size_flags(SIZE_EXPAND_FILL); environ_tonemap_button->set_toggle_mode(true); - environ_tonemap_button->connect(SceneStringName(pressed), callable_mp(this, &Node3DEditor::_preview_settings_changed), CONNECT_DEFERRED); + environ_tonemap_button->connect(SceneStringName(pressed), callable_mp(this, &Node3DEditor::_environ_set_tonemap), CONNECT_DEFERRED); fx_vb->add_child(environ_tonemap_button); environ_gi_button = memnew(Button); environ_gi_button->set_text(TTR("GI")); environ_gi_button->set_h_size_flags(SIZE_EXPAND_FILL); environ_gi_button->set_toggle_mode(true); - environ_gi_button->connect(SceneStringName(pressed), callable_mp(this, &Node3DEditor::_preview_settings_changed), CONNECT_DEFERRED); + environ_gi_button->connect(SceneStringName(pressed), callable_mp(this, &Node3DEditor::_environ_set_gi), CONNECT_DEFERRED); fx_vb->add_child(environ_gi_button); environ_vb->add_margin_child(TTR("Post Process"), fx_vb); @@ -9545,6 +9690,8 @@ void fragment() { environment->set_sky(sky); environment->set_background(Environment::BG_SKY); + sun_environ_popup->set_process_shortcut_input(true); + _load_default_preview_settings(); _preview_settings_changed(); } diff --git a/editor/plugins/node_3d_editor_plugin.h b/editor/plugins/node_3d_editor_plugin.h index dcfea1b9c82..94a69e353a1 100644 --- a/editor/plugins/node_3d_editor_plugin.h +++ b/editor/plugins/node_3d_editor_plugin.h @@ -847,6 +847,13 @@ private: // Preview Sun and Environment + class PreviewSunEnvPopup : public PopupPanel { + GDCLASS(PreviewSunEnvPopup, PopupPanel); + + protected: + virtual void shortcut_input(const Ref &p_event) override; + }; + uint32_t world_env_count = 0; uint32_t directional_light_count = 0; @@ -860,13 +867,9 @@ private: EditorSpinSlider *sun_angle_azimuth = nullptr; ColorPickerButton *sun_color = nullptr; EditorSpinSlider *sun_energy = nullptr; - EditorSpinSlider *sun_max_distance = nullptr; + EditorSpinSlider *sun_shadow_max_distance = nullptr; Button *sun_add_to_scene = nullptr; - void _sun_direction_draw(); - void _sun_direction_input(const Ref &p_event); - void _sun_direction_angle_set(); - Vector2 sun_rotation; Ref sun_direction_shader; @@ -897,6 +900,22 @@ private: bool sun_environ_updating = false; + void _sun_direction_draw(); + void _sun_direction_input(const Ref &p_event); + void _sun_direction_set_altitude(float p_altitude); + void _sun_direction_set_azimuth(float p_azimuth); + void _sun_set_color(const Color &p_color); + void _sun_set_energy(float p_energy); + void _sun_set_shadow_max_distance(float p_shadow_max_distance); + + void _environ_set_sky_color(const Color &p_color); + void _environ_set_ground_color(const Color &p_color); + void _environ_set_sky_energy(float p_energy); + void _environ_set_ao(); + void _environ_set_glow(); + void _environ_set_tonemap(); + void _environ_set_gi(); + void _load_default_preview_settings(); void _update_preview_environment();