query method
Returns the potential hitbox collisions
Implementation
@override
Iterable<CollisionProspect<ShapeHitbox>> query() {
_potentials.clear();
_potentialsTmp.clear();
_prospectPool.reset();
for (final activeItem in activeHitboxes) {
if (activeItem.isRemoving || !activeItem.isMounted) {
tree.remove(activeItem);
continue;
}
final itemCenter = activeItem.aabb.center;
final potentiallyCollide = tree.query(activeItem);
for (final potential in potentiallyCollide.entries.first.value) {
if (potential.collisionType == CollisionType.inactive) {
continue;
}
if (_broadphaseCheckCache[activeItem]?[potential] == false) {
continue;
}
if (!potential.allowSiblingCollision &&
potential.hitboxParent == activeItem.hitboxParent &&
potential.isMounted) {
continue;
}
final distanceCloseEnough = minimumDistanceCheck.call(
itemCenter,
_cacheCenterOfHitbox(potential),
);
if (distanceCloseEnough == false) {
continue;
}
_potentialsTmp
..add(activeItem)
..add(potential);
}
}
if (_potentialsTmp.isNotEmpty) {
for (var i = 0; i < _potentialsTmp.length; i += 2) {
final item0 = _potentialsTmp[i];
final item1 = _potentialsTmp[i + 1];
if (broadphaseCheck(item0, item1)) {
final prospect = _prospectPool.acquire(item0, item1);
_potentials.add(prospect);
} else {
if (_broadphaseCheckCache[item0] == null) {
_broadphaseCheckCache[item0] = {};
}
_broadphaseCheckCache[item0]![item1] = false;
}
}
}
return _potentials;
}