mirror of
https://github.com/minetest/minetest.git
synced 2024-11-27 01:53:45 +01:00
LuaVoxelManip: Separate VoxelManip data get/set from emerging/blitting data back to map
This commit is contained in:
parent
2e292b67a0
commit
6b3169e4d0
@ -1553,17 +1553,23 @@ VoxelManip: An interface to the MapVoxelManipulator for Lua
|
|||||||
- Can be created via VoxelManip()
|
- Can be created via VoxelManip()
|
||||||
- Also minetest.get_voxel_manip()
|
- Also minetest.get_voxel_manip()
|
||||||
methods:
|
methods:
|
||||||
- read_chunk(p1, p2): Read a chunk of map containing the region formed by p1 and p2.
|
- read_from_map(p1, p2): Reads a chunk of map from the map containing the region formed by p1 and p2.
|
||||||
^ returns raw node data, actual emerged p1, actual emerged p2
|
^ returns actual emerged pmin, actual emerged pmax
|
||||||
^ raw node data is in the form of a table mapping indicies to node content ids
|
- write_to_map(): Writes the data loaded from the VoxelManip back to the map.
|
||||||
- write_chunk(data): Write back the data
|
^ important: data must be set using VoxelManip:set_data before calling this
|
||||||
- update_map(): Update map after writing chunk.
|
- get_data(): Gets the data read into the VoxelManip object
|
||||||
^ To be used only by VoxelManip objects created by the mod itself; not VoxelManips passed to callbacks
|
^ returns raw node data is in the form of an array of node content ids
|
||||||
|
- set_data(data): Sets the data contents of the VoxelManip object
|
||||||
|
- update_map(): Update map after writing chunk back to map.
|
||||||
|
^ To be used only by VoxelManip objects created by the mod itself; not a VoxelManip that was
|
||||||
|
^ retrieved from minetest.get_mapgen_object
|
||||||
- set_lighting(p1, p2, light): Set the lighting in the region formed by p1 and p2 to light
|
- set_lighting(p1, p2, light): Set the lighting in the region formed by p1 and p2 to light
|
||||||
^ light is a table containing two integer fields ranging from 0 to 15, day and night
|
^ light is a table containing two integer fields ranging from 0 to 15, day and night
|
||||||
^ To be used only by VoxelManip objects passed to a callback; otherwise, set lighting will be ignored
|
^ To be used only by a VoxelManip object from minetest.get_mapgen_object; otherwise, set lighting will
|
||||||
|
^ be ignored
|
||||||
- calc_lighting(p1, p2): Calculate lighting in the region formed by p1 and p2
|
- calc_lighting(p1, p2): Calculate lighting in the region formed by p1 and p2
|
||||||
^ To be used only by VoxelManip objects passed to a callback; otherwise, calculated lighting will be ignored
|
^ To be used only by a VoxelManip object from minetest.get_mapgen_object; otherwise, calculated lighting
|
||||||
|
^ will be ignored
|
||||||
- update_liquids(): Update liquid flow
|
- update_liquids(): Update liquid flow
|
||||||
|
|
||||||
Mapgen objects
|
Mapgen objects
|
||||||
|
@ -594,22 +594,13 @@ int ModApiEnvMod::l_get_mapgen_object(lua_State *L)
|
|||||||
luaL_getmetatable(L, "VoxelManip");
|
luaL_getmetatable(L, "VoxelManip");
|
||||||
lua_setmetatable(L, -2);
|
lua_setmetatable(L, -2);
|
||||||
|
|
||||||
// VoxelManip data
|
|
||||||
int volume = vm->m_area.getVolume();
|
|
||||||
lua_newtable(L);
|
|
||||||
for (int i = 0; i != volume; i++) {
|
|
||||||
lua_Number cid = vm->m_data[i].getContent();
|
|
||||||
lua_pushnumber(L, cid);
|
|
||||||
lua_rawseti(L, -2, i + 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
// emerged min pos
|
// emerged min pos
|
||||||
push_v3s16(L, vm->m_area.MinEdge);
|
push_v3s16(L, vm->m_area.MinEdge);
|
||||||
|
|
||||||
// emerged max pos
|
// emerged max pos
|
||||||
push_v3s16(L, vm->m_area.MaxEdge);
|
push_v3s16(L, vm->m_area.MaxEdge);
|
||||||
|
|
||||||
nargs = 4;
|
nargs = 3;
|
||||||
|
|
||||||
break; }
|
break; }
|
||||||
case MGOBJ_HEIGHTMAP: {
|
case MGOBJ_HEIGHTMAP: {
|
||||||
|
@ -39,42 +39,52 @@ int LuaVoxelManip::gc_object(lua_State *L)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int LuaVoxelManip::l_read_chunk(lua_State *L)
|
int LuaVoxelManip::l_read_from_map(lua_State *L)
|
||||||
{
|
{
|
||||||
LuaVoxelManip *o = checkobject(L, 1);
|
LuaVoxelManip *o = checkobject(L, 1);
|
||||||
|
ManualMapVoxelManipulator *vm = o->vm;
|
||||||
|
|
||||||
v3s16 bp1 = getNodeBlockPos(read_v3s16(L, 2));
|
v3s16 bp1 = getNodeBlockPos(read_v3s16(L, 2));
|
||||||
v3s16 bp2 = getNodeBlockPos(read_v3s16(L, 3));
|
v3s16 bp2 = getNodeBlockPos(read_v3s16(L, 3));
|
||||||
sortBoxVerticies(bp1, bp2);
|
sortBoxVerticies(bp1, bp2);
|
||||||
ManualMapVoxelManipulator *vm = o->vm;
|
|
||||||
vm->initialEmerge(bp1, bp2);
|
vm->initialEmerge(bp1, bp2);
|
||||||
|
|
||||||
v3s16 emerged_p1 = vm->m_area.MinEdge;
|
push_v3s16(L, vm->m_area.MinEdge);
|
||||||
v3s16 emerged_p2 = vm->m_area.MaxEdge;
|
push_v3s16(L, vm->m_area.MaxEdge);
|
||||||
|
|
||||||
|
return 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
int LuaVoxelManip::l_get_data(lua_State *L)
|
||||||
|
{
|
||||||
|
NO_MAP_LOCK_REQUIRED;
|
||||||
|
|
||||||
|
LuaVoxelManip *o = checkobject(L, 1);
|
||||||
|
ManualMapVoxelManipulator *vm = o->vm;
|
||||||
|
|
||||||
int volume = vm->m_area.getVolume();
|
int volume = vm->m_area.getVolume();
|
||||||
|
|
||||||
lua_newtable(L);
|
lua_newtable(L);
|
||||||
for (int i = 0; i != volume; i++) {
|
for (int i = 0; i != volume; i++) {
|
||||||
lua_Number cid = vm->m_data[i].getContent();
|
lua_Integer cid = vm->m_data[i].getContent();
|
||||||
lua_pushnumber(L, cid);
|
lua_pushinteger(L, cid);
|
||||||
lua_rawseti(L, -2, i + 1);
|
lua_rawseti(L, -2, i + 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
push_v3s16(L, emerged_p1);
|
return 1;
|
||||||
push_v3s16(L, emerged_p2);
|
|
||||||
|
|
||||||
return 3;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int LuaVoxelManip::l_write_chunk(lua_State *L)
|
int LuaVoxelManip::l_set_data(lua_State *L)
|
||||||
{
|
{
|
||||||
|
NO_MAP_LOCK_REQUIRED;
|
||||||
|
|
||||||
LuaVoxelManip *o = checkobject(L, 1);
|
LuaVoxelManip *o = checkobject(L, 1);
|
||||||
|
ManualMapVoxelManipulator *vm = o->vm;
|
||||||
|
|
||||||
if (!lua_istable(L, 2))
|
if (!lua_istable(L, 2))
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
ManualMapVoxelManipulator *vm = o->vm;
|
|
||||||
|
|
||||||
int volume = vm->m_area.getVolume();
|
int volume = vm->m_area.getVolume();
|
||||||
for (int i = 0; i != volume; i++) {
|
for (int i = 0; i != volume; i++) {
|
||||||
lua_rawgeti(L, 2, i + 1);
|
lua_rawgeti(L, 2, i + 1);
|
||||||
@ -85,6 +95,14 @@ int LuaVoxelManip::l_write_chunk(lua_State *L)
|
|||||||
lua_pop(L, 1);
|
lua_pop(L, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int LuaVoxelManip::l_write_to_map(lua_State *L)
|
||||||
|
{
|
||||||
|
LuaVoxelManip *o = checkobject(L, 1);
|
||||||
|
ManualMapVoxelManipulator *vm = o->vm;
|
||||||
|
|
||||||
vm->blitBackAll(&o->modified_blocks);
|
vm->blitBackAll(&o->modified_blocks);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
@ -258,8 +276,10 @@ void LuaVoxelManip::Register(lua_State *L)
|
|||||||
|
|
||||||
const char LuaVoxelManip::className[] = "VoxelManip";
|
const char LuaVoxelManip::className[] = "VoxelManip";
|
||||||
const luaL_reg LuaVoxelManip::methods[] = {
|
const luaL_reg LuaVoxelManip::methods[] = {
|
||||||
luamethod(LuaVoxelManip, read_chunk),
|
luamethod(LuaVoxelManip, read_from_map),
|
||||||
luamethod(LuaVoxelManip, write_chunk),
|
luamethod(LuaVoxelManip, get_data),
|
||||||
|
luamethod(LuaVoxelManip, set_data),
|
||||||
|
luamethod(LuaVoxelManip, write_to_map),
|
||||||
luamethod(LuaVoxelManip, update_map),
|
luamethod(LuaVoxelManip, update_map),
|
||||||
luamethod(LuaVoxelManip, update_liquids),
|
luamethod(LuaVoxelManip, update_liquids),
|
||||||
luamethod(LuaVoxelManip, calc_lighting),
|
luamethod(LuaVoxelManip, calc_lighting),
|
||||||
|
@ -43,8 +43,11 @@ private:
|
|||||||
|
|
||||||
static int gc_object(lua_State *L);
|
static int gc_object(lua_State *L);
|
||||||
|
|
||||||
static int l_read_chunk(lua_State *L);
|
static int l_read_from_map(lua_State *L);
|
||||||
static int l_write_chunk(lua_State *L);
|
static int l_get_data(lua_State *L);
|
||||||
|
static int l_set_data(lua_State *L);
|
||||||
|
static int l_write_to_map(lua_State *L);
|
||||||
|
|
||||||
static int l_update_map(lua_State *L);
|
static int l_update_map(lua_State *L);
|
||||||
static int l_update_liquids(lua_State *L);
|
static int l_update_liquids(lua_State *L);
|
||||||
static int l_calc_lighting(lua_State *L);
|
static int l_calc_lighting(lua_State *L);
|
||||||
|
Loading…
Reference in New Issue
Block a user