[Scummvm-git-logs] scummvm master -> 1d70f28214263b268e39d39956b973953d23bf5d

aquadran noreply at scummvm.org
Sun Oct 20 14:33:50 UTC 2024


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:
1d70f28214 WINTERMUTE: Match matrix transformations with original code


Commit: 1d70f28214263b268e39d39956b973953d23bf5d
    https://github.com/scummvm/scummvm/commit/1d70f28214263b268e39d39956b973953d23bf5d
Author: Paweł Kołodziejski (aquadran at gmail.com)
Date: 2024-10-20T16:33:46+02:00

Commit Message:
WINTERMUTE: Match matrix transformations with original code

Changed paths:
    engines/wintermute/ad/ad_actor_3dx.cpp
    engines/wintermute/ad/ad_attach_3dx.cpp
    engines/wintermute/base/gfx/xframe_node.cpp
    engines/wintermute/base/gfx/xmesh.cpp
    engines/wintermute/base/gfx/xskinmesh.cpp


diff --git a/engines/wintermute/ad/ad_actor_3dx.cpp b/engines/wintermute/ad/ad_actor_3dx.cpp
index ae688fdf72e..7959f80c3aa 100644
--- a/engines/wintermute/ad/ad_actor_3dx.cpp
+++ b/engines/wintermute/ad/ad_actor_3dx.cpp
@@ -517,7 +517,7 @@ bool AdActor3DX::displayShadowVolume() {
 		}
 
 		DXMatrix viewMat;
-		DXMatrixMultiply(&viewMat, &_worldMatrix, boneMat);
+		DXMatrixMultiply(&viewMat, boneMat, &_worldMatrix);
 
 		at->displayShadowVol(&viewMat, &lightVector, extrusionDepth, true);
 	}
@@ -568,7 +568,7 @@ bool AdActor3DX::displayAttachments(bool registerObjects) {
 		}
 
 		DXMatrix viewMat;
-		DXMatrixMultiply(&viewMat, &origView, boneMat);
+		DXMatrixMultiply(&viewMat, boneMat, &origView);
 
 		at->displayAttachable(&viewMat, registerObjects);
 	}
