* Slight optimization to the Region containment

This commit is contained in:
iProgramInCpp
2023-11-04 13:12:35 +02:00
parent 5bba109b68
commit 492ee48125
2 changed files with 16 additions and 8 deletions

View File

@@ -61,7 +61,9 @@ int Region::getRawBrightness(int x, int y, int z, bool b)
}
//@BUG: Unsanitized input
return field_C[(x >> 4) - field_4][(z >> 4) - field_8]->getRawBrightness(x & 0xF, y, z & 0xF, m_pLevel->m_skyDarken);
int xd = (x >> 4) - field_4;
int zd = (z >> 4) - field_8;
return field_C[zd * field_14 + xd]->getRawBrightness(x & 0xF, y, z & 0xF, m_pLevel->m_skyDarken);
}
int Region::getRawBrightness(int x, int y, int z)
@@ -79,7 +81,9 @@ int Region::getData(int x, int y, int z)
if (y < C_MIN_Y || y >= C_MAX_Y)
return 0;
return field_C[(x >> 4) - field_4][(z >> 4) - field_8]->getData(x & 0xF, y, z & 0xF);
int xd = (x >> 4) - field_4;
int zd = (z >> 4) - field_8;
return field_C[zd * field_14 + xd]->getData(x & 0xF, y, z & 0xF);
}
Material* Region::getMaterial(int x, int y, int z)
@@ -104,9 +108,6 @@ bool Region::isSolidTile(int x, int y, int z)
Region::~Region()
{
for (int i = 0; i < field_14; i++)
delete[] field_C[i];
delete[] field_C;
}
@@ -128,18 +129,22 @@ Region::Region(Level* level, int x1, int y1, int z1, int x2, int y2, int z2)
return;
#endif
/*
field_C = new LevelChunk ** [field_14];
for (int i = 0; i < field_14; i++)
{
field_C[i] = new LevelChunk * [field_18];
}
*/
field_C = new LevelChunk * [field_14 * field_18];
for (int x = field_4; x <= x2 >> 4; x++)
{
for (int z = field_8; z <= z2 >> 4; z++)
{
field_C[x - field_4][z - field_8] = level->getChunk(x, z);
field_C[(z - field_8) * field_14 + (x - field_4)] = level->getChunk(x, z);
}
}
}

View File

@@ -33,13 +33,16 @@ public:
if (indexX < 0 || indexZ < 0 || indexX >= field_14 || indexZ >= field_18)
return nullptr;
return field_C[indexX][indexZ];
return field_C[indexZ * field_14 + indexX];
}
private:
int field_4;
int field_8;
LevelChunk*** field_C;
// accesses to the array are performed as follows:
// (x = 0..field_14, z = 0..field_18)
// z * field_14 + x
LevelChunk** field_C;
Level* m_pLevel;
int field_14;
int field_18;