From 8334100fe1b1bb40bfebff9ec9780c18fe3fd0c7 Mon Sep 17 00:00:00 2001 From: kwolekr Date: Sat, 27 Dec 2014 23:09:36 -0500 Subject: [PATCH] LuaVoxelManip: Add option to allocate blank data --- doc/lua_api.txt | 4 ++++ src/map.cpp | 25 ++++++++++++++++++++++++- src/map.h | 6 ++++-- src/script/lua_api/l_env.cpp | 7 +++++++ src/script/lua_api/l_vmanip.cpp | 18 ++++++++++++++++++ src/script/lua_api/l_vmanip.h | 4 +++- 6 files changed, 60 insertions(+), 4 deletions(-) diff --git a/doc/lua_api.txt b/doc/lua_api.txt index be17bb288..0ceac1fca 100644 --- a/doc/lua_api.txt +++ b/doc/lua_api.txt @@ -1594,6 +1594,8 @@ minetest.get_perlin(seeddiff, octaves, persistence, scale) ^ Return world-specific perlin noise (int(worldseed)+seeddiff) minetest.get_voxel_manip() ^ Return voxel manipulator object +minetest.get_voxel_manip(p1, p2) +^ Return voxel manipulator object with blank data preallocated minetest.set_gen_notify(flags, {deco_ids}) ^ Set the types of on-generate notifications that should be collected ^ flags is a flag field with the available flags: @@ -2192,6 +2194,7 @@ methods: VoxelManip: An interface to the MapVoxelManipulator for Lua - Can be created via VoxelManip() - Also minetest.get_voxel_manip() +- Specify a pmin, pmax in either to allocate a blank chunk of data prefilled with cignore methods: - read_from_map(p1, p2): Reads a chunk of map from the map containing the region formed by p1 and p2. ^ returns actual emerged pmin, actual emerged pmax @@ -2223,6 +2226,7 @@ methods: - 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 +- get_emerged_area(): Returns actual emerged pmin, actual emerged pmax VoxelArea: A helper class for voxel areas - Can be created via VoxelArea:new{MinEdge=pmin, MaxEdge=pmax} diff --git a/src/map.cpp b/src/map.cpp index fde5b585d..05e07212d 100644 --- a/src/map.cpp +++ b/src/map.cpp @@ -3597,8 +3597,31 @@ ManualMapVoxelManipulator::~ManualMapVoxelManipulator() { } +void ManualMapVoxelManipulator::initializeBlank(v3s16 blockpos_min, + v3s16 blockpos_max) +{ + // Units of these are MapBlocks + v3s16 pmin = blockpos_min; + v3s16 pmax = blockpos_max; + + VoxelArea block_area_nodes(pmin * MAP_BLOCKSIZE, + (pmax + 1) * MAP_BLOCKSIZE - v3s16(1,1,1)); + + addArea(block_area_nodes); + u32 extent = m_area.getVolume(); + for (u32 i = 0; i != extent; i++) + m_data[i] = MapNode(CONTENT_IGNORE); + + for (s32 z = pmin.Z; z <= pmax.Z; z++) + for (s32 y = pmin.Y; y <= pmax.Y; y++) + for (s32 x = pmin.X; x <= pmax.X; x++) + m_loaded_blocks[v3s16(x, y, z)] = 0; + + m_is_dirty = false; +} + void ManualMapVoxelManipulator::initialEmerge(v3s16 blockpos_min, - v3s16 blockpos_max, bool load_if_inexistent) + v3s16 blockpos_max, bool load_if_inexistent) { TimeTaker timer1("initialEmerge", &emerge_time); diff --git a/src/map.h b/src/map.h index 70082d664..57edd7708 100644 --- a/src/map.h +++ b/src/map.h @@ -550,12 +550,14 @@ public: void setMap(Map *map) {m_map = map;} + void initializeBlank(v3s16 pmin, v3s16 pmax); + void initialEmerge(v3s16 blockpos_min, v3s16 blockpos_max, - bool load_if_inexistent = true); + bool load_if_inexistent = true); // This is much faster with big chunks of generated data void blitBackAll(std::map * modified_blocks, - bool overwrite_generated = true); + bool overwrite_generated = true); bool m_is_dirty; diff --git a/src/script/lua_api/l_env.cpp b/src/script/lua_api/l_env.cpp index 3d2e20424..9e713b9b8 100644 --- a/src/script/lua_api/l_env.cpp +++ b/src/script/lua_api/l_env.cpp @@ -638,6 +638,13 @@ int ModApiEnvMod::l_get_voxel_manip(lua_State *L) Map *map = &(env->getMap()); LuaVoxelManip *o = new LuaVoxelManip(map); + if (lua_istable(L, 1) && lua_istable(L, 2)) { + v3s16 p1 = getNodeBlockPos(read_v3s16(L, 1)); + v3s16 p2 = getNodeBlockPos(read_v3s16(L, 2)); + sortBoxVerticies(p1, p2); + o->vm->initializeBlank(p1, p2); + } + *(void **)(lua_newuserdata(L, sizeof(void *))) = o; luaL_getmetatable(L, "VoxelManip"); lua_setmetatable(L, -2); diff --git a/src/script/lua_api/l_vmanip.cpp b/src/script/lua_api/l_vmanip.cpp index 554a57343..fb52aa21a 100644 --- a/src/script/lua_api/l_vmanip.cpp +++ b/src/script/lua_api/l_vmanip.cpp @@ -345,6 +345,16 @@ int LuaVoxelManip::l_was_modified(lua_State *L) return 1; } +int LuaVoxelManip::l_get_emerged_area(lua_State *L) +{ + LuaVoxelManip *o = checkobject(L, 1); + + push_v3s16(L, o->vm->m_area.MinEdge); + push_v3s16(L, o->vm->m_area.MaxEdge); + + return 2; +} + LuaVoxelManip::LuaVoxelManip(ManualMapVoxelManipulator *mmvm, bool is_mg_vm) { this->vm = mmvm; @@ -376,6 +386,13 @@ int LuaVoxelManip::create_object(lua_State *L) Map *map = &(env->getMap()); LuaVoxelManip *o = new LuaVoxelManip(map); + if (lua_istable(L, 1) && lua_istable(L, 2)) { + v3s16 p1 = getNodeBlockPos(read_v3s16(L, 1)); + v3s16 p2 = getNodeBlockPos(read_v3s16(L, 2)); + sortBoxVerticies(p1, p2); + o->vm->initializeBlank(p1, p2); + } + *(void **)(lua_newuserdata(L, sizeof(void *))) = o; luaL_getmetatable(L, className); lua_setmetatable(L, -2); @@ -440,5 +457,6 @@ const luaL_reg LuaVoxelManip::methods[] = { luamethod(LuaVoxelManip, get_param2_data), luamethod(LuaVoxelManip, set_param2_data), luamethod(LuaVoxelManip, was_modified), + luamethod(LuaVoxelManip, get_emerged_area), {0,0} }; diff --git a/src/script/lua_api/l_vmanip.h b/src/script/lua_api/l_vmanip.h index 608b55556..ead6efbc4 100644 --- a/src/script/lua_api/l_vmanip.h +++ b/src/script/lua_api/l_vmanip.h @@ -33,7 +33,6 @@ class ManualMapVoxelManipulator; */ class LuaVoxelManip : public ModApiBase { private: - ManualMapVoxelManipulator *vm; std::map modified_blocks; bool is_mapgen_vm; @@ -62,8 +61,11 @@ private: static int l_set_param2_data(lua_State *L); static int l_was_modified(lua_State *L); + static int l_get_emerged_area(lua_State *L); public: + ManualMapVoxelManipulator *vm; + LuaVoxelManip(ManualMapVoxelManipulator *mmvm, bool is_mapgen_vm); LuaVoxelManip(Map *map); ~LuaVoxelManip();