[Scummvm-git-logs] scummvm master -> eb723eb0e488d7341bfa8454a413a29d825a415d

aquadran noreply at scummvm.org
Thu Oct 3 06:40:40 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:
eb723eb0e4 WINTERMUTE: WME3D: Removed _numAttrs in Mesh


Commit: eb723eb0e488d7341bfa8454a413a29d825a415d
    https://github.com/scummvm/scummvm/commit/eb723eb0e488d7341bfa8454a413a29d825a415d
Author: Paweł Kołodziejski (aquadran at gmail.com)
Date: 2024-10-03T08:40:35+02:00

Commit Message:
WINTERMUTE: WME3D: Removed _numAttrs in Mesh

Changed paths:
    engines/wintermute/base/gfx/opengl/meshx_opengl.cpp
    engines/wintermute/base/gfx/opengl/meshx_opengl_shader.cpp
    engines/wintermute/base/gfx/xmesh.cpp
    engines/wintermute/base/gfx/xmesh.h


diff --git a/engines/wintermute/base/gfx/opengl/meshx_opengl.cpp b/engines/wintermute/base/gfx/opengl/meshx_opengl.cpp
index fe531eb34e3..f6f82ee18d5 100644
--- a/engines/wintermute/base/gfx/opengl/meshx_opengl.cpp
+++ b/engines/wintermute/base/gfx/opengl/meshx_opengl.cpp
@@ -56,8 +56,27 @@ bool XMeshOpenGL::render(XModel *model) {
 		return false;
 	}
 
-	for (uint32 i = 0; i < _numAttrs; i++) {
-		int materialIndex = materialIndices[i];
+	bool noAttrs = false;
+	auto attrsTable = _skinMesh->_mesh->_dxmesh->getAttributeTable();
+	uint32 numAttrs = attrsTable->_size;
+	DXAttributeRange *attrs;
+	if (numAttrs == 0) {
+		noAttrs = true;
+		numAttrs = 1;
+		attrs = new DXAttributeRange[numAttrs];
+	} else {
+		attrs = attrsTable->_ptr;
+	}
+
+	if (noAttrs) {
+		attrs[0]._attribId = 0;
+		attrs[0]._vertexStart = attrs[0]._faceStart = 0;
+		attrs[0]._vertexCount = _skinMesh->_mesh->_dxmesh->getNumVertices();
+		attrs[0]._faceCount = _skinMesh->_mesh->_dxmesh->getNumFaces();
+	}
+
+	for (uint32 i = 0; i < numAttrs; i++) {
+		int materialIndex = attrs[i]._attribId;
 		glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, _materials[materialIndex]->_material._diffuse._data);
 		glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT, _materials[materialIndex]->_material._diffuse._data);
 		glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, _materials[materialIndex]->_material._specular._data);
@@ -94,6 +113,10 @@ bool XMeshOpenGL::render(XModel *model) {
 	glBindTexture(GL_TEXTURE_2D, 0);
 	glDisable(GL_TEXTURE_2D);
 
+	if (noAttrs) {
+		delete[] attrs;
+	}
+
 	return true;
 }
 
diff --git a/engines/wintermute/base/gfx/opengl/meshx_opengl_shader.cpp b/engines/wintermute/base/gfx/opengl/meshx_opengl_shader.cpp
index c6b67e7a383..2ad27866e52 100644
--- a/engines/wintermute/base/gfx/opengl/meshx_opengl_shader.cpp
+++ b/engines/wintermute/base/gfx/opengl/meshx_opengl_shader.cpp
@@ -78,6 +78,25 @@ bool XMeshOpenGLShader::render(XModel *model) {
 		return false;
 	}
 
+	bool noAttrs = false;
+	auto attrsTable = _skinMesh->_mesh->_dxmesh->getAttributeTable();
+	uint32 numAttrs = attrsTable->_size;
+	DXAttributeRange *attrs;
+	if (numAttrs == 0) {
+		noAttrs = true;
+		numAttrs = 1;
+		attrs = new DXAttributeRange[numAttrs];
+	} else {
+		attrs = attrsTable->_ptr;
+	}
+
+	if (noAttrs) {
+		attrs[0]._attribId = 0;
+		attrs[0]._vertexStart = attrs[0]._faceStart = 0;
+		attrs[0]._vertexCount = _skinMesh->_mesh->_dxmesh->getNumVertices();
+		attrs[0]._faceCount = _skinMesh->_mesh->_dxmesh->getNumFaces();
+	}
+
 	glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, _indexBuffer);
 
 	_shader->enableVertexAttribute("position", _vertexBuffer, 3, GL_FLOAT, false, 4 * XSkinMeshLoader::kVertexComponentCount, 4 * XSkinMeshLoader::kPositionOffset);
@@ -86,8 +105,8 @@ bool XMeshOpenGLShader::render(XModel *model) {
 
 	_shader->use(true);
 
-	for (uint32 i = 0; i < _numAttrs; i++) {
-		int materialIndex = materialIndices[i];
+	for (uint32 i = 0; i < numAttrs; i++) {
+		int materialIndex = attrs[i]._attribId;
 
 		if (_materials[materialIndex]->getSurface()) {
 			glEnable(GL_TEXTURE_2D);
@@ -112,6 +131,10 @@ bool XMeshOpenGLShader::render(XModel *model) {
 	glBindBuffer(GL_ARRAY_BUFFER, 0);
 	glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
 
+	if (noAttrs) {
+		delete[] attrs;
+	}
+
 	return true;
 }
 
diff --git a/engines/wintermute/base/gfx/xmesh.cpp b/engines/wintermute/base/gfx/xmesh.cpp
index 1a174fcac06..5fbb5460989 100644
--- a/engines/wintermute/base/gfx/xmesh.cpp
+++ b/engines/wintermute/base/gfx/xmesh.cpp
@@ -42,8 +42,6 @@
 namespace Wintermute {
 
 XMesh::XMesh(Wintermute::BaseGame *inGame) : BaseNamedObject(inGame) {
-	_numAttrs = 0;
-
 	_skinMesh = nullptr;
 	_skinnedMesh = false;
 
@@ -102,7 +100,6 @@ bool XMesh::loadFromXData(const Common::String &filename, XFileData *xobj) {
 		mat->_material._ambient = mat->_material._diffuse;
 
 		_materials.add(mat);
-		_numAttrs = 1;
 
 		meshLoader->_indexRanges.push_back(0);
 		meshLoader->_indexRanges.push_back(meshLoader->_indexData.size());
@@ -121,9 +118,6 @@ bool XMesh::loadFromXData(const Common::String &filename, XFileData *xobj) {
 		}
 
 		auto atribTable = mesh->getAttributeTable();
-		assert (atribTable);
-		_numAttrs = atribTable->_size;
-
 		for (uint i = 0; i < atribTable->_size; i++) {
 			meshLoader->_materialIndices.push_back(atribTable->_ptr[i]._attribId);
 			meshLoader->_indexRanges.push_back(atribTable->_ptr[i]._faceStart * 3);
diff --git a/engines/wintermute/base/gfx/xmesh.h b/engines/wintermute/base/gfx/xmesh.h
index bf13eaa8847..33d4adf415f 100644
--- a/engines/wintermute/base/gfx/xmesh.h
+++ b/engines/wintermute/base/gfx/xmesh.h
@@ -73,8 +73,6 @@ protected:
 
 	void updateBoundingBox();
 
-	uint32 _numAttrs;
-
 	// Wintermute3D used the ID3DXSKININFO interface
 	// we will only store, whether this mesh is skinned at all
 	// and factor out the necessary computations into some functions




More information about the Scummvm-git-logs mailing list