Infer shader type based on edited node

This commit is contained in:
kobewi 2021-09-17 16:35:24 +02:00
parent 0bf3204d89
commit 07065d67e1
8 changed files with 54 additions and 9 deletions

View file

@ -35,6 +35,9 @@
#include "editor_node.h" #include "editor_node.h"
#include "editor_properties_array_dict.h" #include "editor_properties_array_dict.h"
#include "editor_scale.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/main/window.h"
#include "scene/resources/font.h" #include "scene/resources/font.h"
@ -2969,6 +2972,35 @@ void EditorPropertyResource::_update_property_bg() {
update(); update();
} }
void EditorPropertyResource::_update_preferred_shader() {
Node *parent = get_parent();
EditorProperty *parent_property = nullptr;
while (parent && !parent_property) {
parent_property = Object::cast_to<EditorProperty>(parent);
parent = parent->get_parent();
}
if (parent_property) {
EditorShaderPicker *shader_picker = Object::cast_to<EditorShaderPicker>(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<GPUParticles2D>(object) || Object::cast_to<GPUParticles3D>(object)) && property == SNAME("process_material")) {
shader_picker->set_preferred_mode(Shader::MODE_PARTICLES);
} else if (Object::cast_to<FogVolume>(object)) {
shader_picker->set_preferred_mode(Shader::MODE_FOG);
} else if (Object::cast_to<CanvasItem>(object)) {
shader_picker->set_preferred_mode(Shader::MODE_CANVAS_ITEM);
} else if (Object::cast_to<Node3D>(object)) {
shader_picker->set_preferred_mode(Shader::MODE_SPATIAL);
} else if (Object::cast_to<Sky>(object)) {
shader_picker->set_preferred_mode(Shader::MODE_SKY);
}
}
}
void EditorPropertyResource::_viewport_selected(const NodePath &p_path) { void EditorPropertyResource::_viewport_selected(const NodePath &p_path) {
Node *to_node = get_node(p_path); Node *to_node = get_node(p_path);
if (!Object::cast_to<Viewport>(to_node)) { if (!Object::cast_to<Viewport>(to_node)) {
@ -3000,6 +3032,7 @@ void EditorPropertyResource::setup(Object *p_object, const String &p_path, const
EditorShaderPicker *shader_picker = memnew(EditorShaderPicker); EditorShaderPicker *shader_picker = memnew(EditorShaderPicker);
shader_picker->set_edited_material(Object::cast_to<ShaderMaterial>(p_object)); shader_picker->set_edited_material(Object::cast_to<ShaderMaterial>(p_object));
resource_picker = shader_picker; resource_picker = shader_picker;
connect(SNAME("ready"), callable_mp(this, &EditorPropertyResource::_update_preferred_shader));
} else { } else {
resource_picker = memnew(EditorResourcePicker); resource_picker = memnew(EditorResourcePicker);
} }

View file

@ -669,6 +669,7 @@ class EditorPropertyResource : public EditorProperty {
void _open_editor_pressed(); void _open_editor_pressed();
void _fold_other_editors(Object *p_self); void _fold_other_editors(Object *p_self);
void _update_property_bg(); void _update_property_bg();
void _update_preferred_shader();
protected: protected:
virtual void _set_read_only(bool p_read_only) override; virtual void _set_read_only(bool p_read_only) override;

View file

@ -934,7 +934,7 @@ bool EditorShaderPicker::handle_menu_selected(int p_which) {
switch (p_which) { switch (p_which) {
case OBJ_MENU_NEW_SHADER: { case OBJ_MENU_NEW_SHADER: {
if (material.is_valid()) { 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; return true;
} }
} break; } break;
@ -952,5 +952,9 @@ ShaderMaterial *EditorShaderPicker::get_edited_material() const {
return edited_material; return edited_material;
} }
void EditorShaderPicker::set_preferred_mode(int p_mode) {
preferred_mode = p_mode;
}
EditorShaderPicker::EditorShaderPicker() { EditorShaderPicker::EditorShaderPicker() {
} }

View file

@ -156,6 +156,7 @@ class EditorShaderPicker : public EditorResourcePicker {
}; };
ShaderMaterial *edited_material = nullptr; ShaderMaterial *edited_material = nullptr;
int preferred_mode = -1;
public: public:
virtual void set_create_options(Object *p_menu_node) override; virtual void set_create_options(Object *p_menu_node) override;
@ -163,6 +164,7 @@ public:
void set_edited_material(ShaderMaterial *p_material); void set_edited_material(ShaderMaterial *p_material);
ShaderMaterial *get_edited_material() const; ShaderMaterial *get_edited_material() const;
void set_preferred_mode(int p_preferred_mode);
EditorShaderPicker(); EditorShaderPicker();
}; };

View file

@ -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()) { if (selected_shader_material.is_null()) {
return; 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("shader_created", callable_mp(this, &SceneTreeDock::_shader_created));
shader_create_dialog->connect("confirmed", callable_mp(this, &SceneTreeDock::_shader_creation_closed)); 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->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(); shader_create_dialog->popup_centered();
} }
void SceneTreeDock::open_shader_dialog(Ref<ShaderMaterial> &p_for_material) { void SceneTreeDock::open_shader_dialog(Ref<ShaderMaterial> &p_for_material, int p_preferred_mode) {
selected_shader_material = p_for_material; selected_shader_material = p_for_material;
attach_shader_to_selected(); attach_shader_to_selected(p_preferred_mode);
} }
void SceneTreeDock::open_add_child_dialog() { void SceneTreeDock::open_add_child_dialog() {

View file

@ -300,8 +300,8 @@ public:
void attach_script_to_selected(bool p_extend); void attach_script_to_selected(bool p_extend);
void open_script_dialog(Node *p_for_node, bool p_extend); void open_script_dialog(Node *p_for_node, bool p_extend);
void attach_shader_to_selected(); void attach_shader_to_selected(int p_preferred_mode = -1);
void open_shader_dialog(Ref<ShaderMaterial> &p_for_material); void open_shader_dialog(Ref<ShaderMaterial> &p_for_material, int p_preferred_mode = -1);
void open_add_child_dialog(); void open_add_child_dialog();
void open_instance_child_dialog(); void open_instance_child_dialog();

View file

@ -324,7 +324,7 @@ void ShaderCreateDialog::_path_submitted(const String &p_path) {
ok_pressed(); 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 != "") { if (p_base_path != "") {
initial_base_path = p_base_path.get_basename(); initial_base_path = p_base_path.get_basename();
file_path->set_text(initial_base_path + "." + language_data[language_menu->get_selected()].default_extension); 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; built_in_enabled = p_built_in_enabled;
load_enabled = p_load_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); _language_changed(current_language);
_path_changed(file_path->get_text()); _path_changed(file_path->get_text());
} }

View file

@ -108,7 +108,7 @@ protected:
static void _bind_methods(); static void _bind_methods();
public: 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(); ShaderCreateDialog();
}; };