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 (*cpSpatialIndexPointQueryImpl)(cpSpatialIndex *index, cpVect point, cpSpatialIndexQueryFunc func, void *data);
00131 typedef void (*cpSpatialIndexSegmentQueryImpl)(cpSpatialIndex *index, void *obj, cpVect a, cpVect b, cpFloat t_exit, cpSpatialIndexSegmentQueryFunc func, void *data);
00132 typedef void (*cpSpatialIndexQueryImpl)(cpSpatialIndex *index, void *obj, cpBB bb, cpSpatialIndexQueryFunc func, void *data);
00133
00134 struct cpSpatialIndexClass {
00135 cpSpatialIndexDestroyImpl destroy;
00136
00137 cpSpatialIndexCountImpl count;
00138 cpSpatialIndexEachImpl each;
00139
00140 cpSpatialIndexContainsImpl contains;
00141 cpSpatialIndexInsertImpl insert;
00142 cpSpatialIndexRemoveImpl remove;
00143
00144 cpSpatialIndexReindexImpl reindex;
00145 cpSpatialIndexReindexObjectImpl reindexObject;
00146 cpSpatialIndexReindexQueryImpl reindexQuery;
00147
00148 cpSpatialIndexPointQueryImpl pointQuery;
00149 cpSpatialIndexSegmentQueryImpl segmentQuery;
00150 cpSpatialIndexQueryImpl query;
00151 };
00152
00154 void cpSpatialIndexFree(cpSpatialIndex *index);
00156 void cpSpatialIndexCollideStatic(cpSpatialIndex *dynamicIndex, cpSpatialIndex *staticIndex, cpSpatialIndexQueryFunc func, void *data);
00157
00159 static inline void cpSpatialIndexDestroy(cpSpatialIndex *index)
00160 {
00161 if(index->klass) index->klass->destroy(index);
00162 }
00163
00165 static inline int cpSpatialIndexCount(cpSpatialIndex *index)
00166 {
00167 return index->klass->count(index);
00168 }
00169
00171 static inline void cpSpatialIndexEach(cpSpatialIndex *index, cpSpatialIndexIteratorFunc func, void *data)
00172 {
00173 index->klass->each(index, func, data);
00174 }
00175
00178 static inline cpBool cpSpatialIndexContains(cpSpatialIndex *index, void *obj, cpHashValue hashid)
00179 {
00180 return index->klass->contains(index, obj, hashid);
00181 }
00182
00185 static inline void cpSpatialIndexInsert(cpSpatialIndex *index, void *obj, cpHashValue hashid)
00186 {
00187 index->klass->insert(index, obj, hashid);
00188 }
00189
00192 static inline void cpSpatialIndexRemove(cpSpatialIndex *index, void *obj, cpHashValue hashid)
00193 {
00194 index->klass->remove(index, obj, hashid);
00195 }
00196
00198 static inline void cpSpatialIndexReindex(cpSpatialIndex *index)
00199 {
00200 index->klass->reindex(index);
00201 }
00202
00204 static inline void cpSpatialIndexReindexObject(cpSpatialIndex *index, void *obj, cpHashValue hashid)
00205 {
00206 index->klass->reindexObject(index, obj, hashid);
00207 }
00208
00211 static inline void cpSpatialIndexPointQuery(cpSpatialIndex *index, cpVect point, cpSpatialIndexQueryFunc func, void *data)
00212 {
00213 index->klass->pointQuery(index, point, func, data);
00214 }
00215
00217 static inline void cpSpatialIndexSegmentQuery(cpSpatialIndex *index, void *obj, cpVect a, cpVect b, cpFloat t_exit, cpSpatialIndexSegmentQueryFunc func, void *data)
00218 {
00219 index->klass->segmentQuery(index, obj, a, b, t_exit, func, data);
00220 }
00221
00223 static inline void cpSpatialIndexQuery(cpSpatialIndex *index, void *obj, cpBB bb, cpSpatialIndexQueryFunc func, void *data)
00224 {
00225 index->klass->query(index, obj, bb, func, data);
00226 }
00227
00231 static inline void cpSpatialIndexReindexQuery(cpSpatialIndex *index, cpSpatialIndexQueryFunc func, void *data)
00232 {
00233 index->klass->reindexQuery(index, func, data);
00234 }
00235