draw method

void draw(
  1. Canvas canvas,
  2. List<Sprite> sprites, {
  3. BlendMode blendMode = BlendMode.modulate,
  4. AABB? cullArea,
})

Implementation

void draw(
  Canvas canvas,
  List<Sprite> sprites, {
  BlendMode blendMode = BlendMode.modulate,
  AABB? cullArea,
}) {
  final count = sprites.length;
  if (count == 0) return;
  _ensureCapacity(count);

  int bufIdx = 0;
  int batchStart = 0;
  int currentPage = sprites[0].texture.pageIndex;

  for (int j = 0; j < count; j++) {
    final sprite = sprites[j];

    if (j > 0 && sprite.texture.pageIndex != currentPage) {
      _drawBatch(canvas, batchStart, bufIdx - batchStart, currentPage, blendMode, cullArea?.rect);
      currentPage = sprite.texture.pageIndex;
      batchStart = bufIdx;
    }

    final rect = _spriteRect(sprite);

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

    double scos = sprite.scale;
    double ssin = 0;
    if (sprite.rotation != 0) {
      scos = math.cos(sprite.rotation) * sprite.scale;
      ssin = math.sin(sprite.rotation) * sprite.scale;
    }

    final anchorX = rect.width * sprite.originX;
    final anchorY = rect.height * sprite.originY;

    final tx = sprite.position.x + -scos * anchorX + ssin * anchorY;
    final ty = sprite.position.y + -ssin * anchorX - scos * anchorY;

    final ti = bufIdx * 4;
    _transforms[ti + 0] = scos;
    _transforms[ti + 1] = ssin;
    _transforms[ti + 2] = tx;
    _transforms[ti + 3] = ty;

    _colors[bufIdx] = sprite.tint.withAlpha(sprite.opacity).toARGB32();

    bufIdx++;
  }

  _drawBatch(canvas, batchStart, bufIdx - batchStart, currentPage, blendMode, cullArea?.rect);
}