[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