import 'package:ar_flutter_plugin/managers/ar_location_manager.dart'; import 'package:ar_flutter_plugin/managers/ar_session_manager.dart'; import 'package:ar_flutter_plugin/managers/ar_object_manager.dart'; import 'package:ar_flutter_plugin/managers/ar_anchor_manager.dart'; import 'package:ar_flutter_plugin/models/ar_anchor.dart'; import 'package:flutter/material.dart'; import 'package:ar_flutter_plugin/ar_flutter_plugin.dart'; import 'package:ar_flutter_plugin/datatypes/config_planedetection.dart'; import 'package:ar_flutter_plugin/datatypes/node_types.dart'; import 'package:ar_flutter_plugin/datatypes/hittest_result_types.dart'; import 'package:ar_flutter_plugin/models/ar_node.dart'; import 'package:ar_flutter_plugin/models/ar_hittest_result.dart'; import 'package:vector_math/vector_math_64.dart'; class ScreenshotWidget extends StatefulWidget { const ScreenshotWidget({Key? key}) : super(key: key); @override _ScreenshotWidgetState createState() => _ScreenshotWidgetState(); } class _ScreenshotWidgetState extends State { ARSessionManager? arSessionManager; ARObjectManager? arObjectManager; ARAnchorManager? arAnchorManager; List nodes = []; List anchors = []; @override void dispose() { super.dispose(); arSessionManager!.dispose(); } @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( title: const Text('Screenshots'), ), body: Container( child: Stack(children: [ ARView( onARViewCreated: onARViewCreated, planeDetectionConfig: PlaneDetectionConfig.horizontalAndVertical, ), Align( alignment: FractionalOffset.bottomCenter, child: Row( mainAxisAlignment: MainAxisAlignment.spaceEvenly, children: [ ElevatedButton( onPressed: onRemoveEverything, child: const Text("Remove Everything")), ElevatedButton( onPressed: onTakeScreenshot, child: const Text("Take Screenshot")), ]), ) ]))); } void onARViewCreated( ARSessionManager arSessionManager, ARObjectManager arObjectManager, ARAnchorManager arAnchorManager, ARLocationManager arLocationManager) { this.arSessionManager = arSessionManager; this.arObjectManager = arObjectManager; this.arAnchorManager = arAnchorManager; this.arSessionManager!.onInitialize( showFeaturePoints: false, showPlanes: true, customPlaneTexturePath: "Images/triangle.png", showWorldOrigin: true, ); this.arObjectManager!.onInitialize(); this.arSessionManager!.onPlaneOrPointTap = onPlaneOrPointTapped; this.arObjectManager!.onNodeTap = onNodeTapped; } Future onRemoveEverything() async { /*nodes.forEach((node) { this.arObjectManager.removeNode(node); });*/ // anchors.forEach((anchor) for (var anchor in anchors) { arAnchorManager!.removeAnchor(anchor); }; anchors = []; } Future onTakeScreenshot() async { var image = await arSessionManager!.snapshot(); await showDialog( context: context, builder: (_) => Dialog( child: Container( decoration: BoxDecoration( image: DecorationImage(image: image, fit: BoxFit.cover)), ), )); } Future onNodeTapped(List nodes) async { var number = nodes.length; arSessionManager!.onError("Tapped $number node(s)"); } Future onPlaneOrPointTapped( List hitTestResults) async { var singleHitTestResult = hitTestResults.firstWhere( (hitTestResult) => hitTestResult.type == ARHitTestResultType.plane); if (singleHitTestResult != null) { var newAnchor = ARPlaneAnchor(transformation: singleHitTestResult.worldTransform); bool? didAddAnchor = await arAnchorManager!.addAnchor(newAnchor); if (didAddAnchor != null && didAddAnchor) { anchors.add(newAnchor); // Add note to anchor var newNode = ARNode( type: NodeType.webGLB, uri: "https://github.com/KhronosGroup/glTF-Sample-Models/blob/main/2.0/Duck/glTF-Binary/Duck.glb", scale: Vector3(0.2, 0.2, 0.2), position: Vector3(0.0, 0.0, 0.0), rotation: Vector4(1.0, 0.0, 0.0, 0.0)); bool? didAddNodeToAnchor = await arObjectManager!.addNode(newNode, planeAnchor: newAnchor); if (didAddNodeToAnchor != null && didAddNodeToAnchor) { nodes.add(newNode); } else { arSessionManager!.onError("Adding Node to Anchor failed"); } } else { arSessionManager!.onError("Adding Anchor failed"); } /* // To add a node to the tapped position without creating an anchor, use the following code (Please mind: the function onRemoveEverything has to be adapted accordingly!): var newNode = ARNode( type: NodeType.localGLTF2, uri: "Models/Chicken_01/Chicken_01.gltf", scale: Vector3(0.2, 0.2, 0.2), transformation: singleHitTestResult.worldTransform); bool didAddWebNode = await this.arObjectManager.addNode(newNode); if (didAddWebNode) { this.nodes.add(newNode); }*/ } } }