aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--engines/titanic/star_control/dmatrix.cpp2
-rw-r--r--engines/titanic/star_control/star_control_sub12.cpp99
2 files changed, 99 insertions, 2 deletions
diff --git a/engines/titanic/star_control/dmatrix.cpp b/engines/titanic/star_control/dmatrix.cpp
index 940b34833f..1808b13dc2 100644
--- a/engines/titanic/star_control/dmatrix.cpp
+++ b/engines/titanic/star_control/dmatrix.cpp
@@ -29,7 +29,7 @@ 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 DVector &src) {
diff --git a/engines/titanic/star_control/star_control_sub12.cpp b/engines/titanic/star_control/star_control_sub12.cpp
index 653c156ebf..45cebec836 100644
--- a/engines/titanic/star_control/star_control_sub12.cpp
+++ b/engines/titanic/star_control/star_control_sub12.cpp
@@ -504,7 +504,104 @@ void CStarControlSub12::fn3(CStarControlSub13 *sub13, const FVector &v) {
if (_matrixRow != 0)
return;
- // TODO
+ DMatrix m1;
+ DVector tempV1 = _matrix._row1;
+ DMatrix m2(0, tempV1);
+
+ tempV1 = v - _matrix._row1;
+ tempV1.fn5(m1);
+
+ DMatrix m3;
+ const DMatrix *m = m1.fn4(m3, m1, m2);
+ m1 = *m;
+ m1.fn1(m2);
+
+ DVector tempV2 = _sub13._position;
+ DMatrix m4;
+ m4._row1 = sub13->_position;
+ m4._row2 = DVector(0.0, 0.0, 0.0);
+ m4._row3 = DVector(0.0, 0.0, 0.0);
+ m4._row4 = DVector(0.0, 0.0, 0.0);
+
+ FMatrix m5 = sub13->getMatrix();
+ DVector tempV3, tempV4;
+ tempV4._x = m5._row1._x * 1000000.0 + m4._row1._x;
+ tempV4._y = m5._row1._y * 1000000.0 + m4._row1._y;
+ tempV4._z = m5._row1._z * 1000000.0 + m4._row1._z;
+ tempV3._x = m5._row2._x * 1000000.0 + m4._row1._x;
+ tempV3._y = m5._row2._y * 1000000.0 + m4._row1._y;
+ tempV3._z = m5._row2._z * 1000000.0 + m4._row1._z;
+ m4._row3 = tempV4;
+ m4._row2 = tempV3;
+
+ tempV4._x = m5._row3._x * 1000000.0;
+ tempV4._y = m5._row3._y * 1000000.0;
+ tempV3._x = tempV4._x + m4._row1._x;
+ tempV3._y = tempV4._y + m4._row1._y;
+ tempV3._z = m5._row3._z * 1000000.0 + m4._row1._z;
+ m4._row4 = tempV3;
+
+ DVector *dv = tempV2.fn1(tempV3, m2);
+ tempV3 = *dv;
+ dv = m4._row1.fn1(tempV3, m2);
+ m4._row1 = *dv;
+ dv = m4._row3.fn1(tempV3, m2);
+ m4._row3 = *dv;
+ dv = m4._row2.fn1(tempV3, m2);
+ m4._row2 = *dv;
+ dv = m4._row4.fn1(tempV3, m2);
+ m4._row4 = *dv;
+
+ // Find the angle that gives the minimum distance
+ DVector tempV5;
+ double minDistance = 1.0e20;
+ int minDegree = 0;
+ for (int degree = 0; degree < 360; ++degree) {
+ tempV5 = m4._row1;
+ tempV5.fn2((double)degree);
+ double distance = tempV2.getDistance(tempV5);
+
+ if (distance < minDistance) {
+ minDistance = distance;
+ minDegree = degree;
+ }
+ }
+
+ m4._row1.fn2((double)minDegree);
+ m4._row2.fn2((double)minDegree);
+ m4._row3.fn2((double)minDegree);
+ m4._row4.fn2((double)minDegree);
+ dv = m4._row1.fn1(tempV3, m1);
+ m4._row1 = *dv;
+ dv = m4._row3.fn1(tempV3, m1);
+ m4._row3 = *dv;
+ dv = m4._row2.fn1(tempV3, m1);
+ m4._row2 = *dv;
+ dv = m4._row4.fn1(tempV3, m1);
+ m4._row4 = *dv;
+
+ m4._row3._x -= m4._row1._x;
+ m4._row3._y -= m4._row1._y;
+ m4._row3._z -= m4._row1._z;
+ m4._row2._x -= m4._row1._x;
+ m4._row2._y -= m4._row1._y;
+ m4._row2._z = m4._row2._z - m4._row1._z;
+
+ m4._row4._x = m4._row4._x - m4._row1._x;
+ m4._row4._y = m4._row4._y - m4._row1._y;
+ m4._row4._z = m4._row4._z - m4._row1._z;
+
+ m4._row3.normalize();
+ m4._row2.normalize();
+ m4._row4.normalize();
+ m5.set(m4._row3, m4._row2, m4._row4);
+
+ FVector tempV6 = m4._row1;
+ FMatrix m6 = _sub13.getMatrix();
+ _handlerP->proc8(_sub13._position, tempV6, m6, m5);
+
+ CStarVector *sv = new CStarVector(this, v);
+ _handlerP->setVector(sv);
}
} // End of namespace Titanic