[Scummvm-git-logs] scummvm master -> bdb7493b23178f3dabd69b44c4eabb34ae767308

aquadran noreply at scummvm.org
Sat Oct 12 15:46:28 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:
bdb7493b23 WINTERMUTE: Removed _vertexPositionData and _vertexNormalData


Commit: bdb7493b23178f3dabd69b44c4eabb34ae767308
    https://github.com/scummvm/scummvm/commit/bdb7493b23178f3dabd69b44c4eabb34ae767308
Author: Paweł Kołodziejski (aquadran at gmail.com)
Date: 2024-10-12T17:46:24+02:00

Commit Message:
WINTERMUTE: Removed _vertexPositionData and _vertexNormalData

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


diff --git a/engines/wintermute/base/gfx/xmesh.cpp b/engines/wintermute/base/gfx/xmesh.cpp
index f17cc6bbe54..804d83605d7 100644
--- a/engines/wintermute/base/gfx/xmesh.cpp
+++ b/engines/wintermute/base/gfx/xmesh.cpp
@@ -74,7 +74,7 @@ bool XMesh::loadFromXData(const Common::String &filename, XFileData *xobj) {
 	//uint32 numFaces;
 	uint32 numMaterials;
 	DXMesh *mesh;
-	DXSkinInfo *skinInfo = nullptr;
+	DXSkinInfo *skinInfo;
 
 	auto res = DXLoadSkinMesh(xobj, bufMaterials, numMaterials, &skinInfo, &mesh);
 	if (!res) {
@@ -82,7 +82,7 @@ bool XMesh::loadFromXData(const Common::String &filename, XFileData *xobj) {
 		return false;
 	}
 
-	XSkinMeshLoader *meshLoader = new XSkinMeshLoader(this, mesh);
+	XSkinMeshLoader *meshLoader = new XSkinMeshLoader(mesh);
 
 	_skinMesh = new SkinMeshHelper(mesh, skinInfo);
 
@@ -96,19 +96,21 @@ bool XMesh::loadFromXData(const Common::String &filename, XFileData *xobj) {
 		//_boneMatrices = new DXMatrix*[numBones];
 
 		generateMesh();
+
 		_blendedMesh->_meshLoader = meshLoader;
+		_skinMesh->_mesh->_meshLoader = new XSkinMeshLoader(_skinMesh->_mesh);
 	} else {
 		// no bones are found, blend the mesh and use it as a static mesh
 		_skinMesh->getOriginalMesh(&_staticMesh);
 		_staticMesh->cloneMesh(&_blendedMesh);
 
-		_staticMesh->_meshLoader = meshLoader;
-		_blendedMesh->_meshLoader = meshLoader;
+		_staticMesh->_meshLoader = new XSkinMeshLoader(_staticMesh);
 
 		delete _skinMesh;
 		_skinMesh = nullptr;
 
 		if (_blendedMesh) {
+			_blendedMesh->_meshLoader = meshLoader;
 			//numFaces = _blendedMesh->getNumFaces();
 			//_adjacency = new uint32[numFaces * 3];
 			_blendedMesh->generateAdjacency(_adjacency);
@@ -232,18 +234,17 @@ bool XMesh::update(FrameNode *parentFrame) {
 	if (!_blendedMesh)
 		return false;
 
-	float *vertexData = _blendedMesh->_meshLoader->_vertexData;
-	if (vertexData == nullptr) {
+	float *vertexDstData = _blendedMesh->_meshLoader->_vertexData;
+	if (vertexDstData == nullptr) {
 		return false;
 	}
 
-	float *vertexPositionData = _blendedMesh->_meshLoader->_vertexPositionData;
-	float *vertexNormalData = _blendedMesh->_meshLoader->_vertexNormalData;
 	uint32 vertexCount = _blendedMesh->_meshLoader->_vertexCount;
 	auto skinWeightsList = _blendedMesh->_meshLoader->_skinWeightsList;
 
 	// update skinned mesh
 	if (_skinMesh) {
+		float *vertexSrcData = _skinMesh->_mesh->_meshLoader->_vertexData;
 		BaseArray<Math::Matrix4> finalBoneMatrices;
 		finalBoneMatrices.resize(_boneMatrices.size());
 
@@ -257,7 +258,7 @@ bool XMesh::update(FrameNode *parentFrame) {
 		// to be able too add the weighted summands together, we reset everything to zero first
 		for (uint32 i = 0; i < vertexCount; ++i) {
 			for (int j = 0; j < 3; ++j) {
-				vertexData[i * XSkinMeshLoader::kVertexComponentCount + XSkinMeshLoader::kPositionOffset + j] = 0.0f;
+				vertexDstData[i * XSkinMeshLoader::kVertexComponentCount + XSkinMeshLoader::kPositionOffset + j] = 0.0f;
 			}
 		}
 
@@ -269,12 +270,12 @@ bool XMesh::update(FrameNode *parentFrame) {
 			for (uint i = 0; i < skinWeightsList[boneIndex]._vertexIndices.size(); ++i) {
 				uint32 vertexIndex = skinWeightsList[boneIndex]._vertexIndices[i];
 				Math::Vector3d pos;
-				pos.setData(vertexPositionData + vertexIndex * 3);
+				pos.setData(vertexSrcData + vertexIndex * XSkinMeshLoader::kVertexComponentCount + XSkinMeshLoader::kPositionOffset);
 				finalBoneMatrices[boneIndex].transform(&pos, true);
 				pos *= skinWeightsList[boneIndex]._vertexWeights[i];
 
 				for (uint j = 0; j < 3; ++j) {
-					vertexData[vertexIndex * XSkinMeshLoader::kVertexComponentCount + XSkinMeshLoader::kPositionOffset + j] += pos.getData()[j];
+					vertexDstData[vertexIndex * XSkinMeshLoader::kVertexComponentCount + XSkinMeshLoader::kPositionOffset + j] += pos.getData()[j];
 				}
 			}
 		}
@@ -288,7 +289,7 @@ bool XMesh::update(FrameNode *parentFrame) {
 		// reset so we can form the weighted sums
 		for (uint32 i = 0; i < vertexCount; ++i) {
 			for (int j = 0; j < 3; ++j) {
-				vertexData[i * XSkinMeshLoader::kVertexComponentCount + XSkinMeshLoader::kNormalOffset + j] = 0.0f;
+				vertexDstData[i * XSkinMeshLoader::kVertexComponentCount + XSkinMeshLoader::kNormalOffset + j] = 0.0f;
 			}
 		}
 
@@ -296,12 +297,12 @@ bool XMesh::update(FrameNode *parentFrame) {
 			for (uint i = 0; i < skinWeightsList[boneIndex]._vertexIndices.size(); ++i) {
 				uint32 vertexIndex = skinWeightsList[boneIndex]._vertexIndices[i];
 				Math::Vector3d pos;
-				pos.setData(vertexNormalData + vertexIndex * 3);
+				pos.setData(vertexSrcData + vertexIndex * XSkinMeshLoader::kVertexComponentCount + XSkinMeshLoader::kNormalOffset);
 				finalBoneMatrices[boneIndex].transform(&pos, true);
 				pos *= skinWeightsList[boneIndex]._vertexWeights[i];
 
 				for (uint j = 0; j < 3; ++j) {
-					vertexData[vertexIndex * XSkinMeshLoader::kVertexComponentCount + XSkinMeshLoader::kNormalOffset + j] += pos.getData()[j];
+					vertexDstData[vertexIndex * XSkinMeshLoader::kVertexComponentCount + XSkinMeshLoader::kNormalOffset + j] += pos.getData()[j];
 				}
 			}
 		}
@@ -309,11 +310,12 @@ bool XMesh::update(FrameNode *parentFrame) {
 	//updateNormals();
 	} else { // update static
 		for (uint32 i = 0; i < vertexCount; ++i) {
-			Math::Vector3d pos(vertexPositionData + 3 * i);
+			float *vertexData = _staticMesh->_meshLoader->_vertexData;
+			Math::Vector3d pos(vertexData + i * XSkinMeshLoader::kVertexComponentCount + XSkinMeshLoader::kPositionOffset);
 			parentFrame->getCombinedMatrix()->transform(&pos, true);
 
 			for (uint j = 0; j < 3; ++j) {
-				vertexData[i * XSkinMeshLoader::kVertexComponentCount + XSkinMeshLoader::kPositionOffset + j] = pos.getData()[j];
+				vertexDstData[i * XSkinMeshLoader::kVertexComponentCount + XSkinMeshLoader::kPositionOffset + j] = pos.getData()[j];
 			}
 		}
 	}
@@ -431,10 +433,10 @@ bool XMesh::pickPoly(Math::Vector3d *pickRayOrig, Math::Vector3d *pickRayDir) {
 
 	uint32 *indexData = (uint32 *)_blendedMesh->getIndexBuffer().ptr();
 	uint32 indexDataSize = _blendedMesh->getIndexBuffer().size() / sizeof(uint32);
-	for (uint16 i = 0; i < indexDataSize; i += 3) {
-		uint16 index1 = indexData[i + 0];
-		uint16 index2 = indexData[i + 1];
-		uint16 index3 = indexData[i + 2];
+	for (uint32 i = 0; i < indexDataSize; i += 3) {
+		uint32 index1 = indexData[i + 0];
+		uint32 index2 = indexData[i + 1];
+		uint32 index3 = indexData[i + 2];
 
 		Math::Vector3d v0;
 		v0.setData(&vertexData[index1 * XSkinMeshLoader::kVertexComponentCount + XSkinMeshLoader::kPositionOffset]);
@@ -504,15 +506,13 @@ bool XMesh::restoreDeviceObjects() {
 }
 
 void XMesh::updateBoundingBox() {
-	float *vertexData;
-
-	if (_blendedMesh)
-		vertexData = _blendedMesh->_meshLoader->_vertexData;
-	else
-		vertexData = _staticMesh->_meshLoader->_vertexData;
+	float *vertexData = _blendedMesh->_meshLoader->_vertexData;
+	if (vertexData == nullptr) {
+		return;
+	}
 
 	uint32 vertexCount = _blendedMesh->getNumVertices();
-	if (vertexData == nullptr || vertexCount == 0) {
+	if (vertexCount == 0) {
 		return;
 	}
 
diff --git a/engines/wintermute/base/gfx/xskinmesh_loader.cpp b/engines/wintermute/base/gfx/xskinmesh_loader.cpp
index fef0c48286e..0444289014f 100644
--- a/engines/wintermute/base/gfx/xskinmesh_loader.cpp
+++ b/engines/wintermute/base/gfx/xskinmesh_loader.cpp
@@ -32,22 +32,17 @@
 
 namespace Wintermute {
 
-XSkinMeshLoader::XSkinMeshLoader(XMesh *mesh, DXMesh *dxmesh) {
-	_mesh = mesh;
+XSkinMeshLoader::XSkinMeshLoader(DXMesh *dxmesh) {
 	_dxmesh = dxmesh;
 	
 	_vertexCount = dxmesh->getNumVertices();
 	// vertex format for .X meshes will be position + normals + textures
 	_vertexData = new float[kVertexComponentCount * _vertexCount]();
-	_vertexPositionData = new float[3 * _vertexCount]();
-	// we already know how big this is supposed to be
-	// TODO: might have to generate normals if file does not contain any
-	_vertexNormalData = new float[3 * _vertexCount]();
 	
 	auto fvf = _dxmesh->getFVF();
 	uint32 vertexSize = DXGetFVFVertexSize(fvf) / sizeof(float);
 	float *vertexBuffer = (float *)_dxmesh->getVertexBuffer().ptr();
-	uint32 offset = 0, normalOffset = 0, /*diffuseOffset = 0, */textureOffset = 0;
+	uint32 offset = 0, normalOffset = 0, textureOffset = 0;
 
 	if (fvf & DXFVF_XYZ) {
 		offset += sizeof(DXVector3) / sizeof(float);
@@ -57,7 +52,6 @@ XSkinMeshLoader::XSkinMeshLoader(XMesh *mesh, DXMesh *dxmesh) {
 		offset += sizeof(DXVector3) / sizeof(float);
 	}
 	if (fvf & DXFVF_DIFFUSE) {
-		//diffuseOffset = offset;
 		offset += sizeof(DXColorValue) / sizeof(float);
 	}
 	if (fvf & DXFVF_TEX1) {
@@ -66,32 +60,22 @@ XSkinMeshLoader::XSkinMeshLoader(XMesh *mesh, DXMesh *dxmesh) {
 	}
 
 	for (uint i = 0; i < _vertexCount; ++i) {
-		_vertexPositionData[i * 3 + 0] = vertexBuffer[i * vertexSize + 0];
-		_vertexPositionData[i * 3 + 1] = vertexBuffer[i * vertexSize + 1];
-		_vertexPositionData[i * 3 + 2] = vertexBuffer[i * vertexSize + 2];
 		for (int j = 0; j < 3; ++j) {
-			_vertexData[i * kVertexComponentCount + kPositionOffset + j] = _vertexPositionData[i * 3 + j];
+			_vertexData[i * kVertexComponentCount + kPositionOffset + j] = vertexBuffer[i * vertexSize + j];
 		}
+
 		// mirror z coordinate to change to OpenGL coordinate system
-		_vertexPositionData[i * 3 + 2] *= -1.0f;
 		_vertexData[i * kVertexComponentCount + kPositionOffset + 2] *= -1.0f;
 
 		if (fvf & DXFVF_NORMAL) {
-			_vertexNormalData[i * 3 + 0] = vertexBuffer[i * vertexSize + normalOffset + 0];
-			_vertexNormalData[i * 3 + 1] = vertexBuffer[i * vertexSize + normalOffset + 1];
-			_vertexNormalData[i * 3 + 2] = vertexBuffer[i * vertexSize + normalOffset + 2];
 			for (int j = 0; j < 3; ++j) {
-				_vertexData[i * kVertexComponentCount + kNormalOffset + j] = _vertexNormalData[i * 3 + j];
+				_vertexData[i * kVertexComponentCount + kNormalOffset + j] = vertexBuffer[i * vertexSize + normalOffset + j];
 			}
+
 			// mirror z coordinate to change to OpenGL coordinate system
-			_vertexNormalData[i * 3 + 2] *= -1.0f;
 			_vertexData[i * kVertexComponentCount + kNormalOffset + 2] *= -1.0f;
 		}
 
-		if (fvf & DXFVF_DIFFUSE) {
-			// nothing
-		}
-
 		if (fvf & DXFVF_TEX1) {
 			_vertexData[i * kVertexComponentCount + kTextureCoordOffset + 0] = vertexBuffer[i * vertexSize + textureOffset + 0];
 			_vertexData[i * kVertexComponentCount + kTextureCoordOffset + 1] = vertexBuffer[i * vertexSize + textureOffset + 1];
@@ -101,8 +85,6 @@ XSkinMeshLoader::XSkinMeshLoader(XMesh *mesh, DXMesh *dxmesh) {
 
 XSkinMeshLoader::~XSkinMeshLoader() {
 	delete[] _vertexData;
-	delete[] _vertexPositionData;
-	delete[] _vertexNormalData;
 }
 
 } // namespace Wintermute
diff --git a/engines/wintermute/base/gfx/xskinmesh_loader.h b/engines/wintermute/base/gfx/xskinmesh_loader.h
index ac33bf76216..e5148259935 100644
--- a/engines/wintermute/base/gfx/xskinmesh_loader.h
+++ b/engines/wintermute/base/gfx/xskinmesh_loader.h
@@ -53,7 +53,7 @@ class XSkinMeshLoader {
 	friend class SkinMeshHelper;
 
 public:
-	XSkinMeshLoader(XMesh *mesh, DXMesh *dxmesh);
+	XSkinMeshLoader(DXMesh *dxmesh);
 	virtual ~XSkinMeshLoader();
 
 protected:
@@ -65,14 +65,11 @@ protected:
 protected:
 
 	float *_vertexData;
-	float *_vertexPositionData;
-	float *_vertexNormalData;
 	uint32 _vertexCount;
 
 	BaseArray<Math::Matrix4 *> _boneMatrices;
 	BaseArray<SkinWeights> _skinWeightsList;
 
-	XMesh *_mesh;
 	DXMesh *_dxmesh;
 };
 




More information about the Scummvm-git-logs mailing list