when destroying an asset, remove/destroy instances before destroying the parent asset

This commit is contained in:
Nick Fisher
2025-06-04 11:07:19 +08:00
parent 655ba89b0f
commit c484eeb37f
2 changed files with 13 additions and 0 deletions

View File

@@ -263,6 +263,15 @@ class FFIFilamentApp extends FilamentApp<Pointer> {
/// ///
Future destroyAsset(covariant FFIAsset asset) async { Future destroyAsset(covariant FFIAsset asset) async {
await asset.removeAnimationComponent(); await asset.removeAnimationComponent();
if (!asset.isInstance) {
for (final instance in (await asset.getInstances()).cast<FFIAsset>()) {
await instance.removeAnimationComponent();
await withVoidCallback((requestId, cb) =>
SceneAsset_destroyRenderThread(instance.asset, requestId, cb));
await instance.dispose();
}
}
await withVoidCallback((requestId, cb) => await withVoidCallback((requestId, cb) =>
SceneAsset_destroyRenderThread(asset.asset, requestId, cb)); SceneAsset_destroyRenderThread(asset.asset, requestId, cb));
await asset.dispose(); await asset.dispose();

View File

@@ -480,7 +480,11 @@ class ThermionViewerFFI extends ThermionViewer {
await scene.remove(asset.boundingBoxAsset! as FFIAsset); await scene.remove(asset.boundingBoxAsset! as FFIAsset);
await FilamentApp.instance!.destroyAsset(asset.boundingBoxAsset!); await FilamentApp.instance!.destroyAsset(asset.boundingBoxAsset!);
} }
for (final instance in (await asset.getInstances()).cast<FFIAsset>()) {
await scene.remove(instance);
}
await FilamentApp.instance!.destroyAsset(asset); await FilamentApp.instance!.destroyAsset(asset);
_logger.info("Destroyed asset");
} }
_assets.clear(); _assets.clear();
} }