[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