diff --git a/drivers/gles3/storage/material_storage.cpp b/drivers/gles3/storage/material_storage.cpp index 67dd9bcb4ee4..85183451cc3e 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 25adf0c9db3d..a0fc977bd8fa 100644 --- a/servers/rendering/renderer_rd/storage_rd/material_storage.cpp +++ b/servers/rendering/renderer_rd/storage_rd/material_storage.cpp @@ -569,6 +569,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 755f10058005..c99117c46128 100644 --- a/servers/rendering/shader_language.cpp +++ b/servers/rendering/shader_language.cpp @@ -4513,6 +4513,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 61a3f1fa0281..1a119682f07a 100644 --- a/servers/rendering/shader_language.h +++ b/servers/rendering/shader_language.h @@ -824,6 +824,7 @@ class ShaderLanguage { 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);