1
0

cBlockArea: change MakeIndex to return size_t

This commit is contained in:
peterbell10 2017-09-07 09:40:58 +01:00 committed by Mattes D
parent 4a0355f065
commit 115bc5609a
3 changed files with 51 additions and 120 deletions

View File

@ -346,45 +346,8 @@ void cBlockArea::Create(int a_SizeX, int a_SizeY, int a_SizeZ, int a_DataTypes)
}
Clear();
int BlockCount = a_SizeX * a_SizeY * a_SizeZ;
if ((a_DataTypes & baTypes) != 0)
{
m_BlockTypes.reset(new BLOCKTYPE[BlockCount]);
for (int i = 0; i < BlockCount; i++)
{
m_BlockTypes[i] = E_BLOCK_AIR;
}
}
if ((a_DataTypes & baMetas) != 0)
{
m_BlockMetas.reset(new NIBBLETYPE[BlockCount]);
for (int i = 0; i < BlockCount; i++)
{
m_BlockMetas[i] = 0;
}
}
if ((a_DataTypes & baLight) != 0)
{
m_BlockLight.reset(new NIBBLETYPE[BlockCount]);
for (int i = 0; i < BlockCount; i++)
{
m_BlockLight[i] = 0;
}
}
if ((a_DataTypes & baSkyLight) != 0)
{
m_BlockSkyLight.reset(new NIBBLETYPE[BlockCount]);
for (int i = 0; i < BlockCount; i++)
{
m_BlockSkyLight[i] = 0x0f;
}
}
if ((a_DataTypes & baBlockEntities) != 0)
{
m_BlockEntities.reset(new cBlockEntities);
}
m_Size.Set(a_SizeX, a_SizeY, a_SizeZ);
m_Origin.Set(0, 0, 0);
SetSize(a_SizeX, a_SizeY, a_SizeZ, a_DataTypes);
Fill(a_DataTypes, E_BLOCK_AIR);
}
@ -1109,8 +1072,8 @@ void cBlockArea::RotateCCW(void)
int NewX = z;
for (int y = 0; y < m_Size.y; y++)
{
int NewIdx = NewX + NewZ * m_Size.z + y * m_Size.x * m_Size.z;
int OldIdx = MakeIndex(x, y, z);
auto NewIdx = MakeIndexForSize({ NewX, y, NewZ }, { m_Size.z, m_Size.y, m_Size.x });
auto OldIdx = MakeIndex(x, y, z);
NewTypes[NewIdx] = m_BlockTypes[OldIdx];
NewMetas[NewIdx] = BlockHandler(m_BlockTypes[OldIdx])->MetaRotateCCW(m_BlockMetas[OldIdx]);
} // for y
@ -1169,8 +1132,8 @@ void cBlockArea::RotateCW(void)
int NewX = m_Size.z - z - 1;
for (int y = 0; y < m_Size.y; y++)
{
int NewIdx = NewX + NewZ * m_Size.z + y * m_Size.x * m_Size.z;
int OldIdx = MakeIndex(x, y, z);
auto NewIdx = MakeIndexForSize({ NewX, y, NewZ }, { m_Size.z, m_Size.y, m_Size.x });
auto OldIdx = MakeIndex(x, y, z);
NewTypes[NewIdx] = m_BlockTypes[OldIdx];
NewMetas[NewIdx] = BlockHandler(m_BlockTypes[OldIdx])->MetaRotateCW(m_BlockMetas[OldIdx]);
} // for y
@ -1227,8 +1190,8 @@ void cBlockArea::MirrorXY(void)
{
for (int x = 0; x < m_Size.x; x++)
{
int Idx1 = MakeIndex(x, y, z);
int Idx2 = MakeIndex(x, y, MaxZ - z);
auto Idx1 = MakeIndex(x, y, z);
auto Idx2 = MakeIndex(x, y, MaxZ - z);
std::swap(m_BlockTypes[Idx1], m_BlockTypes[Idx2]);
NIBBLETYPE Meta1 = BlockHandler(m_BlockTypes[Idx2])->MetaMirrorXY(m_BlockMetas[Idx1]);
NIBBLETYPE Meta2 = BlockHandler(m_BlockTypes[Idx1])->MetaMirrorXY(m_BlockMetas[Idx2]);
@ -1284,8 +1247,8 @@ void cBlockArea::MirrorXZ(void)
{
for (int x = 0; x < m_Size.x; x++)
{
int Idx1 = MakeIndex(x, y, z);
int Idx2 = MakeIndex(x, MaxY - y, z);
auto Idx1 = MakeIndex(x, y, z);
auto Idx2 = MakeIndex(x, MaxY - y, z);
std::swap(m_BlockTypes[Idx1], m_BlockTypes[Idx2]);
NIBBLETYPE Meta1 = BlockHandler(m_BlockTypes[Idx2])->MetaMirrorXZ(m_BlockMetas[Idx1]);
NIBBLETYPE Meta2 = BlockHandler(m_BlockTypes[Idx1])->MetaMirrorXZ(m_BlockMetas[Idx2]);
@ -1341,8 +1304,8 @@ void cBlockArea::MirrorYZ(void)
{
for (int x = 0; x <= HalfX; x++)
{
int Idx1 = MakeIndex(x, y, z);
int Idx2 = MakeIndex(MaxX - x, y, z);
auto Idx1 = MakeIndex(x, y, z);
auto Idx2 = MakeIndex(MaxX - x, y, z);
std::swap(m_BlockTypes[Idx1], m_BlockTypes[Idx2]);
NIBBLETYPE Meta1 = BlockHandler(m_BlockTypes[Idx2])->MetaMirrorYZ(m_BlockMetas[Idx1]);
NIBBLETYPE Meta2 = BlockHandler(m_BlockTypes[Idx1])->MetaMirrorYZ(m_BlockMetas[Idx2]);
@ -1387,7 +1350,7 @@ void cBlockArea::RotateCCWNoMeta(void)
int NewX = z;
for (int y = 0; y < m_Size.y; y++)
{
NewTypes[NewX + NewZ * m_Size.z + y * m_Size.x * m_Size.z] = m_BlockTypes[MakeIndex(x, y, z)];
NewTypes[MakeIndexForSize({ NewX, y, NewZ }, { m_Size.z, m_Size.y, m_Size.x })] = m_BlockTypes[MakeIndex(x, y, z)];
} // for y
} // for z
} // for x
@ -1404,7 +1367,7 @@ void cBlockArea::RotateCCWNoMeta(void)
int NewX = z;
for (int y = 0; y < m_Size.y; y++)
{
NewMetas[NewX + NewZ * m_Size.z + y * m_Size.x * m_Size.z] = m_BlockMetas[MakeIndex(x, y, z)];
NewMetas[MakeIndexForSize({ NewX, y, NewZ }, { m_Size.z, m_Size.y, m_Size.x })] = m_BlockMetas[MakeIndex(x, y, z)];
} // for y
} // for z
} // for x
@ -1448,7 +1411,7 @@ void cBlockArea::RotateCWNoMeta(void)
int NewZ = x;
for (int y = 0; y < m_Size.y; y++)
{
NewTypes[NewX + NewZ * m_Size.z + y * m_Size.x * m_Size.z] = m_BlockTypes[MakeIndex(x, y, z)];
NewTypes[MakeIndexForSize({ NewX, y, NewZ }, { m_Size.z, m_Size.y, m_Size.x })] = m_BlockTypes[MakeIndex(x, y, z)];
} // for y
} // for x
} // for z
@ -1465,7 +1428,7 @@ void cBlockArea::RotateCWNoMeta(void)
int NewZ = x;
for (int y = 0; y < m_Size.y; y++)
{
NewMetas[NewX + NewZ * m_Size.z + y * m_Size.x * m_Size.z] = m_BlockMetas[MakeIndex(x, y, z)];
NewMetas[MakeIndexForSize({ NewX, y, NewZ }, { m_Size.z, m_Size.y, m_Size.x })] = m_BlockMetas[MakeIndex(x, y, z)];
} // for y
} // for x
} // for z
@ -1667,7 +1630,7 @@ void cBlockArea::SetRelBlockType(int a_RelX, int a_RelY, int a_RelZ, BLOCKTYPE a
// Update the block entities, if appropriate:
if (HasBlockEntities())
{
auto itr = m_BlockEntities->find(idx);
auto itr = m_BlockEntities->find(static_cast<int>(idx));
if (itr != m_BlockEntities->end())
{
if (itr->second->GetBlockType() == a_BlockType)
@ -1840,7 +1803,7 @@ void cBlockArea::SetBlockTypeMeta(int a_BlockX, int a_BlockY, int a_BlockZ, BLOC
void cBlockArea::SetRelBlockTypeMeta(int a_RelX, int a_RelY, int a_RelZ, BLOCKTYPE a_BlockType, NIBBLETYPE a_BlockMeta)
{
int idx = MakeIndex(a_RelX, a_RelY, a_RelZ);
auto idx = MakeIndex(a_RelX, a_RelY, a_RelZ);
if (m_BlockTypes == nullptr)
{
LOGWARNING("%s: BlockTypes not available but requested to be written to.", __FUNCTION__);
@ -1861,7 +1824,7 @@ void cBlockArea::SetRelBlockTypeMeta(int a_RelX, int a_RelY, int a_RelZ, B
// Update the block entities, if appropriate:
if (HasBlockEntities())
{
auto itr = m_BlockEntities->find(idx);
auto itr = m_BlockEntities->find(static_cast<int>(idx));
if (itr != m_BlockEntities->end())
{
if (itr->second->GetBlockType() == a_BlockType)
@ -1893,7 +1856,7 @@ void cBlockArea::GetBlockTypeMeta(int a_BlockX, int a_BlockY, int a_BlockZ, BLOC
void cBlockArea::GetRelBlockTypeMeta(int a_RelX, int a_RelY, int a_RelZ, BLOCKTYPE & a_BlockType, NIBBLETYPE & a_BlockMeta) const
{
int idx = MakeIndex(a_RelX, a_RelY, a_RelZ);
auto idx = MakeIndex(a_RelX, a_RelY, a_RelZ);
if (m_BlockTypes == nullptr)
{
LOGWARNING("cBlockArea: BlockTypes have not been read!");
@ -2184,16 +2147,16 @@ bool cBlockArea::SetSize(int a_SizeX, int a_SizeY, int a_SizeZ, int a_DataTypes)
int cBlockArea::MakeIndex(int a_RelX, int a_RelY, int a_RelZ) const
size_t cBlockArea::MakeIndexForSize(Vector3i a_RelPos, Vector3i a_Size)
{
ASSERT(a_RelX >= 0);
ASSERT(a_RelX < m_Size.x);
ASSERT(a_RelY >= 0);
ASSERT(a_RelY < m_Size.y);
ASSERT(a_RelZ >= 0);
ASSERT(a_RelZ < m_Size.z);
ASSERT(a_RelPos.x >= 0);
ASSERT(a_RelPos.x < a_Size.x);
ASSERT(a_RelPos.y >= 0);
ASSERT(a_RelPos.y < a_Size.y);
ASSERT(a_RelPos.z >= 0);
ASSERT(a_RelPos.z < a_Size.z);
return a_RelX + a_RelZ * m_Size.x + a_RelY * m_Size.x * m_Size.z;
return static_cast<size_t>(a_RelPos.x + a_RelPos.z * a_Size.x + a_RelPos.y * a_Size.x * a_Size.z);
}
@ -2207,7 +2170,7 @@ bool cBlockArea::DoWithBlockEntityRelAt(int a_RelX, int a_RelY, int a_RelZ, cIte
{
return false;
}
auto idx = MakeIndex(a_RelX, a_RelY, a_RelZ);
auto idx = static_cast<int>(MakeIndex(a_RelX, a_RelY, a_RelZ));
auto itr = m_BlockEntities->find(idx);
if (itr == m_BlockEntities->end())
{
@ -2302,14 +2265,14 @@ void cBlockArea::CropBlockTypes(int a_AddMinX, int a_SubMaxX, int a_AddMinY, int
int NewSizeY = GetSizeY() - a_AddMinY - a_SubMaxY;
int NewSizeZ = GetSizeZ() - a_AddMinZ - a_SubMaxZ;
BLOCKARRAY NewBlockTypes{ new BLOCKTYPE[NewSizeX * NewSizeY * NewSizeZ] };
int idx = 0;
size_t idx = 0;
for (int y = 0; y < NewSizeY; y++)
{
for (int z = 0; z < NewSizeZ; z++)
{
for (int x = 0; x < NewSizeX; x++)
{
int OldIndex = MakeIndex(x + a_AddMinX, y + a_AddMinY, z + a_AddMinZ);
auto OldIndex = MakeIndex(x + a_AddMinX, y + a_AddMinY, z + a_AddMinZ);
NewBlockTypes[idx++] = m_BlockTypes[OldIndex];
} // for x
} // for z
@ -2327,7 +2290,7 @@ void cBlockArea::CropNibbles(NIBBLEARRAY & a_Array, int a_AddMinX, int a_SubMaxX
int NewSizeY = GetSizeY() - a_AddMinY - a_SubMaxY;
int NewSizeZ = GetSizeZ() - a_AddMinZ - a_SubMaxZ;
NIBBLEARRAY NewNibbles{ new NIBBLETYPE[NewSizeX * NewSizeY * NewSizeZ] };
int idx = 0;
size_t idx = 0;
for (int y = 0; y < NewSizeY; y++)
{
for (int z = 0; z < NewSizeZ; z++)
@ -2353,14 +2316,14 @@ void cBlockArea::ExpandBlockTypes(int a_SubMinX, int a_AddMaxX, int a_SubMinY, i
size_t BlockCount = static_cast<size_t>(NewSizeX * NewSizeY * NewSizeZ);
BLOCKARRAY NewBlockTypes{ new BLOCKTYPE[BlockCount] };
memset(NewBlockTypes.get(), 0, BlockCount * sizeof(BLOCKTYPE));
int OldIndex = 0;
size_t OldIndex = 0;
for (int y = 0; y < m_Size.y; y++)
{
int IndexBaseY = (y + a_SubMinY) * m_Size.x * m_Size.z;
for (int z = 0; z < m_Size.z; z++)
{
int IndexBaseZ = IndexBaseY + (z + a_SubMinZ) * m_Size.x;
int idx = IndexBaseZ + a_SubMinX;
auto idx = static_cast<size_t>(IndexBaseZ + a_SubMinX);
for (int x = 0; x < m_Size.x; x++)
{
NewBlockTypes[idx++] = m_BlockTypes[OldIndex++];
@ -2382,14 +2345,14 @@ void cBlockArea::ExpandNibbles(NIBBLEARRAY & a_Array, int a_SubMinX, int a_AddMa
size_t BlockCount = static_cast<size_t>(NewSizeX * NewSizeY * NewSizeZ);
NIBBLEARRAY NewNibbles{ new NIBBLETYPE[BlockCount] };
memset(NewNibbles.get(), 0, BlockCount * sizeof(NIBBLETYPE));
int OldIndex = 0;
size_t OldIndex = 0;
for (int y = 0; y < m_Size.y; y++)
{
int IndexBaseY = (y + a_SubMinY) * m_Size.x * m_Size.z;
for (int z = 0; z < m_Size.z; z++)
{
int IndexBaseZ = IndexBaseY + (z + a_SubMinZ) * m_Size.x;
int idx = IndexBaseZ + a_SubMinX;
auto idx = static_cast<size_t>(IndexBaseZ + a_SubMinX);
for (int x = 0; x < m_Size.x; x++)
{
NewNibbles[idx++] = a_Array[OldIndex++];
@ -2414,7 +2377,7 @@ void cBlockArea::RelSetData(
return;
}
int Index = MakeIndex(a_RelX, a_RelY, a_RelZ);
auto Index = MakeIndex(a_RelX, a_RelY, a_RelZ);
if ((a_DataTypes & baTypes) != 0)
{
m_BlockTypes[Index] = a_BlockType;
@ -2435,7 +2398,7 @@ void cBlockArea::RelSetData(
// Update the block entities, if appropriate:
if (HasBlockEntities())
{
auto itr = m_BlockEntities->find(Index);
auto itr = m_BlockEntities->find(static_cast<int>(Index));
if (itr != m_BlockEntities->end())
{
if (itr->second->GetBlockType() == a_BlockType)
@ -2657,7 +2620,7 @@ void cBlockArea::MergeBlockEntities(int a_RelX, int a_RelY, int a_RelZ, const cB
}
// This block should have a block entity, check that there is one:
auto itr = m_BlockEntities->find(idx);
auto itr = m_BlockEntities->find(static_cast<int>(idx));
if (itr != m_BlockEntities->end())
{
// There is one already
@ -2671,7 +2634,7 @@ void cBlockArea::MergeBlockEntities(int a_RelX, int a_RelY, int a_RelZ, const cB
if (a_Src.IsValidRelCoords(srcX, srcY, srcZ))
{
auto srcIdx = a_Src.MakeIndex(srcX, srcY, srcZ);
auto itrSrc = a_Src.m_BlockEntities->find(srcIdx);
auto itrSrc = a_Src.m_BlockEntities->find(static_cast<int>(srcIdx));
if (itrSrc != a_Src.m_BlockEntities->end())
{
m_BlockEntities->insert({idx, itrSrc->second->Clone(x, y, z)});
@ -2709,7 +2672,7 @@ void cBlockArea::RescanBlockEntities(void)
continue;
}
// This block should have a block entity, check that there is one:
auto itr = m_BlockEntities->find(idx);
auto itr = m_BlockEntities->find(static_cast<int>(idx));
if (itr != m_BlockEntities->end())
{
continue;
@ -2734,7 +2697,7 @@ void cBlockArea::RemoveNonMatchingBlockEntities(void)
std::swap(oldBE, *m_BlockEntities);
for (auto & keyPair: oldBE)
{
auto type = m_BlockTypes[keyPair.first];
auto type = m_BlockTypes[static_cast<size_t>(keyPair.first)];
if (type == keyPair.second->GetBlockType())
{
m_BlockEntities->insert({keyPair.first, std::move(keyPair.second)});
@ -3004,7 +2967,7 @@ void cBlockArea::cChunkReader::BlockEntity(cBlockEntity * a_BlockEntity)
auto areaX = a_BlockEntity->GetPosX() - m_Area.m_Origin.x;
auto areaY = a_BlockEntity->GetPosY() - m_Area.m_Origin.y;
auto areaZ = a_BlockEntity->GetPosZ() - m_Area.m_Origin.z;
int Idx = m_Area.MakeIndex(areaX, areaY, areaZ);
auto Idx = m_Area.MakeIndex(areaX, areaY, areaZ);
m_Area.m_BlockEntities->insert({Idx, a_BlockEntity->Clone(areaX, areaY, areaZ)});
}

View File

@ -370,7 +370,11 @@ public:
NIBBLETYPE * GetBlockLight (void) const { return m_BlockLight.get(); } // NOTE: one byte per block!
NIBBLETYPE * GetBlockSkyLight(void) const { return m_BlockSkyLight.get(); } // NOTE: one byte per block!
size_t GetBlockCount(void) const { return static_cast<size_t>(m_Size.x * m_Size.y * m_Size.z); }
int MakeIndex(int a_RelX, int a_RelY, int a_RelZ) const;
static size_t MakeIndexForSize(Vector3i a_RelPos, Vector3i a_Size);
size_t MakeIndex(int a_RelX, int a_RelY, int a_RelZ) const
{
return MakeIndexForSize({ a_RelX, a_RelY, a_RelZ }, m_Size);
}
/** Calls the callback for the block entity at the specified coords.
Returns false if there is no block entity at those coords, or the block area doesn't have baBlockEntities.
@ -418,44 +422,8 @@ protected:
virtual void BlockEntity(cBlockEntity * a_BlockEntity) override;
} ;
template <typename T>
class cDynArray:
public std::unique_ptr<T[]>
{
using Super = std::unique_ptr<T[]>;
public:
// using Super::Super;
cDynArray() = default;
cDynArray(cDynArray && a_Other) : Super(std::move(a_Other)) {}
cDynArray & operator = (cDynArray && a_Other)
{
Super::operator = (std::move(a_Other));
return *this;
}
cDynArray(std::nullptr_t) {}
cDynArray(T * a_Ptr):
Super(a_Ptr)
{
}
// Allow indexing with signed types
T & operator [] (int a_Idx) const
{
ASSERT(a_Idx >= 0);
return (Super::get())[a_Idx];
}
T & operator [] (size_t a_Idx) const
{
return (Super::get())[a_Idx];
}
};
using NIBBLEARRAY = cDynArray<NIBBLETYPE>;
using BLOCKARRAY = cDynArray<BLOCKTYPE>;
using NIBBLEARRAY = std::unique_ptr<NIBBLETYPE[]>;
using BLOCKARRAY = std::unique_ptr<BLOCKTYPE[]>;
Vector3i m_Origin;
Vector3i m_Size;

View File

@ -443,7 +443,7 @@ void cChunk::WriteBlockArea(cBlockArea & a_Area, int a_MinBlockX, int a_MinBlock
{
int ChunkX = OffX + x;
int AreaX = BaseX + x;
int idx = a_Area.MakeIndex(AreaX, AreaY, AreaZ);
auto idx = a_Area.MakeIndex(AreaX, AreaY, AreaZ);
BLOCKTYPE BlockType = AreaBlockTypes[idx];
NIBBLETYPE BlockMeta = AreaBlockMetas[idx];
FastSetBlock(ChunkX, ChunkY, ChunkZ, BlockType, BlockMeta);