mirror of
https://github.com/godotengine/godot.git
synced 2025-11-01 14:11:15 +00:00
Add copy/paste options to preview material parameters in visual shader
This commit is contained in:
parent
cb411fa960
commit
485e7f899b
2 changed files with 80 additions and 1 deletions
|
|
@ -1985,6 +1985,67 @@ bool VisualShaderEditor::_update_preview_parameter_tree() {
|
||||||
return found;
|
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() {
|
void VisualShaderEditor::_clear_preview_param() {
|
||||||
selected_param_id = "";
|
selected_param_id = "";
|
||||||
current_prop = nullptr;
|
current_prop = nullptr;
|
||||||
|
|
@ -5159,6 +5220,7 @@ void VisualShaderEditor::_notification(int p_what) {
|
||||||
}
|
}
|
||||||
|
|
||||||
tools->set_button_icon(get_editor_theme_icon(SNAME("Tools")));
|
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()) {
|
if (is_visible_in_tree()) {
|
||||||
_update_graph();
|
_update_graph();
|
||||||
|
|
@ -6555,11 +6617,21 @@ VisualShaderEditor::VisualShaderEditor() {
|
||||||
VBoxContainer *params_vbox = memnew(VBoxContainer);
|
VBoxContainer *params_vbox = memnew(VBoxContainer);
|
||||||
preview_split->add_child(params_vbox);
|
preview_split->add_child(params_vbox);
|
||||||
|
|
||||||
|
HBoxContainer *filter_hbox = memnew(HBoxContainer);
|
||||||
|
params_vbox->add_child(filter_hbox);
|
||||||
|
|
||||||
param_filter = memnew(LineEdit);
|
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->connect(SceneStringName(text_changed), callable_mp(this, &VisualShaderEditor::_param_filter_changed));
|
||||||
param_filter->set_h_size_flags(SIZE_EXPAND_FILL);
|
param_filter->set_h_size_flags(SIZE_EXPAND_FILL);
|
||||||
param_filter->set_placeholder(TTR("Filter Parameters"));
|
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);
|
ScrollContainer *sc = memnew(ScrollContainer);
|
||||||
sc->set_v_size_flags(SIZE_EXPAND_FILL);
|
sc->set_v_size_flags(SIZE_EXPAND_FILL);
|
||||||
|
|
|
||||||
|
|
@ -276,6 +276,7 @@ class VisualShaderEditor : public ShaderEditor {
|
||||||
bool shader_preview_showed = true;
|
bool shader_preview_showed = true;
|
||||||
|
|
||||||
LineEdit *param_filter = nullptr;
|
LineEdit *param_filter = nullptr;
|
||||||
|
MenuButton *preview_tools = nullptr;
|
||||||
String selected_param_id;
|
String selected_param_id;
|
||||||
Tree *parameters = nullptr;
|
Tree *parameters = nullptr;
|
||||||
HashMap<String, PropertyInfo> parameter_props;
|
HashMap<String, PropertyInfo> parameter_props;
|
||||||
|
|
@ -318,6 +319,11 @@ class VisualShaderEditor : public ShaderEditor {
|
||||||
COLLAPSE_ALL
|
COLLAPSE_ALL
|
||||||
};
|
};
|
||||||
|
|
||||||
|
enum PreviewToolsMenuOptions {
|
||||||
|
COPY_PARAMS_FROM_MATERIAL,
|
||||||
|
PASTE_PARAMS_TO_MATERIAL,
|
||||||
|
};
|
||||||
|
|
||||||
#ifdef MINGW_ENABLED
|
#ifdef MINGW_ENABLED
|
||||||
#undef DELETE
|
#undef DELETE
|
||||||
#endif
|
#endif
|
||||||
|
|
@ -367,6 +373,7 @@ class VisualShaderEditor : public ShaderEditor {
|
||||||
void _show_add_varying_dialog();
|
void _show_add_varying_dialog();
|
||||||
void _show_remove_varying_dialog();
|
void _show_remove_varying_dialog();
|
||||||
|
|
||||||
|
void _preview_tools_menu_option(int p_idx);
|
||||||
void _clear_preview_param();
|
void _clear_preview_param();
|
||||||
void _update_preview_parameter_list();
|
void _update_preview_parameter_list();
|
||||||
bool _update_preview_parameter_tree();
|
bool _update_preview_parameter_tree();
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue