Munk2D Documentation  8.x.x
Loading...
Searching...
No Matches
cpSpatialIndex.h
1/* Copyright (c) 2025 Victor Blomqvist
2 * Copyright (c) 2007-2024 Scott Lembcke and Howling Moon Software
3 *
4 * Permission is hereby granted, free of charge, to any person obtaining a copy
5 * of this software and associated documentation files (the "Software"), to deal
6 * in the Software without restriction, including without limitation the rights
7 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
8 * copies of the Software, and to permit persons to whom the Software is
9 * furnished to do so, subject to the following conditions:
10 *
11 * The above copyright notice and this permission notice shall be included in
12 * all copies or substantial portions of the Software.
13 *
14 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
17 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
18 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
19 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
20 * SOFTWARE.
21*/
22
41//MARK: Spatial Index
42
46typedef cpBB (*cpSpatialIndexBBFunc)(void *obj);
48typedef void (*cpSpatialIndexIteratorFunc)(void *obj, void *data);
50typedef cpCollisionID (*cpSpatialIndexQueryFunc)(void *obj1, void *obj2, cpCollisionID id, void *data);
52typedef cpFloat (*cpSpatialIndexSegmentQueryFunc)(void *obj1, void *obj2, void *data);
53
54
56typedef struct cpSpatialIndex cpSpatialIndex;
57
59struct cpSpatialIndex {
61
63
64 cpSpatialIndex *staticIndex, *dynamicIndex;
65};
66
67
68//MARK: Spatial Hash
69
70typedef struct cpSpaceHash cpSpaceHash;
71
73CP_EXPORT cpSpaceHash* cpSpaceHashAlloc(void);
75CP_EXPORT cpSpatialIndex* cpSpaceHashInit(cpSpaceHash *hash, cpFloat celldim, int numcells, cpSpatialIndexBBFunc bbfunc, cpSpatialIndex *staticIndex);
77CP_EXPORT cpSpatialIndex* cpSpaceHashNew(cpFloat celldim, int cells, cpSpatialIndexBBFunc bbfunc, cpSpatialIndex *staticIndex);
78
83CP_EXPORT void cpSpaceHashResize(cpSpaceHash *hash, cpFloat celldim, int numcells);
84
85//MARK: AABB Tree
86
87typedef struct cpBBTree cpBBTree;
88
90CP_EXPORT cpBBTree* cpBBTreeAlloc(void);
92CP_EXPORT cpSpatialIndex* cpBBTreeInit(cpBBTree *tree, cpSpatialIndexBBFunc bbfunc, cpSpatialIndex *staticIndex);
94CP_EXPORT cpSpatialIndex* cpBBTreeNew(cpSpatialIndexBBFunc bbfunc, cpSpatialIndex *staticIndex);
95
97CP_EXPORT void cpBBTreeOptimize(cpSpatialIndex *index);
98
101typedef cpVect (*cpBBTreeVelocityFunc)(void *obj);
103CP_EXPORT void cpBBTreeSetVelocityFunc(cpSpatialIndex *index, cpBBTreeVelocityFunc func);
104
105//MARK: Single Axis Sweep
106
107typedef struct cpSweep1D cpSweep1D;
108
110CP_EXPORT cpSweep1D* cpSweep1DAlloc(void);
112CP_EXPORT cpSpatialIndex* cpSweep1DInit(cpSweep1D *sweep, cpSpatialIndexBBFunc bbfunc, cpSpatialIndex *staticIndex);
114CP_EXPORT cpSpatialIndex* cpSweep1DNew(cpSpatialIndexBBFunc bbfunc, cpSpatialIndex *staticIndex);
115
116//MARK: Spatial Index Implementation
117
118typedef void (*cpSpatialIndexDestroyImpl)(cpSpatialIndex *index);
119
120typedef int (*cpSpatialIndexCountImpl)(cpSpatialIndex *index);
121typedef void (*cpSpatialIndexEachImpl)(cpSpatialIndex *index, cpSpatialIndexIteratorFunc func, void *data);
122
123typedef cpBool (*cpSpatialIndexContainsImpl)(cpSpatialIndex *index, void *obj, cpHashValue hashid);
124typedef void (*cpSpatialIndexInsertImpl)(cpSpatialIndex *index, void *obj, cpHashValue hashid);
125typedef void (*cpSpatialIndexRemoveImpl)(cpSpatialIndex *index, void *obj, cpHashValue hashid);
126
127typedef void (*cpSpatialIndexReindexImpl)(cpSpatialIndex *index);
128typedef void (*cpSpatialIndexReindexObjectImpl)(cpSpatialIndex *index, void *obj, cpHashValue hashid);
129typedef void (*cpSpatialIndexReindexQueryImpl)(cpSpatialIndex *index, cpSpatialIndexQueryFunc func, void *data);
130
131typedef void (*cpSpatialIndexQueryImpl)(cpSpatialIndex *index, void *obj, cpBB bb, cpSpatialIndexQueryFunc func, void *data);
132typedef void (*cpSpatialIndexSegmentQueryImpl)(cpSpatialIndex *index, void *obj, cpVect a, cpVect b, cpFloat t_exit, cpSpatialIndexSegmentQueryFunc func, void *data);
133
135 cpSpatialIndexDestroyImpl destroy;
136
137 cpSpatialIndexCountImpl count;
138 cpSpatialIndexEachImpl each;
139
140 cpSpatialIndexContainsImpl contains;
141 cpSpatialIndexInsertImpl insert;
142 cpSpatialIndexRemoveImpl remove;
143
144 cpSpatialIndexReindexImpl reindex;
145 cpSpatialIndexReindexObjectImpl reindexObject;
146 cpSpatialIndexReindexQueryImpl reindexQuery;
147
148 cpSpatialIndexQueryImpl query;
149 cpSpatialIndexSegmentQueryImpl segmentQuery;
150};
151
153CP_EXPORT void cpSpatialIndexFree(cpSpatialIndex *index);
155CP_EXPORT void cpSpatialIndexCollideStatic(cpSpatialIndex *dynamicIndex, cpSpatialIndex *staticIndex, cpSpatialIndexQueryFunc func, void *data);
156
158static inline void cpSpatialIndexDestroy(cpSpatialIndex *index)
159{
160 if(index->klass) index->klass->destroy(index);
161}
162
164static inline int cpSpatialIndexCount(cpSpatialIndex *index)
165{
166 return index->klass->count(index);
167}
168
170static inline void cpSpatialIndexEach(cpSpatialIndex *index, cpSpatialIndexIteratorFunc func, void *data)
171{
172 index->klass->each(index, func, data);
173}
174
177static inline cpBool cpSpatialIndexContains(cpSpatialIndex *index, void *obj, cpHashValue hashid)
178{
179 return index->klass->contains(index, obj, hashid);
180}
181
184static inline void cpSpatialIndexInsert(cpSpatialIndex *index, void *obj, cpHashValue hashid)
185{
186 index->klass->insert(index, obj, hashid);
187}
188
191static inline void cpSpatialIndexRemove(cpSpatialIndex *index, void *obj, cpHashValue hashid)
192{
193 index->klass->remove(index, obj, hashid);
194}
195
197static inline void cpSpatialIndexReindex(cpSpatialIndex *index)
198{
199 index->klass->reindex(index);
200}
201
203static inline void cpSpatialIndexReindexObject(cpSpatialIndex *index, void *obj, cpHashValue hashid)
204{
205 index->klass->reindexObject(index, obj, hashid);
206}
207
209static inline void cpSpatialIndexQuery(cpSpatialIndex *index, void *obj, cpBB bb, cpSpatialIndexQueryFunc func, void *data)
210{
211 index->klass->query(index, obj, bb, func, data);
212}
213
215static inline void cpSpatialIndexSegmentQuery(cpSpatialIndex *index, void *obj, cpVect a, cpVect b, cpFloat t_exit, cpSpatialIndexSegmentQueryFunc func, void *data)
216{
217 index->klass->segmentQuery(index, obj, a, b, t_exit, func, data);
218}
219
223static inline void cpSpatialIndexReindexQuery(cpSpatialIndex *index, cpSpatialIndexQueryFunc func, void *data)
224{
225 index->klass->reindexQuery(index, func, data);
226}
227
uint32_t cpCollisionID
Type used internally to cache colliding object info for cpCollideShapes().
Definition chipmunk_types.h:172
unsigned char cpBool
Chipmunk's boolean type.
Definition chipmunk_types.h:179
double cpFloat
Chipmunk's floating point type.
Definition chipmunk_types.h:68
uintptr_t cpHashValue
Hash value type.
Definition chipmunk_types.h:167
static void cpSpatialIndexReindexQuery(cpSpatialIndex *index, cpSpatialIndexQueryFunc func, void *data)
Simultaneously reindex and find all colliding objects.
Definition cpSpatialIndex.h:223
CP_EXPORT cpSpatialIndex * cpBBTreeNew(cpSpatialIndexBBFunc bbfunc, cpSpatialIndex *staticIndex)
Allocate and initialize a bounding box tree.
static void cpSpatialIndexReindexObject(cpSpatialIndex *index, void *obj, cpHashValue hashid)
Reindex a single object in the spatial index.
Definition cpSpatialIndex.h:203
CP_EXPORT cpSpaceHash * cpSpaceHashAlloc(void)
Allocate a spatial hash.
static void cpSpatialIndexRemove(cpSpatialIndex *index, void *obj, cpHashValue hashid)
Remove an object from a spatial index.
Definition cpSpatialIndex.h:191
CP_EXPORT cpSpatialIndex * cpSweep1DNew(cpSpatialIndexBBFunc bbfunc, cpSpatialIndex *staticIndex)
Allocate and initialize a 1D sort and sweep broadphase.
void(* cpSpatialIndexIteratorFunc)(void *obj, void *data)
Spatial index/object iterator callback function type.
Definition cpSpatialIndex.h:48
static void cpSpatialIndexReindex(cpSpatialIndex *index)
Perform a full reindex of a spatial index.
Definition cpSpatialIndex.h:197
CP_EXPORT cpSweep1D * cpSweep1DAlloc(void)
Allocate a 1D sort and sweep broadphase.
CP_EXPORT void cpBBTreeSetVelocityFunc(cpSpatialIndex *index, cpBBTreeVelocityFunc func)
Set the velocity function for the bounding box tree to enable temporal coherence.
cpVect(* cpBBTreeVelocityFunc)(void *obj)
Bounding box tree velocity callback function.
Definition cpSpatialIndex.h:101
static void cpSpatialIndexInsert(cpSpatialIndex *index, void *obj, cpHashValue hashid)
Add an object to a spatial index.
Definition cpSpatialIndex.h:184
CP_EXPORT cpSpatialIndex * cpSweep1DInit(cpSweep1D *sweep, cpSpatialIndexBBFunc bbfunc, cpSpatialIndex *staticIndex)
Initialize a 1D sort and sweep broadphase.
static int cpSpatialIndexCount(cpSpatialIndex *index)
Get the number of objects in the spatial index.
Definition cpSpatialIndex.h:164
cpCollisionID(* cpSpatialIndexQueryFunc)(void *obj1, void *obj2, cpCollisionID id, void *data)
Spatial query callback function type.
Definition cpSpatialIndex.h:50
CP_EXPORT void cpSpatialIndexCollideStatic(cpSpatialIndex *dynamicIndex, cpSpatialIndex *staticIndex, cpSpatialIndexQueryFunc func, void *data)
Collide the objects in dynamicIndex against the objects in staticIndex using the query callback funct...
cpFloat(* cpSpatialIndexSegmentQueryFunc)(void *obj1, void *obj2, void *data)
Spatial segment query callback function type.
Definition cpSpatialIndex.h:52
static void cpSpatialIndexDestroy(cpSpatialIndex *index)
Destroy a spatial index.
Definition cpSpatialIndex.h:158
static void cpSpatialIndexQuery(cpSpatialIndex *index, void *obj, cpBB bb, cpSpatialIndexQueryFunc func, void *data)
Perform a rectangle query against the spatial index, calling func for each potential match.
Definition cpSpatialIndex.h:209
cpBB(* cpSpatialIndexBBFunc)(void *obj)
Spatial index bounding box callback function type.
Definition cpSpatialIndex.h:46
CP_EXPORT cpBBTree * cpBBTreeAlloc(void)
Allocate a bounding box tree.
CP_EXPORT void cpBBTreeOptimize(cpSpatialIndex *index)
Perform a static top down optimization of the tree.
static cpBool cpSpatialIndexContains(cpSpatialIndex *index, void *obj, cpHashValue hashid)
Returns true if the spatial index contains the given object.
Definition cpSpatialIndex.h:177
CP_EXPORT void cpSpaceHashResize(cpSpaceHash *hash, cpFloat celldim, int numcells)
Change the cell dimensions and table size of the spatial hash to tune it.
CP_EXPORT cpSpatialIndex * cpSpaceHashInit(cpSpaceHash *hash, cpFloat celldim, int numcells, cpSpatialIndexBBFunc bbfunc, cpSpatialIndex *staticIndex)
Initialize a spatial hash.
static void cpSpatialIndexSegmentQuery(cpSpatialIndex *index, void *obj, cpVect a, cpVect b, cpFloat t_exit, cpSpatialIndexSegmentQueryFunc func, void *data)
Perform a segment query against the spatial index, calling func for each potential match.
Definition cpSpatialIndex.h:215
CP_EXPORT cpSpatialIndex * cpBBTreeInit(cpBBTree *tree, cpSpatialIndexBBFunc bbfunc, cpSpatialIndex *staticIndex)
Initialize a bounding box tree.
CP_EXPORT void cpSpatialIndexFree(cpSpatialIndex *index)
Destroy and free a spatial index.
static void cpSpatialIndexEach(cpSpatialIndex *index, cpSpatialIndexIteratorFunc func, void *data)
Iterate the objects in the spatial index. func will be called once for each object.
Definition cpSpatialIndex.h:170
CP_EXPORT cpSpatialIndex * cpSpaceHashNew(cpFloat celldim, int cells, cpSpatialIndexBBFunc bbfunc, cpSpatialIndex *staticIndex)
Allocate and initialize a spatial hash.
Chipmunk's axis-aligned 2D bounding box type. (left, bottom, right, top)
Definition cpBB.h:34
Definition cpSpatialIndex.h:134
Definition chipmunk_types.h:251