mirror of
https://github.com/luanti-org/luanti.git
synced 2025-06-27 16:36:03 +00:00
Light calculation: New bulk node lighting code
This commit introduces a new bulk node lighting algorithm to minimize lighting bugs during l-system tree generation, schematic placement and non-mapgen-object lua voxelmanip light calculation. If the block above the changed area is not loaded, it gets loaded to avoid lighting bugs. Light is updated as soon as write_to_map is called on a voxel manipulator, therefore update_map does nothing.
This commit is contained in:
parent
d785456b3f
commit
ab371cc934
10 changed files with 408 additions and 636 deletions
|
@ -1357,7 +1357,9 @@ int ModApiMapgen::l_place_schematic(lua_State *L)
|
|||
{
|
||||
MAP_LOCK_REQUIRED;
|
||||
|
||||
Map *map = &(getEnv(L)->getMap());
|
||||
GET_ENV_PTR;
|
||||
|
||||
ServerMap *map = &(env->getServerMap());
|
||||
SchematicManager *schemmgr = getServer(L)->getEmergeManager()->schemmgr;
|
||||
|
||||
//// Read position
|
||||
|
|
|
@ -27,6 +27,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
|
|||
#include "map.h"
|
||||
#include "server.h"
|
||||
#include "mapgen.h"
|
||||
#include "voxelalgorithms.h"
|
||||
|
||||
// garbage collector
|
||||
int LuaVoxelManip::gc_object(lua_State *L)
|
||||
|
@ -109,10 +110,24 @@ int LuaVoxelManip::l_write_to_map(lua_State *L)
|
|||
MAP_LOCK_REQUIRED;
|
||||
|
||||
LuaVoxelManip *o = checkobject(L, 1);
|
||||
MMVManip *vm = o->vm;
|
||||
GET_ENV_PTR;
|
||||
ServerMap *map = &(env->getServerMap());
|
||||
if (o->is_mapgen_vm) {
|
||||
o->vm->blitBackAll(&(o->modified_blocks));
|
||||
} else {
|
||||
voxalgo::blit_back_with_light(map, o->vm,
|
||||
&(o->modified_blocks));
|
||||
}
|
||||
|
||||
vm->blitBackAll(&o->modified_blocks);
|
||||
MapEditEvent event;
|
||||
event.type = MEET_OTHER;
|
||||
for (std::map<v3s16, MapBlock *>::iterator it = o->modified_blocks.begin();
|
||||
it != o->modified_blocks.end(); ++it)
|
||||
event.modified_blocks.insert(it->first);
|
||||
|
||||
map->dispatchEvent(&event);
|
||||
|
||||
o->modified_blocks.clear();
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -322,33 +337,6 @@ int LuaVoxelManip::l_set_param2_data(lua_State *L)
|
|||
|
||||
int LuaVoxelManip::l_update_map(lua_State *L)
|
||||
{
|
||||
GET_ENV_PTR;
|
||||
|
||||
LuaVoxelManip *o = checkobject(L, 1);
|
||||
if (o->is_mapgen_vm)
|
||||
return 0;
|
||||
|
||||
Map *map = &(env->getMap());
|
||||
|
||||
// TODO: Optimize this by using Mapgen::calcLighting() instead
|
||||
std::map<v3s16, MapBlock *> lighting_mblocks;
|
||||
std::map<v3s16, MapBlock *> *mblocks = &o->modified_blocks;
|
||||
|
||||
lighting_mblocks.insert(mblocks->begin(), mblocks->end());
|
||||
|
||||
map->updateLighting(lighting_mblocks, *mblocks);
|
||||
|
||||
MapEditEvent event;
|
||||
event.type = MEET_OTHER;
|
||||
for (std::map<v3s16, MapBlock *>::iterator
|
||||
it = mblocks->begin();
|
||||
it != mblocks->end(); ++it)
|
||||
event.modified_blocks.insert(it->first);
|
||||
|
||||
map->dispatchEvent(&event);
|
||||
|
||||
mblocks->clear();
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue