|
@@ -1985,6 +1985,67 @@ bool VisualShaderEditor::_update_preview_parameter_tree() {
|
|
|
return found;
|
|
|
}
|
|
|
|
|
|
+void VisualShaderEditor::_preview_tools_menu_option(int p_idx) {
|
|
|
+ ShaderMaterial *src_mat = nullptr;
|
|
|
+
|
|
|
+ if (p_idx == COPY_PARAMS_FROM_MATERIAL || p_idx == PASTE_PARAMS_TO_MATERIAL) {
|
|
|
+ for (int i = EditorNode::get_singleton()->get_editor_selection_history()->get_path_size() - 1; i >= 0; i--) {
|
|
|
+ Object *object = ObjectDB::get_instance(EditorNode::get_singleton()->get_editor_selection_history()->get_path_object(i));
|
|
|
+ ShaderMaterial *src_mat2;
|
|
|
+ if (!object) {
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ if (object->has_method("get_material_override")) { // Trying to get material from MeshInstance.
|
|
|
+ src_mat2 = Object::cast_to<ShaderMaterial>(object->call("get_material_override"));
|
|
|
+ } else if (object->has_method("get_material")) { // From CanvasItem/Node2D.
|
|
|
+ src_mat2 = Object::cast_to<ShaderMaterial>(object->call("get_material"));
|
|
|
+ } else {
|
|
|
+ src_mat2 = Object::cast_to<ShaderMaterial>(object);
|
|
|
+ }
|
|
|
+
|
|
|
+ if (src_mat2 && src_mat2->get_shader().is_valid() && src_mat2->get_shader() == visual_shader) {
|
|
|
+ src_mat = src_mat2;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ switch (p_idx) {
|
|
|
+ case COPY_PARAMS_FROM_MATERIAL:
|
|
|
+ if (src_mat) {
|
|
|
+ EditorUndoRedoManager *undo_redo = EditorUndoRedoManager::get_singleton();
|
|
|
+ undo_redo->create_action(TTR("Copy Preview Shader Parameters From Material"));
|
|
|
+
|
|
|
+ List<PropertyInfo> params;
|
|
|
+ preview_material->get_shader()->get_shader_uniform_list(¶ms);
|
|
|
+ for (const PropertyInfo &E : params) {
|
|
|
+ undo_redo->add_do_method(visual_shader.ptr(), "_set_preview_shader_parameter", E.name, src_mat->get_shader_parameter(E.name));
|
|
|
+ undo_redo->add_undo_method(visual_shader.ptr(), "_set_preview_shader_parameter", E.name, preview_material->get_shader_parameter(E.name));
|
|
|
+ }
|
|
|
+
|
|
|
+ undo_redo->commit_action();
|
|
|
+ }
|
|
|
+ break;
|
|
|
+ case PASTE_PARAMS_TO_MATERIAL:
|
|
|
+ if (src_mat) {
|
|
|
+ EditorUndoRedoManager *undo_redo = EditorUndoRedoManager::get_singleton();
|
|
|
+ undo_redo->create_action(TTR("Paste Preview Shader Parameters To Material"));
|
|
|
+
|
|
|
+ List<PropertyInfo> params;
|
|
|
+ preview_material->get_shader()->get_shader_uniform_list(¶ms);
|
|
|
+ for (const PropertyInfo &E : params) {
|
|
|
+ undo_redo->add_do_method(src_mat, "set_shader_parameter", E.name, preview_material->get_shader_parameter(E.name));
|
|
|
+ undo_redo->add_undo_method(src_mat, "set_shader_parameter", E.name, src_mat->get_shader_parameter(E.name));
|
|
|
+ }
|
|
|
+
|
|
|
+ undo_redo->commit_action();
|
|
|
+ }
|
|
|
+ break;
|
|
|
+ default:
|
|
|
+ break;
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
void VisualShaderEditor::_clear_preview_param() {
|
|
|
selected_param_id = "";
|
|
|
current_prop = nullptr;
|
|
@@ -5159,6 +5220,7 @@ void VisualShaderEditor::_notification(int p_what) {
|
|
|
}
|
|
|
|
|
|
tools->set_button_icon(get_editor_theme_icon(SNAME("Tools")));
|
|
|
+ preview_tools->set_button_icon(get_editor_theme_icon(SNAME("Tools")));
|
|
|
|
|
|
if (is_visible_in_tree()) {
|
|
|
_update_graph();
|
|
@@ -6555,11 +6617,21 @@ VisualShaderEditor::VisualShaderEditor() {
|
|
|
VBoxContainer *params_vbox = memnew(VBoxContainer);
|
|
|
preview_split->add_child(params_vbox);
|
|
|
|
|
|
+ HBoxContainer *filter_hbox = memnew(HBoxContainer);
|
|
|
+ params_vbox->add_child(filter_hbox);
|
|
|
+
|
|
|
param_filter = memnew(LineEdit);
|
|
|
+ filter_hbox->add_child(param_filter);
|
|
|
param_filter->connect(SceneStringName(text_changed), callable_mp(this, &VisualShaderEditor::_param_filter_changed));
|
|
|
param_filter->set_h_size_flags(SIZE_EXPAND_FILL);
|
|
|
param_filter->set_placeholder(TTR("Filter Parameters"));
|
|
|
- params_vbox->add_child(param_filter);
|
|
|
+
|
|
|
+ preview_tools = memnew(MenuButton);
|
|
|
+ filter_hbox->add_child(preview_tools);
|
|
|
+ preview_tools->set_tooltip_text(TTR("Options"));
|
|
|
+ preview_tools->get_popup()->connect(SceneStringName(id_pressed), callable_mp(this, &VisualShaderEditor::_preview_tools_menu_option));
|
|
|
+ preview_tools->get_popup()->add_item(TTR("Copy Parameters From Material"), COPY_PARAMS_FROM_MATERIAL);
|
|
|
+ preview_tools->get_popup()->add_item(TTR("Paste Parameters To Material"), PASTE_PARAMS_TO_MATERIAL);
|
|
|
|
|
|
ScrollContainer *sc = memnew(ScrollContainer);
|
|
|
sc->set_v_size_flags(SIZE_EXPAND_FILL);
|