layout method

AnnotationLayoutResult layout({
  1. required List<ArAnnotation> annotations,
  2. required ArSensor arSensor,
  3. required Position deviceLocation,
  4. required double width,
  5. required double height,
  6. required AnnotationLayoutConfig config,
  7. Map<String, int> previousRows = const {},
  8. 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,
  );
}