mirror of
https://github.com/minetest/minetest.git
synced 2024-12-24 15:12:23 +01:00
Add AreaStore custom ID API
This commit is contained in:
parent
821551a266
commit
3ce6642a26
@ -8,6 +8,7 @@ core.features = {
|
|||||||
use_texture_alpha = true,
|
use_texture_alpha = true,
|
||||||
no_legacy_abms = true,
|
no_legacy_abms = true,
|
||||||
texture_names_parens = true,
|
texture_names_parens = true,
|
||||||
|
area_store_custom_ids = true,
|
||||||
}
|
}
|
||||||
|
|
||||||
function core.has_feature(arg)
|
function core.has_feature(arg)
|
||||||
|
@ -2727,7 +2727,7 @@ If you chose the parameter-less constructor, a fast implementation will be autom
|
|||||||
* `get_area(id, include_borders, include_data)`: returns the area with the id `id`. (optional) Boolean values `include_borders` and `include_data` control what's copied.
|
* `get_area(id, include_borders, include_data)`: returns the area with the id `id`. (optional) Boolean values `include_borders` and `include_data` control what's copied.
|
||||||
* `get_areas_for_pos(pos, include_borders, include_data)`: returns all areas that contain the position `pos`. (optional) Boolean values `include_borders` and `include_data` control what's copied.
|
* `get_areas_for_pos(pos, include_borders, include_data)`: returns all areas that contain the position `pos`. (optional) Boolean values `include_borders` and `include_data` control what's copied.
|
||||||
* `get_areas_in_area(edge1, edge2, accept_overlap, include_borders, include_data)`: returns all areas that contain all nodes inside the area specified by `edge1` and `edge2` (inclusive). If `accept_overlap` is true, also areas are returned that have nodes in common with the specified area. (optional) Boolean values `include_borders` and `include_data` control what's copied.
|
* `get_areas_in_area(edge1, edge2, accept_overlap, include_borders, include_data)`: returns all areas that contain all nodes inside the area specified by `edge1` and `edge2` (inclusive). If `accept_overlap` is true, also areas are returned that have nodes in common with the specified area. (optional) Boolean values `include_borders` and `include_data` control what's copied.
|
||||||
* `insert_area(edge1, edge2, data)`: inserts an area into the store. Returns the new area's ID, or nil if the insertion failed. The (inclusive) positions `edge1` and `edge2` describe the area, `data` is a string stored with the area.
|
* `insert_area(edge1, edge2, data, [id])`: inserts an area into the store. Returns the new area's ID, or nil if the insertion failed. The (inclusive) positions `edge1` and `edge2` describe the area. `data` is a string stored with the area. If passed, `id` will be used as the internal area ID, it must be a unique number between 0 and 2^32-2. If you use the `id` parameter you must always use it, or insertions are likely to fail due to conflicts.
|
||||||
* `reserve(count)`: reserves resources for at most `count` many contained areas. Only needed for efficiency, and only some implementations profit.
|
* `reserve(count)`: reserves resources for at most `count` many contained areas. Only needed for efficiency, and only some implementations profit.
|
||||||
* `remove_area(id)`: removes the area with the given id from the store, returns success.
|
* `remove_area(id)`: removes the area with the given id from the store, returns success.
|
||||||
* `set_cache_params(params)`: sets params for the included prefiltering cache. Calling invalidates the cache, so that its elements have to be newly generated.
|
* `set_cache_params(params)`: sets params for the included prefiltering cache. Calling invalidates the cache, so that its elements have to be newly generated.
|
||||||
|
@ -164,7 +164,7 @@ int LuaAreaStore::l_get_areas_in_area(lua_State *L)
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
// insert_area(edge1, edge2, data)
|
// insert_area(edge1, edge2, data, id)
|
||||||
int LuaAreaStore::l_insert_area(lua_State *L)
|
int LuaAreaStore::l_insert_area(lua_State *L)
|
||||||
{
|
{
|
||||||
NO_MAP_LOCK_REQUIRED;
|
NO_MAP_LOCK_REQUIRED;
|
||||||
@ -179,6 +179,9 @@ int LuaAreaStore::l_insert_area(lua_State *L)
|
|||||||
|
|
||||||
a.data = std::string(data, d_len);
|
a.data = std::string(data, d_len);
|
||||||
|
|
||||||
|
if (lua_isnumber(L, 5))
|
||||||
|
a.id = lua_tonumber(L, 5);
|
||||||
|
|
||||||
if (!ast->insertArea(&a))
|
if (!ast->insertArea(&a))
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
|
@ -160,7 +160,8 @@ void AreaStore::getAreasForPos(std::vector<Area *> *result, v3s16 pos)
|
|||||||
|
|
||||||
bool VectorAreaStore::insertArea(Area *a)
|
bool VectorAreaStore::insertArea(Area *a)
|
||||||
{
|
{
|
||||||
a->id = getNextId();
|
if (a->id == U32_MAX)
|
||||||
|
a->id = getNextId();
|
||||||
std::pair<AreaMap::iterator, bool> res =
|
std::pair<AreaMap::iterator, bool> res =
|
||||||
areas_map.insert(std::make_pair(a->id, *a));
|
areas_map.insert(std::make_pair(a->id, *a));
|
||||||
if (!res.second)
|
if (!res.second)
|
||||||
@ -232,7 +233,8 @@ static inline SpatialIndex::Point get_spatial_point(const v3s16 pos)
|
|||||||
|
|
||||||
bool SpatialAreaStore::insertArea(Area *a)
|
bool SpatialAreaStore::insertArea(Area *a)
|
||||||
{
|
{
|
||||||
a->id = getNextId();
|
if (a->id == U32_MAX)
|
||||||
|
a->id = getNextId();
|
||||||
if (!areas_map.insert(std::make_pair(a->id, *a)).second)
|
if (!areas_map.insert(std::make_pair(a->id, *a)).second)
|
||||||
// ID is not unique
|
// ID is not unique
|
||||||
return false;
|
return false;
|
||||||
|
@ -38,9 +38,9 @@ with this program; if not, write to the Free Software Foundation, Inc.,
|
|||||||
|
|
||||||
|
|
||||||
struct Area {
|
struct Area {
|
||||||
Area() {}
|
Area() : id(U32_MAX) {}
|
||||||
Area(const v3s16 &mine, const v3s16 &maxe) :
|
Area(const v3s16 &mine, const v3s16 &maxe) :
|
||||||
minedge(mine), maxedge(maxe)
|
id(U32_MAX), minedge(mine), maxedge(maxe)
|
||||||
{
|
{
|
||||||
sortBoxVerticies(minedge, maxedge);
|
sortBoxVerticies(minedge, maxedge);
|
||||||
}
|
}
|
||||||
@ -68,7 +68,8 @@ public:
|
|||||||
size_t size() const { return areas_map.size(); }
|
size_t size() const { return areas_map.size(); }
|
||||||
|
|
||||||
/// Add an area to the store.
|
/// Add an area to the store.
|
||||||
/// Updates the area's ID.
|
/// Updates the area's ID if it hasn't already been set.
|
||||||
|
/// @return Whether the area insertion was successful.
|
||||||
virtual bool insertArea(Area *a) = 0;
|
virtual bool insertArea(Area *a) = 0;
|
||||||
|
|
||||||
/// Removes an area from the store by ID.
|
/// Removes an area from the store by ID.
|
||||||
|
Loading…
Reference in New Issue
Block a user