// insert_area(edge1, edge2, data) int LuaAreaStore::l_insert_area(lua_State *L) { NO_MAP_LOCK_REQUIRED; LuaAreaStore *o = checkobject(L, 1); AreaStore *ast = o->as; Area a; a.minedge = check_v3s16(L, 2); a.maxedge = check_v3s16(L, 3); a.extremifyEdges(); a.id = ast->getFreeId(a.minedge, a.maxedge); if (a.id == AREA_ID_INVALID) { // couldn't get free id lua_pushnil(L); return 1; } size_t d_len; const char *data = luaL_checklstring(L, 4, &d_len); a.data = std::string(data, d_len); ast->insertArea(a); lua_pushnumber(L, a.id); return 1; }
// reserve(count) int LuaAreaStore::l_reserve(lua_State *L) { NO_MAP_LOCK_REQUIRED; LuaAreaStore *o = checkobject(L, 1); AreaStore *ast = o->as; size_t count = luaL_checknumber(L, 2); ast->reserve(count); return 0; }
// remove_area(id) int LuaAreaStore::l_remove_area(lua_State *L) { NO_MAP_LOCK_REQUIRED; LuaAreaStore *o = checkobject(L, 1); AreaStore *ast = o->as; u32 id = luaL_checknumber(L, 2); bool success = ast->removeArea(id); lua_pushboolean(L, success); return 1; }
// to_string() int LuaAreaStore::l_to_string(lua_State *L) { NO_MAP_LOCK_REQUIRED; LuaAreaStore *o = checkobject(L, 1); AreaStore *ast = o->as; std::ostringstream os(std::ios_base::binary); ast->serialize(os); std::string str = os.str(); lua_pushlstring(L, str.c_str(), str.length()); return 1; }
// from_file(filename) int LuaAreaStore::l_from_file(lua_State *L) { NO_MAP_LOCK_REQUIRED; LuaAreaStore *o = checkobject(L, 1); AreaStore *ast = o->as; const char *filename = luaL_checkstring(L, 2); CHECK_SECURE_PATH_OPTIONAL(L, filename); std::ifstream is(filename, std::ios::binary); bool success = ast->deserialize(is); lua_pushboolean(L, success); return 1; }
// from_string(str) int LuaAreaStore::l_from_string(lua_State *L) { NO_MAP_LOCK_REQUIRED; LuaAreaStore *o = checkobject(L, 1); AreaStore *ast = o->as; size_t len; const char *str = luaL_checklstring(L, 2, &len); std::istringstream is(std::string(str, len), std::ios::binary); bool success = ast->deserialize(is); lua_pushboolean(L, success); return 1; }
// to_file(filename) int LuaAreaStore::l_to_file(lua_State *L) { NO_MAP_LOCK_REQUIRED; LuaAreaStore *o = checkobject(L, 1); AreaStore *ast = o->as; const char *filename = luaL_checkstring(L, 2); CHECK_SECURE_PATH_OPTIONAL(L, filename); std::ostringstream os(std::ios_base::binary); ast->serialize(os); lua_pushboolean(L, fs::safeWriteToFile(filename, os.str())); return 1; }
// set_cache_params(params) int LuaAreaStore::l_set_cache_params(lua_State *L) { NO_MAP_LOCK_REQUIRED; LuaAreaStore *o = checkobject(L, 1); AreaStore *ast = o->as; luaL_checktype(L, 2, LUA_TTABLE); bool enabled = getboolfield_default(L, 2, "enabled", true); u8 block_radius = getintfield_default(L, 2, "block_radius", 64); size_t limit = getintfield_default(L, 2, "block_radius", 1000); ast->setCacheParams(enabled, block_radius, limit); return 0; }
void AreaStore::cacheMiss(void *data, const v3s16 &mpos, std::vector<Area *> *dest) { AreaStore *as = (AreaStore *)data; u8 r = as->m_cacheblock_radius; // get the points at the edges of the mapblock v3s16 minedge(mpos.X * r, mpos.Y * r, mpos.Z * r); v3s16 maxedge( minedge.X + r - 1, minedge.Y + r - 1, minedge.Z + r - 1); as->getAreasInArea(dest, minedge, maxedge, true); /* infostream << "Cache miss with " << dest->size() << " areas, between (" << minedge.X << ", " << minedge.Y << ", " << minedge.Z << ") and (" << maxedge.X << ", " << maxedge.Y << ", " << maxedge.Z << ")" << std::endl; // */ }
void FoliageBase::TerrainHandler_LayerUpdated(const Terrain::TerrainShader* shader, const AreaStore& areas) { if (mPagedGeometry) { //check if the layer update affects this layer, either if it's the actual layer, or one of the dependent layers bool isRelevant(0); if (&shader->getLayerDefinition() == &mTerrainLayerDefinition) { isRelevant = true; } else { if (std::find(mDependentDefinitions.begin(), mDependentDefinitions.end(), &shader->getLayerDefinition()) != mDependentDefinitions.end()) { isRelevant = true; } } if (isRelevant) { for (AreaStore::const_iterator I = areas.begin(); I != areas.end(); ++I) { const Ogre::TRect<Ogre::Real> ogreExtent(Convert::toOgre(*I)); mPagedGeometry->reloadGeometryPages(ogreExtent); } } } }
// get_area(id, include_borders, include_data) int LuaAreaStore::l_get_area(lua_State *L) { NO_MAP_LOCK_REQUIRED; LuaAreaStore *o = checkobject(L, 1); AreaStore *ast = o->as; u32 id = luaL_checknumber(L, 2); bool include_borders = true; bool include_data = false; get_data_and_border_flags(L, 3, &include_borders, &include_data); const Area *res; res = ast->getArea(id); push_area(L, res, include_borders, include_data); return 1; }
// get_areas_for_pos(pos, include_borders, include_data) int LuaAreaStore::l_get_areas_for_pos(lua_State *L) { NO_MAP_LOCK_REQUIRED; LuaAreaStore *o = checkobject(L, 1); AreaStore *ast = o->as; v3s16 pos = check_v3s16(L, 2); bool include_borders = true; bool include_data = false; get_data_and_border_flags(L, 3, &include_borders, &include_data); std::vector<Area *> res; ast->getAreasForPos(&res, pos); push_areas(L, res, include_borders, include_data); return 1; }
// insert_area(edge1, edge2, data, id) int LuaAreaStore::l_insert_area(lua_State *L) { NO_MAP_LOCK_REQUIRED; LuaAreaStore *o = checkobject(L, 1); AreaStore *ast = o->as; Area a(check_v3s16(L, 2), check_v3s16(L, 3)); size_t d_len; const char *data = luaL_checklstring(L, 4, &d_len); a.data = std::string(data, d_len); if (lua_isnumber(L, 5)) a.id = lua_tonumber(L, 5); if (!ast->insertArea(&a)) return 0; lua_pushnumber(L, a.id); return 1; }
// get_areas_in_area(edge1, edge2, accept_overlap, include_borders, include_data) int LuaAreaStore::l_get_areas_in_area(lua_State *L) { NO_MAP_LOCK_REQUIRED; LuaAreaStore *o = checkobject(L, 1); AreaStore *ast = o->as; v3s16 minedge = check_v3s16(L, 2); v3s16 maxedge = check_v3s16(L, 3); bool include_borders = true; bool include_data = false; bool accept_overlap = false; if (lua_isboolean(L, 4)) { accept_overlap = lua_toboolean(L, 4); get_data_and_border_flags(L, 5, &include_borders, &include_data); } std::vector<Area *> res; ast->getAreasInArea(&res, minedge, maxedge, accept_overlap); push_areas(L, res, include_borders, include_data); return 1; }