Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 4 additions & 4 deletions example/pubspec.lock
Original file line number Diff line number Diff line change
Expand Up @@ -191,10 +191,10 @@ packages:
dependency: "direct main"
description:
name: flutter_map
sha256: "2ecb34619a4be19df6f40c2f8dce1591675b4eff7a6857bd8f533706977385da"
sha256: bbf145e8220531f2f727608c431871c7457f3b134e513543913afd00fdc1cd47
url: "https://pub.dev"
source: hosted
version: "7.0.2"
version: "8.1.0"
flutter_test:
dependency: "direct dev"
description: flutter
Expand Down Expand Up @@ -328,7 +328,7 @@ packages:
source: hosted
version: "2.5.0"
logging:
dependency: transitive
dependency: "direct main"
description:
name: logging
sha256: c8245ada5f1717ed44271ed1c26b8ce85ca3228fd2ffdb75468ab01979309d61
Expand Down Expand Up @@ -662,4 +662,4 @@ packages:
version: "3.1.3"
sdks:
dart: ">=3.8.0-91.0.dev <4.0.0"
flutter: ">=3.18.0-18.0.pre.54"
flutter: ">=3.27.0"
7 changes: 4 additions & 3 deletions example/pubspec.yaml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
name: example
description: "A new Flutter project."
publish_to: 'none' # Remove this line if you wish to publish to pub.dev
publish_to: "none"
version: 1.0.0+1

environment:
Expand All @@ -12,18 +12,19 @@ dependencies:

flutter_gpu:
sdk: flutter

gpu_vector_tile_renderer:
path: ..

flutter_map: ^7.0.2
flutter_map: ^8.1.0
latlong2: ^0.9.1

# Ffi / Native assets
ffi: ^2.1.3
flutter_gpu_shaders: ^0.1.3
native_assets_cli: ^0.8.0
native_toolchain_c: ^0.5.4
logging: ^1.3.0

