TITANIC: Further work on DMatrix

This commit is contained in:
Paul Gilbert 2016-07-16 21:41:51 -04:00
parent 1b06a9294a
commit 0118919d35
6 changed files with 112 additions and 12 deletions

View File

@ -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

View File

@ -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

View File

@ -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) {

View File

@ -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

View File

@ -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

View File

@ -40,6 +40,7 @@ void CStarControlSub6::init() {
void CStarControlSub6::deinit() {
delete _static;
_static = nullptr;
}
void CStarControlSub6::clear() {