diff options
| author | gingerBill <bill@gingerbill.org> | 2020-01-01 16:14:00 +0000 |
|---|---|---|
| committer | gingerBill <bill@gingerbill.org> | 2020-01-01 16:14:00 +0000 |
| commit | 16a7c55334fafa48d5fd84e86071263f43a3724f (patch) | |
| tree | 03c50395331bb22828204338758632998f0245b9 /src/check_expr.cpp | |
| parent | e9e2ab240db12da856876ebfb98c89781edb8dd2 (diff) | |
Add `x y z w` fields to quaternion types; Improve linalg quaternion mathematics
Diffstat (limited to 'src/check_expr.cpp')
| -rw-r--r-- | src/check_expr.cpp | 42 |
1 files changed, 42 insertions, 0 deletions
diff --git a/src/check_expr.cpp b/src/check_expr.cpp index bb76638ec..f0353e25b 100644 --- a/src/check_expr.cpp +++ b/src/check_expr.cpp @@ -3313,6 +3313,48 @@ ExactValue get_constant_field(CheckerContext *c, Operand const *operand, Selecti if (success_) *success_ = true; return value; + } else if (value.kind == ExactValue_Quaternion) { + // @QuaternionLayout + Quaternion256 q = value.value_quaternion; + GB_ASSERT(sel.index.count == 1); + + switch (sel.index[0]) { + case 3: // w + if (success_) *success_ = true; + return exact_value_float(q.real); + + case 0: // x + if (success_) *success_ = true; + return exact_value_float(q.imag); + + case 1: // y + if (success_) *success_ = true; + return exact_value_float(q.jmag); + + case 2: // z + if (success_) *success_ = true; + return exact_value_float(q.kmag); + } + + if (success_) *success_ = false; + return empty_exact_value; + } else if (value.kind == ExactValue_Complex) { + // @QuaternionLayout + Complex128 c = value.value_complex; + GB_ASSERT(sel.index.count == 1); + + switch (sel.index[0]) { + case 0: // real + if (success_) *success_ = true; + return exact_value_float(c.real); + + case 1: // imag + if (success_) *success_ = true; + return exact_value_float(c.imag); + } + + if (success_) *success_ = false; + return empty_exact_value; } if (success_) *success_ = true; |