From 771738790959577c20a19e93ce198397e3e58265 Mon Sep 17 00:00:00 2001 From: Nick Fisher Date: Thu, 2 Jan 2025 10:30:13 +0800 Subject: [PATCH] internal: remove bounding box asset when parent asset removed --- .../lib/src/viewer/src/ffi/src/ffi_asset.dart | 16 +++++----- .../src/ffi/src/thermion_viewer_ffi.dart | 17 +++++++---- thermion_dart/test/overlay_tests.dart | 29 +++++++++++++++---- 3 files changed, 45 insertions(+), 17 deletions(-) diff --git a/thermion_dart/lib/src/viewer/src/ffi/src/ffi_asset.dart b/thermion_dart/lib/src/viewer/src/ffi/src/ffi_asset.dart index 08727833..4c443e4b 100644 --- a/thermion_dart/lib/src/viewer/src/ffi/src/ffi_asset.dart +++ b/thermion_dart/lib/src/viewer/src/ffi/src/ffi_asset.dart @@ -6,6 +6,7 @@ import 'package:thermion_dart/src/viewer/src/ffi/src/thermion_viewer_ffi.dart'; import 'package:thermion_dart/thermion_dart.dart'; class FFIAsset extends ThermionAsset { + final Pointer pointer; final Pointer sceneManager; Pointer get renderableManager => @@ -188,7 +189,7 @@ class FFIAsset extends ThermionAsset { } } - ThermionAsset? _boundingBoxAsset; + FFIAsset? boundingBoxAsset; Future getBoundingBox() async { late ThermionEntity targetEntity; @@ -201,9 +202,10 @@ class FFIAsset extends ThermionAsset { return aabb3; } + @override Future setBoundingBoxVisibility(bool visible) async { - if (_boundingBoxAsset == null) { + if (boundingBoxAsset == null) { final boundingBox = await getBoundingBox(); final min = [ boundingBox.centerX - boundingBox.halfExtentX, @@ -277,19 +279,19 @@ class FFIAsset extends ThermionAsset { primitiveType: PrimitiveType.LINES, ); - _boundingBoxAsset = await viewer.createGeometry( + boundingBoxAsset = await viewer.createGeometry( geometry, materialInstances: [material], keepData: false, - ); + ) as FFIAsset; TransformManager_setParent(Engine_getTransformManager(engine), - _boundingBoxAsset!.entity, entity, false); + boundingBoxAsset!.entity, entity, false); } if (visible) { - await _boundingBoxAsset!.addToScene(); + await boundingBoxAsset!.addToScene(); } else { - await _boundingBoxAsset!.removeFromScene(); + await boundingBoxAsset!.removeFromScene(); } } } 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 df65bdee..730e3e1f 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 @@ -510,8 +510,8 @@ class ThermionViewerFFI extends ThermionViewer { throw Exception("An error occurred loading the asset at $path"); } - var thermionAsset = - FFIAsset(asset, _sceneManager!, _engine!, _unlitMaterialProvider!, this); + var thermionAsset = FFIAsset( + asset, _sceneManager!, _engine!, _unlitMaterialProvider!, this); return thermionAsset; } @@ -973,6 +973,12 @@ class ThermionViewerFFI extends ThermionViewer { /// @override Future removeAsset(covariant FFIAsset asset) async { + if (asset.boundingBoxAsset != null) { + await asset.setBoundingBoxVisibility(false); + await withVoidCallback((callback) => + SceneManager_destroyAssetRenderThread( + _sceneManager!, asset.boundingBoxAsset!.pointer, callback)); + } await withVoidCallback((callback) => SceneManager_destroyAssetRenderThread( _sceneManager!, asset.pointer, callback)); } @@ -1641,8 +1647,8 @@ class ThermionViewerFFI extends ThermionViewer { throw Exception("Failed to create geometry"); } - var asset = - FFIAsset(assetPtr, _sceneManager!, _engine!, _unlitMaterialProvider!, this); + var asset = FFIAsset( + assetPtr, _sceneManager!, _engine!, _unlitMaterialProvider!, this); return asset; } @@ -1760,7 +1766,8 @@ class ThermionViewerFFI extends ThermionViewer { _sceneManager!, material.pointer, cb); } }); - _grid = FFIAsset(ptr, _sceneManager!, _engine!, _unlitMaterialProvider!, this); + _grid = FFIAsset( + ptr, _sceneManager!, _engine!, _unlitMaterialProvider!, this); } await _grid!.addToScene(); await setLayerVisibility(VisibilityLayers.OVERLAY, true); diff --git a/thermion_dart/test/overlay_tests.dart b/thermion_dart/test/overlay_tests.dart index ba099954..76c92b15 100644 --- a/thermion_dart/test/overlay_tests.dart +++ b/thermion_dart/test/overlay_tests.dart @@ -134,15 +134,34 @@ void main() async { }); group("bounding box", () { - test('bounding box', () async { + test('add bounding box to geometry', () async { await testHelper.withViewer( (viewer) async { final cube = await viewer.createGeometry( GeometryHelper.cube(normals: false, uvs: false)); await cube.setBoundingBoxVisibility(true); - await testHelper.capture(viewer, "bounding_box_visible"); + await testHelper.capture(viewer, "geometry_bounding_box_visible"); await cube.setBoundingBoxVisibility(false); - await testHelper.capture(viewer, "bounding_box_not_visible"); + await testHelper.capture( + viewer, "geometry_bounding_box_not_visible"); + await cube.setBoundingBoxVisibility(true); + await viewer.removeAsset(cube); + await testHelper.capture( + viewer, "geometry_bounding_box_removed"); + }, + postProcessing: true, + ); + }); + + test('add bounding box to gltf', () async { + await testHelper.withViewer( + (viewer) async { + var cube = await viewer + .loadGlb("file://${testHelper.testDir}/assets/cube.glb"); + await cube.setBoundingBoxVisibility(true); + await testHelper.capture(viewer, "gltf_bounding_box_visible"); + await cube.setBoundingBoxVisibility(false); + await testHelper.capture(viewer, "gltf_bounding_box_not_visible"); }, postProcessing: true, ); @@ -210,7 +229,7 @@ void main() async { // await testHelper.capture(viewer, "texture_applied_to_geometry"); - // await viewer.removeEntity(cube); + // await viewer.removeAsset(cube); // await viewer.destroyTexture(texture); // await viewer.dispose(); // }); @@ -319,7 +338,7 @@ void main() async { // await viewer.setToneMapping(ToneMapper.LINEAR); // final unlit = await viewer.createUnlitMaterialInstance(); - // await viewer.removeEntity(cube); + // await viewer.removeAsset(cube); // cube = await viewer.createGeometry(GeometryHelper.cube(), // materialInstance: unlit); // var reconstructedTexture = await viewer.createTexture(pixelBufferPng);