forEachDrawArea method

void forEachDrawArea({
  1. required void visit(
    1. double screenX,
    2. double screenY,
    3. int tile
    ),
  2. Vec2? position,
  3. AABB? cullArea,
})

Implementation

void forEachDrawArea({
  required void Function(double screenX, double screenY, int tile) visit,
  Vec2? position,
  AABB? cullArea,
}) {
  position ??= Vec2.zero();
  cullArea ??= AABB(
    Vec2.zero(),
    width: (width * cellSize).toDouble(),
    height: (height * cellSize).toDouble(),
  );

  final cullLeft = cullArea.left - position.x;
  final cullRight = cullArea.right - position.x;
  final cullTop = cullArea.top - position.y;
  final cullBottom = cullArea.bottom - position.y;

  final minX = (cullLeft / cellSize).floor();
  final maxX = (cullRight / cellSize).ceil();
  final minY = (cullTop / cellSize).floor();
  final maxY = (cullBottom / cellSize).ceil();

  for (int gy = minY; gy < maxY; gy++) {
    for (int gx = minX; gx < maxX; gx++) {
      if (!inBounds2d(gx, gy)) continue;
      final value = tileAt2d(gx, gy);
      if (value < 0) continue;
      visit(
        position.x + cellSize * gx,
        position.y + cellSize * gy,
        value,
      );
    }
  }
}