@@ -1985,6 +1985,67 @@ bool VisualShaderEditor::_update_preview_parameter_tree() {
19851985 return found;
19861986}
19871987
1988+ void VisualShaderEditor::_preview_tools_menu_option (int p_idx) {
1989+ ShaderMaterial *src_mat = nullptr ;
1990+
1991+ if (p_idx == COPY_PARAMS_FROM_MATERIAL || p_idx == PASTE_PARAMS_TO_MATERIAL) {
1992+ for (int i = EditorNode::get_singleton ()->get_editor_selection_history ()->get_path_size () - 1 ; i >= 0 ; i--) {
1993+ Object *object = ObjectDB::get_instance (EditorNode::get_singleton ()->get_editor_selection_history ()->get_path_object (i));
1994+ ShaderMaterial *src_mat2;
1995+ if (!object) {
1996+ continue ;
1997+ }
1998+ if (object->has_method (" get_material_override" )) { // Trying to get material from MeshInstance.
1999+ src_mat2 = Object::cast_to<ShaderMaterial>(object->call (" get_material_override" ));
2000+ } else if (object->has_method (" get_material" )) { // From CanvasItem/Node2D.
2001+ src_mat2 = Object::cast_to<ShaderMaterial>(object->call (" get_material" ));
2002+ } else {
2003+ src_mat2 = Object::cast_to<ShaderMaterial>(object);
2004+ }
2005+
2006+ if (src_mat2 && src_mat2->get_shader ().is_valid () && src_mat2->get_shader () == visual_shader) {
2007+ src_mat = src_mat2;
2008+ break ;
2009+ }
2010+ }
2011+ }
2012+
2013+ switch (p_idx) {
2014+ case COPY_PARAMS_FROM_MATERIAL:
2015+ if (src_mat) {
2016+ EditorUndoRedoManager *undo_redo = EditorUndoRedoManager::get_singleton ();
2017+ undo_redo->create_action (TTR (" Copy Preview Shader Parameters From Material" ));
2018+
2019+ List<PropertyInfo> params;
2020+ preview_material->get_shader ()->get_shader_uniform_list (¶ms);
2021+ for (const PropertyInfo &E : params) {
2022+ undo_redo->add_do_method (visual_shader.ptr (), " _set_preview_shader_parameter" , E.name , src_mat->get_shader_parameter (E.name ));
2023+ undo_redo->add_undo_method (visual_shader.ptr (), " _set_preview_shader_parameter" , E.name , preview_material->get_shader_parameter (E.name ));
2024+ }
2025+
2026+ undo_redo->commit_action ();
2027+ }
2028+ break ;
2029+ case PASTE_PARAMS_TO_MATERIAL:
2030+ if (src_mat) {
2031+ EditorUndoRedoManager *undo_redo = EditorUndoRedoManager::get_singleton ();
2032+ undo_redo->create_action (TTR (" Paste Preview Shader Parameters To Material" ));
2033+
2034+ List<PropertyInfo> params;
2035+ preview_material->get_shader ()->get_shader_uniform_list (¶ms);
2036+ for (const PropertyInfo &E : params) {
2037+ undo_redo->add_do_method (src_mat, " set_shader_parameter" , E.name , preview_material->get_shader_parameter (E.name ));
2038+ undo_redo->add_undo_method (src_mat, " set_shader_parameter" , E.name , src_mat->get_shader_parameter (E.name ));
2039+ }
2040+
2041+ undo_redo->commit_action ();
2042+ }
2043+ break ;
2044+ default :
2045+ break ;
2046+ }
2047+ }
2048+
19882049void VisualShaderEditor::_clear_preview_param () {
19892050 selected_param_id = " " ;
19902051 current_prop = nullptr ;
@@ -5159,6 +5220,7 @@ void VisualShaderEditor::_notification(int p_what) {
51595220 }
51605221
51615222 tools->set_button_icon (get_editor_theme_icon (SNAME (" Tools" )));
5223+ preview_tools->set_button_icon (get_editor_theme_icon (SNAME (" Tools" )));
51625224
51635225 if (is_visible_in_tree ()) {
51645226 _update_graph ();
@@ -6555,11 +6617,21 @@ VisualShaderEditor::VisualShaderEditor() {
65556617 VBoxContainer *params_vbox = memnew (VBoxContainer);
65566618 preview_split->add_child (params_vbox);
65576619
6620+ HBoxContainer *filter_hbox = memnew (HBoxContainer);
6621+ params_vbox->add_child (filter_hbox);
6622+
65586623 param_filter = memnew (LineEdit);
6624+ filter_hbox->add_child (param_filter);
65596625 param_filter->connect (SceneStringName (text_changed), callable_mp (this , &VisualShaderEditor::_param_filter_changed));
65606626 param_filter->set_h_size_flags (SIZE_EXPAND_FILL);
65616627 param_filter->set_placeholder (TTR (" Filter Parameters" ));
6562- params_vbox->add_child (param_filter);
6628+
6629+ preview_tools = memnew (MenuButton);
6630+ filter_hbox->add_child (preview_tools);
6631+ preview_tools->set_tooltip_text (TTR (" Options" ));
6632+ preview_tools->get_popup ()->connect (SceneStringName (id_pressed), callable_mp (this , &VisualShaderEditor::_preview_tools_menu_option));
6633+ preview_tools->get_popup ()->add_item (TTR (" Copy Parameters From Material" ), COPY_PARAMS_FROM_MATERIAL);
6634+ preview_tools->get_popup ()->add_item (TTR (" Paste Parameters To Material" ), PASTE_PARAMS_TO_MATERIAL);
65636635
65646636 ScrollContainer *sc = memnew (ScrollContainer);
65656637 sc->set_v_size_flags (SIZE_EXPAND_FILL);
0 commit comments