[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