mirror of
https://github.com/luanti-org/luanti.git
synced 2025-06-27 16:36:03 +00:00
Start every block as monoblock, and set m_is_mono_block in reallocate
This commit is contained in:
parent
5967457be0
commit
46044e6d77
3 changed files with 27 additions and 25 deletions
|
@ -101,11 +101,12 @@ static const char *modified_reason_strings[] = {
|
||||||
*/
|
*/
|
||||||
|
|
||||||
MapBlock::MapBlock(v3s16 pos, IGameDef *gamedef):
|
MapBlock::MapBlock(v3s16 pos, IGameDef *gamedef):
|
||||||
|
m_is_mono_block(true),
|
||||||
m_pos(pos),
|
m_pos(pos),
|
||||||
m_pos_relative(pos * MAP_BLOCKSIZE),
|
m_pos_relative(pos * MAP_BLOCKSIZE),
|
||||||
m_gamedef(gamedef)
|
m_gamedef(gamedef)
|
||||||
{
|
{
|
||||||
reallocate(nodecount, MapNode(CONTENT_IGNORE));
|
reallocate(1, MapNode(CONTENT_IGNORE));
|
||||||
}
|
}
|
||||||
|
|
||||||
MapBlock::~MapBlock()
|
MapBlock::~MapBlock()
|
||||||
|
@ -222,25 +223,27 @@ void MapBlock::copyFrom(const VoxelManipulator &src)
|
||||||
v3s16 data_size(MAP_BLOCKSIZE, MAP_BLOCKSIZE, MAP_BLOCKSIZE);
|
v3s16 data_size(MAP_BLOCKSIZE, MAP_BLOCKSIZE, MAP_BLOCKSIZE);
|
||||||
VoxelArea data_area(v3s16(0,0,0), data_size - v3s16(1,1,1));
|
VoxelArea data_area(v3s16(0,0,0), data_size - v3s16(1,1,1));
|
||||||
|
|
||||||
deconvertMonoblock();
|
expandNodesIfNeeded();
|
||||||
// Copy from VoxelManipulator to data
|
// Copy from VoxelManipulator to data
|
||||||
src.copyTo(data, data_area, v3s16(0,0,0),
|
src.copyTo(data, data_area, v3s16(0,0,0),
|
||||||
getPosRelative(), data_size);
|
getPosRelative(), data_size);
|
||||||
tryConvertToMonoblock();
|
tryShrinkNodes();
|
||||||
}
|
}
|
||||||
|
|
||||||
void MapBlock::reallocate(u32 c, MapNode n)
|
void MapBlock::reallocate(u32 c, MapNode n)
|
||||||
{
|
{
|
||||||
delete[] data;
|
delete[] data;
|
||||||
if (c == 1)
|
if (!m_is_mono_block && c == 1)
|
||||||
porting::TrackFreedMemory(sizeof(MapNode) * nodecount);
|
porting::TrackFreedMemory(sizeof(MapNode) * nodecount);
|
||||||
|
|
||||||
data = new MapNode[c];
|
data = new MapNode[c];
|
||||||
for (u32 i = 0; i < c; i++)
|
for (u32 i = 0; i < c; i++)
|
||||||
data[i] = n;
|
data[i] = n;
|
||||||
|
|
||||||
|
m_is_mono_block = (c == 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
void MapBlock::tryConvertToMonoblock()
|
void MapBlock::tryShrinkNodes()
|
||||||
{
|
{
|
||||||
if (m_is_mono_block)
|
if (m_is_mono_block)
|
||||||
return;
|
return;
|
||||||
|
@ -255,7 +258,6 @@ void MapBlock::tryConvertToMonoblock()
|
||||||
}
|
}
|
||||||
|
|
||||||
if (is_mono_block) {
|
if (is_mono_block) {
|
||||||
m_is_mono_block = true;
|
|
||||||
reallocate(1, n);
|
reallocate(1, n);
|
||||||
if (n.getContent() == CONTENT_AIR) {
|
if (n.getContent() == CONTENT_AIR) {
|
||||||
m_is_air = true;
|
m_is_air = true;
|
||||||
|
@ -264,11 +266,10 @@ void MapBlock::tryConvertToMonoblock()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void MapBlock::deconvertMonoblock()
|
void MapBlock::expandNodesIfNeeded()
|
||||||
{
|
{
|
||||||
if (m_is_mono_block) {
|
if (m_is_mono_block) {
|
||||||
reallocate(nodecount, data[0]);
|
reallocate(nodecount, data[0]);
|
||||||
m_is_mono_block = false;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -513,6 +514,7 @@ void MapBlock::deSerialize(std::istream &in_compressed, u8 version, bool disk)
|
||||||
TRACESTREAM(<<"MapBlock::deSerialize "<<getPos()<<std::endl);
|
TRACESTREAM(<<"MapBlock::deSerialize "<<getPos()<<std::endl);
|
||||||
|
|
||||||
m_is_air_expired = true;
|
m_is_air_expired = true;
|
||||||
|
expandNodesIfNeeded();
|
||||||
|
|
||||||
if(version <= 21)
|
if(version <= 21)
|
||||||
{
|
{
|
||||||
|
@ -642,7 +644,7 @@ void MapBlock::deSerialize(std::istream &in_compressed, u8 version, bool disk)
|
||||||
}
|
}
|
||||||
|
|
||||||
if (nimap.size() == 1) {
|
if (nimap.size() == 1) {
|
||||||
tryConvertToMonoblock();
|
tryShrinkNodes();
|
||||||
u16 dummy;
|
u16 dummy;
|
||||||
if (nimap.getId("air", dummy)) {
|
if (nimap.getId("air", dummy)) {
|
||||||
m_is_air = true;
|
m_is_air = true;
|
||||||
|
|
|
@ -76,7 +76,7 @@ public:
|
||||||
|
|
||||||
MapNode* getData()
|
MapNode* getData()
|
||||||
{
|
{
|
||||||
deconvertMonoblock();
|
expandNodesIfNeeded();
|
||||||
return data;
|
return data;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -250,7 +250,7 @@ public:
|
||||||
if (!isValidPosition(x, y, z))
|
if (!isValidPosition(x, y, z))
|
||||||
throw InvalidPositionException();
|
throw InvalidPositionException();
|
||||||
|
|
||||||
deconvertMonoblock();
|
expandNodesIfNeeded();
|
||||||
data[z * zstride + y * ystride + x] = n;
|
data[z * zstride + y * ystride + x] = n;
|
||||||
raiseModified(MOD_STATE_WRITE_NEEDED, MOD_REASON_SET_NODE);
|
raiseModified(MOD_STATE_WRITE_NEEDED, MOD_REASON_SET_NODE);
|
||||||
}
|
}
|
||||||
|
@ -276,7 +276,7 @@ public:
|
||||||
|
|
||||||
inline void setNodeNoCheck(s16 x, s16 y, s16 z, MapNode n)
|
inline void setNodeNoCheck(s16 x, s16 y, s16 z, MapNode n)
|
||||||
{
|
{
|
||||||
deconvertMonoblock();
|
expandNodesIfNeeded();
|
||||||
data[z * zstride + y * ystride + x] = n;
|
data[z * zstride + y * ystride + x] = n;
|
||||||
raiseModified(MOD_STATE_WRITE_NEEDED, MOD_REASON_SET_NODE);
|
raiseModified(MOD_STATE_WRITE_NEEDED, MOD_REASON_SET_NODE);
|
||||||
}
|
}
|
||||||
|
@ -441,9 +441,9 @@ private:
|
||||||
|
|
||||||
void deSerialize_pre22(std::istream &is, u8 version, bool disk);
|
void deSerialize_pre22(std::istream &is, u8 version, bool disk);
|
||||||
// check if all nodes are identical, if so store them as a single node
|
// check if all nodes are identical, if so store them as a single node
|
||||||
void tryConvertToMonoblock();
|
void tryShrinkNodes();
|
||||||
// if only a single node is stored, expand storage back to the full array
|
// if only a single node is stored, expand storage back to the full array
|
||||||
void deconvertMonoblock();
|
void expandNodesIfNeeded();
|
||||||
void reallocate(u32 c, MapNode n);
|
void reallocate(u32 c, MapNode n);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -464,7 +464,7 @@ public:
|
||||||
private:
|
private:
|
||||||
// see isOrphan()
|
// see isOrphan()
|
||||||
bool m_orphan = false;
|
bool m_orphan = false;
|
||||||
bool m_is_mono_block = false;
|
bool m_is_mono_block;
|
||||||
|
|
||||||
// Position in blocks on parent
|
// Position in blocks on parent
|
||||||
v3s16 m_pos;
|
v3s16 m_pos;
|
||||||
|
|
|
@ -63,7 +63,7 @@ void TestMapBlock::testMonoblock(IGameDef *gamedef)
|
||||||
block.data[i] = MapNode(CONTENT_AIR);
|
block.data[i] = MapNode(CONTENT_AIR);
|
||||||
}
|
}
|
||||||
// covert to monoblock
|
// covert to monoblock
|
||||||
block.tryConvertToMonoblock();
|
block.tryShrinkNodes();
|
||||||
UASSERT(block.m_is_mono_block);
|
UASSERT(block.m_is_mono_block);
|
||||||
UASSERT(block.data[0].param0 == CONTENT_AIR);
|
UASSERT(block.data[0].param0 == CONTENT_AIR);
|
||||||
UASSERT(block.data != t);
|
UASSERT(block.data != t);
|
||||||
|
@ -76,17 +76,17 @@ void TestMapBlock::testMonoblock(IGameDef *gamedef)
|
||||||
UASSERT(block.data == d1);
|
UASSERT(block.data == d1);
|
||||||
|
|
||||||
// covert back to mono block
|
// covert back to mono block
|
||||||
block.tryConvertToMonoblock();
|
block.tryShrinkNodes();
|
||||||
UASSERT(block.m_is_mono_block);
|
UASSERT(block.m_is_mono_block);
|
||||||
t = block.data;
|
t = block.data;
|
||||||
|
|
||||||
// deconvert explicitly
|
// deconvert explicitly
|
||||||
block.deconvertMonoblock();
|
block.expandNodesIfNeeded();
|
||||||
UASSERT(!block.m_is_mono_block);
|
UASSERT(!block.m_is_mono_block);
|
||||||
UASSERT(block.data != t);
|
UASSERT(block.data != t);
|
||||||
|
|
||||||
// covert back to mono block
|
// covert back to mono block
|
||||||
block.tryConvertToMonoblock();
|
block.tryShrinkNodes();
|
||||||
UASSERT(block.m_is_mono_block);
|
UASSERT(block.m_is_mono_block);
|
||||||
t = block.data;
|
t = block.data;
|
||||||
|
|
||||||
|
@ -97,7 +97,7 @@ void TestMapBlock::testMonoblock(IGameDef *gamedef)
|
||||||
t = block.data;
|
t = block.data;
|
||||||
|
|
||||||
// cannot covert to mono block
|
// cannot covert to mono block
|
||||||
block.tryConvertToMonoblock();
|
block.tryShrinkNodes();
|
||||||
UASSERT(!block.m_is_mono_block);
|
UASSERT(!block.m_is_mono_block);
|
||||||
UASSERT(block.data == t);
|
UASSERT(block.data == t);
|
||||||
|
|
||||||
|
@ -107,7 +107,7 @@ void TestMapBlock::testMonoblock(IGameDef *gamedef)
|
||||||
}
|
}
|
||||||
|
|
||||||
// can covert to mono block
|
// can covert to mono block
|
||||||
block.tryConvertToMonoblock();
|
block.tryShrinkNodes();
|
||||||
UASSERT(block.m_is_mono_block);
|
UASSERT(block.m_is_mono_block);
|
||||||
UASSERT(block.data[0].param0 == 42);
|
UASSERT(block.data[0].param0 == 42);
|
||||||
UASSERT(block.data != t);
|
UASSERT(block.data != t);
|
||||||
|
@ -143,19 +143,19 @@ void TestMapBlock::testMonoblock(IGameDef *gamedef)
|
||||||
UASSERT(block.m_is_mono_block);
|
UASSERT(block.m_is_mono_block);
|
||||||
|
|
||||||
block.setNode(5,5,5,MapNode(23));
|
block.setNode(5,5,5,MapNode(23));
|
||||||
block.tryConvertToMonoblock();
|
block.tryShrinkNodes();
|
||||||
UASSERT(!block.m_is_mono_block);
|
UASSERT(!block.m_is_mono_block);
|
||||||
|
|
||||||
block.setNode(5,5,5,MapNode(42, 1, 0));
|
block.setNode(5,5,5,MapNode(42, 1, 0));
|
||||||
block.tryConvertToMonoblock();
|
block.tryShrinkNodes();
|
||||||
UASSERT(!block.m_is_mono_block);
|
UASSERT(!block.m_is_mono_block);
|
||||||
|
|
||||||
block.setNode(5,5,5,MapNode(42, 0, 1));
|
block.setNode(5,5,5,MapNode(42, 0, 1));
|
||||||
block.tryConvertToMonoblock();
|
block.tryShrinkNodes();
|
||||||
UASSERT(!block.m_is_mono_block);
|
UASSERT(!block.m_is_mono_block);
|
||||||
|
|
||||||
block.setNode(5,5,5,MapNode(42));
|
block.setNode(5,5,5,MapNode(42));
|
||||||
block.tryConvertToMonoblock();
|
block.tryShrinkNodes();
|
||||||
UASSERT(block.m_is_mono_block);
|
UASSERT(block.m_is_mono_block);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue