Skip to content

Commit

Permalink
Merge pull request godotengine#51356 from Chaosus/shader_dialog
Browse files Browse the repository at this point in the history
  • Loading branch information
Chaosus authored Aug 7, 2021
2 parents 4c2559d + 5e5cd24 commit f860ee3
Show file tree
Hide file tree
Showing 10 changed files with 911 additions and 10 deletions.
4 changes: 4 additions & 0 deletions editor/editor_properties.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2854,6 +2854,10 @@ void EditorPropertyResource::setup(Object *p_object, const String &p_path, const
EditorScriptPicker *script_picker = memnew(EditorScriptPicker);
script_picker->set_script_owner(Object::cast_to<Node>(p_object));
resource_picker = script_picker;
} else if (p_path == "shader" && p_base_type == "Shader" && Object::cast_to<ShaderMaterial>(p_object)) {
EditorShaderPicker *shader_picker = memnew(EditorShaderPicker);
shader_picker->set_edited_material(Object::cast_to<ShaderMaterial>(p_object));
resource_picker = shader_picker;
} else {
resource_picker = memnew(EditorResourcePicker);
}
Expand Down
41 changes: 41 additions & 0 deletions editor/editor_resource_picker.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -847,6 +847,8 @@ EditorResourcePicker::EditorResourcePicker() {
edit_button->connect("gui_input", callable_mp(this, &EditorResourcePicker::_button_input));
}

// EditorScriptPicker

