drawGrids method

void drawGrids(
  1. Canvas canvas,
  2. List<Grid> grids, {
  3. Vec2? position,
  4. AABB? cullArea,
})

Implementation

void drawGrids(
  Canvas canvas,
  List<Grid> grids, {
  Vec2? position,
  AABB? cullArea,
}) {
  if (grids.isEmpty) return;
  final cellSize = grids[0].cellSize;
  position ??= Vec2.zero();
  cullArea ??= AABB(
    Vec2.zero(),
    width: (grids[0].width * cellSize).toDouble(),
    height: (grids[0].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();

  _ensureCapacity((maxX - minX) * (maxY - minY) * grids.length);

  int i = 0;

  for (int gy = minY; gy < maxY; gy++) {
    for (int gx = minX; gx < maxX; gx++) {
      for (final grid in grids) {
        if (!grid.inBounds2d(gx, gy)) continue;
        final idx = gy * grid.width + gx;
        final areaIdx = grid.tileAt1d(idx);
        if (areaIdx < 0 || areaIdx >= tileAreas.length) continue;

        final rect = tileAreas[areaIdx];

        final ri = i * 4;
        _rects[ri + 0] = rect.left;
        _rects[ri + 1] = rect.top;
        _rects[ri + 2] = rect.right;
        _rects[ri + 3] = rect.bottom;

        final ti = i * 4;
        _transforms[ti + 0] = tileScale;
        _transforms[ti + 1] = 0;
        _transforms[ti + 2] = position.x + grid.cellSize * gx;
        _transforms[ti + 3] = position.y + grid.cellSize * gy;

        i++;
      }
    }
  }

  canvas.drawRawAtlas(
    image,
    Float32List.sublistView(_transforms, 0, i * 4),
    Float32List.sublistView(_rects, 0, i * 4),
    null,
    null,
    null,
    paint,
  );
}