From e1ea47eb5c029dea58ca6fa3336eec99e0b03d45 Mon Sep 17 00:00:00 2001 From: Paul Gilbert Date: Sun, 16 Apr 2017 15:40:30 -0400 Subject: TITANIC: Rename CStarControlSub13 to CViewport --- engines/titanic/star_control/star_camera.cpp | 132 +++++------ engines/titanic/star_control/star_camera.h | 17 +- .../titanic/star_control/star_control_sub13.cpp | 264 --------------------- engines/titanic/star_control/star_control_sub13.h | 114 --------- engines/titanic/star_control/star_view.h | 4 +- engines/titanic/star_control/viewport.cpp | 264 +++++++++++++++++++++ engines/titanic/star_control/viewport.h | 118 +++++++++ 7 files changed, 460 insertions(+), 453 deletions(-) delete mode 100644 engines/titanic/star_control/star_control_sub13.cpp delete mode 100644 engines/titanic/star_control/star_control_sub13.h create mode 100644 engines/titanic/star_control/viewport.cpp create mode 100644 engines/titanic/star_control/viewport.h (limited to 'engines/titanic/star_control') diff --git a/engines/titanic/star_control/star_camera.cpp b/engines/titanic/star_control/star_camera.cpp index adcc7e4e94..de1ba6cf03 100644 --- a/engines/titanic/star_control/star_camera.cpp +++ b/engines/titanic/star_control/star_camera.cpp @@ -37,8 +37,8 @@ CStarCamera::CStarCamera(const CNavigationInfo *data) : setupHandler(data); } -CStarCamera::CStarCamera(CStarControlSub13 *src) : - _matrixRow(-1), _mover(nullptr), _field108(0), _sub13(src) { +CStarCamera::CStarCamera(CViewport *src) : + _matrixRow(-1), _mover(nullptr), _field108(0), _viewport(src) { } void CStarCamera::init() { @@ -57,8 +57,8 @@ CStarCamera::~CStarCamera() { deleteHandler(); } -void CStarCamera::proc2(const CStarControlSub13 *src) { - _sub13.copyFrom(src); +void CStarCamera::proc2(const CViewport *src) { + _viewport.copyFrom(src); } void CStarCamera::proc3(const CNavigationInfo *src) { @@ -67,58 +67,58 @@ void CStarCamera::proc3(const CNavigationInfo *src) { void CStarCamera::setPosition(const FVector &v) { if (!isLocked()) { - _sub13.setPosition(v); + _viewport.setPosition(v); set108(); } } void CStarCamera::proc5(const FVector &v) { if (!isLocked()) - _sub13.fn11(v); + _viewport.fn11(v); } void CStarCamera::proc6(int v) { if (!isLocked()) - _sub13.setC(v); + _viewport.setC(v); } void CStarCamera::proc7(int v) { if (!isLocked()) - _sub13.set10(v); + _viewport.set10(v); } void CStarCamera::proc8(int v) { if (!isLocked()) - _sub13.set14(v); + _viewport.set14(v); } void CStarCamera::proc9(int v) { if (!isLocked()) - _sub13.set18(v); + _viewport.set18(v); } void CStarCamera::proc10(int v) { if (!isLocked()) - _sub13.set1C(v); + _viewport.set1C(v); } void CStarCamera::proc11() { if (!isLocked()) - _sub13.fn12(); + _viewport.fn12(); } void CStarCamera::proc12(StarMode mode, double v2) { if (!isLocked()) - _sub13.fn13(mode, v2); + _viewport.fn13(mode, v2); } -void CStarCamera::proc13(CStarControlSub13 *dest) { - *dest = _sub13; +void CStarCamera::proc13(CViewport *dest) { + *dest = _viewport; } void CStarCamera::setDestination(const FVector &v) { - FMatrix matrix = _sub13.getMatrix(); - FVector vector = _sub13._position; + FMatrix matrix = _viewport.getMatrix(); + FVector vector = _viewport._position; _mover->moveTo(vector, v, matrix); } @@ -129,20 +129,20 @@ void CStarCamera::proc15(CErrorCode *errorCode) { if (!_matrix2) _matrix2 = new FMatrix(); - *_matrix1 = _sub13.getMatrix(); + *_matrix1 = _viewport.getMatrix(); *_matrix2 = *_matrix1; - FVector v1 = _sub13._position; - FVector v2 = _sub13._position; + FVector v1 = _viewport._position; + FVector v2 = _viewport._position; _mover->proc11(*errorCode, v2, *_matrix2); if (v1 != v2) { - _sub13.setPosition(v2); + _viewport.setPosition(v2); set108(); } if (*_matrix1 != *_matrix2) { - _sub13.setMatrix(*_matrix2); + _viewport.setMatrix(*_matrix2); } } @@ -164,60 +164,60 @@ void CStarCamera::proc19() { void CStarCamera::proc20(double factor) { if (!isLocked()) - _sub13.reposition(factor); + _viewport.reposition(factor); } void CStarCamera::proc21(const FPose &pose) { if (!isLocked()) { - _sub13.setPosition(pose); + _viewport.setPosition(pose); set108(); } } void CStarCamera::proc22(FMatrix &m) { if (!isLocked()) - _sub13.fn15(m); + _viewport.fn15(m); } FPose CStarCamera::getPose() { - return _sub13.getSub1(); + return _viewport.getSub1(); } FPose CStarCamera::getPose2() { - return _sub13.getSub2(); + return _viewport.getSub2(); } double CStarCamera::getThreshold() const { - return _sub13._field10; + return _viewport._field10; } double CStarCamera::proc26() const { - return _sub13._field14; + return _viewport._field14; } int CStarCamera::proc27() const { - return _sub13._field24; + return _viewport._field24; } FVector CStarCamera::proc28(int index, const FVector &src) { FVector dest; - dest._x = ((_sub13._valArray[index] + src._x) * _sub13._centerVector._x) - / (_sub13._centerVector._y * src._z); - dest._y = src._y * _sub13._centerVector._x / (_sub13._centerVector._z * src._z); + dest._x = ((_viewport._valArray[index] + src._x) * _viewport._centerVector._x) + / (_viewport._centerVector._y * src._z); + dest._y = src._y * _viewport._centerVector._x / (_viewport._centerVector._z * src._z); dest._z = src._z; return dest; } FVector CStarCamera::proc29(int index, const FVector &src) { - return _sub13.fn16(index, src); + return _viewport.fn16(index, src); } FVector CStarCamera::proc30(int index, const FVector &v) { - return _sub13.fn17(index, v); + return _viewport.fn17(index, v); } FVector CStarCamera::proc31(int index, const FVector &v) { - return _sub13.fn18(index, v); + return _viewport.fn18(index, v); } void CStarCamera::setViewportAngle(const FPoint &angles) { @@ -237,8 +237,8 @@ void CStarCamera::setViewportAngle(const FPoint &angles) { FPose subY(Y_AXIS, angles._x); FPose sub(subX, subY); - FMatrix m1 = _sub13.getMatrix(); - FVector tempV1 = _sub13._position; + FMatrix m1 = _viewport.getMatrix(); + FVector tempV1 = _viewport._position; FVector tempV2, tempV3, tempV4, tempV5, tempV6; tempV2._y = m1._row1._y * 100000.0; tempV2._z = m1._row1._z * 100000.0; @@ -312,8 +312,8 @@ void CStarCamera::setViewportAngle(const FPoint &angles) { tempV1 += row1; m1.set(tempV4, tempV5, tempV6); - _sub13.setMatrix(m1); - _sub13.setPosition(tempV1); + _viewport.setMatrix(m1); + _viewport.setPosition(tempV1); } else if (_matrixRow == 1) { FVector tempV2; DMatrix m1, m2, sub; @@ -332,8 +332,8 @@ void CStarCamera::setViewportAngle(const FPoint &angles) { subX = m1.fn1(); subX = subX.fn4(subY); - FMatrix m3 = _sub13.getMatrix(); - tempV2 = _sub13._position; + FMatrix m3 = _viewport.getMatrix(); + tempV2 = _viewport._position; multV._x = m3._row1._x * 1000000.0; multV._y = m3._row1._y * 1000000.0; multV._z = m3._row1._z * 1000000.0; @@ -386,8 +386,8 @@ void CStarCamera::setViewportAngle(const FPoint &angles) { tempV16 = tempV3; m3.set(mrow1, mrow2, mrow3); - _sub13.setMatrix(m3); - _sub13.setPosition(tempV16); + _viewport.setMatrix(m3); + _viewport.setPosition(tempV16); } } @@ -419,15 +419,15 @@ bool CStarCamera::removeMatrixRow() { } void CStarCamera::proc36(double *v1, double *v2, double *v3, double *v4) { - _sub13.fn19(v1, v2, v3, v4); + _viewport.fn19(v1, v2, v3, v4); } void CStarCamera::load(SimpleFile *file, int param) { - _sub13.load(file, param); + _viewport.load(file, param); } void CStarCamera::save(SimpleFile *file, int indent) { - _sub13.save(file, indent); + _viewport.save(file, indent); } bool CStarCamera::setupHandler(const CNavigationInfo *src) { @@ -464,12 +464,12 @@ void CStarCamera::deleteHandler() { } } -void CStarCamera::fn1(CStarControlSub13 *sub13, const FVector &v) { +void CStarCamera::fn1(CViewport *viewport, const FVector &v) { if (_matrixRow == 1) { - FMatrix m1 = sub13->getMatrix(); - FMatrix m2 = _sub13.getMatrix(); - FVector v1 = sub13->_position; - FVector v2 = _sub13._position; + FMatrix m1 = viewport->getMatrix(); + FMatrix m2 = _viewport.getMatrix(); + FVector v1 = viewport->_position; + FVector v2 = _viewport._position; _mover->proc8(v2, v1, m2, m1); CStarVector *sv = new CStarVector(this, v); @@ -480,19 +480,19 @@ void CStarCamera::fn1(CStarControlSub13 *sub13, const FVector &v) { void CStarCamera::fn2(FVector v1, FVector v2, FVector v3) { if (_matrixRow == -1) { FVector tempV; - tempV._z = _sub13._field10; + tempV._z = _viewport._field10; v3._z = v1._z; - tempV._x = _sub13._centerVector._z * v1._y * v1._z / _sub13._centerVector._x; - v3._y = _sub13._centerVector._y * tempV._z * v3._x / _sub13._centerVector._x; - v3._x = _sub13._centerVector._y * v1._x * v1._z / _sub13._centerVector._x - _sub13._valArray[2]; - tempV._y = _sub13._centerVector._z * tempV._z * v3._y / _sub13._centerVector._x; - tempV._x = tempV._x - _sub13._valArray[2]; + tempV._x = _viewport._centerVector._z * v1._y * v1._z / _viewport._centerVector._x; + v3._y = _viewport._centerVector._y * tempV._z * v3._x / _viewport._centerVector._x; + v3._x = _viewport._centerVector._y * v1._x * v1._z / _viewport._centerVector._x - _viewport._valArray[2]; + tempV._y = _viewport._centerVector._z * tempV._z * v3._y / _viewport._centerVector._x; + tempV._x = tempV._x - _viewport._valArray[2]; v3.normalize(); tempV.normalize(); - FMatrix matrix = _sub13.getMatrix(); - const FVector &pos = _sub13._position; + FMatrix matrix = _viewport.getMatrix(); + const FVector &pos = _viewport._position; _mover->proc10(v3, tempV, pos, matrix); CStarVector *sv = new CStarVector(this, v2); @@ -500,7 +500,7 @@ void CStarCamera::fn2(FVector v1, FVector v2, FVector v3) { } } -void CStarCamera::fn3(CStarControlSub13 *sub13, const FVector &v) { +void CStarCamera::fn3(CViewport *viewport, const FVector &v) { if (_matrixRow != 0) return; @@ -514,14 +514,14 @@ void CStarCamera::fn3(CStarControlSub13 *sub13, const FVector &v) { m1 = m1.fn4(m2); m2 = m1.fn1(); - DVector tempV2 = _sub13._position; + DVector tempV2 = _viewport._position; DMatrix m4; - m4._row1 = sub13->_position; + m4._row1 = viewport->_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(); + FMatrix m5 = viewport->getMatrix(); DVector tempV3, tempV4; tempV4._x = m5._row1._x * 1000000.0 + m4._row1._x; tempV4._y = m5._row1._y * 1000000.0 + m4._row1._y; @@ -595,8 +595,8 @@ void CStarCamera::fn3(CStarControlSub13 *sub13, const FVector &v) { m5.set(m4._row3, m4._row2, m4._row4); FVector tempV6 = m4._row1; - FMatrix m6 = _sub13.getMatrix(); - _mover->proc8(_sub13._position, tempV6, m6, m5); + FMatrix m6 = _viewport.getMatrix(); + _mover->proc8(_viewport._position, tempV6, m6, m5); CStarVector *sv = new CStarVector(this, v); _mover->setVector(sv); diff --git a/engines/titanic/star_control/star_camera.h b/engines/titanic/star_control/star_camera.h index e389f14a4a..c759330d3e 100644 --- a/engines/titanic/star_control/star_camera.h +++ b/engines/titanic/star_control/star_camera.h @@ -27,12 +27,15 @@ #include "titanic/star_control/fmatrix.h" #include "titanic/star_control/fpoint.h" #include "titanic/star_control/base_stars.h" -#include "titanic/star_control/star_control_sub13.h" +#include "titanic/star_control/viewport.h" #include "titanic/star_control/camera_mover.h" #include "titanic/star_control/error_code.h" namespace Titanic { +/** + * Implements a reference point from which the starmap can be viewed + */ class CStarCamera { private: static FMatrix *_matrix1; @@ -41,7 +44,7 @@ private: int _matrixRow; FMatrix _matrix; CCameraMover *_mover; - CStarControlSub13 _sub13; + CViewport _viewport; int _field108; private: /** @@ -63,10 +66,10 @@ public: static void deinit(); public: CStarCamera(const CNavigationInfo *data); - CStarCamera(CStarControlSub13 *src); + CStarCamera(CViewport *src); virtual ~CStarCamera(); - virtual void proc2(const CStarControlSub13 *src); + virtual void proc2(const CViewport *src); virtual void proc3(const CNavigationInfo *src); virtual void setPosition(const FVector &v); virtual void proc5(const FVector &v); @@ -77,7 +80,7 @@ public: virtual void proc10(int v); virtual void proc11(); virtual void proc12(StarMode mode, double v2); - virtual void proc13(CStarControlSub13 *dest); + virtual void proc13(CViewport *dest); /** * Sets the destination to move the camera to @@ -133,9 +136,9 @@ public: void set108() { _field108 = true; } void reset108() { _field108 = false; } - void fn1(CStarControlSub13 *sub13, const FVector &v); + void fn1(CViewport *sub13, const FVector &v); void fn2(FVector v1, FVector v2, FVector v3); - void fn3(CStarControlSub13 *sub13, const FVector &v); + void fn3(CViewport *sub13, const FVector &v); }; } // End of namespace Titanic diff --git a/engines/titanic/star_control/star_control_sub13.cpp b/engines/titanic/star_control/star_control_sub13.cpp deleted file mode 100644 index 8565d812f1..0000000000 --- a/engines/titanic/star_control/star_control_sub13.cpp +++ /dev/null @@ -1,264 +0,0 @@ -/* 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" -#include "titanic/titanic.h" - -namespace Titanic { - -CStarControlSub13::CStarControlSub13() { - _fieldC = 0; - _field10 = 800.0; - _field14 = 10000.0; - _field18 = 20.0; - _field1C = 20.0; - _width = 600; - _height = 340; - _field24 = 0; - _flag = false; - Common::fill(&_valArray[0], &_valArray[5], 0.0); -} - -CStarControlSub13::CStarControlSub13(CStarControlSub13 *src) : - _matrix(src->_matrix), _sub1(src->_sub1), _sub2(src->_sub2) { - _position = src->_position; - _fieldC = src->_fieldC; - _field10 = src->_field10; - _field14 = src->_field14; - _field18 = src->_field18; - _field1C = src->_field1C; - _width = src->_width; - _height = src->_height; - - _center = src->_center; - _centerVector = src->_centerVector; - _field24 = src->_field24; - - Common::copy(&src->_valArray[0], &src->_valArray[4], &_valArray[0]); - _flag = false; -} - -void CStarControlSub13::copyFrom(const CStarControlSub13 *src) { - error("Unused function"); -} - -void CStarControlSub13::load(SimpleFile *file, int param) { - _position._x = file->readFloat(); - _position._y = file->readFloat(); - _position._z = file->readFloat(); - _fieldC = file->readFloat(); - _field10 = file->readFloat(); - _field14 = file->readFloat(); - _field18 = file->readFloat(); - _field1C = file->readFloat(); - - int widthHeight = file->readNumber(); - _width = widthHeight & 0xffff; - _height = widthHeight >> 16; - _field24 = file->readNumber(); - - for (int idx = 0; idx < 5; ++idx) - _valArray[idx] = file->readFloat(); - - _matrix.load(file, param); - _flag = false; -} - -void CStarControlSub13::save(SimpleFile *file, int indent) { - file->writeFloatLine(_position._x, indent); - file->writeFloatLine(_position._y, indent); - file->writeFloatLine(_position._z, indent); - file->writeFloatLine(_fieldC, indent); - file->writeFloatLine(_field10, indent); - file->writeFloatLine(_field14, indent); - file->writeFloatLine(_field18, indent); - file->writeFloatLine(_field1C, indent); - file->writeNumberLine(_width | (_height << 16), indent); - - for (int idx = 0; idx < 5; ++idx) - file->writeFloatLine(_valArray[idx], indent); - - _matrix.save(file, indent); -} - -void CStarControlSub13::setPosition(const FVector &v) { - debugC(DEBUG_INTERMEDIATE, kDebugStarfield, "Setting starmap position to %s", v.toString().c_str()); - _position = v; - _flag = false; -} - -void CStarControlSub13::setPosition(const FPose &pose) { - _position = _position.fn5(pose); - _flag = false; -} - -void CStarControlSub13::setMatrix(const FMatrix &m) { - _matrix = m; - _flag = false; -} - -void CStarControlSub13::fn11(const FVector &v) { - _matrix.fn1(v); - _flag = false; -} - -void CStarControlSub13::setC(double v) { - _fieldC = v; - _flag = false; -} - -void CStarControlSub13::set10(double v) { - _field10 = v; - _flag = false; -} - -void CStarControlSub13::set14(double v) { - _field10 = v; -} - -void CStarControlSub13::set18(double v) { - _field18 = v; - _flag = false; -} - -void CStarControlSub13::set1C(double v) { - _field1C = v; - _flag = false; -} - -void CStarControlSub13::fn12() { - _matrix.identity(); - - FPose m1(X_AXIS, g_vm->getRandomNumber(359)); - FPose m2(Y_AXIS, g_vm->getRandomNumber(359)); - FPose m3(Z_AXIS, g_vm->getRandomNumber(359)); - - FPose s1(m1, m2); - FPose s2(s1, m3); - - m1.copyFrom(s2); - _matrix.fn2(m1); - _flag = false; -} - -void CStarControlSub13::fn13(StarMode mode, double val) { - if (mode == MODE_PHOTO) { - _valArray[0] = val; - _valArray[1] = -val; - } else { - _valArray[3] = val; - _valArray[4] = -val; - } - - _valArray[2] = 0.0; - _field24 = val ? 2 : 0; -} - -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; - _flag = false; -} - -void CStarControlSub13::fn15(const FMatrix &matrix) { - _matrix.fn3(matrix); - _flag = false; -} - -FPose CStarControlSub13::getSub1() { - if (!_flag) - reset(); - - return _sub1; -} - -FPose CStarControlSub13::getSub2() { - if (!_flag) - reset(); - - return _sub2; -} - -FVector CStarControlSub13::fn16(int index, const FVector &src) { - FPose temp = getSub1(); - - FVector dest; - 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; - return dest; -} - -FVector CStarControlSub13::fn17(int index, const FVector &src) { - FVector dest; - FPose pose = getSub1(); - FVector tv = src.fn5(pose); - - dest._x = (_valArray[index] + tv._x) - * _centerVector._x / (_centerVector._y * tv._z); - dest._y = (tv._y * _centerVector._x) / (_centerVector._z * tv._z); - dest._z = tv._z; - return dest; -} - -FVector CStarControlSub13::fn18(int index, const FVector &src) { - FVector dest; - FPose pose = getSub2(); - FVector tv = src.fn5(pose); - - dest._x = (_valArray[index] + tv._x) - * _centerVector._x / (_centerVector._y * tv._z); - dest._y = (tv._y * _centerVector._x) / (_centerVector._z * tv._z); - dest._z = tv._z; - return dest; -} - -void CStarControlSub13::fn19(double *v1, double *v2, double *v3, double *v4) { - *v1 = _centerVector._x / _centerVector._y; - *v2 = _centerVector._x / _centerVector._z; - *v3 = _valArray[3]; - *v4 = _valArray[4]; -} - -void CStarControlSub13::reset() { - const double FACTOR = 2 * M_PI / 360.0; - - _sub2.copyFrom(_matrix); - _sub2._vector = _position; - _sub1 = _sub2.fn4(); - - _center = FPoint((double)_width * 0.5, (double)_height * 0.5); - _centerVector._x = MIN(_center._x, _center._y); - _centerVector._y = tan(_field18 * FACTOR); - _centerVector._z = tan(_field1C * FACTOR); - _flag = true; -} - -const FMatrix &CStarControlSub13::getMatrix() const { - return _matrix; -} - -} // End of namespace Titanic diff --git a/engines/titanic/star_control/star_control_sub13.h b/engines/titanic/star_control/star_control_sub13.h deleted file mode 100644 index ccf2cb8ce9..0000000000 --- a/engines/titanic/star_control/star_control_sub13.h +++ /dev/null @@ -1,114 +0,0 @@ -/* 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. - * - */ - -#ifndef TITANIC_STAR_CONTROL_SUB13_H -#define TITANIC_STAR_CONTROL_SUB13_H - -#include "titanic/support/simple_file.h" -#include "titanic/star_control/base_stars.h" -#include "titanic/star_control/fpose.h" -#include "titanic/star_control/fmatrix.h" - -namespace Titanic { - -class CStarControlSub13 { -private: - double _fieldC; - double _field18; - double _field1C; - int _width; - int _height; - FMatrix _matrix; - FPose _sub1; - FPose _sub2; - FPoint _center; - bool _flag; -private: - void reset(); -public: - FVector _position; - double _field10; - double _field14; - int _field24; - double _valArray[5]; - FVector _centerVector; -public: - CStarControlSub13(); - CStarControlSub13(CStarControlSub13 *src); - - /** - * Copys the data from another instance - */ - void copyFrom(const CStarControlSub13 *src); - - /** - * Load the data for the class from file - */ - void load(SimpleFile *file, int param); - - /** - * Save the data for the class to file - */ - void save(SimpleFile *file, int indent); - - /** - * Sets the position - */ - void setPosition(const FVector &v); - - /** - * Sets the position - */ - void setPosition(const FPose &pose); - - /** - * Sets the matrix - */ - void setMatrix(const FMatrix &m); - - void fn11(const FVector &v); - void fn12(); - void fn13(StarMode mode, double val); - void reposition(double factor); - void fn15(const FMatrix &matrix); - FPose getSub1(); - FPose getSub2(); - FVector fn16(int index, const FVector &src); - FVector fn17(int index, const FVector &src); - FVector fn18(int index, const FVector &src); - void fn19(double *v1, double *v2, double *v3, double *v4); - - /** - * Returns the instance's matrix - */ - const FMatrix &getMatrix() const; - - void setC(double v); - void set10(double v); - void set14(double v); - void set18(double v); - void set1C(double v); -}; - -} // End of namespace Titanic - -#endif /* TITANIC_STAR_CONTROL_SUB13_H */ diff --git a/engines/titanic/star_control/star_view.h b/engines/titanic/star_control/star_view.h index b1acad371a..99f2ef811b 100644 --- a/engines/titanic/star_control/star_view.h +++ b/engines/titanic/star_control/star_view.h @@ -26,7 +26,7 @@ #include "titanic/support/simple_file.h" #include "titanic/support/video_surface.h" #include "titanic/star_control/star_camera.h" -#include "titanic/star_control/star_control_sub13.h" +#include "titanic/star_control/viewport.h" #include "titanic/star_control/surface_fader.h" #include "titanic/star_control/error_code.h" #include "titanic/star_control/fvector.h" @@ -43,7 +43,7 @@ private: CVideoSurface *_videoSurface; CStarCamera _camera; bool _hasReference; - CStarControlSub13 _sub13; + CViewport _sub13; CSurfaceFader _fader; CVideoSurface *_videoSurface2; CGameObject *_homePhotoMask; diff --git a/engines/titanic/star_control/viewport.cpp b/engines/titanic/star_control/viewport.cpp new file mode 100644 index 0000000000..e759a05563 --- /dev/null +++ b/engines/titanic/star_control/viewport.cpp @@ -0,0 +1,264 @@ +/* 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/viewport.h" +#include "titanic/titanic.h" + +namespace Titanic { + +CViewport::CViewport() { + _fieldC = 0; + _field10 = 800.0; + _field14 = 10000.0; + _field18 = 20.0; + _field1C = 20.0; + _width = 600; + _height = 340; + _field24 = 0; + _flag = false; + Common::fill(&_valArray[0], &_valArray[5], 0.0); +} + +CViewport::CViewport(CViewport *src) : + _matrix(src->_matrix), _sub1(src->_sub1), _sub2(src->_sub2) { + _position = src->_position; + _fieldC = src->_fieldC; + _field10 = src->_field10; + _field14 = src->_field14; + _field18 = src->_field18; + _field1C = src->_field1C; + _width = src->_width; + _height = src->_height; + + _center = src->_center; + _centerVector = src->_centerVector; + _field24 = src->_field24; + + Common::copy(&src->_valArray[0], &src->_valArray[4], &_valArray[0]); + _flag = false; +} + +void CViewport::copyFrom(const CViewport *src) { + error("Unused function"); +} + +void CViewport::load(SimpleFile *file, int param) { + _position._x = file->readFloat(); + _position._y = file->readFloat(); + _position._z = file->readFloat(); + _fieldC = file->readFloat(); + _field10 = file->readFloat(); + _field14 = file->readFloat(); + _field18 = file->readFloat(); + _field1C = file->readFloat(); + + int widthHeight = file->readNumber(); + _width = widthHeight & 0xffff; + _height = widthHeight >> 16; + _field24 = file->readNumber(); + + for (int idx = 0; idx < 5; ++idx) + _valArray[idx] = file->readFloat(); + + _matrix.load(file, param); + _flag = false; +} + +void CViewport::save(SimpleFile *file, int indent) { + file->writeFloatLine(_position._x, indent); + file->writeFloatLine(_position._y, indent); + file->writeFloatLine(_position._z, indent); + file->writeFloatLine(_fieldC, indent); + file->writeFloatLine(_field10, indent); + file->writeFloatLine(_field14, indent); + file->writeFloatLine(_field18, indent); + file->writeFloatLine(_field1C, indent); + file->writeNumberLine(_width | (_height << 16), indent); + + for (int idx = 0; idx < 5; ++idx) + file->writeFloatLine(_valArray[idx], indent); + + _matrix.save(file, indent); +} + +void CViewport::setPosition(const FVector &v) { + debugC(DEBUG_INTERMEDIATE, kDebugStarfield, "Setting starmap position to %s", v.toString().c_str()); + _position = v; + _flag = false; +} + +void CViewport::setPosition(const FPose &pose) { + _position = _position.fn5(pose); + _flag = false; +} + +void CViewport::setMatrix(const FMatrix &m) { + _matrix = m; + _flag = false; +} + +void CViewport::fn11(const FVector &v) { + _matrix.fn1(v); + _flag = false; +} + +void CViewport::setC(double v) { + _fieldC = v; + _flag = false; +} + +void CViewport::set10(double v) { + _field10 = v; + _flag = false; +} + +void CViewport::set14(double v) { + _field10 = v; +} + +void CViewport::set18(double v) { + _field18 = v; + _flag = false; +} + +void CViewport::set1C(double v) { + _field1C = v; + _flag = false; +} + +void CViewport::fn12() { + _matrix.identity(); + + FPose m1(X_AXIS, g_vm->getRandomNumber(359)); + FPose m2(Y_AXIS, g_vm->getRandomNumber(359)); + FPose m3(Z_AXIS, g_vm->getRandomNumber(359)); + + FPose s1(m1, m2); + FPose s2(s1, m3); + + m1.copyFrom(s2); + _matrix.fn2(m1); + _flag = false; +} + +void CViewport::fn13(StarMode mode, double val) { + if (mode == MODE_PHOTO) { + _valArray[0] = val; + _valArray[1] = -val; + } else { + _valArray[3] = val; + _valArray[4] = -val; + } + + _valArray[2] = 0.0; + _field24 = val ? 2 : 0; +} + +void CViewport::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; + _flag = false; +} + +void CViewport::fn15(const FMatrix &matrix) { + _matrix.fn3(matrix); + _flag = false; +} + +FPose CViewport::getSub1() { + if (!_flag) + reset(); + + return _sub1; +} + +FPose CViewport::getSub2() { + if (!_flag) + reset(); + + return _sub2; +} + +FVector CViewport::fn16(int index, const FVector &src) { + FPose temp = getSub1(); + + FVector dest; + 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; + return dest; +} + +FVector CViewport::fn17(int index, const FVector &src) { + FVector dest; + FPose pose = getSub1(); + FVector tv = src.fn5(pose); + + dest._x = (_valArray[index] + tv._x) + * _centerVector._x / (_centerVector._y * tv._z); + dest._y = (tv._y * _centerVector._x) / (_centerVector._z * tv._z); + dest._z = tv._z; + return dest; +} + +FVector CViewport::fn18(int index, const FVector &src) { + FVector dest; + FPose pose = getSub2(); + FVector tv = src.fn5(pose); + + dest._x = (_valArray[index] + tv._x) + * _centerVector._x / (_centerVector._y * tv._z); + dest._y = (tv._y * _centerVector._x) / (_centerVector._z * tv._z); + dest._z = tv._z; + return dest; +} + +void CViewport::fn19(double *v1, double *v2, double *v3, double *v4) { + *v1 = _centerVector._x / _centerVector._y; + *v2 = _centerVector._x / _centerVector._z; + *v3 = _valArray[3]; + *v4 = _valArray[4]; +} + +void CViewport::reset() { + const double FACTOR = 2 * M_PI / 360.0; + + _sub2.copyFrom(_matrix); + _sub2._vector = _position; + _sub1 = _sub2.fn4(); + + _center = FPoint((double)_width * 0.5, (double)_height * 0.5); + _centerVector._x = MIN(_center._x, _center._y); + _centerVector._y = tan(_field18 * FACTOR); + _centerVector._z = tan(_field1C * FACTOR); + _flag = true; +} + +const FMatrix &CViewport::getMatrix() const { + return _matrix; +} + +} // End of namespace Titanic diff --git a/engines/titanic/star_control/viewport.h b/engines/titanic/star_control/viewport.h new file mode 100644 index 0000000000..d984771680 --- /dev/null +++ b/engines/titanic/star_control/viewport.h @@ -0,0 +1,118 @@ +/* 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. + * + */ + +#ifndef TITANIC_VIEWPORT_H +#define TITANIC_VIEWPORT_H + +#include "titanic/support/simple_file.h" +#include "titanic/star_control/base_stars.h" +#include "titanic/star_control/fpose.h" +#include "titanic/star_control/fmatrix.h" + +namespace Titanic { + +/** + * Implements the viewport functionality for viewing the star field in + * a given position and orientation + */ +class CViewport { +private: + double _fieldC; + double _field18; + double _field1C; + int _width; + int _height; + FMatrix _matrix; + FPose _sub1; + FPose _sub2; + FPoint _center; + bool _flag; +private: + void reset(); +public: + FVector _position; + double _field10; + double _field14; + int _field24; + double _valArray[5]; + FVector _centerVector; +public: + CViewport(); + CViewport(CViewport *src); + + /** + * Copys the data from another instance + */ + void copyFrom(const CViewport *src); + + /** + * Load the data for the class from file + */ + void load(SimpleFile *file, int param); + + /** + * Save the data for the class to file + */ + void save(SimpleFile *file, int indent); + + /** + * Sets the position + */ + void setPosition(const FVector &v); + + /** + * Sets the position + */ + void setPosition(const FPose &pose); + + /** + * Sets the matrix + */ + void setMatrix(const FMatrix &m); + + void fn11(const FVector &v); + void fn12(); + void fn13(StarMode mode, double val); + void reposition(double factor); + void fn15(const FMatrix &matrix); + FPose getSub1(); + FPose getSub2(); + FVector fn16(int index, const FVector &src); + FVector fn17(int index, const FVector &src); + FVector fn18(int index, const FVector &src); + void fn19(double *v1, double *v2, double *v3, double *v4); + + /** + * Returns the instance's matrix + */ + const FMatrix &getMatrix() const; + + void setC(double v); + void set10(double v); + void set14(double v); + void set18(double v); + void set1C(double v); +}; + +} // End of namespace Titanic + +#endif /* TITANIC_VIEWPORT_H */ -- cgit v1.2.3