aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaul Gilbert2017-03-24 21:19:38 -0400
committerPaul Gilbert2017-03-24 21:19:38 -0400
commit6ecc83325dbd9665e7f8605f85112b8cb5c33528 (patch)
tree932439379b5980bece552eba38beb5e332a5e39a
parentc9f9582994d94b1efa6108fdb7ea4a768dd80acc (diff)
downloadscummvm-rg350-6ecc83325dbd9665e7f8605f85112b8cb5c33528.tar.gz
scummvm-rg350-6ecc83325dbd9665e7f8605f85112b8cb5c33528.tar.bz2
scummvm-rg350-6ecc83325dbd9665e7f8605f85112b8cb5c33528.zip
TITANIC: Finished DMatrix class
-rw-r--r--engines/titanic/star_control/dmatrix.cpp133
-rw-r--r--engines/titanic/star_control/dmatrix.h2
-rw-r--r--engines/titanic/star_control/dvector.cpp4
-rw-r--r--engines/titanic/star_control/star_control_sub12.cpp4
4 files changed, 130 insertions, 13 deletions
diff --git a/engines/titanic/star_control/dmatrix.cpp b/engines/titanic/star_control/dmatrix.cpp
index 86ccd3d866..32614ac063 100644
--- a/engines/titanic/star_control/dmatrix.cpp
+++ b/engines/titanic/star_control/dmatrix.cpp
@@ -109,20 +109,137 @@ void DMatrix::setRotationMatrix(Axis axis, 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._z * m._row2._x
+ + _row4._y * m._row3._x);
+ m._row4._z = -(_row4._y * m._row3._y + _row4._z * m._row2._y
+ + _row4._x * m._row1._y);
+ m._row4._y = -(_row4._y * m._row3._z + _row4._x * m._row1._z
+ + _row4._z * 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;
}
DMatrix DMatrix::fn4(const DMatrix &m) {
- // TODO
- return DMatrix();
+ 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 * dm._row4._x + _row4._y * m._row2._x
+ + _row4._z * m._row3._x + m._row4._x;
+ dm._row4._z = _row4._z * m._row3._y + _row4._y * m._row2._y
+ + dm._row4._x * m._row1._y + m._row4._y;
+ dm._row4._z = _row4._y * m._row2._z + dm._row4._x * m._row1._z
+ + _row4._z * m._row3._z + m._row4._z;
+
+ return dest;
}
} // End of namespace Titanic
diff --git a/engines/titanic/star_control/dmatrix.h b/engines/titanic/star_control/dmatrix.h
index 793abadffd..cc14c5ebbf 100644
--- a/engines/titanic/star_control/dmatrix.h
+++ b/engines/titanic/star_control/dmatrix.h
@@ -57,7 +57,7 @@ public:
*/
void setRotationMatrix(Axis axis, double amount);
- void fn1(DMatrix &m);
+ DMatrix fn1() const;
void fn3(CStarControlSub26 *sub26);
DMatrix fn4(const DMatrix &m);
diff --git a/engines/titanic/star_control/dvector.cpp b/engines/titanic/star_control/dvector.cpp
index 17409c6811..080b45e5b8 100644
--- a/engines/titanic/star_control/dvector.cpp
+++ b/engines/titanic/star_control/dvector.cpp
@@ -86,13 +86,13 @@ void DVector::fn4(const DVector &v, DMatrix &m) {
matrix1.setRotationMatrix(X_AXIS, vector1._y * FACTOR);
matrix2.setRotationMatrix(Y_AXIS, -(vector1._z * FACTOR));
matrix3 = matrix1.fn4(matrix2);
- matrix3.fn1(matrix4);
+ matrix4 = matrix3.fn1();
vector1 = v.fn3();
matrix1.setRotationMatrix(X_AXIS, vector1._y * FACTOR);
matrix2.setRotationMatrix(Y_AXIS, -(vector1._z * FACTOR));
matrix3 = matrix1.fn4(matrix2);
- matrix1.fn1(matrix4);
+ matrix4 = matrix1.fn1();
m = matrix4.fn4(matrix3);
}
diff --git a/engines/titanic/star_control/star_control_sub12.cpp b/engines/titanic/star_control/star_control_sub12.cpp
index 6b2f78c309..e236403e1f 100644
--- a/engines/titanic/star_control/star_control_sub12.cpp
+++ b/engines/titanic/star_control/star_control_sub12.cpp
@@ -326,7 +326,7 @@ void CStarControlSub12::setViewportPosition(const FPoint &angles) {
diffV = tempV1;
m1 = diffV.fn5();
m1 = m1.fn4(subX);
- m1.fn1(subX);
+ subX = m1.fn1();
subX = subX.fn4(subY);
FMatrix m3 = _sub13.getMatrix();
@@ -510,7 +510,7 @@ void CStarControlSub12::fn3(CStarControlSub13 *sub13, const FVector &v) {
m1 = tempV1.fn5();
m1 = m1.fn4(m2);
- m1.fn1(m2);
+ m2 = m1.fn1();
DVector tempV2 = _sub13._position;
DMatrix m4;