aboutsummaryrefslogtreecommitdiff
path: root/engines/startrek/space.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'engines/startrek/space.cpp')
-rw-r--r--engines/startrek/space.cpp64
1 files changed, 45 insertions, 19 deletions
diff --git a/engines/startrek/space.cpp b/engines/startrek/space.cpp
index 1171952ed4..a4d09690f8 100644
--- a/engines/startrek/space.cpp
+++ b/engines/startrek/space.cpp
@@ -26,8 +26,8 @@
namespace StarTrek {
void StarTrekEngine::initStarfieldPosition() {
- memset(&_starfieldPosition, 0, sizeof(_starfieldPosition));
- // TODO: matrix initialization
+ _starfieldPosition = Point3(0, 0, 0);
+ _someMatrix = initMatrix();
}
void StarTrekEngine::initStarfield(int16 x, int16 y, int16 width, int16 height, int16 arg8) {
@@ -45,13 +45,35 @@ void StarTrekEngine::initStarfield(int16 x, int16 y, int16 width, int16 height,
_starfieldPointDivisor = 150;
}
+void StarTrekEngine::addR3(R3 *r3) {
+ for (int i = 0; i < NUM_SPACE_OBJECTS; i++) {
+ if (_r3List[i] == nullptr) {
+ _r3List[i] = r3;
+ return;
+ }
+ }
+
+ error("addR3: out of shapes.");
+}
+
+void StarTrekEngine::delR3(R3 *r3) {
+ for (int i = 0; i < NUM_SPACE_OBJECTS; i++) {
+ if (_r3List[i] == r3) {
+ _r3List[i] = nullptr;
+ r3->field1e = 0;
+ return;
+ }
+ }
+
+ error("delR3: shape not found.");
+}
+
void StarTrekEngine::clearStarfieldPixels() {
_gfx->fillBackgroundRect(_starfieldRect, 0);
}
void StarTrekEngine::drawStarfield() {
// TODO: make these class variables
- Point3W starPositionWeightings[] = {{0x4000, 0, 0}, {0, 0x4000, 0}, {0, 0, 0x4000}};
float flt_50898 = 50.0; // ?
int16 var28 = ((_starfieldXVar2 * 3) >> 1);
@@ -72,12 +94,12 @@ void StarTrekEngine::drawStarfield() {
int16 var4 = getRandomWord() / var28 - xvar;
int16 var6 = getRandomWord() / var2a - yvar;
Point3 point = constructPoint3ForStarfield(var4, var6, var8);
- star->pos = applyPointWeightings(starPositionWeightings, point) + _starfieldPosition;
+ star->pos = matrixMult(_starPositionMatrix, point) + _starfieldPosition;
star->active = true;
}
Point3 p = star->pos - _starfieldPosition;
- Point3 point2 = applyPointWeightings2(p, starPositionWeightings);
+ Point3 point2 = matrixMult(p, _starPositionMatrix);
if (point2.z > flt_50898 && point2.z < 0x3fff
&& abs(point2.x) < point2.z && abs(point2.y) < point2.z) {
@@ -111,7 +133,7 @@ void StarTrekEngine::drawStarfield() {
void StarTrekEngine::updateStarfieldAndShips(bool arg0) {
_starfieldSprite.bitmapChanged = true;
- // sub_24b74(...);
+ _starPositionMatrix = _someMatrix.invert();
clearStarfieldPixels();
drawStarfield();
@@ -127,28 +149,32 @@ Point3 StarTrekEngine::constructPoint3ForStarfield(int16 x, int16 y, int16 z) {
return point;
}
-Point3 StarTrekEngine::applyPointWeightings(Point3W *weight, const Point3 &point) {
+Point3 StarTrekEngine::matrixMult(const Matrix &weight, const Point3 &point) {
int32 ret[3];
for (int i = 0; i < 3; i++) {
- ret[i] = weight[i].x * (point.x & 0xffff) + weight[i].y * (point.y & 0xffff) + weight[i].z * (point.z & 0xffff);
- ret[i] <<= 2;
+ ret[i] = weight[i][0].multToInt(point.x & 0xffff) + weight[i][1].multToInt(point.y & 0xffff) + weight[i][2].multToInt(point.z & 0xffff);
}
Point3 p;
- p.x = ret[0] >> 16;
- p.y = ret[1] >> 16;
- p.z = ret[2] >> 16;
+ p.x = ret[0];
+ p.y = ret[1];
+ p.z = ret[2];
return p;
}
-Point3 StarTrekEngine::applyPointWeightings2(const Point3 &point, Point3W *weight) {
+Point3 StarTrekEngine::matrixMult(const Point3 &point, const Matrix &weight) {
Point3 p = Point3();
- p.x = (weight[0].x * (point.x & 0xffff) + weight[1].x * (point.y & 0xffff) + weight[2].x * (point.z & 0xffff)) << 2;
- p.y = (weight[0].y * (point.x & 0xffff) + weight[1].y * (point.y & 0xffff) + weight[2].y * (point.z & 0xffff)) << 2;
- p.z = (weight[0].z * (point.x & 0xffff) + weight[1].z * (point.y & 0xffff) + weight[2].z * (point.z & 0xffff)) << 2;
- p.x >>= 16;
- p.y >>= 16;
- p.z >>= 16;
+ p.x = (weight[0][0].multToInt(point.x & 0xffff) + weight[1][0].multToInt(point.y & 0xffff) + weight[2][0].multToInt(point.z & 0xffff));
+ p.y = (weight[0][1].multToInt(point.x & 0xffff) + weight[1][1].multToInt(point.y & 0xffff) + weight[2][1].multToInt(point.z & 0xffff));
+ p.z = (weight[0][2].multToInt(point.x & 0xffff) + weight[1][2].multToInt(point.y & 0xffff) + weight[2][2].multToInt(point.z & 0xffff));
return p;
}
+Matrix StarTrekEngine::initMatrix() {
+ Matrix mat;
+ mat[0][0] = 1;
+ mat[1][1] = 1;
+ mat[2][2] = 1;
+ return mat;
+}
+
}