[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