drawGrid method

void drawGrid(
  1. Canvas canvas,
  2. Grid grid, {
  3. Vec2? position,
  4. AABB? cullArea,
})

Implementation

void drawGrid(
  Canvas canvas,
  Grid grid, {
  Vec2? position,
  AABB? cullArea,
}) {
  final cellSize = grid.cellSize;

  position ??= Vec2.zero();
  cullArea ??= AABB(
    Vec2.zero(),
    width: (grid.width * cellSize).toDouble(),
    height: (grid.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));

  int i = 0;

  for (int gy = minY; gy < maxY; gy++) {
    for (int gx = minX; gx < maxX; gx++) {
      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 + cellSize * gx;
      _transforms[ti + 3] = position.y + cellSize * gy;

      i++;
    }
  }

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