From 7f107708b509155a6f72b831afd48305f2686770 Mon Sep 17 00:00:00 2001 From: Nick Fisher Date: Fri, 13 Oct 2023 11:24:29 +0800 Subject: [PATCH] fix resizing --- lib/filament_controller_ffi.dart | 33 ++++++++++++++++++++++++++------ 1 file changed, 27 insertions(+), 6 deletions(-) diff --git a/lib/filament_controller_ffi.dart b/lib/filament_controller_ffi.dart index a2afc4f1..9ba29b01 100644 --- a/lib/filament_controller_ffi.dart +++ b/lib/filament_controller_ffi.dart @@ -53,11 +53,14 @@ class FilamentControllerFFI extends FilamentController { _lib = NativeLibrary(dl); } + bool _rendering = false; + @override Future setRendering(bool render) async { if (_viewer == null || _resizing) { throw Exception("No viewer available, ignoring"); } + _rendering = render; _lib.set_rendering_ffi(_viewer!, render); } @@ -102,9 +105,14 @@ class FilamentControllerFFI extends FilamentController { @override Future destroyTexture() async { - await _channel.invokeMethod("destroyTexture"); + print("Destroying texture"); + // we need to flush all references to the previous texture ID before calling destroy, otherwise the Texture widget will attempt to render a non-existent texture and crash. + // however, this is not a synchronous stream, so we need to ensure the Texture widget has been removed from the hierarchy before destroying _textureId = null; _textureIdController.add(null); + + await _channel.invokeMethod("destroyTexture"); + print("Texture destroyed"); } /// @@ -202,17 +210,28 @@ class FilamentControllerFFI extends FilamentController { print("No texture created, ignoring call to resize."); return; } - _resizing = true; - setRendering(false); - if (_viewer != null) { - _lib.destroy_swap_chain(_viewer!); + + if (_resizing) { + print("Resize currently underway, ignoring"); + return; } + bool wasRendering = _rendering; + if (_viewer != null && _rendering) { + await setRendering(false); + } + + _resizing = true; + + if (_viewer != null) { + _lib.destroy_swap_chain_ffi(_viewer!); + } await destroyTexture(); size = ui.Size(width * _pixelRatio, height * _pixelRatio); var textures = await _channel.invokeMethod("createTexture", [size.width, size.height]); + print("Created new texture"); var flutterTextureId = textures[0]; _textureId = flutterTextureId; @@ -239,7 +258,9 @@ class FilamentControllerFFI extends FilamentController { _textureIdController.add(_textureId); _resizing = false; - setRendering(true); + if (wasRendering) { + setRendering(true); + } } @override