|
@@ -5491,6 +5491,36 @@ void Node3DEditorViewport::_set_lock_view_rotation(bool p_lock_rotation) {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+void Node3DEditorViewport::_add_advanced_debug_draw_mode_item(PopupMenu *p_popup, const String &p_name, int p_value, SupportedRenderingMethods p_rendering_methods, const String &p_tooltip) {
|
|
|
+ display_submenu->add_radio_check_item(p_name, p_value);
|
|
|
+
|
|
|
+ bool disabled = false;
|
|
|
+ String disabled_tooltip;
|
|
|
+ switch (p_rendering_methods) {
|
|
|
+ case SupportedRenderingMethods::ALL:
|
|
|
+ break;
|
|
|
+ case SupportedRenderingMethods::FORWARD_PLUS_MOBILE:
|
|
|
+ disabled = OS::get_singleton()->get_current_rendering_method() == "gl_compatibility";
|
|
|
+ disabled_tooltip = TTR("This debug draw mode is not supported when using the Compatibility rendering method.");
|
|
|
+ break;
|
|
|
+ case SupportedRenderingMethods::FORWARD_PLUS:
|
|
|
+ disabled = OS::get_singleton()->get_current_rendering_method() == "gl_compatibility" || OS::get_singleton()->get_current_rendering_method() == "mobile";
|
|
|
+ disabled_tooltip = TTR("This debug draw mode is not supported when using the Mobile or Compatibility rendering methods.");
|
|
|
+ break;
|
|
|
+ }
|
|
|
+
|
|
|
+ display_submenu->set_item_disabled(-1, disabled);
|
|
|
+ String tooltip = p_tooltip;
|
|
|
+ if (disabled) {
|
|
|
+ if (tooltip.is_empty()) {
|
|
|
+ tooltip = disabled_tooltip;
|
|
|
+ } else {
|
|
|
+ tooltip += "\n\n" + disabled_tooltip;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ display_submenu->set_item_tooltip(-1, tooltip);
|
|
|
+}
|
|
|
+
|
|
|
Node3DEditorViewport::Node3DEditorViewport(Node3DEditor *p_spatial_editor, int p_index) {
|
|
|
cpu_time_history_index = 0;
|
|
|
gpu_time_history_index = 0;
|
|
@@ -5573,38 +5603,59 @@ Node3DEditorViewport::Node3DEditorViewport(Node3DEditor *p_spatial_editor, int p
|
|
|
|
|
|
display_submenu = memnew(PopupMenu);
|
|
|
display_submenu->set_hide_on_checkable_item_selection(false);
|
|
|
- display_submenu->add_radio_check_item(TTR("Directional Shadow Splits"), VIEW_DISPLAY_DEBUG_PSSM_SPLITS);
|
|
|
+ _add_advanced_debug_draw_mode_item(display_submenu, TTR("Directional Shadow Splits"), VIEW_DISPLAY_DEBUG_PSSM_SPLITS, SupportedRenderingMethods::FORWARD_PLUS_MOBILE,
|
|
|
+ TTR("Displays directional shadow splits in different colors to make adjusting split thresholds easier. \nRed: 1st split (closest to the camera), Green: 2nd split, Blue: 3rd split, Yellow: 4th split (furthest from the camera)"));
|
|
|
display_submenu->add_separator();
|
|
|
- display_submenu->add_radio_check_item(TTR("Normal Buffer"), VIEW_DISPLAY_NORMAL_BUFFER);
|
|
|
+ // TRANSLATORS: "Normal" as in "normal vector", not "normal life".
|
|
|
+ _add_advanced_debug_draw_mode_item(display_submenu, TTR("Normal Buffer"), VIEW_DISPLAY_NORMAL_BUFFER, SupportedRenderingMethods::FORWARD_PLUS);
|
|
|
display_submenu->add_separator();
|
|
|
- display_submenu->add_radio_check_item(TTR("Shadow Atlas"), VIEW_DISPLAY_DEBUG_SHADOW_ATLAS);
|
|
|
- display_submenu->add_radio_check_item(TTR("Directional Shadow Map"), VIEW_DISPLAY_DEBUG_DIRECTIONAL_SHADOW_ATLAS);
|
|
|
+ _add_advanced_debug_draw_mode_item(display_submenu, TTR("Shadow Atlas"), VIEW_DISPLAY_DEBUG_SHADOW_ATLAS, SupportedRenderingMethods::ALL,
|
|
|
+ TTR("Displays the shadow atlas used for positional (omni/spot) shadow mapping.\nRequires a visible OmniLight3D or SpotLight3D node with shadows enabled to have a visible effect."));
|
|
|
+ _add_advanced_debug_draw_mode_item(display_submenu, TTR("Directional Shadow Map"), VIEW_DISPLAY_DEBUG_DIRECTIONAL_SHADOW_ATLAS, SupportedRenderingMethods::ALL,
|
|
|
+ TTR("Displays the shadow map used for directional shadow mapping.\nRequires a visible DirectionalLight3D node with shadows enabled to have a visible effect."));
|
|
|
display_submenu->add_separator();
|
|
|
- display_submenu->add_radio_check_item(TTR("Decal Atlas"), VIEW_DISPLAY_DEBUG_DECAL_ATLAS);
|
|
|
+ _add_advanced_debug_draw_mode_item(display_submenu, TTR("Decal Atlas"), VIEW_DISPLAY_DEBUG_DECAL_ATLAS, SupportedRenderingMethods::FORWARD_PLUS_MOBILE);
|
|
|
display_submenu->add_separator();
|
|
|
- display_submenu->add_radio_check_item(TTR("VoxelGI Lighting"), VIEW_DISPLAY_DEBUG_VOXEL_GI_LIGHTING);
|
|
|
- display_submenu->add_radio_check_item(TTR("VoxelGI Albedo"), VIEW_DISPLAY_DEBUG_VOXEL_GI_ALBEDO);
|
|
|
- display_submenu->add_radio_check_item(TTR("VoxelGI Emission"), VIEW_DISPLAY_DEBUG_VOXEL_GI_EMISSION);
|
|
|
+ _add_advanced_debug_draw_mode_item(display_submenu, TTR("VoxelGI Lighting"), VIEW_DISPLAY_DEBUG_VOXEL_GI_LIGHTING, SupportedRenderingMethods::FORWARD_PLUS,
|
|
|
+ TTR("Requires a visible VoxelGI node that has been baked to have a visible effect."));
|
|
|
+ _add_advanced_debug_draw_mode_item(display_submenu, TTR("VoxelGI Albedo"), VIEW_DISPLAY_DEBUG_VOXEL_GI_ALBEDO, SupportedRenderingMethods::FORWARD_PLUS,
|
|
|
+ TTR("Requires a visible VoxelGI node that has been baked to have a visible effect."));
|
|
|
+ _add_advanced_debug_draw_mode_item(display_submenu, TTR("VoxelGI Emission"), VIEW_DISPLAY_DEBUG_VOXEL_GI_EMISSION, SupportedRenderingMethods::FORWARD_PLUS,
|
|
|
+ TTR("Requires a visible VoxelGI node that has been baked to have a visible effect."));
|
|
|
display_submenu->add_separator();
|
|
|
- display_submenu->add_radio_check_item(TTR("SDFGI Cascades"), VIEW_DISPLAY_DEBUG_SDFGI);
|
|
|
- display_submenu->add_radio_check_item(TTR("SDFGI Probes"), VIEW_DISPLAY_DEBUG_SDFGI_PROBES);
|
|
|
+ _add_advanced_debug_draw_mode_item(display_submenu, TTR("SDFGI Cascades"), VIEW_DISPLAY_DEBUG_SDFGI, SupportedRenderingMethods::FORWARD_PLUS,
|
|
|
+ TTR("Requires SDFGI to be enabled in Environment to have a visible effect."));
|
|
|
+ _add_advanced_debug_draw_mode_item(display_submenu, TTR("SDFGI Probes"), VIEW_DISPLAY_DEBUG_SDFGI_PROBES, SupportedRenderingMethods::FORWARD_PLUS,
|
|
|
+ TTR("Requires SDFGI to be enabled in Environment to have a visible effect."));
|
|
|
display_submenu->add_separator();
|
|
|
- display_submenu->add_radio_check_item(TTR("Scene Luminance"), VIEW_DISPLAY_DEBUG_SCENE_LUMINANCE);
|
|
|
+ _add_advanced_debug_draw_mode_item(display_submenu, TTR("Scene Luminance"), VIEW_DISPLAY_DEBUG_SCENE_LUMINANCE, SupportedRenderingMethods::FORWARD_PLUS_MOBILE,
|
|
|
+ TTR("Displays the scene luminance computed from the 3D buffer. This is used for Auto Exposure calculation.\nRequires Auto Exposure to be enabled in CameraAttributes to have a visible effect."));
|
|
|
display_submenu->add_separator();
|
|
|
- display_submenu->add_radio_check_item(TTR("SSAO"), VIEW_DISPLAY_DEBUG_SSAO);
|
|
|
- display_submenu->add_radio_check_item(TTR("SSIL"), VIEW_DISPLAY_DEBUG_SSIL);
|
|
|
+ _add_advanced_debug_draw_mode_item(display_submenu, TTR("SSAO"), VIEW_DISPLAY_DEBUG_SSAO, SupportedRenderingMethods::FORWARD_PLUS,
|
|
|
+ TTR("Displays the screen-space ambient occlusion buffer. Requires SSAO to be enabled in Environment to have a visible effect."));
|
|
|
+ _add_advanced_debug_draw_mode_item(display_submenu, TTR("SSIL"), VIEW_DISPLAY_DEBUG_SSIL, SupportedRenderingMethods::FORWARD_PLUS,
|
|
|
+ TTR("Displays the screen-space indirect lighting buffer. Requires SSIL to be enabled in Environment to have a visible effect."));
|
|
|
display_submenu->add_separator();
|
|
|
- display_submenu->add_radio_check_item(TTR("VoxelGI/SDFGI Buffer"), VIEW_DISPLAY_DEBUG_GI_BUFFER);
|
|
|
+ _add_advanced_debug_draw_mode_item(display_submenu, TTR("VoxelGI/SDFGI Buffer"), VIEW_DISPLAY_DEBUG_GI_BUFFER, SupportedRenderingMethods::FORWARD_PLUS,
|
|
|
+ TTR("Requires SDFGI or VoxelGI to be enabled to have a visible effect."));
|
|
|
display_submenu->add_separator();
|
|
|
- display_submenu->add_radio_check_item(TTR("Disable Mesh LOD"), VIEW_DISPLAY_DEBUG_DISABLE_LOD);
|
|
|
+ _add_advanced_debug_draw_mode_item(display_submenu, TTR("Disable Mesh LOD"), VIEW_DISPLAY_DEBUG_DISABLE_LOD, SupportedRenderingMethods::ALL,
|
|
|
+ TTR("Renders all meshes with their highest level of detail regardless of their distance from the camera."));
|
|
|
display_submenu->add_separator();
|
|
|
- display_submenu->add_radio_check_item(TTR("OmniLight3D Cluster"), VIEW_DISPLAY_DEBUG_CLUSTER_OMNI_LIGHTS);
|
|
|
- display_submenu->add_radio_check_item(TTR("SpotLight3D Cluster"), VIEW_DISPLAY_DEBUG_CLUSTER_SPOT_LIGHTS);
|
|
|
- display_submenu->add_radio_check_item(TTR("Decal Cluster"), VIEW_DISPLAY_DEBUG_CLUSTER_DECALS);
|
|
|
- display_submenu->add_radio_check_item(TTR("ReflectionProbe Cluster"), VIEW_DISPLAY_DEBUG_CLUSTER_REFLECTION_PROBES);
|
|
|
- display_submenu->add_radio_check_item(TTR("Occlusion Culling Buffer"), VIEW_DISPLAY_DEBUG_OCCLUDERS);
|
|
|
- display_submenu->add_radio_check_item(TTR("Motion Vectors"), VIEW_DISPLAY_MOTION_VECTORS);
|
|
|
- display_submenu->add_radio_check_item(TTR("Internal Buffer"), VIEW_DISPLAY_INTERNAL_BUFFER);
|
|
|
+ _add_advanced_debug_draw_mode_item(display_submenu, TTR("OmniLight3D Cluster"), VIEW_DISPLAY_DEBUG_CLUSTER_OMNI_LIGHTS, SupportedRenderingMethods::FORWARD_PLUS,
|
|
|
+ TTR("Highlights tiles of pixels that are affected by at least one OmniLight3D."));
|
|
|
+ _add_advanced_debug_draw_mode_item(display_submenu, TTR("SpotLight3D Cluster"), VIEW_DISPLAY_DEBUG_CLUSTER_SPOT_LIGHTS, SupportedRenderingMethods::FORWARD_PLUS,
|
|
|
+ TTR("Highlights tiles of pixels that are affected by at least one SpotLight3D."));
|
|
|
+ _add_advanced_debug_draw_mode_item(display_submenu, TTR("Decal Cluster"), VIEW_DISPLAY_DEBUG_CLUSTER_DECALS, SupportedRenderingMethods::FORWARD_PLUS,
|
|
|
+ TTR("Highlights tiles of pixels that are affected by at least one Decal."));
|
|
|
+ _add_advanced_debug_draw_mode_item(display_submenu, TTR("ReflectionProbe Cluster"), VIEW_DISPLAY_DEBUG_CLUSTER_REFLECTION_PROBES, SupportedRenderingMethods::FORWARD_PLUS,
|
|
|
+ TTR("Highlights tiles of pixels that are affected by at least one ReflectionProbe."));
|
|
|
+ _add_advanced_debug_draw_mode_item(display_submenu, TTR("Occlusion Culling Buffer"), VIEW_DISPLAY_DEBUG_OCCLUDERS, SupportedRenderingMethods::FORWARD_PLUS_MOBILE,
|
|
|
+ TTR("Represents occluders with black pixels. Requires occlusion culling to be enabled to have a visible effect."));
|
|
|
+ _add_advanced_debug_draw_mode_item(display_submenu, TTR("Motion Vectors"), VIEW_DISPLAY_MOTION_VECTORS, SupportedRenderingMethods::FORWARD_PLUS,
|
|
|
+ TTR("Represents motion vectors with colored lines in the direction of motion. Gray dots represent areas with no per-pixel motion."));
|
|
|
+ _add_advanced_debug_draw_mode_item(display_submenu, TTR("Internal Buffer"), VIEW_DISPLAY_INTERNAL_BUFFER, SupportedRenderingMethods::FORWARD_PLUS_MOBILE,
|
|
|
+ TTR("Shows the scene rendered in linear colorspace before any tonemapping or post-processing."));
|
|
|
view_display_menu->get_popup()->add_submenu_node_item(TTR("Display Advanced..."), display_submenu, VIEW_DISPLAY_ADVANCED);
|
|
|
|
|
|
view_display_menu->get_popup()->add_separator();
|
|
@@ -5636,26 +5687,6 @@ Node3DEditorViewport::Node3DEditorViewport(Node3DEditor *p_spatial_editor, int p
|
|
|
display_submenu->connect(SceneStringName(id_pressed), callable_mp(this, &Node3DEditorViewport::_menu_option));
|
|
|
view_display_menu->set_disable_shortcuts(true);
|
|
|
|
|
|
- // TODO: Re-evaluate with new OpenGL3 renderer, and implement.
|
|
|
- //if (OS::get_singleton()->get_current_video_driver() == OS::RENDERING_DRIVER_OPENGL3) {
|
|
|
- if (false) {
|
|
|
- // Alternate display modes only work when using the Vulkan renderer; make this explicit.
|
|
|
- const int normal_idx = view_display_menu->get_popup()->get_item_index(VIEW_DISPLAY_NORMAL);
|
|
|
- const int wireframe_idx = view_display_menu->get_popup()->get_item_index(VIEW_DISPLAY_WIREFRAME);
|
|
|
- const int overdraw_idx = view_display_menu->get_popup()->get_item_index(VIEW_DISPLAY_OVERDRAW);
|
|
|
- const int shadeless_idx = view_display_menu->get_popup()->get_item_index(VIEW_DISPLAY_UNSHADED);
|
|
|
- const String unsupported_tooltip = TTR("Not available when using the OpenGL renderer.");
|
|
|
-
|
|
|
- view_display_menu->get_popup()->set_item_disabled(normal_idx, true);
|
|
|
- view_display_menu->get_popup()->set_item_tooltip(normal_idx, unsupported_tooltip);
|
|
|
- view_display_menu->get_popup()->set_item_disabled(wireframe_idx, true);
|
|
|
- view_display_menu->get_popup()->set_item_tooltip(wireframe_idx, unsupported_tooltip);
|
|
|
- view_display_menu->get_popup()->set_item_disabled(overdraw_idx, true);
|
|
|
- view_display_menu->get_popup()->set_item_tooltip(overdraw_idx, unsupported_tooltip);
|
|
|
- view_display_menu->get_popup()->set_item_disabled(shadeless_idx, true);
|
|
|
- view_display_menu->get_popup()->set_item_tooltip(shadeless_idx, unsupported_tooltip);
|
|
|
- }
|
|
|
-
|
|
|
// Registering with Key::NONE intentionally creates an empty Array.
|
|
|
register_shortcut_action("spatial_editor/viewport_orbit_modifier_1", TTRC("Viewport Orbit Modifier 1"), Key::NONE);
|
|
|
register_shortcut_action("spatial_editor/viewport_orbit_modifier_2", TTRC("Viewport Orbit Modifier 2"), Key::NONE);
|