From c484eeb37f408d5bb45709101e02cc0c8ebf046c Mon Sep 17 00:00:00 2001 From: Nick Fisher Date: Wed, 4 Jun 2025 11:07:19 +0800 Subject: [PATCH] when destroying an asset, remove/destroy instances before destroying the parent asset --- .../filament/src/implementation/ffi_filament_app.dart | 9 +++++++++ .../lib/src/viewer/src/ffi/src/thermion_viewer_ffi.dart | 4 ++++ 2 files changed, 13 insertions(+) diff --git a/thermion_dart/lib/src/filament/src/implementation/ffi_filament_app.dart b/thermion_dart/lib/src/filament/src/implementation/ffi_filament_app.dart index 94adc43c..c71dacbc 100644 --- a/thermion_dart/lib/src/filament/src/implementation/ffi_filament_app.dart +++ b/thermion_dart/lib/src/filament/src/implementation/ffi_filament_app.dart @@ -263,6 +263,15 @@ class FFIFilamentApp extends FilamentApp { /// Future destroyAsset(covariant FFIAsset asset) async { await asset.removeAnimationComponent(); + if (!asset.isInstance) { + for (final instance in (await asset.getInstances()).cast()) { + await instance.removeAnimationComponent(); + await withVoidCallback((requestId, cb) => + SceneAsset_destroyRenderThread(instance.asset, requestId, cb)); + await instance.dispose(); + } + } + await withVoidCallback((requestId, cb) => SceneAsset_destroyRenderThread(asset.asset, requestId, cb)); await asset.dispose(); 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 92ea3c5f..709a1a60 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 @@ -480,7 +480,11 @@ class ThermionViewerFFI extends ThermionViewer { await scene.remove(asset.boundingBoxAsset! as FFIAsset); await FilamentApp.instance!.destroyAsset(asset.boundingBoxAsset!); } + for (final instance in (await asset.getInstances()).cast()) { + await scene.remove(instance); + } await FilamentApp.instance!.destroyAsset(asset); + _logger.info("Destroyed asset"); } _assets.clear(); }