void EditorScriptPicker::set_create_options(Object *p_menu_node) {
PopupMenu *menu_node = Object::cast_to<PopupMenu>(p_menu_node);
if (!menu_node) {
Expand Down Expand Up @@ -895,3 +897,42 @@ void EditorScriptPicker::_bind_methods() {

EditorScriptPicker::EditorScriptPicker() {
}

// EditorShaderPicker

void EditorShaderPicker::set_create_options(Object *p_menu_node) {
PopupMenu *menu_node = Object::cast_to<PopupMenu>(p_menu_node);
if (!menu_node) {
return;
}

menu_node->add_icon_item(get_theme_icon("Shader", "EditorIcons"), TTR("New Shader"), OBJ_MENU_NEW_SHADER);
menu_node->add_separator();
}

bool EditorShaderPicker::handle_menu_selected(int p_which) {
Ref<ShaderMaterial> material = Ref<ShaderMaterial>(get_edited_material());

switch (p_which) {
case OBJ_MENU_NEW_SHADER: {
if (material.is_valid()) {
EditorNode::get_singleton()->get_scene_tree_dock()->open_shader_dialog(material);
return true;
}
} break;
default:
break;
}
return false;
}

void EditorShaderPicker::set_edited_material(ShaderMaterial *p_material) {
edited_material = p_material;
}

ShaderMaterial *EditorShaderPicker::get_edited_material() const {
return edited_material;
}

EditorShaderPicker::EditorShaderPicker() {
}
19 changes: 19 additions & 0 deletions editor/editor_resource_picker.h
Original file line number Diff line number Diff line change
Expand Up @@ -144,4 +144,23 @@ class EditorScriptPicker : public EditorResourcePicker {
EditorScriptPicker();
};

class EditorShaderPicker : public EditorResourcePicker {
GDCLASS(EditorShaderPicker, EditorResourcePicker);

enum ExtraMenuOption {
OBJ_MENU_NEW_SHADER = 10,
};

ShaderMaterial *edited_material = nullptr;

public:
virtual void set_create_options(Object *p_menu_node) override;
virtual bool handle_menu_selected(int p_which) override;

void set_edited_material(ShaderMaterial *p_material);
ShaderMaterial *get_edited_material() const;

EditorShaderPicker();
};

#endif // EDITOR_RESOURCE_PICKER_H
1 change: 1 addition & 0 deletions editor/plugins/visual_shader_editor_plugin.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1007,6 +1007,7 @@ void VisualShaderEditor::edit(VisualShader *p_visual_shader) {
const Dictionary vs_version = visual_shader->get_engine_version();
if (!vs_version.has_all(components)) {
visual_shader->update_engine_version(engine_version);
print_line(vformat(TTR("The shader (\"%s\") has been updated to correspond Godot %s.%s version."), visual_shader->get_path(), engine_version["major"], engine_version["minor"]));
} else {
for (int i = 0; i < components.size(); i++) {
if (vs_version[components[i]] != engine_version[components[i]]) {
Expand Down
59 changes: 59 additions & 0 deletions editor/scene_tree_dock.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,7 @@
#include "editor/plugins/canvas_item_editor_plugin.h"
#include "editor/plugins/node_3d_editor_plugin.h"
#include "editor/plugins/script_editor_plugin.h"
#include "editor/shader_create_dialog.h"
#include "scene/main/window.h"
#include "scene/resources/packed_scene.h"
#include "servers/display_server.h"
Expand Down Expand Up @@ -1939,12 +1940,31 @@ void SceneTreeDock::_script_created(Ref<Script> p_script) {
_update_script_button();
}

void SceneTreeDock::_shader_created(Ref<Shader> p_shader) {
if (selected_shader_material.is_null()) {
return;
}

Ref<Shader> existing = selected_shader_material->get_shader();

editor_data->get_undo_redo().create_action(TTR("Set Shader"));
editor_data->get_undo_redo().add_do_method(selected_shader_material.ptr(), "set_shader", p_shader);
editor_data->get_undo_redo().add_undo_method(selected_shader_material.ptr(), "set_shader", existing);
editor_data->get_undo_redo().commit_action();
}

void SceneTreeDock::_script_creation_closed() {
script_create_dialog->disconnect("script_created", callable_mp(this, &SceneTreeDock::_script_created));
script_create_dialog->disconnect("confirmed", callable_mp(this, &SceneTreeDock::_script_creation_closed));
script_create_dialog->disconnect("cancelled", callable_mp(this, &SceneTreeDock::_script_creation_closed));
}

void SceneTreeDock::_shader_creation_closed() {
shader_create_dialog->disconnect("shader_created", callable_mp(this, &SceneTreeDock::_shader_created));
shader_create_dialog->disconnect("confirmed", callable_mp(this, &SceneTreeDock::_shader_creation_closed));
shader_create_dialog->disconnect("cancelled", callable_mp(this, &SceneTreeDock::_shader_creation_closed));
}

void SceneTreeDock::_toggle_editable_children_from_selection() {
List<Node *> selection = editor_selection->get_selected_node_list();
List<Node *>::Element *e = selection.front();
Expand Down Expand Up @@ -2896,6 +2916,42 @@ void SceneTreeDock::open_script_dialog(Node *p_for_node, bool p_extend) {
}
}

void SceneTreeDock::attach_shader_to_selected() {
if (selected_shader_material.is_null()) {
return;
}

String path = selected_shader_material->get_path();
if (path == "") {
String root_path;
if (editor_data->get_edited_scene_root()) {
root_path = editor_data->get_edited_scene_root()->get_filename();
}
String shader_name;
if (selected_shader_material->get_name().is_empty()) {
shader_name = root_path.get_file();
} else {
shader_name = selected_shader_material->get_name();
}
if (root_path == "") {
path = String("res://").plus_file(shader_name);
} else {
path = root_path.get_base_dir().plus_file(shader_name);
}
}

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->popup_centered();
}

void SceneTreeDock::open_shader_dialog(Ref<ShaderMaterial> &p_for_material) {
selected_shader_material = p_for_material;
attach_shader_to_selected();
}

void SceneTreeDock::open_add_child_dialog() {
create_dialog->set_base_type("CanvasItem");
_tool_selected(TOOL_NEW, true);
Expand Down Expand Up @@ -3267,6 +3323,9 @@ SceneTreeDock::SceneTreeDock(EditorNode *p_editor, Node *p_scene_root, EditorSel
script_create_dialog->set_inheritance_base_type("Node");
add_child(script_create_dialog);

shader_create_dialog = memnew(ShaderCreateDialog);
add_child(shader_create_dialog);

reparent_dialog = memnew(ReparentDialog);
add_child(reparent_dialog);
reparent_dialog->connect("reparent", callable_mp(this, &SceneTreeDock::_node_reparent));
Expand Down
9 changes: 9 additions & 0 deletions editor/scene_tree_dock.h
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,7 @@
#include "scene_tree_editor.h"

class EditorNode;
class ShaderCreateDialog;

class SceneTreeDock : public VBoxContainer {
GDCLASS(SceneTreeDock, VBoxContainer);
Expand Down Expand Up @@ -138,6 +139,7 @@ class SceneTreeDock : public VBoxContainer {
HashMap<String, Map<RES, RES>> clipboard_resource_remap;

ScriptCreateDialog *script_create_dialog;
ShaderCreateDialog *shader_create_dialog;
AcceptDialog *accept;
ConfirmationDialog *delete_dialog;
ConfirmationDialog *editable_instance_remove_dialog;
Expand Down Expand Up @@ -166,6 +168,8 @@ class SceneTreeDock : public VBoxContainer {
VBoxContainer *create_root_dialog;
String selected_favorite_root;

Ref<ShaderMaterial> selected_shader_material;

void _add_children_to_popup(Object *p_obj, int p_depth);

void _node_reparent(NodePath p_path, bool p_keep_global_xform);
Expand All @@ -192,7 +196,9 @@ class SceneTreeDock : public VBoxContainer {
void _node_selected();
void _node_renamed();
void _script_created(Ref<Script> p_script);
void _shader_created(Ref<Shader> p_shader);
void _script_creation_closed();
void _shader_creation_closed();

void _delete_confirm(bool p_cut = false);

Expand Down Expand Up @@ -288,6 +294,9 @@ class SceneTreeDock : public VBoxContainer {
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<ShaderMaterial> &p_for_material);

void open_add_child_dialog();
void open_instance_child_dialog();

Expand Down
Loading

0 comments on commit f860ee3

Please sign in to comment.