From 07065d67e12d2fb0923c3fc892234a9142f9c9e6 Mon Sep 17 00:00:00 2001 From: kobewi Date: Fri, 17 Sep 2021 16:35:24 +0200 Subject: [PATCH] Infer shader type based on edited node --- editor/editor_properties.cpp | 33 +++++++++++++++++++++++++++++++ editor/editor_properties.h | 1 + editor/editor_resource_picker.cpp | 6 +++++- editor/editor_resource_picker.h | 2 ++ editor/scene_tree_dock.cpp | 8 ++++---- editor/scene_tree_dock.h | 4 ++-- editor/shader_create_dialog.cpp | 7 ++++++- editor/shader_create_dialog.h | 2 +- 8 files changed, 54 insertions(+), 9 deletions(-) diff --git a/editor/editor_properties.cpp b/editor/editor_properties.cpp index e679222567..7f6b7d334c 100644 --- a/editor/editor_properties.cpp +++ b/editor/editor_properties.cpp @@ -35,6 +35,9 @@ #include "editor_node.h" #include "editor_properties_array_dict.h" #include "editor_scale.h" +#include "scene/2d/gpu_particles_2d.h" +#include "scene/3d/fog_volume.h" +#include "scene/3d/gpu_particles_3d.h" #include "scene/main/window.h" #include "scene/resources/font.h" @@ -2969,6 +2972,35 @@ void EditorPropertyResource::_update_property_bg() { update(); } +void EditorPropertyResource::_update_preferred_shader() { + Node *parent = get_parent(); + EditorProperty *parent_property = nullptr; + + while (parent && !parent_property) { + parent_property = Object::cast_to(parent); + parent = parent->get_parent(); + } + + if (parent_property) { + EditorShaderPicker *shader_picker = Object::cast_to(resource_picker); + Object *object = parent_property->get_edited_object(); + const StringName &property = parent_property->get_edited_property(); + + // Set preferred shader based on edited parent type. + if ((Object::cast_to(object) || Object::cast_to(object)) && property == SNAME("process_material")) { + shader_picker->set_preferred_mode(Shader::MODE_PARTICLES); + } else if (Object::cast_to(object)) { + shader_picker->set_preferred_mode(Shader::MODE_FOG); + } else if (Object::cast_to(object)) { + shader_picker->set_preferred_mode(Shader::MODE_CANVAS_ITEM); + } else if (Object::cast_to(object)) { + shader_picker->set_preferred_mode(Shader::MODE_SPATIAL); + } else if (Object::cast_to(object)) { + shader_picker->set_preferred_mode(Shader::MODE_SKY); + } + } +} + void EditorPropertyResource::_viewport_selected(const NodePath &p_path) { Node *to_node = get_node(p_path); if (!Object::cast_to(to_node)) { @@ -3000,6 +3032,7 @@ void EditorPropertyResource::setup(Object *p_object, const String &p_path, const EditorShaderPicker *shader_picker = memnew(EditorShaderPicker); shader_picker->set_edited_material(Object::cast_to(p_object)); resource_picker = shader_picker; + connect(SNAME("ready"), callable_mp(this, &EditorPropertyResource::_update_preferred_shader)); } else { resource_picker = memnew(EditorResourcePicker); } diff --git a/editor/editor_properties.h b/editor/editor_properties.h index 9a687f1a72..e6e00cbdf1 100644 --- a/editor/editor_properties.h +++ b/editor/editor_properties.h @@ -669,6 +669,7 @@ class EditorPropertyResource : public EditorProperty { void _open_editor_pressed(); void _fold_other_editors(Object *p_self); void _update_property_bg(); + void _update_preferred_shader(); protected: virtual void _set_read_only(bool p_read_only) override; diff --git a/editor/editor_resource_picker.cpp b/editor/editor_resource_picker.cpp index 9dbf69a779..ca6c2e931a 100644 --- a/editor/editor_resource_picker.cpp +++ b/editor/editor_resource_picker.cpp @@ -934,7 +934,7 @@ bool EditorShaderPicker::handle_menu_selected(int p_which) { switch (p_which) { case OBJ_MENU_NEW_SHADER: { if (material.is_valid()) { - EditorNode::get_singleton()->get_scene_tree_dock()->open_shader_dialog(material); + EditorNode::get_singleton()->get_scene_tree_dock()->open_shader_dialog(material, preferred_mode); return true; } } break; @@ -952,5 +952,9 @@ ShaderMaterial *EditorShaderPicker::get_edited_material() const { return edited_material; } +void EditorShaderPicker::set_preferred_mode(int p_mode) { + preferred_mode = p_mode; +} + EditorShaderPicker::EditorShaderPicker() { } diff --git a/editor/editor_resource_picker.h b/editor/editor_resource_picker.h index d0dad0287b..f55c6f47f3 100644 --- a/editor/editor_resource_picker.h +++ b/editor/editor_resource_picker.h @@ -156,6 +156,7 @@ class EditorShaderPicker : public EditorResourcePicker { }; ShaderMaterial *edited_material = nullptr; + int preferred_mode = -1; public: virtual void set_create_options(Object *p_menu_node) override; @@ -163,6 +164,7 @@ public: void set_edited_material(ShaderMaterial *p_material); ShaderMaterial *get_edited_material() const; + void set_preferred_mode(int p_preferred_mode); EditorShaderPicker(); }; diff --git a/editor/scene_tree_dock.cpp b/editor/scene_tree_dock.cpp index 4a59eb4fb3..336a0e4c37 100644 --- a/editor/scene_tree_dock.cpp +++ b/editor/scene_tree_dock.cpp @@ -2943,7 +2943,7 @@ void SceneTreeDock::open_script_dialog(Node *p_for_node, bool p_extend) { } } -void SceneTreeDock::attach_shader_to_selected() { +void SceneTreeDock::attach_shader_to_selected(int p_preferred_mode) { if (selected_shader_material.is_null()) { return; } @@ -2970,13 +2970,13 @@ void SceneTreeDock::attach_shader_to_selected() { shader_create_dialog->connect("shader_created", callable_mp(this, &SceneTreeDock::_shader_created)); shader_create_dialog->connect("confirmed", callable_mp(this, &SceneTreeDock::_shader_creation_closed)); shader_create_dialog->connect("cancelled", callable_mp(this, &SceneTreeDock::_shader_creation_closed)); - shader_create_dialog->config(path); + shader_create_dialog->config(path, true, true, p_preferred_mode); shader_create_dialog->popup_centered(); } -void SceneTreeDock::open_shader_dialog(Ref &p_for_material) { +void SceneTreeDock::open_shader_dialog(Ref &p_for_material, int p_preferred_mode) { selected_shader_material = p_for_material; - attach_shader_to_selected(); + attach_shader_to_selected(p_preferred_mode); } void SceneTreeDock::open_add_child_dialog() { diff --git a/editor/scene_tree_dock.h b/editor/scene_tree_dock.h index 66000602fa..8de9884019 100644 --- a/editor/scene_tree_dock.h +++ b/editor/scene_tree_dock.h @@ -300,8 +300,8 @@ public: void attach_script_to_selected(bool p_extend); void open_script_dialog(Node *p_for_node, bool p_extend); - void attach_shader_to_selected(); - void open_shader_dialog(Ref &p_for_material); + void attach_shader_to_selected(int p_preferred_mode = -1); + void open_shader_dialog(Ref &p_for_material, int p_preferred_mode = -1); void open_add_child_dialog(); void open_instance_child_dialog(); diff --git a/editor/shader_create_dialog.cpp b/editor/shader_create_dialog.cpp index 8b02544156..23bdc06f95 100644 --- a/editor/shader_create_dialog.cpp +++ b/editor/shader_create_dialog.cpp @@ -324,7 +324,7 @@ void ShaderCreateDialog::_path_submitted(const String &p_path) { ok_pressed(); } -void ShaderCreateDialog::config(const String &p_base_path, bool p_built_in_enabled, bool p_load_enabled) { +void ShaderCreateDialog::config(const String &p_base_path, bool p_built_in_enabled, bool p_load_enabled, int p_preferred_mode) { if (p_base_path != "") { initial_base_path = p_base_path.get_basename(); file_path->set_text(initial_base_path + "." + language_data[language_menu->get_selected()].default_extension); @@ -338,6 +338,11 @@ void ShaderCreateDialog::config(const String &p_base_path, bool p_built_in_enabl built_in_enabled = p_built_in_enabled; load_enabled = p_load_enabled; + if (p_preferred_mode > -1) { + mode_menu->select(p_preferred_mode); + _mode_changed(p_preferred_mode); + } + _language_changed(current_language); _path_changed(file_path->get_text()); } diff --git a/editor/shader_create_dialog.h b/editor/shader_create_dialog.h index 6962fa3d8d..be0a0cad06 100644 --- a/editor/shader_create_dialog.h +++ b/editor/shader_create_dialog.h @@ -108,7 +108,7 @@ protected: static void _bind_methods(); public: - void config(const String &p_base_path, bool p_built_in_enabled = true, bool p_load_enabled = true); + void config(const String &p_base_path, bool p_built_in_enabled = true, bool p_load_enabled = true, int p_preferred_mode = -1); ShaderCreateDialog(); };