feat: Possiblity to pass in FilterQuality to tiled layers (#2627)

This makes it possible to pass in `FilterQuality` to the
`TiledComponent` and to the layers, since `PaintImage` defaults to
`FilterQuality.none`.
This commit is contained in:
Lukas Klingsbo
2023-08-07 14:11:50 +02:00
committed by GitHub
parent e852064e49
commit f3de66507e
9 changed files with 35 additions and 6 deletions

View File

@ -17,6 +17,7 @@ class GroupLayer extends RenderableLayer<Group> {
required super.parent,
required super.map,
required super.destTileSize,
super.filterQuality,
});
@override

View File

@ -20,6 +20,7 @@ class FlameImageLayer extends RenderableLayer<ImageLayer> {
required super.map,
required super.destTileSize,
required Image image,
super.filterQuality,
}) : _image = image {
_initImageRepeat();
}
@ -46,6 +47,7 @@ class FlameImageLayer extends RenderableLayer<ImageLayer> {
opacity: opacity,
alignment: Alignment.topLeft,
repeat: _repeat,
filterQuality: filterQuality,
);
canvas.restore();
@ -69,6 +71,7 @@ class FlameImageLayer extends RenderableLayer<ImageLayer> {
required CameraComponent? camera,
required TiledMap map,
required Vector2 destTileSize,
FilterQuality? filterQuality,
Images? images,
}) async {
return FlameImageLayer(
@ -76,6 +79,7 @@ class FlameImageLayer extends RenderableLayer<ImageLayer> {
parent: parent,
map: map,
destTileSize: destTileSize,
filterQuality: filterQuality,
image: await (images ?? Flame.images).load(layer.image.source!),
);
}

View File

@ -1,3 +1,5 @@
import 'dart:ui';
import 'package:flame/components.dart';
import 'package:flame/extensions.dart';
import 'package:flame_tiled/src/renderable_layers/renderable_layer.dart';
@ -11,6 +13,7 @@ class ObjectLayer extends RenderableLayer<ObjectGroup> {
required super.parent,
required super.map,
required super.destTileSize,
super.filterQuality,
});
@override
@ -26,12 +29,14 @@ class ObjectLayer extends RenderableLayer<ObjectGroup> {
ObjectGroup layer,
TiledMap map,
Vector2 destTileSize,
FilterQuality? filterQuality,
) async {
return ObjectLayer(
layer: layer,
parent: null,
map: map,
destTileSize: destTileSize,
filterQuality: filterQuality,
);
}

View File

@ -1,3 +1,5 @@
import 'dart:ui';
import 'package:flame/cache.dart';
import 'package:flame/components.dart';
import 'package:flame/extensions.dart';
@ -19,12 +21,16 @@ abstract class RenderableLayer<T extends Layer> {
/// The parent [Group] layer (if it exists)
final GroupLayer? parent;
/// The [FilterQuality] that should be used by all the layers.
final FilterQuality filterQuality;
RenderableLayer({
required this.layer,
required this.parent,
required this.map,
required this.destTileSize,
});
FilterQuality? filterQuality,
}) : filterQuality = filterQuality ?? FilterQuality.none;
/// [load] is a factory method to create [RenderableLayer] by type of [layer].
static Future<RenderableLayer> load({
@ -35,6 +41,7 @@ abstract class RenderableLayer<T extends Layer> {
required CameraComponent? camera,
required Map<Tile, TileFrames> animationFrames,
required TiledAtlas atlas,
FilterQuality? filterQuality,
bool? ignoreFlip,
Images? images,
}) async {
@ -47,6 +54,7 @@ abstract class RenderableLayer<T extends Layer> {
animationFrames: animationFrames,
atlas: atlas.clone(),
ignoreFlip: ignoreFlip,
filterQuality: filterQuality,
);
} else if (layer is ImageLayer) {
return FlameImageLayer.load(
@ -55,6 +63,7 @@ abstract class RenderableLayer<T extends Layer> {
camera: camera,
map: map,
destTileSize: destTileSize,
filterQuality: filterQuality,
images: images,
);
} else if (layer is ObjectGroup) {
@ -62,6 +71,7 @@ abstract class RenderableLayer<T extends Layer> {
layer,
map,
destTileSize,
filterQuality,
);
} else if (layer is Group) {
final groupLayer = layer;
@ -70,6 +80,7 @@ abstract class RenderableLayer<T extends Layer> {
parent: parent,
map: map,
destTileSize: destTileSize,
filterQuality: filterQuality,
);
}

View File

@ -18,6 +18,7 @@ class HexagonalTileLayer extends FlameTileLayer {
required super.tiledAtlas,
required super.animationFrames,
required super.ignoreFlip,
super.filterQuality,
});
@override

View File

@ -17,6 +17,7 @@ class IsometricTileLayer extends FlameTileLayer {
required super.tiledAtlas,
required super.animationFrames,
required super.ignoreFlip,
super.filterQuality,
});
@override

