diff --git a/ios/src/PolyvoxFilamentFFIApi.cpp b/ios/src/PolyvoxFilamentFFIApi.cpp index e702f7a5..61ea39f3 100644 --- a/ios/src/PolyvoxFilamentFFIApi.cpp +++ b/ios/src/PolyvoxFilamentFFIApi.cpp @@ -52,7 +52,9 @@ public: _renderCallback = renderCallback; _renderCallbackOwner = owner; std::packaged_task lambda([&]() mutable - { return new FilamentViewer(context, loader, platform); }); + { + return new FilamentViewer(context, loader, platform); + }); auto fut = add_task(lambda); fut.wait(); _viewer = fut.get(); @@ -118,8 +120,11 @@ extern "C" FLUTTER_PLUGIN_EXPORT void create_swap_chain_ffi(void* const viewer, void* const surface, uint32_t width, uint32_t height) { + Log("Creating swapchain %dx%d", width, height); std::packaged_task lambda([&]() mutable - { create_swap_chain(viewer, surface, width, height); }); + { + create_swap_chain(viewer, surface, width, height); + }); auto fut = _rl->add_task(lambda); fut.wait(); } @@ -134,8 +139,11 @@ extern "C" FLUTTER_PLUGIN_EXPORT void update_viewport_and_camera_projection_ffi(void* const viewer, const uint32_t width, const uint32_t height, const float scaleFactor) { + Log("Update viewport %dx%d", width, height); std::packaged_task lambda([&]() mutable - { update_viewport_and_camera_projection(viewer, width, height, scaleFactor); }); + { + update_viewport_and_camera_projection(viewer, width, height, scaleFactor); + }); auto fut = _rl->add_task(lambda); fut.wait(); } @@ -167,7 +175,9 @@ extern "C" FLUTTER_PLUGIN_EXPORT void render_ffi(void* const viewer) { std::packaged_task lambda([&]() mutable - { _rl->doRender(); }); + { + _rl->doRender(); + }); auto fut = _rl->add_task(lambda); fut.wait(); } @@ -192,7 +202,9 @@ extern "C" FLUTTER_PLUGIN_EXPORT void clear_background_image_ffi(void* const viewer) { std::packaged_task lambda([&] - { clear_background_image(viewer); }); + { + clear_background_image(viewer); + }); auto fut = _rl->add_task(lambda); fut.wait(); } @@ -200,7 +212,9 @@ extern "C" FLUTTER_PLUGIN_EXPORT void set_background_image_ffi(void* const viewer, const char *path, bool fillHeight) { std::packaged_task lambda([&] - { set_background_image(viewer, path, fillHeight); }); + { + set_background_image(viewer, path, fillHeight); + }); auto fut = _rl->add_task(lambda); fut.wait(); } diff --git a/lib/filament_widget.dart b/lib/filament_widget.dart index 0fe01105..0b9a3308 100644 --- a/lib/filament_widget.dart +++ b/lib/filament_widget.dart @@ -51,22 +51,23 @@ class _RenderResizeObserver extends RenderProxyBox { class FilamentWidget extends StatefulWidget { final FilamentController controller; - + /// - /// The content to render before the texture widget is available. + /// The content to render before the texture widget is available. /// The default is a solid red Container, intentionally chosen to make it clear that there will be at least one frame where the Texture widget is not being rendered. - /// + /// late final Widget initial; final void Function()? onResize; - FilamentWidget({Key? key, required this.controller, this.onResize, Widget? initial}) + FilamentWidget( + {Key? key, required this.controller, this.onResize, Widget? initial}) : super(key: key) { - if(initial != null) { - this.initial = initial; - } else { - this.initial = Container(color:Colors.red); - } - } + if (initial != null) { + this.initial = initial; + } else { + this.initial = Container(color: Colors.red); + } + } @override _FilamentWidgetState createState() => _FilamentWidgetState(); @@ -83,39 +84,39 @@ class _FilamentWidgetState extends State { Timer? _resizeTimer; void _handleStateChange(AppLifecycleState state) async { - // switch (state) { - // case AppLifecycleState.detached: - // print("Detached"); - // _textureId = null; + switch (state) { + case AppLifecycleState.detached: + print("Detached"); + _textureId = null; - // await widget.controller.destroyViewer(); - // await widget.controller.destroyTexture(); - // break; - // case AppLifecycleState.hidden: - // print("Hidden"); - // if (Platform.isIOS) { - // _textureId = null; - // await widget.controller.destroyViewer(); - // await widget.controller.destroyTexture(); - // } - // break; - // case AppLifecycleState.inactive: - // print("Inactive"); - // break; - // case AppLifecycleState.paused: - // print("Paused"); - // break; - // case AppLifecycleState.resumed: - // print("Resumed"); - // if (_textureId == null) { - // var size = ((context.findRenderObject()) as RenderBox).size; - // print("Size after resuming : $size"); - // await widget.controller - // .createViewer(size.width.toInt(), size.height.toInt()); - // print("Created viewer Size after resuming"); - // } - // break; - // } + await widget.controller.destroyViewer(); + await widget.controller.destroyTexture(); + break; + case AppLifecycleState.hidden: + print("Hidden"); + if (Platform.isIOS) { + _textureId = null; + await widget.controller.destroyViewer(); + await widget.controller.destroyTexture(); + } + break; + case AppLifecycleState.inactive: + print("Inactive"); + break; + case AppLifecycleState.paused: + print("Paused"); + break; + case AppLifecycleState.resumed: + print("Resumed"); + if (_textureId == null) { + var size = ((context.findRenderObject()) as RenderBox).size; + print("Size after resuming : $size"); + await widget.controller + .createViewer(size.width.toInt(), size.height.toInt()); + print("Created viewer Size after resuming"); + } + break; + } _lastState = state; } @@ -127,6 +128,7 @@ class _FilamentWidgetState extends State { WidgetsBinding.instance.addPostFrameCallback((timeStamp) async { var size = ((context.findRenderObject()) as RenderBox).size; + widget.controller.createViewer(size.width.toInt(), size.height.toInt()); }); @@ -159,7 +161,7 @@ class _FilamentWidgetState extends State { var texture = Texture( key: ObjectKey("texture_$_textureId"), textureId: _textureId!, - filterQuality: FilterQuality.high, + filterQuality: FilterQuality.none, ); return SizedBox( height: constraints.maxHeight,