-/*
- MapVoxelManipulator
-*/
-
-MapVoxelManipulator::MapVoxelManipulator(Map *map)
-{
- m_map = map;
-}
-
-MapVoxelManipulator::~MapVoxelManipulator()
-{
- /*infostream<<"MapVoxelManipulator: blocks: "<<m_loaded_blocks.size()
- <<std::endl;*/
-}
-
-void MapVoxelManipulator::emerge(VoxelArea a, s32 caller_id)
-{
- TimeTaker timer1("emerge", &emerge_time);
-
- // Units of these are MapBlocks
- v3s16 p_min = getNodeBlockPos(a.MinEdge);
- v3s16 p_max = getNodeBlockPos(a.MaxEdge);
-
- VoxelArea block_area_nodes
- (p_min*MAP_BLOCKSIZE, (p_max+1)*MAP_BLOCKSIZE-v3s16(1,1,1));
-
- addArea(block_area_nodes);
-
- for(s32 z=p_min.Z; z<=p_max.Z; z++)
- for(s32 y=p_min.Y; y<=p_max.Y; y++)
- for(s32 x=p_min.X; x<=p_max.X; x++)
- {
- v3s16 p(x,y,z);
- core::map<v3s16, bool>::Node *n;
- n = m_loaded_blocks.find(p);
- if(n != NULL)
- continue;
-
- bool block_data_inexistent = false;
- try
- {
- TimeTaker timer1("emerge load", &emerge_load_time);
-
- /*infostream<<"Loading block (caller_id="<<caller_id<<")"
- <<" ("<<p.X<<","<<p.Y<<","<<p.Z<<")"
- <<" wanted area: ";
- a.print(infostream);
- infostream<<std::endl;*/
-
- MapBlock *block = m_map->getBlockNoCreate(p);
- if(block->isDummy())
- block_data_inexistent = true;
- else
- block->copyTo(*this);
- }
- catch(InvalidPositionException &e)
- {
- block_data_inexistent = true;
- }
-
- if(block_data_inexistent)
- {
- VoxelArea a(p*MAP_BLOCKSIZE, (p+1)*MAP_BLOCKSIZE-v3s16(1,1,1));
- // Fill with VOXELFLAG_INEXISTENT
- for(s32 z=a.MinEdge.Z; z<=a.MaxEdge.Z; z++)
- for(s32 y=a.MinEdge.Y; y<=a.MaxEdge.Y; y++)
- {
- s32 i = m_area.index(a.MinEdge.X,y,z);
- memset(&m_flags[i], VOXELFLAG_INEXISTENT, MAP_BLOCKSIZE);
- }
- }
-
- m_loaded_blocks.insert(p, !block_data_inexistent);
- }
-
- //infostream<<"emerge done"<<std::endl;
-}
-
-/*
- SUGG: Add an option to only update eg. water and air nodes.
- This will make it interfere less with important stuff if
- run on background.
-*/
-void MapVoxelManipulator::blitBack
- (core::map<v3s16, MapBlock*> & modified_blocks)
-{
- if(m_area.getExtent() == v3s16(0,0,0))
- return;
-
- //TimeTaker timer1("blitBack");
-
- /*infostream<<"blitBack(): m_loaded_blocks.size()="
- <<m_loaded_blocks.size()<<std::endl;*/
-
- /*
- Initialize block cache
- */
- v3s16 blockpos_last;
- MapBlock *block = NULL;
- bool block_checked_in_modified = false;
-
- 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 x=m_area.MinEdge.X; x<=m_area.MaxEdge.X; x++)
- {
- v3s16 p(x,y,z);
-
- u8 f = m_flags[m_area.index(p)];
- if(f & (VOXELFLAG_NOT_LOADED|VOXELFLAG_INEXISTENT))
- continue;
-
- MapNode &n = m_data[m_area.index(p)];
-
- v3s16 blockpos = getNodeBlockPos(p);
-
- try
- {
- // Get block
- if(block == NULL || blockpos != blockpos_last){
- block = m_map->getBlockNoCreate(blockpos);
- blockpos_last = blockpos;
- block_checked_in_modified = false;
- }
-
- // Calculate relative position in block
- v3s16 relpos = p - blockpos * MAP_BLOCKSIZE;
-
- // Don't continue if nothing has changed here
- if(block->getNode(relpos) == n)
- continue;
-
- //m_map->setNode(m_area.MinEdge + p, n);
- block->setNode(relpos, n);
-
- /*
- Make sure block is in modified_blocks
- */
- if(block_checked_in_modified == false)
- {
- modified_blocks[blockpos] = block;
- block_checked_in_modified = true;
- }
- }
- catch(InvalidPositionException &e)
- {
- }
- }
-}
-