View File

@ -17,6 +17,7 @@ class OrthogonalTileLayer extends FlameTileLayer {
required super.tiledAtlas,
required super.animationFrames,
required super.ignoreFlip,
super.filterQuality,
});
@override

View File

@ -17,6 +17,7 @@ class StaggeredTileLayer extends FlameTileLayer {
required super.tiledAtlas,
required super.animationFrames,
required super.ignoreFlip,
super.filterQuality,
});
@override

View File

@ -34,7 +34,8 @@ import 'package:meta/meta.dart';
/// {@endtemplate}
@internal
abstract class FlameTileLayer extends RenderableLayer<TileLayer> {
late final _layerPaint = Paint();
late final _layerPaint = Paint()
..color = Color.fromRGBO(255, 255, 255, opacity);
final TiledAtlas tiledAtlas;
late List<List<MutableRSTransform?>> transforms;
final animations = <TileAnimation>[];
@ -49,9 +50,8 @@ abstract class FlameTileLayer extends RenderableLayer<TileLayer> {
required this.tiledAtlas,
required this.animationFrames,
required this.ignoreFlip,
}) {
_layerPaint.color = Color.fromRGBO(255, 255, 255, opacity);
}
super.filterQuality,
});
/// {@macro flame_tile_layer}
static FlameTileLayer load({
@ -61,10 +61,10 @@ abstract class FlameTileLayer extends RenderableLayer<TileLayer> {
required Vector2 destTileSize,
required Map<Tile, TileFrames> animationFrames,
required TiledAtlas atlas,
FilterQuality? filterQuality,
bool? ignoreFlip,
}) {
ignoreFlip ??= false;
final mapOrientation = map.orientation;
if (mapOrientation == null) {
throw StateError('Map orientation should be present');
@ -80,6 +80,7 @@ abstract class FlameTileLayer extends RenderableLayer<TileLayer> {
tiledAtlas: atlas,
animationFrames: animationFrames,
ignoreFlip: ignoreFlip,
filterQuality: filterQuality,
);
case MapOrientation.staggered:
return StaggeredTileLayer(
@ -90,6 +91,7 @@ abstract class FlameTileLayer extends RenderableLayer<TileLayer> {
tiledAtlas: atlas,
animationFrames: animationFrames,
ignoreFlip: ignoreFlip,
filterQuality: filterQuality,
);
case MapOrientation.hexagonal:
return HexagonalTileLayer(
@ -100,6 +102,7 @@ abstract class FlameTileLayer extends RenderableLayer<TileLayer> {
tiledAtlas: atlas,
animationFrames: animationFrames,
ignoreFlip: ignoreFlip,
filterQuality: filterQuality,
);
case MapOrientation.orthogonal:
return OrthogonalTileLayer(
@ -110,6 +113,7 @@ abstract class FlameTileLayer extends RenderableLayer<TileLayer> {
tiledAtlas: atlas,
animationFrames: animationFrames,
ignoreFlip: ignoreFlip,
filterQuality: filterQuality,
);
}
}