diff --git a/drivers/gles3/storage/material_storage.cpp b/drivers/gles3/storage/material_storage.cpp index 40bece02bd1..9be45f9d3fc 100644 --- a/drivers/gles3/storage/material_storage.cpp +++ b/drivers/gles3/storage/material_storage.cpp @@ -776,6 +776,9 @@ void MaterialData::update_uniform_buffer(const HashMapvalue, data, p_use_linear_color); + if (E.value.hint == ShaderLanguage::ShaderNode::Uniform::HINT_COLOR_CONVERSION_DISABLED) { + _fill_std140_variant_ubo_value(E.value.type, E.value.array_size, V->value, data, false); + } else { + _fill_std140_variant_ubo_value(E.value.type, E.value.array_size, V->value, data, p_use_linear_color); + } } else if (E.value.default_value.size()) { //default value @@ -806,6 +810,8 @@ void MaterialStorage::MaterialData::update_uniform_buffer(const HashMap TYPE_MAT4 && p_type < TYPE_STRUCT; } +bool ShaderLanguage::ShaderLanguage::is_hint_color(ShaderLanguage::ShaderNode::Uniform::Hint p_hint) { + return p_hint == ShaderLanguage::ShaderNode::Uniform::HINT_SOURCE_COLOR || p_hint == ShaderLanguage::ShaderNode::Uniform::HINT_COLOR_CONVERSION_DISABLED; +} + Variant ShaderLanguage::constant_value_to_variant(const Vector &p_value, DataType p_type, int p_array_size, ShaderLanguage::ShaderNode::Uniform::Hint p_hint) { int array_size = p_array_size; @@ -4379,7 +4388,7 @@ Variant ShaderLanguage::constant_value_to_variant(const Vector &p_value, if (array_size > 0) { array_size *= 3; - if (p_hint == ShaderLanguage::ShaderNode::Uniform::HINT_SOURCE_COLOR) { + if (ShaderLanguage::is_hint_color(p_hint)) { PackedColorArray array; for (int i = 0; i < array_size; i += 3) { array.push_back(Color(p_value[i].real, p_value[i + 1].real, p_value[i + 2].real)); @@ -4393,7 +4402,7 @@ Variant ShaderLanguage::constant_value_to_variant(const Vector &p_value, value = Variant(array); } } else { - if (p_hint == ShaderLanguage::ShaderNode::Uniform::HINT_SOURCE_COLOR) { + if (ShaderLanguage::is_hint_color(p_hint)) { value = Variant(Color(p_value[0].real, p_value[1].real, p_value[2].real)); } else { value = Variant(Vector3(p_value[0].real, p_value[1].real, p_value[2].real)); @@ -4404,7 +4413,7 @@ Variant ShaderLanguage::constant_value_to_variant(const Vector &p_value, if (array_size > 0) { array_size *= 4; - if (p_hint == ShaderLanguage::ShaderNode::Uniform::HINT_SOURCE_COLOR) { + if (ShaderLanguage::is_hint_color(p_hint)) { PackedColorArray array; for (int i = 0; i < array_size; i += 4) { array.push_back(Color(p_value[i].real, p_value[i + 1].real, p_value[i + 2].real, p_value[i + 3].real)); @@ -4418,7 +4427,7 @@ Variant ShaderLanguage::constant_value_to_variant(const Vector &p_value, value = Variant(array); } } else { - if (p_hint == ShaderLanguage::ShaderNode::Uniform::HINT_SOURCE_COLOR) { + if (ShaderLanguage::is_hint_color(p_hint)) { value = Variant(Color(p_value[0].real, p_value[1].real, p_value[2].real, p_value[3].real)); } else { value = Variant(Vector4(p_value[0].real, p_value[1].real, p_value[2].real, p_value[3].real)); @@ -4922,14 +4931,14 @@ PropertyInfo ShaderLanguage::uniform_to_property_info(const ShaderNode::Uniform break; case ShaderLanguage::TYPE_VEC3: if (p_uniform.array_size > 0) { - if (p_uniform.hint == ShaderLanguage::ShaderNode::Uniform::HINT_SOURCE_COLOR) { + if (ShaderLanguage::is_hint_color(p_uniform.hint)) { pi.hint = PROPERTY_HINT_COLOR_NO_ALPHA; pi.type = Variant::PACKED_COLOR_ARRAY; } else { pi.type = Variant::PACKED_VECTOR3_ARRAY; } } else { - if (p_uniform.hint == ShaderLanguage::ShaderNode::Uniform::HINT_SOURCE_COLOR) { + if (ShaderLanguage::is_hint_color(p_uniform.hint)) { pi.hint = PROPERTY_HINT_COLOR_NO_ALPHA; pi.type = Variant::COLOR; } else { @@ -4939,13 +4948,13 @@ PropertyInfo ShaderLanguage::uniform_to_property_info(const ShaderNode::Uniform break; case ShaderLanguage::TYPE_VEC4: { if (p_uniform.array_size > 0) { - if (p_uniform.hint == ShaderLanguage::ShaderNode::Uniform::HINT_SOURCE_COLOR) { + if (ShaderLanguage::is_hint_color(p_uniform.hint)) { pi.type = Variant::PACKED_COLOR_ARRAY; } else { pi.type = Variant::PACKED_VECTOR4_ARRAY; } } else { - if (p_uniform.hint == ShaderLanguage::ShaderNode::Uniform::HINT_SOURCE_COLOR) { + if (ShaderLanguage::is_hint_color(p_uniform.hint)) { pi.type = Variant::COLOR; } else { pi.type = Variant::VECTOR4; @@ -9720,7 +9729,7 @@ Error ShaderLanguage::_parse_shader(const HashMap &p_f if (uniform.array_size > 0) { static Vector supported_hints = { - TK_HINT_SOURCE_COLOR, TK_REPEAT_DISABLE, TK_REPEAT_ENABLE, + TK_HINT_SOURCE_COLOR, TK_HINT_COLOR_CONVERSION_DISABLED, TK_REPEAT_DISABLE, TK_REPEAT_ENABLE, TK_FILTER_LINEAR, TK_FILTER_LINEAR_MIPMAP, TK_FILTER_LINEAR_MIPMAP_ANISOTROPIC, TK_FILTER_NEAREST, TK_FILTER_NEAREST_MIPMAP, TK_FILTER_NEAREST_MIPMAP_ANISOTROPIC }; @@ -9751,6 +9760,18 @@ Error ShaderLanguage::_parse_shader(const HashMap &p_f new_hint = ShaderNode::Uniform::HINT_SOURCE_COLOR; } } break; + case TK_HINT_COLOR_CONVERSION_DISABLED: { + if (type != TYPE_VEC3 && type != TYPE_VEC4) { + _set_error(vformat(RTR("Source color conversion disabled hint is for '%s', '%s'."), "vec3", "vec4")); + return ERR_PARSE_ERROR; + } + if (uniform.hint != ShaderNode::Uniform::HINT_SOURCE_COLOR) { + _set_error(vformat(RTR("Hint '%s' should be preceded by '%s'."), "color_conversion_disabled", "source_color")); + return ERR_PARSE_ERROR; + } + uniform.hint = ShaderNode::Uniform::HINT_NONE; + new_hint = ShaderNode::Uniform::HINT_COLOR_CONVERSION_DISABLED; + } break; case TK_HINT_DEFAULT_BLACK_TEXTURE: { new_hint = ShaderNode::Uniform::HINT_DEFAULT_BLACK; } break; @@ -9993,7 +10014,7 @@ Error ShaderLanguage::_parse_shader(const HashMap &p_f break; } - bool is_sampler_hint = new_hint != ShaderNode::Uniform::HINT_NONE && new_hint != ShaderNode::Uniform::HINT_SOURCE_COLOR && new_hint != ShaderNode::Uniform::HINT_RANGE && new_hint != ShaderNode::Uniform::HINT_ENUM; + bool is_sampler_hint = new_hint != ShaderNode::Uniform::HINT_NONE && new_hint != ShaderNode::Uniform::HINT_SOURCE_COLOR && new_hint != ShaderNode::Uniform::HINT_COLOR_CONVERSION_DISABLED && new_hint != ShaderNode::Uniform::HINT_RANGE && new_hint != ShaderNode::Uniform::HINT_ENUM; if (((new_filter != FILTER_DEFAULT || new_repeat != REPEAT_DEFAULT) || is_sampler_hint) && !is_sampler_type(type)) { _set_error(RTR("This hint is only for sampler types.")); return ERR_PARSE_ERROR; @@ -11788,6 +11809,7 @@ Error ShaderLanguage::complete(const String &p_code, const ShaderCompileInfo &p_ if (current_uniform_hint == ShaderNode::Uniform::HINT_NONE) { ScriptLanguage::CodeCompletionOption option("source_color", ScriptLanguage::CODE_COMPLETION_KIND_PLAIN_TEXT); r_options->push_back(option); + r_options->push_back({ "color_conversion_disabled", ScriptLanguage::CODE_COMPLETION_KIND_PLAIN_TEXT }); } } else if ((completion_base == DataType::TYPE_INT || completion_base == DataType::TYPE_FLOAT) && !completion_base_array) { if (current_uniform_hint == ShaderNode::Uniform::HINT_NONE) { diff --git a/servers/rendering/shader_language.h b/servers/rendering/shader_language.h index c3cb1d5b492..33d1aebf4dd 100644 --- a/servers/rendering/shader_language.h +++ b/servers/rendering/shader_language.h @@ -176,6 +176,7 @@ public: TK_HINT_ROUGHNESS_GRAY, TK_HINT_ANISOTROPY_TEXTURE, TK_HINT_SOURCE_COLOR, + TK_HINT_COLOR_CONVERSION_DISABLED, TK_HINT_RANGE, TK_HINT_ENUM, TK_HINT_INSTANCE_INDEX, @@ -661,6 +662,7 @@ public: HINT_RANGE, HINT_ENUM, HINT_SOURCE_COLOR, + HINT_COLOR_CONVERSION_DISABLED, HINT_NORMAL, HINT_ROUGHNESS_NORMAL, HINT_ROUGHNESS_R, @@ -844,6 +846,7 @@ public: static bool is_scalar_type(DataType p_type); static bool is_float_type(DataType p_type); static bool is_sampler_type(DataType p_type); + static bool is_hint_color(ShaderNode::Uniform::Hint p_hint); static Variant constant_value_to_variant(const Vector &p_value, DataType p_type, int p_array_size, ShaderLanguage::ShaderNode::Uniform::Hint p_hint = ShaderLanguage::ShaderNode::Uniform::HINT_NONE); static Variant get_default_datatype_value(DataType p_type, int p_array_size, ShaderLanguage::ShaderNode::Uniform::Hint p_hint); static PropertyInfo uniform_to_property_info(const ShaderNode::Uniform &p_uniform);