[Scummvm-git-logs] scummvm master -> e66b3bd1f0815a7d1a1107d0bdcf100a3ac94845
aquadran
noreply at scummvm.org
Sat Oct 12 05:41:45 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:
e66b3bd1f0 WINTERMUTE: Moved generate adjacency function
Commit: e66b3bd1f0815a7d1a1107d0bdcf100a3ac94845
https://github.com/scummvm/scummvm/commit/e66b3bd1f0815a7d1a1107d0bdcf100a3ac94845
Author: PaweÅ KoÅodziejski (aquadran at gmail.com)
Date: 2024-10-12T07:41:41+02:00
Commit Message:
WINTERMUTE: Moved generate adjacency function
Changed paths:
engines/wintermute/base/gfx/xmesh.cpp
engines/wintermute/base/gfx/xskinmesh.cpp
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/xmesh.cpp b/engines/wintermute/base/gfx/xmesh.cpp
index 560acf63f7c..ad3d7b50c06 100644
--- a/engines/wintermute/base/gfx/xmesh.cpp
+++ b/engines/wintermute/base/gfx/xmesh.cpp
@@ -155,7 +155,7 @@ bool XMesh::loadFromXData(const Common::String &filename, XFileData *xobj) {
}
}
- meshLoader->generateAdjacency(_adjacency);
+ mesh->generateAdjacency(_adjacency);
bufAdjacency.free();
bufMaterials.free();
@@ -330,19 +330,19 @@ bool XMesh::updateShadowVol(ShadowVolume *shadow, Math::Matrix4 &modelMat, const
uint32 adjacent1 = _adjacency[3 * i + 1];
uint32 adjacent2 = _adjacency[3 * i + 2];
- if (adjacent0 == XSkinMeshLoader::kNullIndex || isFront[adjacent0] == false) {
+ if (adjacent0 == 0xFFFFFFFF || isFront[adjacent0] == false) {
// add edge v0-v1
edges[2 * numEdges + 0] = wFace0;
edges[2 * numEdges + 1] = wFace1;
numEdges++;
}
- if (adjacent1 == XSkinMeshLoader::kNullIndex || isFront[adjacent1] == false) {
+ if (adjacent1 == 0xFFFFFFFF || isFront[adjacent1] == false) {
// add edge v1-v2
edges[2 * numEdges + 0] = wFace1;
edges[2 * numEdges + 1] = wFace2;
numEdges++;
}
- if (adjacent2 == XSkinMeshLoader::kNullIndex || isFront[adjacent2] == false) {
+ if (adjacent2 == 0xFFFFFFFF || isFront[adjacent2] == false) {
// add edge v2-v0
edges[2 * numEdges + 0] = wFace2;
edges[2 * numEdges + 1] = wFace0;
@@ -442,7 +442,7 @@ bool XMesh::restoreDeviceObjects() {
}
if (_skinnedMesh) {
- return _skinMesh->_mesh->generateAdjacency(_adjacency);
+ return _skinMesh->_dxmesh->generateAdjacency(_adjacency);
} else {
return true;
}
diff --git a/engines/wintermute/base/gfx/xskinmesh.cpp b/engines/wintermute/base/gfx/xskinmesh.cpp
index a02fc7074be..b9eb12258da 100644
--- a/engines/wintermute/base/gfx/xskinmesh.cpp
+++ b/engines/wintermute/base/gfx/xskinmesh.cpp
@@ -33,6 +33,8 @@
#include "engines/wintermute/base/gfx/xskinmesh.h"
#include "engines/wintermute/base/gfx/xmath.h"
+#include "math/vector3d.h"
+
namespace Wintermute {
struct MeshData {
@@ -255,6 +257,55 @@ 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 dfe37d251c7..2c46845545d 100644
--- a/engines/wintermute/base/gfx/xskinmesh.h
+++ b/engines/wintermute/base/gfx/xskinmesh.h
@@ -141,6 +141,7 @@ class DXMesh {
};
static int compareVertexKeys(const void *a, const void *b);
+ bool adjacentEdge(uint32 index1, uint32 index2, uint32 index3, uint32 index4);
public:
~DXMesh() { destroy(); }
@@ -155,6 +156,7 @@ public:
DXBuffer getAtribBuffer() { return _attribBuffer; }
DXAttributeRangeTable *getAttributeTable() { return &_attribTable; }
bool generateAdjacency(uint32 *adjacency);
+ bool generateAdjacency(Common::Array<uint32> &adjacency);
};
bool DXLoadSkinMesh(XFileData *fileData, DXBuffer &adjacencyOut, DXBuffer &materialsOut, uint32 &numMaterialsOut, DXSkinInfo **skinInfoOut, DXMesh **meshOut);
diff --git a/engines/wintermute/base/gfx/xskinmesh_loader.cpp b/engines/wintermute/base/gfx/xskinmesh_loader.cpp
index 3511a2605dc..05a3b22b58c 100644
--- a/engines/wintermute/base/gfx/xskinmesh_loader.cpp
+++ b/engines/wintermute/base/gfx/xskinmesh_loader.cpp
@@ -32,9 +32,6 @@
namespace Wintermute {
-// define constant to make it available to the linker
-const uint32 XSkinMeshLoader::kNullIndex;
-
XSkinMeshLoader::XSkinMeshLoader(XMesh *mesh, XMeshObject *meshObject, DXMesh *dxmesh) {
_mesh = mesh;
_dxmesh = dxmesh;
@@ -116,48 +113,4 @@ void XSkinMeshLoader::loadMesh(const Common::String &filename, XFileData *xobj)
}
}
-//////////////////////////////////////////////////////////////////////////
-bool XSkinMeshLoader::generateAdjacency(Common::Array<uint32> &adjacency) {
- adjacency = Common::Array<uint32>(_indexData.size(), XSkinMeshLoader::kNullIndex);
-
- for (uint32 i = 0; i < _indexData.size() / 3; ++i) {
- for (uint32 j = i + 1; j < _indexData.size() / 3; ++j) {
- for (int edge1 = 0; edge1 < 3; ++edge1) {
- uint16 index1 = _indexData[i * 3 + edge1];
- uint16 index2 = _indexData[i * 3 + (edge1 + 1) % 3];
-
- for (int edge2 = 0; edge2 < 3; ++edge2) {
- uint16 index3 = _indexData[j * 3 + edge2];
- uint16 index4 = _indexData[j * 3 + (edge2 + 1) % 3];
-
- if (adjacency[i * 3 + edge1] == XSkinMeshLoader::kNullIndex && adjacency[j * 3 + edge2] == XSkinMeshLoader::kNullIndex && adjacentEdge(index1, index2, index3, index4)) {
- adjacency[i * 3 + edge1] = j;
- adjacency[j * 3 + edge2] = i;
- break;
- }
- }
- }
- }
- }
-
- return true;
-}
-
-bool XSkinMeshLoader::adjacentEdge(uint16 index1, uint16 index2, uint16 index3, uint16 index4) {
- Math::Vector3d vertex1(_vertexPositionData + 3 * index1);
- Math::Vector3d vertex2(_vertexPositionData + 3 * index2);
- Math::Vector3d vertex3(_vertexPositionData + 3 * index3);
- Math::Vector3d vertex4(_vertexPositionData + 3 * 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;
-}
-
} // namespace Wintermute
diff --git a/engines/wintermute/base/gfx/xskinmesh_loader.h b/engines/wintermute/base/gfx/xskinmesh_loader.h
index 37f30c3f585..adda1965e46 100644
--- a/engines/wintermute/base/gfx/xskinmesh_loader.h
+++ b/engines/wintermute/base/gfx/xskinmesh_loader.h
@@ -62,12 +62,6 @@ protected:
static const int kPositionOffset = 5;
static const int kTextureCoordOffset = 0;
static const int kNormalOffset = 2;
-
- // anything which does not fit into 16 bits would we fine
- static const uint32 kNullIndex = 0xFFFFFFFF;
-
- bool generateAdjacency(Common::Array<uint32> &adjacency);
- bool adjacentEdge(uint16 index1, uint16 index2, uint16 index3, uint16 index4);
protected:
More information about the Scummvm-git-logs
mailing list