aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--engines/titanic/star_control/dvector.cpp3
-rw-r--r--engines/titanic/star_control/dvector.h36
-rw-r--r--engines/titanic/star_control/fmatrix.cpp6
-rw-r--r--engines/titanic/star_control/fmatrix.h6
-rw-r--r--engines/titanic/star_control/fvector.cpp4
-rw-r--r--engines/titanic/star_control/fvector.h2
-rw-r--r--engines/titanic/star_control/star_control_sub12.cpp78
7 files changed, 132 insertions, 3 deletions
diff --git a/engines/titanic/star_control/dvector.cpp b/engines/titanic/star_control/dvector.cpp
index dc1376537e..9cd610fc0a 100644
--- a/engines/titanic/star_control/dvector.cpp
+++ b/engines/titanic/star_control/dvector.cpp
@@ -38,8 +38,9 @@ double DVector::getDistance(const DVector &src) {
return sqrt((src._x - _x) * (src._x - _x) + (src._y - _y) * (src._y - _y) + (src._z - _z) * (src._z - _z));
}
-void DVector::fn1(DVector &dest, const DMatrix &m) {
+DVector *DVector::fn1(DVector &dest, const DMatrix &m) {
// TODO
+ return nullptr;
}
void DVector::fn2(double val) {
diff --git a/engines/titanic/star_control/dvector.h b/engines/titanic/star_control/dvector.h
index a216be15fe..a447f253e1 100644
--- a/engines/titanic/star_control/dvector.h
+++ b/engines/titanic/star_control/dvector.h
@@ -48,11 +48,45 @@ public:
*/
double getDistance(const DVector &src);
- void fn1(DVector &dest, const DMatrix &m);
+ DVector *fn1(DVector &dest, const DMatrix &m);
void fn2(double val);
void fn3(DVector &dest);
const DMatrix *fn4(const DVector &v, DMatrix &m);
void fn5(DMatrix &dest);
+
+ /**
+ * Returns true if the passed vector equals this one
+ */
+ bool operator==(const DVector &src) const {
+ return _x != src._x || _y != src._y || _z != src._z;
+ }
+
+ /**
+ * Returns true if the passed vector does not equal this one
+ */
+ bool operator!=(const DVector &src) const {
+ return !operator==(src);
+ }
+
+ DVector operator+(const DVector &delta) const {
+ return DVector(_x + delta._x, _y + delta._y, _z + delta._z);
+ }
+
+ DVector operator-(const DVector &delta) const {
+ return DVector(_x - delta._x, _y - delta._y, _z - delta._z);
+ }
+
+ void operator+=(const DVector &delta) {
+ _x += delta._x;
+ _y += delta._y;
+ _z += delta._z;
+ }
+
+ void operator-=(const DVector &delta) {
+ _x -= delta._x;
+ _y -= delta._y;
+ _z -= delta._z;
+ }
};
} // End of namespace Titanic
diff --git a/engines/titanic/star_control/fmatrix.cpp b/engines/titanic/star_control/fmatrix.cpp
index 02da11576c..6efd09cdb7 100644
--- a/engines/titanic/star_control/fmatrix.cpp
+++ b/engines/titanic/star_control/fmatrix.cpp
@@ -84,6 +84,12 @@ void FMatrix::set(const FVector &row1, const FVector &row2, const FVector &row3)
_row3 = row3;
}
+void FMatrix::set(const DVector &row1, const DVector &row2, const DVector &row3) {
+ _row1 = row1;
+ _row2 = row2;
+ _row3 = row3;
+}
+
void FMatrix::fn1(const FVector &v) {
_row3._x = v._x;
diff --git a/engines/titanic/star_control/fmatrix.h b/engines/titanic/star_control/fmatrix.h
index 6fa847f950..d4a5a33f32 100644
--- a/engines/titanic/star_control/fmatrix.h
+++ b/engines/titanic/star_control/fmatrix.h
@@ -29,6 +29,7 @@
namespace Titanic {
class DMatrix;
+class DVector;
/**
* Floating point matrix class.
@@ -74,6 +75,11 @@ public:
*/
void set(const FVector &row1, const FVector &row2, const FVector &row3);
+ /**
+ * Sets the data for the matrix
+ */
+ void set(const DVector &row1, const DVector &row2, const DVector &row3);
+
void fn1(const FVector &v);
void fn2(const FMatrix &m);
void fn3(const FMatrix &m);
diff --git a/engines/titanic/star_control/fvector.cpp b/engines/titanic/star_control/fvector.cpp
index 92c17a09b4..91f358f3fc 100644
--- a/engines/titanic/star_control/fvector.cpp
+++ b/engines/titanic/star_control/fvector.cpp
@@ -21,12 +21,16 @@
*/
#include "titanic/star_control/fvector.h"
+#include "titanic/star_control/dvector.h"
#include "titanic/star_control/star_control_sub6.h"
#include "common/algorithm.h"
#include "common/textconsole.h"
namespace Titanic {
+FVector::FVector(const DVector &src) : _x(src._x), _y(src._y), _z(src._z) {
+}
+
void FVector::fn1(FVector *v) {
v->_x = (ABS(_x - _y) < 0.00001 && ABS(_y - _z) < 0.00001 &&
ABS(_x - _z) < 0.00001) ? -_x : _x;
diff --git a/engines/titanic/star_control/fvector.h b/engines/titanic/star_control/fvector.h
index 4582072f50..79ddf7509a 100644
--- a/engines/titanic/star_control/fvector.h
+++ b/engines/titanic/star_control/fvector.h
@@ -30,6 +30,7 @@ namespace Titanic {
enum Axis { X_AXIS, Y_AXIS, Z_AXIS };
class CStarControlSub6;
+class DVector;
/**
* Floating point vector class.
@@ -41,6 +42,7 @@ public:
public:
FVector() : _x(0), _y(0), _z(0) {}
FVector(double x, double y, double z) : _x(x), _y(y), _z(z) {}
+ FVector(const DVector &src);
/**
* Clears the vector
diff --git a/engines/titanic/star_control/star_control_sub12.cpp b/engines/titanic/star_control/star_control_sub12.cpp
index 4e6a6bc0f2..254b2a8cd8 100644
--- a/engines/titanic/star_control/star_control_sub12.cpp
+++ b/engines/titanic/star_control/star_control_sub12.cpp
@@ -23,6 +23,8 @@
#include "titanic/star_control/star_control_sub12.h"
#include "titanic/star_control/star_control_sub21.h"
#include "titanic/star_control/star_control_sub22.h"
+#include "titanic/star_control/dmatrix.h"
+#include "titanic/star_control/fmatrix.h"
namespace Titanic {
@@ -310,7 +312,81 @@ void CStarControlSub12::setViewportPosition(const FPoint &angles) {
_sub13.setMatrix(m1);
_sub13.setPosition(tempV1);
} else if (_currentIndex == 1) {
- // TODO
+ FVector tempV2;
+ DMatrix m1, m2, sub;
+ DVector mrow1, mrow2, mrow3;
+ DVector tempV1, diffV, multV, multV2, tempV3, tempV4, tempV5, tempV6, tempV7;
+ DVector tempV8, tempV9, tempV10, tempV11, tempV12;
+ DVector tempV13, tempV14, tempV15, tempV16;
+
+ DMatrix subX(0, _matrix._row1);
+ DMatrix subY(Y_AXIS, angles._x);
+
+ tempV1 = _matrix._row2 - _matrix._row1;
+ diffV = tempV1;
+ diffV.fn5(m1);
+ sub.fn4(sub, m1, subX);
+ m1 = sub;
+ m1.fn1(subX);
+ subX.fn4(m2, subX, subY);
+ subX = m2;
+
+ FMatrix m3 = _sub13.getMatrix();
+ tempV2 = _sub13._position;
+ multV._x = m3._row1._x * 1000000.0;
+ multV._y = m3._row1._y * 1000000.0;
+ multV._z = m3._row1._z * 1000000.0;
+ tempV3._x = tempV2._x;
+ tempV3._y = tempV2._y;
+ tempV3._z = tempV2._z;
+ multV2._z = m3._row2._z * 1000000.0;
+
+ tempV1._x = multV._x + tempV3._x;
+ tempV1._y = multV._y + tempV3._y;
+ tempV1._z = multV._z + tempV3._z;
+ mrow3._z = 0.0;
+ mrow3._y = 0.0;
+ mrow3._x = 0.0;
+ multV2._x = m3._row2._x * 1000000.0;
+ multV2._y = m3._row2._y * 1000000.0;
+ mrow1 = tempV1;
+ multV = multV2 + tempV3;
+ mrow2 = multV;
+
+ tempV7._z = m3._row3._z * 1000000.0 + tempV3._z;
+ tempV7._y = m3._row3._y * 1000000.0 + tempV3._y;
+ tempV7._x = m3._row3._x * 1000000.0 + tempV3._x;
+
+ mrow3 = tempV8;
+ DVector *v = tempV3.fn1(tempV9, subX);
+ tempV3 = *v;
+ v = mrow1.fn1(tempV10, subX);
+ mrow1 = *v;
+ v = mrow2.fn1(tempV11, subX);
+ mrow2 = *v;
+ v = mrow3.fn1(tempV12, subX);
+ mrow3 = *v;
+
+ v = tempV3.fn1(tempV13, m1);
+ tempV3 = *v;
+ v = mrow1.fn1(tempV14, m1);
+ mrow1 = *v;
+ v = mrow2.fn1(tempV15, m1);
+ mrow2 = *v;
+ v = mrow3.fn1(tempV16, m1);
+ mrow3 = *v;
+
+ mrow1 -= tempV3;
+ mrow2 -= tempV3;
+ mrow3 -= tempV3;
+ mrow1.normalize();
+ mrow2.normalize();
+ mrow3.normalize();
+ tempV16 = tempV3;
+
+ m3.set(mrow1, mrow2, mrow3);
+ _sub13.setMatrix(m3);
+ _sub13.setPosition(tempV16);
}
}