123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167 |
- #pragma once
- #include <Mathematics/Vector3.h>
- namespace WwiseGTE
- {
-
- template <typename Real>
- using Vector4 = Vector<4, Real>;
-
-
-
-
-
-
-
-
-
- template <typename Real>
- Vector4<Real> HyperCross(Vector4<Real> const& v0, Vector4<Real> const& v1, Vector4<Real> const& v2)
- {
- Real m01 = v0[0] * v1[1] - v0[1] * v1[0];
- Real m02 = v0[0] * v1[2] - v0[2] * v1[0];
- Real m03 = v0[0] * v1[3] - v0[3] * v1[0];
- Real m12 = v0[1] * v1[2] - v0[2] * v1[1];
- Real m13 = v0[1] * v1[3] - v0[3] * v1[1];
- Real m23 = v0[2] * v1[3] - v0[3] * v1[2];
- return Vector4<Real>
- {
- +m23 * v2[1] - m13 * v2[2] + m12 * v2[3],
- -m23 * v2[0] + m03 * v2[2] - m02 * v2[3],
- +m13 * v2[0] - m03 * v2[1] + m01 * v2[3],
- -m12 * v2[0] + m02 * v2[1] - m01 * v2[2]
- };
- }
-
- template <typename Real>
- Vector4<Real> UnitHyperCross(Vector4<Real> const& v0,
- Vector4<Real> const& v1, Vector4<Real> const& v2, bool robust = false)
- {
- Vector4<Real> unitHyperCross = HyperCross(v0, v1, v2);
- Normalize(unitHyperCross, robust);
- return unitHyperCross;
- }
-
-
-
- template <typename Real>
- Real DotHyperCross(Vector4<Real> const& v0, Vector4<Real> const& v1,
- Vector4<Real> const& v2, Vector4<Real> const& v3)
- {
- return Dot(HyperCross(v0, v1, v2), v3);
- }
-
-
-
-
-
-
-
- template <typename Real>
- Real ComputeOrthogonalComplement(int numInputs, Vector4<Real>* v, bool robust = false)
- {
- if (numInputs == 1)
- {
- int maxIndex = 0;
- Real maxAbsValue = std::fabs(v[0][0]);
- for (int i = 1; i < 4; ++i)
- {
- Real absValue = std::fabs(v[0][i]);
- if (absValue > maxAbsValue)
- {
- maxIndex = i;
- maxAbsValue = absValue;
- }
- }
- if (maxIndex < 2)
- {
- v[1][0] = -v[0][1];
- v[1][1] = +v[0][0];
- v[1][2] = (Real)0;
- v[1][3] = (Real)0;
- }
- else if (maxIndex == 3)
- {
-
-
-
-
- v[1][0] = (Real)0;
- v[1][1] = +v[0][2];
- v[1][2] = -v[0][1];
- v[1][3] = (Real)0;
- }
- else
- {
- v[1][0] = (Real)0;
- v[1][1] = (Real)0;
- v[1][2] = -v[0][3];
- v[1][3] = +v[0][2];
- }
- numInputs = 2;
- }
- if (numInputs == 2)
- {
- Real det[6] =
- {
- v[0][0] * v[1][1] - v[1][0] * v[0][1],
- v[0][0] * v[1][2] - v[1][0] * v[0][2],
- v[0][0] * v[1][3] - v[1][0] * v[0][3],
- v[0][1] * v[1][2] - v[1][1] * v[0][2],
- v[0][1] * v[1][3] - v[1][1] * v[0][3],
- v[0][2] * v[1][3] - v[1][2] * v[0][3]
- };
- int maxIndex = 0;
- Real maxAbsValue = std::fabs(det[0]);
- for (int i = 1; i < 6; ++i)
- {
- Real absValue = std::fabs(det[i]);
- if (absValue > maxAbsValue)
- {
- maxIndex = i;
- maxAbsValue = absValue;
- }
- }
- if (maxIndex == 0)
- {
- v[2] = { -det[4], +det[2], (Real)0, -det[0] };
- }
- else if (maxIndex <= 2)
- {
- v[2] = { +det[5], (Real)0, -det[2], +det[1] };
- }
- else
- {
- v[2] = { (Real)0, -det[5], +det[4], -det[3] };
- }
- numInputs = 3;
- }
- if (numInputs == 3)
- {
- v[3] = HyperCross(v[0], v[1], v[2]);
- return Orthonormalize<4, Real>(4, v, robust);
- }
- return (Real)0;
- }
- }
|