From 3909e712a012c11793effc408fd348e438a9ac5b Mon Sep 17 00:00:00 2001 From: Perttu Ahola Date: Mon, 24 Jan 2011 16:36:58 +0200 Subject: Faster lighting at map generation time --- src/map.cpp | 141 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 134 insertions(+), 7 deletions(-) (limited to 'src/map.cpp') 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 & modified_blocks) { /*m_dout< 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 "<::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="<::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 -- cgit v1.2.3