Merge pull request #96618 from Chaosus/vs_copy_paste_preview_material

Add copy/paste options to preview material parameters in visual shader
This commit is contained in:
Thaddeus Crews 2024-11-13 08:34:33 -06:00
commit 8c0e1a7bee
No known key found for this signature in database
GPG Key ID: 62181B86FE9E5D84
2 changed files with 80 additions and 1 deletions

View File

@ -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(&params);
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(&params);
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);

View File

@ -276,6 +276,7 @@ class VisualShaderEditor : public ShaderEditor {
bool shader_preview_showed = true;
LineEdit *param_filter = nullptr;
MenuButton *preview_tools = nullptr;
String selected_param_id;
Tree *parameters = nullptr;
HashMap<String, PropertyInfo> parameter_props;
@ -318,6 +319,11 @@ class VisualShaderEditor : public ShaderEditor {
COLLAPSE_ALL
};
enum PreviewToolsMenuOptions {
COPY_PARAMS_FROM_MATERIAL,
PASTE_PARAMS_TO_MATERIAL,
};
#ifdef MINGW_ENABLED
#undef DELETE
#endif
@ -367,6 +373,7 @@ class VisualShaderEditor : public ShaderEditor {
void _show_add_varying_dialog();
void _show_remove_varying_dialog();
void _preview_tools_menu_option(int p_idx);
void _clear_preview_param();
void _update_preview_parameter_list();
bool _update_preview_parameter_tree();