Fix shader uniforms has null as default value
This commit is contained in:
parent
02b16d2f54
commit
285a9e531b
@ -573,6 +573,9 @@ Variant ShaderData::get_default_parameter(const StringName &p_parameter) const {
|
|||||||
if (uniforms.has(p_parameter)) {
|
if (uniforms.has(p_parameter)) {
|
||||||
ShaderLanguage::ShaderNode::Uniform uniform = uniforms[p_parameter];
|
ShaderLanguage::ShaderNode::Uniform uniform = uniforms[p_parameter];
|
||||||
Vector<ShaderLanguage::Scalar> default_value = uniform.default_value;
|
Vector<ShaderLanguage::Scalar> 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 ShaderLanguage::constant_value_to_variant(default_value, uniform.type, uniform.array_size, uniform.hint);
|
||||||
}
|
}
|
||||||
return Variant();
|
return Variant();
|
||||||
|
@ -567,6 +567,9 @@ Variant MaterialStorage::ShaderData::get_default_parameter(const StringName &p_p
|
|||||||
if (uniforms.has(p_parameter)) {
|
if (uniforms.has(p_parameter)) {
|
||||||
ShaderLanguage::ShaderNode::Uniform uniform = uniforms[p_parameter];
|
ShaderLanguage::ShaderNode::Uniform uniform = uniforms[p_parameter];
|
||||||
Vector<ShaderLanguage::Scalar> default_value = uniform.default_value;
|
Vector<ShaderLanguage::Scalar> 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 ShaderLanguage::constant_value_to_variant(default_value, uniform.type, uniform.array_size, uniform.hint);
|
||||||
}
|
}
|
||||||
return Variant();
|
return Variant();
|
||||||
|
@ -4498,6 +4498,297 @@ Variant ShaderLanguage::constant_value_to_variant(const Vector<Scalar> &p_value,
|
|||||||
return Variant();
|
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<bool>::init(&value);
|
||||||
|
VariantDefaultInitializer<bool>::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<int64_t>::init(&value);
|
||||||
|
VariantDefaultInitializer<int64_t>::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<int64_t>::init(&value);
|
||||||
|
VariantDefaultInitializer<int64_t>::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<int64_t>::init(&value);
|
||||||
|
VariantDefaultInitializer<int64_t>::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<int64_t>::init(&value);
|
||||||
|
VariantDefaultInitializer<int64_t>::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<Vector2i>::init(&value);
|
||||||
|
VariantDefaultInitializer<Vector2i>::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<Vector3i>::init(&value);
|
||||||
|
VariantDefaultInitializer<Vector3i>::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<Vector4i>::init(&value);
|
||||||
|
VariantDefaultInitializer<Vector4i>::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<int64_t>::init(&value);
|
||||||
|
VariantDefaultInitializer<int64_t>::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<Vector2i>::init(&value);
|
||||||
|
VariantDefaultInitializer<Vector2i>::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<Vector3i>::init(&value);
|
||||||
|
VariantDefaultInitializer<Vector3i>::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<Vector4i>::init(&value);
|
||||||
|
VariantDefaultInitializer<Vector4i>::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<float>::init(&value);
|
||||||
|
VariantDefaultInitializer<float>::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<Vector2>::init(&value);
|
||||||
|
VariantDefaultInitializer<Vector2>::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<Color>::init(&value);
|
||||||
|
VariantDefaultInitializer<Color>::init(&value);
|
||||||
|
} else {
|
||||||
|
VariantInitializer<Vector3>::init(&value);
|
||||||
|
VariantDefaultInitializer<Vector3>::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<Color>::init(&value);
|
||||||
|
VariantDefaultInitializer<Color>::init(&value);
|
||||||
|
} else {
|
||||||
|
VariantInitializer<Vector4>::init(&value);
|
||||||
|
VariantDefaultInitializer<Vector4>::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<Transform2D>::init(&value);
|
||||||
|
VariantDefaultInitializer<Transform2D>::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<Basis>::init(&value);
|
||||||
|
VariantDefaultInitializer<Basis>::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<Projection>::init(&value);
|
||||||
|
VariantDefaultInitializer<Projection>::init(&value);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
default: {
|
||||||
|
} break;
|
||||||
|
}
|
||||||
|
return value;
|
||||||
|
}
|
||||||
|
|
||||||
PropertyInfo ShaderLanguage::uniform_to_property_info(const ShaderNode::Uniform &p_uniform) {
|
PropertyInfo ShaderLanguage::uniform_to_property_info(const ShaderNode::Uniform &p_uniform) {
|
||||||
PropertyInfo pi;
|
PropertyInfo pi;
|
||||||
switch (p_uniform.type) {
|
switch (p_uniform.type) {
|
||||||
|
@ -820,6 +820,7 @@ public:
|
|||||||
static bool is_float_type(DataType p_type);
|
static bool is_float_type(DataType p_type);
|
||||||
static bool is_sampler_type(DataType p_type);
|
static bool is_sampler_type(DataType p_type);
|
||||||
static Variant constant_value_to_variant(const Vector<Scalar> &p_value, DataType p_type, int p_array_size, ShaderLanguage::ShaderNode::Uniform::Hint p_hint = ShaderLanguage::ShaderNode::Uniform::HINT_NONE);
|
static Variant constant_value_to_variant(const Vector<Scalar> &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 PropertyInfo uniform_to_property_info(const ShaderNode::Uniform &p_uniform);
|
||||||
static uint32_t get_datatype_size(DataType p_type);
|
static uint32_t get_datatype_size(DataType p_type);
|
||||||
static uint32_t get_datatype_component_count(DataType p_type);
|
static uint32_t get_datatype_component_count(DataType p_type);
|
||||||
|
Loading…
Reference in New Issue
Block a user