diff options
-rw-r--r-- | COPYRIGHT.txt | 11 | ||||
-rw-r--r-- | servers/visual/shader_language.cpp | 47 |
2 files changed, 37 insertions, 21 deletions
diff --git a/COPYRIGHT.txt b/COPYRIGHT.txt index 4ba80941e0..49c602eb84 100644 --- a/COPYRIGHT.txt +++ b/COPYRIGHT.txt @@ -10,8 +10,9 @@ # all corresponding files (also recursively in subfolders), apart from those # with a more explicit copyright statement. # -# Licenses are given with their SPDX identifier, and are all included in -# plain text at the end of this file (in alphabetical order). +# Licenses are given with their debian/copyright short name (or SPDX identifier +# if no standard short name exists) and are all included in plain text at the +# end of this file (in alphabetical order). # # Disclaimer for thirdparty libraries: # ------------------------------------ @@ -139,7 +140,7 @@ Files: ./thirdparty/cvtt/ Comment: Convection Texture Tools Stand-Alone Kernels Copyright: 2018, Eric Lasota 2018, Microsoft Corp. -License: MIT +License: Expat Files: ./thirdparty/enet/ Comment: ENet @@ -373,7 +374,7 @@ Files: ./thirdparty/tinyexr/ Comment: TinyEXR Copyright: 2014-2017, Syoyo Fujita 2002, Industrial Light & Magic, a division of Lucas Digital Ltd. LLC -License: BSD-3-Clause +License: BSD-3-clause Files: ./thirdparty/zlib/ Comment: zlib @@ -383,7 +384,7 @@ License: Zlib Files: ./thirdparty/zstd/ Comment: Zstandard Copyright: 2016-2018, Facebook, Inc. -License: BSD-3-Clause +License: BSD-3-clause diff --git a/servers/visual/shader_language.cpp b/servers/visual/shader_language.cpp index ffb130048f..9500f35732 100644 --- a/servers/visual/shader_language.cpp +++ b/servers/visual/shader_language.cpp @@ -2368,9 +2368,9 @@ int ShaderLanguage::get_cardinality(DataType p_type) { 2, 3, 4, - 2, - 3, 4, + 9, + 16, 1, 1, 1, @@ -3307,7 +3307,9 @@ ShaderLanguage::Node *ShaderLanguage::_reduce_expression(BlockNode *p_block, Sha ERR_FAIL_COND_V(op->arguments[0]->type != Node::TYPE_VARIABLE, p_node); - DataType base = get_scalar_type(op->get_datatype()); + DataType type = op->get_datatype(); + DataType base = get_scalar_type(type); + int cardinality = get_cardinality(type); Vector<ConstantNode::Value> values; @@ -3318,19 +3320,9 @@ ShaderLanguage::Node *ShaderLanguage::_reduce_expression(BlockNode *p_block, Sha ConstantNode *cn = static_cast<ConstantNode *>(op->arguments[i]); if (get_scalar_type(cn->datatype) == base) { - - int cardinality = get_cardinality(op->arguments[i]->get_datatype()); - if (cn->values.size() == cardinality) { - - for (int j = 0; j < cn->values.size(); j++) { - values.push_back(cn->values[j]); - } - } else if (cn->values.size() == 1) { - - for (int j = 0; j < cardinality; j++) { - values.push_back(cn->values[0]); - } - } // else: should be filtered by the parser as it's an invalid constructor + for (int j = 0; j < cn->values.size(); j++) { + values.push_back(cn->values[j]); + } } else if (get_scalar_type(cn->datatype) == cn->datatype) { ConstantNode::Value v; @@ -3347,6 +3339,29 @@ ShaderLanguage::Node *ShaderLanguage::_reduce_expression(BlockNode *p_block, Sha } } + if (values.size() == 1) { + if (type >= TYPE_MAT2 && type <= TYPE_MAT4) { + ConstantNode::Value value = values[0]; + ConstantNode::Value zero; + zero.real = 0.0f; + int size = 2 + (type - TYPE_MAT2); + + values.clear(); + for (int i = 0; i < size; i++) { + for (int j = 0; j < size; j++) { + values.push_back(i == j ? value : zero); + } + } + } else { + for (int i = 1; i < cardinality; i++) { + values.push_back(values[0]); + } + } + } else if (values.size() != cardinality) { + ERR_PRINT("Failed to reduce expression, values and cardinality mismatch."); + return p_node; + } + ConstantNode *cn = alloc_node<ConstantNode>(); cn->datatype = op->get_datatype(); cn->values = values; |