From 3834d30ab6e1cbc717760419582cad8642590232 Mon Sep 17 00:00:00 2001 From: githubawn <115191165+githubawn@users.noreply.github.com> Date: Thu, 2 Apr 2026 23:03:46 +0200 Subject: [PATCH 1/3] Fix W3DTreeBuffer crash due to stale vertex buffer indices --- .../Source/W3DDevice/GameClient/W3DTreeBuffer.cpp | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/Core/GameEngineDevice/Source/W3DDevice/GameClient/W3DTreeBuffer.cpp b/Core/GameEngineDevice/Source/W3DDevice/GameClient/W3DTreeBuffer.cpp index 7f951c7f908..532761f4d90 100644 --- a/Core/GameEngineDevice/Source/W3DDevice/GameClient/W3DTreeBuffer.cpp +++ b/Core/GameEngineDevice/Source/W3DDevice/GameClient/W3DTreeBuffer.cpp @@ -709,6 +709,10 @@ void W3DTreeBuffer::loadTreesInVertexAndIndexBuffers(RefRenderObjListIterator *p Int curTree=0; Int bNdx; const GlobalData::TerrainLighting *objectLighting = TheGlobalData->m_terrainObjectsLighting[TheGlobalData->m_timeOfDay]; + // TheSuperHackers @info Reset bufferNdx so updateVertexBuffer skips trees absent from this rebuild. + for (Int t = 0; t < m_numTrees; t++) { + m_trees[t].bufferNdx = -1; + } for (bNdx=0; bNdx Date: Thu, 2 Apr 2026 23:14:24 +0200 Subject: [PATCH 2/3] implemented technically correct suggestion from greptile replaced break with continue --- .../Source/W3DDevice/GameClient/W3DTreeBuffer.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Core/GameEngineDevice/Source/W3DDevice/GameClient/W3DTreeBuffer.cpp b/Core/GameEngineDevice/Source/W3DDevice/GameClient/W3DTreeBuffer.cpp index 532761f4d90..fbece6026f8 100644 --- a/Core/GameEngineDevice/Source/W3DDevice/GameClient/W3DTreeBuffer.cpp +++ b/Core/GameEngineDevice/Source/W3DDevice/GameClient/W3DTreeBuffer.cpp @@ -997,7 +997,7 @@ void W3DTreeBuffer::updateVertexBuffer() vb=(VertexFormatXYZNDUV1*)lockVtxBuffer.Get_Vertex_Array(); // TheSuperHackers @info Guard against a failed vertex buffer lock returning null. if (!vb) { - break; + continue; } VertexFormatXYZNDUV1 *curVb; From f91ae50645c80acb21a566f8ec6d6e71a036e35f Mon Sep 17 00:00:00 2001 From: githubawn <115191165+githubawn@users.noreply.github.com> Date: Sun, 5 Apr 2026 03:46:28 +0200 Subject: [PATCH 3/3] implemented review feedback --- .../W3DDevice/GameClient/W3DTreeBuffer.cpp | 24 ++++++------------- 1 file changed, 7 insertions(+), 17 deletions(-) diff --git a/Core/GameEngineDevice/Source/W3DDevice/GameClient/W3DTreeBuffer.cpp b/Core/GameEngineDevice/Source/W3DDevice/GameClient/W3DTreeBuffer.cpp index fbece6026f8..aa86abc5f2a 100644 --- a/Core/GameEngineDevice/Source/W3DDevice/GameClient/W3DTreeBuffer.cpp +++ b/Core/GameEngineDevice/Source/W3DDevice/GameClient/W3DTreeBuffer.cpp @@ -705,14 +705,14 @@ void W3DTreeBuffer::loadTreesInVertexAndIndexBuffers(RefRenderObjListIterator *p m_shadow = TheW3DProjectedShadowManager->createDecalShadow(&shadowInfo); } + // TheSuperHackers @bugfix Reset bufferNdx so updateVertexBuffer skips trees absent from this rebuild. + for (Int t = 0; t < m_numTrees; t++) { + m_trees[t].bufferNdx = -1; + } m_anythingChanged = false; Int curTree=0; Int bNdx; const GlobalData::TerrainLighting *objectLighting = TheGlobalData->m_terrainObjectsLighting[TheGlobalData->m_timeOfDay]; - // TheSuperHackers @info Reset bufferNdx so updateVertexBuffer skips trees absent from this rebuild. - for (Int t = 0; t < m_numTrees; t++) { - m_trees[t].bufferNdx = -1; - } for (bNdx=0; bNdx=0 && m_treeTypes[type].m_mesh!=nullptr, ("Invalid tree type or mesh.")); Int startVertex = m_trees[curTree].firstIndex; curVb = vb+startVertex;