diff options
Diffstat (limited to 'engines/titanic/star_control/dmatrix.cpp')
-rw-r--r-- | engines/titanic/star_control/dmatrix.cpp | 185 |
1 files changed, 156 insertions, 29 deletions
diff --git a/engines/titanic/star_control/dmatrix.cpp b/engines/titanic/star_control/dmatrix.cpp index 2539352483..b7ebbc718a 100644 --- a/engines/titanic/star_control/dmatrix.cpp +++ b/engines/titanic/star_control/dmatrix.cpp @@ -29,25 +29,34 @@ namespace Titanic { DMatrix *DMatrix::_static; DMatrix::DMatrix() : - _row1(1.875, 0.0, 0.0), _row2(0.0, 1.875, 0.0), _row3(0.0, 0.0, 1.875) { + _row1(0.0, 0.0, 0.0), _row2(0.0, 0.0, 0.0), _row3(0.0, 0.0, 0.0) { } -DMatrix::DMatrix(int mode, const FMatrix *src) { - assert(!mode); - - _row1._x = 1.875; - _row2._y = 1.875; - _row3._z = 1.875; - _frow1._x = src->_row1._x; - _frow1._y = src->_row1._y; - _frow1._z = src->_row1._z; - _frow2._x = src->_row2._x; - _frow2._y = src->_row2._y; - _frow2._z = src->_row2._z; +DMatrix::DMatrix(int mode, const DVector &src) { + switch (mode) { + case 0: + _row1._x = 1.0; + _row2._y = 1.0; + _row3._z = 1.0; + _row4 = src; + break; + + case 1: + _row1._x = src._x; + _row2._y = src._y; + _row3._z = src._z; + break; + + default: + _row1._x = 1.0; + _row2._y = 1.0; + _row3._z = 1.0; + break; + } } -DMatrix::DMatrix(int mode, double val) { - set(mode, val); +DMatrix::DMatrix(Axis axis, double amount) { + setRotationMatrix(axis, amount); } DMatrix::DMatrix(const FMatrix &src) { @@ -65,13 +74,13 @@ void DMatrix::deinit() { _static = nullptr; } -void DMatrix::set(int mode, double amount) { +void DMatrix::setRotationMatrix(Axis axis, double amount) { const double FACTOR = 0.0174532925199433; double sinVal = sin(amount * FACTOR); double cosVal = cos(amount * FACTOR); - switch (mode) { - case 0: + switch (axis) { + case X_AXIS: _row1._x = 1.0; _row2._y = cosVal; _row2._z = sinVal; @@ -79,7 +88,7 @@ void DMatrix::set(int mode, double amount) { _row3._z = cosVal; break; - case 1: + case Y_AXIS: _row1._x = cosVal; _row1._z = sinVal; _row2._y = 1.0; @@ -87,7 +96,7 @@ void DMatrix::set(int mode, double amount) { _row3._z = cosVal; break; - case 2: + case Z_AXIS: _row1._x = cosVal; _row1._y = sinVal; _row2._x = -sinVal; @@ -100,20 +109,138 @@ void DMatrix::set(int mode, double amount) { } } -void DMatrix::fn1(DMatrix &m) { - // TODO +DMatrix DMatrix::fn1() const { + double val1 = _row1._x * _row3._z * _row2._y; + double val2 = 0.0; + double val3 = val1; + + if (val1 < 0.0) { + val2 = val3; + val1 = 0.0; + } + + double val4 = _row3._x * _row1._y * _row2._z; + if (val4 < 0.0) + val2 = val2 + val4; + else + val1 = val1 + val4; + + double val5 = _row3._y * _row1._z * _row2._x; + if (val5 < 0.0) + val2 = val2 + val5; + else + val1 = val1 + val5; + + if (-(_row3._x * _row2._y * _row1._z) < 0.0) + val2 = val2 - _row3._x * _row2._y * _row1._z; + else + val1 = val1 - _row3._x * _row2._y * _row1._z; + if (-(_row1._y * _row3._z * _row2._x) < 0.0) + val2 = val2 - _row1._y * _row3._z * _row2._x; + else + val1 = val1 - _row1._y * _row3._z * _row2._x; + + val3 = _row3._y * _row2._z; + double val6 = -(_row1._x * val3); + if (val6 < 0.0) + val2 = val2 + val6; + else + val1 = val1 + val6; + + double val7 = val2 + val1; + assert(!(val7 == 0.0 || fabs(val7 / (val1 - val2)) < 1.0e-10)); + + double val8 = val1; + double val9 = 1.0 / val7; + + DMatrix m; + m._row1._x = (val8 - val3) * val9; + m._row2._x = -((_row3._z * _row2._x - _row3._x * _row2._z) * val9); + m._row3._x = (_row3._y * _row2._x - _row3._x * _row2._y) * val9; + m._row1._y = -((_row1._y * _row3._z - _row3._y * _row1._z) * val9); + m._row2._y = (_row1._x * _row3._z - _row3._x * _row1._z) * val9; + m._row3._y = -((_row1._x * _row3._y - _row3._x * _row1._y) * val9); + m._row1._z = (_row1._y * _row2._z - _row2._y * _row1._z) * val9; + m._row2._z = -((_row1._x * _row2._z - _row1._z * _row2._x) * val9); + m._row3._z = (_row1._x * _row2._y - _row1._y * _row2._x) * val9; + + m._row4._x = -(m._row1._x * _row4._x + _row4._y * m._row2._x + + _row4._z * m._row3._x); + m._row4._y = -(_row4._z * m._row3._y + _row4._y * m._row2._y + + _row4._x * m._row1._y); + m._row4._z = -(_row4._z * m._row3._z + _row4._x * m._row1._z + + _row4._y * m._row2._z); + + return m; } void DMatrix::fn3(CStarControlSub26 *sub26) { - double v = sub26->fn1(); - v = (v < 0.0) ? 0.0 : 2.0 / v; - - error("TODO: DMatrix::fn3 %d", (int)v); + double v3, v4, v5, v6, v7, v8, v9, v10; + double v11, v12, v13, v14, v15, v16, v17, v18, v19, v20; + + v3 = sub26->fn1(); + if (v3 <= 0.0) + v20 = 0.0; + else + v20 = 2.0 / v3; + v4 = v20 * sub26->_sub._v1; + v5 = v20 * sub26->_sub._v2; + v6 = v20 * sub26->_sub._v3; + v7 = v4 * sub26->_sub._v1; + v8 = v4; + v9 = v5; + v10 = v5 * sub26->_sub._v1; + v11 = v5 * sub26->_sub._v2; + v12 = v6; + v13 = v8 * sub26->_field0; + v14 = v12 + v11; + v15 = v6 * sub26->_sub._v2; + v16 = v6 * sub26->_field0; + v17 = v11 + v7; + v18 = v6 * sub26->_sub._v1; + v19 = v9 * sub26->_field0; + _row1._x = 1.0 - v14; + _row1._y = v10 + v16; + _row1._z = v18 - v19; + _row2._x = v10 - v16; + _row2._y = 1.0 - (v12 + v7); + _row2._z = v15 + v13; + _row3._x = v18 + v19; + _row3._y = v15 - v13; + _row3._z = 1.0 - v17; + _row4._x = 0.0; + _row4._y = 0.0; + _row4._z = 0.0; } -const DMatrix *DMatrix::fn4(DMatrix &dest, const DMatrix &m1, const DMatrix &m2) { - // TODO - return nullptr; +DMatrix DMatrix::fn4(const DMatrix &m) { + DMatrix dm, dest; + dm._row1._x = m._row3._x * _row1._z + m._row2._x * _row1._y + + m._row1._x * _row1._x; + dm._row1._y = _row1._x * m._row1._y + m._row3._y * _row1._z + + m._row2._y * _row1._y; + dm._row1._z = _row1._x * m._row1._z + m._row3._z * _row1._z + + m._row2._z * _row1._y; + dm._row2._x = m._row1._x * _row2._x + _row2._y * m._row2._x + + _row2._z * m._row3._x; + dm._row2._y = _row2._y * m._row2._y + _row2._z * m._row3._y + + m._row1._y * _row2._x; + dm._row2._z = m._row1._z * _row2._x + _row2._y * m._row2._z + + _row2._z * m._row3._z; + dm._row3._x = m._row1._x * _row3._x + _row3._y * m._row2._x + + _row3._z * m._row3._x; + dm._row3._y = _row3._y * m._row2._y + _row3._z * m._row3._y + + m._row1._y * _row3._x; + dm._row3._z = m._row2._z * _row3._y + m._row3._z * _row3._z + + m._row1._z * _row3._x; + dm._row4._x = m._row1._x * _row4._x + _row4._y * m._row2._x + + _row4._z * m._row3._x + m._row4._x; + dm._row4._y = _row4._z * m._row3._y + _row4._y * m._row2._y + + _row4._x * m._row1._y + m._row4._y; + dm._row4._z = _row4._y * m._row2._z + _row4._x * m._row1._z + + _row4._z * m._row3._z + m._row4._z; + + return dest; } } // End of namespace Titanic |