From 059ed731f5e016fde05bccc711d6d4aa8ce24e2c Mon Sep 17 00:00:00 2001 From: Chaosus <chaosus89@gmail.com> Date: Thu, 12 Dec 2024 14:30:46 +0300 Subject: [PATCH] Prevent using boolean varyings in vertex function of visual shaders --- .../plugins/visual_shader_editor_plugin.cpp | 53 ++++++++++++++----- editor/plugins/visual_shader_editor_plugin.h | 3 ++ 2 files changed, 43 insertions(+), 13 deletions(-) diff --git a/editor/plugins/visual_shader_editor_plugin.cpp b/editor/plugins/visual_shader_editor_plugin.cpp index 1162943b4a8e..2a17df9b3601 100644 --- a/editor/plugins/visual_shader_editor_plugin.cpp +++ b/editor/plugins/visual_shader_editor_plugin.cpp @@ -5905,24 +5905,49 @@ void VisualShaderEditor::_varying_create() { add_varying_dialog->hide(); } -void VisualShaderEditor::_varying_name_changed(const String &p_name) { - if (!p_name.is_valid_ascii_identifier()) { - varying_error_label->show(); - varying_error_label->set_text(TTR("Invalid name for varying.")); - add_varying_dialog->get_ok_button()->set_disabled(true); - return; +void VisualShaderEditor::_varying_validate() { + bool has_error = false; + String error; + String varname = varying_name->get_text(); + + if (!varname.is_valid_ascii_identifier()) { + error += TTR("Invalid name for varying."); + has_error = true; + } else if (visual_shader->has_varying(varname)) { + error += TTR("Varying with that name is already exist."); + has_error = true; } - if (visual_shader->has_varying(p_name)) { + + if (varying_type->get_selected() == 6 && varying_mode->get_selected() == VisualShader::VaryingMode::VARYING_MODE_VERTEX_TO_FRAG_LIGHT) { + if (has_error) { + error += "\n"; + } + error += vformat(TTR("Boolean type cannot be used with `%s` varying mode."), "Vertex -> [Fragment, Light]"); + has_error = true; + } + + if (has_error) { varying_error_label->show(); - varying_error_label->set_text(TTR("Varying with that name is already exist.")); + varying_error_label->set_text(error); add_varying_dialog->get_ok_button()->set_disabled(true); - return; - } - if (varying_error_label->is_visible()) { + } else { varying_error_label->hide(); - add_varying_dialog->set_size(Size2(add_varying_dialog->get_size().x, 0)); + varying_error_label->set_text(""); + add_varying_dialog->get_ok_button()->set_disabled(false); } - add_varying_dialog->get_ok_button()->set_disabled(false); + add_varying_dialog->reset_size(); +} + +void VisualShaderEditor::_varying_type_changed(int p_index) { + _varying_validate(); +} + +void VisualShaderEditor::_varying_mode_changed(int p_index) { + _varying_validate(); +} + +void VisualShaderEditor::_varying_name_changed(const String &p_name) { + _varying_validate(); } void VisualShaderEditor::_varying_deleted() { @@ -6795,6 +6820,7 @@ VisualShaderEditor::VisualShaderEditor() { varying_type->add_item("Vector4"); varying_type->add_item("Boolean"); varying_type->add_item("Transform"); + varying_type->connect(SceneStringName(item_selected), callable_mp(this, &VisualShaderEditor::_varying_type_changed)); varying_name = memnew(LineEdit); hb->add_child(varying_name); @@ -6807,6 +6833,7 @@ VisualShaderEditor::VisualShaderEditor() { hb->add_child(varying_mode); varying_mode->add_item("Vertex -> [Fragment, Light]"); varying_mode->add_item("Fragment -> Light"); + varying_mode->connect(SceneStringName(item_selected), callable_mp(this, &VisualShaderEditor::_varying_mode_changed)); varying_error_label = memnew(Label); vb->add_child(varying_error_label); diff --git a/editor/plugins/visual_shader_editor_plugin.h b/editor/plugins/visual_shader_editor_plugin.h index 4e20a0a980a6..a74fe113373b 100644 --- a/editor/plugins/visual_shader_editor_plugin.h +++ b/editor/plugins/visual_shader_editor_plugin.h @@ -595,6 +595,9 @@ class VisualShaderEditor : public ShaderEditor { void _member_cancel(); void _varying_create(); + void _varying_validate(); + void _varying_type_changed(int p_index); + void _varying_mode_changed(int p_index); void _varying_name_changed(const String &p_name); void _varying_deleted(); void _varying_selected();