[Scummvm-git-logs] scummvm master -> 486d15f8047012be6cfcfaedc4d54ca7045a201a
aquadran
noreply at scummvm.org
Mon Oct 14 20:17:23 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:
486d15f804 WINTERMUTE: Switch to internal skinmesh API for generate adjacency
Commit: 486d15f8047012be6cfcfaedc4d54ca7045a201a
https://github.com/scummvm/scummvm/commit/486d15f8047012be6cfcfaedc4d54ca7045a201a
Author: PaweÅ KoÅodziejski (aquadran at gmail.com)
Date: 2024-10-14T22:17:18+02:00
Commit Message:
WINTERMUTE: Switch to internal skinmesh API for generate adjacency
Changed paths:
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.cpp
engines/wintermute/base/gfx/xskinmesh.h
diff --git a/engines/wintermute/base/gfx/skin_mesh_helper.cpp b/engines/wintermute/base/gfx/skin_mesh_helper.cpp
index 835198bd925..05b541ab448 100644
--- a/engines/wintermute/base/gfx/skin_mesh_helper.cpp
+++ b/engines/wintermute/base/gfx/skin_mesh_helper.cpp
@@ -26,7 +26,6 @@
*/
#include "engines/wintermute/dcgf.h"
-#include "engines/wintermute/coll_templ.h"
#include "engines/wintermute/base/gfx/skin_mesh_helper.h"
#include "engines/wintermute/base/gfx/xskinmesh.h"
#include "engines/wintermute/base/gfx/xfile_loader.h"
@@ -63,7 +62,7 @@ bool SkinMeshHelper::getOriginalMesh(DXMesh **mesh) {
}
//////////////////////////////////////////////////////////////////////////
-bool SkinMeshHelper::generateSkinnedMesh(Common::Array<uint32> &adjacencyOut, DXMesh **mesh) {
+bool SkinMeshHelper::generateSkinnedMesh(uint32 *adjacencyOut, DXMesh **mesh) {
bool res = getOriginalMesh(mesh);
if (res) {
(*mesh)->generateAdjacency(adjacencyOut);
diff --git a/engines/wintermute/base/gfx/skin_mesh_helper.h b/engines/wintermute/base/gfx/skin_mesh_helper.h
index 82cb371c059..90e387dc5d2 100644
--- a/engines/wintermute/base/gfx/skin_mesh_helper.h
+++ b/engines/wintermute/base/gfx/skin_mesh_helper.h
@@ -50,7 +50,7 @@ public:
uint getNumFaces();
uint getNumBones();
bool getOriginalMesh(DXMesh **mesh);
- bool generateSkinnedMesh(Common::Array<uint32> &adjacencyOut, DXMesh **mesh);
+ bool generateSkinnedMesh(uint32 *adjacencyOut, DXMesh **mesh);
bool updateSkinnedMesh(const DXMatrix *boneTransforms, DXMesh *mesh);
const char *getBoneName(uint32 boneIndex);
DXMatrix *getBoneOffsetMatrix(uint32 boneIndex);
diff --git a/engines/wintermute/base/gfx/xmesh.cpp b/engines/wintermute/base/gfx/xmesh.cpp
index 12de2b131be..c2fdf922544 100644
--- a/engines/wintermute/base/gfx/xmesh.cpp
+++ b/engines/wintermute/base/gfx/xmesh.cpp
@@ -46,6 +46,7 @@ XMesh::XMesh(Wintermute::BaseGame *inGame) : BaseNamedObject(inGame) {
_staticMesh = nullptr;
_boneMatrices = nullptr;
+ _adjacency = nullptr;
_BBoxStart = _BBoxEnd = Math::Vector3d(0.0f, 0.0f, 0.0f);
}
@@ -60,6 +61,8 @@ XMesh::~XMesh() {
delete[] _boneMatrices;
_boneMatrices = nullptr;
+ delete[] _adjacency;
+ _adjacency = nullptr;
_materials.clear();
}
@@ -74,7 +77,6 @@ bool XMesh::loadFromXData(const Common::String &filename, XFileData *xobj) {
// load mesh
DXBuffer bufMaterials;
- //uint32 numFaces;
uint32 numMaterials;
DXMesh *mesh;
DXSkinInfo *skinInfo;
@@ -109,8 +111,6 @@ bool XMesh::loadFromXData(const Common::String &filename, XFileData *xobj) {
_skinMesh = new SkinMeshHelper(mesh, skinInfo);
- //numFaces = _skinMesh->getNumFaces();
-
uint32 numBones = _skinMesh->getNumBones();
// Process skinning data
@@ -128,8 +128,8 @@ bool XMesh::loadFromXData(const Common::String &filename, XFileData *xobj) {
_skinMesh = nullptr;
if (_blendedMesh) {
- //numFaces = _blendedMesh->getNumFaces();
- //_adjacency = new uint32[numFaces * 3];
+ uint32 numFaces = _blendedMesh->getNumFaces();
+ _adjacency = new uint32[numFaces * 3];
_blendedMesh->generateAdjacency(_adjacency);
}
}
@@ -166,13 +166,13 @@ bool XMesh::loadFromXData(const Common::String &filename, XFileData *xobj) {
//////////////////////////////////////////////////////////////////////////
bool XMesh::generateMesh() {
- //uint32 numFaces = _skinMesh->getNumFaces();
+ uint32 numFaces = _skinMesh->getNumFaces();
delete _blendedMesh;
_blendedMesh = nullptr;
- //delete[] _adjacency;
- //_adjacency = new uint32[numFaces * 3];
+ delete[] _adjacency;
+ _adjacency = new uint32[numFaces * 3];
// blend the mesh
if (!_skinMesh->generateSkinnedMesh(_adjacency, &_blendedMesh)) {
diff --git a/engines/wintermute/base/gfx/xmesh.h b/engines/wintermute/base/gfx/xmesh.h
index 6cab29952a5..2bf710fdd5b 100644
--- a/engines/wintermute/base/gfx/xmesh.h
+++ b/engines/wintermute/base/gfx/xmesh.h
@@ -79,7 +79,7 @@ protected:
DXMatrix **_boneMatrices;
- Common::Array<uint32> _adjacency;
+ uint32 *_adjacency;
BaseArray<Material *> _materials;
};
diff --git a/engines/wintermute/base/gfx/xskinmesh.cpp b/engines/wintermute/base/gfx/xskinmesh.cpp
index cb01ec8ea90..bc2250d5057 100644
--- a/engines/wintermute/base/gfx/xskinmesh.cpp
+++ b/engines/wintermute/base/gfx/xskinmesh.cpp
@@ -290,55 +290,6 @@ bool DXMesh::generateAdjacency(uint32 *adjacency) {
return true;
}
-bool DXMesh::generateAdjacency(Common::Array<uint32> &adjacency) {
- uint32 *indexData = (uint32 *)_indexBuffer.ptr();
- uint32 indexDataSize = _indexBuffer.size() / sizeof(uint32);
- adjacency = Common::Array<uint32>(indexDataSize, 0xFFFFFFFF);
-
- for (uint32 i = 0; i < indexDataSize / 3; ++i) {
- for (uint32 j = i + 1; j < indexDataSize / 3; ++j) {
- for (int edge1 = 0; edge1 < 3; ++edge1) {
- uint32 index1 = indexData[i * 3 + edge1];
- uint32 index2 = indexData[i * 3 + (edge1 + 1) % 3];
-
- for (int edge2 = 0; edge2 < 3; ++edge2) {
- uint32 index3 = indexData[j * 3 + edge2];
- uint32 index4 = indexData[j * 3 + (edge2 + 1) % 3];
-
- if (adjacency[i * 3 + edge1] == 0xFFFFFFFF &&
- adjacency[j * 3 + edge2] == 0xFFFFFFFF &&
- adjacentEdge(index1, index2, index3, index4)) {
- adjacency[i * 3 + edge1] = j;
- adjacency[j * 3 + edge2] = i;
- break;
- }
- }
- }
- }
- }
-
- return true;
-}
-
-bool DXMesh::adjacentEdge(uint32 index1, uint32 index2, uint32 index3, uint32 index4) {
- float *vertexData = (float *)_vertexBuffer.ptr();
- uint32 vertexSize = DXGetFVFVertexSize(_fvf) / sizeof(float);
- DXVector3 vertex1(vertexData + vertexSize * index1);
- DXVector3 vertex2(vertexData + vertexSize * index2);
- DXVector3 vertex3(vertexData + vertexSize * index3);
- DXVector3 vertex4(vertexData + vertexSize * index4);
-
- // wme uses a function from the D3DX library, which takes in an epsilon for floating point comparison
- // wme passes in zero, so we just do a direct comparison
- if (vertex1 == vertex3 && vertex2 == vertex4) {
- return true;
- } else if (vertex1 == vertex4 && vertex2 == vertex3) {
- return true;
- }
-
- return false;
-}
-
bool DXMesh::cloneMesh(DXMesh **cloneMeshOut) {
DXMesh *clonedMesh;
diff --git a/engines/wintermute/base/gfx/xskinmesh.h b/engines/wintermute/base/gfx/xskinmesh.h
index a487d19610c..c579bcc1973 100644
--- a/engines/wintermute/base/gfx/xskinmesh.h
+++ b/engines/wintermute/base/gfx/xskinmesh.h
@@ -141,7 +141,6 @@ class DXMesh {
};
static int compareVertexKeys(const void *a, const void *b);
- bool adjacentEdge(uint32 index1, uint32 index2, uint32 index3, uint32 index4);
public:
~DXMesh() { destroy(); }
@@ -156,7 +155,6 @@ public:
DXBuffer getAtribBuffer() { return _attribBuffer; }
DXAttributeRangeTable *getAttributeTable() { return &_attribTable; }
bool generateAdjacency(uint32 *adjacency);
- bool generateAdjacency(Common::Array<uint32> &adjacency);
};
bool DXLoadSkinMesh(XFileData *fileData, DXBuffer &materialsOut, uint32 &numMaterialsOut, DXSkinInfo **skinInfoOut, DXMesh **meshOut);
More information about the Scummvm-git-logs
mailing list