aboutsummaryrefslogtreecommitdiff
path: root/engines/titanic/star_control/fpose.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'engines/titanic/star_control/fpose.cpp')
-rw-r--r--engines/titanic/star_control/fpose.cpp50
1 files changed, 27 insertions, 23 deletions
diff --git a/engines/titanic/star_control/fpose.cpp b/engines/titanic/star_control/fpose.cpp
index 2bcb6c36f5..34a7a40d29 100644
--- a/engines/titanic/star_control/fpose.cpp
+++ b/engines/titanic/star_control/fpose.cpp
@@ -22,6 +22,7 @@
#include "titanic/star_control/fpose.h"
#include "titanic/star_control/matrix_transform.h"
+#include "titanic/star_control/matrix_inv.h"
namespace Titanic {
@@ -159,29 +160,32 @@ void FPose::copyFrom(const FMatrix &src) {
}
FPose FPose::inverseTransform() const {
- FPose result;
-
- result._row1._x = _row1._x;
- result._row2._x = _row1._y;
- result._row3._x = _row1._z;
- result._row1._y = _row2._x;
- result._row2._y = _row2._y;
- result._row3._y = _row2._z;
- result._row1._z = _row3._x;
- result._row2._z = _row3._y;
- result._row3._z = _row3._z;
-
- result._vector._x = -(_vector._x * result._row1._x
- + _vector._y * result._row2._x
- + _vector._z * result._row3._x);
- result._vector._y = -(_vector._x * result._row1._y
- + _vector._y * result._row2._y
- + _vector._z * result._row3._y);
- result._vector._z = -(_vector._x * result._row1._z
- + _vector._y * result._row2._z
- + _vector._z * result._row3._z);
-
- return result;
+ FPose matrix_inv;
+
+ matrix_inv._row1._x = _row1._x;
+ matrix_inv._row2._x = _row1._y;
+ matrix_inv._row3._x = _row1._z;
+ matrix_inv._row1._y = _row2._x;
+ matrix_inv._row2._y = _row2._y;
+ matrix_inv._row3._y = _row2._z;
+ matrix_inv._row1._z = _row3._x;
+ matrix_inv._row2._z = _row3._y;
+ matrix_inv._row3._z = _row3._z;
+
+ float A[16]={_row1._x,_row1._y,_row1._z, 0.0,
+ _row2._x,_row2._y,_row2._z, 0.0,
+ _row3._x,_row3._y,_row3._z, 0.0,
+ _vector._x,_vector._y,_vector._z, 1.0};
+ // Inverse matrix
+ float B[16]={};
+
+ // B contains inverse of A
+ matrix4Inverse<float>(A,B);
+ matrix_inv._vector._x=B[12];
+ matrix_inv._vector._y=B[13];
+ matrix_inv._vector._z=B[14];
+
+ return matrix_inv;
}
//TODO: Check math and provide source