From 2f7f363db915665135689d83f66d59a52e47cab5 Mon Sep 17 00:00:00 2001 From: Nick Fisher Date: Sat, 31 May 2025 11:21:57 +0800 Subject: [PATCH] pass shared NameComponentManager to gltfio AssetLoader --- .../src/bindings/src/thermion_dart_ffi.g.dart | 5 +++- .../src/thermion_dart_js_interop.g.dart | 8 ++++-- .../src/implementation/ffi_asset.dart | 9 +++---- .../src/implementation/ffi_filament_app.dart | 6 ++--- .../native/include/c_api/TGltfAssetLoader.h | 2 +- .../c_api/ThermionDartRenderThreadApi.h | 2 +- .../native/src/c_api/TGltfAssetLoader.cpp | 6 ++--- .../src/c_api/ThermionDartRenderThreadApi.cpp | 8 ++++-- thermion_dart/test/entity_tests.dart | 25 +++++++++++++++++++ 9 files changed, 52 insertions(+), 19 deletions(-) create mode 100644 thermion_dart/test/entity_tests.dart diff --git a/thermion_dart/lib/src/bindings/src/thermion_dart_ffi.g.dart b/thermion_dart/lib/src/bindings/src/thermion_dart_ffi.g.dart index b37c00cf..fa1650a9 100644 --- a/thermion_dart/lib/src/bindings/src/thermion_dart_ffi.g.dart +++ b/thermion_dart/lib/src/bindings/src/thermion_dart_ffi.g.dart @@ -339,10 +339,11 @@ external void FilamentAsset_getEntities( @ffi.Native< ffi.Pointer Function( - ffi.Pointer, ffi.Pointer)>(isLeaf: true) + ffi.Pointer, ffi.Pointer, ffi.Pointer )>(isLeaf: true) external ffi.Pointer GltfAssetLoader_create( ffi.Pointer tEngine, ffi.Pointer tMaterialProvider, + ffi.Pointer tNameComponentManager, ); @ffi.Native< @@ -2718,6 +2719,7 @@ external void AnimationManager_resetToRestPoseRenderThread( ffi.Void Function( ffi.Pointer, ffi.Pointer, + ffi.Pointer, ffi.Pointer< ffi.NativeFunction< ffi.Void Function( @@ -2725,6 +2727,7 @@ external void AnimationManager_resetToRestPoseRenderThread( external void GltfAssetLoader_createRenderThread( ffi.Pointer tEngine, ffi.Pointer tMaterialProvider, + ffi.Pointer tNameComponentManager, ffi.Pointer< ffi.NativeFunction)>> callback, diff --git a/thermion_dart/lib/src/bindings/src/thermion_dart_js_interop.g.dart b/thermion_dart/lib/src/bindings/src/thermion_dart_js_interop.g.dart index 4456a072..20cbcf2a 100644 --- a/thermion_dart/lib/src/bindings/src/thermion_dart_js_interop.g.dart +++ b/thermion_dart/lib/src/bindings/src/thermion_dart_js_interop.g.dart @@ -592,6 +592,7 @@ extension type NativeLibrary(JSObject _) implements JSObject { external Pointer _GltfAssetLoader_create( Pointer tEngine, Pointer tMaterialProvider, + self.Pointer tNameComponentManager ); external Pointer _GltfAssetLoader_load( Pointer tEngine, @@ -1841,6 +1842,7 @@ extension type NativeLibrary(JSObject _) implements JSObject { external void _GltfAssetLoader_createRenderThread( Pointer tEngine, Pointer tMaterialProvider, + Pointer tNameComponentManager, Pointer)>> callback, ); @@ -2641,9 +2643,10 @@ void FilamentAsset_getEntities( self.Pointer GltfAssetLoader_create( self.Pointer tEngine, self.Pointer tMaterialProvider, + self.Pointer tNameComponentManager ) { final result = - _lib._GltfAssetLoader_create(tEngine.cast(), tMaterialProvider.cast()); + _lib._GltfAssetLoader_create(tEngine.cast(), tMaterialProvider.cast(), tNameComponentManager.cast()); return self.Pointer(result); } @@ -5200,11 +5203,12 @@ void AnimationManager_resetToRestPoseRenderThread( void GltfAssetLoader_createRenderThread( self.Pointer tEngine, self.Pointer tMaterialProvider, + self.Pointer tNameComponentManager, self.Pointer)>> callback, ) { final result = _lib._GltfAssetLoader_createRenderThread( - tEngine.cast(), tMaterialProvider.cast(), callback.cast()); + tEngine.cast(), tMaterialProvider.cast(), tNameComponentManager.cast(), callback.cast()); return result; } diff --git a/thermion_dart/lib/src/filament/src/implementation/ffi_asset.dart b/thermion_dart/lib/src/filament/src/implementation/ffi_asset.dart index 7f215ae3..d13ba3ab 100644 --- a/thermion_dart/lib/src/filament/src/implementation/ffi_asset.dart +++ b/thermion_dart/lib/src/filament/src/implementation/ffi_asset.dart @@ -82,12 +82,9 @@ class FFIAsset extends ThermionAsset { final childEntities = await getChildEntities(); var names = []; for (final entity in childEntities) { - var name = NameComponentManager_getName(app.nameComponentManager, entity); - if (name == nullptr) { - names.add(null); - } else { - names.add(name.cast().toDartString()); - } + var name = await FilamentApp.instance!.getNameForEntity(entity); + names.add(name); + } return names; } 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 58f3f455..13c80e02 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 @@ -85,9 +85,9 @@ class FFIFilamentApp extends FilamentApp { config.stereoscopicEyeCount, config.disableHandleUseAfterFreeCheck, cb)); - + final nameComponentManager = NameComponentManager_create(); final gltfAssetLoader = await withPointerCallback( - (cb) => GltfAssetLoader_createRenderThread(engine, nullptr, cb)); + (cb) => GltfAssetLoader_createRenderThread(engine, nullptr, nameComponentManager, cb)); final renderer = await withPointerCallback( (cb) => Engine_createRendererRenderThread(engine, cb)); final ubershaderMaterialProvider = @@ -101,7 +101,7 @@ class FFIFilamentApp extends FilamentApp { RenderThread_setRenderTicker(renderTicker); - final nameComponentManager = NameComponentManager_create(); + FilamentApp.instance = FFIFilamentApp( engine, diff --git a/thermion_dart/native/include/c_api/TGltfAssetLoader.h b/thermion_dart/native/include/c_api/TGltfAssetLoader.h index d6a0cb83..9075fff4 100644 --- a/thermion_dart/native/include/c_api/TGltfAssetLoader.h +++ b/thermion_dart/native/include/c_api/TGltfAssetLoader.h @@ -8,7 +8,7 @@ extern "C" { #endif -EMSCRIPTEN_KEEPALIVE TGltfAssetLoader *GltfAssetLoader_create(TEngine *tEngine, TMaterialProvider *tMaterialProvider); +EMSCRIPTEN_KEEPALIVE TGltfAssetLoader *GltfAssetLoader_create(TEngine *tEngine, TMaterialProvider *tMaterialProvider, TNameComponentManager *tNameComponentManager); EMSCRIPTEN_KEEPALIVE TFilamentAsset *GltfAssetLoader_load( TEngine *tEngine, diff --git a/thermion_dart/native/include/c_api/ThermionDartRenderThreadApi.h b/thermion_dart/native/include/c_api/ThermionDartRenderThreadApi.h index d36c0daf..6a43b73f 100644 --- a/thermion_dart/native/include/c_api/ThermionDartRenderThreadApi.h +++ b/thermion_dart/native/include/c_api/ThermionDartRenderThreadApi.h @@ -301,7 +301,7 @@ namespace thermion void AnimationManager_resetToRestPoseRenderThread(TAnimationManager *tAnimationManager, EntityId entityId, uint32_t requestId, VoidCallback onComplete); - void GltfAssetLoader_createRenderThread(TEngine *tEngine, TMaterialProvider *tMaterialProvider, void (*callback)(TGltfAssetLoader *)); + void GltfAssetLoader_createRenderThread(TEngine *tEngine, TMaterialProvider *tMaterialProvider, TNameComponentManager *tNameComponentManager, void (*callback)(TGltfAssetLoader *)); void GltfResourceLoader_createRenderThread(TEngine *tEngine, void (*callback)(TGltfResourceLoader *)); void GltfResourceLoader_destroyRenderThread(TEngine *tEngine, TGltfResourceLoader *tResourceLoader, uint32_t requestId, VoidCallback onComplete); void GltfResourceLoader_loadResourcesRenderThread(TGltfResourceLoader *tGltfResourceLoader, TFilamentAsset *tFilamentAsset, void (*callback)(bool)); diff --git a/thermion_dart/native/src/c_api/TGltfAssetLoader.cpp b/thermion_dart/native/src/c_api/TGltfAssetLoader.cpp index b45dcc9d..dc25a31e 100644 --- a/thermion_dart/native/src/c_api/TGltfAssetLoader.cpp +++ b/thermion_dart/native/src/c_api/TGltfAssetLoader.cpp @@ -38,8 +38,9 @@ namespace thermion #endif -EMSCRIPTEN_KEEPALIVE TGltfAssetLoader *GltfAssetLoader_create(TEngine *tEngine, TMaterialProvider *tMaterialProvider) { +EMSCRIPTEN_KEEPALIVE TGltfAssetLoader *GltfAssetLoader_create(TEngine *tEngine, TMaterialProvider *tMaterialProvider, TNameComponentManager *tNameComponentManager) { auto *engine = reinterpret_cast(tEngine); + auto *nameComponentManager = reinterpret_cast(tNameComponentManager); auto *materialProvider = reinterpret_cast(tMaterialProvider); if(!materialProvider) { @@ -52,8 +53,7 @@ EMSCRIPTEN_KEEPALIVE TGltfAssetLoader *GltfAssetLoader_create(TEngine *tEngine, } utils::EntityManager &em = utils::EntityManager::get(); - auto ncm = new utils::NameComponentManager(em); - auto *assetLoader = gltfio::AssetLoader::create({engine, materialProvider, ncm, &em}); + auto *assetLoader = gltfio::AssetLoader::create({engine, materialProvider, nameComponentManager, &em}); return reinterpret_cast(assetLoader); } diff --git a/thermion_dart/native/src/c_api/ThermionDartRenderThreadApi.cpp b/thermion_dart/native/src/c_api/ThermionDartRenderThreadApi.cpp index 5f1373cc..997bec21 100644 --- a/thermion_dart/native/src/c_api/ThermionDartRenderThreadApi.cpp +++ b/thermion_dart/native/src/c_api/ThermionDartRenderThreadApi.cpp @@ -1118,12 +1118,16 @@ extern "C" auto fut = _renderThread->add_task(lambda); } - EMSCRIPTEN_KEEPALIVE void GltfAssetLoader_createRenderThread(TEngine *tEngine, TMaterialProvider *tMaterialProvider, void (*callback)(TGltfAssetLoader *)) + EMSCRIPTEN_KEEPALIVE void GltfAssetLoader_createRenderThread( + TEngine *tEngine, + TMaterialProvider *tMaterialProvider, + TNameComponentManager *tNameComponentManager, + void (*callback)(TGltfAssetLoader *)) { std::packaged_task lambda( [=]() mutable { - auto loader = GltfAssetLoader_create(tEngine, tMaterialProvider); + auto loader = GltfAssetLoader_create(tEngine, tMaterialProvider, tNameComponentManager); PROXY(callback(loader)); }); auto fut = _renderThread->add_task(lambda); diff --git a/thermion_dart/test/entity_tests.dart b/thermion_dart/test/entity_tests.dart new file mode 100644 index 00000000..9b2e9f83 --- /dev/null +++ b/thermion_dart/test/entity_tests.dart @@ -0,0 +1,25 @@ +@Timeout(const Duration(seconds: 600)) +import 'dart:io'; + +import 'package:test/test.dart'; +import 'package:thermion_dart/thermion_dart.dart'; +import 'helpers.dart'; + +void main() async { + var testHelper = TestHelper("entity_tests"); + await testHelper.setup(); + + test('get entity names', () async { + var asset = await FilamentApp.instance!.loadGltfFromBuffer( + File("${testHelper.testDir}/assets/cube.glb").readAsBytesSync(), + nullptr); + + expect(null, await FilamentApp.instance!.getNameForEntity(asset.entity)); + var children = await asset.getChildEntities(); + var child = children.first; + + expect("Cube", await FilamentApp.instance!.getNameForEntity(child)); + var childNames = await asset.getChildEntityNames(); + expect("Cube", childNames.first); + }); +}