[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