mirror of
https://github.com/minetest/minetest.git
synced 2024-11-04 23:03:46 +01:00
Update Mapgen VoxelManipulator on buffer invalidation
This commit is contained in:
parent
3fa4f782d9
commit
9e4e7072da
@ -2099,6 +2099,8 @@ methods:
|
|||||||
^ To be used only by a VoxelManip object from minetest.get_mapgen_object
|
^ To be used only by a VoxelManip object from minetest.get_mapgen_object
|
||||||
^ (p1, p2) is the area in which lighting is set; defaults to the whole area if left out
|
^ (p1, p2) is the area in which lighting is set; defaults to the whole area if left out
|
||||||
- update_liquids(): Update liquid flow
|
- update_liquids(): Update liquid flow
|
||||||
|
- was_modified(): Returns true or false if the data in the voxel manipulator had been modified since
|
||||||
|
the last read from map, due to a call to minetest.set_data() on the loaded area elsewhere
|
||||||
|
|
||||||
VoxelArea: A helper class for voxel areas
|
VoxelArea: A helper class for voxel areas
|
||||||
- Can be created via VoxelArea:new{MinEdge=pmin, MaxEdge=pmax}
|
- Can be created via VoxelArea:new{MinEdge=pmin, MaxEdge=pmax}
|
||||||
|
@ -778,19 +778,26 @@ bool ServerEnvironment::setNode(v3s16 p, const MapNode &n)
|
|||||||
{
|
{
|
||||||
INodeDefManager *ndef = m_gamedef->ndef();
|
INodeDefManager *ndef = m_gamedef->ndef();
|
||||||
MapNode n_old = m_map->getNodeNoEx(p);
|
MapNode n_old = m_map->getNodeNoEx(p);
|
||||||
|
|
||||||
// Call destructor
|
// Call destructor
|
||||||
if (ndef->get(n_old).has_on_destruct)
|
if (ndef->get(n_old).has_on_destruct)
|
||||||
m_script->node_on_destruct(p, n_old);
|
m_script->node_on_destruct(p, n_old);
|
||||||
|
|
||||||
// Replace node
|
// Replace node
|
||||||
bool succeeded = m_map->addNodeWithEvent(p, n);
|
if (!m_map->addNodeWithEvent(p, n))
|
||||||
if(!succeeded)
|
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
|
// Update active VoxelManipulator if a mapgen thread
|
||||||
|
m_map->updateVManip(p);
|
||||||
|
|
||||||
// Call post-destructor
|
// Call post-destructor
|
||||||
if (ndef->get(n_old).has_after_destruct)
|
if (ndef->get(n_old).has_after_destruct)
|
||||||
m_script->node_after_destruct(p, n_old);
|
m_script->node_after_destruct(p, n_old);
|
||||||
|
|
||||||
// Call constructor
|
// Call constructor
|
||||||
if (ndef->get(n).has_on_construct)
|
if (ndef->get(n).has_on_construct)
|
||||||
m_script->node_on_construct(p, n);
|
m_script->node_on_construct(p, n);
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -798,24 +805,36 @@ bool ServerEnvironment::removeNode(v3s16 p)
|
|||||||
{
|
{
|
||||||
INodeDefManager *ndef = m_gamedef->ndef();
|
INodeDefManager *ndef = m_gamedef->ndef();
|
||||||
MapNode n_old = m_map->getNodeNoEx(p);
|
MapNode n_old = m_map->getNodeNoEx(p);
|
||||||
|
|
||||||
// Call destructor
|
// Call destructor
|
||||||
if (ndef->get(n_old).has_on_destruct)
|
if (ndef->get(n_old).has_on_destruct)
|
||||||
m_script->node_on_destruct(p, n_old);
|
m_script->node_on_destruct(p, n_old);
|
||||||
|
|
||||||
// Replace with air
|
// Replace with air
|
||||||
// This is slightly optimized compared to addNodeWithEvent(air)
|
// This is slightly optimized compared to addNodeWithEvent(air)
|
||||||
bool succeeded = m_map->removeNodeWithEvent(p);
|
if (!m_map->removeNodeWithEvent(p))
|
||||||
if(!succeeded)
|
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
|
// Update active VoxelManipulator if a mapgen thread
|
||||||
|
m_map->updateVManip(p);
|
||||||
|
|
||||||
// Call post-destructor
|
// Call post-destructor
|
||||||
if (ndef->get(n_old).has_after_destruct)
|
if (ndef->get(n_old).has_after_destruct)
|
||||||
m_script->node_after_destruct(p, n_old);
|
m_script->node_after_destruct(p, n_old);
|
||||||
|
|
||||||
// Air doesn't require constructor
|
// Air doesn't require constructor
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool ServerEnvironment::swapNode(v3s16 p, const MapNode &n)
|
bool ServerEnvironment::swapNode(v3s16 p, const MapNode &n)
|
||||||
{
|
{
|
||||||
return m_map->addNodeWithEvent(p, n, false);
|
if (!m_map->addNodeWithEvent(p, n, false))
|
||||||
|
return false;
|
||||||
|
|
||||||
|
// Update active VoxelManipulator if a mapgen thread
|
||||||
|
m_map->updateVManip(p);
|
||||||
|
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
std::set<u16> ServerEnvironment::getObjectsInsideRadius(v3f pos, float radius)
|
std::set<u16> ServerEnvironment::getObjectsInsideRadius(v3f pos, float radius)
|
||||||
|
25
src/map.cpp
25
src/map.cpp
@ -2757,6 +2757,28 @@ MapBlock *ServerMap::getBlockOrEmerge(v3s16 p3d)
|
|||||||
void ServerMap::prepareBlock(MapBlock *block) {
|
void ServerMap::prepareBlock(MapBlock *block) {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// N.B. This requires no synchronization, since data will not be modified unless
|
||||||
|
// the VoxelManipulator being updated belongs to the same thread.
|
||||||
|
void ServerMap::updateVManip(v3s16 pos)
|
||||||
|
{
|
||||||
|
Mapgen *mg = m_emerge->getCurrentMapgen();
|
||||||
|
if (!mg)
|
||||||
|
return;
|
||||||
|
|
||||||
|
ManualMapVoxelManipulator *vm = mg->vm;
|
||||||
|
if (!vm)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (!vm->m_area.contains(pos))
|
||||||
|
return;
|
||||||
|
|
||||||
|
s32 idx = vm->m_area.index(pos);
|
||||||
|
vm->m_data[idx] = getNodeNoEx(pos);
|
||||||
|
vm->m_flags[idx] &= ~VOXELFLAG_NO_DATA;
|
||||||
|
|
||||||
|
vm->m_is_dirty = true;
|
||||||
|
}
|
||||||
|
|
||||||
s16 ServerMap::findGroundLevel(v2s16 p2d)
|
s16 ServerMap::findGroundLevel(v2s16 p2d)
|
||||||
{
|
{
|
||||||
#if 0
|
#if 0
|
||||||
@ -3523,6 +3545,7 @@ void ServerMap::PrintInfo(std::ostream &out)
|
|||||||
|
|
||||||
ManualMapVoxelManipulator::ManualMapVoxelManipulator(Map *map):
|
ManualMapVoxelManipulator::ManualMapVoxelManipulator(Map *map):
|
||||||
VoxelManipulator(),
|
VoxelManipulator(),
|
||||||
|
m_is_dirty(false),
|
||||||
m_create_area(false),
|
m_create_area(false),
|
||||||
m_map(map)
|
m_map(map)
|
||||||
{
|
{
|
||||||
@ -3617,6 +3640,8 @@ void ManualMapVoxelManipulator::initialEmerge(v3s16 blockpos_min,
|
|||||||
|
|
||||||
m_loaded_blocks[p] = flags;
|
m_loaded_blocks[p] = flags;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
m_is_dirty = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
void ManualMapVoxelManipulator::blitBackAll(
|
void ManualMapVoxelManipulator::blitBackAll(
|
||||||
|
@ -493,6 +493,8 @@ public:
|
|||||||
// Database version
|
// Database version
|
||||||
void loadBlock(std::string *blob, v3s16 p3d, MapSector *sector, bool save_after_load=false);
|
void loadBlock(std::string *blob, v3s16 p3d, MapSector *sector, bool save_after_load=false);
|
||||||
|
|
||||||
|
void updateVManip(v3s16 pos);
|
||||||
|
|
||||||
// For debug printing
|
// For debug printing
|
||||||
virtual void PrintInfo(std::ostream &out);
|
virtual void PrintInfo(std::ostream &out);
|
||||||
|
|
||||||
@ -550,6 +552,8 @@ public:
|
|||||||
void blitBackAll(std::map<v3s16, MapBlock*> * modified_blocks,
|
void blitBackAll(std::map<v3s16, MapBlock*> * modified_blocks,
|
||||||
bool overwrite_generated = true);
|
bool overwrite_generated = true);
|
||||||
|
|
||||||
|
bool m_is_dirty;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
bool m_create_area;
|
bool m_create_area;
|
||||||
Map *m_map;
|
Map *m_map;
|
||||||
|
@ -304,6 +304,18 @@ int LuaVoxelManip::l_update_map(lua_State *L)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int LuaVoxelManip::l_was_modified(lua_State *L)
|
||||||
|
{
|
||||||
|
NO_MAP_LOCK_REQUIRED;
|
||||||
|
|
||||||
|
LuaVoxelManip *o = checkobject(L, 1);
|
||||||
|
ManualMapVoxelManipulator *vm = o->vm;
|
||||||
|
|
||||||
|
lua_pushboolean(L, vm->m_is_dirty);
|
||||||
|
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
LuaVoxelManip::LuaVoxelManip(ManualMapVoxelManipulator *mmvm, bool is_mg_vm)
|
LuaVoxelManip::LuaVoxelManip(ManualMapVoxelManipulator *mmvm, bool is_mg_vm)
|
||||||
{
|
{
|
||||||
this->vm = mmvm;
|
this->vm = mmvm;
|
||||||
@ -396,5 +408,6 @@ const luaL_reg LuaVoxelManip::methods[] = {
|
|||||||
luamethod(LuaVoxelManip, set_light_data),
|
luamethod(LuaVoxelManip, set_light_data),
|
||||||
luamethod(LuaVoxelManip, get_param2_data),
|
luamethod(LuaVoxelManip, get_param2_data),
|
||||||
luamethod(LuaVoxelManip, set_param2_data),
|
luamethod(LuaVoxelManip, set_param2_data),
|
||||||
|
luamethod(LuaVoxelManip, was_modified),
|
||||||
{0,0}
|
{0,0}
|
||||||
};
|
};
|
||||||
|
@ -58,6 +58,8 @@ private:
|
|||||||
static int l_get_param2_data(lua_State *L);
|
static int l_get_param2_data(lua_State *L);
|
||||||
static int l_set_param2_data(lua_State *L);
|
static int l_set_param2_data(lua_State *L);
|
||||||
|
|
||||||
|
static int l_was_modified(lua_State *L);
|
||||||
|
|
||||||
public:
|
public:
|
||||||
LuaVoxelManip(ManualMapVoxelManipulator *mmvm, bool is_mapgen_vm);
|
LuaVoxelManip(ManualMapVoxelManipulator *mmvm, bool is_mapgen_vm);
|
||||||
LuaVoxelManip(Map *map);
|
LuaVoxelManip(Map *map);
|
||||||
|
Loading…
Reference in New Issue
Block a user