queryEachPairs method

void queryEachPairs(
  1. QueryParams aParams,
  2. QueryParams bParams,
  3. void fn(
    1. QueryRowView a,
    2. QueryRowView b
    )
)

Implementation

void queryEachPairs(
  QueryParams aParams,
  QueryParams bParams,
  void Function(QueryRowView a, QueryRowView b) fn,
) {
  if (!aParams.activate(this) || !bParams.activate(this)) return;

  final aColumns = List<int>.filled(aParams.componentIDs.length, 0);
  final bColumns = List<int>.filled(bParams.componentIDs.length, 0);

  final aRow = QueryRowView();
  final bRow = QueryRowView();

  final archetypes = _archetypeIndex.values.toList(growable: false);

  for (final aArch in archetypes) {
    if (aArch.isEmpty || !aArch.setHash.contains(aParams.hash)) continue;

    for (int c = 0; c < aParams.componentIDs.length; c++) {
      aColumns[c] = _componentIndex[aParams.componentIDs[c]]![aArch.setHash]!;
    }

    for (final bArch in archetypes) {
      if (bArch.isEmpty || !bArch.setHash.contains(bParams.hash)) continue;

      for (int c = 0; c < bParams.componentIDs.length; c++) {
        bColumns[c] = _componentIndex[bParams.componentIDs[c]]![bArch.setHash]!;
      }

      for (int ai = 0; ai < aArch.entityCount; ai++) {
        aRow.bind(aArch, aColumns, ai, aParams.typeIndices);

        for (int bi = 0; bi < bArch.entityCount; bi++) {
          bRow.bind(bArch, bColumns, bi, bParams.typeIndices);

          if (aRow.entity == bRow.entity) continue;

          fn(aRow, bRow);
        }
      }
    }
  }
}