Gamedev Framework (gf) 1.2.0
A C++17 framework for 2D games
Spatial_SimpleSpatialIndex.h
1/*
2 * Gamedev Framework (gf)
3 * Copyright (C) 2016-2022 Julien Bernard
4 *
5 * This software is provided 'as-is', without any express or implied
6 * warranty. In no event will the authors be held liable for any damages
7 * arising from the use of this software.
8 *
9 * Permission is granted to anyone to use this software for any purpose,
10 * including commercial applications, and to alter it and redistribute it
11 * freely, subject to the following restrictions:
12 *
13 * 1. The origin of this software must not be misrepresented; you must not
14 * claim that you wrote the original software. If you use this software
15 * in a product, an acknowledgment in the product documentation would be
16 * appreciated but is not required.
17 * 2. Altered source versions must be plainly marked as such, and must not be
18 * misrepresented as being the original software.
19 * 3. This notice may not be removed or altered from any source distribution.
20 */
21#ifndef GF_SPATIAL_SIMPLE_SPATIAL_INDEX_H
22#define GF_SPATIAL_SIMPLE_SPATIAL_INDEX_H
23
24#include <vector>
25
26#include "CoreApi.h"
27#include "Handle.h"
28#include "Rect.h"
29#include "SpatialTypes.h"
30
31namespace gf {
32#ifndef DOXYGEN_SHOULD_SKIP_THIS
33inline namespace v1 {
34#endif
35
42 class GF_CORE_API SimpleSpatialIndex {
43 public:
48
56 SpatialId insert(Handle handle, const RectF& bounds);
57
64 void modify(SpatialId id, RectF bounds);
65
74 std::size_t query(const RectF& bounds, SpatialQueryCallback callback, SpatialQuery kind = SpatialQuery::Intersect);
75
81 void remove(SpatialId id);
82
86 void clear();
87
94
95 private:
96 static constexpr std::size_t Null = static_cast<std::size_t>(-1);
97 static constexpr std::size_t Occupied = static_cast<std::size_t>(-2);
98
99 struct Entry {
100 Handle handle;
101 RectF bounds;
102 std::size_t next;
103 };
104
105 std::vector<Entry> m_entries;
106 std::size_t m_firstFreeEntry;
107 };
108
109#ifndef DOXYGEN_SHOULD_SKIP_THIS
110}
111#endif
112}
113
114#endif // GF_SPATIAL_SIMPLE_SPATIAL_INDEX_H
A handle to an object or an id.
Definition: Handle.h:40
An very simple spatial index.
Definition: Spatial_SimpleSpatialIndex.h:42
SpatialId insert(Handle handle, const RectF &bounds)
Insert an object in the tree.
std::size_t query(const RectF &bounds, SpatialQueryCallback callback, SpatialQuery kind=SpatialQuery::Intersect)
Query objects in the tree.
Handle operator[](SpatialId id)
Get the handle associated to a spatial id.
SimpleSpatialIndex()
Constructor.
void clear()
Remove all the objects from the tree.
void remove(SpatialId id)
Remove an object from the tree.
void modify(SpatialId id, RectF bounds)
Modify the bounds of an object.
SpatialQuery
A kind of spatial query.
Definition: SpatialTypes.h:73
std::function< void(Handle)> SpatialQueryCallback
A callback for spatial query.
Definition: SpatialTypes.h:82
SpatialId
A spatial id.
Definition: SpatialTypes.h:42
@ Intersect
Search for all objects that intersect the given bounds.
The namespace for gf classes.