aboutsummaryrefslogtreecommitdiff
path: root/engines/titanic/star_control/dmatrix.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'engines/titanic/star_control/dmatrix.cpp')
-rw-r--r--engines/titanic/star_control/dmatrix.cpp185
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