[Scummvm-git-logs] scummvm master -> 130f9b79b24cf40c2d041be837f3ed1faaf1caaf

aquadran noreply at scummvm.org
Tue Oct 22 05:50:05 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:
130f9b79b2 WINTERMUTE: Synced shadow volume with original code


Commit: 130f9b79b24cf40c2d041be837f3ed1faaf1caaf
    https://github.com/scummvm/scummvm/commit/130f9b79b24cf40c2d041be837f3ed1faaf1caaf
Author: Paweł Kołodziejski (aquadran at gmail.com)
Date: 2024-10-22T07:50:00+02:00

Commit Message:
WINTERMUTE: Synced shadow volume with original code

Changed paths:
    engines/wintermute/base/gfx/3dshadow_volume.cpp
    engines/wintermute/base/gfx/xmesh.cpp


diff --git a/engines/wintermute/base/gfx/3dshadow_volume.cpp b/engines/wintermute/base/gfx/3dshadow_volume.cpp
index eb7a1591c75..30e50916585 100644
--- a/engines/wintermute/base/gfx/3dshadow_volume.cpp
+++ b/engines/wintermute/base/gfx/3dshadow_volume.cpp
@@ -28,6 +28,7 @@
 #include "engines/wintermute/base/base_game.h"
 #include "engines/wintermute/base/gfx/opengl/base_render_opengl3d.h"
 #include "engines/wintermute/base/gfx/3dshadow_volume.h"
+#include "engines/wintermute/base/gfx/xskinmesh.h"
 #include "engines/wintermute/dcgf.h"
 #include "graphics/opengl/system_headers.h"
 
