[Scummvm-git-logs] scummvm master -> 6ecc83325dbd9665e7f8605f85112b8cb5c33528

dreammaster dreammaster at scummvm.org
Sat Mar 25 02:19:47 CET 2017


This automated email contains information about 1 new commit which have been
pushed to the 'scummvm' repo located at https://github.com/scummvm/scummvm .

Summary:
6ecc83325d TITANIC: Finished DMatrix class


Commit: 6ecc83325dbd9665e7f8605f85112b8cb5c33528
    https://github.com/scummvm/scummvm/commit/6ecc83325dbd9665e7f8605f85112b8cb5c33528
Author: Paul Gilbert (dreammaster at scummvm.org)
Date: 2017-03-24T21:19:38-04:00

Commit Message:
TITANIC: Finished DMatrix class

Changed paths:
    engines/titanic/star_control/dmatrix.cpp
    engines/titanic/star_control/dmatrix.h
    engines/titanic/star_control/dvector.cpp
    engines/titanic/star_control/star_control_sub12.cpp


diff --git a/engines/titanic/star_control/dmatrix.cpp b/engines/titanic/star_control/dmatrix.cpp
index 86ccd3d..32614ac 100644
--- a/engines/titanic/star_control/dmatrix.cpp
+++ b/engines/titanic/star_control/dmatrix.cpp
@@ -109,20 +109,137 @@ void DMatrix::setRotationMatrix(Axis axis, double amount) {
 	}
 }
 
-void DMatrix::fn1(DMatrix &m) {
-	// TODO
+DMatrix DMatrix::fn1() const {
+	double val1 = _row1._x * _row3._z * _row2._y;
+	double val2 = 0.0;
+	double val3 = val1;
+
+	if (val1 < 0.0) {
+		val2 = val3;
+		val1 = 0.0;
+	}
+
+	double val4 = _row3._x * _row1._y * _row2._z;
+	if (val4 < 0.0)
+		val2 = val2 + val4;
+	else
+		val1 = val1 + val4;
+
+	double val5 = _row3._y * _row1._z * _row2._x;
+	if (val5 < 0.0)
+		val2 = val2 + val5;
+	else
+		val1 = val1 + val5;
+
+	if (-(_row3._x * _row2._y * _row1._z) < 0.0)
+		val2 = val2 - _row3._x * _row2._y * _row1._z;
+	else
+		val1 = val1 - _row3._x * _row2._y * _row1._z;
+	if (-(_row1._y * _row3._z * _row2._x) < 0.0)
+		val2 = val2 - _row1._y * _row3._z * _row2._x;
+	else
+		val1 = val1 - _row1._y * _row3._z * _row2._x;
+
+	val3 = _row3._y * _row2._z;
+	double val6 = -(_row1._x * val3);
+	if (val6 < 0.0)
+		val2 = val2 + val6;
+	else
+		val1 = val1 + val6;
+
+	double val7 = val2 + val1;
+	assert(!(val7 == 0.0 || fabs(val7 / (val1 - val2)) < 1.0e-10));
+
+	double val8 = val1;
+	double val9 = 1.0 / val7;
+
+	DMatrix m;
+	m._row1._x = (val8 - val3) * val9;
+	m._row2._x = -((_row3._z * _row2._x - _row3._x * _row2._z) * val9);
+	m._row3._x = (_row3._y * _row2._x - _row3._x * _row2._y) * val9;
+	m._row1._y = -((_row1._y * _row3._z - _row3._y * _row1._z) * val9);
+	m._row2._y = (_row1._x * _row3._z - _row3._x * _row1._z) * val9;
+	m._row3._y = -((_row1._x * _row3._y - _row3._x * _row1._y) * val9);
+	m._row1._z = (_row1._y * _row2._z - _row2._y * _row1._z) * val9;
+	m._row2._z = -((_row1._x * _row2._z - _row1._z * _row2._x) * val9);
+	m._row3._z = (_row1._x * _row2._y - _row1._y * _row2._x) * val9;
+
+	m._row4._x = -(m._row1._x * _row4._x + _row4._z * m._row2._x
+		+ _row4._y * m._row3._x);
+	m._row4._z = -(_row4._y * m._row3._y + _row4._z * m._row2._y
+		+ _row4._x * m._row1._y);
+	m._row4._y = -(_row4._y * m._row3._z + _row4._x * m._row1._z
+		+ _row4._z * m._row2._z);
+	return m;
 }
 
 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);
