Remove emerge and speedup addArea by using memcopy instead of one by one assignment

This commit is contained in:
sapier 2014-06-09 13:29:22 +02:00
parent d5de0cbf71
commit 8ad83767cf
4 changed files with 83 additions and 112 deletions

@ -3551,12 +3551,12 @@ void MapVoxelManipulator::emerge(VoxelArea a, s32 caller_id)
flags |= VMANIP_BLOCK_DATA_INEXIST; flags |= VMANIP_BLOCK_DATA_INEXIST;
VoxelArea a(p*MAP_BLOCKSIZE, (p+1)*MAP_BLOCKSIZE-v3s16(1,1,1)); VoxelArea a(p*MAP_BLOCKSIZE, (p+1)*MAP_BLOCKSIZE-v3s16(1,1,1));
// Fill with VOXELFLAG_INEXISTENT // Fill with VOXELFLAG_NO_DATA
for(s32 z=a.MinEdge.Z; z<=a.MaxEdge.Z; z++) for(s32 z=a.MinEdge.Z; z<=a.MaxEdge.Z; z++)
for(s32 y=a.MinEdge.Y; y<=a.MaxEdge.Y; y++) for(s32 y=a.MinEdge.Y; y<=a.MaxEdge.Y; y++)
{ {
s32 i = m_area.index(a.MinEdge.X,y,z); s32 i = m_area.index(a.MinEdge.X,y,z);
memset(&m_flags[i], VOXELFLAG_INEXISTENT, MAP_BLOCKSIZE); memset(&m_flags[i], VOXELFLAG_NO_DATA, MAP_BLOCKSIZE);
} }
} }
/*else if (block->getNode(0, 0, 0).getContent() == CONTENT_IGNORE) /*else if (block->getNode(0, 0, 0).getContent() == CONTENT_IGNORE)
@ -3601,7 +3601,7 @@ void MapVoxelManipulator::blitBack
v3s16 p(x,y,z); v3s16 p(x,y,z);
u8 f = m_flags[m_area.index(p)]; u8 f = m_flags[m_area.index(p)];
if(f & (VOXELFLAG_NOT_LOADED|VOXELFLAG_INEXISTENT)) if(f & (VOXELFLAG_NO_DATA))
continue; continue;
MapNode &n = m_data[m_area.index(p)]; MapNode &n = m_data[m_area.index(p)];
@ -3655,7 +3655,7 @@ ManualMapVoxelManipulator::~ManualMapVoxelManipulator()
void ManualMapVoxelManipulator::emerge(VoxelArea a, s32 caller_id) void ManualMapVoxelManipulator::emerge(VoxelArea a, s32 caller_id)
{ {
// Just create the area so that it can be pointed to // Just create the area so that it can be pointed to
VoxelManipulator::emerge(a, caller_id); VoxelManipulator::addArea(a);
} }
void ManualMapVoxelManipulator::initialEmerge(v3s16 blockpos_min, void ManualMapVoxelManipulator::initialEmerge(v3s16 blockpos_min,
@ -3726,12 +3726,12 @@ void ManualMapVoxelManipulator::initialEmerge(v3s16 blockpos_min,
Mark area inexistent Mark area inexistent
*/ */
VoxelArea a(p*MAP_BLOCKSIZE, (p+1)*MAP_BLOCKSIZE-v3s16(1,1,1)); VoxelArea a(p*MAP_BLOCKSIZE, (p+1)*MAP_BLOCKSIZE-v3s16(1,1,1));
// Fill with VOXELFLAG_INEXISTENT // Fill with VOXELFLAG_NO_DATA
for(s32 z=a.MinEdge.Z; z<=a.MaxEdge.Z; z++) for(s32 z=a.MinEdge.Z; z<=a.MaxEdge.Z; z++)
for(s32 y=a.MinEdge.Y; y<=a.MaxEdge.Y; y++) for(s32 y=a.MinEdge.Y; y<=a.MaxEdge.Y; y++)
{ {
s32 i = m_area.index(a.MinEdge.X,y,z); s32 i = m_area.index(a.MinEdge.X,y,z);
memset(&m_flags[i], VOXELFLAG_INEXISTENT, MAP_BLOCKSIZE); memset(&m_flags[i], VOXELFLAG_NO_DATA, MAP_BLOCKSIZE);
} }
} }
} }

