[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