+	double v3, v4, v5, v6, v7, v8, v9, v10;
+	double v11, v12, v13, v14, v15, v16, v17, v18, v19, v20;
+
+	v3 = sub26->fn1();
+	if (v3 <= 0.0)
+		v20 = 0.0;
+	else
+		v20 = 2.0 / v3;
+	v4 = v20 * sub26->_sub._v1;
+	v5 = v20 * sub26->_sub._v2;
+	v6 = v20 * sub26->_sub._v3;
+	v7 = v4 * sub26->_sub._v1;
+	v8 = v4;
+	v9 = v5;
+	v10 = v5 * sub26->_sub._v1;
+	v11 = v5 * sub26->_sub._v2;
+	v12 = v6;
+	v13 = v8 * sub26->_field0;
+	v14 = v12 + v11;
+	v15 = v6 * sub26->_sub._v2;
+	v16 = v6 * sub26->_field0;
+	v17 = v11 + v7;
+	v18 = v6 * sub26->_sub._v1;
+	v19 = v9 * sub26->_field0;
+	_row1._x = 1.0 - v14;
+	_row1._y = v10 + v16;
+	_row1._z = v18 - v19;
+	_row2._x = v10 - v16;
+	_row2._y = 1.0 - (v12 + v7);
+	_row2._z = v15 + v13;
+	_row3._x = v18 + v19;
+	_row3._y = v15 - v13;
+	_row3._z = 1.0 - v17;
+	_row4._x = 0.0;
+	_row4._y = 0.0;
+	_row4._z = 0.0;
 }
 
 DMatrix DMatrix::fn4(const DMatrix &m) {
-	// TODO
-	return DMatrix();
+	DMatrix dm, dest;
+	dm._row1._x = m._row3._x * _row1._z + m._row2._x * _row1._y
+		+ m._row1._x * _row1._x;
+	dm._row1._y = _row1._x * m._row1._y + m._row3._y * _row1._z
+		+ m._row2._y * _row1._y;
+	dm._row1._z = _row1._x * m._row1._z + m._row3._z * _row1._z
+		+ m._row2._z * _row1._y;
+	dm._row2._x = m._row1._x * _row2._x + _row2._y * m._row2._x
+		+ _row2._z * m._row3._x;
+	dm._row2._y = _row2._y * m._row2._y + _row2._z * m._row3._y
+		+ m._row1._y * _row2._x;
+	dm._row2._z = m._row1._z * _row2._x + _row2._y * m._row2._z
+		+ _row2._z * m._row3._z;
+	dm._row3._x = m._row1._x * _row3._x + _row3._y * m._row2._x
+		+ _row3._z * m._row3._x;
+	dm._row3._y = _row3._y * m._row2._y + _row3._z * m._row3._y
+		+ m._row1._y * _row3._x;
+	dm._row3._z = m._row2._z * _row3._y + m._row3._z * _row3._z
+		+ m._row1._z * _row3._x;
+	dm._row4._x = m._row1._x * dm._row4._x + _row4._y * m._row2._x
+		+ _row4._z * m._row3._x + m._row4._x;
+	dm._row4._z = _row4._z * m._row3._y + _row4._y * m._row2._y
+		+ dm._row4._x * m._row1._y + m._row4._y;
+	dm._row4._z = _row4._y * m._row2._z + dm._row4._x * m._row1._z
+		+ _row4._z * m._row3._z + m._row4._z;
+
+	return dest;
 }
 
 } // End of namespace Titanic
diff --git a/engines/titanic/star_control/dmatrix.h b/engines/titanic/star_control/dmatrix.h
index 793abad..cc14c5e 100644
--- a/engines/titanic/star_control/dmatrix.h
+++ b/engines/titanic/star_control/dmatrix.h
@@ -57,7 +57,7 @@ public:
 	 */
 	void setRotationMatrix(Axis axis, double amount);
 
-	void fn1(DMatrix &m);
+	DMatrix fn1() const;
 	void fn3(CStarControlSub26 *sub26);
 
 	DMatrix fn4(const DMatrix &m);
diff --git a/engines/titanic/star_control/dvector.cpp b/engines/titanic/star_control/dvector.cpp
index 17409c6..080b45e 100644
--- a/engines/titanic/star_control/dvector.cpp
+++ b/engines/titanic/star_control/dvector.cpp
@@ -86,13 +86,13 @@ void DVector::fn4(const DVector &v, DMatrix &m) {
 	matrix1.setRotationMatrix(X_AXIS, vector1._y * FACTOR);
 	matrix2.setRotationMatrix(Y_AXIS, -(vector1._z * FACTOR));
 	matrix3 = matrix1.fn4(matrix2);
-	matrix3.fn1(matrix4);
+	matrix4 = matrix3.fn1();
 
 	vector1 = v.fn3();
 	matrix1.setRotationMatrix(X_AXIS, vector1._y * FACTOR);
 	matrix2.setRotationMatrix(Y_AXIS, -(vector1._z * FACTOR));
 	matrix3 = matrix1.fn4(matrix2);
-	matrix1.fn1(matrix4);
+	matrix4 = matrix1.fn1();
 
 	m = matrix4.fn4(matrix3);
 }
diff --git a/engines/titanic/star_control/star_control_sub12.cpp b/engines/titanic/star_control/star_control_sub12.cpp
index 6b2f78c..e236403 100644
--- a/engines/titanic/star_control/star_control_sub12.cpp
+++ b/engines/titanic/star_control/star_control_sub12.cpp
@@ -326,7 +326,7 @@ void CStarControlSub12::setViewportPosition(const FPoint &angles) {
 		diffV = tempV1;
 		m1 = diffV.fn5();
 		m1 = m1.fn4(subX);
-		m1.fn1(subX);
+		subX = m1.fn1();
 		subX = subX.fn4(subY);
 
 		FMatrix m3 = _sub13.getMatrix();
@@ -510,7 +510,7 @@ void CStarControlSub12::fn3(CStarControlSub13 *sub13, const FVector &v) {
 	m1 = tempV1.fn5();
 
 	m1 = m1.fn4(m2);
-	m1.fn1(m2);
+	m2 = m1.fn1();
 
 	DVector tempV2 = _sub13._position;
 	DMatrix m4;





More information about the Scummvm-git-logs mailing list