From 285a9e531beef5d3de728134330058adba4e219d Mon Sep 17 00:00:00 2001 From: Chaosus Date: Fri, 16 Aug 2024 12:21:32 +0300 Subject: [PATCH] Fix shader uniforms has null as default value --- drivers/gles3/storage/material_storage.cpp | 3 + .../storage_rd/material_storage.cpp | 3 + servers/rendering/shader_language.cpp | 291 ++++++++++++++++++ servers/rendering/shader_language.h | 1 + 4 files changed, 298 insertions(+) diff --git a/drivers/gles3/storage/material_storage.cpp b/drivers/gles3/storage/material_storage.cpp index 7d5af48384c..f026d02c74d 100644 --- a/drivers/gles3/storage/material_storage.cpp +++ b/drivers/gles3/storage/material_storage.cpp @@ -573,6 +573,9 @@ Variant ShaderData::get_default_parameter(const StringName &p_parameter) const { if (uniforms.has(p_parameter)) { ShaderLanguage::ShaderNode::Uniform uniform = uniforms[p_parameter]; Vector default_value = uniform.default_value; + if (default_value.is_empty()) { + return ShaderLanguage::get_default_datatype_value(uniform.type, uniform.array_size, uniform.hint); + } return ShaderLanguage::constant_value_to_variant(default_value, uniform.type, uniform.array_size, uniform.hint); } return Variant(); diff --git a/servers/rendering/renderer_rd/storage_rd/material_storage.cpp b/servers/rendering/renderer_rd/storage_rd/material_storage.cpp index 9f390c99f91..ae19b319dfa 100644 --- a/servers/rendering/renderer_rd/storage_rd/material_storage.cpp +++ b/servers/rendering/renderer_rd/storage_rd/material_storage.cpp @@ -567,6 +567,9 @@ Variant MaterialStorage::ShaderData::get_default_parameter(const StringName &p_p if (uniforms.has(p_parameter)) { ShaderLanguage::ShaderNode::Uniform uniform = uniforms[p_parameter]; Vector default_value = uniform.default_value; + if (default_value.is_empty()) { + return ShaderLanguage::get_default_datatype_value(uniform.type, uniform.array_size, uniform.hint); + } return ShaderLanguage::constant_value_to_variant(default_value, uniform.type, uniform.array_size, uniform.hint); } return Variant(); diff --git a/servers/rendering/shader_language.cpp b/servers/rendering/shader_language.cpp index 5a3c5d2fd09..aded00478bc 100644 --- a/servers/rendering/shader_language.cpp +++ b/servers/rendering/shader_language.cpp @@ -4498,6 +4498,297 @@ Variant ShaderLanguage::constant_value_to_variant(const Vector &p_value, return Variant(); } +Variant ShaderLanguage::get_default_datatype_value(DataType p_type, int p_array_size, ShaderLanguage::ShaderNode::Uniform::Hint p_hint) { + int array_size = p_array_size; + + Variant value; + switch (p_type) { + case ShaderLanguage::TYPE_BOOL: + if (array_size > 0) { + PackedInt32Array array; + for (int i = 0; i < array_size; i++) { + array.push_back(false); + } + value = Variant(array); + } else { + VariantInitializer::init(&value); + VariantDefaultInitializer::init(&value); + } + break; + case ShaderLanguage::TYPE_BVEC2: + array_size *= 2; + + if (array_size > 0) { + PackedInt32Array array; + for (int i = 0; i < array_size; i++) { + array.push_back(false); + } + value = Variant(array); + } else { + VariantInitializer::init(&value); + VariantDefaultInitializer::init(&value); + } + break; + case ShaderLanguage::TYPE_BVEC3: + array_size *= 3; + + if (array_size > 0) { + PackedInt32Array array; + for (int i = 0; i < array_size; i++) { + array.push_back(false); + } + value = Variant(array); + } else { + VariantInitializer::init(&value); + VariantDefaultInitializer::init(&value); + } + break; + case ShaderLanguage::TYPE_BVEC4: + array_size *= 4; + + if (array_size > 0) { + PackedInt32Array array; + for (int i = 0; i < array_size; i++) { + array.push_back(false); + } + value = Variant(array); + } else { + VariantInitializer::init(&value); + VariantDefaultInitializer::init(&value); + } + break; + case ShaderLanguage::TYPE_INT: + if (array_size > 0) { + PackedInt32Array array; + for (int i = 0; i < array_size; i++) { + array.push_back(0); + } + value = Variant(array); + } else { + VariantInitializer::init(&value); + VariantDefaultInitializer::init(&value); + } + break; + case ShaderLanguage::TYPE_IVEC2: + if (array_size > 0) { + array_size *= 2; + + PackedInt32Array array; + for (int i = 0; i < array_size; i++) { + array.push_back(0); + } + value = Variant(array); + } else { + VariantInitializer::init(&value); + VariantDefaultInitializer::init(&value); + } + break; + case ShaderLanguage::TYPE_IVEC3: + if (array_size > 0) { + array_size *= 3; + + PackedInt32Array array; + for (int i = 0; i < array_size; i++) { + array.push_back(0); + } + value = Variant(array); + } else { + VariantInitializer::init(&value); + VariantDefaultInitializer::init(&value); + } + break; + case ShaderLanguage::TYPE_IVEC4: + if (array_size > 0) { + array_size *= 4; + + PackedInt32Array array; + for (int i = 0; i < array_size; i++) { + array.push_back(0); + } + value = Variant(array); + } else { + VariantInitializer::init(&value); + VariantDefaultInitializer::init(&value); + } + break; + case ShaderLanguage::TYPE_UINT: + if (array_size > 0) { + PackedInt32Array array; + for (int i = 0; i < array_size; i++) { + array.push_back(0U); + } + value = Variant(array); + } else { + VariantInitializer::init(&value); + VariantDefaultInitializer::init(&value); + } + break; + case ShaderLanguage::TYPE_UVEC2: + if (array_size > 0) { + array_size *= 2; + + PackedInt32Array array; + for (int i = 0; i < array_size; i++) { + array.push_back(0U); + } + value = Variant(array); + } else { + VariantInitializer::init(&value); + VariantDefaultInitializer::init(&value); + } + break; + case ShaderLanguage::TYPE_UVEC3: + if (array_size > 0) { + array_size *= 3; + + PackedInt32Array array; + for (int i = 0; i < array_size; i++) { + array.push_back(0U); + } + value = Variant(array); + } else { + VariantInitializer::init(&value); + VariantDefaultInitializer::init(&value); + } + break; + case ShaderLanguage::TYPE_UVEC4: + if (array_size > 0) { + array_size *= 4; + + PackedInt32Array array; + for (int i = 0; i < array_size; i++) { + array.push_back(0U); + } + value = Variant(array); + } else { + VariantInitializer::init(&value); + VariantDefaultInitializer::init(&value); + } + break; + case ShaderLanguage::TYPE_FLOAT: + if (array_size > 0) { + PackedFloat32Array array; + for (int i = 0; i < array_size; i++) { + array.push_back(0.0f); + } + value = Variant(array); + } else { + VariantInitializer::init(&value); + VariantDefaultInitializer::init(&value); + } + break; + case ShaderLanguage::TYPE_VEC2: + if (array_size > 0) { + PackedVector2Array array; + for (int i = 0; i < array_size; i++) { + array.push_back(Vector2(0.0f, 0.0f)); + } + value = Variant(array); + } else { + VariantInitializer::init(&value); + VariantDefaultInitializer::init(&value); + } + break; + case ShaderLanguage::TYPE_VEC3: + if (array_size > 0) { + if (p_hint == ShaderLanguage::ShaderNode::Uniform::HINT_SOURCE_COLOR) { + PackedColorArray array; + for (int i = 0; i < array_size; i++) { + array.push_back(Color(0.0f, 0.0f, 0.0f)); + } + value = Variant(array); + } else { + PackedVector3Array array; + for (int i = 0; i < array_size; i++) { + array.push_back(Vector3(0.0f, 0.0f, 0.0f)); + } + value = Variant(array); + } + } else { + if (p_hint == ShaderLanguage::ShaderNode::Uniform::HINT_SOURCE_COLOR) { + VariantInitializer::init(&value); + VariantDefaultInitializer::init(&value); + } else { + VariantInitializer::init(&value); + VariantDefaultInitializer::init(&value); + } + } + break; + case ShaderLanguage::TYPE_VEC4: + if (array_size > 0) { + if (p_hint == ShaderLanguage::ShaderNode::Uniform::HINT_SOURCE_COLOR) { + PackedColorArray array; + for (int i = 0; i < array_size; i++) { + array.push_back(Color(0.0f, 0.0f, 0.0f, 0.0f)); + } + value = Variant(array); + } else { + PackedVector4Array array; + for (int i = 0; i < array_size; i++) { + array.push_back(Vector4(0.0f, 0.0f, 0.0f, 0.0f)); + } + value = Variant(array); + } + } else { + if (p_hint == ShaderLanguage::ShaderNode::Uniform::HINT_SOURCE_COLOR) { + VariantInitializer::init(&value); + VariantDefaultInitializer::init(&value); + } else { + VariantInitializer::init(&value); + VariantDefaultInitializer::init(&value); + } + } + break; + case ShaderLanguage::TYPE_MAT2: + if (array_size > 0) { + PackedFloat32Array array; + for (int i = 0; i < array_size; i++) { + for (int j = 0; j < 4; j++) { + array.push_back(0.0f); + } + } + value = Variant(array); + } else { + VariantInitializer::init(&value); + VariantDefaultInitializer::init(&value); + } + break; + case ShaderLanguage::TYPE_MAT3: { + if (array_size > 0) { + PackedFloat32Array array; + for (int i = 0; i < array_size; i++) { + for (int j = 0; j < 9; j++) { + array.push_back(0.0f); + } + } + value = Variant(array); + } else { + VariantInitializer::init(&value); + VariantDefaultInitializer::init(&value); + } + break; + } + case ShaderLanguage::TYPE_MAT4: { + if (array_size > 0) { + PackedFloat32Array array; + for (int i = 0; i < array_size; i++) { + for (int j = 0; j < 16; j++) { + array.push_back(0.0f); + } + } + value = Variant(array); + } else { + VariantInitializer::init(&value); + VariantDefaultInitializer::init(&value); + } + break; + } + default: { + } break; + } + return value; +} + PropertyInfo ShaderLanguage::uniform_to_property_info(const ShaderNode::Uniform &p_uniform) { PropertyInfo pi; switch (p_uniform.type) { diff --git a/servers/rendering/shader_language.h b/servers/rendering/shader_language.h index b0d579dfe76..ca30c4858f7 100644 --- a/servers/rendering/shader_language.h +++ b/servers/rendering/shader_language.h @@ -820,6 +820,7 @@ public: static bool is_float_type(DataType p_type); static bool is_sampler_type(DataType p_type); 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); static uint32_t get_datatype_size(DataType p_type); static uint32_t get_datatype_component_count(DataType p_type);