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

aquadran noreply at scummvm.org
Sat Oct 12 09:48:18 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:
d4308be595 WINTERMUTE: Split mesh to static and blended


Commit: d4308be595c57c736571a4bd63709bf4a13e1b08
    https://github.com/scummvm/scummvm/commit/d4308be595c57c736571a4bd63709bf4a13e1b08
Author: Paweł Kołodziejski (aquadran at gmail.com)
Date: 2024-10-12T11:48:12+02:00

Commit Message:
WINTERMUTE: Split mesh to static and blended

Changed paths:
    engines/wintermute/base/gfx/opengl/meshx_opengl.cpp
    engines/wintermute/base/gfx/opengl/meshx_opengl_shader.cpp
    engines/wintermute/base/gfx/skin_mesh_helper.cpp
    engines/wintermute/base/gfx/skin_mesh_helper.h
    engines/wintermute/base/gfx/xmesh.cpp
    engines/wintermute/base/gfx/xmesh.h
    engines/wintermute/base/gfx/xskinmesh.h
    engines/wintermute/base/gfx/xskinmesh_loader.cpp
    engines/wintermute/base/gfx/xskinmesh_loader.h


diff --git a/engines/wintermute/base/gfx/opengl/meshx_opengl.cpp b/engines/wintermute/base/gfx/opengl/meshx_opengl.cpp
index 4f0386a93d0..dcd89f8dd5c 100644
--- a/engines/wintermute/base/gfx/opengl/meshx_opengl.cpp
+++ b/engines/wintermute/base/gfx/opengl/meshx_opengl.cpp
@@ -48,14 +48,17 @@ XMeshOpenGL::~XMeshOpenGL() {
 
 //////////////////////////////////////////////////////////////////////////
 bool XMeshOpenGL::render(XModel *model) {
-	float *vertexData = _skinMesh->_mesh->_vertexData;
-	auto indexData = (uint32 *)_skinMesh->_dxmesh->getIndexBuffer().ptr();
+	if (!_blendedMesh)
+		return false;
+
+	float *vertexData = _blendedMesh->_meshLoader->_vertexData;
+	auto indexData = (uint32 *)_blendedMesh->getIndexBuffer().ptr();
 	if (vertexData == nullptr) {
 		return false;
 	}
 
 	bool noAttrs = false;
-	auto attrsTable = _skinMesh->_mesh->_dxmesh->getAttributeTable();
+	auto attrsTable = _blendedMesh->getAttributeTable();
 	uint32 numAttrs = attrsTable->_size;
 	DXAttributeRange *attrs;
 	if (numAttrs == 0) {
@@ -69,8 +72,8 @@ bool XMeshOpenGL::render(XModel *model) {
 	if (noAttrs) {
 		attrs[0]._attribId = 0;
 		attrs[0]._vertexStart = attrs[0]._faceStart = 0;
-		attrs[0]._vertexCount = _skinMesh->_mesh->_dxmesh->getNumVertices();
-		attrs[0]._faceCount = _skinMesh->_mesh->_dxmesh->getNumFaces();
+		attrs[0]._vertexCount = _blendedMesh->getNumVertices();
+		attrs[0]._faceCount = _blendedMesh->getNumFaces();
 	}
 
 	for (uint32 i = 0; i < numAttrs; i++) {
diff --git a/engines/wintermute/base/gfx/opengl/meshx_opengl_shader.cpp b/engines/wintermute/base/gfx/opengl/meshx_opengl_shader.cpp
index 19204640f36..0d3756a0f5e 100644
--- a/engines/wintermute/base/gfx/opengl/meshx_opengl_shader.cpp
+++ b/engines/wintermute/base/gfx/opengl/meshx_opengl_shader.cpp
@@ -53,10 +53,10 @@ XMeshOpenGLShader::~XMeshOpenGLShader() {
 
 bool XMeshOpenGLShader::loadFromXData(const Common::String &filename, XFileData *xobj) {
 	if (XMesh::loadFromXData(filename, xobj)) {
-		auto indexData = _skinMesh->_dxmesh->getIndexBuffer().ptr();
-		uint32 indexDataSize = _skinMesh->_dxmesh->getIndexBuffer().size() / sizeof(uint32);
-		float *vertexData = _skinMesh->_mesh->_vertexData;
-		uint32 vertexCount = _skinMesh->_mesh->_vertexCount;
+		auto indexData = _blendedMesh->getIndexBuffer().ptr();
+		uint32 indexDataSize = _blendedMesh->getIndexBuffer().size() / sizeof(uint32);
+		float *vertexData = _blendedMesh->_meshLoader->_vertexData;
+		uint32 vertexCount = _blendedMesh->_meshLoader->_vertexCount;
 
 		glBindBuffer(GL_ARRAY_BUFFER, _vertexBuffer);
 		glBufferData(GL_ARRAY_BUFFER, 4 * XSkinMeshLoader::kVertexComponentCount * vertexCount, vertexData, GL_DYNAMIC_DRAW);
@@ -72,13 +72,16 @@ bool XMeshOpenGLShader::loadFromXData(const Common::String &filename, XFileData
 
 //////////////////////////////////////////////////////////////////////////
 bool XMeshOpenGLShader::render(XModel *model) {
-	float *vertexData = _skinMesh->_mesh->_vertexData;
+	if (!_blendedMesh)
+		return false;
+
+	float *vertexData = _blendedMesh->_meshLoader->_vertexData;
 	if (vertexData == nullptr) {
 		return false;
 	}
 
 	bool noAttrs = false;
-	auto attrsTable = _skinMesh->_mesh->_dxmesh->getAttributeTable();
+	auto attrsTable = _blendedMesh->getAttributeTable();
 	uint32 numAttrs = attrsTable->_size;
 	DXAttributeRange *attrs;
 	if (numAttrs == 0) {
@@ -92,8 +95,8 @@ bool XMeshOpenGLShader::render(XModel *model) {
 	if (noAttrs) {
 		attrs[0]._attribId = 0;
 		attrs[0]._vertexStart = attrs[0]._faceStart = 0;
-		attrs[0]._vertexCount = _skinMesh->_mesh->_dxmesh->getNumVertices();
-		attrs[0]._faceCount = _skinMesh->_mesh->_dxmesh->getNumFaces();
+		attrs[0]._vertexCount = _blendedMesh->getNumVertices();
+		attrs[0]._faceCount = _blendedMesh->getNumFaces();
 	}
 
 	glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, _indexBuffer);
@@ -138,7 +141,7 @@ bool XMeshOpenGLShader::render(XModel *model) {
 }
 
 bool XMeshOpenGLShader::renderFlatShadowModel() {
-	float *vertexData = _skinMesh->_mesh->_vertexData;
+	float *vertexData = _blendedMesh->_meshLoader->_vertexData;
 	if (vertexData == nullptr) {
 		return false;
 	}
@@ -148,7 +151,7 @@ bool XMeshOpenGLShader::renderFlatShadowModel() {
 	_flatShadowShader->enableVertexAttribute("position", _vertexBuffer, 3, GL_FLOAT, false, 4 * XSkinMeshLoader::kVertexComponentCount, 4 * XSkinMeshLoader::kPositionOffset);
 	_flatShadowShader->use(true);
 
-	glDrawElements(GL_TRIANGLES, _skinMesh->_mesh->_dxmesh->getNumFaces() * 3, GL_UNSIGNED_SHORT, 0);
+	glDrawElements(GL_TRIANGLES, _blendedMesh->getNumFaces() * 3, GL_UNSIGNED_SHORT, 0);
 
 	glBindBuffer(GL_ARRAY_BUFFER, 0);
 	glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
@@ -159,8 +162,8 @@ bool XMeshOpenGLShader::renderFlatShadowModel() {
 bool XMeshOpenGLShader::update(FrameNode *parentFrame) {
 	XMesh::update(parentFrame);
 
-	float *vertexData = _skinMesh->_mesh->_vertexData;
-	uint32 vertexCount = _skinMesh->_mesh->_vertexCount;
+	float *vertexData = _blendedMesh->_meshLoader->_vertexData;
+	uint32 vertexCount = _blendedMesh->_meshLoader->_vertexCount;
 
 	glBindBuffer(GL_ARRAY_BUFFER, _vertexBuffer);
 	glBufferSubData(GL_ARRAY_BUFFER, 0, 4 * XSkinMeshLoader::kVertexComponentCount * vertexCount, vertexData);
diff --git a/engines/wintermute/base/gfx/skin_mesh_helper.cpp b/engines/wintermute/base/gfx/skin_mesh_helper.cpp
index 94648dffe72..a14b23c1f26 100644
--- a/engines/wintermute/base/gfx/skin_mesh_helper.cpp
+++ b/engines/wintermute/base/gfx/skin_mesh_helper.cpp
@@ -34,22 +34,22 @@
 namespace Wintermute {
 
 //////////////////////////////////////////////////////////////////////////
-SkinMeshHelper::SkinMeshHelper(XSkinMeshLoader *meshLoader, DXMesh *mesh, DXSkinInfo *skinInfo) {
-	_mesh = meshLoader;
-	_dxmesh = mesh;
+SkinMeshHelper::SkinMeshHelper(DXMesh *mesh, DXSkinInfo *skinInfo) {
+	_mesh = mesh;
 	_skinInfo = skinInfo;
 }
 
 //////////////////////////////////////////////////////////////////////////
 SkinMeshHelper::~SkinMeshHelper() {
 	delete _mesh;
-	delete _dxmesh;
+	_mesh = nullptr;
 	delete _skinInfo;
+	_skinInfo = nullptr;
 }
 
 //////////////////////////////////////////////////////////////////////////
 uint SkinMeshHelper::getNumFaces() {
-	return _dxmesh->getNumFaces();
+	return _mesh->getNumFaces();
 }
 
 //////////////////////////////////////////////////////////////////////////
@@ -59,11 +59,11 @@ uint SkinMeshHelper::getNumBones() {
 
 //////////////////////////////////////////////////////////////////////////
 bool SkinMeshHelper::getOriginalMesh(DXMesh **mesh) {
-	return _dxmesh->cloneMesh(mesh);
+	return _mesh->cloneMesh(mesh);
 }
 
 //////////////////////////////////////////////////////////////////////////
-bool SkinMeshHelper::generateSkinnedMesh(uint32 *adjacencyOut, DXMesh **mesh) {
+bool SkinMeshHelper::generateSkinnedMesh(Common::Array<uint32> &adjacencyOut, DXMesh **mesh) {
 	bool res = getOriginalMesh(mesh);
 	if (res) {
 		(*mesh)->generateAdjacency(adjacencyOut);
@@ -74,7 +74,7 @@ bool SkinMeshHelper::generateSkinnedMesh(uint32 *adjacencyOut, DXMesh **mesh) {
 
 //////////////////////////////////////////////////////////////////////////
 bool SkinMeshHelper::updateSkinnedMesh(const DXMatrix *boneTransforms, DXMesh *mesh) {
-	void *sourceVerts = reinterpret_cast<void *>(_dxmesh->getVertexBuffer().ptr());
+	void *sourceVerts = reinterpret_cast<void *>(_mesh->getVertexBuffer().ptr());
 	void *targetVerts = reinterpret_cast<void *>(mesh->getVertexBuffer().ptr());
 
 	return _skinInfo->updateSkinnedMesh(boneTransforms, sourceVerts, targetVerts);
diff --git a/engines/wintermute/base/gfx/skin_mesh_helper.h b/engines/wintermute/base/gfx/skin_mesh_helper.h
index b1c86a68b53..ed664bcd22a 100644
--- a/engines/wintermute/base/gfx/skin_mesh_helper.h
+++ b/engines/wintermute/base/gfx/skin_mesh_helper.h
@@ -49,20 +49,19 @@ class SkinMeshHelper {
 	friend class XMeshOpenGLShader;
 
 public:
-	SkinMeshHelper(XSkinMeshLoader *meshLoader, DXMesh *mesh, DXSkinInfo *skinInfo);
+	SkinMeshHelper(DXMesh *mesh, DXSkinInfo *skinInfo);
 	virtual ~SkinMeshHelper();
 
 	uint getNumFaces();
 	uint getNumBones();
 	bool getOriginalMesh(DXMesh **mesh);
-	bool generateSkinnedMesh(uint32 *adjacencyOut, DXMesh **mesh);
+	bool generateSkinnedMesh(Common::Array<uint32> &adjacencyOut, DXMesh **mesh);
 	bool updateSkinnedMesh(const DXMatrix *boneTransforms, DXMesh *mesh);
 	const char *getBoneName(uint32 boneIndex);
 	DXMatrix *getBoneOffsetMatrix(uint32 boneIndex);
 
 private:
-	XSkinMeshLoader *_mesh;
-	DXMesh *_dxmesh;
+	DXMesh *_mesh;
 	DXSkinInfo *_skinInfo;
 };
 
diff --git a/engines/wintermute/base/gfx/xmesh.cpp b/engines/wintermute/base/gfx/xmesh.cpp
index 1c835e8ca99..cd18be8f005 100644
--- a/engines/wintermute/base/gfx/xmesh.cpp
+++ b/engines/wintermute/base/gfx/xmesh.cpp
@@ -43,6 +43,8 @@ namespace Wintermute {
 
 XMesh::XMesh(Wintermute::BaseGame *inGame) : BaseNamedObject(inGame) {
 	_skinMesh = nullptr;
+	_blendedMesh = nullptr;
+	_staticMesh = nullptr;
 
 	_BBoxStart = Math::Vector3d(0.0f, 0.0f, 0.0f);
 	_BBoxEnd = Math::Vector3d(0.0f, 0.0f, 0.0f);
@@ -50,6 +52,11 @@ XMesh::XMesh(Wintermute::BaseGame *inGame) : BaseNamedObject(inGame) {
 
 XMesh::~XMesh() {
 	delete _skinMesh;
+	_skinMesh = nullptr;
+	delete _blendedMesh;
+	_blendedMesh = nullptr;
+	delete _staticMesh;
+	_staticMesh = nullptr;
 	_materials.clear();
 }
 
@@ -64,7 +71,7 @@ bool XMesh::loadFromXData(const Common::String &filename, XFileData *xobj) {
 	// load mesh
 	DXBuffer bufMaterials;
 	//DXBuffer bufBoneOffset;
-	uint32 numFaces;
+	//uint32 numFaces;
 	uint32 numMaterials;
 	DXMesh *mesh;
 	DXSkinInfo *skinInfo = nullptr;
@@ -76,14 +83,39 @@ bool XMesh::loadFromXData(const Common::String &filename, XFileData *xobj) {
 	}
 
 	XSkinMeshLoader *meshLoader = new XSkinMeshLoader(this, mesh);
-	meshLoader->loadMesh(filename, xobj);
 
-	_skinMesh = new SkinMeshHelper(meshLoader, mesh, skinInfo);
+	_skinMesh = new SkinMeshHelper(mesh, skinInfo);
 
-	numFaces = _skinMesh->getNumFaces();
+	//numFaces = _skinMesh->getNumFaces();
 
 	uint32 numBones = _skinMesh->getNumBones();
 
+	// Process skinning data
+	if (numBones) {
+		// bones are available
+		//_boneMatrices = new DXMatrix*[numBones];
+
+		generateMesh();
+		_blendedMesh->_meshLoader = meshLoader;
+	} 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;
+
+		delete _skinMesh;
+		_skinMesh = nullptr;
+
+		if (_blendedMesh) {
+			//numFaces = _blendedMesh->getNumFaces();
+			//_adjacency = new uint32[numFaces * 3];
+			_blendedMesh->generateAdjacency(_adjacency);
+		}
+	}
+
+
 	// check for materials
 	if ((bufMaterials.ptr() == nullptr) || (numMaterials == 0)) {
 		// no materials are found, create default material
@@ -145,31 +177,50 @@ bool XMesh::loadFromXData(const Common::String &filename, XFileData *xobj) {
 		meshLoader->_skinWeightsList.push_back(currSkinWeights);
 	}
 
-	mesh->generateAdjacency(_adjacency);
-
 	bufMaterials.free();
 	//bufBoneOffset.free();
 
 	return true;
 }
 
+//////////////////////////////////////////////////////////////////////////
+bool XMesh::generateMesh() {
+	//uint32 numFaces = _skinMesh->getNumFaces();
+
+	delete _blendedMesh;
+	_blendedMesh = nullptr;
+
+	//delete[] _adjacency;
+	//_adjacency = new uint32[numFaces * 3];
+
+	// blend the mesh
+	if (!_skinMesh->generateSkinnedMesh(_adjacency, &_blendedMesh)) {
+		BaseEngine::LOG(0, "Error converting to blended mesh");
+		return false;
+	}
+
+	return true;
+}
+
 //////////////////////////////////////////////////////////////////////////
 bool XMesh::findBones(FrameNode *rootFrame) {
 	// normal meshes don't have bones
-	if (!_skinMesh || !_skinMesh->getNumBones()) {
+	if (!_skinMesh)
 		return true;
-	}
-	auto skinWeightsList = _skinMesh->_mesh->_skinWeightsList;
 
-	_boneMatrices.resize(skinWeightsList.size());
+	auto skinWeightsList = _blendedMesh->_meshLoader->_skinWeightsList;
 
+	_boneMatrices.resize(skinWeightsList.size());
+	// get the buffer with the names of the bones
 	for (uint i = 0; i < skinWeightsList.size(); ++i) {
+		// find a frame with the same name
 		FrameNode *frame = rootFrame->findFrame(skinWeightsList[i]._boneName.c_str());
 
 		if (frame) {
+			// get a *pointer* to its world matrix
 			_boneMatrices[i] = frame->getCombinedMatrix();
 		} else {
-			warning("XMesh::findBones could not find bone %s", skinWeightsList[i]._boneName.c_str());
+			BaseEngine::LOG(0, "Warning: Cannot find frame '%s'", skinWeightsList[i]._boneName.c_str());
 		}
 	}
 
@@ -178,21 +229,25 @@ bool XMesh::findBones(FrameNode *rootFrame) {
 
 //////////////////////////////////////////////////////////////////////////
 bool XMesh::update(FrameNode *parentFrame) {
-	float *vertexData = _skinMesh->_mesh->_vertexData;
+	if (!_blendedMesh)
+		return false;
+
+	float *vertexData = _blendedMesh->_meshLoader->_vertexData;
 	if (vertexData == nullptr) {
 		return false;
 	}
 
-	float *vertexPositionData = _skinMesh->_mesh->_vertexPositionData;
-	float *vertexNormalData = _skinMesh->_mesh->_vertexNormalData;
-	uint32 vertexCount = _skinMesh->_mesh->_vertexCount;
-	auto skinWeightsList = _skinMesh->_mesh->_skinWeightsList;
+	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->getNumBones() > 0) {
+	if (_skinMesh) {
 		BaseArray<Math::Matrix4> finalBoneMatrices;
 		finalBoneMatrices.resize(_boneMatrices.size());
 
+		// prepare final matrices
 		for (uint i = 0; i < skinWeightsList.size(); ++i) {
 			finalBoneMatrices[i] = *_boneMatrices[i] * skinWeightsList[i]._offsetMatrix;
 		}
@@ -270,7 +325,10 @@ bool XMesh::update(FrameNode *parentFrame) {
 
 //////////////////////////////////////////////////////////////////////////
 bool XMesh::updateShadowVol(ShadowVolume *shadow, Math::Matrix4 &modelMat, const Math::Vector3d &light, float extrusionDepth) {
-	float *vertexData = _skinMesh->_mesh->_vertexData;
+	if (!_blendedMesh)
+		return false;
+
+	float *vertexData = _blendedMesh->_meshLoader->_vertexData;
 	if (vertexData == nullptr) {
 		return false;
 	}
@@ -282,8 +340,8 @@ bool XMesh::updateShadowVol(ShadowVolume *shadow, Math::Matrix4 &modelMat, const
 
 	uint32 numEdges = 0;
 
-	auto indexData = (uint32 *)_skinMesh->_dxmesh->getIndexBuffer().ptr();
-	uint32 indexDataSize = _skinMesh->_dxmesh->getIndexBuffer().size() / sizeof(uint32);
+	auto indexData = (uint32 *)_blendedMesh->getIndexBuffer().ptr();
+	uint32 indexDataSize = _blendedMesh->getIndexBuffer().size() / sizeof(uint32);
 	Common::Array<bool> isFront(indexDataSize / 3, false);
 
 	// First pass : for each face, record if it is front or back facing the light
@@ -361,15 +419,18 @@ bool XMesh::updateShadowVol(ShadowVolume *shadow, Math::Matrix4 &modelMat, const
 
 //////////////////////////////////////////////////////////////////////////
 bool XMesh::pickPoly(Math::Vector3d *pickRayOrig, Math::Vector3d *pickRayDir) {
-	float *vertexData = _skinMesh->_mesh->_vertexData;
+	if (!_blendedMesh)
+		return false;
+
+	float *vertexData = _blendedMesh->_meshLoader->_vertexData;
 	if (vertexData == nullptr) {
 		return false;
 	}
 
 	bool res = false;
 
-	auto indexData = _skinMesh->_dxmesh->getIndexBuffer().ptr();
-	uint32 indexDataSize = _skinMesh->_dxmesh->getIndexBuffer().size() / sizeof(uint32);
+	auto indexData = _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];
@@ -417,7 +478,10 @@ bool XMesh::setMaterialTheora(const Common::String &matName, VideoTheoraPlayer *
 
 //////////////////////////////////////////////////////////////////////////
 bool XMesh::invalidateDeviceObjects() {
-	// release buffers here
+	if (_skinMesh) {
+		delete[] _blendedMesh;
+		_blendedMesh = nullptr;
+	}
 
 	for (uint32 i = 0; i < _materials.size(); i++) {
 		_materials[i]->invalidateDeviceObjects();
@@ -432,16 +496,22 @@ bool XMesh::restoreDeviceObjects() {
 		_materials[i]->restoreDeviceObjects();
 	}
 
-	if (!_skinMesh || _skinMesh->getNumBones() > 0) {
-		return _skinMesh->_dxmesh->generateAdjacency(_adjacency);
+	if (_skinMesh) {
+		return generateMesh();
 	} else {
 		return true;
 	}
 }
 
 void XMesh::updateBoundingBox() {
-	float *vertexData = _skinMesh->_mesh->_vertexData;
-	uint32 vertexCount = _skinMesh->_mesh->_vertexCount;
+	float *vertexData;
+
+	if (_blendedMesh)
+		vertexData = _blendedMesh->_meshLoader->_vertexData;
+	else
+		vertexData = _staticMesh->_meshLoader->_vertexData;
+
+	uint32 vertexCount = _blendedMesh->getNumVertices();
 	if (vertexData == nullptr || vertexCount == 0) {
 		return;
 	}
diff --git a/engines/wintermute/base/gfx/xmesh.h b/engines/wintermute/base/gfx/xmesh.h
index b5b7de4149b..5531235c646 100644
--- a/engines/wintermute/base/gfx/xmesh.h
+++ b/engines/wintermute/base/gfx/xmesh.h
@@ -43,6 +43,7 @@ class Material;
 class ShadowVolume;
 class VideoTheoraPlayer;
 class SkinMeshHelper;
+class DXMesh;
 struct XMeshObject;
 
 class XMesh : public BaseNamedObject {
@@ -70,10 +71,13 @@ public:
 	bool restoreDeviceObjects();
 
 protected:
+	bool generateMesh();
 
 	void updateBoundingBox();
 
 	SkinMeshHelper *_skinMesh;
+	DXMesh *_blendedMesh;
+	DXMesh *_staticMesh;
 
 	BaseArray<Math::Matrix4 *> _boneMatrices;
 
diff --git a/engines/wintermute/base/gfx/xskinmesh.h b/engines/wintermute/base/gfx/xskinmesh.h
index cf645eaaae8..9e43a6280c0 100644
--- a/engines/wintermute/base/gfx/xskinmesh.h
+++ b/engines/wintermute/base/gfx/xskinmesh.h
@@ -104,6 +104,8 @@ struct DXBone {
 #pragma pack()
 #endif
 
+class XSkinMeshLoader;
+
 class DXSkinInfo {
 	uint32 _fvf;
 	uint32 _numVertices{};
@@ -144,6 +146,7 @@ class DXMesh {
 	bool adjacentEdge(uint32 index1, uint32 index2, uint32 index3, uint32 index4);
 
 public:
+	XSkinMeshLoader *_meshLoader;
 	~DXMesh() { destroy(); }
 	bool create(uint32 numFaces, uint32 numVertices, uint32 fvf);
 	void destroy();
diff --git a/engines/wintermute/base/gfx/xskinmesh_loader.cpp b/engines/wintermute/base/gfx/xskinmesh_loader.cpp
index af6d75fdb48..fef0c48286e 100644
--- a/engines/wintermute/base/gfx/xskinmesh_loader.cpp
+++ b/engines/wintermute/base/gfx/xskinmesh_loader.cpp
@@ -35,7 +35,7 @@ namespace Wintermute {
 XSkinMeshLoader::XSkinMeshLoader(XMesh *mesh, DXMesh *dxmesh) {
 	_mesh = mesh;
 	_dxmesh = dxmesh;
-
+	
 	_vertexCount = dxmesh->getNumVertices();
 	// vertex format for .X meshes will be position + normals + textures
 	_vertexData = new float[kVertexComponentCount * _vertexCount]();
@@ -43,15 +43,7 @@ XSkinMeshLoader::XSkinMeshLoader(XMesh *mesh, DXMesh *dxmesh) {
 	// 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]();
-}
-
-XSkinMeshLoader::~XSkinMeshLoader() {
-	delete[] _vertexData;
-	delete[] _vertexPositionData;
-	delete[] _vertexNormalData;
-}
-
-void XSkinMeshLoader::loadMesh(const Common::String &filename, XFileData *xobj) {
+	
 	auto fvf = _dxmesh->getFVF();
 	uint32 vertexSize = DXGetFVFVertexSize(fvf) / sizeof(float);
 	float *vertexBuffer = (float *)_dxmesh->getVertexBuffer().ptr();
@@ -107,4 +99,10 @@ void XSkinMeshLoader::loadMesh(const Common::String &filename, XFileData *xobj)
 	}
 }
 
+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 961410947a8..ac33bf76216 100644
--- a/engines/wintermute/base/gfx/xskinmesh_loader.h
+++ b/engines/wintermute/base/gfx/xskinmesh_loader.h
@@ -55,7 +55,6 @@ class XSkinMeshLoader {
 public:
 	XSkinMeshLoader(XMesh *mesh, DXMesh *dxmesh);
 	virtual ~XSkinMeshLoader();
-	void loadMesh(const Common::String &filename, XFileData *xobj);
 
 protected:
 	static const int kVertexComponentCount = 8;




More information about the Scummvm-git-logs mailing list