diff --git a/doc/classes/EditorSettings.xml b/doc/classes/EditorSettings.xml
index 5dcfdb21b109..2fb7e4a5a7d3 100644
--- a/doc/classes/EditorSettings.xml
+++ b/doc/classes/EditorSettings.xml
@@ -445,6 +445,66 @@
The color to use for the TileMap editor's grid.
[b]Note:[/b] Only effective if [member editors/tiles_editor/display_grid] is [code]true[/code].
+
+ The color of a graph node's header when it belongs to the "Color" category.
+
+
+ The color of a graph node's header when it belongs to the "Conditional" category.
+
+
+ The color of a graph node's header when it belongs to the "Input" category.
+
+
+ The color of a graph node's header when it belongs to the "Output" category.
+
+
+ The color of a graph node's header when it belongs to the "Particle" category.
+
+
+ The color of a graph node's header when it belongs to the "Scalar" category.
+
+
+ The color of a graph node's header when it belongs to the "Special" category.
+
+
+ The color of a graph node's header when it belongs to the "Textures" category.
+
+
+ The color of a graph node's header when it belongs to the "Transform" category.
+
+
+ The color of a graph node's header when it belongs to the "Utility" category.
+
+
+ The color of a graph node's header when it belongs to the "Vector" category.
+
+
+ The color theme to use in the visual shader editor.
+
+
+ The color of a port/connection of boolean type.
+
+
+ The color of a port/connection of sampler type.
+
+
+ The color of a port/connection of scalar type (float, int, unsigned int).
+
+
+ The color of a port/connection of transform type.
+
+
+ The color of a port/connection of Vector2 type.
+
+
+ The color of a port/connection of Vector3 type.
+
+
+ The color of a port/connection of Vector4 type.
+
+
+ The pattern used for the background grid.
+
The curvature to use for connection lines in the visual shader editor. Higher values will make connection lines appear more curved, with values above [code]0.5[/code] resulting in more "angular" turns in the middle of connection lines.
diff --git a/editor/editor_settings.cpp b/editor/editor_settings.cpp
index 8192ac2eb497..0503cfd4525c 100644
--- a/editor/editor_settings.cpp
+++ b/editor/editor_settings.cpp
@@ -766,8 +766,13 @@ void EditorSettings::_load_defaults(Ref p_extra_config) {
_initial_set("editors/shader_editor/behavior/files/restore_shaders_on_load", true);
// Visual editors
+ EDITOR_SETTING(Variant::STRING, PROPERTY_HINT_ENUM, "editors/visual_editors/color_theme", "Default", "Default,Legacy,Custom")
+
+ _load_default_visual_shader_editor_theme();
+
EDITOR_SETTING(Variant::FLOAT, PROPERTY_HINT_RANGE, "editors/visual_editors/minimap_opacity", 0.85, "0.0,1.0,0.01")
EDITOR_SETTING(Variant::FLOAT, PROPERTY_HINT_RANGE, "editors/visual_editors/lines_curvature", 0.5, "0.0,1.0,0.01")
+ EDITOR_SETTING(Variant::INT, PROPERTY_HINT_ENUM, "editors/visual_editors/grid_pattern", 1, "Lines,Dots")
EDITOR_SETTING(Variant::INT, PROPERTY_HINT_RANGE, "editors/visual_editors/visual_shader/port_preview_size", 160, "100,400,0.01")
/* Run */
@@ -903,6 +908,30 @@ void EditorSettings::_load_godot2_text_editor_theme() {
_initial_set("text_editor/theme/highlighting/search_result_border_color", Color(0.41, 0.61, 0.91, 0.38));
}
+void EditorSettings::_load_default_visual_shader_editor_theme() {
+ // Connection type colors
+ _initial_set("editors/visual_editors/connection_colors/scalar_color", Color(0.55, 0.55, 0.55));
+ _initial_set("editors/visual_editors/connection_colors/vector2_color", Color(0.44, 0.43, 0.64));
+ _initial_set("editors/visual_editors/connection_colors/vector3_color", Color(0.337, 0.314, 0.71));
+ _initial_set("editors/visual_editors/connection_colors/vector4_color", Color(0.7, 0.65, 0.147));
+ _initial_set("editors/visual_editors/connection_colors/boolean_color", Color(0.243, 0.612, 0.349));
+ _initial_set("editors/visual_editors/connection_colors/transform_color", Color(0.71, 0.357, 0.64));
+ _initial_set("editors/visual_editors/connection_colors/sampler_color", Color(0.659, 0.4, 0.137));
+
+ // Node category colors (used for the node headers)
+ _initial_set("editors/visual_editors/category_colors/output_color", Color(0.26, 0.10, 0.15));
+ _initial_set("editors/visual_editors/category_colors/color_color", Color(0.5, 0.5, 0.1));
+ _initial_set("editors/visual_editors/category_colors/conditional_color", Color(0.208, 0.522, 0.298));
+ _initial_set("editors/visual_editors/category_colors/input_color", Color(0.502, 0.2, 0.204));
+ _initial_set("editors/visual_editors/category_colors/scalar_color", Color(0.1, 0.5, 0.6));
+ _initial_set("editors/visual_editors/category_colors/textures_color", Color(0.5, 0.3, 0.1));
+ _initial_set("editors/visual_editors/category_colors/transform_color", Color(0.5, 0.3, 0.5));
+ _initial_set("editors/visual_editors/category_colors/utility_color", Color(0.2, 0.2, 0.2));
+ _initial_set("editors/visual_editors/category_colors/vector_color", Color(0.2, 0.2, 0.5));
+ _initial_set("editors/visual_editors/category_colors/special_color", Color(0.098, 0.361, 0.294));
+ _initial_set("editors/visual_editors/category_colors/particle_color", Color(0.12, 0.358, 0.8));
+}
+
bool EditorSettings::_save_text_editor_theme(String p_file) {
String theme_section = "color_theme";
Ref cf = memnew(ConfigFile); // hex is better?
diff --git a/editor/editor_settings.h b/editor/editor_settings.h
index 87ce0cfd5798..5783bac77064 100644
--- a/editor/editor_settings.h
+++ b/editor/editor_settings.h
@@ -110,6 +110,7 @@ class EditorSettings : public Resource {
void _load_defaults(Ref p_extra_config = Ref());
void _load_godot2_text_editor_theme();
+ void _load_default_visual_shader_editor_theme();
bool _save_text_editor_theme(String p_file);
bool _is_default_text_editor_theme(String p_theme_name);
const String _get_project_metadata_path() const;
diff --git a/editor/editor_settings_dialog.cpp b/editor/editor_settings_dialog.cpp
index 13e3c41e3b0b..c339bbf36574 100644
--- a/editor/editor_settings_dialog.cpp
+++ b/editor/editor_settings_dialog.cpp
@@ -71,6 +71,8 @@ void EditorSettingsDialog::_settings_property_edited(const String &p_name) {
EditorSettings::get_singleton()->set_manually("interface/theme/spacing_preset", "Custom");
} else if (full_name.begins_with("text_editor/theme/highlighting")) {
EditorSettings::get_singleton()->set_manually("text_editor/theme/color_theme", "Custom");
+ } else if (full_name.begins_with("editors/visual_editors/connection_colors") || full_name.begins_with("editors/visual_editors/category_colors")) {
+ EditorSettings::get_singleton()->set_manually("editors/visual_editors/color_theme", "Custom");
}
}
diff --git a/editor/plugins/visual_shader_editor_plugin.cpp b/editor/plugins/visual_shader_editor_plugin.cpp
index 47501794738e..acca5810a9f8 100644
--- a/editor/plugins/visual_shader_editor_plugin.cpp
+++ b/editor/plugins/visual_shader_editor_plugin.cpp
@@ -104,6 +104,7 @@ void VisualShaderNodePlugin::_bind_methods() {
///////////////////
VisualShaderGraphPlugin::VisualShaderGraphPlugin() {
+ vs_msdf_fonts_theme.instantiate();
}
void VisualShaderGraphPlugin::_bind_methods() {
@@ -358,6 +359,13 @@ void VisualShaderGraphPlugin::update_theme() {
vector_expanded_color[1] = editor->get_theme_color(SNAME("axis_y_color"), EditorStringName(Editor)); // green
vector_expanded_color[2] = editor->get_theme_color(SNAME("axis_z_color"), EditorStringName(Editor)); // blue
vector_expanded_color[3] = editor->get_theme_color(SNAME("axis_w_color"), EditorStringName(Editor)); // alpha
+
+ Ref label_font = EditorNode::get_singleton()->get_editor_theme()->get_font("main_msdf", EditorStringName(EditorFonts));
+ Ref label_bold_font = EditorNode::get_singleton()->get_editor_theme()->get_font("main_bold_msdf", EditorStringName(EditorFonts));
+ vs_msdf_fonts_theme->set_font("font", "Label", label_font);
+ vs_msdf_fonts_theme->set_font("font", "GraphNodeTitleLabel", label_bold_font);
+ vs_msdf_fonts_theme->set_font("font", "LineEdit", label_font);
+ vs_msdf_fonts_theme->set_font("font", "Button", label_font);
}
bool VisualShaderGraphPlugin::is_node_has_parameter_instances_relatively(VisualShader::Type p_type, int p_node) const {
@@ -398,34 +406,35 @@ void VisualShaderGraphPlugin::add_node(VisualShader::Type p_type, int p_id, bool
Control *offset;
- static const Color type_color[] = {
- Color(0.38, 0.85, 0.96), // scalar (float)
- Color(0.49, 0.78, 0.94), // scalar (int)
- Color(0.20, 0.88, 0.67), // scalar (uint)
- Color(0.74, 0.57, 0.95), // vector2
- Color(0.84, 0.49, 0.93), // vector3
- Color(1.0, 0.125, 0.95), // vector4
- Color(0.55, 0.65, 0.94), // boolean
- Color(0.96, 0.66, 0.43), // transform
- Color(1.0, 1.0, 0.0), // sampler
+ const Color type_color[] = {
+ EDITOR_GET("editors/visual_editors/connection_colors/scalar_color"),
+ EDITOR_GET("editors/visual_editors/connection_colors/scalar_color"),
+ EDITOR_GET("editors/visual_editors/connection_colors/scalar_color"),
+ EDITOR_GET("editors/visual_editors/connection_colors/vector2_color"),
+ EDITOR_GET("editors/visual_editors/connection_colors/vector3_color"),
+ EDITOR_GET("editors/visual_editors/connection_colors/vector4_color"),
+ EDITOR_GET("editors/visual_editors/connection_colors/boolean_color"),
+ EDITOR_GET("editors/visual_editors/connection_colors/transform_color"),
+ EDITOR_GET("editors/visual_editors/connection_colors/sampler_color"),
};
- static const String vector_expanded_name[4] = {
- "red",
- "green",
- "blue",
- "alpha"
+ // Keep in sync with VisualShaderNode::Category.
+ const Color category_color[VisualShaderNode::Category::CATEGORY_MAX] = {
+ Color(0.0, 0.0, 0.0), // None (default, not used)
+ EDITOR_GET("editors/visual_editors/category_colors/output_color"),
+ EDITOR_GET("editors/visual_editors/category_colors/color_color"),
+ EDITOR_GET("editors/visual_editors/category_colors/conditional_color"),
+ EDITOR_GET("editors/visual_editors/category_colors/input_color"),
+ EDITOR_GET("editors/visual_editors/category_colors/scalar_color"),
+ EDITOR_GET("editors/visual_editors/category_colors/textures_color"),
+ EDITOR_GET("editors/visual_editors/category_colors/transform_color"),
+ EDITOR_GET("editors/visual_editors/category_colors/utility_color"),
+ EDITOR_GET("editors/visual_editors/category_colors/vector_color"),
+ EDITOR_GET("editors/visual_editors/category_colors/special_color"),
+ EDITOR_GET("editors/visual_editors/category_colors/particle_color"),
};
- // Visual shader specific theme for MSDF font.
- Ref vstheme;
- vstheme.instantiate();
- Ref label_font = EditorNode::get_singleton()->get_editor_theme()->get_font("main_msdf", EditorStringName(EditorFonts));
- Ref label_bold_font = EditorNode::get_singleton()->get_editor_theme()->get_font("main_bold_msdf", EditorStringName(EditorFonts));
- vstheme->set_font("font", "Label", label_font);
- vstheme->set_font("font", "GraphNodeTitleLabel", label_bold_font);
- vstheme->set_font("font", "LineEdit", label_font);
- vstheme->set_font("font", "Button", label_font);
+ static const String vector_expanded_name[4] = { "red", "green", "blue", "alpha" };
Ref vsnode = visual_shader->get_node(p_type, p_id);
@@ -457,7 +466,18 @@ void VisualShaderGraphPlugin::add_node(VisualShader::Type p_type, int p_id, bool
node->connect("delete_request", callable_mp(editor, &VisualShaderEditor::_delete_node_request).bind(p_type, p_id), CONNECT_DEFERRED);
}
graph->add_child(node);
- node->set_theme(vstheme);
+ node->set_theme(vs_msdf_fonts_theme);
+
+ // Set the node's titlebar color based on its category.
+ if (vsnode->get_category() != VisualShaderNode::CATEGORY_NONE) {
+ Ref sb_colored = editor->get_theme_stylebox("titlebar", "GraphNode")->duplicate();
+ sb_colored->set_bg_color(category_color[vsnode->get_category()]);
+ node->add_theme_style_override("titlebar", sb_colored);
+
+ Ref sb_colored_selected = editor->get_theme_stylebox("titlebar_selected", "GraphNode")->duplicate();
+ sb_colored_selected->set_bg_color(category_color[vsnode->get_category()].lightened(0.2));
+ node->add_theme_style_override("titlebar_selected", sb_colored_selected);
+ }
if (p_just_update) {
Link &link = links[p_id];
@@ -506,6 +526,11 @@ void VisualShaderGraphPlugin::add_node(VisualShader::Type p_type, int p_id, bool
port_offset += 1;
}
+ // Set the minimum width of a node based on the preview size to avoid a resize when toggling the preview.
+ Ref graph_node_stylebox = graph->get_theme_stylebox("panel", "GraphNode");
+ int port_preview_size = EDITOR_GET("editors/visual_editors/visual_shader/port_preview_size");
+ node->set_custom_minimum_size(Size2((Math::ceil(graph_node_stylebox->get_minimum_size().width) + port_preview_size) * EDSCALE, 0));
+
Ref emit = vsnode;
if (emit.is_valid()) {
node->set_custom_minimum_size(Size2(200 * EDSCALE, 0));
@@ -4313,7 +4338,9 @@ void VisualShaderEditor::_notification(int p_what) {
}
if (EditorSettings::get_singleton()->check_changed_settings_in_group("editors/visual_editors")) {
graph->set_minimap_opacity(EDITOR_GET("editors/visual_editors/minimap_opacity"));
+ graph->set_grid_pattern((GraphEdit::GridPattern) int(EDITOR_GET("editors/visual_editors/grid_pattern")));
graph->set_connection_lines_curvature(EDITOR_GET("editors/visual_editors/lines_curvature"));
+
_update_graph();
}
} break;
@@ -5424,6 +5451,9 @@ VisualShaderEditor::VisualShaderEditor() {
graph->get_menu_hbox()->set_h_size_flags(SIZE_EXPAND_FILL);
graph->set_v_size_flags(SIZE_EXPAND_FILL);
graph->set_h_size_flags(SIZE_EXPAND_FILL);
+ graph->set_grid_pattern(GraphEdit::GridPattern::GRID_PATTERN_DOTS);
+ int grid_pattern = EDITOR_GET("editors/visual_editors/grid_pattern");
+ graph->set_grid_pattern((GraphEdit::GridPattern)grid_pattern);
graph->set_show_zoom_label(true);
add_child(graph);
SET_DRAG_FORWARDING_GCD(graph, VisualShaderEditor);
diff --git a/editor/plugins/visual_shader_editor_plugin.h b/editor/plugins/visual_shader_editor_plugin.h
index 39e721f226ee..2575866b10d9 100644
--- a/editor/plugins/visual_shader_editor_plugin.h
+++ b/editor/plugins/visual_shader_editor_plugin.h
@@ -99,6 +99,9 @@ class VisualShaderGraphPlugin : public RefCounted {
Color vector_expanded_color[4];
+ // Visual shader specific theme for using MSDF fonts (on GraphNodes) which reduce aliasing at higher zoom levels.
+ Ref vs_msdf_fonts_theme;
+
protected:
static void _bind_methods();
diff --git a/editor/themes/editor_theme_manager.cpp b/editor/themes/editor_theme_manager.cpp
index 052b19478c74..91eb3ecbaf4e 100644
--- a/editor/themes/editor_theme_manager.cpp
+++ b/editor/themes/editor_theme_manager.cpp
@@ -39,6 +39,7 @@
#include "editor/themes/editor_icons.h"
#include "editor/themes/editor_scale.h"
#include "editor/themes/editor_theme.h"
+#include "scene/gui/graph_edit.h"
#include "scene/resources/image_texture.h"
#include "scene/resources/style_box_flat.h"
#include "scene/resources/style_box_line.h"
@@ -213,6 +214,7 @@ Ref EditorThemeManager::_create_base_theme(const Ref &
_populate_standard_styles(theme, config);
_populate_editor_styles(theme, config);
_populate_text_editor_styles(theme, config);
+ _populate_visual_shader_styles(theme, config);
OS::get_singleton()->benchmark_end_measure(get_benchmark_key(), "Create Base Theme");
return theme;
@@ -1432,13 +1434,22 @@ void EditorThemeManager::_populate_standard_styles(const Ref &p_the
p_theme->set_stylebox("panel", "GraphEdit", p_config.tree_panel_style);
p_theme->set_stylebox("menu_panel", "GraphEdit", make_flat_stylebox(p_config.dark_color_1 * Color(1, 1, 1, 0.6), 4, 2, 4, 2, 3));
- if (p_config.dark_theme) {
- p_theme->set_color("grid_major", "GraphEdit", Color(1.0, 1.0, 1.0, 0.1));
- p_theme->set_color("grid_minor", "GraphEdit", Color(1.0, 1.0, 1.0, 0.05));
- } else {
- p_theme->set_color("grid_major", "GraphEdit", Color(0.0, 0.0, 0.0, 0.15));
- p_theme->set_color("grid_minor", "GraphEdit", Color(0.0, 0.0, 0.0, 0.07));
+ float grid_base_brightness = p_config.dark_theme ? 1.0 : 0.0;
+ GraphEdit::GridPattern grid_pattern = (GraphEdit::GridPattern) int(EDITOR_GET("editors/visual_editors/grid_pattern"));
+ switch (grid_pattern) {
+ case GraphEdit::GRID_PATTERN_LINES:
+ p_theme->set_color("grid_major", "GraphEdit", Color(grid_base_brightness, grid_base_brightness, grid_base_brightness, 0.10));
+ p_theme->set_color("grid_minor", "GraphEdit", Color(grid_base_brightness, grid_base_brightness, grid_base_brightness, 0.05));
+ break;
+ case GraphEdit::GRID_PATTERN_DOTS:
+ p_theme->set_color("grid_major", "GraphEdit", Color(grid_base_brightness, grid_base_brightness, grid_base_brightness, 0.07));
+ p_theme->set_color("grid_minor", "GraphEdit", Color(grid_base_brightness, grid_base_brightness, grid_base_brightness, 0.07));
+ break;
+ default:
+ WARN_PRINT("Unknown grid pattern.");
+ break;
}
+
p_theme->set_color("selection_fill", "GraphEdit", p_theme->get_color(SNAME("box_selection_fill_color"), EditorStringName(Editor)));
p_theme->set_color("selection_stroke", "GraphEdit", p_theme->get_color(SNAME("box_selection_stroke_color"), EditorStringName(Editor)));
p_theme->set_color("activity", "GraphEdit", p_config.dark_theme ? Color(1, 1, 1) : Color(0, 0, 0));
@@ -1489,31 +1500,48 @@ void EditorThemeManager::_populate_standard_styles(const Ref &p_the
const int gn_margin_side = 2;
const int gn_margin_bottom = 2;
+ const int gn_corner_radius = 3;
+
const Color gn_bg_color = p_config.dark_theme ? p_config.dark_color_3 : p_config.dark_color_1.lerp(p_config.mono_color, 0.09);
- const Color gn_selected_border_color = gn_bg_color.lerp(p_config.accent_color, 0.275);
+ const Color gn_selected_border_color = p_config.dark_theme ? Color(1, 1, 1) : Color(0, 0, 0);
const Color gn_frame_bg = gn_bg_color.lerp(p_config.tree_panel_style->get_bg_color(), 0.3);
- Ref gn_panel_style = make_flat_stylebox(gn_frame_bg, gn_margin_side, gn_margin_top, gn_margin_side, gn_margin_bottom, p_config.corner_radius);
- gn_panel_style->set_border_width_all(p_config.border_width);
- gn_panel_style->set_border_color(gn_bg_color);
- gn_panel_style->set_corner_radius_individual(0, 0, p_config.corner_radius * EDSCALE, p_config.corner_radius * EDSCALE);
- gn_panel_style->set_expand_margin(SIDE_TOP, 17 * EDSCALE);
+ const bool high_contrast_borders = p_config.draw_extra_borders && p_config.dark_theme;
- Ref gn_panel_selected_style = make_flat_stylebox(gn_frame_bg, gn_margin_side, gn_margin_top, gn_margin_side, gn_margin_bottom, p_config.corner_radius);
- gn_panel_selected_style->set_border_width_all(2 * EDSCALE + p_config.border_width);
+ Ref gn_panel_style = make_flat_stylebox(gn_frame_bg, gn_margin_side, gn_margin_top, gn_margin_side, gn_margin_bottom, p_config.corner_radius);
+ gn_panel_style->set_border_width(SIDE_BOTTOM, 2 * EDSCALE);
+ gn_panel_style->set_border_width(SIDE_LEFT, 2 * EDSCALE);
+ gn_panel_style->set_border_width(SIDE_RIGHT, 2 * EDSCALE);
+ gn_panel_style->set_border_color(high_contrast_borders ? gn_bg_color.lightened(0.2) : gn_bg_color.darkened(0.3));
+ gn_panel_style->set_corner_radius_individual(0, 0, gn_corner_radius * EDSCALE, gn_corner_radius * EDSCALE);
+ gn_panel_style->set_anti_aliased(true);
+
+ Ref gn_panel_selected_style = gn_panel_style->duplicate();
+ gn_panel_selected_style->set_bg_color(p_config.dark_theme ? gn_bg_color.lightened(0.15) : gn_bg_color.darkened(0.15));
+ gn_panel_selected_style->set_border_width(SIDE_TOP, 0);
+ gn_panel_selected_style->set_border_width(SIDE_BOTTOM, 2 * EDSCALE);
+ gn_panel_selected_style->set_border_width(SIDE_LEFT, 2 * EDSCALE);
+ gn_panel_selected_style->set_border_width(SIDE_RIGHT, 2 * EDSCALE);
gn_panel_selected_style->set_border_color(gn_selected_border_color);
- gn_panel_selected_style->set_corner_radius_individual(0, 0, p_config.corner_radius * EDSCALE, p_config.corner_radius * EDSCALE);
- gn_panel_selected_style->set_expand_margin(SIDE_TOP, 17 * EDSCALE);
- const int gn_titlebar_margin_left = 12;
- const int gn_titlebar_margin_right = 4; // The rest is for the close button.
+ const int gn_titlebar_margin_top = 8;
+ const int gn_titlebar_margin_side = 12;
+ const int gn_titlebar_margin_bottom = 8;
- Ref gn_titlebar_style = make_flat_stylebox(gn_bg_color, gn_titlebar_margin_left, gn_margin_top, gn_titlebar_margin_right, 0, p_config.corner_radius);
+ Ref gn_titlebar_style = make_flat_stylebox(gn_bg_color, gn_titlebar_margin_side, gn_titlebar_margin_top, gn_titlebar_margin_side, gn_titlebar_margin_bottom, p_config.corner_radius);
+ gn_titlebar_style->set_border_width(SIDE_TOP, 2 * EDSCALE);
+ gn_titlebar_style->set_border_width(SIDE_LEFT, 2 * EDSCALE);
+ gn_titlebar_style->set_border_width(SIDE_RIGHT, 2 * EDSCALE);
+ gn_titlebar_style->set_border_color(high_contrast_borders ? gn_bg_color.lightened(0.2) : gn_bg_color.darkened(0.3));
gn_titlebar_style->set_expand_margin(SIDE_TOP, 2 * EDSCALE);
- gn_titlebar_style->set_corner_radius_individual(p_config.corner_radius * EDSCALE, p_config.corner_radius * EDSCALE, 0, 0);
-
- Ref gn_titlebar_selected_style = make_flat_stylebox(gn_selected_border_color, gn_titlebar_margin_left, gn_margin_top, gn_titlebar_margin_right, 0, p_config.corner_radius);
- gn_titlebar_selected_style->set_corner_radius_individual(p_config.corner_radius * EDSCALE, p_config.corner_radius * EDSCALE, 0, 0);
+ gn_titlebar_style->set_corner_radius_individual(gn_corner_radius * EDSCALE, gn_corner_radius * EDSCALE, 0, 0);
+ gn_titlebar_style->set_anti_aliased(true);
+
+ Ref gn_titlebar_selected_style = gn_titlebar_style->duplicate();
+ gn_titlebar_selected_style->set_border_color(gn_selected_border_color);
+ gn_titlebar_selected_style->set_border_width(SIDE_TOP, 2 * EDSCALE);
+ gn_titlebar_selected_style->set_border_width(SIDE_LEFT, 2 * EDSCALE);
+ gn_titlebar_selected_style->set_border_width(SIDE_RIGHT, 2 * EDSCALE);
gn_titlebar_selected_style->set_expand_margin(SIDE_TOP, 2 * EDSCALE);
Color gn_decoration_color = p_config.dark_color_1.inverted();
@@ -1540,7 +1568,7 @@ void EditorThemeManager::_populate_standard_styles(const Ref &p_the
p_theme->set_color("resizer_color", "GraphNode", gn_decoration_color);
- p_theme->set_constant("port_h_offset", "GraphNode", 0);
+ p_theme->set_constant("port_h_offset", "GraphNode", 1);
p_theme->set_constant("separation", "GraphNode", 1 * EDSCALE);
Ref port_icon = p_theme->get_icon(SNAME("GuiGraphNodePort"), EditorStringName(EditorIcons));
@@ -1551,7 +1579,11 @@ void EditorThemeManager::_populate_standard_styles(const Ref &p_the
// GraphNode's title Label.
p_theme->set_type_variation("GraphNodeTitleLabel", "Label");
p_theme->set_stylebox("normal", "GraphNodeTitleLabel", make_empty_stylebox(0, 0, 0, 0));
- p_theme->set_color("font_color", "GraphNodeTitleLabel", p_config.font_color);
+ p_theme->set_color("font_color", "GraphNodeTitleLabel", p_config.dark_theme ? p_config.font_color : Color(1, 1, 1)); // Also use a bright font color for light themes.
+ p_theme->set_color("font_shadow_color", "GraphNodeTitleLabel", Color(0, 0, 0, 0.35));
+ p_theme->set_constant("shadow_outline_size", "GraphNodeTitleLabel", 4);
+ p_theme->set_constant("shadow_offset_x", "GraphNodeTitleLabel", 0);
+ p_theme->set_constant("shadow_offset_y", "GraphNodeTitleLabel", 1);
p_theme->set_constant("line_spacing", "GraphNodeTitleLabel", 3 * EDSCALE);
}
}
@@ -2306,6 +2338,59 @@ void EditorThemeManager::_populate_text_editor_styles(const Ref &p_
/* clang-format on */
}
+void EditorThemeManager::_populate_visual_shader_styles(const Ref &p_theme, ThemeConfiguration &p_config) {
+ EditorSettings *ed_settings = EditorSettings::get_singleton();
+ String visual_shader_color_theme = ed_settings->get("editors/visual_editors/color_theme");
+ if (visual_shader_color_theme == "Default") {
+ // Connection type colors
+ ed_settings->set_initial_value("editors/visual_editors/connection_colors/scalar_color", Color(0.55, 0.55, 0.55), true);
+ ed_settings->set_initial_value("editors/visual_editors/connection_colors/vector2_color", Color(0.44, 0.43, 0.64), true);
+ ed_settings->set_initial_value("editors/visual_editors/connection_colors/vector3_color", Color(0.337, 0.314, 0.71), true);
+ ed_settings->set_initial_value("editors/visual_editors/connection_colors/vector4_color", Color(0.7, 0.65, 0.147), true);
+ ed_settings->set_initial_value("editors/visual_editors/connection_colors/boolean_color", Color(0.243, 0.612, 0.349), true);
+ ed_settings->set_initial_value("editors/visual_editors/connection_colors/transform_color", Color(0.71, 0.357, 0.64), true);
+ ed_settings->set_initial_value("editors/visual_editors/connection_colors/sampler_color", Color(0.659, 0.4, 0.137), true);
+
+ // Node category colors (used for the node headers)
+ ed_settings->set_initial_value("editors/visual_editors/category_colors/output_color", Color(0.26, 0.10, 0.15), true);
+ ed_settings->set_initial_value("editors/visual_editors/category_colors/color_color", Color(0.5, 0.5, 0.1), true);
+ ed_settings->set_initial_value("editors/visual_editors/category_colors/conditional_color", Color(0.208, 0.522, 0.298), true);
+ ed_settings->set_initial_value("editors/visual_editors/category_colors/input_color", Color(0.502, 0.2, 0.204), true);
+ ed_settings->set_initial_value("editors/visual_editors/category_colors/scalar_color", Color(0.1, 0.5, 0.6), true);
+ ed_settings->set_initial_value("editors/visual_editors/category_colors/textures_color", Color(0.5, 0.3, 0.1), true);
+ ed_settings->set_initial_value("editors/visual_editors/category_colors/transform_color", Color(0.5, 0.3, 0.5), true);
+ ed_settings->set_initial_value("editors/visual_editors/category_colors/utility_color", Color(0.2, 0.2, 0.2), true);
+ ed_settings->set_initial_value("editors/visual_editors/category_colors/vector_color", Color(0.2, 0.2, 0.5), true);
+ ed_settings->set_initial_value("editors/visual_editors/category_colors/special_color", Color(0.098, 0.361, 0.294), true);
+ ed_settings->set_initial_value("editors/visual_editors/category_colors/particle_color", Color(0.12, 0.358, 0.8), true);
+
+ } else if (visual_shader_color_theme == "Legacy") {
+ // Connection type colors
+ ed_settings->set_initial_value("editors/visual_editors/connection_colors/scalar_color", Color(0.38, 0.85, 0.96), true);
+ ed_settings->set_initial_value("editors/visual_editors/connection_colors/vector2_color", Color(0.74, 0.57, 0.95), true);
+ ed_settings->set_initial_value("editors/visual_editors/connection_colors/vector3_color", Color(0.84, 0.49, 0.93), true);
+ ed_settings->set_initial_value("editors/visual_editors/connection_colors/vector4_color", Color(1.0, 0.125, 0.95), true);
+ ed_settings->set_initial_value("editors/visual_editors/connection_colors/boolean_color", Color(0.55, 0.65, 0.94), true);
+ ed_settings->set_initial_value("editors/visual_editors/connection_colors/transform_color", Color(0.96, 0.66, 0.43), true);
+ ed_settings->set_initial_value("editors/visual_editors/connection_colors/sampler_color", Color(1.0, 1.0, 0.0), true);
+
+ // Node category colors (used for the node headers)
+ Ref gn_panel_style = p_theme->get_stylebox("panel", "GraphNode");
+ Color gn_bg_color = gn_panel_style->get_bg_color();
+ ed_settings->set_initial_value("editors/visual_editors/category_colors/output_color", gn_bg_color, true);
+ ed_settings->set_initial_value("editors/visual_editors/category_colors/color_color", gn_bg_color, true);
+ ed_settings->set_initial_value("editors/visual_editors/category_colors/conditional_color", gn_bg_color, true);
+ ed_settings->set_initial_value("editors/visual_editors/category_colors/input_color", gn_bg_color, true);
+ ed_settings->set_initial_value("editors/visual_editors/category_colors/scalar_color", gn_bg_color, true);
+ ed_settings->set_initial_value("editors/visual_editors/category_colors/textures_color", gn_bg_color, true);
+ ed_settings->set_initial_value("editors/visual_editors/category_colors/transform_color", gn_bg_color, true);
+ ed_settings->set_initial_value("editors/visual_editors/category_colors/utility_color", gn_bg_color, true);
+ ed_settings->set_initial_value("editors/visual_editors/category_colors/vector_color", gn_bg_color, true);
+ ed_settings->set_initial_value("editors/visual_editors/category_colors/special_color", gn_bg_color, true);
+ ed_settings->set_initial_value("editors/visual_editors/category_colors/particle_color", gn_bg_color, true);
+ }
+}
+
void EditorThemeManager::_reset_dirty_flag() {
outdated_cache_dirty = true;
}
@@ -2348,6 +2433,7 @@ bool EditorThemeManager::is_generated_theme_outdated() {
EditorSettings::get_singleton()->check_changed_settings_in_group("interface/editor/code_font") ||
EditorSettings::get_singleton()->check_changed_settings_in_group("interface/touchscreen/increase_scrollbar_touch_area") ||
EditorSettings::get_singleton()->check_changed_settings_in_group("interface/touchscreen/scale_gizmo_handles") ||
+ EditorSettings::get_singleton()->check_changed_settings_in_group("editors/visual_editors") ||
EditorSettings::get_singleton()->check_changed_settings_in_group("text_editor/theme") ||
EditorSettings::get_singleton()->check_changed_settings_in_group("text_editor/help/help") ||
EditorSettings::get_singleton()->check_changed_settings_in_group("docks/property_editor/subresource_hue_tint") ||
diff --git a/editor/themes/editor_theme_manager.h b/editor/themes/editor_theme_manager.h
index de088a1011ad..3eb1dd5ffdc1 100644
--- a/editor/themes/editor_theme_manager.h
+++ b/editor/themes/editor_theme_manager.h
@@ -156,6 +156,7 @@ class EditorThemeManager {
static void _generate_text_editor_defaults(ThemeConfiguration &p_config);
static void _populate_text_editor_styles(const Ref &p_theme, ThemeConfiguration &p_config);
+ static void _populate_visual_shader_styles(const Ref &p_theme, ThemeConfiguration &p_config);
static void _reset_dirty_flag();
diff --git a/scene/gui/graph_edit.cpp b/scene/gui/graph_edit.cpp
index c23d21775fde..b7118d595fb3 100644
--- a/scene/gui/graph_edit.cpp
+++ b/scene/gui/graph_edit.cpp
@@ -52,6 +52,7 @@ constexpr int MINIMAP_PADDING = 5;
constexpr int MIN_DRAG_DISTANCE_FOR_VALID_CONNECTION = 20;
constexpr int MAX_CONNECTION_LINE_CURVE_TESSELATION_STAGES = 5;
constexpr int GRID_MINOR_STEPS_PER_MAJOR_LINE = 10;
+constexpr int GRID_MINOR_STEPS_PER_MAJOR_DOT = 5;
constexpr int GRID_MIN_SNAPPING_DISTANCE = 2;
constexpr int GRID_MAX_SNAPPING_DISTANCE = 100;
@@ -1349,13 +1350,13 @@ void GraphEdit::_draw_grid() {
} break;
case GRID_PATTERN_DOTS: {
Color transparent_grid_minor = theme_cache.grid_minor;
- transparent_grid_minor.a *= CLAMP(2 * (zoom - 0.4), 0, 1);
+ transparent_grid_minor.a *= CLAMP(1.0 * (zoom - 0.4), 0, 1);
for (int i = from_pos.x; i < from_pos.x + len.x; i++) {
for (int j = from_pos.y; j < from_pos.y + len.y; j++) {
Color color = transparent_grid_minor;
- if (ABS(i) % GRID_MINOR_STEPS_PER_MAJOR_LINE == 0 && ABS(j) % GRID_MINOR_STEPS_PER_MAJOR_LINE == 0) {
+ if (ABS(i) % GRID_MINOR_STEPS_PER_MAJOR_DOT == 0 && ABS(j) % GRID_MINOR_STEPS_PER_MAJOR_DOT == 0) {
color = theme_cache.grid_major;
}
diff --git a/scene/resources/visual_shader.cpp b/scene/resources/visual_shader.cpp
index 218ca6322adc..c7c2ddbb18d1 100644
--- a/scene/resources/visual_shader.cpp
+++ b/scene/resources/visual_shader.cpp
@@ -403,6 +403,11 @@ String VisualShaderNode::get_warning(Shader::Mode p_mode, VisualShader::Type p_t
return String();
}
+VisualShaderNode::Category VisualShaderNode::get_category() const {
+ WARN_PRINT(get_caption() + " is missing a category.");
+ return CATEGORY_NONE;
+}
+
bool VisualShaderNode::is_input_port_default(int p_port, Shader::Mode p_mode) const {
return false;
}
diff --git a/scene/resources/visual_shader.h b/scene/resources/visual_shader.h
index d4d77e7609c4..09ea9a8890fa 100644
--- a/scene/resources/visual_shader.h
+++ b/scene/resources/visual_shader.h
@@ -255,6 +255,37 @@ VARIANT_ENUM_CAST(VisualShader::VaryingType)
class VisualShaderNode : public Resource {
GDCLASS(VisualShaderNode, Resource);
+public:
+ enum PortType {
+ PORT_TYPE_SCALAR,
+ PORT_TYPE_SCALAR_INT,
+ PORT_TYPE_SCALAR_UINT,
+ PORT_TYPE_VECTOR_2D,
+ PORT_TYPE_VECTOR_3D,
+ PORT_TYPE_VECTOR_4D,
+ PORT_TYPE_BOOLEAN,
+ PORT_TYPE_TRANSFORM,
+ PORT_TYPE_SAMPLER,
+ PORT_TYPE_MAX,
+ };
+
+ enum Category {
+ CATEGORY_NONE,
+ CATEGORY_OUTPUT,
+ CATEGORY_COLOR,
+ CATEGORY_CONDITIONAL,
+ CATEGORY_INPUT,
+ CATEGORY_SCALAR,
+ CATEGORY_TEXTURES,
+ CATEGORY_TRANSFORM,
+ CATEGORY_UTILITY,
+ CATEGORY_VECTOR,
+ CATEGORY_SPECIAL,
+ CATEGORY_PARTICLE,
+ CATEGORY_MAX
+ };
+
+private:
int port_preview = -1;
HashMap connected_input_ports;
@@ -270,19 +301,6 @@ class VisualShaderNode : public Resource {
static void _bind_methods();
public:
- enum PortType {
- PORT_TYPE_SCALAR,
- PORT_TYPE_SCALAR_INT,
- PORT_TYPE_SCALAR_UINT,
- PORT_TYPE_VECTOR_2D,
- PORT_TYPE_VECTOR_3D,
- PORT_TYPE_VECTOR_4D,
- PORT_TYPE_BOOLEAN,
- PORT_TYPE_TRANSFORM,
- PORT_TYPE_SAMPLER,
- PORT_TYPE_MAX,
- };
-
bool is_simple_decl() const;
virtual String get_caption() const = 0;
@@ -348,6 +366,8 @@ class VisualShaderNode : public Resource {
virtual String get_warning(Shader::Mode p_mode, VisualShader::Type p_type) const;
+ virtual Category get_category() const;
+
VisualShaderNode();
};
@@ -507,6 +527,8 @@ class VisualShaderNodeInput : public VisualShaderNode {
virtual Vector get_editable_properties() const override;
+ virtual Category get_category() const override { return CATEGORY_INPUT; }
+
VisualShaderNodeInput();
};
@@ -546,6 +568,8 @@ class VisualShaderNodeOutput : public VisualShaderNode {
virtual String generate_code(Shader::Mode p_mode, VisualShader::Type p_type, int p_id, const String *p_input_vars, const String *p_output_vars, bool p_for_preview = false) const override;
+ virtual Category get_category() const override { return CATEGORY_OUTPUT; }
+
VisualShaderNodeOutput();
};
@@ -589,6 +613,8 @@ class VisualShaderNodeParameter : public VisualShaderNode {
virtual Vector get_editable_properties() const override;
virtual String get_warning(Shader::Mode p_mode, VisualShader::Type p_type) const override;
+ virtual Category get_category() const override { return CATEGORY_INPUT; }
+
VisualShaderNodeParameter();
};
@@ -661,6 +687,8 @@ class VisualShaderNodeParameterRef : public VisualShaderNode {
virtual String generate_code(Shader::Mode p_mode, VisualShader::Type p_type, int p_id, const String *p_input_vars, const String *p_output_vars, bool p_for_preview = false) const override;
+ virtual Category get_category() const override { return CATEGORY_INPUT; }
+
VisualShaderNodeParameterRef();
};
@@ -713,6 +741,8 @@ class VisualShaderNodeComment : public VisualShaderNodeResizableBase {
void set_description(const String &p_description);
String get_description() const;
+ virtual Category get_category() const override { return CATEGORY_SPECIAL; }
+
VisualShaderNodeComment();
};
@@ -781,6 +811,8 @@ class VisualShaderNodeGroupBase : public VisualShaderNodeResizableBase {
virtual String generate_code(Shader::Mode p_mode, VisualShader::Type p_type, int p_id, const String *p_input_vars, const String *p_output_vars, bool p_for_preview = false) const override;
+ virtual Category get_category() const override { return CATEGORY_SPECIAL; }
+
VisualShaderNodeGroupBase();
};
@@ -887,6 +919,8 @@ class VisualShaderNodeVaryingSetter : public VisualShaderNodeVarying {
virtual String generate_code(Shader::Mode p_mode, VisualShader::Type p_type, int p_id, const String *p_input_vars, const String *p_output_vars, bool p_for_preview = false) const override;
+ virtual Category get_category() const override { return CATEGORY_OUTPUT; }
+
VisualShaderNodeVaryingSetter();
};
@@ -907,6 +941,8 @@ class VisualShaderNodeVaryingGetter : public VisualShaderNodeVarying {
virtual String generate_code(Shader::Mode p_mode, VisualShader::Type p_type, int p_id, const String *p_input_vars, const String *p_output_vars, bool p_for_preview = false) const override;
+ virtual Category get_category() const override { return CATEGORY_INPUT; }
+
VisualShaderNodeVaryingGetter();
};
diff --git a/scene/resources/visual_shader_nodes.h b/scene/resources/visual_shader_nodes.h
index 67e2c4633d9f..05c8fbd16c2a 100644
--- a/scene/resources/visual_shader_nodes.h
+++ b/scene/resources/visual_shader_nodes.h
@@ -76,6 +76,8 @@ class VisualShaderNodeVectorBase : public VisualShaderNode {
virtual Vector get_editable_properties() const override;
+ virtual Category get_category() const override { return CATEGORY_VECTOR; }
+
VisualShaderNodeVectorBase();
};
@@ -101,6 +103,8 @@ class VisualShaderNodeConstant : public VisualShaderNode {
virtual String generate_code(Shader::Mode p_mode, VisualShader::Type p_type, int p_id, const String *p_input_vars, const String *p_output_vars, bool p_for_preview = false) const override = 0;
+ virtual Category get_category() const override { return CATEGORY_INPUT; }
+
VisualShaderNodeConstant();
};
@@ -437,6 +441,8 @@ class VisualShaderNodeTexture : public VisualShaderNode {
virtual String get_warning(Shader::Mode p_mode, VisualShader::Type p_type) const override;
+ virtual Category get_category() const override { return CATEGORY_TEXTURES; }
+
VisualShaderNodeTexture();
};
@@ -473,6 +479,8 @@ class VisualShaderNodeCurveTexture : public VisualShaderNodeResizableBase {
virtual Vector get_editable_properties() const override;
virtual bool is_use_prop_slots() const override;
+ virtual Category get_category() const override { return CATEGORY_TEXTURES; }
+
VisualShaderNodeCurveTexture();
};
@@ -543,6 +551,8 @@ class VisualShaderNodeSample3D : public VisualShaderNode {
virtual String get_warning(Shader::Mode p_mode, VisualShader::Type p_type) const override;
+ virtual Category get_category() const override { return CATEGORY_TEXTURES; }
+
VisualShaderNodeSample3D();
};
@@ -671,8 +681,11 @@ class VisualShaderNodeLinearSceneDepth : public VisualShaderNode {
virtual bool has_output_port_preview(int p_port) const override;
virtual String generate_global(Shader::Mode p_mode, VisualShader::Type p_type, int p_id) const override;
+
virtual String generate_code(Shader::Mode p_mode, VisualShader::Type p_type, int p_id, const String *p_input_vars, const String *p_output_vars, bool p_for_preview = false) const override;
+ virtual Category get_category() const override { return CATEGORY_TEXTURES; }
+
VisualShaderNodeLinearSceneDepth();
};
@@ -695,6 +708,8 @@ class VisualShaderNodeWorldPositionFromDepth : public VisualShaderNode {
virtual String generate_global(Shader::Mode p_mode, VisualShader::Type p_type, int p_id) const override;
virtual String generate_code(Shader::Mode p_mode, VisualShader::Type p_type, int p_id, const String *p_input_vars, const String *p_output_vars, bool p_for_preview = false) const override;
+ virtual Category get_category() const override { return CATEGORY_TEXTURES; }
+
VisualShaderNodeWorldPositionFromDepth();
};
@@ -717,6 +732,8 @@ class VisualShaderNodeScreenNormalWorldSpace : public VisualShaderNode {
virtual String generate_global(Shader::Mode p_mode, VisualShader::Type p_type, int p_id) const override;
virtual String generate_code(Shader::Mode p_mode, VisualShader::Type p_type, int p_id, const String *p_input_vars, const String *p_output_vars, bool p_for_preview = false) const override;
+ virtual Category get_category() const override { return CATEGORY_TEXTURES; }
+
VisualShaderNodeScreenNormalWorldSpace();
};
@@ -765,6 +782,8 @@ class VisualShaderNodeFloatOp : public VisualShaderNode {
virtual Vector get_editable_properties() const override;
+ virtual Category get_category() const override { return CATEGORY_SCALAR; }
+
VisualShaderNodeFloatOp();
};
@@ -957,6 +976,8 @@ class VisualShaderNodeColorOp : public VisualShaderNode {
virtual Vector get_editable_properties() const override;
+ virtual Category get_category() const override { return CATEGORY_COLOR; }
+
VisualShaderNodeColorOp();
};
@@ -1006,6 +1027,8 @@ class VisualShaderNodeTransformOp : public VisualShaderNode {
virtual Vector get_editable_properties() const override;
+ virtual Category get_category() const override { return CATEGORY_TRANSFORM; }
+
VisualShaderNodeTransformOp();
};
@@ -1050,6 +1073,8 @@ class VisualShaderNodeTransformVecMult : public VisualShaderNode {
virtual Vector get_editable_properties() const override;
+ virtual Category get_category() const override { return CATEGORY_TRANSFORM; }
+
VisualShaderNodeTransformVecMult();
};
@@ -1122,6 +1147,8 @@ class VisualShaderNodeFloatFunc : public VisualShaderNode {
virtual Vector get_editable_properties() const override;
+ virtual Category get_category() const override { return CATEGORY_SCALAR; }
+
VisualShaderNodeFloatFunc();
};
@@ -1166,6 +1193,8 @@ class VisualShaderNodeIntFunc : public VisualShaderNode {
virtual Vector get_editable_properties() const override;
+ virtual Category get_category() const override { return CATEGORY_SCALAR; }
+
VisualShaderNodeIntFunc();
};
@@ -1208,6 +1237,8 @@ class VisualShaderNodeUIntFunc : public VisualShaderNode {
virtual Vector get_editable_properties() const override;
+ virtual Category get_category() const override { return CATEGORY_SCALAR; }
+
VisualShaderNodeUIntFunc();
};
@@ -1327,6 +1358,8 @@ class VisualShaderNodeColorFunc : public VisualShaderNode {
virtual Vector get_editable_properties() const override;
+ virtual Category get_category() const override { return CATEGORY_COLOR; }
+
VisualShaderNodeColorFunc();
};
@@ -1369,6 +1402,8 @@ class VisualShaderNodeTransformFunc : public VisualShaderNode {
virtual Vector get_editable_properties() const override;
+ virtual Category get_category() const override { return CATEGORY_TRANSFORM; }
+
VisualShaderNodeTransformFunc();
};
@@ -1414,6 +1449,8 @@ class VisualShaderNodeUVFunc : public VisualShaderNode {
virtual Vector get_editable_properties() const override;
+ virtual Category get_category() const override { return CATEGORY_TEXTURES; }
+
VisualShaderNodeUVFunc();
};
@@ -1440,6 +1477,8 @@ class VisualShaderNodeUVPolarCoord : public VisualShaderNode {
virtual String generate_code(Shader::Mode p_mode, VisualShader::Type p_type, int p_id, const String *p_input_vars, const String *p_output_vars, bool p_for_preview = false) const override;
+ virtual Category get_category() const override { return CATEGORY_TEXTURES; }
+
VisualShaderNodeUVPolarCoord();
};
@@ -1620,6 +1659,8 @@ class VisualShaderNodeDerivativeFunc : public VisualShaderNode {
virtual Vector get_editable_properties() const override;
+ virtual Category get_category() const override { return CATEGORY_UTILITY; }
+
VisualShaderNodeDerivativeFunc();
};
@@ -1669,6 +1710,8 @@ class VisualShaderNodeOuterProduct : public VisualShaderNode {
virtual String generate_code(Shader::Mode p_mode, VisualShader::Type p_type, int p_id, const String *p_input_vars, const String *p_output_vars, bool p_for_preview = false) const override;
+ virtual Category get_category() const override { return CATEGORY_TRANSFORM; }
+
VisualShaderNodeOuterProduct();
};
@@ -1714,6 +1757,14 @@ class VisualShaderNodeStep : public VisualShaderNode {
virtual String generate_code(Shader::Mode p_mode, VisualShader::Type p_type, int p_id, const String *p_input_vars, const String *p_output_vars, bool p_for_preview = false) const override;
+ virtual Category get_category() const override {
+ if (op_type == OP_TYPE_SCALAR) {
+ return CATEGORY_SCALAR;
+ } else {
+ return CATEGORY_VECTOR;
+ }
+ }
+
VisualShaderNodeStep();
};
@@ -1761,6 +1812,14 @@ class VisualShaderNodeSmoothStep : public VisualShaderNode {
virtual String generate_code(Shader::Mode p_mode, VisualShader::Type p_type, int p_id, const String *p_input_vars, const String *p_output_vars, bool p_for_preview = false) const override;
+ virtual Category get_category() const override {
+ if (op_type == OP_TYPE_SCALAR) {
+ return CATEGORY_SCALAR;
+ } else {
+ return CATEGORY_VECTOR;
+ }
+ }
+
VisualShaderNodeSmoothStep();
};
@@ -1852,6 +1911,14 @@ class VisualShaderNodeMix : public VisualShaderNode {
virtual String generate_code(Shader::Mode p_mode, VisualShader::Type p_type, int p_id, const String *p_input_vars, const String *p_output_vars, bool p_for_preview = false) const override;
+ virtual Category get_category() const override {
+ if (op_type == OP_TYPE_SCALAR) {
+ return CATEGORY_SCALAR;
+ } else {
+ return CATEGORY_VECTOR;
+ }
+ }
+
VisualShaderNodeMix();
};
@@ -1898,6 +1965,8 @@ class VisualShaderNodeTransformCompose : public VisualShaderNode {
virtual String generate_code(Shader::Mode p_mode, VisualShader::Type p_type, int p_id, const String *p_input_vars, const String *p_output_vars, bool p_for_preview = false) const override;
+ virtual Category get_category() const override { return CATEGORY_TRANSFORM; }
+
VisualShaderNodeTransformCompose();
};
@@ -1921,6 +1990,8 @@ class VisualShaderNodeVectorDecompose : public VisualShaderNodeVectorBase {
virtual void set_op_type(OpType p_op_type) override;
virtual String generate_code(Shader::Mode p_mode, VisualShader::Type p_type, int p_id, const String *p_input_vars, const String *p_output_vars, bool p_for_preview = false) const override;
+ virtual Category get_category() const override { return CATEGORY_VECTOR; }
+
VisualShaderNodeVectorDecompose();
};
@@ -1942,6 +2013,8 @@ class VisualShaderNodeTransformDecompose : public VisualShaderNode {
virtual String generate_code(Shader::Mode p_mode, VisualShader::Type p_type, int p_id, const String *p_input_vars, const String *p_output_vars, bool p_for_preview = false) const override;
+ virtual Category get_category() const override { return CATEGORY_TRANSFORM; }
+
VisualShaderNodeTransformDecompose();
};
@@ -2584,6 +2657,8 @@ class VisualShaderNodeIf : public VisualShaderNode {
virtual String generate_code(Shader::Mode p_mode, VisualShader::Type p_type, int p_id, const String *p_input_vars, const String *p_output_vars, bool p_for_preview = false) const override;
+ virtual Category get_category() const override { return CATEGORY_CONDITIONAL; }
+
VisualShaderNodeIf();
};
@@ -2630,6 +2705,8 @@ class VisualShaderNodeSwitch : public VisualShaderNode {
virtual String generate_code(Shader::Mode p_mode, VisualShader::Type p_type, int p_id, const String *p_input_vars, const String *p_output_vars, bool p_for_preview = false) const override;
+ virtual Category get_category() const override { return CATEGORY_CONDITIONAL; }
+
VisualShaderNodeSwitch();
};
@@ -2698,6 +2775,8 @@ class VisualShaderNodeIs : public VisualShaderNode {
virtual Vector get_editable_properties() const override;
+ virtual Category get_category() const override { return CATEGORY_CONDITIONAL; }
+
VisualShaderNodeIs();
};
@@ -2772,6 +2851,8 @@ class VisualShaderNodeCompare : public VisualShaderNode {
virtual Vector get_editable_properties() const override;
virtual String get_warning(Shader::Mode p_mode, VisualShader::Type p_type) const override;
+ virtual Category get_category() const override { return CATEGORY_CONDITIONAL; }
+
VisualShaderNodeCompare();
};
@@ -2815,6 +2896,14 @@ class VisualShaderNodeMultiplyAdd : public VisualShaderNode {
virtual Vector get_editable_properties() const override;
+ virtual Category get_category() const override {
+ if (op_type == OP_TYPE_SCALAR) {
+ return CATEGORY_SCALAR;
+ } else {
+ return CATEGORY_VECTOR;
+ }
+ }
+
VisualShaderNodeMultiplyAdd();
};
@@ -2862,6 +2951,8 @@ class VisualShaderNodeBillboard : public VisualShaderNode {
virtual Vector get_editable_properties() const override;
+ virtual Category get_category() const override { return CATEGORY_UTILITY; }
+
VisualShaderNodeBillboard();
};
@@ -2888,6 +2979,8 @@ class VisualShaderNodeDistanceFade : public VisualShaderNode {
virtual String generate_code(Shader::Mode p_mode, VisualShader::Type p_type, int p_id, const String *p_input_vars, const String *p_output_vars, bool p_for_preview = false) const override;
+ virtual Category get_category() const override { return CATEGORY_UTILITY; }
+
VisualShaderNodeDistanceFade();
};
@@ -2909,6 +3002,8 @@ class VisualShaderNodeProximityFade : public VisualShaderNode {
virtual String generate_global(Shader::Mode p_mode, VisualShader::Type p_type, int p_id) const override;
virtual String generate_code(Shader::Mode p_mode, VisualShader::Type p_type, int p_id, const String *p_input_vars, const String *p_output_vars, bool p_for_preview = false) const override;
+ virtual Category get_category() const override { return CATEGORY_UTILITY; }
+
VisualShaderNodeProximityFade();
};
@@ -2929,6 +3024,8 @@ class VisualShaderNodeRandomRange : public VisualShaderNode {
virtual String generate_global_per_node(Shader::Mode p_mode, int p_id) const override;
virtual String generate_code(Shader::Mode p_mode, VisualShader::Type p_type, int p_id, const String *p_input_vars, const String *p_output_vars, bool p_for_preview = false) const override;
+ virtual Category get_category() const override { return CATEGORY_UTILITY; }
+
VisualShaderNodeRandomRange();
};
@@ -2948,6 +3045,8 @@ class VisualShaderNodeRemap : public VisualShaderNode {
virtual String generate_code(Shader::Mode p_mode, VisualShader::Type p_type, int p_id, const String *p_input_vars, const String *p_output_vars, bool p_for_preview = false) const override;
+ virtual Category get_category() const override { return CATEGORY_UTILITY; }
+
VisualShaderNodeRemap();
};
@@ -2968,6 +3067,8 @@ class VisualShaderNodeRotationByAxis : public VisualShaderNode {
virtual String generate_code(Shader::Mode p_mode, VisualShader::Type p_type, int p_id, const String *p_input_vars, const String *p_output_vars, bool p_for_preview = false) const override;
+ virtual Category get_category() const override { return CATEGORY_UTILITY; }
+
VisualShaderNodeRotationByAxis();
};
diff --git a/scene/resources/visual_shader_particle_nodes.h b/scene/resources/visual_shader_particle_nodes.h
index 652b5dff030d..23d06d4b7c35 100644
--- a/scene/resources/visual_shader_particle_nodes.h
+++ b/scene/resources/visual_shader_particle_nodes.h
@@ -57,6 +57,8 @@ class VisualShaderNodeParticleEmitter : public VisualShaderNode {
virtual HashMap get_editable_properties_names() const override;
bool is_show_prop_names() const override;
+ virtual Category get_category() const override { return CATEGORY_PARTICLE; }
+
VisualShaderNodeParticleEmitter();
};
@@ -73,6 +75,8 @@ class VisualShaderNodeParticleSphereEmitter : public VisualShaderNodeParticleEmi
virtual String generate_global_per_node(Shader::Mode p_mode, int p_id) const override;
virtual String generate_code(Shader::Mode p_mode, VisualShader::Type p_type, int p_id, const String *p_input_vars, const String *p_output_vars, bool p_for_preview = false) const override;
+ virtual Category get_category() const override { return CATEGORY_PARTICLE; }
+
VisualShaderNodeParticleSphereEmitter();
};
@@ -90,6 +94,8 @@ class VisualShaderNodeParticleBoxEmitter : public VisualShaderNodeParticleEmitte
virtual String generate_global_per_node(Shader::Mode p_mode, int p_id) const override;
virtual String generate_code(Shader::Mode p_mode, VisualShader::Type p_type, int p_id, const String *p_input_vars, const String *p_output_vars, bool p_for_preview = false) const override;
+ virtual Category get_category() const override { return CATEGORY_PARTICLE; }
+
VisualShaderNodeParticleBoxEmitter();
};
@@ -106,6 +112,8 @@ class VisualShaderNodeParticleRingEmitter : public VisualShaderNodeParticleEmitt
virtual String generate_global_per_node(Shader::Mode p_mode, int p_id) const override;
virtual String generate_code(Shader::Mode p_mode, VisualShader::Type p_type, int p_id, const String *p_input_vars, const String *p_output_vars, bool p_for_preview = false) const override;
+ virtual Category get_category() const override { return CATEGORY_PARTICLE; }
+
VisualShaderNodeParticleRingEmitter();
};
@@ -158,6 +166,8 @@ class VisualShaderNodeParticleMeshEmitter : public VisualShaderNodeParticleEmitt
HashMap get_editable_properties_names() const override;
Vector get_default_texture_parameters(VisualShader::Type p_type, int p_id) const override;
+ virtual Category get_category() const override { return CATEGORY_PARTICLE; }
+
VisualShaderNodeParticleMeshEmitter();
};
@@ -187,6 +197,8 @@ class VisualShaderNodeParticleMultiplyByAxisAngle : public VisualShaderNode {
bool is_degrees_mode() const;
Vector get_editable_properties() const override;
+ virtual Category get_category() const override { return CATEGORY_PARTICLE; }
+
VisualShaderNodeParticleMultiplyByAxisAngle();
};
@@ -207,6 +219,8 @@ class VisualShaderNodeParticleConeVelocity : public VisualShaderNode {
virtual String generate_code(Shader::Mode p_mode, VisualShader::Type p_type, int p_id, const String *p_input_vars, const String *p_output_vars, bool p_for_preview = false) const override;
+ virtual Category get_category() const override { return CATEGORY_PARTICLE; }
+
VisualShaderNodeParticleConeVelocity();
};
@@ -248,6 +262,8 @@ class VisualShaderNodeParticleRandomness : public VisualShaderNode {
void set_op_type(OpType p_type);
OpType get_op_type() const;
+ virtual Category get_category() const override { return CATEGORY_PARTICLE; }
+
VisualShaderNodeParticleRandomness();
};
@@ -290,6 +306,8 @@ class VisualShaderNodeParticleAccelerator : public VisualShaderNode {
void set_mode(Mode p_mode);
Mode get_mode() const;
+ virtual Category get_category() const override { return CATEGORY_PARTICLE; }
+
VisualShaderNodeParticleAccelerator();
};
@@ -352,6 +370,8 @@ class VisualShaderNodeParticleEmit : public VisualShaderNode {
virtual bool is_input_port_default(int p_port, Shader::Mode p_mode) const override;
virtual String generate_code(Shader::Mode p_mode, VisualShader::Type p_type, int p_id, const String *p_input_vars, const String *p_output_vars, bool p_for_preview = false) const override;
+ virtual Category get_category() const override { return CATEGORY_PARTICLE; }
+
VisualShaderNodeParticleEmit();
};