|
@@ -213,6 +213,7 @@ const char *ShaderLanguage::token_names[TK_MAX] = {
|
|
|
"HINT_ROUGHNESS_GRAY",
|
|
|
"HINT_ANISOTROPY_TEXTURE",
|
|
|
"HINT_SOURCE_COLOR",
|
|
|
+ "HINT_COLOR_CONVERSION_DISABLED",
|
|
|
"HINT_RANGE",
|
|
|
"HINT_ENUM",
|
|
|
"HINT_INSTANCE_INDEX",
|
|
@@ -368,6 +369,7 @@ const ShaderLanguage::KeyWord ShaderLanguage::keyword_list[] = {
|
|
|
// hints
|
|
|
|
|
|
{ TK_HINT_SOURCE_COLOR, "source_color", CF_UNSPECIFIED, {}, {} },
|
|
|
+ { TK_HINT_COLOR_CONVERSION_DISABLED, "color_conversion_disabled", CF_UNSPECIFIED, {}, {} },
|
|
|
{ TK_HINT_RANGE, "hint_range", CF_UNSPECIFIED, {}, {} },
|
|
|
{ TK_HINT_ENUM, "hint_enum", CF_UNSPECIFIED, {}, {} },
|
|
|
{ TK_HINT_INSTANCE_INDEX, "instance_index", CF_UNSPECIFIED, {}, {} },
|
|
@@ -1188,6 +1190,9 @@ String ShaderLanguage::get_uniform_hint_name(ShaderNode::Uniform::Hint p_hint) {
|
|
|
case ShaderNode::Uniform::HINT_SOURCE_COLOR: {
|
|
|
result = "source_color";
|
|
|
} break;
|
|
|
+ case ShaderNode::Uniform::HINT_COLOR_CONVERSION_DISABLED: {
|
|
|
+ result = "color_conversion_disabled";
|
|
|
+ } break;
|
|
|
case ShaderNode::Uniform::HINT_NORMAL: {
|
|
|
result = "hint_normal";
|
|
|
} break;
|
|
@@ -4195,6 +4200,10 @@ bool ShaderLanguage::is_sampler_type(DataType p_type) {
|
|
|
return p_type > 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<Scalar> &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<Scalar> &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<Scalar> &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<Scalar> &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<Scalar> &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<StringName, FunctionInfo> &p_f
|
|
|
|
|
|
if (uniform.array_size > 0) {
|
|
|
static Vector<int> 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<StringName, FunctionInfo> &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<StringName, FunctionInfo> &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) {
|