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

aquadran noreply at scummvm.org
Thu Oct 17 17:18:42 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:
6aac0ba2e1 WINTERMUTE: Convert XMesh::update to DX math


Commit: 6aac0ba2e18ba08f4186977741f608f2791808ab
    https://github.com/scummvm/scummvm/commit/6aac0ba2e18ba08f4186977741f608f2791808ab
Author: Paweł Kołodziejski (aquadran at gmail.com)
Date: 2024-10-17T19:18:37+02:00

Commit Message:
WINTERMUTE: Convert XMesh::update to DX math

Changed paths:
    engines/wintermute/base/gfx/xframe_node.cpp
    engines/wintermute/base/gfx/xmesh.cpp
    engines/wintermute/base/gfx/xmesh.h


diff --git a/engines/wintermute/base/gfx/xframe_node.cpp b/engines/wintermute/base/gfx/xframe_node.cpp
index 0864b82a1f3..0c3b2495687 100644
--- a/engines/wintermute/base/gfx/xframe_node.cpp
+++ b/engines/wintermute/base/gfx/xframe_node.cpp
@@ -415,13 +415,13 @@ bool FrameNode::pickPoly(Math::Vector3d *pickRayOrig, Math::Vector3d *pickRayDir
 //////////////////////////////////////////////////////////////////////////
 bool FrameNode::getBoundingBox(Math::Vector3d *boxStart, Math::Vector3d *boxEnd) {
 	for (uint32 i = 0; i < _meshes.size(); i++) {
-		boxStart->x() = MIN(boxStart->x(), _meshes[i]->_BBoxStart.x());
-		boxStart->y() = MIN(boxStart->y(), _meshes[i]->_BBoxStart.y());
-		boxStart->z() = MIN(boxStart->z(), _meshes[i]->_BBoxStart.z());
+		boxStart->x() = MIN(boxStart->x(), _meshes[i]->_BBoxStart._x);
+		boxStart->y() = MIN(boxStart->y(), _meshes[i]->_BBoxStart._y);
+		boxStart->z() = MIN(boxStart->z(), _meshes[i]->_BBoxStart._z);
 
-		boxEnd->x() = MAX(boxEnd->x(), _meshes[i]->_BBoxEnd.x());
-		boxEnd->y() = MAX(boxEnd->y(), _meshes[i]->_BBoxEnd.y());
-		boxEnd->z() = MAX(boxEnd->z(), _meshes[i]->_BBoxEnd.z());
+		boxEnd->x() = MAX(boxEnd->x(), _meshes[i]->_BBoxEnd._x);
+		boxEnd->y() = MAX(boxEnd->y(), _meshes[i]->_BBoxEnd._y);
+		boxEnd->z() = MAX(boxEnd->z(), _meshes[i]->_BBoxEnd._z);
 	}
 
 	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 b92e20fc139..562ea966b70 100644
--- a/engines/wintermute/base/gfx/xmesh.cpp
+++ b/engines/wintermute/base/gfx/xmesh.cpp
@@ -48,7 +48,7 @@ XMesh::XMesh(Wintermute::BaseGame *inGame) : BaseNamedObject(inGame) {
 	_boneMatrices = nullptr;
 	_adjacency = nullptr;
 
-	_BBoxStart = _BBoxEnd = Math::Vector3d(0.0f, 0.0f, 0.0f);
+	_BBoxStart = _BBoxEnd = DXVector3(0.0f, 0.0f, 0.0f);
 }
 
 XMesh::~XMesh() {
@@ -217,16 +217,14 @@ bool XMesh::update(FrameNode *parentFrame) {
 		DXMatrix *boneMatrices = new DXMatrix[numBones];
 
 		// prepare final matrices
-		for (int i = 0; i < numBones; ++i) {
-			Math::Matrix4 offsetMatrix;
+		for (int i = 0; i < numBones; i++) {
+			DXMatrix offsetMatrix;
 			for (int r = 0; r < 4; ++r) {
 				for (int c = 0; c < 4; ++c) {
-					offsetMatrix(c, r) = _skinMesh->getBoneOffsetMatrix(i)->_m4x4[r * 4 + c];
+					offsetMatrix._m[c][r] = _skinMesh->getBoneOffsetMatrix(i)->_m4x4[r * 4 + c];
 				}
 			}
-			Math::Matrix4 boneMatrix;
-			boneMatrix.setData(_boneMatrices[i]->_m4x4);
-			boneMatrices[i] = DXMatrix((boneMatrix * offsetMatrix).getData());
+			DXMatrixMultiply(&boneMatrices[i], _boneMatrices[i], &offsetMatrix);
 		}
 
 		// generate skinned mesh
@@ -241,13 +239,9 @@ bool XMesh::update(FrameNode *parentFrame) {
 		// update mesh bounding box
 		byte *points = _blendedMesh->getVertexBuffer().ptr();
 
-		DXVector3 BBoxStart = DXVector3(_BBoxStart.x(), _BBoxStart.y(), _BBoxStart.z());
-		DXVector3 BBoxEnd = DXVector3(_BBoxEnd.x(), _BBoxEnd.y(), _BBoxEnd.z());
-		DXComputeBoundingBox((DXVector3 *)points, _blendedMesh->getNumVertices(), DXGetFVFVertexSize(_blendedMesh->getFVF()), &BBoxStart, &BBoxEnd);
-		_BBoxStart = Math::Vector3d(BBoxStart._x, BBoxStart._y, BBoxStart._z);
-		_BBoxEnd = Math::Vector3d(BBoxEnd._x, BBoxEnd._y, BBoxEnd._z);
+		DXComputeBoundingBox((DXVector3 *)points, _blendedMesh->getNumVertices(), DXGetFVFVertexSize(_blendedMesh->getFVF()), &_BBoxStart, &_BBoxEnd);
 		// if you want something done right...
-		if (isnan(_BBoxEnd.x())) {
+		if (isnan(_BBoxEnd._x)) {
 			float minX = FLT_MAX;
 			float minY = FLT_MAX;
 			float minZ = FLT_MAX;
@@ -271,8 +265,8 @@ bool XMesh::update(FrameNode *parentFrame) {
 
 				vectBuf += DXGetFVFVertexSize(fvfSize);
 			}
-			_BBoxStart = Math::Vector3d(minX, minY, minZ);
-			_BBoxEnd = Math::Vector3d(maxX, maxY, maxZ);
+			_BBoxStart = DXVector3(minX, minY, minZ);
+			_BBoxEnd = DXVector3(maxX, maxY, maxZ);
 		}
 	} else {
 		// update static mesh
@@ -287,22 +281,16 @@ bool XMesh::update(FrameNode *parentFrame) {
 
 		for (uint32 i = 0; i < numVertices; i++) {
 			DXVector3 v = *(DXVector3 *)(oldPoints + i * fvfSize);
-			Math::Vector3d newVertex = Math::Vector3d(v._x, v._y, v._z);
-			Math::Matrix4 combinedMatrix;
-			combinedMatrix.setData(parentFrame->getCombinedMatrix()->_m4x4);
-			combinedMatrix.transform(&newVertex, true);
-
-			((DXVector3 *)(newPoints + i * fvfSize))->_x = newVertex.x();
-			((DXVector3 *)(newPoints + i * fvfSize))->_y = newVertex.y();
-			((DXVector3 *)(newPoints + i * fvfSize))->_z = newVertex.z();
+			DXVector4 newVertex;
+			DXVec3Transform(&newVertex, &v, parentFrame->getCombinedMatrix());
+
+			((DXVector3 *)(newPoints + i * fvfSize))->_x = newVertex._x;
+			((DXVector3 *)(newPoints + i * fvfSize))->_y = newVertex._y;
+			((DXVector3 *)(newPoints + i * fvfSize))->_z = newVertex._z;
 		}
 
 		// update bounding box
-		DXVector3 BBoxStart = DXVector3(_BBoxStart.x(), _BBoxStart.y(), _BBoxStart.z());
-		DXVector3 BBoxEnd = DXVector3(_BBoxEnd.x(), _BBoxEnd.y(), _BBoxEnd.z());
-		DXComputeBoundingBox((DXVector3 *)newPoints, _blendedMesh->getNumVertices(), DXGetFVFVertexSize(_blendedMesh->getFVF()), &BBoxStart, &BBoxEnd);
-		_BBoxStart = Math::Vector3d(BBoxStart._x, BBoxStart._y, BBoxStart._z);
-		_BBoxEnd = Math::Vector3d(BBoxEnd._x, BBoxEnd._y, BBoxEnd._z);
+		DXComputeBoundingBox((DXVector3 *)newPoints, _blendedMesh->getNumVertices(), DXGetFVFVertexSize(_blendedMesh->getFVF()), &_BBoxStart, &_BBoxEnd);
 	}
 	return res;
 }
diff --git a/engines/wintermute/base/gfx/xmesh.h b/engines/wintermute/base/gfx/xmesh.h
index 2bf710fdd5b..eb07e5c0a86 100644
--- a/engines/wintermute/base/gfx/xmesh.h
+++ b/engines/wintermute/base/gfx/xmesh.h
@@ -61,8 +61,8 @@ public:
 
 	bool pickPoly(Math::Vector3d *pickRayOrig, Math::Vector3d *pickRayDir);
 
-	Math::Vector3d _BBoxStart;
-	Math::Vector3d _BBoxEnd;
+	DXVector3 _BBoxStart;
+	DXVector3 _BBoxEnd;
 
 	bool setMaterialSprite(const Common::String &matName, BaseSprite *sprite);
 	bool setMaterialTheora(const Common::String &matName, VideoTheoraPlayer *theora);




More information about the Scummvm-git-logs mailing list