From 0118919d358332f243713b69e6fff163413146a3 Mon Sep 17 00:00:00 2001 From: Paul Gilbert Date: Sat, 16 Jul 2016 21:41:51 -0400 Subject: TITANIC: Further work on DMatrix --- engines/titanic/star_control/dmatrix.cpp | 75 +++++++++++++++++++++- engines/titanic/star_control/dmatrix.h | 21 +++++- engines/titanic/star_control/star_control.cpp | 3 + .../titanic/star_control/star_control_sub26.cpp | 6 ++ engines/titanic/star_control/star_control_sub26.h | 18 +++--- engines/titanic/star_control/star_control_sub6.cpp | 1 + 6 files changed, 112 insertions(+), 12 deletions(-) diff --git a/engines/titanic/star_control/dmatrix.cpp b/engines/titanic/star_control/dmatrix.cpp index 160dccafe1..70008054b6 100644 --- a/engines/titanic/star_control/dmatrix.cpp +++ b/engines/titanic/star_control/dmatrix.cpp @@ -21,13 +21,84 @@ */ #include "titanic/star_control/dmatrix.h" +#include "titanic/star_control/fmatrix.h" +#include "titanic/star_control/star_control_sub26.h" namespace Titanic { +DMatrix *DMatrix::_static; + DMatrix::DMatrix() : - _row1(1.0, 0.0, 0.0), _row2(0.0, 1.0, 0.0), _row3(0.0, 0.0, 1.0), - _row4(0.0, 0.0, 0.0) { + _row1(1.0, 0.0, 0.0), _row2(0.0, 1.0, 0.0), _row3(0.0, 0.0, 1.0) { +} + +DMatrix::DMatrix(int mode, const FMatrix *src) { + assert(!mode); + + _row1._x = 1.0; + _row2._y = 1.0; + _row3._z = 1.0; + _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, double val) { + set(mode, val); +} + +void DMatrix::init() { + _static = nullptr; +} + +void DMatrix::deinit() { + delete _static; + _static = nullptr; } +void DMatrix::set(int mode, double amount) { + const double FACTOR = 0.0174532925199433; + double sinVal = sin(amount * FACTOR); + double cosVal = cos(amount * FACTOR); + + switch (mode) { + case 0: + _row1._x = 1.0; + _row2._y = cosVal; + _row2._z = sinVal; + _row3._y = -sinVal; + _row3._z = cosVal; + break; + + case 1: + _row1._x = cosVal; + _row1._z = sinVal; + _row2._y = 1.0; + _row3._x = -sinVal; + _row3._z = cosVal; + break; + + case 2: + _row1._x = cosVal; + _row1._y = sinVal; + _row2._x = -sinVal; + _row2._y = cosVal; + _row3._z = 1.0; + break; + + default: + break; + } +} + +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); +} } // End of namespace Titanic diff --git a/engines/titanic/star_control/dmatrix.h b/engines/titanic/star_control/dmatrix.h index 565df80cd1..14f6bb0331 100644 --- a/engines/titanic/star_control/dmatrix.h +++ b/engines/titanic/star_control/dmatrix.h @@ -24,21 +24,40 @@ #define TITANIC_DMATRIX_H #include "titanic/star_control/dvector.h" +#include "titanic/star_control/fvector.h" namespace Titanic { +class FMatrix; +class CStarControlSub26; + /** * Double based matrix class. * @remarks TODO: See if it can be merged with FMatrix */ class DMatrix { private: + static DMatrix *_static; +public: DVector _row1; DVector _row2; DVector _row3; - DVector _row4; + FVector _frow1; + FVector _frow2; +public: + static void init(); + static void deinit(); public: DMatrix(); + DMatrix(int mode, const FMatrix *src); + DMatrix(int mode, double val); + + /** + * Sets up data for the matrix + */ + void set(int mode, double amount); + + void fn3(CStarControlSub26 *sub26); }; } // End of namespace Titanic diff --git a/engines/titanic/star_control/star_control.cpp b/engines/titanic/star_control/star_control.cpp index 0e54cf5399..e048d11e88 100644 --- a/engines/titanic/star_control/star_control.cpp +++ b/engines/titanic/star_control/star_control.cpp @@ -22,6 +22,7 @@ #include "titanic/support/screen_manager.h" #include "titanic/star_control/star_control.h" +#include "titanic/star_control/dmatrix.h" #include "titanic/star_control/error_code.h" #include "titanic/star_control/star_control_sub6.h" @@ -37,10 +38,12 @@ END_MESSAGE_MAP() CStarControl::CStarControl() : _fieldBC(0), _field80B0(0), _starRect(20, 10, 620, 350) { CStarControlSub6::init(); + DMatrix::init(); } CStarControl::~CStarControl() { CStarControlSub6::deinit(); + DMatrix::deinit(); } void CStarControl::save(SimpleFile *file, int indent) { diff --git a/engines/titanic/star_control/star_control_sub26.cpp b/engines/titanic/star_control/star_control_sub26.cpp index 9d796a0475..89ff93c347 100644 --- a/engines/titanic/star_control/star_control_sub26.cpp +++ b/engines/titanic/star_control/star_control_sub26.cpp @@ -25,4 +25,10 @@ namespace Titanic { +double CStarControlSub26::fn1() const { + return _sub._v1 * _sub._v1 + _sub._v2 * _sub._v2 + + _sub._v3 * _sub._v3 + _field0 * _field0; +} + + } // End of namespace Titanic diff --git a/engines/titanic/star_control/star_control_sub26.h b/engines/titanic/star_control/star_control_sub26.h index cf0c62afeb..4054a2ba6e 100644 --- a/engines/titanic/star_control/star_control_sub26.h +++ b/engines/titanic/star_control/star_control_sub26.h @@ -27,19 +27,19 @@ namespace Titanic { class CStarControlSub26 { struct Sub { - int _field0; - int _field4; - int _field8; - int _field10; - int _field14; + double _v1; + double _v2; + double _v3; - Sub() : _field0(0), _field4(0), _field8(0), _field10(0), _field14(0) {} + Sub() : _v1(0.0), _v2(0.0), _v3(0.0) {} }; public: - int _field0; - double _field4; + double _field0; + Sub _sub; public: - CStarControlSub26() : _field0(0), _field4(1.875) {} + CStarControlSub26() : _field0(1.0) {} + + double fn1() const; }; } // End of namespace Titanic diff --git a/engines/titanic/star_control/star_control_sub6.cpp b/engines/titanic/star_control/star_control_sub6.cpp index 2022ab8aa6..83abc22c6f 100644 --- a/engines/titanic/star_control/star_control_sub6.cpp +++ b/engines/titanic/star_control/star_control_sub6.cpp @@ -40,6 +40,7 @@ void CStarControlSub6::init() { void CStarControlSub6::deinit() { delete _static; + _static = nullptr; } void CStarControlSub6::clear() { -- cgit v1.2.3