Skip to content

Commit 8c0e1a7

Browse files
committed
Merge pull request godotengine#96618 from Chaosus/vs_copy_paste_preview_material
Add copy/paste options to preview material parameters in visual shader
2 parents ce0709e + 485e7f8 commit 8c0e1a7

File tree

2 files changed

+80
-1
lines changed

2 files changed

+80
-1
lines changed

editor/plugins/visual_shader_editor_plugin.cpp

Lines changed: 73 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -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(&params);
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(&params);
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+
19882049
void 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);

editor/plugins/visual_shader_editor_plugin.h

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -276,6 +276,7 @@ class VisualShaderEditor : public ShaderEditor {
276276
bool shader_preview_showed = true;
277277

278278
LineEdit *param_filter = nullptr;
279+
MenuButton *preview_tools = nullptr;
279280
String selected_param_id;
280281
Tree *parameters = nullptr;
281282
HashMap<String, PropertyInfo> parameter_props;
@@ -318,6 +319,11 @@ class VisualShaderEditor : public ShaderEditor {
318319
COLLAPSE_ALL
319320
};
320321

322+
enum PreviewToolsMenuOptions {
323+
COPY_PARAMS_FROM_MATERIAL,
324+
PASTE_PARAMS_TO_MATERIAL,
325+
};
326+
321327
#ifdef MINGW_ENABLED
322328
#undef DELETE
323329
#endif
@@ -367,6 +373,7 @@ class VisualShaderEditor : public ShaderEditor {
367373
void _show_add_varying_dialog();
368374
void _show_remove_varying_dialog();
369375

376+
void _preview_tools_menu_option(int p_idx);
370377
void _clear_preview_param();
371378
void _update_preview_parameter_list();
372379
bool _update_preview_parameter_tree();

0 commit comments

Comments
 (0)