00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00040
00041
00045 typedef cpBB (*cpSpatialIndexBBFunc)(void *obj);
00047 typedef void (*cpSpatialIndexIteratorFunc)(void *obj, void *data);
00049 typedef void (*cpSpatialIndexQueryFunc)(void *obj1, void *obj2, void *data);
00051 typedef cpFloat (*cpSpatialIndexSegmentQueryFunc)(void *obj1, void *obj2, void *data);
00052
00053
00054 typedef struct cpSpatialIndexClass cpSpatialIndexClass;
00055 typedef struct cpSpatialIndex cpSpatialIndex;
00056
00058 struct cpSpatialIndex {
00059 cpSpatialIndexClass *klass;
00060
00061 cpSpatialIndexBBFunc bbfunc;
00062
00063 cpSpatialIndex *staticIndex, *dynamicIndex;
00064 };
00065
00066
00067
00068
00069 typedef struct cpSpaceHash cpSpaceHash;
00070
00072 cpSpaceHash* cpSpaceHashAlloc(void);
00074 cpSpatialIndex* cpSpaceHashInit(cpSpaceHash *hash, cpFloat celldim, int numcells, cpSpatialIndexBBFunc bbfunc, cpSpatialIndex *staticIndex);
00076 cpSpatialIndex* cpSpaceHashNew(cpFloat celldim, int cells, cpSpatialIndexBBFunc bbfunc, cpSpatialIndex *staticIndex);
00077
00082 void cpSpaceHashResize(cpSpaceHash *hash, cpFloat celldim, int numcells);
00083
00084
00085
00086 typedef struct cpBBTree cpBBTree;
00087
00089 cpBBTree* cpBBTreeAlloc(void);
00091 cpSpatialIndex* cpBBTreeInit(cpBBTree *tree, cpSpatialIndexBBFunc bbfunc, cpSpatialIndex *staticIndex);
00093 cpSpatialIndex* cpBBTreeNew(cpSpatialIndexBBFunc bbfunc, cpSpatialIndex *staticIndex);
00094
00096 void cpBBTreeOptimize(cpSpatialIndex *index);
00097
00100 typedef cpVect (*cpBBTreeVelocityFunc)(void *obj);
00102 void cpBBTreeSetVelocityFunc(cpSpatialIndex *index, cpBBTreeVelocityFunc func);
00103
00104
00105
00106 typedef struct cpSweep1D cpSweep1D;
00107
00109 cpSweep1D* cpSweep1DAlloc(void);
00111 cpSpatialIndex* cpSweep1DInit(cpSweep1D *sweep, cpSpatialIndexBBFunc bbfunc, cpSpatialIndex *staticIndex);
00113 cpSpatialIndex* cpSweep1DNew(cpSpatialIndexBBFunc bbfunc, cpSpatialIndex *staticIndex);
00114
00115
00116
00117 typedef void (*cpSpatialIndexDestroyImpl)(cpSpatialIndex *index);
00118
00119 typedef int (*cpSpatialIndexCountImpl)(cpSpatialIndex *index);
00120 typedef void (*cpSpatialIndexEachImpl)(cpSpatialIndex *index, cpSpatialIndexIteratorFunc func, void *data);
00121
00122 typedef cpBool (*cpSpatialIndexContainsImpl)(cpSpatialIndex *index, void *obj, cpHashValue hashid);
00123 typedef void (*cpSpatialIndexInsertImpl)(cpSpatialIndex *index, void *obj, cpHashValue hashid);
00124 typedef void (*cpSpatialIndexRemoveImpl)(cpSpatialIndex *index, void *obj, cpHashValue hashid);
00125
00126 typedef void (*cpSpatialIndexReindexImpl)(cpSpatialIndex *index);
00127 typedef void (*cpSpatialIndexReindexObjectImpl)(cpSpatialIndex *index, void *obj, cpHashValue hashid);
00128 typedef void (*cpSpatialIndexReindexQueryImpl)(cpSpatialIndex *index, cpSpatialIndexQueryFunc func, void *data);
00129
00130 typedef void (*cpSpatialIndexQueryImpl)(cpSpatialIndex *index, void *obj, cpBB bb, cpSpatialIndexQueryFunc func, void *data);
00131 typedef void (*cpSpatialIndexSegmentQueryImpl)(cpSpatialIndex *index, void *obj, cpVect a, cpVect b, cpFloat t_exit, cpSpatialIndexSegmentQueryFunc func, void *data);
00132
00133 struct cpSpatialIndexClass {
00134 cpSpatialIndexDestroyImpl destroy;
00135
00136 cpSpatialIndexCountImpl count;
00137 cpSpatialIndexEachImpl each;
00138
00139 cpSpatialIndexContainsImpl contains;
00140 cpSpatialIndexInsertImpl insert;
00141 cpSpatialIndexRemoveImpl remove;
00142
00143 cpSpatialIndexReindexImpl reindex;
00144 cpSpatialIndexReindexObjectImpl reindexObject;
00145 cpSpatialIndexReindexQueryImpl reindexQuery;
00146
00147 cpSpatialIndexQueryImpl query;
00148 cpSpatialIndexSegmentQueryImpl segmentQuery;
00149 };
00150
00152 void cpSpatialIndexFree(cpSpatialIndex *index);
00154 void cpSpatialIndexCollideStatic(cpSpatialIndex *dynamicIndex, cpSpatialIndex *staticIndex, cpSpatialIndexQueryFunc func, void *data);
00155
00157 static inline void cpSpatialIndexDestroy(cpSpatialIndex *index)
00158 {
00159 if(index->klass) index->klass->destroy(index);
00160 }
00161
00163 static inline int cpSpatialIndexCount(cpSpatialIndex *index)
00164 {
00165 return index->klass->count(index);
00166 }
00167
00169 static inline void cpSpatialIndexEach(cpSpatialIndex *index, cpSpatialIndexIteratorFunc func, void *data)
00170 {
00171 index->klass->each(index, func, data);
00172 }
00173
00176 static inline cpBool cpSpatialIndexContains(cpSpatialIndex *index, void *obj, cpHashValue hashid)
00177 {
00178 return index->klass->contains(index, obj, hashid);
00179 }
00180
00183 static inline void cpSpatialIndexInsert(cpSpatialIndex *index, void *obj, cpHashValue hashid)
00184 {
00185 index->klass->insert(index, obj, hashid);
00186 }
00187
00190 static inline void cpSpatialIndexRemove(cpSpatialIndex *index, void *obj, cpHashValue hashid)
00191 {
00192 index->klass->remove(index, obj, hashid);
00193 }
00194
00196 static inline void cpSpatialIndexReindex(cpSpatialIndex *index)
00197 {
00198 index->klass->reindex(index);
00199 }
00200
00202 static inline void cpSpatialIndexReindexObject(cpSpatialIndex *index, void *obj, cpHashValue hashid)
00203 {
00204 index->klass->reindexObject(index, obj, hashid);
00205 }
00206
00208 static inline void cpSpatialIndexQuery(cpSpatialIndex *index, void *obj, cpBB bb, cpSpatialIndexQueryFunc func, void *data)
00209 {
00210 index->klass->query(index, obj, bb, func, data);
00211 }
00212
00214 static inline void cpSpatialIndexSegmentQuery(cpSpatialIndex *index, void *obj, cpVect a, cpVect b, cpFloat t_exit, cpSpatialIndexSegmentQueryFunc func, void *data)
00215 {
00216 index->klass->segmentQuery(index, obj, a, b, t_exit, func, data);
00217 }
00218
00222 static inline void cpSpatialIndexReindexQuery(cpSpatialIndex *index, cpSpatialIndexQueryFunc func, void *data)
00223 {
00224 index->klass->reindexQuery(index, func, data);
00225 }
00226