Whether a candidate survives a query's filter (§30).
Tests run cheapest-first and short-circuit: sensor inclusion, then the
ignore lists, then the mutual group/mask test documented on
QueryFilter, then the caller's predicate. Pure and allocation-free —
it is called once per broad-phase candidate.
The ignore lists are scanned linearly. They are expected to hold a handful of
entries (§30's use case is "ignore the caster"); an adapter with genuinely
large ignore sets should pre-build its own index and use the predicate.
Whether a candidate survives a query's filter (§30).
Tests run cheapest-first and short-circuit: sensor inclusion, then the ignore lists, then the mutual group/mask test documented on QueryFilter, then the caller's predicate. Pure and allocation-free — it is called once per broad-phase candidate.
The ignore lists are scanned linearly. They are expected to hold a handful of entries (§30's use case is "ignore the caster"); an adapter with genuinely large ignore sets should pre-build its own index and use the predicate.