summaryrefslogtreecommitdiff
path: root/src/map.cpp
diff options
context:
space:
mode:
authorPerttu Ahola <celeron55@gmail.com>2011-01-24 16:36:58 +0200
committerPerttu Ahola <celeron55@gmail.com>2011-01-24 16:36:58 +0200
commit3909e712a012c11793effc408fd348e438a9ac5b (patch)
tree237daebc0dd1e7053af50962d01d05a5630cff8e /src/map.cpp
parent87554408ca667bfb86a6472d4835a893e457c0ba (diff)
downloadminetest-3909e712a012c11793effc408fd348e438a9ac5b.tar.gz
minetest-3909e712a012c11793effc408fd348e438a9ac5b.tar.bz2
minetest-3909e712a012c11793effc408fd348e438a9ac5b.zip
Faster lighting at map generation time
Diffstat (limited to 'src/map.cpp')
-rw-r--r--src/map.cpp141
1 files changed, 134 insertions, 7 deletions
diff --git a/src/map.cpp b/src/map.cpp
index 09fb154aa..bbcc0f36f 100644
--- a/src/map.cpp
+++ b/src/map.cpp
@@ -622,10 +622,13 @@ void Map::updateLighting(enum LightBank bank,
core::map<v3s16, MapBlock*> & modified_blocks)
{
/*m_dout<<DTIME<<"Map::updateLighting(): "
- <<a_blocks.getSize()<<" blocks... ";*/
+ <<a_blocks.size()<<" blocks."<<std::endl;*/
+
+ //TimeTaker timer("updateLighting");
// For debugging
- bool debug=false;
+ bool debug=true;
+
u32 count_was = modified_blocks.size();
core::map<v3s16, bool> light_sources;
@@ -720,9 +723,10 @@ void Map::updateLighting(enum LightBank bank,
}
}
-
+
+#if 0
{
- //TimeTaker timer("unspreadLight");
+ TimeTaker timer("unspreadLight");
unspreadLight(bank, unlight_from, light_sources, modified_blocks);
}
@@ -741,7 +745,7 @@ void Map::updateLighting(enum LightBank bank,
// - Find out why it works
{
- //TimeTaker timer("spreadLight");
+ TimeTaker timer("spreadLight");
spreadLight(bank, light_sources, modified_blocks);
}
@@ -751,6 +755,36 @@ void Map::updateLighting(enum LightBank bank,
count_was = modified_blocks.size();
dstream<<"spreadLight modified "<<diff<<std::endl;
}
+#endif
+
+ {
+ //MapVoxelManipulator vmanip(this);
+
+ ManualMapVoxelManipulator vmanip(this);
+
+ core::map<v3s16, MapBlock*>::Iterator i;
+ i = a_blocks.getIterator();
+ for(; i.atEnd() == false; i++)
+ {
+ MapBlock *block = i.getNode()->getValue();
+ v3s16 p = block->getPos();
+ vmanip.initialEmerge(p - v3s16(1,1,1), p + v3s16(1,1,1));
+ }
+ {
+ //TimeTaker timer("unSpreadLight");
+ vmanip.unspreadLight(bank, unlight_from, light_sources);
+ }
+ {
+ //TimeTaker timer("spreadLight");
+ vmanip.spreadLight(bank, light_sources);
+ }
+ {
+ //TimeTaker timer("blitBack");
+ vmanip.blitBack(modified_blocks);
+ }
+ /*dstream<<"emerge_time="<<emerge_time<<std::endl;
+ emerge_time = 0;*/
+ }
//m_dout<<"Done ("<<getTimestamp()<<")"<<std::endl;
}
@@ -2220,7 +2254,8 @@ MapBlock * ServerMap::emergeBlock(
}
//dstream<<"Not found on disk, generating."<<std::endl;
- //TimeTaker("emergeBlock()", g_irrlicht);
+ // 0ms
+ //TimeTaker("emergeBlock() generate");
/*
Do not generate over-limit
@@ -4138,7 +4173,10 @@ void MapVoxelManipulator::emerge(VoxelArea a, s32 caller_id)
#endif
#if 0
-void MapVoxelManipulator::emerge(VoxelArea a)
+/*
+ NOTE: This is slow
+*/
+void MapVoxelManipulator::emerge(VoxelArea a, s32 caller_id)
{
TimeTaker timer1("emerge", &emerge_time);
@@ -4185,6 +4223,9 @@ void MapVoxelManipulator::blitBack
return;
//TimeTaker timer1("blitBack");
+
+ /*dstream<<"blitBack(): m_loaded_blocks.size()="
+ <<m_loaded_blocks.size()<<std::endl;*/
/*
Initialize block cache
@@ -4241,4 +4282,90 @@ void MapVoxelManipulator::blitBack
}
}
+ManualMapVoxelManipulator::ManualMapVoxelManipulator(Map *map):
+ MapVoxelManipulator(map)
+{
+}
+
+ManualMapVoxelManipulator::~ManualMapVoxelManipulator()
+{
+}
+
+void ManualMapVoxelManipulator::emerge(VoxelArea a, s32 caller_id)
+{
+ // Just create the area to avoid segfaults
+ VoxelManipulator::emerge(a, caller_id);
+
+ /*
+ Just create the area to avoid segfaults
+ */
+ /*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;
+ }*/
+}
+
+void ManualMapVoxelManipulator::initialEmerge(
+ v3s16 blockpos_min, v3s16 blockpos_max)
+{
+ TimeTaker timer1("emerge", &emerge_time);
+
+ // Units of these are MapBlocks
+ v3s16 p_min = blockpos_min;
+ v3s16 p_max = blockpos_max;
+
+ 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);
+
+ 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, true);
+ }
+}
+
//END