layout method
AnnotationLayoutResult
layout({
- required List<
ArAnnotation> annotations, - required ArSensor arSensor,
- required Position deviceLocation,
- required double width,
- required double height,
- required AnnotationLayoutConfig config,
- Map<
String, int> previousRows = const {}, - AnnotationGeoCache? geoCache,
Implementation
AnnotationLayoutResult layout({
required List<ArAnnotation> annotations,
required ArSensor arSensor,
required Position deviceLocation,
required double width,
required double height,
required AnnotationLayoutConfig config,
Map<String, int> previousRows = const {},
AnnotationGeoCache? geoCache,
}) {
geoCache?.prepare(deviceLocation, annotations.length);
final projection = ArProjection(
width: width,
height: height,
cameraFieldOfView: config.cameraFieldOfView,
previewAspectRatio: config.previewAspectRatio,
);
final rotation = arSensor.rotationMatrix ??
ArRotation.fromHeadingPitch(arSensor.heading, arSensor.pitch);
final status = _status(projection, arSensor, deviceLocation);
final visible = <ArAnnotation>[];
for (final annotation in annotations) {
if (geoCache == null || !geoCache.restore(annotation)) {
_locate(annotation, deviceLocation);
geoCache?.store(annotation);
}
annotation.arScale = _scale(annotation, config);
annotation.isVisible =
annotation.distanceFromUser < config.maxVisibleDistance &&
!(config.hideWithinLocationAccuracy &&
annotation.distanceFromUser < deviceLocation.accuracy) &&
_place(annotation, deviceLocation.altitude, rotation, projection,
config);
if (annotation.isVisible) visible.add(annotation);
}
final overlap = _transformAnnotation(visible, config, previousRows);
visible.removeWhere((annotation) => !annotation.isVisible);
return AnnotationLayoutResult(
annotations: visible,
status: status,
rows: overlap.rows,
groups: overlap.groups,
);
}