[Scummvm-git-logs] scummvm master -> a69af71d50900f883259801be8f6a194d5559b3a
aquadran
noreply at scummvm.org
Sun Oct 13 08:57:17 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:
a69af71d50 WINTERMUTE: Sync missing compute normals for geometry
Commit: a69af71d50900f883259801be8f6a194d5559b3a
https://github.com/scummvm/scummvm/commit/a69af71d50900f883259801be8f6a194d5559b3a
Author: PaweÅ KoÅodziejski (aquadran at gmail.com)
Date: 2024-10-13T10:57:13+02:00
Commit Message:
WINTERMUTE: Sync missing compute normals for geometry
Changed paths:
engines/wintermute/ad/ad_scene_geometry.cpp
engines/wintermute/base/gfx/3dmesh.cpp
engines/wintermute/base/gfx/3dmesh.h
engines/wintermute/base/gfx/3dshadow_volume.cpp
engines/wintermute/base/gfx/3dshadow_volume.h
engines/wintermute/base/gfx/skin_mesh_helper.h
engines/wintermute/base/gfx/xskinmesh.h
diff --git a/engines/wintermute/ad/ad_scene_geometry.cpp b/engines/wintermute/ad/ad_scene_geometry.cpp
index c656c634918..a86808d2956 100644
--- a/engines/wintermute/ad/ad_scene_geometry.cpp
+++ b/engines/wintermute/ad/ad_scene_geometry.cpp
@@ -209,6 +209,7 @@ bool AdSceneGeometry::loadFile(const char *filename) {
AdWalkplane *plane = new AdWalkplane(_gameRef);
plane->setName(meshNames[i].c_str());
plane->_mesh = meshes[i];
+ plane->_mesh->computeNormals();
plane->_mesh->fillVertexBuffer(0xFF0000FF);
plane->_receiveShadows = ExtNode->_receiveShadows;
_planes.add(plane);
@@ -219,6 +220,7 @@ bool AdSceneGeometry::loadFile(const char *filename) {
AdBlock *block = new AdBlock(_gameRef);
block->setName(meshNames[i].c_str());
block->_mesh = meshes[i];
+ block->_mesh->computeNormals();
block->_mesh->fillVertexBuffer(0xFFFF0000);
block->_receiveShadows = ExtNode->_receiveShadows;
_blocks.add(block);
@@ -239,6 +241,7 @@ bool AdSceneGeometry::loadFile(const char *filename) {
AdGeneric *generic = new AdGeneric(_gameRef);
generic->setName(meshNames[i].c_str());
generic->_mesh = meshes[i];
+ generic->_mesh->computeNormals();
generic->_mesh->fillVertexBuffer(0xFF00FF00);
generic->_receiveShadows = ExtNode->_receiveShadows;
_generics.add(generic);
diff --git a/engines/wintermute/base/gfx/3dmesh.cpp b/engines/wintermute/base/gfx/3dmesh.cpp
index 16478ac7026..d4154f4a375 100644
--- a/engines/wintermute/base/gfx/3dmesh.cpp
+++ b/engines/wintermute/base/gfx/3dmesh.cpp
@@ -34,7 +34,7 @@ Mesh3DS::~Mesh3DS() {
delete[] _indexData;
}
-bool Wintermute::Mesh3DS::loadFrom3DS(Common::MemoryReadStream &fileStream) {
+bool Mesh3DS::loadFrom3DS(Common::MemoryReadStream &fileStream) {
uint32 wholeChunkSize = fileStream.readUint32LE();
int32 end = fileStream.pos() + wholeChunkSize - 6;
@@ -82,6 +82,48 @@ bool Wintermute::Mesh3DS::loadFrom3DS(Common::MemoryReadStream &fileStream) {
return true;
}
+void Mesh3DS::computeNormals() {
+ DXVector3 *normals = new DXVector3[_vertexCount];
+ for (int i = 0; i < _vertexCount; ++i) {
+ normals[i]._x = 0.0f;
+ normals[i]._y = 0.0f;
+ normals[i]._z = 0.0f;
+ }
+
+ for (int i = 0; i < faceCount(); ++i) {
+ uint16 a = _indexData[3 * i + 0];
+ uint16 b = _indexData[3 * i + 1];
+ uint16 c = _indexData[3 * i + 2];
+
+ DXVector3 v1(getVertexPosition(a));
+ DXVector3 v2(getVertexPosition(b));
+ DXVector3 v3(getVertexPosition(c));
+
+ DXVector3 edge1 = v2 - v1;
+ DXVector3 edge2 = v3 - v2;
+ DXVector3 normal;
+ DXVec3Cross(&normal, &edge1, &edge2);
+ DXVec3Normalize(&normal, &normal);
+
+ normals[a] += normal;
+ normals[b] += normal;
+ normals[c] += normal;
+ }
+
+ // Assign the newly computed normals back to the vertices
+ for (int i = 0; i < faceCount(); ++i) {
+ for (int j = 0; j < 3; j++) {
+ DXVector3 normal;
+ DXVec3Normalize(&normal, &normals[_indexData[3 * i + j]]);
+ _vertexData[_indexData[3 * i + j]].nx = normal._x;
+ _vertexData[_indexData[3 * i + j]].ny = normal._y;
+ _vertexData[_indexData[3 * i + j]].nz = normal._z;
+ }
+ }
+
+ delete[] normals;
+}
+
void Mesh3DS::dumpVertexCoordinates(const char *filename) {
Common::DumpFile dump;
dump.open(filename);
diff --git a/engines/wintermute/base/gfx/3dmesh.h b/engines/wintermute/base/gfx/3dmesh.h
index 5f07daf92d1..0a7c7dbcc73 100644
--- a/engines/wintermute/base/gfx/3dmesh.h
+++ b/engines/wintermute/base/gfx/3dmesh.h
@@ -26,18 +26,24 @@
#include "math/vector4d.h"
+#include "engines/wintermute/base/gfx/xmath.h"
+
namespace Wintermute {
struct GeometryVertex {
float x;
float y;
float z;
+ float nx;
+ float ny;
+ float nz;
};
class Mesh3DS {
public:
Mesh3DS();
virtual ~Mesh3DS();
+ void computeNormals();
virtual void fillVertexBuffer(uint32 color) = 0;
virtual bool loadFrom3DS(Common::MemoryReadStream &fileStream);
virtual void render() = 0;
diff --git a/engines/wintermute/base/gfx/3dshadow_volume.cpp b/engines/wintermute/base/gfx/3dshadow_volume.cpp
index 4dd252ee066..cd183a184e1 100644
--- a/engines/wintermute/base/gfx/3dshadow_volume.cpp
+++ b/engines/wintermute/base/gfx/3dshadow_volume.cpp
@@ -47,6 +47,12 @@ bool ShadowVolume::reset() {
return true;
}
+//////////////////////////////////////////////////////////////////////////^M
+bool ShadowVolume::addMesh(Math::Vector3d *mesh, uint32 *adjacency, Math::Matrix4 *modelMat, Math::Vector3d *light, float extrusionDepth) {
+ // TODO
+
+ return true;
+}
//////////////////////////////////////////////////////////////////////////
void ShadowVolume::addVertex(const Math::Vector3d &vertex) {
_vertices.add(vertex);
diff --git a/engines/wintermute/base/gfx/3dshadow_volume.h b/engines/wintermute/base/gfx/3dshadow_volume.h
index 019d3333eef..dc7f7a09906 100644
--- a/engines/wintermute/base/gfx/3dshadow_volume.h
+++ b/engines/wintermute/base/gfx/3dshadow_volume.h
@@ -50,6 +50,7 @@ public:
ShadowVolume(BaseGame *inGame);
virtual ~ShadowVolume();
+ bool addMesh(Math::Vector3d *mesh, uint32 *adjacency, Math::Matrix4 *modelMat, Math::Vector3d *light, float extrusionDepth);
void addVertex(const Math::Vector3d &vertex);
bool reset();
diff --git a/engines/wintermute/base/gfx/skin_mesh_helper.h b/engines/wintermute/base/gfx/skin_mesh_helper.h
index 9df8c56605d..40007794157 100644
--- a/engines/wintermute/base/gfx/skin_mesh_helper.h
+++ b/engines/wintermute/base/gfx/skin_mesh_helper.h
@@ -36,7 +36,6 @@
namespace Wintermute {
-class XSkinMeshLoader;
class XMesh;
class XMeshOpenGL;
class XMeshOpenGLShader;
diff --git a/engines/wintermute/base/gfx/xskinmesh.h b/engines/wintermute/base/gfx/xskinmesh.h
index 8d7407bb859..c9d85c7aa13 100644
--- a/engines/wintermute/base/gfx/xskinmesh.h
+++ b/engines/wintermute/base/gfx/xskinmesh.h
@@ -105,8 +105,6 @@ struct DXBone {
#pragma pack()
#endif
-class XSkinMeshLoader;
-
class DXSkinInfo {
uint32 _fvf;
uint32 _numVertices{};
More information about the Scummvm-git-logs
mailing list