onTap method

Future<void> onTap(
  1. double x,
  2. double y
)

Handle a tap on the AR view.

Implementation

Future<void> onTap(double x, double y) async {
  final results = await arService.hitTest(x, y);
  if (results.isEmpty) return;

  // Use the most accurate hit result
  final best = results.first;

  switch (measureState.value) {
    case ArMeasureState.scanning:
    case ArMeasureState.placingFirst:
      // Place first point
      _firstPoint = best;
      _firstMarkerId = await arService.addMarker(best, label: 'A');
      measureState.value = ArMeasureState.placingSecond;
      statusMessage.value = 'arTapSecondPoint'.tr;

    case ArMeasureState.placingSecond:
      // Place second point and calculate distance
      final secondMarkerId = await arService.addMarker(best, label: 'B');

      final measurement = ArMeasurement(
        pointA: _firstPoint!.pose,
        pointB: best.pose,
      );

      await arService.addDistanceLine(
        _firstMarkerId!,
        secondMarkerId,
        measurement,
      );

      currentMeasurement.value = measurement;
      measureService.addMeasurement(measurement);
      measureState.value = ArMeasureState.measured;
      statusMessage.value = measurement.formattedDistance;

    case ArMeasureState.measured:
      // Reset for next measurement
      await arService.clearMarkers();
      _firstPoint = null;
      _firstMarkerId = null;
      measureState.value = ArMeasureState.placingFirst;
      statusMessage.value = 'arTapFirstPoint'.tr;
      // Recurse to place the first point of the new measurement
      await onTap(x, y);

    default:
      break;
  }
}