[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