Prevent using boolean varyings in vertex function of visual shaders

This commit is contained in:
Chaosus 2024-12-12 14:30:46 +03:00
parent 38775731e8
commit 059ed731f5
2 changed files with 44 additions and 14 deletions

View file

@ -5905,24 +5905,49 @@ void VisualShaderEditor::_varying_create() {
add_varying_dialog->hide(); add_varying_dialog->hide();
} }
void VisualShaderEditor::_varying_name_changed(const String &p_name) { void VisualShaderEditor::_varying_validate() {
if (!p_name.is_valid_ascii_identifier()) { bool has_error = false;
varying_error_label->show(); String error;
varying_error_label->set_text(TTR("Invalid name for varying.")); String varname = varying_name->get_text();
add_varying_dialog->get_ok_button()->set_disabled(true);
return; 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)) {
varying_error_label->show(); if (varying_type->get_selected() == 6 && varying_mode->get_selected() == VisualShader::VaryingMode::VARYING_MODE_VERTEX_TO_FRAG_LIGHT) {
varying_error_label->set_text(TTR("Varying with that name is already exist.")); if (has_error) {
add_varying_dialog->get_ok_button()->set_disabled(true); error += "\n";
return; }
error += vformat(TTR("Boolean type cannot be used with `%s` varying mode."), "Vertex -> [Fragment, Light]");
has_error = true;
} }
if (varying_error_label->is_visible()) {
if (has_error) {
varying_error_label->show();
varying_error_label->set_text(error);
add_varying_dialog->get_ok_button()->set_disabled(true);
} else {
varying_error_label->hide(); 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() { void VisualShaderEditor::_varying_deleted() {
@ -6795,6 +6820,7 @@ VisualShaderEditor::VisualShaderEditor() {
varying_type->add_item("Vector4"); varying_type->add_item("Vector4");
varying_type->add_item("Boolean"); varying_type->add_item("Boolean");
varying_type->add_item("Transform"); varying_type->add_item("Transform");
varying_type->connect(SceneStringName(item_selected), callable_mp(this, &VisualShaderEditor::_varying_type_changed));
varying_name = memnew(LineEdit); varying_name = memnew(LineEdit);
hb->add_child(varying_name); hb->add_child(varying_name);
@ -6807,6 +6833,7 @@ VisualShaderEditor::VisualShaderEditor() {
hb->add_child(varying_mode); hb->add_child(varying_mode);
varying_mode->add_item("Vertex -> [Fragment, Light]"); varying_mode->add_item("Vertex -> [Fragment, Light]");
varying_mode->add_item("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); varying_error_label = memnew(Label);
vb->add_child(varying_error_label); vb->add_child(varying_error_label);

View file

@ -595,6 +595,9 @@ class VisualShaderEditor : public ShaderEditor {
void _member_cancel(); void _member_cancel();
void _varying_create(); 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_name_changed(const String &p_name);
void _varying_deleted(); void _varying_deleted();
void _varying_selected(); void _varying_selected();