[Scummvm-git-logs] scummvm master -> da5658690a02020a101e69a09e544a167953926b
aquadran
noreply at scummvm.org
Sat Oct 12 16:56:28 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:
da5658690a WINTERMUTE: Removed _vertexData
Commit: da5658690a02020a101e69a09e544a167953926b
https://github.com/scummvm/scummvm/commit/da5658690a02020a101e69a09e544a167953926b
Author: PaweÅ KoÅodziejski (aquadran at gmail.com)
Date: 2024-10-12T18:56:23+02:00
Commit Message:
WINTERMUTE: Removed _vertexData
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/xskinmesh_loader.cpp
engines/wintermute/base/gfx/xskinmesh_loader.h
diff --git a/engines/wintermute/base/gfx/opengl/meshx_opengl.cpp b/engines/wintermute/base/gfx/opengl/meshx_opengl.cpp
index cefa8d383a2..de3018c16d8 100644
--- a/engines/wintermute/base/gfx/opengl/meshx_opengl.cpp
+++ b/engines/wintermute/base/gfx/opengl/meshx_opengl.cpp
@@ -51,11 +51,24 @@ bool XMeshOpenGL::render(XModel *model) {
if (!_blendedMesh)
return false;
- float *vertexData = _blendedMesh->_meshLoader->_vertexData;
- uint32 *indexData = (uint32 *)_blendedMesh->getIndexBuffer().ptr();
+ auto fvf = _blendedMesh->getFVF();
+ uint32 vertexSize = DXGetFVFVertexSize(fvf) / sizeof(float);
+ float *vertexData = (float *)_blendedMesh->getVertexBuffer().ptr();
if (vertexData == nullptr) {
return false;
}
+ uint32 offset = 0, normalOffset = 0, textureOffset = 0;
+ if (fvf & DXFVF_XYZ) {
+ offset += sizeof(DXVector3) / sizeof(float);
+ }
+ if (fvf & DXFVF_NORMAL) {
+ normalOffset = offset;
+ offset += sizeof(DXVector3) / sizeof(float);
+ }
+ if (fvf & DXFVF_TEX1) {
+ textureOffset = offset;
+ }
+ uint32 *indexData = (uint32 *)_blendedMesh->getIndexBuffer().ptr();
bool noAttrs = false;
auto attrsTable = _blendedMesh->getAttributeTable();
@@ -99,10 +112,10 @@ bool XMeshOpenGL::render(XModel *model) {
if (textureEnable)
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
- glVertexPointer(3, GL_FLOAT, XSkinMeshLoader::kVertexComponentCount * sizeof(float), vertexData + XSkinMeshLoader::kPositionOffset);
- glNormalPointer(GL_FLOAT, XSkinMeshLoader::kVertexComponentCount * sizeof(float), vertexData + XSkinMeshLoader::kNormalOffset);
+ glVertexPointer(3, GL_FLOAT, vertexSize * sizeof(float), vertexData);
+ glNormalPointer(GL_FLOAT, vertexSize * sizeof(float), vertexData + normalOffset);
if (textureEnable)
- glTexCoordPointer(2, GL_FLOAT, XSkinMeshLoader::kVertexComponentCount * sizeof(float), vertexData + XSkinMeshLoader::kTextureCoordOffset);
+ glTexCoordPointer(2, GL_FLOAT, vertexSize * sizeof(float), vertexData + textureOffset);
glDrawElements(GL_TRIANGLES, attrsTable->_ptr[i]._faceCount * 3, GL_UNSIGNED_INT, indexData + attrsTable->_ptr[i]._faceStart * 3);
diff --git a/engines/wintermute/base/gfx/opengl/meshx_opengl_shader.cpp b/engines/wintermute/base/gfx/opengl/meshx_opengl_shader.cpp
index 0f8a8d94b33..af860b47cf2 100644
--- a/engines/wintermute/base/gfx/opengl/meshx_opengl_shader.cpp
+++ b/engines/wintermute/base/gfx/opengl/meshx_opengl_shader.cpp
@@ -55,11 +55,12 @@ bool XMeshOpenGLShader::loadFromXData(const Common::String &filename, XFileData
if (XMesh::loadFromXData(filename, xobj)) {
uint32 *indexData = (uint32 *)_blendedMesh->getIndexBuffer().ptr();
uint32 indexDataSize = _blendedMesh->getIndexBuffer().size() / sizeof(uint32);
- float *vertexData = _blendedMesh->_meshLoader->_vertexData;
- uint32 vertexCount = _blendedMesh->_meshLoader->_vertexCount;
+ float *vertexData = (float *)_blendedMesh->getVertexBuffer().ptr();
+ uint32 vertexSize = DXGetFVFVertexSize(_blendedMesh->getFVF()) / sizeof(float);
+ uint32 vertexCount = _blendedMesh->getNumVertices();
glBindBuffer(GL_ARRAY_BUFFER, _vertexBuffer);
- glBufferData(GL_ARRAY_BUFFER, 4 * XSkinMeshLoader::kVertexComponentCount * vertexCount, vertexData, GL_DYNAMIC_DRAW);
+ glBufferData(GL_ARRAY_BUFFER, 4 * vertexSize * vertexCount, vertexData, GL_DYNAMIC_DRAW);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, _indexBuffer);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, 4 * indexDataSize, indexData, GL_STATIC_DRAW);
@@ -75,10 +76,23 @@ bool XMeshOpenGLShader::render(XModel *model) {
if (!_blendedMesh)
return false;
- float *vertexData = _blendedMesh->_meshLoader->_vertexData;
+ auto fvf = _blendedMesh->getFVF();
+ uint32 vertexSize = DXGetFVFVertexSize(fvf) / sizeof(float);
+ float *vertexData = (float *)_blendedMesh->getVertexBuffer().ptr();
if (vertexData == nullptr) {
return false;
}
+ uint32 offset = 0, normalOffset = 0, textureOffset = 0;
+ if (fvf & DXFVF_XYZ) {
+ offset += sizeof(DXVector3) / sizeof(float);
+ }
+ if (fvf & DXFVF_NORMAL) {
+ normalOffset = offset;
+ offset += sizeof(DXVector3) / sizeof(float);
+ }
+ if (fvf & DXFVF_TEX1) {
+ textureOffset = offset;
+ }
bool noAttrs = false;
auto attrsTable = _blendedMesh->getAttributeTable();
@@ -101,9 +115,9 @@ bool XMeshOpenGLShader::render(XModel *model) {
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, _indexBuffer);
- _shader->enableVertexAttribute("position", _vertexBuffer, 3, GL_FLOAT, false, 4 * XSkinMeshLoader::kVertexComponentCount, 4 * XSkinMeshLoader::kPositionOffset);
- _shader->enableVertexAttribute("texcoord", _vertexBuffer, 2, GL_FLOAT, false, 4 * XSkinMeshLoader::kVertexComponentCount, 4 * XSkinMeshLoader::kTextureCoordOffset);
- _shader->enableVertexAttribute("normal", _vertexBuffer, 3, GL_FLOAT, false, 4 * XSkinMeshLoader::kVertexComponentCount, 4 * XSkinMeshLoader::kNormalOffset);
+ _shader->enableVertexAttribute("position", _vertexBuffer, 3, GL_FLOAT, false, 4 * vertexSize, 0);
+ _shader->enableVertexAttribute("texcoord", _vertexBuffer, 2, GL_FLOAT, false, 4 * vertexSize, 4 * textureOffset);
+ _shader->enableVertexAttribute("normal", _vertexBuffer, 3, GL_FLOAT, false, 4 * vertexSize, 4 * normalOffset);
_shader->use(true);
@@ -123,8 +137,8 @@ bool XMeshOpenGLShader::render(XModel *model) {
_shader->setUniform("diffuse", diffuse);
_shader->setUniform("ambient", diffuse);
- size_t offset = 4 * attrsTable->_ptr[i]._faceStart * 3;
- glDrawElements(GL_TRIANGLES, attrsTable->_ptr[i]._faceCount * 3, GL_UNSIGNED_INT, (void *)offset);
+ size_t offsetFace = 4 * attrsTable->_ptr[i]._faceStart * 3;
+ glDrawElements(GL_TRIANGLES, attrsTable->_ptr[i]._faceCount * 3, GL_UNSIGNED_INT, (void *)offsetFace);
}
glBindTexture(GL_TEXTURE_2D, 0);
@@ -141,14 +155,15 @@ bool XMeshOpenGLShader::render(XModel *model) {
}
bool XMeshOpenGLShader::renderFlatShadowModel() {
- float *vertexData = _blendedMesh->_meshLoader->_vertexData;
+ float *vertexData = (float *)_blendedMesh->getVertexBuffer().ptr();
+ uint32 vertexSize = DXGetFVFVertexSize(_blendedMesh->getFVF()) / sizeof(float);
if (vertexData == nullptr) {
return false;
}
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, _indexBuffer);
- _flatShadowShader->enableVertexAttribute("position", _vertexBuffer, 3, GL_FLOAT, false, 4 * XSkinMeshLoader::kVertexComponentCount, 4 * XSkinMeshLoader::kPositionOffset);
+ _flatShadowShader->enableVertexAttribute("position", _vertexBuffer, 3, GL_FLOAT, false, 4 * vertexSize, 4);
_flatShadowShader->use(true);
glDrawElements(GL_TRIANGLES, _blendedMesh->getNumFaces() * 3, GL_UNSIGNED_SHORT, 0);
@@ -162,11 +177,12 @@ bool XMeshOpenGLShader::renderFlatShadowModel() {
bool XMeshOpenGLShader::update(FrameNode *parentFrame) {
XMesh::update(parentFrame);
- float *vertexData = _blendedMesh->_meshLoader->_vertexData;
- uint32 vertexCount = _blendedMesh->_meshLoader->_vertexCount;
+ float *vertexData = (float *)_blendedMesh->getVertexBuffer().ptr();
+ uint32 vertexSize = DXGetFVFVertexSize(_blendedMesh->getFVF()) / sizeof(float);
+ uint32 vertexCount = _blendedMesh->getNumVertices();
glBindBuffer(GL_ARRAY_BUFFER, _vertexBuffer);
- glBufferSubData(GL_ARRAY_BUFFER, 0, 4 * XSkinMeshLoader::kVertexComponentCount * vertexCount, vertexData);
+ glBufferSubData(GL_ARRAY_BUFFER, 0, 4 * vertexSize * vertexCount, vertexData);
return true;
}
diff --git a/engines/wintermute/base/gfx/xmesh.cpp b/engines/wintermute/base/gfx/xmesh.cpp
index 5622f98cd1d..d9464b9e3bd 100644
--- a/engines/wintermute/base/gfx/xmesh.cpp
+++ b/engines/wintermute/base/gfx/xmesh.cpp
@@ -255,28 +255,26 @@ bool XMesh::update(FrameNode *parentFrame) {
if (!_blendedMesh)
return false;
- float *vertexDstData = _blendedMesh->_meshLoader->_vertexData;
+ float *vertexDstData = (float *)_blendedMesh->getVertexBuffer().ptr();
if (vertexDstData == nullptr) {
return false;
}
+ auto fvf = _blendedMesh->getFVF();
+ uint32 vertexSize = DXGetFVFVertexSize(fvf) / sizeof(float);
+ uint32 offset = 0, normalOffset = 0;
+ if (fvf & DXFVF_XYZ) {
+ offset += sizeof(DXVector3) / sizeof(float);
+ }
+ if (fvf & DXFVF_NORMAL) {
+ normalOffset = offset;
+ }
- uint32 vertexCount = _blendedMesh->_meshLoader->_vertexCount;
+ uint32 vertexCount = _blendedMesh->getNumVertices();
auto skinWeightsList = _blendedMesh->_meshLoader->_skinWeightsList;
// update skinned mesh
if (_skinMesh) {
float *vertexSrcData = (float *)_skinMesh->_mesh->getVertexBuffer().ptr();
- auto fvf = _skinMesh->_mesh->getFVF();
- uint32 vertexSize = DXGetFVFVertexSize(fvf) / sizeof(float);
- uint32 offset = 0, normalOffset = 0;
-
- if (fvf & DXFVF_XYZ) {
- offset += sizeof(DXVector3) / sizeof(float);
- }
- if (fvf & DXFVF_NORMAL) {
- normalOffset = offset;
- }
-
BaseArray<Math::Matrix4> finalBoneMatrices;
finalBoneMatrices.resize(_boneMatrices.size());
@@ -290,7 +288,7 @@ bool XMesh::update(FrameNode *parentFrame) {
// to be able too add the weighted summands together, we reset everything to zero first
for (uint32 i = 0; i < vertexCount; ++i) {
for (int j = 0; j < 3; ++j) {
- vertexDstData[i * XSkinMeshLoader::kVertexComponentCount + XSkinMeshLoader::kPositionOffset + j] = 0.0f;
+ vertexDstData[i * vertexSize + j] = 0.0f;
}
}
@@ -307,7 +305,7 @@ bool XMesh::update(FrameNode *parentFrame) {
pos *= skinWeightsList[boneIndex]._vertexWeights[i];
for (uint j = 0; j < 3; ++j) {
- vertexDstData[vertexIndex * XSkinMeshLoader::kVertexComponentCount + XSkinMeshLoader::kPositionOffset + j] += pos.getData()[j];
+ vertexDstData[vertexIndex * vertexSize + j] += pos.getData()[j];
}
}
}
@@ -321,7 +319,7 @@ bool XMesh::update(FrameNode *parentFrame) {
// reset so we can form the weighted sums
for (uint32 i = 0; i < vertexCount; ++i) {
for (int j = 0; j < 3; ++j) {
- vertexDstData[i * XSkinMeshLoader::kVertexComponentCount + XSkinMeshLoader::kNormalOffset + j] = 0.0f;
+ vertexDstData[i * vertexSize + normalOffset + j] = 0.0f;
}
}
@@ -334,21 +332,20 @@ bool XMesh::update(FrameNode *parentFrame) {
pos *= skinWeightsList[boneIndex]._vertexWeights[i];
for (uint j = 0; j < 3; ++j) {
- vertexDstData[vertexIndex * XSkinMeshLoader::kVertexComponentCount + XSkinMeshLoader::kNormalOffset + j] += pos.getData()[j];
+ vertexDstData[vertexIndex * vertexSize + normalOffset + j] += pos.getData()[j];
}
}
}
- //updateNormals();
+ //updateNormals();
} else { // update static
for (uint32 i = 0; i < vertexCount; ++i) {
float *vertexSrcData = (float *)_staticMesh->getVertexBuffer().ptr();
- uint32 vertexSize = DXGetFVFVertexSize(_staticMesh->getFVF()) / sizeof(float);
Math::Vector3d pos(vertexSrcData + i * vertexSize);
parentFrame->getCombinedMatrix()->transform(&pos, true);
for (uint j = 0; j < 3; ++j) {
- vertexDstData[i * XSkinMeshLoader::kVertexComponentCount + XSkinMeshLoader::kPositionOffset + j] = pos.getData()[j];
+ vertexDstData[i * vertexSize + j] = pos.getData()[j];
}
}
}
@@ -363,10 +360,11 @@ bool XMesh::updateShadowVol(ShadowVolume *shadow, Math::Matrix4 &modelMat, const
if (!_blendedMesh)
return false;
- float *vertexData = _blendedMesh->_meshLoader->_vertexData;
+ float *vertexData = (float *)_blendedMesh->getVertexBuffer().ptr();
if (vertexData == nullptr) {
return false;
}
+ uint32 vertexSize = DXGetFVFVertexSize(_blendedMesh->getFVF()) / sizeof(float);
Math::Vector3d invLight = light;
Math::Matrix4 matInverseModel = modelMat;
@@ -385,9 +383,9 @@ bool XMesh::updateShadowVol(ShadowVolume *shadow, Math::Matrix4 &modelMat, const
uint16 index1 = indexData[3 * i + 1];
uint16 index2 = indexData[3 * i + 2];
- Math::Vector3d v0(vertexData + index0 * XSkinMeshLoader::kVertexComponentCount + XSkinMeshLoader::kPositionOffset);
- Math::Vector3d v1(vertexData + index1 * XSkinMeshLoader::kVertexComponentCount + XSkinMeshLoader::kPositionOffset);
- Math::Vector3d v2(vertexData + index2 * XSkinMeshLoader::kVertexComponentCount + XSkinMeshLoader::kPositionOffset);
+ Math::Vector3d v0(vertexData + index0 * vertexSize);
+ Math::Vector3d v1(vertexData + index1 * vertexSize);
+ Math::Vector3d v2(vertexData + index2 * vertexSize);
// Transform vertices or transform light?
Math::Vector3d vNormal = Math::Vector3d::crossProduct(v2 - v1, v1 - v0);
@@ -435,8 +433,8 @@ bool XMesh::updateShadowVol(ShadowVolume *shadow, Math::Matrix4 &modelMat, const
}
for (uint32 i = 0; i < numEdges; i++) {
- Math::Vector3d v1(vertexData + edges[2 * i + 0] * XSkinMeshLoader::kVertexComponentCount + XSkinMeshLoader::kPositionOffset);
- Math::Vector3d v2(vertexData + edges[2 * i + 1] * XSkinMeshLoader::kVertexComponentCount + XSkinMeshLoader::kPositionOffset);
+ Math::Vector3d v1(vertexData + edges[2 * i + 0] * vertexSize);
+ Math::Vector3d v2(vertexData + edges[2 * i + 1] * vertexSize);
Math::Vector3d v3 = v1 - invLight * extrusionDepth;
Math::Vector3d v4 = v2 - invLight * extrusionDepth;
@@ -457,10 +455,11 @@ bool XMesh::pickPoly(Math::Vector3d *pickRayOrig, Math::Vector3d *pickRayDir) {
if (!_blendedMesh)
return false;
- float *vertexData = _blendedMesh->_meshLoader->_vertexData;
+ float *vertexData = (float *)_blendedMesh->getVertexBuffer().ptr();
if (vertexData == nullptr) {
return false;
}
+ uint32 vertexSize = DXGetFVFVertexSize(_blendedMesh->getFVF()) / sizeof(float);
bool res = false;
@@ -472,11 +471,11 @@ bool XMesh::pickPoly(Math::Vector3d *pickRayOrig, Math::Vector3d *pickRayDir) {
uint32 index3 = indexData[i + 2];
Math::Vector3d v0;
- v0.setData(&vertexData[index1 * XSkinMeshLoader::kVertexComponentCount + XSkinMeshLoader::kPositionOffset]);
+ v0.setData(&vertexData[index1 * vertexSize]);
Math::Vector3d v1;
- v1.setData(&vertexData[index2 * XSkinMeshLoader::kVertexComponentCount + XSkinMeshLoader::kPositionOffset]);
+ v1.setData(&vertexData[index2 * vertexSize]);
Math::Vector3d v2;
- v2.setData(&vertexData[index3 * XSkinMeshLoader::kVertexComponentCount + XSkinMeshLoader::kPositionOffset]);
+ v2.setData(&vertexData[index3 * vertexSize]);
if (isnan(v0.x()))
continue;
@@ -539,22 +538,22 @@ bool XMesh::restoreDeviceObjects() {
}
void XMesh::updateBoundingBox() {
- float *vertexData = _blendedMesh->_meshLoader->_vertexData;
+ float *vertexData = (float *)_blendedMesh->getVertexBuffer().ptr();
if (vertexData == nullptr) {
return;
}
-
+ uint32 vertexSize = DXGetFVFVertexSize(_blendedMesh->getFVF()) / sizeof(float);
uint32 vertexCount = _blendedMesh->getNumVertices();
if (vertexCount == 0) {
return;
}
- _BBoxStart.setData(&vertexData[0 + XSkinMeshLoader::kPositionOffset]);
- _BBoxEnd.setData(&vertexData[0 + XSkinMeshLoader::kPositionOffset]);
+ _BBoxStart.setData(&vertexData[0]);
+ _BBoxEnd.setData(&vertexData[0]);
for (uint16 i = 1; i < vertexCount; ++i) {
Math::Vector3d v;
- v.setData(&vertexData[i * XSkinMeshLoader::kVertexComponentCount + XSkinMeshLoader::kPositionOffset]);
+ v.setData(&vertexData[i * vertexSize]);
_BBoxStart.x() = MIN(_BBoxStart.x(), v.x());
_BBoxStart.y() = MIN(_BBoxStart.y(), v.y());
diff --git a/engines/wintermute/base/gfx/xskinmesh_loader.cpp b/engines/wintermute/base/gfx/xskinmesh_loader.cpp
index 0d58fe8e59e..d34d5658d2a 100644
--- a/engines/wintermute/base/gfx/xskinmesh_loader.cpp
+++ b/engines/wintermute/base/gfx/xskinmesh_loader.cpp
@@ -33,56 +33,9 @@
namespace Wintermute {
XSkinMeshLoader::XSkinMeshLoader(DXMesh *dxmesh) {
- _vertexCount = dxmesh->getNumVertices();
- // vertex format for .X meshes will be position + normals + textures
- _vertexData = new float[kVertexComponentCount * _vertexCount]();
-
- auto fvf = dxmesh->getFVF();
- uint32 vertexSize = DXGetFVFVertexSize(fvf) / sizeof(float);
- float *vertexBuffer = (float *)dxmesh->getVertexBuffer().ptr();
- uint32 offset = 0, normalOffset = 0, textureOffset = 0;
-
- if (fvf & DXFVF_XYZ) {
- offset += sizeof(DXVector3) / sizeof(float);
- }
- if (fvf & DXFVF_NORMAL) {
- normalOffset = offset;
- offset += sizeof(DXVector3) / sizeof(float);
- }
- if (fvf & DXFVF_DIFFUSE) {
- offset += sizeof(DXColorValue) / sizeof(float);
- }
- if (fvf & DXFVF_TEX1) {
- textureOffset = offset;
- offset += sizeof(DXVector2) / sizeof(float);
- }
-
- for (uint i = 0; i < _vertexCount; ++i) {
- for (int j = 0; j < 3; ++j) {
- _vertexData[i * kVertexComponentCount + kPositionOffset + j] = vertexBuffer[i * vertexSize + j];
- }
-
- // mirror z coordinate to change to OpenGL coordinate system
- _vertexData[i * kVertexComponentCount + kPositionOffset + 2] *= -1.0f;
-
- if (fvf & DXFVF_NORMAL) {
- for (int j = 0; j < 3; ++j) {
- _vertexData[i * kVertexComponentCount + kNormalOffset + j] = vertexBuffer[i * vertexSize + normalOffset + j];
- }
-
- // mirror z coordinate to change to OpenGL coordinate system
- _vertexData[i * kVertexComponentCount + kNormalOffset + 2] *= -1.0f;
- }
-
- if (fvf & DXFVF_TEX1) {
- _vertexData[i * kVertexComponentCount + kTextureCoordOffset + 0] = vertexBuffer[i * vertexSize + textureOffset + 0];
- _vertexData[i * kVertexComponentCount + kTextureCoordOffset + 1] = vertexBuffer[i * vertexSize + textureOffset + 1];
- }
- }
}
XSkinMeshLoader::~XSkinMeshLoader() {
- delete[] _vertexData;
}
} // namespace Wintermute
diff --git a/engines/wintermute/base/gfx/xskinmesh_loader.h b/engines/wintermute/base/gfx/xskinmesh_loader.h
index b701270faa8..b5ae6009c0e 100644
--- a/engines/wintermute/base/gfx/xskinmesh_loader.h
+++ b/engines/wintermute/base/gfx/xskinmesh_loader.h
@@ -57,15 +57,6 @@ public:
virtual ~XSkinMeshLoader();
protected:
- static const int kVertexComponentCount = 8;
- static const int kPositionOffset = 5;
- static const int kTextureCoordOffset = 0;
- static const int kNormalOffset = 2;
-
-protected:
-
- float *_vertexData;
- uint32 _vertexCount;
BaseArray<Math::Matrix4 *> _boneMatrices;
BaseArray<SkinWeights> _skinWeightsList;
More information about the Scummvm-git-logs
mailing list