From 4ec9dbe756e786c4488f4029ae87140ebc730f55 Mon Sep 17 00:00:00 2001 From: Nick Fisher Date: Tue, 8 Aug 2023 11:16:34 +0800 Subject: [PATCH] fix resizing --- example/lib/main.dart | 21 ++++++++++---------- ios/Classes/SwiftPolyvoxFilamentPlugin.swift | 15 +++++++------- lib/filament_controller.dart | 18 +++-------------- lib/filament_widget.dart | 19 +++++++++++------- 4 files changed, 33 insertions(+), 40 deletions(-) diff --git a/example/lib/main.dart b/example/lib/main.dart index 9db84323..aae81648 100644 --- a/example/lib/main.dart +++ b/example/lib/main.dart @@ -362,17 +362,16 @@ class _ExampleWidgetState extends State { _item(value: 32, child: Text('set camera model matrix')), ])), Container( - width: _vertical ? 200 : 400, - height: _vertical ? 400 : 200, - alignment: Alignment.center, - child: SizedBox( - child: FilamentGestureDetector( - showControlOverlay: true, - controller: _filamentController, - child: FilamentWidget( - controller: _filamentController, - )), - )), + width: _vertical ? 200 : 400, + height: _vertical ? 400 : 200, + alignment: Alignment.center, + child: FilamentGestureDetector( + showControlOverlay: true, + controller: _filamentController, + child: FilamentWidget( + controller: _filamentController, + )), + ), ]); } } diff --git a/ios/Classes/SwiftPolyvoxFilamentPlugin.swift b/ios/Classes/SwiftPolyvoxFilamentPlugin.swift index 16c05c8b..0cc8d1db 100644 --- a/ios/Classes/SwiftPolyvoxFilamentPlugin.swift +++ b/ios/Classes/SwiftPolyvoxFilamentPlugin.swift @@ -187,10 +187,15 @@ public class SwiftPolyvoxFilamentPlugin: NSObject, FlutterPlugin, FlutterTexture createPixelBuffer(width:Int(args[0]), height:Int(args[1])) createDisplayLink() result(self.flutterTextureId) - case "getResourceLoader": - let callback = make_resource_loader(loadResource, freeResource, Unmanaged.passUnretained(self).toOpaque()) - result(unsafeBitCast(callback, to:Int64.self)) case "resize": + rendering = false + destroy_swap_chain(viewer) + let args = call.arguments as! [Any] + resize(width:args[0] as! Int32, height:args[1] as! Int32) + var pixelBufferTextureId = unsafeBitCast(pixelBuffer!, to: UnsafeRawPointer.self) + create_swap_chain(viewer, pixelBufferTextureId, UInt32(args[0] as! Int64), UInt32(args[1] as! Int64)) + update_viewport_and_camera_projection(viewer, Int32(args[0] as! Int64), Int32(args[1] as! Int64), Float(args[2] as! Double)) + rendering = true result(self.flutterTextureId); case "createFilamentViewer": let callback = make_resource_loader(loadResource, freeResource, Unmanaged.passUnretained(self).toOpaque()) @@ -208,10 +213,6 @@ public class SwiftPolyvoxFilamentPlugin: NSObject, FlutterPlugin, FlutterTexture case "getAssetManager": let assetManager = get_asset_manager(viewer) result(unsafeBitCast(assetManager, to:Int64.self)) - case "createRenderTarget": - let args = call.arguments as! [Any] - create_render_target(viewer, args[0] as! UInt32, args[1] as! UInt32, args[2] as! UInt32) - result(true) case "clearBackgroundImage": clear_background_image(viewer) result(true) diff --git a/lib/filament_controller.dart b/lib/filament_controller.dart index 5853b0fc..7467441d 100644 --- a/lib/filament_controller.dart +++ b/lib/filament_controller.dart @@ -97,21 +97,9 @@ class FilamentController { Future resize(int width, int height, {double contentScaleFactor = 1.0}) async { - // await setRendering(false); - // _textureIdController.add(null); - // await _channel.invokeMethod("destroy_swap_chain(_viewer); - // size = ui.Size(width * _pixelRatio, height * _pixelRatio); - - // _textureId = await _channel.invokeMethod("resize", - // [width * _pixelRatio, height * _pixelRatio, contentScaleFactor]); - - // _textureIdController.add(_textureId); - // await _channel.invokeMethod("create_swap_chain( nullptr, width, height); - // await _channel.invokeMethod("create_render_target( - // await _channel.invokeMethod("getGlTextureId"), width, height); - // await _channel.invokeMethod("update_viewport_and_camera_projection( - // width, height, contentScaleFactor); - // await setRendering(true); + _textureId = await _channel.invokeMethod("resize", + [width * _pixelRatio, height * _pixelRatio, contentScaleFactor]); + _textureIdController.add(_textureId); } void clearBackgroundImage() async { diff --git a/lib/filament_widget.dart b/lib/filament_widget.dart index ea8b42ef..a8c05e25 100644 --- a/lib/filament_widget.dart +++ b/lib/filament_widget.dart @@ -103,14 +103,19 @@ class _FilamentWidgetState extends State { width: constraints.maxWidth, child: ResizeObserver( onResized: (Size oldSize, Size newSize) async { - // setState(() { - // _resizing = true; - // }); + WidgetsBinding.instance.addPostFrameCallback((_) async { + setState(() { + _resizing = true; + }); - await widget.controller.resize( - newSize.width.toInt(), newSize.height.toInt()); - setState(() { - _resizing = false; + await widget.controller.resize( + newSize.width.toInt(), newSize.height.toInt()); + WidgetsBinding.instance + .addPostFrameCallback((_) async { + setState(() { + _resizing = false; + }); + }); }); }, child: Platform.isLinux