diff --git a/engines/wintermute/ad/ad_attach_3dx.cpp b/engines/wintermute/ad/ad_attach_3dx.cpp
index ee5b793c009..4a059031187 100644
--- a/engines/wintermute/ad/ad_attach_3dx.cpp
+++ b/engines/wintermute/ad/ad_attach_3dx.cpp
@@ -107,7 +107,7 @@ bool AdAttach3DX::displayAttachable(DXMatrix *viewMat, bool registerObjects) {
 //////////////////////////////////////////////////////////////////////////
 bool AdAttach3DX::displayShadowVol(DXMatrix *modelMat, DXVector3 *light, float extrusionDepth, bool update) {
 	DXMatrix finalMat;
-	DXMatrixMultiply(&finalMat, modelMat, &_worldMatrix);
+	DXMatrixMultiply(&finalMat, &_worldMatrix, modelMat);
 
 	if (_xmodel) {
 		if (update) {
diff --git a/engines/wintermute/base/gfx/xframe_node.cpp b/engines/wintermute/base/gfx/xframe_node.cpp
index e1ad7b98874..7e74793eb99 100644
--- a/engines/wintermute/base/gfx/xframe_node.cpp
+++ b/engines/wintermute/base/gfx/xframe_node.cpp
@@ -128,23 +128,21 @@ bool FrameNode::loadFromXData(const Common::String &filename, XModel *model, XFi
 			BaseEngine::LOG(0, "Error loading transformation matrix");
 			return false;
 		} else {
-			for (int r = 0; r < 4; ++r) {
-				for (int c = 0; c < 4; ++c) {
-					_transformationMatrix._m[c][r] = frameTransformMatrix->_frameMatrix[r * 4 + c];
-				}
+			for (int i = 0; i < 16; ++i) {
+				_transformationMatrix._m4x4[i] = frameTransformMatrix->_frameMatrix[i];
 			}
 
 			// mirror at orign
-			_transformationMatrix._m[2][3] *= -1.0f;
+			_transformationMatrix._m[3][2] *= -1.0f;
 
 			// mirror base vectors
-			_transformationMatrix._m[2][0] *= -1.0f;
-			_transformationMatrix._m[2][1] *= -1.0f;
-
-			// change handedness
 			_transformationMatrix._m[0][2] *= -1.0f;
 			_transformationMatrix._m[1][2] *= -1.0f;
 
+			// change handedness
+			_transformationMatrix._m[2][0] *= -1.0f;
+			_transformationMatrix._m[2][1] *= -1.0f;
+
 			_originalMatrix = _transformationMatrix;
 			return true;
 		}
@@ -271,23 +269,20 @@ bool FrameNode::updateMatrices(DXMatrix *parentMat) {
 	
 		DXMatrix scaleMat;
 		DXMatrixScaling(&scaleMat, transScale._x, transScale._y, transScale._z);
-		DXMatrixTranspose(&scaleMat, &scaleMat);
-		DXMatrixMultiply(&_transformationMatrix, &scaleMat, &_transformationMatrix);
+		DXMatrixMultiply(&_transformationMatrix, &_transformationMatrix, &scaleMat);
 
 		DXMatrix rotMat;
 		DXMatrixRotationQuaternion(&rotMat, &transRot);
-		DXMatrixTranspose(&rotMat, &rotMat);
-		DXMatrixMultiply(&_transformationMatrix, &rotMat, &_transformationMatrix);
+		DXMatrixMultiply(&_transformationMatrix, &_transformationMatrix, &rotMat);
 
 		DXMatrix posMat;
 		DXMatrixTranslation(&posMat, transPos._x, transPos._y, transPos._z);
-		DXMatrixTranspose(&posMat, &posMat);
-		DXMatrixMultiply(&_transformationMatrix, &posMat, &_transformationMatrix);
+		DXMatrixMultiply(&_transformationMatrix, &_transformationMatrix, &posMat);
 	}
 	_transUsed[0] = _transUsed[1] = false;
 
 	// multiply by parent transformation
-	DXMatrixMultiply(&_combinedMatrix, parentMat, &_transformationMatrix);
+	DXMatrixMultiply(&_combinedMatrix, &_transformationMatrix, parentMat);
 
 	// update child frames
 	for (uint32 i = 0; i < _frames.size(); i++) {
diff --git a/engines/wintermute/base/gfx/xmesh.cpp b/engines/wintermute/base/gfx/xmesh.cpp
index 32a70972a85..565122bfb87 100644
--- a/engines/wintermute/base/gfx/xmesh.cpp
+++ b/engines/wintermute/base/gfx/xmesh.cpp
@@ -218,13 +218,7 @@ bool XMesh::update(FrameNode *parentFrame) {
 
 		// prepare final matrices
 		for (int i = 0; i < numBones; i++) {
-			DXMatrix offsetMatrix;
-			for (int r = 0; r < 4; ++r) {
-				for (int c = 0; c < 4; ++c) {
-					offsetMatrix._m[c][r] = _skinMesh->getBoneOffsetMatrix(i)->_m4x4[r * 4 + c];
-				}
-			}
-			DXMatrixMultiply(&boneMatrices[i], _boneMatrices[i], &offsetMatrix);
+			DXMatrixMultiply(&boneMatrices[i], _skinMesh->getBoneOffsetMatrix(i), _boneMatrices[i]);
 		}
 
 		// generate skinned mesh
diff --git a/engines/wintermute/base/gfx/xskinmesh.cpp b/engines/wintermute/base/gfx/xskinmesh.cpp
index a2bd0c85dca..bd6c2f2b0af 100644
--- a/engines/wintermute/base/gfx/xskinmesh.cpp
+++ b/engines/wintermute/base/gfx/xskinmesh.cpp
@@ -394,7 +394,6 @@ bool DXSkinInfo::updateSkinnedMesh(const DXMatrix *boneTransforms, void *srcVert
 
 	for (i = 0; i < _numBones; i++) {
 		DXMatrix boneMatrix = boneTransforms[i];
-		DXMatrixTranspose(&boneMatrix, &boneMatrix);
 
 		for (j = 0; j < _bones[i]._numInfluences; j++) {
 			DXVector3 position;
@@ -421,6 +420,7 @@ bool DXSkinInfo::updateSkinnedMesh(const DXMatrix *boneTransforms, void *srcVert
 		for (i = 0; i < _numBones; i++) {
 			DXMatrix boneInverse = boneTransforms[i];
 			DXMatrixInverse(&boneInverse, NULL, &boneInverse);
+			DXMatrixTranspose(&boneInverse, &boneInverse);
 
 			for (j = 0; j < _bones[i]._numInfluences; j++) {
 				DXVector3 normal;




More information about the Scummvm-git-logs mailing list