Skip to content

Commit bd4e909

Browse files
authored
bugfix(heightmap): Revert optimization for m_vertexBufferTiles in HeightMapRenderObjClass because it does not work properly (TheSuperHackers#2135)
1 parent cd2eef3 commit bd4e909

5 files changed

Lines changed: 19 additions & 32 deletions

File tree

Core/GameEngineDevice/Include/W3DDevice/GameClient/HeightMap.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ virtually everything to do with the terrain, including: drawing, lighting,
4949
scorchmarks and intersection tests.
5050
5151
TheSuperHackers @performance xezon 13/01/2026
52-
Class now stores the vertex buffers as one big buffer each for optimal data locality.
52+
Class now stores the vertex buffer backup as one big array for optimal data locality.
5353
*/
5454
class HeightMapRenderObjClass : public BaseHeightMapRenderObjClass
5555
{
@@ -89,7 +89,7 @@ class HeightMapRenderObjClass : public BaseHeightMapRenderObjClass
8989
Int m_numExtraBlendTiles; ///<number of blend tiles in m_extraBlendTilePositions.
9090
Int m_numVisibleExtraBlendTiles; ///<number rendered last frame.
9191
Int m_extraBlendTilePositionsSize; //<total size of array including unused memory.
92-
DX8VertexBufferClass *m_vertexBufferTiles; ///<collection of smaller vertex buffers that make up 1 heightmap
92+
DX8VertexBufferClass **m_vertexBufferTiles; ///<collection of smaller vertex buffers that make up 1 heightmap
9393
VERTEX_FORMAT *m_vertexBufferBackup; ///< In memory copy of the vertex buffer data for quick update of dynamic lighting.
9494
Int m_originX; ///< Origin point in the grid. Slides around.
9595
Int m_originY; ///< Origin point in the grid. Slides around.

Core/GameEngineDevice/Source/W3DDevice/GameClient/HeightMap.cpp

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -126,12 +126,12 @@ void HeightMapRenderObjClass::freeIndexVertexBuffers(void)
126126
{
127127
REF_PTR_RELEASE(m_indexBuffer);
128128

129-
for (Int i=0; i<m_numVertexBufferTiles; ++i)
130-
{
131-
(m_vertexBufferTiles + i)->~DX8VertexBufferClass();
129+
if (m_vertexBufferTiles) {
130+
for (int i=0; i<m_numVertexBufferTiles; i++)
131+
REF_PTR_RELEASE(m_vertexBufferTiles[i]);
132+
delete[] m_vertexBufferTiles;
133+
m_vertexBufferTiles = nullptr;
132134
}
133-
::operator delete(m_vertexBufferTiles);
134-
m_vertexBufferTiles = nullptr;
135135

136136
delete[] m_vertexBufferBackup;
137137
m_vertexBufferBackup = nullptr;
@@ -156,7 +156,7 @@ Int HeightMapRenderObjClass::freeMapResources(void)
156156

157157
DX8VertexBufferClass *HeightMapRenderObjClass::getVertexBufferTile(Int x, Int y)
158158
{
159-
return m_vertexBufferTiles + y*m_numVBTilesX+x;
159+
return m_vertexBufferTiles[y*m_numVBTilesX+x];
160160
}
161161

162162
//=============================================================================
@@ -1321,14 +1321,14 @@ Int HeightMapRenderObjClass::initHeightData(Int x, Int y, WorldHeightMap *pMap,
13211321
m_x=x;
13221322
m_y=y;
13231323

1324-
m_vertexBufferTiles = (DX8VertexBufferClass*)::operator new(m_numVertexBufferTiles * sizeof(DX8VertexBufferClass));
1324+
m_vertexBufferTiles = NEW DX8VertexBufferClass*[m_numVertexBufferTiles];
13251325
m_vertexBufferBackup = NEW VERTEX_FORMAT [m_numVertexBufferTiles * HEIGHTMAP_VERTEX_NUM];
13261326

13271327
for (i=0; i<m_numVertexBufferTiles; i++) {
13281328
#ifdef USE_NORMALS
1329-
new (&m_vertexBufferTiles[i]) DX8VertexBufferClass(DX8_FVF_XYZNUV2,HEIGHTMAP_VERTEX_NUM,DX8VertexBufferClass::USAGE_DEFAULT);
1329+
m_vertexBufferTiles[i] = NEW_REF(DX8VertexBufferClass,(DX8_FVF_XYZNUV2,HEIGHTMAP_VERTEX_NUM,DX8VertexBufferClass::USAGE_DEFAULT));
13301330
#else
1331-
new (&m_vertexBufferTiles[i]) DX8VertexBufferClass(DX8_VERTEX_FORMAT,HEIGHTMAP_VERTEX_NUM,DX8VertexBufferClass::USAGE_DEFAULT);
1331+
m_vertexBufferTiles[i] = NEW_REF(DX8VertexBufferClass,(DX8_VERTEX_FORMAT,HEIGHTMAP_VERTEX_NUM,DX8VertexBufferClass::USAGE_DEFAULT));
13321332
#endif
13331333
}
13341334

@@ -2013,7 +2013,7 @@ void HeightMapRenderObjClass::Render(RenderInfoClass & rinfo)
20132013
for (j=0; j<m_numVBTilesY; j++)
20142014
for (i=0; i<m_numVBTilesX; i++)
20152015
{
2016-
DX8Wrapper::Set_Vertex_Buffer(m_vertexBufferTiles + j*m_numVBTilesX+i);
2016+
DX8Wrapper::Set_Vertex_Buffer(getVertexBufferTile(i, j));
20172017
#ifdef PRE_TRANSFORM_VERTEX
20182018
if (m_xformedVertexBuffer && pass==0) {
20192019
// Note - m_xformedVertexBuffer should only be used for non T&L hardware. jba.
@@ -2143,7 +2143,7 @@ void HeightMapRenderObjClass::renderTerrainPass(CameraClass *pCamera)
21432143
for (Int j=0; j<m_numVBTilesY; j++)
21442144
for (Int i=0; i<m_numVBTilesX; i++)
21452145
{
2146-
DX8Wrapper::Set_Vertex_Buffer(m_vertexBufferTiles + j*m_numVBTilesX+i);
2146+
DX8Wrapper::Set_Vertex_Buffer(getVertexBufferTile(i, j));
21472147
#ifdef PRE_TRANSFORM_VERTEX
21482148
if (m_xformedVertexBuffer && pass==0) {
21492149
// Note - m_xformedVertexBuffer should only be used for non T&L hardware. jba.

Generals/Code/Libraries/Source/WWVegas/WW3D2/dx8vertexbuffer.h

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -196,13 +196,12 @@ inline VertexFormatXYZNDUV2 * DynamicVBAccessClass::WriteLockClass::Get_Formatte
196196
/**
197197
** DX8VertexBufferClass
198198
** This class wraps a DX8 vertex buffer. Use the lock objects to modify or append to the vertex buffer.
199-
**
200-
** TheSuperHackers @performance Allow placement new and bypass the W3DMemPool to create big buffers.
201199
*/
202200
class DX8VertexBufferClass : public VertexBufferClass
203201
{
204202
W3DMPO_GLUE(DX8VertexBufferClass)
205-
203+
protected:
204+
~DX8VertexBufferClass();
206205
public:
207206
enum UsageType {
208207
USAGE_DEFAULT=0,
@@ -211,15 +210,11 @@ class DX8VertexBufferClass : public VertexBufferClass
211210
USAGE_NPATCHES=4
212211
};
213212

214-
void* operator new(size_t s, void* placement) noexcept { return placement; }
215-
void operator delete(void* p, void* placement) noexcept {}
216-
217213
DX8VertexBufferClass(unsigned FVF, unsigned short VertexCount, UsageType usage=USAGE_DEFAULT);
218214
DX8VertexBufferClass(const Vector3* vertices, const Vector3* normals, const Vector2* tex_coords, unsigned short VertexCount,UsageType usage=USAGE_DEFAULT);
219215
DX8VertexBufferClass(const Vector3* vertices, const Vector3* normals, const Vector4* diffuse, const Vector2* tex_coords, unsigned short VertexCount,UsageType usage=USAGE_DEFAULT);
220216
DX8VertexBufferClass(const Vector3* vertices, const Vector4* diffuse, const Vector2* tex_coords, unsigned short VertexCount,UsageType usage=USAGE_DEFAULT);
221217
DX8VertexBufferClass(const Vector3* vertices, const Vector2* tex_coords, unsigned short VertexCount,UsageType usage=USAGE_DEFAULT);
222-
~DX8VertexBufferClass();
223218

224219
IDirect3DVertexBuffer8* Get_DX8_Vertex_Buffer() { return VertexBuffer; }
225220

Generals/Code/Tools/WorldBuilder/src/WBHeightMap.cpp

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -88,13 +88,10 @@ void WBHeightMap::flattenHeights(void) {
8888
for (j=0; j<m_numVBTilesY; j++)
8989
for (i=0; i<m_numVBTilesX; i++)
9090
{
91-
static int count = 0;
92-
count++;
93-
Int numVertex = (VERTEX_BUFFER_TILE_LENGTH*2)*(VERTEX_BUFFER_TILE_LENGTH*2);
94-
DX8VertexBufferClass::WriteLockClass lockVtxBuffer(m_vertexBufferTiles + j*m_numVBTilesX+i);
91+
DX8VertexBufferClass::WriteLockClass lockVtxBuffer(getVertexBufferTile(i, j));
9592
VERTEX_FORMAT *vbHardware = (VERTEX_FORMAT*)lockVtxBuffer.Get_Vertex_Array();
9693
Int vtx;
97-
for (vtx=0; vtx<numVertex; vtx++) {
94+
for (vtx=0; vtx<HEIGHTMAP_VERTEX_NUM; vtx++) {
9895
vbHardware->z = theZ;
9996
vbHardware++;
10097
}

GeneralsMD/Code/Libraries/Source/WWVegas/WW3D2/dx8vertexbuffer.h

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -197,13 +197,12 @@ inline VertexFormatXYZNDUV2 * DynamicVBAccessClass::WriteLockClass::Get_Formatte
197197
/**
198198
** DX8VertexBufferClass
199199
** This class wraps a DX8 vertex buffer. Use the lock objects to modify or append to the vertex buffer.
200-
**
201-
** TheSuperHackers @performance Allow placement new and bypass the W3DMemPool to create big buffers.
202200
*/
203201
class DX8VertexBufferClass : public VertexBufferClass
204202
{
205203
W3DMPO_GLUE(DX8VertexBufferClass)
206-
204+
protected:
205+
~DX8VertexBufferClass();
207206
public:
208207
enum UsageType {
209208
USAGE_DEFAULT=0,
@@ -212,15 +211,11 @@ class DX8VertexBufferClass : public VertexBufferClass
212211
USAGE_NPATCHES=4
213212
};
214213

215-
void* operator new(size_t s, void* placement) noexcept { return placement; }
216-
void operator delete(void* p, void* placement) noexcept {}
217-
218214
DX8VertexBufferClass(unsigned FVF, unsigned short VertexCount, UsageType usage=USAGE_DEFAULT, unsigned vertex_size=0); // Vertex size not used with FVF formats
219215
DX8VertexBufferClass(const Vector3* vertices, const Vector3* normals, const Vector2* tex_coords, unsigned short VertexCount,UsageType usage=USAGE_DEFAULT);
220216
DX8VertexBufferClass(const Vector3* vertices, const Vector3* normals, const Vector4* diffuse, const Vector2* tex_coords, unsigned short VertexCount,UsageType usage=USAGE_DEFAULT);
221217
DX8VertexBufferClass(const Vector3* vertices, const Vector4* diffuse, const Vector2* tex_coords, unsigned short VertexCount,UsageType usage=USAGE_DEFAULT);
222218
DX8VertexBufferClass(const Vector3* vertices, const Vector2* tex_coords, unsigned short VertexCount,UsageType usage=USAGE_DEFAULT);
223-
~DX8VertexBufferClass();
224219

225220
IDirect3DVertexBuffer8* Get_DX8_Vertex_Buffer() { return VertexBuffer; }
226221

0 commit comments

Comments
 (0)