df18f72384
Fix bug whereby AABBs were reused from previous items due to use of a pool, resulting in missed collisions. Also use full mask collision checks for all cases except generic update.
62 lines
1.2 KiB
C++
62 lines
1.2 KiB
C++
public:
|
|
// note .. maybe this can be attached to another node structure?
|
|
// depends which works best for cache.
|
|
struct ItemPairs {
|
|
struct Link {
|
|
void set(BVHHandle h, void *ud) {
|
|
handle = h;
|
|
userdata = ud;
|
|
}
|
|
BVHHandle handle;
|
|
void *userdata;
|
|
};
|
|
|
|
void clear() {
|
|
num_pairs = 0;
|
|
extended_pairs.reset();
|
|
expanded_aabb = AABB();
|
|
}
|
|
|
|
AABB expanded_aabb;
|
|
|
|
// maybe we can just use the number in the vector TODO
|
|
int32_t num_pairs;
|
|
LocalVector<Link> extended_pairs;
|
|
|
|
void add_pair_to(BVHHandle h, void *p_userdata) {
|
|
Link temp;
|
|
temp.set(h, p_userdata);
|
|
|
|
extended_pairs.push_back(temp);
|
|
num_pairs++;
|
|
}
|
|
|
|
uint32_t find_pair_to(BVHHandle h) const {
|
|
for (int n = 0; n < num_pairs; n++) {
|
|
if (extended_pairs[n].handle == h) {
|
|
return n;
|
|
}
|
|
}
|
|
return -1;
|
|
}
|
|
|
|
bool contains_pair_to(BVHHandle h) const {
|
|
return find_pair_to(h) != BVHCommon::INVALID;
|
|
}
|
|
|
|
// return success
|
|
void *remove_pair_to(BVHHandle h) {
|
|
void *userdata = nullptr;
|
|
|
|
for (int n = 0; n < num_pairs; n++) {
|
|
if (extended_pairs[n].handle == h) {
|
|
userdata = extended_pairs[n].userdata;
|
|
extended_pairs.remove_unordered(n);
|
|
num_pairs--;
|
|
break;
|
|
}
|
|
}
|
|
|
|
return userdata;
|
|
}
|
|
};
|