@ -71,7 +71,7 @@ void VoxelManipulator::print(std::ostream &o, INodeDefManager *ndef,
v3s16 of = m_area.MinEdge; v3s16 of = m_area.MinEdge;
o<<"size: "<<em.X<<"x"<<em.Y<<"x"<<em.Z o<<"size: "<<em.X<<"x"<<em.Y<<"x"<<em.Z
<<" offset: ("<<of.X<<","<<of.Y<<","<<of.Z<<")"<<std::endl; <<" offset: ("<<of.X<<","<<of.Y<<","<<of.Z<<")"<<std::endl;
for(s32 y=m_area.MaxEdge.Y; y>=m_area.MinEdge.Y; y--) for(s32 y=m_area.MaxEdge.Y; y>=m_area.MinEdge.Y; y--)
{ {
if(em.X >= 3 && em.Y >= 3) if(em.X >= 3 && em.Y >= 3)
@ -88,10 +88,8 @@ void VoxelManipulator::print(std::ostream &o, INodeDefManager *ndef,
{ {
u8 f = m_flags[m_area.index(x,y,z)]; u8 f = m_flags[m_area.index(x,y,z)];
char c; char c;
if(f & VOXELFLAG_NOT_LOADED) if(f & VOXELFLAG_NO_DATA)
c = 'N'; c = 'N';
else if(f & VOXELFLAG_INEXISTENT)
c = 'I';
else else
{ {
c = 'X'; c = 'X';
@ -149,11 +147,11 @@ void VoxelManipulator::addArea(VoxelArea area)
// Cancel if requested area has zero volume // Cancel if requested area has zero volume
if(area.getExtent() == v3s16(0,0,0)) if(area.getExtent() == v3s16(0,0,0))
return; return;
// Cancel if m_area already contains the requested area // Cancel if m_area already contains the requested area
if(m_area.contains(area)) if(m_area.contains(area))
return; return;
TimeTaker timer("addArea", &addarea_time); TimeTaker timer("addArea", &addarea_time);
// Calculate new area // Calculate new area
@ -186,28 +184,26 @@ void VoxelManipulator::addArea(VoxelArea area)
assert(new_data); assert(new_data);
u8 *new_flags = new u8[new_size]; u8 *new_flags = new u8[new_size];
assert(new_flags); assert(new_flags);
memset(new_flags, VOXELFLAG_NOT_LOADED, new_size); memset(new_flags, VOXELFLAG_NO_DATA, new_size);
// Copy old data // Copy old data
s32 old_x_width = m_area.MaxEdge.X - m_area.MinEdge.X + 1;
for(s32 z=m_area.MinEdge.Z; z<=m_area.MaxEdge.Z; z++) for(s32 z=m_area.MinEdge.Z; z<=m_area.MaxEdge.Z; z++)
for(s32 y=m_area.MinEdge.Y; y<=m_area.MaxEdge.Y; y++) for(s32 y=m_area.MinEdge.Y; y<=m_area.MaxEdge.Y; y++)
for(s32 x=m_area.MinEdge.X; x<=m_area.MaxEdge.X; x++)
{ {
unsigned int old_index = m_area.index(x,y,z); unsigned int old_index = m_area.index(m_area.MinEdge.X,y,z);
// If loaded, copy data and flags unsigned int new_index = new_area.index(m_area.MinEdge.X,y,z);
if((m_flags[old_index] & VOXELFLAG_NOT_LOADED) == false)
{ memcpy(&new_data[new_index], &m_data[old_index],
unsigned int new_index = new_area.index(x,y,z); old_x_width * sizeof(MapNode));
new_data[new_index] = m_data[old_index]; memcpy(&new_flags[new_index], &m_flags[old_index],
new_flags[new_index] = m_flags[old_index]; old_x_width * sizeof(u8));
}
} }
// Replace area, data and flags // Replace area, data and flags
m_area = new_area; m_area = new_area;
MapNode *old_data = m_data; MapNode *old_data = m_data;
u8 *old_flags = m_flags; u8 *old_flags = m_flags;
@ -216,7 +212,7 @@ void VoxelManipulator::addArea(VoxelArea area)
m_data = new_data; m_data = new_data;
m_flags = new_flags; m_flags = new_flags;
if(old_data) if(old_data)
delete[] old_data; delete[] old_data;
if(old_flags) if(old_flags)
@ -225,7 +221,7 @@ void VoxelManipulator::addArea(VoxelArea area)
//dstream<<"addArea done"<<std::endl; //dstream<<"addArea done"<<std::endl;
} }
void VoxelManipulator::copyFrom(MapNode *src, VoxelArea src_area, void VoxelManipulator::copyFrom(MapNode *src, const VoxelArea& src_area,
v3s16 from_pos, v3s16 to_pos, v3s16 size) v3s16 from_pos, v3s16 to_pos, v3s16 size)
{ {
for(s16 z=0; z<size.Z; z++) for(s16 z=0; z<size.Z; z++)
@ -238,7 +234,7 @@ void VoxelManipulator::copyFrom(MapNode *src, VoxelArea src_area,
} }
} }
void VoxelManipulator::copyTo(MapNode *dst, VoxelArea dst_area, void VoxelManipulator::copyTo(MapNode *dst, const VoxelArea& dst_area,
v3s16 dst_pos, v3s16 from_pos, v3s16 size) v3s16 dst_pos, v3s16 from_pos, v3s16 size)
{ {
for(s16 z=0; z<size.Z; z++) for(s16 z=0; z<size.Z; z++)
@ -252,7 +248,6 @@ void VoxelManipulator::copyTo(MapNode *dst, VoxelArea dst_area,
i_dst++; i_dst++;
i_local++; i_local++;
} }
//memcpy(&dst[i_dst], &m_data[i_local], size.X*sizeof(MapNode));
} }
} }
@ -314,22 +309,22 @@ void VoxelManipulator::unspreadLight(enum LightBank bank, v3s16 p, u8 oldlight,
v3s16(0,-1,0), // bottom v3s16(0,-1,0), // bottom
v3s16(-1,0,0), // left v3s16(-1,0,0), // left
}; };
emerge(VoxelArea(p - v3s16(1,1,1), p + v3s16(1,1,1))); addArea(VoxelArea(p - v3s16(1,1,1), p + v3s16(1,1,1)));
// Loop through 6 neighbors // Loop through 6 neighbors
for(u16 i=0; i<6; i++) for(u16 i=0; i<6; i++)
{ {
// Get the position of the neighbor node // Get the position of the neighbor node
v3s16 n2pos = p + dirs[i]; v3s16 n2pos = p + dirs[i];
u32 n2i = m_area.index(n2pos); u32 n2i = m_area.index(n2pos);
if(m_flags[n2i] & VOXELFLAG_INEXISTENT) if(m_flags[n2i] & VOXELFLAG_NO_DATA)
continue; continue;
MapNode &n2 = m_data[n2i]; MapNode &n2 = m_data[n2i];
/* /*
If the neighbor is dimmer than what was specified If the neighbor is dimmer than what was specified
as oldlight (the light of the previous node) as oldlight (the light of the previous node)
@ -347,9 +342,9 @@ void VoxelManipulator::unspreadLight(enum LightBank bank, v3s16 p, u8 oldlight,
*/ */
n2.setLight(bank, 0, nodemgr); n2.setLight(bank, 0, nodemgr);
unspreadLight(bank, n2pos, light2, light_sources, nodemgr); unspreadLight(bank, n2pos, light2, light_sources, nodemgr);
/* /*
Remove from light_sources if it is there Remove from light_sources if it is there
NOTE: This doesn't happen nearly at all NOTE: This doesn't happen nearly at all
@ -391,7 +386,7 @@ void VoxelManipulator::unspreadLight(enum LightBank bank,
{ {
if(from_nodes.size() == 0) if(from_nodes.size() == 0)
return; return;
for(std::map<v3s16, u8>::iterator j = from_nodes.begin(); for(std::map<v3s16, u8>::iterator j = from_nodes.begin();
j != from_nodes.end(); ++j) j != from_nodes.end(); ++j)
{ {
@ -430,10 +425,10 @@ void VoxelManipulator::unspreadLight(enum LightBank bank,
v3s16(0,-1,0), // bottom v3s16(0,-1,0), // bottom
v3s16(-1,0,0), // left v3s16(-1,0,0), // left
}; };
if(from_nodes.size() == 0) if(from_nodes.size() == 0)
return; return;
core::map<v3s16, u8> unlighted_nodes; core::map<v3s16, u8> unlighted_nodes;
core::map<v3s16, u8>::Iterator j; core::map<v3s16, u8>::Iterator j;
j = from_nodes.getIterator(); j = from_nodes.getIterator();
@ -441,26 +436,26 @@ void VoxelManipulator::unspreadLight(enum LightBank bank,
for(; j.atEnd() == false; j++) for(; j.atEnd() == false; j++)
{ {
v3s16 pos = j.getNode()->getKey(); v3s16 pos = j.getNode()->getKey();
emerge(VoxelArea(pos - v3s16(1,1,1), pos + v3s16(1,1,1))); addArea(VoxelArea(pos - v3s16(1,1,1), pos + v3s16(1,1,1)));
//MapNode &n = m_data[m_area.index(pos)]; //MapNode &n = m_data[m_area.index(pos)];
u8 oldlight = j.getNode()->getValue(); u8 oldlight = j.getNode()->getValue();
// Loop through 6 neighbors // Loop through 6 neighbors
for(u16 i=0; i<6; i++) for(u16 i=0; i<6; i++)
{ {
// Get the position of the neighbor node // Get the position of the neighbor node
v3s16 n2pos = pos + dirs[i]; v3s16 n2pos = pos + dirs[i];
u32 n2i = m_area.index(n2pos); u32 n2i = m_area.index(n2pos);
if(m_flags[n2i] & VOXELFLAG_INEXISTENT) if(m_flags[n2i] & VOXELFLAG_NO_DATA)
continue; continue;
MapNode &n2 = m_data[n2i]; MapNode &n2 = m_data[n2i];
/* /*
If the neighbor is dimmer than what was specified If the neighbor is dimmer than what was specified
as oldlight (the light of the previous node) as oldlight (the light of the previous node)
@ -480,7 +475,7 @@ void VoxelManipulator::unspreadLight(enum LightBank bank,
n2.setLight(bank, 0); n2.setLight(bank, 0);
unlighted_nodes.insert(n2pos, current_light); unlighted_nodes.insert(n2pos, current_light);
/* /*
Remove from light_sources if it is there Remove from light_sources if it is there
NOTE: This doesn't happen nearly at all NOTE: This doesn't happen nearly at all
@ -502,7 +497,7 @@ void VoxelManipulator::unspreadLight(enum LightBank bank,
<<blockchangecount<<" times" <<blockchangecount<<" times"
<<" for "<<from_nodes.size()<<" nodes" <<" for "<<from_nodes.size()<<" nodes"
<<std::endl;*/ <<std::endl;*/
if(unlighted_nodes.size() > 0) if(unlighted_nodes.size() > 0)
unspreadLight(bank, unlighted_nodes, light_sources); unspreadLight(bank, unlighted_nodes, light_sources);
} }
@ -520,11 +515,11 @@ void VoxelManipulator::spreadLight(enum LightBank bank, v3s16 p,
v3s16(-1,0,0), // left v3s16(-1,0,0), // left
}; };
emerge(VoxelArea(p - v3s16(1,1,1), p + v3s16(1,1,1))); addArea(VoxelArea(p - v3s16(1,1,1), p + v3s16(1,1,1)));
u32 i = m_area.index(p); u32 i = m_area.index(p);
if(m_flags[i] & VOXELFLAG_INEXISTENT) if(m_flags[i] & VOXELFLAG_NO_DATA)
return; return;
MapNode &n = m_data[i]; MapNode &n = m_data[i];
@ -537,16 +532,16 @@ void VoxelManipulator::spreadLight(enum LightBank bank, v3s16 p,
{ {
// Get the position of the neighbor node // Get the position of the neighbor node
v3s16 n2pos = p + dirs[i]; v3s16 n2pos = p + dirs[i];
u32 n2i = m_area.index(n2pos); u32 n2i = m_area.index(n2pos);
if(m_flags[n2i] & VOXELFLAG_INEXISTENT) if(m_flags[n2i] & VOXELFLAG_NO_DATA)
continue; continue;
MapNode &n2 = m_data[n2i]; MapNode &n2 = m_data[n2i];
u8 light2 = n2.getLight(bank, nodemgr); u8 light2 = n2.getLight(bank, nodemgr);
/* /*
If the neighbor is brighter than the current node, If the neighbor is brighter than the current node,
add to list (it will light up this node on its turn) add to list (it will light up this node on its turn)
@ -583,7 +578,7 @@ void VoxelManipulator::spreadLight(enum LightBank bank,
{ {
if(from_nodes.size() == 0) if(from_nodes.size() == 0)
return; return;
core::map<v3s16, bool> lighted_nodes; core::map<v3s16, bool> lighted_nodes;
core::map<v3s16, bool>::Iterator j; core::map<v3s16, bool>::Iterator j;
j = from_nodes.getIterator(); j = from_nodes.getIterator();
@ -616,7 +611,7 @@ void VoxelManipulator::spreadLight(enum LightBank bank,
if(from_nodes.size() == 0) if(from_nodes.size() == 0)
return; return;
std::set<v3s16> lighted_nodes; std::set<v3s16> lighted_nodes;
for(std::set<v3s16>::iterator j = from_nodes.begin(); for(std::set<v3s16>::iterator j = from_nodes.begin();
@ -624,11 +619,11 @@ void VoxelManipulator::spreadLight(enum LightBank bank,
{ {
v3s16 pos = *j; v3s16 pos = *j;
emerge(VoxelArea(pos - v3s16(1,1,1), pos + v3s16(1,1,1))); addArea(VoxelArea(pos - v3s16(1,1,1), pos + v3s16(1,1,1)));
u32 i = m_area.index(pos); u32 i = m_area.index(pos);
if(m_flags[i] & VOXELFLAG_INEXISTENT) if(m_flags[i] & VOXELFLAG_NO_DATA)
continue; continue;
MapNode &n = m_data[i]; MapNode &n = m_data[i];
@ -641,18 +636,18 @@ void VoxelManipulator::spreadLight(enum LightBank bank,
{ {
// Get the position of the neighbor node // Get the position of the neighbor node
v3s16 n2pos = pos + dirs[i]; v3s16 n2pos = pos + dirs[i];
try try
{ {
u32 n2i = m_area.index(n2pos); u32 n2i = m_area.index(n2pos);
if(m_flags[n2i] & VOXELFLAG_INEXISTENT) if(m_flags[n2i] & VOXELFLAG_NO_DATA)
continue; continue;
MapNode &n2 = m_data[n2i]; MapNode &n2 = m_data[n2i];
u8 light2 = n2.getLight(bank, nodemgr); u8 light2 = n2.getLight(bank, nodemgr);
/* /*
If the neighbor is brighter than the current node, If the neighbor is brighter than the current node,
add to list (it will light up this node on its turn) add to list (it will light up this node on its turn)
@ -685,7 +680,7 @@ void VoxelManipulator::spreadLight(enum LightBank bank,
<<blockchangecount<<" times" <<blockchangecount<<" times"
<<" for "<<from_nodes.size()<<" nodes" <<" for "<<from_nodes.size()<<" nodes"
<<std::endl;*/ <<std::endl;*/
if(lighted_nodes.size() > 0) if(lighted_nodes.size() > 0)
spreadLight(bank, lighted_nodes, nodemgr); spreadLight(bank, lighted_nodes, nodemgr);
} }

@ -320,10 +320,10 @@ public:
v3s16 MaxEdge; v3s16 MaxEdge;
}; };
// Hasn't been copied from source (emerged) // unused
#define VOXELFLAG_NOT_LOADED (1<<0) #define VOXELFLAG_UNUSED (1<<0)
// Checked as being inexistent in source // no data about that node
#define VOXELFLAG_INEXISTENT (1<<1) #define VOXELFLAG_NO_DATA (1<<1)
// Algorithm-dependent // Algorithm-dependent
#define VOXELFLAG_CHECKED1 (1<<2) #define VOXELFLAG_CHECKED1 (1<<2)
// Algorithm-dependent // Algorithm-dependent
@ -356,8 +356,8 @@ public:
} }
bool isValidPosition(v3s16 p) bool isValidPosition(v3s16 p)
{ {
emerge(p); addArea(p);
return !(m_flags[m_area.index(p)] & VOXELFLAG_INEXISTENT); return !(m_flags[m_area.index(p)] & VOXELFLAG_NO_DATA);
}*/ }*/
/* /*
@ -366,9 +366,9 @@ public:
*/ */
MapNode getNode(v3s16 p) MapNode getNode(v3s16 p)
{ {
emerge(p); addArea(p);
if(m_flags[m_area.index(p)] & VOXELFLAG_INEXISTENT) if(m_flags[m_area.index(p)] & VOXELFLAG_NO_DATA)
{ {
/*dstream<<"EXCEPT: VoxelManipulator::getNode(): " /*dstream<<"EXCEPT: VoxelManipulator::getNode(): "
<<"p=("<<p.X<<","<<p.Y<<","<<p.Z<<")" <<"p=("<<p.X<<","<<p.Y<<","<<p.Z<<")"
@ -383,9 +383,9 @@ public:
} }
MapNode getNodeNoEx(v3s16 p) MapNode getNodeNoEx(v3s16 p)
{ {
emerge(p); addArea(p);
if(m_flags[m_area.index(p)] & VOXELFLAG_INEXISTENT) if(m_flags[m_area.index(p)] & VOXELFLAG_NO_DATA)
{ {
return MapNode(CONTENT_IGNORE); return MapNode(CONTENT_IGNORE);
} }
@ -396,12 +396,12 @@ public:
{ {
if(m_area.contains(p) == false) if(m_area.contains(p) == false)
return MapNode(CONTENT_IGNORE); return MapNode(CONTENT_IGNORE);
if(m_flags[m_area.index(p)] & VOXELFLAG_INEXISTENT) if(m_flags[m_area.index(p)] & VOXELFLAG_NO_DATA)
return MapNode(CONTENT_IGNORE); return MapNode(CONTENT_IGNORE);
return m_data[m_area.index(p)]; return m_data[m_area.index(p)];
} }
// Stuff explodes if non-emerged area is touched with this. // Stuff explodes if non-emerged area is touched with this.
// Emerge first, and check VOXELFLAG_INEXISTENT if appropriate. // Emerge first, and check VOXELFLAG_NO_DATA if appropriate.
MapNode & getNodeRefUnsafe(v3s16 p) MapNode & getNodeRefUnsafe(v3s16 p)
{ {
return m_data[m_area.index(p)]; return m_data[m_area.index(p)];
@ -413,12 +413,12 @@ public:
bool exists(v3s16 p) bool exists(v3s16 p)
{ {
return m_area.contains(p) && return m_area.contains(p) &&
!(getFlagsRefUnsafe(p) & VOXELFLAG_INEXISTENT); !(getFlagsRefUnsafe(p) & VOXELFLAG_NO_DATA);
} }
MapNode & getNodeRef(v3s16 p) MapNode & getNodeRef(v3s16 p)
{ {
emerge(p); addArea(p);
if(getFlagsRefUnsafe(p) & VOXELFLAG_INEXISTENT) if(getFlagsRefUnsafe(p) & VOXELFLAG_NO_DATA)
{ {
/*dstream<<"EXCEPT: VoxelManipulator::getNode(): " /*dstream<<"EXCEPT: VoxelManipulator::getNode(): "
<<"p=("<<p.X<<","<<p.Y<<","<<p.Z<<")" <<"p=("<<p.X<<","<<p.Y<<","<<p.Z<<")"
@ -432,11 +432,10 @@ public:
} }
void setNode(v3s16 p, const MapNode &n) void setNode(v3s16 p, const MapNode &n)
{ {
emerge(p); addArea(p);
m_data[m_area.index(p)] = n; m_data[m_area.index(p)] = n;
m_flags[m_area.index(p)] &= ~VOXELFLAG_INEXISTENT; m_flags[m_area.index(p)] &= ~VOXELFLAG_NO_DATA;
m_flags[m_area.index(p)] &= ~VOXELFLAG_NOT_LOADED;
} }
// TODO: Should be removed and replaced with setNode // TODO: Should be removed and replaced with setNode
void setNodeNoRef(v3s16 p, const MapNode &n) void setNodeNoRef(v3s16 p, const MapNode &n)
@ -446,12 +445,12 @@ public:
/*void setExists(VoxelArea a) /*void setExists(VoxelArea a)
{ {
emerge(a); addArea(a);
for(s32 z=a.MinEdge.Z; z<=a.MaxEdge.Z; z++) for(s32 z=a.MinEdge.Z; z<=a.MaxEdge.Z; z++)
for(s32 y=a.MinEdge.Y; y<=a.MaxEdge.Y; y++) for(s32 y=a.MinEdge.Y; y<=a.MaxEdge.Y; y++)
for(s32 x=a.MinEdge.X; x<=a.MaxEdge.X; x++) for(s32 x=a.MinEdge.X; x<=a.MaxEdge.X; x++)
{ {
m_flags[m_area.index(x,y,z)] &= ~VOXELFLAG_INEXISTENT; m_flags[m_area.index(x,y,z)] &= ~VOXELFLAG_NO_DATA;
} }
}*/ }*/
@ -459,7 +458,7 @@ public:
{ {
//dstream<<"operator[] p=("<<p.X<<","<<p.Y<<","<<p.Z<<")"<<std::endl; //dstream<<"operator[] p=("<<p.X<<","<<p.Y<<","<<p.Z<<")"<<std::endl;
if(isValidPosition(p) == false) if(isValidPosition(p) == false)
emerge(VoxelArea(p)); addArea(VoxelArea(p));
return m_data[m_area.index(p)]; return m_data[m_area.index(p)];
}*/ }*/
@ -506,11 +505,11 @@ public:
Copy data and set flags to 0 Copy data and set flags to 0
dst_area.getExtent() <= src_area.getExtent() dst_area.getExtent() <= src_area.getExtent()
*/ */
void copyFrom(MapNode *src, VoxelArea src_area, void copyFrom(MapNode *src, const VoxelArea& src_area,
v3s16 from_pos, v3s16 to_pos, v3s16 size); v3s16 from_pos, v3s16 to_pos, v3s16 size);
// Copy data // Copy data
void copyTo(MapNode *dst, VoxelArea dst_area, void copyTo(MapNode *dst, const VoxelArea& dst_area,
v3s16 dst_pos, v3s16 from_pos, v3s16 size); v3s16 dst_pos, v3s16 from_pos, v3s16 size);
/* /*
@ -535,29 +534,6 @@ public:
Virtual functions Virtual functions
*/ */
/*
Get the contents of the requested area from somewhere.
Shall touch only nodes that have VOXELFLAG_NOT_LOADED
Shall reset VOXELFLAG_NOT_LOADED
If not found from source, add with VOXELFLAG_INEXISTENT
*/
virtual void emerge(VoxelArea a, s32 caller_id=-1)
{
//dstream<<"emerge p=("<<p.X<<","<<p.Y<<","<<p.Z<<")"<<std::endl;
addArea(a);
for(s32 z=a.MinEdge.Z; z<=a.MaxEdge.Z; z++)
for(s32 y=a.MinEdge.Y; y<=a.MaxEdge.Y; y++)
for(s32 x=a.MinEdge.X; x<=a.MaxEdge.X; x++)
{
s32 i = m_area.index(x,y,z);
// Don't touch nodes that have already been loaded
if(!(m_flags[i] & VOXELFLAG_NOT_LOADED))
continue;
m_flags[i] = VOXELFLAG_INEXISTENT;
}
}
/* /*
Member variables Member variables
*/ */

@ -46,7 +46,7 @@ void clearLightAndCollectSources(VoxelManipulator &v, VoxelArea a,
VoxelArea required_a = a; VoxelArea required_a = a;
required_a.pad(v3s16(0,0,0)); required_a.pad(v3s16(0,0,0));
// Make sure we have access to it // Make sure we have access to it
v.emerge(a); v.addArea(a);
for(s32 x=a.MinEdge.X; x<=a.MaxEdge.X; x++) for(s32 x=a.MinEdge.X; x<=a.MaxEdge.X; x++)
for(s32 z=a.MinEdge.Z; z<=a.MaxEdge.Z; z++) for(s32 z=a.MinEdge.Z; z<=a.MaxEdge.Z; z++)
@ -85,7 +85,7 @@ SunlightPropagateResult propagateSunlight(VoxelManipulator &v, VoxelArea a,
VoxelArea required_a = a; VoxelArea required_a = a;
required_a.pad(v3s16(0,1,0)); required_a.pad(v3s16(0,1,0));
// Make sure we have access to it // Make sure we have access to it
v.emerge(a); v.addArea(a);
s16 max_y = a.MaxEdge.Y; s16 max_y = a.MaxEdge.Y;
s16 min_y = a.MinEdge.Y; s16 min_y = a.MinEdge.Y;