diff --git a/lib/src/controllers/flutter_3d_controller.dart b/lib/src/controllers/flutter_3d_controller.dart index 86c67f9..103ad77 100644 --- a/lib/src/controllers/flutter_3d_controller.dart +++ b/lib/src/controllers/flutter_3d_controller.dart @@ -1,17 +1,20 @@ import 'package:flutter/foundation.dart'; import 'package:flutter_3d_controller/src/controllers/i_flutter_3d_controller.dart'; -import 'package:flutter_3d_controller/src/data/repositories/i_flutter_3d_repository.dart'; import 'package:flutter_3d_controller/src/core/exception/flutter_3d_controller_exception.dart'; +import 'package:flutter_3d_controller/src/data/repositories/i_flutter_3d_repository.dart'; +import 'package:flutter_inappwebview/flutter_inappwebview.dart'; class Flutter3DController extends IFlutter3DController { IFlutter3DRepository? _repository; + InAppWebViewController? _webViewController; Flutter3DController(); ValueNotifier onModelLoaded = ValueNotifier(false); - void init(IFlutter3DRepository repository) { + void init(IFlutter3DRepository repository, InAppWebViewController? webViewController) { _repository = repository; + _webViewController = webViewController; } @override @@ -99,9 +102,9 @@ class Flutter3DController extends IFlutter3DController { } @override - void setCameraOrbit(double theta, double phi, double radius) { + void setCameraOrbit(double theta, double phi, double radius, {bool isAnimate = true}) { if (onModelLoaded.value) { - _repository?.setCameraOrbit(theta, phi, radius); + _repository?.setCameraOrbit(theta, phi, radius, isAnimate); } else { throw Flutter3dControllerLoadingException(); } @@ -115,4 +118,14 @@ class Flutter3DController extends IFlutter3DController { throw Flutter3dControllerLoadingException(); } } + + @override + Future takeScreenshot() async { + try { + final screenshot = await _webViewController?.takeScreenshot(); + return screenshot; + } catch (e) { + return null; + } + } } diff --git a/lib/src/controllers/i_flutter_3d_controller.dart b/lib/src/controllers/i_flutter_3d_controller.dart index 62353ff..0efa718 100644 --- a/lib/src/controllers/i_flutter_3d_controller.dart +++ b/lib/src/controllers/i_flutter_3d_controller.dart @@ -1,3 +1,5 @@ +import 'dart:typed_data'; + abstract class IFlutter3DController { /// Causes animations to be played, Can be use to switch animations as well. /// If animationName is null and model has at list one animation, it will play first model's animation @@ -41,4 +43,7 @@ abstract class IFlutter3DController { /// Causes camera target reset to default value void resetCameraOrbit(); + + /// It will take screenshot of 3D model as [Uint8List] + Future takeScreenshot(); } diff --git a/lib/src/data/datasources/flutter_3d_datasource_mobile.dart b/lib/src/data/datasources/flutter_3d_datasource_mobile.dart index 4bfcfba..c036bad 100644 --- a/lib/src/data/datasources/flutter_3d_datasource_mobile.dart +++ b/lib/src/data/datasources/flutter_3d_datasource_mobile.dart @@ -131,14 +131,25 @@ class Flutter3DDatasource implements IFlutter3DDatasource { } @override - void setCameraOrbit(double theta, double phi, double radius) { - executeCustomJsCode( - "const modelViewer = document.getElementById(\"$_viewerId\");" - "modelViewer.cameraOrbit = \"${theta}deg ${phi}deg $radius%\";", - 100, - 400, - _activeGestureInterceptor, - ); + void setCameraOrbit(double theta, double phi, double radius, bool isAnimate) { + if (isAnimate) { + executeCustomJsCode( + "const modelViewer = document.getElementById(\"$_viewerId\");" + "modelViewer.cameraOrbit = \"${theta}deg ${phi}deg $radius%\";", + 100, + 400, + _activeGestureInterceptor, + ); + } else { + executeCustomJsCode( + "const modelViewer = document.getElementById(\"$_viewerId\");" + "modelViewer.cameraOrbit = \"${theta}deg ${phi}deg $radius%\";" + "modelViewer.jumpCameraToGoal();", + 100, + 400, + _activeGestureInterceptor, + ); + } } @override diff --git a/lib/src/data/datasources/flutter_3d_datasource_web.dart b/lib/src/data/datasources/flutter_3d_datasource_web.dart index e51b248..7f3fcba 100644 --- a/lib/src/data/datasources/flutter_3d_datasource_web.dart +++ b/lib/src/data/datasources/flutter_3d_datasource_web.dart @@ -107,11 +107,19 @@ class Flutter3DDatasource implements IFlutter3DDatasource { } @override - void setCameraOrbit(double theta, double phi, double radius) { - executeCustomJsCode( - "const modelViewer = document.getElementById(\"$_viewerId\");" - "modelViewer.cameraOrbit = \"${theta}deg ${phi}deg $radius%\";", - ); + void setCameraOrbit(double theta, double phi, double radius, bool isAnimate) { + if (isAnimate) { + executeCustomJsCode( + "const modelViewer = document.getElementById(\"$_viewerId\");" + "modelViewer.cameraOrbit = \"${theta}deg ${phi}deg $radius%\";", + ); + } else { + executeCustomJsCode( + "const modelViewer = document.getElementById(\"$_viewerId\");" + "modelViewer.cameraOrbit = \"${theta}deg ${phi}deg $radius%\";" + "modelViewer.jumpCameraToGoal();", + ); + } } @override diff --git a/lib/src/data/datasources/i_flutter_3d_datasource.dart b/lib/src/data/datasources/i_flutter_3d_datasource.dart index eea7c14..9fd0f32 100644 --- a/lib/src/data/datasources/i_flutter_3d_datasource.dart +++ b/lib/src/data/datasources/i_flutter_3d_datasource.dart @@ -40,7 +40,7 @@ abstract class IFlutter3DDatasource { void resetCameraTarget(); /// It will change camera orbit - void setCameraOrbit(double theta, double phi, double radius); + void setCameraOrbit(double theta, double phi, double radius, bool isAnimate); /// Causes camera target reset to default value void resetCameraOrbit(); diff --git a/lib/src/data/repositories/flutter_3d_repository.dart b/lib/src/data/repositories/flutter_3d_repository.dart index 9403fa5..91a5a65 100644 --- a/lib/src/data/repositories/flutter_3d_repository.dart +++ b/lib/src/data/repositories/flutter_3d_repository.dart @@ -55,8 +55,8 @@ class Flutter3DRepository extends IFlutter3DRepository { } @override - void setCameraOrbit(double theta, double phi, double radius) { - _datasource.setCameraOrbit(theta, phi, radius); + void setCameraOrbit(double theta, double phi, double radius, bool isAnimate) { + _datasource.setCameraOrbit(theta, phi, radius, isAnimate); } @override diff --git a/lib/src/data/repositories/i_flutter_3d_repository.dart b/lib/src/data/repositories/i_flutter_3d_repository.dart index 5e08130..eed927b 100644 --- a/lib/src/data/repositories/i_flutter_3d_repository.dart +++ b/lib/src/data/repositories/i_flutter_3d_repository.dart @@ -37,7 +37,7 @@ abstract class IFlutter3DRepository { void resetCameraTarget(); /// It will change camera orbit - void setCameraOrbit(double theta, double phi, double radius); + void setCameraOrbit(double theta, double phi, double radius, bool isAnimate); /// Causes camera target reset to default value void resetCameraOrbit(); diff --git a/lib/src/widgets/flutter_3d_viewer.dart b/lib/src/widgets/flutter_3d_viewer.dart index 629e816..9ac57c2 100644 --- a/lib/src/widgets/flutter_3d_viewer.dart +++ b/lib/src/widgets/flutter_3d_viewer.dart @@ -101,8 +101,7 @@ class _Flutter3DViewerState extends State { _id = _utils.generateId(); _controller = widget.controller ?? Flutter3DController(); if (kIsWeb) { - _controller - .init(Flutter3DRepository(IFlutter3DDatasource(_id, null, false))); + _controller.init(Flutter3DRepository(IFlutter3DDatasource(_id, null, false)), null); } super.initState(); } @@ -167,6 +166,7 @@ class _Flutter3DViewerState extends State { widget.activeGestureInterceptor, ), ), + value, ); }, );