Add support for 32 bit indices for the terrain chunk geometry
This commit is contained in:
@@ -98,10 +98,12 @@ bool TerrainManager::GetChunkGeometry(DrawCall& drawCall, int32 chunkSize, int32
|
||||
// Prepare
|
||||
const int32 vertexCount = (chunkSize + 1) >> lodIndex;
|
||||
chunkSize = vertexCount - 1;
|
||||
const bool indexUse16bits = chunkSize * chunkSize * vertexCount < MAX_uint16;
|
||||
const int32 indexSize = indexUse16bits ? sizeof(uint16) : sizeof(uint32);
|
||||
const int32 indexCount = chunkSize * chunkSize * 2 * 3;
|
||||
const int32 vertexCount2 = vertexCount * vertexCount;
|
||||
const int32 vbSize = sizeof(TerrainVertex) * vertexCount2;
|
||||
const int32 ibSize = sizeof(uint16) * indexCount;
|
||||
const int32 ibSize = indexSize * indexCount;
|
||||
TempData.Clear();
|
||||
TempData.EnsureCapacity(Math::Max(vbSize, ibSize));
|
||||
|
||||
@@ -140,26 +142,51 @@ bool TerrainManager::GetChunkGeometry(DrawCall& drawCall, int32 chunkSize, int32
|
||||
|
||||
// Create index buffer
|
||||
auto ib = GPUDevice::Instance->CreateBuffer(TEXT("TerrainChunk.IB"));
|
||||
auto index = (uint16*)TempData.Get();
|
||||
for (int32 z = 0; z < chunkSize; z++)
|
||||
if (indexUse16bits)
|
||||
{
|
||||
for (int32 x = 0; x < chunkSize; x++)
|
||||
auto index = (uint16*)TempData.Get();
|
||||
for (int32 z = 0; z < chunkSize; z++)
|
||||
{
|
||||
const uint16 i00 = (x + 0) + (z + 0) * vertexCount;
|
||||
const uint16 i10 = (x + 1) + (z + 0) * vertexCount;
|
||||
const uint16 i11 = (x + 1) + (z + 1) * vertexCount;
|
||||
const uint16 i01 = (x + 0) + (z + 1) * vertexCount;
|
||||
for (int32 x = 0; x < chunkSize; x++)
|
||||
{
|
||||
const uint16 i00 = (x + 0) + (z + 0) * vertexCount;
|
||||
const uint16 i10 = (x + 1) + (z + 0) * vertexCount;
|
||||
const uint16 i11 = (x + 1) + (z + 1) * vertexCount;
|
||||
const uint16 i01 = (x + 0) + (z + 1) * vertexCount;
|
||||
|
||||
*index++ = i00;
|
||||
*index++ = i11;
|
||||
*index++ = i10;
|
||||
*index++ = i00;
|
||||
*index++ = i11;
|
||||
*index++ = i10;
|
||||
|
||||
*index++ = i00;
|
||||
*index++ = i01;
|
||||
*index++ = i11;
|
||||
*index++ = i00;
|
||||
*index++ = i01;
|
||||
*index++ = i11;
|
||||
}
|
||||
}
|
||||
}
|
||||
desc = GPUBufferDescription::Index(sizeof(uint16), indexCount, TempData.Get());
|
||||
else
|
||||
{
|
||||
auto index = (uint32*)TempData.Get();
|
||||
for (int32 z = 0; z < chunkSize; z++)
|
||||
{
|
||||
for (int32 x = 0; x < chunkSize; x++)
|
||||
{
|
||||
const uint32 i00 = (x + 0) + (z + 0) * vertexCount;
|
||||
const uint32 i10 = (x + 1) + (z + 0) * vertexCount;
|
||||
const uint32 i11 = (x + 1) + (z + 1) * vertexCount;
|
||||
const uint32 i01 = (x + 0) + (z + 1) * vertexCount;
|
||||
|
||||
*index++ = i00;
|
||||
*index++ = i11;
|
||||
*index++ = i10;
|
||||
|
||||
*index++ = i00;
|
||||
*index++ = i01;
|
||||
*index++ = i11;
|
||||
}
|
||||
}
|
||||
}
|
||||
desc = GPUBufferDescription::Index(indexSize, indexCount, TempData.Get());
|
||||
if (ib->Init(desc))
|
||||
{
|
||||
vb->ReleaseGPU();
|
||||
|
||||
Reference in New Issue
Block a user