dev_dependencies:
flutter_test:
Expand Down
17 changes: 9 additions & 8 deletions lib/src/controller/controller.dart
Original file line number Diff line number Diff line change
Expand Up @@ -65,7 +65,7 @@ class VectorTileLayerController with ChangeNotifier {
notifyListeners();

// Trigger camera changed to set the initial visible tiles
if (_lastCamera != null) onCameraChanged(_lastCamera!, _lastTileSize!);
if (_lastCamera != null) onCameraChanged(_lastCamera!, _lastDimension!);
} catch (e) {
_logger.severe('Failed to load style', e);
rethrow;
Expand All @@ -91,7 +91,7 @@ class VectorTileLayerController with ChangeNotifier {
}

fm.MapCamera? _lastCamera;
double? _lastTileSize;
int? _lastDimension;
TileRangeCalculator? _tileRangeCalculator;
Map<Object, TileBounds>? _tileBoundsForSources;

Expand All @@ -101,15 +101,16 @@ class VectorTileLayerController with ChangeNotifier {
///
/// If the style hasn't been loaded yet, it will trigger updates once it's loaded, using the latest state of the
/// camera passed to this method.
void onCameraChanged(fm.MapCamera camera, double tileSize) {
void onCameraChanged(fm.MapCamera camera, int tileDimension) {
_lastCamera = camera;
_lastTileSize = tileSize;
_lastDimension = tileDimension;
if (!isLoaded) return;

final crs = camera.crs;

// Check if we need to update the tile range calculator
if (_tileRangeCalculator?.tileSize != tileSize) _tileRangeCalculator = TileRangeCalculator(tileSize: tileSize);
if (_tileRangeCalculator?.tileDimension != tileDimension)
_tileRangeCalculator = TileRangeCalculator(tileDimension: tileDimension);

// Check if we need to update the tile bounds for sources
_tileBoundsForSources ??= {};
Expand All @@ -118,7 +119,7 @@ class VectorTileLayerController with ChangeNotifier {
final source = entry.value;

final existingBounds = _tileBoundsForSources![key];
if (existingBounds != null && !existingBounds.shouldReplace(crs, tileSize, null)) continue;
if (existingBounds != null && !existingBounds.shouldReplace(crs, tileDimension, null)) continue;

if (source is spec.SourceVector && source.tiles != null) {
final bounds = fm.LatLngBounds.unsafe(
Expand All @@ -128,7 +129,7 @@ class VectorTileLayerController with ChangeNotifier {
west: source.bounds[0].toDouble(),
);

_tileBoundsForSources![key] = TileBounds(crs: crs, tileSize: tileSize, latLngBounds: bounds);
_tileBoundsForSources![key] = TileBounds(crs: crs, tileDimension: tileDimension, latLngBounds: bounds);
}
}

Expand All @@ -143,7 +144,7 @@ class VectorTileLayerController with ChangeNotifier {
final sourceKey = entry.key;
final source = style.sources[sourceKey]! as spec.SourceVector;
final bounds = entry.value;

// todo: clean this up
final zoomForSource = tileZoom.clamp(source.minzoom, source.maxzoom).toInt();
final boundsAtZoom = bounds.atZoom(zoomForSource);
Expand Down
18 changes: 8 additions & 10 deletions lib/src/debug/debug_painter.dart
Original file line number Diff line number Diff line change
@@ -1,42 +1,40 @@
import 'dart:ui';

import 'package:flutter/material.dart';
import 'package:flutter/widgets.dart';
import 'package:flutter_map/flutter_map.dart';
import 'package:gpu_vector_tile_renderer/_controller.dart';
import 'package:gpu_vector_tile_renderer/_renderer.dart';
import 'package:gpu_vector_tile_renderer/_vector_tile.dart' as vt;
import 'package:gpu_vector_tile_renderer/src/utils/flutter_map/tile_scale_calculator.dart';

class MapDebugPainter extends CustomPainter {
MapDebugPainter({required this.camera, required this.controller, required this.tileSize})
MapDebugPainter({required this.camera, required this.controller, required this.tileDimension})
: super(repaint: controller);

final MapCamera camera;
final double tileSize;
final int tileDimension;
final VectorTileLayerController controller;

@override
void paint(Canvas canvas, Size size) {
final tileScaleCalculator = TileScaleCalculator(crs: camera.crs, tileSize: tileSize);
final tileScaleCalculator = TileScaleCalculator(crs: camera.crs, tileDimension: tileDimension);
tileScaleCalculator.clearCacheUnlessZoomMatches(camera.zoom);

for (final tile in controller.tiles) {
if (tile.isLoaded) {
final vt = tile.vectorTiles.values.first;
final tileSize = tileScaleCalculator.scaledTileSize(camera.zoom, tile.coordinates.z);
final tileDimension = tileScaleCalculator.scaledTileDimension(camera.zoom, tile.coordinates.z);
final origin = Offset(
tile.coordinates.x * tileSize - camera.pixelOrigin.x,
tile.coordinates.y * tileSize - camera.pixelOrigin.y,
tile.coordinates.x * tileDimension - camera.pixelOrigin.dx,
tile.coordinates.y * tileDimension - camera.pixelOrigin.dy,
);

final transform =
Matrix4.identity()
..translate(origin.dx, origin.dy)
..scale(tileSize / vt.layers.first.extent, tileSize / vt.layers.first.extent);
..scale(tileDimension / vt.layers.first.extent, tileDimension / vt.layers.first.extent);

canvas.drawRect(
Rect.fromLTWH(origin.dx, origin.dy, tileSize, tileSize),
Rect.fromLTWH(origin.dx, origin.dy, tileDimension, tileDimension),
Paint()
..color = Colors.black.withValues(alpha: 0.2)
..style = PaintingStyle.stroke,
Expand Down
18 changes: 8 additions & 10 deletions lib/src/renderer/context.dart
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,6 @@ class RenderContext {
required this.size,
required this.pixelRatio,
required this.camera,
required this.unscaledTileSize,
required this.tileScaleCalculator,
required this.eval,
});
Expand All @@ -25,12 +24,11 @@ class RenderContext {
final Size size;
final double pixelRatio;
final MapCamera camera;
final double unscaledTileSize;
final EvaluationContext eval;
final TileScaleCalculator tileScaleCalculator;

double getScaledTileSize(TileCoordinates coordinates) =>
tileScaleCalculator.scaledTileSize(camera.zoom, coordinates.z);
double getScaledTileDimension(TileCoordinates coordinates) =>
tileScaleCalculator.scaledTileDimension(camera.zoom, coordinates.z);

Size get scaledSize => size * pixelRatio;

Expand All @@ -40,23 +38,23 @@ class RenderContext {
worldToGl.translate(-1.0, 1.0);
worldToGl.scale(pixelRatio);
worldToGl.scale(2.0 / scaledSize.width, -2.0 / scaledSize.height);
worldToGl.translate(-camera.pixelOrigin.x, -camera.pixelOrigin.y);
worldToGl.translate(-camera.pixelOrigin.dx, -camera.pixelOrigin.dy);

return worldToGl;
}

void setTileScissor(RenderPass pass, TileCoordinates coordinates) {
final scaledTileSize = getScaledTileSize(coordinates);
final scaledTileDimension = getScaledTileDimension(coordinates);

final origin = Offset(
coordinates.x * scaledTileSize - camera.pixelOrigin.x,
coordinates.y * scaledTileSize - camera.pixelOrigin.y,
coordinates.x * scaledTileDimension - camera.pixelOrigin.dx,
coordinates.y * scaledTileDimension - camera.pixelOrigin.dy,
);

var _x = (origin.dx * pixelRatio).ceil();
var _y = (origin.dy * pixelRatio).ceil();
var _width = (scaledTileSize * pixelRatio).ceil();
var _height = (scaledTileSize * pixelRatio).ceil();
var _width = (scaledTileDimension * pixelRatio).ceil();
var _height = (scaledTileDimension * pixelRatio).ceil();

if (_x < 0) {
_width += _x;
Expand Down
6 changes: 3 additions & 3 deletions lib/src/renderer/layers/_generator.dart
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ List<String> setUniformsGenerator(List<String> uniformEval, List<String> uniform
' double cameraZoom,',
' double pixelRatio,',
' Matrix4 tileLocalToWorld,',
' double tileSize,',
' int tileDimension,',
' double tileExtent,',
' double tileOpacity,',
') {',
Expand All @@ -42,8 +42,8 @@ List<String> setUniformsGenerator(List<String> uniformEval, List<String> uniform
' cameraWorldToGl: cameraWorldToGl,',
' cameraZoom: cameraZoom,',
' cameraPixelRatio: pixelRatio,'
' tileLocalToWorld: tileLocalToWorld,',
' tileSize: tileSize,',
' tileLocalToWorld: tileLocalToWorld,',
' tileDimension: tileDimension,',
' tileExtent: tileExtent,',
' tileOpacity: tileOpacity,',
...uniformSetters.map((v) => ' $v,'),
Expand Down
6 changes: 3 additions & 3 deletions lib/src/renderer/layers/fill_layer_renderer.dart
Original file line number Diff line number Diff line change
Expand Up @@ -75,8 +75,8 @@ abstract class FillLayerRenderer extends SingleTileLayerRenderer<spec.LayerFill>
void draw(RenderContext context) {
if (!pipeline.isReady) return;

final tileSize = context.getScaledTileSize(coordinates);
final origin = ui.Offset(coordinates.x * tileSize, coordinates.y * tileSize);
final tileDimension = context.getScaledTileDimension(coordinates);
final origin = ui.Offset(coordinates.x * tileDimension, coordinates.y * tileDimension);
final tileLocalToWorld = Matrix4.identity()..translate(origin.dx, origin.dy);

setUniforms(
Expand All @@ -85,7 +85,7 @@ abstract class FillLayerRenderer extends SingleTileLayerRenderer<spec.LayerFill>
context.camera.zoom,
context.pixelRatio,
tileLocalToWorld,
tileSize,
tileDimension,
vtLayer.extent.toDouble(),
container.opacityAnimation.value,
);
Expand Down
6 changes: 3 additions & 3 deletions lib/src/renderer/layers/line_layer_renderer.dart
Original file line number Diff line number Diff line change
Expand Up @@ -188,8 +188,8 @@ abstract class LineLayerRenderer extends SingleTileLayerRenderer<spec.LayerLine>
void draw(RenderContext context) {
if (!pipeline.isReady) return;

final tileSize = context.getScaledTileSize(coordinates);
final origin = ui.Offset(coordinates.x * tileSize, coordinates.y * tileSize);
final tileDimension = context.getScaledTileDimension(coordinates);
final origin = ui.Offset(coordinates.x * tileDimension, coordinates.y * tileDimension);
final tileLocalToWorld = Matrix4.identity()..translate(origin.dx, origin.dy);

setUniforms(
Expand All @@ -198,7 +198,7 @@ abstract class LineLayerRenderer extends SingleTileLayerRenderer<spec.LayerLine>
context.camera.zoom,
context.pixelRatio,
tileLocalToWorld,
tileSize,
tileDimension,
vtLayer.extent.toDouble(),
container.opacityAnimation.value,
);
Expand Down
13 changes: 6 additions & 7 deletions lib/src/renderer/render_orchestrator.dart
Original file line number Diff line number Diff line change
Expand Up @@ -81,16 +81,16 @@ class VectorTileLayerRenderOrchestrator with ChangeNotifier {
}

fm.MapCamera? _lastCamera;
double? _lastTileSize;
int? _lastTileDimension;
TileScaleCalculator? _tileScaleCalculator;

void onCameraChanged(fm.MapCamera camera, double tileSize) {
if (_tileScaleCalculator == null || tileSize != _lastTileSize) {
_tileScaleCalculator = TileScaleCalculator(crs: camera.crs, tileSize: tileSize);
void onCameraChanged(fm.MapCamera camera, int tileDimension) {
if (_tileScaleCalculator == null || tileDimension != _lastTileDimension) {
_tileScaleCalculator = TileScaleCalculator(crs: camera.crs, tileDimension: tileDimension);
}

_lastCamera = camera;
_lastTileSize = tileSize;
_lastTileDimension = tileDimension;
_tileScaleCalculator!.clearCacheUnlessZoomMatches(camera.zoom);
}

Expand Down Expand Up @@ -134,7 +134,7 @@ class VectorTileLayerRenderOrchestrator with ChangeNotifier {
required ui.Size size,
required double pixelRatio,
required fm.MapCamera camera,
required double tileSize,
required int tileDimension,
}) {
if (_layers == null) return null;
_setupTextures(size, pixelRatio);
Expand Down Expand Up @@ -171,7 +171,6 @@ class VectorTileLayerRenderOrchestrator with ChangeNotifier {
size: size,
pixelRatio: pixelRatio,
camera: camera,
unscaledTileSize: tileSize,
tileScaleCalculator: _tileScaleCalculator!,
eval: spec.EvaluationContext(geometryType: '', zoom: camera.zoom, locale: spec.Locale(languageCode: 'en')),
);
Expand Down
6 changes: 3 additions & 3 deletions lib/src/renderer/render_orchestrator_painter.dart
Original file line number Diff line number Diff line change
Expand Up @@ -6,18 +6,18 @@ class RenderOrchestratorPainter extends CustomPainter {
RenderOrchestratorPainter({
required this.camera,
required this.pixelRatio,
required this.tileSize,
required this.tileDimension,
required this.orchestrator,
}) : super(repaint: orchestrator);

final MapCamera camera;
final double pixelRatio;
final double tileSize;
final int tileDimension;
final VectorTileLayerRenderOrchestrator orchestrator;

@override
void paint(Canvas canvas, Size size) {
final image = orchestrator.draw(camera: camera, pixelRatio: pixelRatio, size: size, tileSize: tileSize);
final image = orchestrator.draw(camera: camera, pixelRatio: pixelRatio, size: size, tileDimension: tileDimension);
if (image == null) return;

canvas.scale(1 / pixelRatio);
Expand Down
2 changes: 1 addition & 1 deletion lib/src/utils/flutter_map/LICENSE
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
BSD 3-Clause License

Copyright (c) 2018-2024, the 'flutter_map' authors and maintainers
Copyright (c) 2018-2025, the 'flutter_map' authors and maintainers

All rights reserved.

Expand Down
4 changes: 3 additions & 1 deletion lib/src/utils/flutter_map/README.md
Original file line number Diff line number Diff line change
@@ -1 +1,3 @@
Files here are copied from the flutter_map repository (https://github.com/fleaflet/flutter_map).
Files here are copied from the flutter_map repository (<https://github.com/fleaflet/flutter_map>).

The future intention is to make the FM repo more extendable to prevent this.
Loading