aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJFonS2018-04-29 20:58:42 +0200
committerHein-Pieter van Braam2018-05-13 23:02:32 +0200
commit4de1d0905a29fc62e7837c0f2d0ef55ccc0e1fdc (patch)
tree85c177abad61db03f2025278cc66ce81d2e008b7
parentc461b15720359129a47de4ca370785e100043214 (diff)
downloadgodot-4de1d0905a29fc62e7837c0f2d0ef55ccc0e1fdc.tar.gz
godot-4de1d0905a29fc62e7837c0f2d0ef55ccc0e1fdc.tar.zst
godot-4de1d0905a29fc62e7837c0f2d0ef55ccc0e1fdc.zip
Fix vector reduction in shader language
(cherry picked from commit 5b50685b38bf527dff5a816ce4505a32ef682a9e)
-rw-r--r--servers/visual/shader_language.cpp46
-rw-r--r--servers/visual/shader_language.h1
2 files changed, 44 insertions, 3 deletions
diff --git a/servers/visual/shader_language.cpp b/servers/visual/shader_language.cpp
index d5a9bfb60..5ecc7ad52 100644
--- a/servers/visual/shader_language.cpp
+++ b/servers/visual/shader_language.cpp
@@ -2212,6 +2212,37 @@ ShaderLanguage::DataType ShaderLanguage::get_scalar_type(DataType p_type) {
return scalar_types[p_type];
}
+int ShaderLanguage::get_cardinality(DataType p_type) {
+ static const int cardinality_table[] = {
+ 0,
+ 1,
+ 2,
+ 3,
+ 4,
+ 1,
+ 2,
+ 3,
+ 4,
+ 1,
+ 2,
+ 3,
+ 4,
+ 1,
+ 2,
+ 3,
+ 4,
+ 2,
+ 3,
+ 4,
+ 1,
+ 1,
+ 1,
+ 1,
+ };
+
+ return cardinality_table[p_type];
+}
+
bool ShaderLanguage::_get_completable_identifier(BlockNode *p_block, CompletionType p_type, StringName &identifier) {
identifier = StringName();
@@ -3122,9 +3153,18 @@ ShaderLanguage::Node *ShaderLanguage::_reduce_expression(BlockNode *p_block, Sha
if (get_scalar_type(cn->datatype) == base) {
- for (int j = 0; j < cn->values.size(); j++) {
- values.push_back(cn->values[j]);
- }
+ 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
} else if (get_scalar_type(cn->datatype) == cn->datatype) {
ConstantNode::Value v;
diff --git a/servers/visual/shader_language.h b/servers/visual/shader_language.h
index e8cdf1f89..4f5619b6e 100644
--- a/servers/visual/shader_language.h
+++ b/servers/visual/shader_language.h
@@ -532,6 +532,7 @@ public:
static bool convert_constant(ConstantNode *p_constant, DataType p_to_type, ConstantNode::Value *p_value = NULL);
static DataType get_scalar_type(DataType p_type);
+ static int get_cardinality(DataType p_type);
static bool is_scalar_type(DataType p_type);
static bool is_sampler_type(DataType p_type);