Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Prevent using boolean varyings in vertex function of visual shaders #100309

Merged
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
53 changes: 40 additions & 13 deletions editor/plugins/visual_shader_editor_plugin.cpp
Original file line number Diff line number Diff line change
@@ -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);
3 changes: 3 additions & 0 deletions editor/plugins/visual_shader_editor_plugin.h
Original file line number Diff line number Diff line change
@@ -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();