From e0b2e1c3b95f7d2f8218ad020842172914abb8a0 Mon Sep 17 00:00:00 2001 From: Nick Fisher Date: Wed, 2 Apr 2025 22:27:12 +0800 Subject: [PATCH] add onDestroy hooks for FilamentApp --- .../lib/src/filament/src/filament_app.dart | 7 +++++-- .../viewer/src/ffi/src/ffi_filament_app.dart | 20 ++++++++++++++++++- .../src/ffi/src/thermion_viewer_ffi.dart | 8 ++++++++ 3 files changed, 32 insertions(+), 3 deletions(-) diff --git a/thermion_dart/lib/src/filament/src/filament_app.dart b/thermion_dart/lib/src/filament/src/filament_app.dart index f1494331..c3d26719 100644 --- a/thermion_dart/lib/src/filament/src/filament_app.dart +++ b/thermion_dart/lib/src/filament/src/filament_app.dart @@ -11,7 +11,6 @@ class FilamentConfig { final U? renderCallbackOwner; final Future Function(String) resourceLoader; final U? platform; - final U? driver; final U? sharedContext; final String? uberArchivePath; final int stereoscopicEyeCount; @@ -24,7 +23,6 @@ class FilamentConfig { this.renderCallback, this.renderCallbackOwner, this.platform, - this.driver, this.sharedContext, this.stereoscopicEyeCount = 1, this.disableHandleUseAfterFreeCheck = false}); @@ -306,4 +304,9 @@ abstract class FilamentApp { /// /// Future flush(); + + /// + /// + /// + void onDestroy(Future Function() callback); } diff --git a/thermion_dart/lib/src/viewer/src/ffi/src/ffi_filament_app.dart b/thermion_dart/lib/src/viewer/src/ffi/src/ffi_filament_app.dart index 22d4c913..5181a994 100644 --- a/thermion_dart/lib/src/viewer/src/ffi/src/ffi_filament_app.dart +++ b/thermion_dart/lib/src/viewer/src/ffi/src/ffi_filament_app.dart @@ -15,6 +15,7 @@ import 'package:thermion_dart/src/viewer/src/ffi/src/ffi_texture.dart'; import 'package:thermion_dart/src/viewer/src/ffi/src/ffi_view.dart'; import 'package:thermion_dart/src/viewer/src/ffi/src/thermion_viewer_ffi.dart'; import 'package:thermion_dart/thermion_dart.dart'; +import 'package:logging/logging.dart'; typedef RenderCallback = Pointer)>>; @@ -22,7 +23,6 @@ class FFIFilamentConfig extends FilamentConfig> { FFIFilamentConfig( {required super.resourceLoader, super.backend = Backend.DEFAULT, - super.driver = null, super.platform = null, super.sharedContext = null, super.uberArchivePath = null}); @@ -41,6 +41,8 @@ class FFIFilamentApp extends FilamentApp { final Future Function(String uri) resourceLoader; + late final _logger = Logger(this.runtimeType.toString()); + FFIFilamentApp( this.engine, this.gltfAssetLoader, @@ -195,11 +197,13 @@ class FFIFilamentApp extends FilamentApp { /// /// Future destroySwapChain(SwapChain swapChain) async { + _logger.info("Destroying swapchain"); await withVoidCallback((callback) { Engine_destroySwapChainRenderThread( engine, (swapChain as FFISwapChain).swapChain, callback); }); _swapChains.remove(swapChain); + _logger.info("Destroyed swapchain"); } /// @@ -227,6 +231,11 @@ class FFIFilamentApp extends FilamentApp { calloc.free(viewsPtr); FilamentApp.instance = null; + for (final callback in _onDestroy) { + await callback.call(); + } + + _onDestroy.clear(); } /// @@ -914,6 +923,15 @@ class FFIFilamentApp extends FilamentApp { Future flush() async { await withVoidCallback((cb) => Engine_flushAndWaitRenderThead(engine, cb)); } + + final _onDestroy = []; + + /// + /// + /// + void onDestroy(Future Function() callback) { + _onDestroy.add(callback); + } } class FinalizableUint8List implements Finalizable { diff --git a/thermion_dart/lib/src/viewer/src/ffi/src/thermion_viewer_ffi.dart b/thermion_dart/lib/src/viewer/src/ffi/src/thermion_viewer_ffi.dart index a8f5d38f..ee2996e9 100644 --- a/thermion_dart/lib/src/viewer/src/ffi/src/thermion_viewer_ffi.dart +++ b/thermion_dart/lib/src/viewer/src/ffi/src/thermion_viewer_ffi.dart @@ -146,12 +146,14 @@ class ThermionViewerFFI extends ThermionViewer { } final _onDispose = []; + bool _disposed = false; /// /// /// @override Future dispose() async { + _disposed = true; await setRendering(false); await destroyAssets(); await destroyLights(); @@ -268,6 +270,10 @@ class ThermionViewerFFI extends ThermionViewer { /// @override Future removeSkybox() async { + if(_disposed) { + throw ViewerDisposedException(); + } + if (skybox != null) { await withVoidCallback( (cb) => Engine_destroySkyboxRenderThread(app.engine, skybox!, cb)); @@ -713,3 +719,5 @@ class ThermionViewerFFI extends ThermionViewer { await scene.remove(asset); } } + +class ViewerDisposedException implements Exception {} \ No newline at end of file