static void cpSpaceHashReindexQuery(cpSpaceHash *hash, cpSpatialIndexQueryFunc func, void *data) { clearTable(hash); queryRehashContext context = {hash, func, data}; cpHashSetEach(hash->handleSet, (cpHashSetIteratorFunc)queryRehash_helper, &context); cpSpatialIndexCollideStatic((cpSpatialIndex *)hash, hash->spatialIndex.staticIndex, func, data); }
static void cpBBTreeReindexQuery(cpBBTree *tree, cpSpatialIndexQueryFunc func, void *data) { if(!tree->root) return; // LeafUpdate() may modify tree->root. Don't cache it. cpHashSetEach(tree->leaves, (cpHashSetIteratorFunc)LeafUpdate, tree); cpSpatialIndex *staticIndex = tree->spatialIndex.staticIndex; Node *staticRoot = (staticIndex && staticIndex->klass == Klass() ? ((cpBBTree *)staticIndex)->root : NULL); MarkContext context = {tree, staticRoot, func, data}; MarkSubtree(tree->root, &context); if(staticIndex && !staticRoot) cpSpatialIndexCollideStatic((cpSpatialIndex *)tree, staticIndex, func, data); IncrementStamp(tree); }
static void cpSweep1DReindexQuery(cpSweep1D *sweep, cpSpatialIndexQueryFunc func, void *data) { TableCell *table = sweep->table; int count = sweep->num; // Update bounds and sort for(int i=0; i<count; i++) table[i] = MakeTableCell(sweep, table[i].obj); qsort(table, count, sizeof(TableCell), (int (*)(const void *, const void *))TableSort); // TODO use insertion sort instead for(int i=0; i<count; i++){ TableCell cell = table[i]; cpFloat max = cell.bounds.max; for(int j=i+1; table[j].bounds.min < max && j<count; j++){ func(cell.obj, table[j].obj, data); } } // Reindex query is also responsible for colliding against the static index. // Fortunately there is a helper function for that. cpSpatialIndexCollideStatic((cpSpatialIndex *)sweep, sweep->spatialIndex.staticIndex, func, data); }
void SpatialIndex::collideStatic(cpSpatialIndex *staticIndex,SpatialIndexQueryFunc func) { cpSpatialIndexCollideStatic(index,staticIndex,*SpatialIndexCollideStatic,&func); }
void SpatialIndex::collideStatic(cp::SpatialIndex *staticIndex,cpSpatialIndexQueryFunc func,void *data) { cpSpatialIndexCollideStatic(index,staticIndex ? staticIndex->get() : 0,func,data); }