mirror of
https://github.com/godotengine/godot.git
synced 2024-11-24 13:12:42 +00:00
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:
commit
8c0e1a7bee
@ -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);
|
||||
|
@ -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();
|
||||
|
Loading…
Reference in New Issue
Block a user