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

aquadran noreply at scummvm.org
Sun Feb 26 14:45:50 UTC 2023


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:
b5daa5fb8c WME3D: Move portions code to mesh loader


Commit: b5daa5fb8c7acfdf5a337e6e40a406953f358835
    https://github.com/scummvm/scummvm/commit/b5daa5fb8c7acfdf5a337e6e40a406953f358835
Author: Paweł Kołodziejski (aquadran at gmail.com)
Date: 2023-02-26T15:45:43+01:00

Commit Message:
WME3D: Move portions code to mesh loader

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 e89dddd2eb5..1ae0f669cbc 100644
--- a/engines/wintermute/base/gfx/xmesh.cpp
+++ b/engines/wintermute/base/gfx/xmesh.cpp
@@ -69,54 +69,7 @@ bool XMesh::loadFromXData(const Common::String &filename, XFileData *xobj, Commo
 
 	XSkinMeshLoader *mesh = new XSkinMeshLoader(this, meshObject);
 	_skinMesh = new SkinMeshHelper(mesh);
-
-	mesh->parsePositionCoords(meshObject);
-
-	uint numFaces = _skinMesh->getNumFaces();
-
-	//uint numBones = _skinMesh->getNumBones();
-
-	Common::Array<int> indexCountPerFace;
-
-	mesh->parseFaces(meshObject, numFaces, indexCountPerFace);
-
-	uint numChildren = 0;
-	xobj->getChildren(numChildren);
-
-	for (uint32 i = 0; i < numChildren; i++) {
-		XFileData xchildData;
-		XClassType objectType;
-		if (xobj->getChild(i, xchildData)) {
-			if (xchildData.getType(objectType)) {
-				if (objectType == kXClassMeshTextureCoords) {
-					mesh->parseTextureCoords(&xchildData);
-				} else if (objectType == kXClassMeshNormals) {
-					mesh->parseNormalCoords(&xchildData);
-				} else if (objectType == kXClassMeshMaterialList) {
-					mesh->parseMaterials(&xchildData, _gameRef, numFaces, filename, materialReferences, indexCountPerFace);
-				} else if (objectType == kXClassMaterial) {
-					Material *mat = new Material(_gameRef);
-					mat->loadFromX(&xchildData, filename);
-					_materials.add(mat);
-
-					// one material = one index range
-					_numAttrs = 1;
-					mesh->_indexRanges.push_back(0);
-					mesh->_indexRanges.push_back(mesh->_indexData.size());
-				} else if (objectType == kXClassSkinMeshHeader) {
-					int boneCount = xchildData.getXSkinMeshHeaderObject()->_nBones;
-					_skinnedMesh = boneCount > 0;
-				} else if (objectType == kXClassSkinWeights) {
-					_skinnedMesh = true;
-					mesh->parseSkinWeights(&xchildData);
-				} else if (objectType == kXClassDeclData) {
-					mesh->parseVertexDeclaration(&xchildData);
-				}
-			}
-		}
-	}
-
-	mesh->generateAdjacency(_adjacency);
+	mesh->loadMesh(filename, xobj, materialReferences);
 
 	return true;
 }
diff --git a/engines/wintermute/base/gfx/xskinmesh_loader.cpp b/engines/wintermute/base/gfx/xskinmesh_loader.cpp
index d7d5a4cd6a5..bbd8dfde5a6 100644
--- a/engines/wintermute/base/gfx/xskinmesh_loader.cpp
+++ b/engines/wintermute/base/gfx/xskinmesh_loader.cpp
@@ -53,6 +53,54 @@ XSkinMeshLoader::~XSkinMeshLoader() {
 	delete[] _vertexNormalData;
 }
 
+void XSkinMeshLoader::loadMesh(const Common::String &filename, XFileData *xobj, Common::Array<MaterialReference> &materialReferences) {
+	parsePositionCoords(_meshObject);
+
+	uint numFaces = _meshObject->_numFaces;
+
+	Common::Array<int> indexCountPerFace;
+
+	parseFaces(_meshObject, numFaces, indexCountPerFace);
+
+	uint numChildren = 0;
+	xobj->getChildren(numChildren);
+
+	for (uint32 i = 0; i < numChildren; i++) {
+		XFileData xchildData;
+		XClassType objectType;
+		if (xobj->getChild(i, xchildData)) {
+			if (xchildData.getType(objectType)) {
+				if (objectType == kXClassMeshTextureCoords) {
+					parseTextureCoords(&xchildData);
+				} else if (objectType == kXClassMeshNormals) {
+					parseNormalCoords(&xchildData);
+				} else if (objectType == kXClassMeshMaterialList) {
+					parseMaterials(&xchildData, _mesh->_gameRef, numFaces, filename, materialReferences, indexCountPerFace);
+				} else if (objectType == kXClassMaterial) {
+					Material *mat = new Material(_mesh->_gameRef);
+					mat->loadFromX(&xchildData, filename);
+					_mesh->_materials.add(mat);
+
+					// one material = one index range
+					_mesh->_numAttrs = 1;
+					_indexRanges.push_back(0);
+					_indexRanges.push_back(_indexData.size());
+				} else if (objectType == kXClassSkinMeshHeader) {
+					int boneCount = xchildData.getXSkinMeshHeaderObject()->_nBones;
+					_mesh->_skinnedMesh = boneCount > 0;
+				} else if (objectType == kXClassSkinWeights) {
+					_mesh->_skinnedMesh = true;
+					parseSkinWeights(&xchildData);
+				} else if (objectType == kXClassDeclData) {
+					parseVertexDeclaration(&xchildData);
+				}
+			}
+		}
+	}
+
+	generateAdjacency(_mesh->_adjacency);
+}
+
 bool XSkinMeshLoader::parsePositionCoords(XMeshObject *mesh) {
 	for (uint i = 0; i < _vertexCount; ++i) {
 		_vertexPositionData[i * 3 + 0] = mesh->_vertices[i]._x;
diff --git a/engines/wintermute/base/gfx/xskinmesh_loader.h b/engines/wintermute/base/gfx/xskinmesh_loader.h
index dcc213037d0..c797764ec1e 100644
--- a/engines/wintermute/base/gfx/xskinmesh_loader.h
+++ b/engines/wintermute/base/gfx/xskinmesh_loader.h
@@ -53,7 +53,8 @@ class XSkinMeshLoader {
 public:
 	XSkinMeshLoader(XMesh *mesh, XMeshObject *meshObject);
 	virtual ~XSkinMeshLoader();
-	
+	void loadMesh(const Common::String &filename, XFileData *xobj, Common::Array<MaterialReference> &materialReferences);
+
 protected:
 	static const int kVertexComponentCount = 8;
 	static const int kPositionOffset = 5;




More information about the Scummvm-git-logs mailing list