2016-03-05 21:44:57 -05:00
|
|
|
/* ScummVM - Graphic Adventure Engine
|
|
|
|
*
|
|
|
|
* ScummVM is the legal property of its developers, whose names
|
|
|
|
* are too numerous to list here. Please refer to the COPYRIGHT
|
|
|
|
* file distributed with this source distribution.
|
|
|
|
*
|
|
|
|
* This program is free software; you can redistribute it and/or
|
|
|
|
* modify it under the terms of the GNU General Public License
|
|
|
|
* as published by the Free Software Foundation; either version 2
|
|
|
|
* of the License, or (at your option) any later version.
|
|
|
|
*
|
|
|
|
* This program is distributed in the hope that it will be useful,
|
|
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
* GNU General Public License for more details.
|
|
|
|
*
|
|
|
|
* You should have received a copy of the GNU General Public License
|
|
|
|
* along with this program; if not, write to the Free Software
|
|
|
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
|
|
|
*
|
|
|
|
*/
|
|
|
|
|
|
|
|
#include "titanic/star_control/star_control_sub13.h"
|
|
|
|
|
|
|
|
namespace Titanic {
|
|
|
|
|
2017-03-11 14:30:31 -05:00
|
|
|
CStarControlSub13::CStarControlSub13() {
|
|
|
|
_fieldC = 0;
|
|
|
|
_field10 = 800.0;
|
|
|
|
_field14 = 10000.0;
|
|
|
|
_field18 = 20.0;
|
|
|
|
_field1C = 20.0;
|
|
|
|
_width = 600;
|
|
|
|
_height = 340;
|
|
|
|
_field24 = 0;
|
|
|
|
_fieldC0 = _fieldC4 = _fieldC8 = 0.0;
|
|
|
|
_fieldCC = _fieldD0 = _fieldD4 = 0.0;
|
|
|
|
Common::fill(&_valArray[0], &_valArray[5], 0.0);
|
2016-03-05 21:44:57 -05:00
|
|
|
}
|
|
|
|
|
2016-07-17 16:43:53 -04:00
|
|
|
CStarControlSub13::CStarControlSub13(CStarControlSub13 *src) :
|
|
|
|
_matrix(&src->_matrix), _sub1(&src->_sub1), _sub2(&src->_sub2) {
|
2016-07-17 21:26:03 -04:00
|
|
|
_position = src->_position;
|
2016-07-17 16:43:53 -04:00
|
|
|
_fieldC = src->_fieldC;
|
|
|
|
_field10 = src->_field10;
|
|
|
|
_field14 = src->_field14;
|
|
|
|
_field18 = src->_field18;
|
|
|
|
_field1C = src->_field1C;
|
|
|
|
_width = src->_width;
|
|
|
|
_height = src->_height;
|
|
|
|
|
|
|
|
_fieldCC = src->_fieldCC;
|
|
|
|
_fieldD0 = src->_fieldD0;
|
|
|
|
_fieldC0 = src->_fieldC0;
|
|
|
|
_fieldC4 = src->_fieldC4;
|
|
|
|
_fieldC8 = src->_fieldC8;
|
|
|
|
_field24 = src->_field24;
|
|
|
|
|
2017-03-11 14:30:31 -05:00
|
|
|
Common::copy(&src->_valArray[0], &src->_valArray[4], &_valArray[0]);
|
2016-07-17 16:43:53 -04:00
|
|
|
_fieldD4 = 0;
|
|
|
|
}
|
|
|
|
|
2017-03-11 14:30:31 -05:00
|
|
|
void CStarControlSub13::copyFrom(const CStarControlSub13 *src) {
|
|
|
|
if (src) {
|
|
|
|
// TODO: Not really certain src is a CStarControlSub13
|
|
|
|
_position = src->_position;
|
|
|
|
_fieldC = src->_field18;
|
|
|
|
_field10 = src->_field1C;
|
|
|
|
}
|
2016-07-17 20:18:20 -04:00
|
|
|
}
|
|
|
|
|
2016-03-05 21:44:57 -05:00
|
|
|
void CStarControlSub13::load(SimpleFile *file, int param) {
|
2016-07-17 21:26:03 -04:00
|
|
|
_position._x = file->readFloat();
|
|
|
|
_position._y = file->readFloat();
|
|
|
|
_position._z = file->readFloat();
|
2016-03-05 21:44:57 -05:00
|
|
|
_fieldC = file->readFloat();
|
|
|
|
_field10 = file->readFloat();
|
|
|
|
_field14 = file->readFloat();
|
|
|
|
_field18 = file->readFloat();
|
|
|
|
_field1C = file->readFloat();
|
2016-10-09 14:59:58 +02:00
|
|
|
|
2016-07-17 16:43:53 -04:00
|
|
|
int widthHeight = file->readNumber();
|
|
|
|
_width = widthHeight & 0xff;
|
|
|
|
_height = _width >> 16;
|
2016-03-05 21:44:57 -05:00
|
|
|
_field24 = file->readNumber();
|
2016-10-09 14:59:58 +02:00
|
|
|
|
2016-03-05 21:44:57 -05:00
|
|
|
for (int idx = 0; idx < 5; ++idx)
|
|
|
|
_valArray[idx] = file->readFloat();
|
|
|
|
|
2016-07-16 08:50:42 -04:00
|
|
|
_matrix.load(file, param);
|
2016-03-05 21:44:57 -05:00
|
|
|
_fieldD4 = 0;
|
|
|
|
}
|
|
|
|
|
2016-06-29 19:53:16 -04:00
|
|
|
void CStarControlSub13::save(SimpleFile *file, int indent) {
|
2016-07-17 21:26:03 -04:00
|
|
|
file->writeFloatLine(_position._x, indent);
|
|
|
|
file->writeFloatLine(_position._y, indent);
|
|
|
|
file->writeFloatLine(_position._z, indent);
|
2016-07-17 16:43:53 -04:00
|
|
|
file->writeFloatLine(_fieldC, indent);
|
|
|
|
file->writeFloatLine(_field10, indent);
|
|
|
|
file->writeFloatLine(_field14, indent);
|
|
|
|
file->writeFloatLine(_field18, indent);
|
|
|
|
file->writeFloatLine(_field1C, indent);
|
|
|
|
file->writeFloatLine(_width | (_height << 16), indent);
|
|
|
|
|
|
|
|
for (int idx = 0; idx < 5; ++idx)
|
|
|
|
file->writeFloatLine(_valArray[idx], indent);
|
|
|
|
|
2016-07-16 08:50:42 -04:00
|
|
|
_matrix.save(file, indent);
|
2016-03-05 21:44:57 -05:00
|
|
|
}
|
|
|
|
|
2016-07-17 21:26:03 -04:00
|
|
|
void CStarControlSub13::setPosition(const FVector &v) {
|
|
|
|
_position = v;
|
|
|
|
_fieldD4 = 0;
|
2016-07-17 20:18:20 -04:00
|
|
|
}
|
|
|
|
|
2017-03-11 14:30:31 -05:00
|
|
|
void CStarControlSub13::setPosition(const CStarControlSub6 *sub6) {
|
2016-07-17 23:18:06 -04:00
|
|
|
FVector vector;
|
2017-03-11 14:30:31 -05:00
|
|
|
_position.fn5(&vector, sub6);
|
|
|
|
_position = sub6->_row1;
|
2016-07-17 23:18:06 -04:00
|
|
|
_fieldD4 = 0;
|
|
|
|
}
|
|
|
|
|
2016-07-17 21:26:03 -04:00
|
|
|
void CStarControlSub13::setMatrix(const FMatrix &m) {
|
|
|
|
_matrix = m;
|
|
|
|
_fieldD4 = 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
void CStarControlSub13::fn11(const FVector &v) {
|
2017-03-11 14:30:31 -05:00
|
|
|
_matrix.fn1(v);
|
2016-07-17 20:18:20 -04:00
|
|
|
_fieldD4 = 0;
|
|
|
|
}
|
|
|
|
|
2017-03-11 14:30:31 -05:00
|
|
|
void CStarControlSub13::setC(double v) {
|
2016-07-17 20:18:20 -04:00
|
|
|
_fieldC = v;
|
|
|
|
_fieldD4 = 0;
|
|
|
|
}
|
|
|
|
|
2017-03-11 14:30:31 -05:00
|
|
|
void CStarControlSub13::set10(double v) {
|
2016-07-17 20:18:20 -04:00
|
|
|
_field10 = v;
|
|
|
|
_fieldD4 = 0;
|
|
|
|
}
|
|
|
|
|
2017-03-11 14:30:31 -05:00
|
|
|
void CStarControlSub13::set14(double v) {
|
2016-07-17 20:18:20 -04:00
|
|
|
_field10 = v;
|
|
|
|
}
|
|
|
|
|
2017-03-11 14:30:31 -05:00
|
|
|
void CStarControlSub13::set18(double v) {
|
2016-07-17 20:18:20 -04:00
|
|
|
_field18 = v;
|
|
|
|
_fieldD4 = 0;
|
|
|
|
}
|
|
|
|
|
2017-03-11 14:30:31 -05:00
|
|
|
void CStarControlSub13::set1C(double v) {
|
2016-07-17 20:18:20 -04:00
|
|
|
_field1C = v;
|
|
|
|
_fieldD4 = 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
void CStarControlSub13::fn12() {
|
|
|
|
_matrix.clear();
|
|
|
|
error("TODO: CStarControlSub13::fn12");
|
|
|
|
}
|
|
|
|
|
2017-03-02 23:04:02 -05:00
|
|
|
void CStarControlSub13::fn13(StarMode mode, double v2) {
|
|
|
|
if (mode == MODE_STARFIELD) {
|
2016-07-17 20:18:20 -04:00
|
|
|
_valArray[0] = v2;
|
|
|
|
_valArray[1] = -v2;
|
|
|
|
} else {
|
|
|
|
_valArray[3] = v2;
|
|
|
|
_valArray[4] = -v2;
|
|
|
|
}
|
|
|
|
|
|
|
|
_valArray[2] = 0.0;
|
|
|
|
_field24 = v2 ? 2 : 0;
|
|
|
|
}
|
2016-03-05 21:44:57 -05:00
|
|
|
|
2017-03-11 14:30:31 -05:00
|
|
|
void CStarControlSub13::reposition(double factor) {
|
|
|
|
_position._x = _matrix._row3._x * factor + _position._x;
|
|
|
|
_position._y = _matrix._row3._y * factor + _position._y;
|
|
|
|
_position._z = _matrix._row3._z * factor + _position._z;
|
|
|
|
_fieldD4 = 0;
|
2016-07-17 23:18:06 -04:00
|
|
|
}
|
|
|
|
|
2017-03-11 14:30:31 -05:00
|
|
|
void CStarControlSub13::fn15(const FMatrix &matrix) {
|
|
|
|
_matrix.fn3(matrix);
|
2016-07-17 23:18:06 -04:00
|
|
|
_fieldD4 = 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
CStarControlSub6 CStarControlSub13::getSub1() {
|
|
|
|
if (!_fieldD4)
|
|
|
|
reset();
|
|
|
|
|
|
|
|
return _sub1;
|
|
|
|
}
|
|
|
|
|
|
|
|
CStarControlSub6 CStarControlSub13::getSub2() {
|
|
|
|
if (!_fieldD4)
|
|
|
|
reset();
|
|
|
|
|
|
|
|
return _sub2;
|
|
|
|
}
|
|
|
|
|
2017-03-05 09:59:43 -05:00
|
|
|
void CStarControlSub13::fn16(int index, const FVector &src, FVector &dest) {
|
2017-03-11 14:30:31 -05:00
|
|
|
CStarControlSub6 temp = getSub1();
|
|
|
|
|
|
|
|
dest._x = temp._row3._x * src._z + temp._row2._x * src._y
|
|
|
|
+ src._x * temp._row1._x + temp._vector._x;
|
|
|
|
dest._y = temp._row3._y * src._z + temp._row2._y * src._y
|
|
|
|
+ src._x * temp._row1._y + temp._vector._y;
|
|
|
|
dest._z = temp._row3._z * src._z + temp._row2._z * src._y
|
|
|
|
+ src._x * temp._row1._z + temp._vector._z;
|
2016-07-17 23:18:06 -04:00
|
|
|
}
|
|
|
|
|
2017-03-11 14:30:31 -05:00
|
|
|
FVector CStarControlSub13::fn17(int index, const FVector &src) {
|
|
|
|
FVector dest;
|
|
|
|
FVector tv;
|
|
|
|
CStarControlSub6 sub6 = getSub1();
|
|
|
|
src.fn5(&tv, &sub6);
|
|
|
|
|
|
|
|
dest._x = (_valArray[index] + tv._x)
|
|
|
|
* _fieldC8 / (_fieldCC * tv._z);
|
|
|
|
dest._y = (tv._y * _fieldC8) / (_fieldD0 * tv._z);
|
|
|
|
dest._z = tv._z;
|
|
|
|
return dest;
|
2016-07-17 23:18:06 -04:00
|
|
|
}
|
|
|
|
|
2017-03-11 14:30:31 -05:00
|
|
|
FVector CStarControlSub13::fn18(int index, const FVector &src) {
|
|
|
|
FVector dest;
|
|
|
|
FVector tv;
|
|
|
|
CStarControlSub6 sub6 = getSub2();
|
|
|
|
src.fn5(&tv, &sub6);
|
|
|
|
|
|
|
|
dest._x = (_valArray[index] + tv._x)
|
|
|
|
* _fieldC8 / (_fieldCC * tv._z);
|
|
|
|
dest._y = (tv._y * _fieldC8) / (_fieldD0 * tv._z);
|
|
|
|
dest._z = tv._z;
|
|
|
|
return dest;
|
2016-07-17 23:18:06 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
void CStarControlSub13::fn19(double *v1, double *v2, double *v3, double *v4) {
|
|
|
|
error("TODO: CStarControlSub13::fn19");
|
|
|
|
}
|
|
|
|
|
|
|
|
void CStarControlSub13::reset() {
|
2017-03-11 14:30:31 -05:00
|
|
|
const double FACTOR = 3.1415927 * 0.0055555557;
|
|
|
|
|
|
|
|
_sub2.copyFrom(_matrix);
|
|
|
|
_sub2._vector._x = _position._x;
|
|
|
|
_sub2._vector._y = _position._y;
|
|
|
|
_sub2._vector._z = _position._z;
|
|
|
|
_sub2.fn3(&_sub1);
|
|
|
|
|
|
|
|
double widthV = (double)_width * 0.5;
|
|
|
|
double heightV = (double)_height * 0.5;
|
|
|
|
_fieldC0 = widthV;
|
|
|
|
_fieldC4 = heightV;
|
|
|
|
_fieldC8 = MIN(widthV, heightV);
|
|
|
|
_fieldCC = tan(_field18 * FACTOR);
|
|
|
|
_fieldD4 = 1;
|
|
|
|
_fieldD0 = tan(_field1C * FACTOR);
|
2016-07-17 23:18:06 -04:00
|
|
|
}
|
|
|
|
|
2017-03-11 14:30:31 -05:00
|
|
|
const FMatrix &CStarControlSub13::getMatrix() const {
|
|
|
|
return _matrix;
|
2016-07-17 21:26:03 -04:00
|
|
|
}
|
|
|
|
|
2016-03-05 21:44:57 -05:00
|
|
|
} // End of namespace Titanic
|