@@ -49,7 +50,112 @@ bool ShadowVolume::reset() {
 
 //////////////////////////////////////////////////////////////////////////^M
 bool ShadowVolume::addMesh(DXMesh *mesh, uint32 *adjacency, DXMatrix *modelMat, DXVector3 *light, float extrusionDepth) {
-	// TODO
+
+	if (!mesh || !adjacency)
+		return false;
+
+	DXVector3 invLight = *light;
+	DXMatrix matInverseModel = *modelMat;
+	DXMatrixInverse(&matInverseModel, nullptr, &matInverseModel);
+	DXVec3TransformNormal(&invLight, light, &matInverseModel);
+
+	float *points = (float *)mesh->getVertexBuffer().ptr();
+	if (points == nullptr) {
+		return false;
+	}
+
+	uint32 *indices = (uint32 *)mesh->getIndexBuffer().ptr();
+	if (indices == nullptr) {
+		return false;
+	}
+
+	uint32 numFaces = mesh->getNumFaces();
+
+	// Allocate a temporary edge list
+	uint32 *edges = new uint32[numFaces * 6];
+	if (edges == nullptr) {
+		return false;
+	}
+
+	uint32 numEdges = 0;
+	uint32 fvfSize = DXGetFVFVertexSize(mesh->getFVF()) / sizeof(float);
+
+	bool *isFront = new bool[numFaces];
+
+	// First pass : for each face, record if it is front or back facing the light
+	for (uint32 i = 0; i < numFaces; i++) {
+		uint32 index0 = indices[3 * i + 0];
+		uint32 index1 = indices[3 * i + 1];
+		uint32 index2 = indices[3 * i + 2];
+
+		DXVector3 v0(points + index0 * fvfSize);
+		DXVector3 v1(points + index1 * fvfSize);
+		DXVector3 v2(points + index2 * fvfSize);
+
+		// Transform vertices or transform light?
+		DXVector3 vNormal, vec1, vec2;
+		vec1 = v2 - v1;
+		vec2 = v1 - v0;
+		DXVec3Cross(&vNormal, &vec1, &vec2);
+
+		if (DXVec3Dot(&vNormal, &invLight) >= 0.0f) {
+			isFront[i] = false; // back face
+		} else {
+			isFront[i] = true; // front face
+		}
+	}
+
+	// First pass : for each face, record if it is front or back facing the light
+	for (uint32 i = 0; i < numFaces; i++) {
+		if (isFront[i]) {
+			uint32 wFace0 = indices[3 * i + 0];
+			uint32 wFace1 = indices[3 * i + 1];
+			uint32 wFace2 = indices[3 * i + 2];
+
+			uint32 adjacent0 = adjacency[3 * i + 0];
+			uint32 adjacent1 = adjacency[3 * i + 1];
+			uint32 adjacent2 = adjacency[3 * i + 2];
+
+			if (adjacent0 == 0xFFFFFFFF || isFront[adjacent0] == false) {
+				// add edge v0-v1
+				edges[2 * numEdges + 0] = wFace0;
+				edges[2 * numEdges + 1] = wFace1;
+				numEdges++;
+			}
+			if (adjacent1 == 0xFFFFFFFF || isFront[adjacent1] == false) {
+				// add edge v1-v2
+				edges[2 * numEdges + 0] = wFace1;
+				edges[2 * numEdges + 1] = wFace2;
+				numEdges++;
+			}
+			if (adjacent2 == 0xFFFFFFFF || isFront[adjacent2] == false) {
+				// add edge v2-v0
+				edges[2 * numEdges + 0] = wFace2;
+				edges[2 * numEdges + 1] = wFace0;
+				numEdges++;
+			}
+		}
+	}
+
+	for (uint32 i = 0; i < numEdges; i++) {
+		DXVector3 v1(points + edges[2 * i + 0] * fvfSize);
+		DXVector3 v2(points + edges[2 * i + 1] * fvfSize);
+		DXVector3 v3 = v1 - invLight * extrusionDepth;
+		DXVector3 v4 = v2 - invLight * extrusionDepth;
+
+		// Add a quad (two triangles) to the vertex list
+		addVertex(v1);
+		addVertex(v2);
+		addVertex(v3);
+
+		addVertex(v2);
+		addVertex(v4);
+		addVertex(v3);
+	}
+
+	// Delete the temporary edge list
+	delete[] edges;
+	delete[] isFront;
 
 	return true;
 }
diff --git a/engines/wintermute/base/gfx/xmesh.cpp b/engines/wintermute/base/gfx/xmesh.cpp
index 565122bfb87..0b53f681d0a 100644
--- a/engines/wintermute/base/gfx/xmesh.cpp
+++ b/engines/wintermute/base/gfx/xmesh.cpp
@@ -294,97 +294,7 @@ bool XMesh::updateShadowVol(ShadowVolume *shadow, DXMatrix *modelMat, DXVector3
 	if (!_blendedMesh)
 		return false;
 
-	float *vertexData = (float *)_blendedMesh->getVertexBuffer().ptr();
-	if (vertexData == nullptr) {
-		return false;
-	}
-	uint32 vertexSize = DXGetFVFVertexSize(_blendedMesh->getFVF()) / sizeof(float);
-
-	DXVector3 invLight = *light;
-	DXMatrix matInverseModel = *modelMat;
-	DXMatrixInverse(&matInverseModel, nullptr, &matInverseModel);
-	DXVec3TransformNormal(&invLight, light, &matInverseModel);
-
-	uint32 numEdges = 0;
-
-	uint32 *indexData = (uint32 *)_blendedMesh->getIndexBuffer().ptr();
-	uint32 indexDataSize = _blendedMesh->getIndexBuffer().size() / sizeof(uint32);
-	Common::Array<bool> isFront(indexDataSize / 3, false);
-
-	// First pass : for each face, record if it is front or back facing the light
-	for (uint32 i = 0; i < indexDataSize / 3; i++) {
-		uint16 index0 = indexData[3 * i + 0];
-		uint16 index1 = indexData[3 * i + 1];
-		uint16 index2 = indexData[3 * i + 2];
-
-		DXVector3 v0(vertexData + index0 * vertexSize);
-		DXVector3 v1(vertexData + index1 * vertexSize);
-		DXVector3 v2(vertexData + index2 * vertexSize);
-
-		// Transform vertices or transform light?
-		DXVector3 vNormal, vec1, vec2;
-		vec1 = v2 - v1;
-		vec2 = v1 - v0;
-		DXVec3Cross(&vNormal, &vec1, &vec2);
-
-		if (DXVec3Dot(&vNormal, &invLight) >= 0.0f) {
-			isFront[i] = false; // back face
-		} else {
-			isFront[i] = true; // front face
-		}
-	}
-
-	// Allocate a temporary edge list
-	Common::Array<uint32> edges(indexDataSize * 2, 0);
-
-	// First pass : for each face, record if it is front or back facing the light
-	for (uint32 i = 0; i < indexDataSize / 3; i++) {
-		if (isFront[i]) {
-			uint32 wFace0 = indexData[3 * i + 0];
-			uint32 wFace1 = indexData[3 * i + 1];
-			uint32 wFace2 = indexData[3 * i + 2];
-
-			uint32 adjacent0 = _adjacency[3 * i + 0];
-			uint32 adjacent1 = _adjacency[3 * i + 1];
-			uint32 adjacent2 = _adjacency[3 * i + 2];
-
-			if (adjacent0 == 0xFFFFFFFF || isFront[adjacent0] == false) {
-				//	add edge v0-v1
-				edges[2 * numEdges + 0] = wFace0;
-				edges[2 * numEdges + 1] = wFace1;
-				numEdges++;
-			}
-			if (adjacent1 == 0xFFFFFFFF || isFront[adjacent1] == false) {
-				//	add edge v1-v2
-				edges[2 * numEdges + 0] = wFace1;
-				edges[2 * numEdges + 1] = wFace2;
-				numEdges++;
-			}
-			if (adjacent2 == 0xFFFFFFFF || isFront[adjacent2] == false) {
-				//	add edge v2-v0
-				edges[2 * numEdges + 0] = wFace2;
-				edges[2 * numEdges + 1] = wFace0;
-				numEdges++;
-			}
-		}
-	}
-
-	for (uint32 i = 0; i < numEdges; i++) {
-		DXVector3 v1(vertexData + edges[2 * i + 0] * vertexSize);
-		DXVector3 v2(vertexData + edges[2 * i + 1] * vertexSize);
-		DXVector3 v3 = v1 - invLight * extrusionDepth;
-		DXVector3 v4 = v2 - invLight * extrusionDepth;
-
-		// Add a quad (two triangles) to the vertex list
-		shadow->addVertex(v1);
-		shadow->addVertex(v2);
-		shadow->addVertex(v3);
-		shadow->addVertex(v2);
-		shadow->addVertex(v4);
-		shadow->addVertex(v3);
-	}
-
-	return true;
+	return shadow->addMesh(_blendedMesh, _adjacency, modelMat, light, extrusionDepth);
 }
 
 //////////////////////////////////////////////////////////////////////////




More information about the Scummvm-git-logs mailing list