mirror of
https://github.com/luanti-org/luanti.git
synced 2025-06-27 16:36:03 +00:00
Faster lighting at map generation time
This commit is contained in:
parent
87554408ca
commit
3909e712a0
8 changed files with 605 additions and 33 deletions
141
src/map.cpp
141
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
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue