pass shared NameComponentManager to gltfio AssetLoader

This commit is contained in:
Nick Fisher
2025-05-31 11:21:57 +08:00
parent 7f0ec01937
commit 2f7f363db9
9 changed files with 52 additions and 19 deletions

View File

@@ -339,10 +339,11 @@ external void FilamentAsset_getEntities(
@ffi.Native< @ffi.Native<
ffi.Pointer<TGltfAssetLoader> Function( ffi.Pointer<TGltfAssetLoader> Function(
ffi.Pointer<TEngine>, ffi.Pointer<TMaterialProvider>)>(isLeaf: true) ffi.Pointer<TEngine>, ffi.Pointer<TMaterialProvider>, ffi.Pointer<TNameComponentManager> )>(isLeaf: true)
external ffi.Pointer<TGltfAssetLoader> GltfAssetLoader_create( external ffi.Pointer<TGltfAssetLoader> GltfAssetLoader_create(
ffi.Pointer<TEngine> tEngine, ffi.Pointer<TEngine> tEngine,
ffi.Pointer<TMaterialProvider> tMaterialProvider, ffi.Pointer<TMaterialProvider> tMaterialProvider,
ffi.Pointer<TNameComponentManager> tNameComponentManager,
); );
@ffi.Native< @ffi.Native<
@@ -2718,6 +2719,7 @@ external void AnimationManager_resetToRestPoseRenderThread(
ffi.Void Function( ffi.Void Function(
ffi.Pointer<TEngine>, ffi.Pointer<TEngine>,
ffi.Pointer<TMaterialProvider>, ffi.Pointer<TMaterialProvider>,
ffi.Pointer<TNameComponentManager>,
ffi.Pointer< ffi.Pointer<
ffi.NativeFunction< ffi.NativeFunction<
ffi.Void Function( ffi.Void Function(
@@ -2725,6 +2727,7 @@ external void AnimationManager_resetToRestPoseRenderThread(
external void GltfAssetLoader_createRenderThread( external void GltfAssetLoader_createRenderThread(
ffi.Pointer<TEngine> tEngine, ffi.Pointer<TEngine> tEngine,
ffi.Pointer<TMaterialProvider> tMaterialProvider, ffi.Pointer<TMaterialProvider> tMaterialProvider,
ffi.Pointer<TNameComponentManager> tNameComponentManager,
ffi.Pointer< ffi.Pointer<
ffi.NativeFunction<ffi.Void Function(ffi.Pointer<TGltfAssetLoader>)>> ffi.NativeFunction<ffi.Void Function(ffi.Pointer<TGltfAssetLoader>)>>
callback, callback,

View File

@@ -592,6 +592,7 @@ extension type NativeLibrary(JSObject _) implements JSObject {
external Pointer<TGltfAssetLoader> _GltfAssetLoader_create( external Pointer<TGltfAssetLoader> _GltfAssetLoader_create(
Pointer<TEngine> tEngine, Pointer<TEngine> tEngine,
Pointer<TMaterialProvider> tMaterialProvider, Pointer<TMaterialProvider> tMaterialProvider,
self.Pointer<TNameComponentManager> tNameComponentManager
); );
external Pointer<TFilamentAsset> _GltfAssetLoader_load( external Pointer<TFilamentAsset> _GltfAssetLoader_load(
Pointer<TEngine> tEngine, Pointer<TEngine> tEngine,
@@ -1841,6 +1842,7 @@ extension type NativeLibrary(JSObject _) implements JSObject {
external void _GltfAssetLoader_createRenderThread( external void _GltfAssetLoader_createRenderThread(
Pointer<TEngine> tEngine, Pointer<TEngine> tEngine,
Pointer<TMaterialProvider> tMaterialProvider, Pointer<TMaterialProvider> tMaterialProvider,
Pointer<TNameComponentManager> tNameComponentManager,
Pointer<self.NativeFunction<void Function(PointerClass<TGltfAssetLoader>)>> Pointer<self.NativeFunction<void Function(PointerClass<TGltfAssetLoader>)>>
callback, callback,
); );
@@ -2641,9 +2643,10 @@ void FilamentAsset_getEntities(
self.Pointer<TGltfAssetLoader> GltfAssetLoader_create( self.Pointer<TGltfAssetLoader> GltfAssetLoader_create(
self.Pointer<TEngine> tEngine, self.Pointer<TEngine> tEngine,
self.Pointer<TMaterialProvider> tMaterialProvider, self.Pointer<TMaterialProvider> tMaterialProvider,
self.Pointer<TNameComponentManager> tNameComponentManager
) { ) {
final result = final result =
_lib._GltfAssetLoader_create(tEngine.cast(), tMaterialProvider.cast()); _lib._GltfAssetLoader_create(tEngine.cast(), tMaterialProvider.cast(), tNameComponentManager.cast());
return self.Pointer<TGltfAssetLoader>(result); return self.Pointer<TGltfAssetLoader>(result);
} }
@@ -5200,11 +5203,12 @@ void AnimationManager_resetToRestPoseRenderThread(
void GltfAssetLoader_createRenderThread( void GltfAssetLoader_createRenderThread(
self.Pointer<TEngine> tEngine, self.Pointer<TEngine> tEngine,
self.Pointer<TMaterialProvider> tMaterialProvider, self.Pointer<TMaterialProvider> tMaterialProvider,
self.Pointer<TNameComponentManager> tNameComponentManager,
self.Pointer<self.NativeFunction<void Function(Pointer<TGltfAssetLoader>)>> self.Pointer<self.NativeFunction<void Function(Pointer<TGltfAssetLoader>)>>
callback, callback,
) { ) {
final result = _lib._GltfAssetLoader_createRenderThread( final result = _lib._GltfAssetLoader_createRenderThread(
tEngine.cast(), tMaterialProvider.cast(), callback.cast()); tEngine.cast(), tMaterialProvider.cast(), tNameComponentManager.cast(), callback.cast());
return result; return result;
} }

View File

@@ -82,12 +82,9 @@ class FFIAsset extends ThermionAsset {
final childEntities = await getChildEntities(); final childEntities = await getChildEntities();
var names = <String?>[]; var names = <String?>[];
for (final entity in childEntities) { for (final entity in childEntities) {
var name = NameComponentManager_getName(app.nameComponentManager, entity); var name = await FilamentApp.instance!.getNameForEntity(entity);
if (name == nullptr) { names.add(name);
names.add(null);
} else {
names.add(name.cast<Utf8>().toDartString());
}
} }
return names; return names;
} }

View File

@@ -85,9 +85,9 @@ class FFIFilamentApp extends FilamentApp<Pointer> {
config.stereoscopicEyeCount, config.stereoscopicEyeCount,
config.disableHandleUseAfterFreeCheck, config.disableHandleUseAfterFreeCheck,
cb)); cb));
final nameComponentManager = NameComponentManager_create();
final gltfAssetLoader = await withPointerCallback<TGltfAssetLoader>( final gltfAssetLoader = await withPointerCallback<TGltfAssetLoader>(
(cb) => GltfAssetLoader_createRenderThread(engine, nullptr, cb)); (cb) => GltfAssetLoader_createRenderThread(engine, nullptr, nameComponentManager, cb));
final renderer = await withPointerCallback<TRenderer>( final renderer = await withPointerCallback<TRenderer>(
(cb) => Engine_createRendererRenderThread(engine, cb)); (cb) => Engine_createRendererRenderThread(engine, cb));
final ubershaderMaterialProvider = final ubershaderMaterialProvider =
@@ -101,7 +101,7 @@ class FFIFilamentApp extends FilamentApp<Pointer> {
RenderThread_setRenderTicker(renderTicker); RenderThread_setRenderTicker(renderTicker);
final nameComponentManager = NameComponentManager_create();
FilamentApp.instance = FFIFilamentApp( FilamentApp.instance = FFIFilamentApp(
engine, engine,

View File

@@ -8,7 +8,7 @@ extern "C"
{ {
#endif #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( EMSCRIPTEN_KEEPALIVE TFilamentAsset *GltfAssetLoader_load(
TEngine *tEngine, TEngine *tEngine,

View File

@@ -301,7 +301,7 @@ namespace thermion
void AnimationManager_resetToRestPoseRenderThread(TAnimationManager *tAnimationManager, EntityId entityId, uint32_t requestId, VoidCallback onComplete); 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_createRenderThread(TEngine *tEngine, void (*callback)(TGltfResourceLoader *));
void GltfResourceLoader_destroyRenderThread(TEngine *tEngine, TGltfResourceLoader *tResourceLoader, uint32_t requestId, VoidCallback onComplete); void GltfResourceLoader_destroyRenderThread(TEngine *tEngine, TGltfResourceLoader *tResourceLoader, uint32_t requestId, VoidCallback onComplete);
void GltfResourceLoader_loadResourcesRenderThread(TGltfResourceLoader *tGltfResourceLoader, TFilamentAsset *tFilamentAsset, void (*callback)(bool)); void GltfResourceLoader_loadResourcesRenderThread(TGltfResourceLoader *tGltfResourceLoader, TFilamentAsset *tFilamentAsset, void (*callback)(bool));

View File

@@ -38,8 +38,9 @@ namespace thermion
#endif #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<filament::Engine *>(tEngine); auto *engine = reinterpret_cast<filament::Engine *>(tEngine);
auto *nameComponentManager = reinterpret_cast<utils::NameComponentManager *>(tNameComponentManager);
auto *materialProvider = reinterpret_cast<gltfio::MaterialProvider *>(tMaterialProvider); auto *materialProvider = reinterpret_cast<gltfio::MaterialProvider *>(tMaterialProvider);
if(!materialProvider) { if(!materialProvider) {
@@ -52,8 +53,7 @@ EMSCRIPTEN_KEEPALIVE TGltfAssetLoader *GltfAssetLoader_create(TEngine *tEngine,
} }
utils::EntityManager &em = utils::EntityManager::get(); utils::EntityManager &em = utils::EntityManager::get();
auto ncm = new utils::NameComponentManager(em); auto *assetLoader = gltfio::AssetLoader::create({engine, materialProvider, nameComponentManager, &em});
auto *assetLoader = gltfio::AssetLoader::create({engine, materialProvider, ncm, &em});
return reinterpret_cast<TGltfAssetLoader *>(assetLoader); return reinterpret_cast<TGltfAssetLoader *>(assetLoader);
} }

View File

@@ -1118,12 +1118,16 @@ extern "C"
auto fut = _renderThread->add_task(lambda); 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<void()> lambda( std::packaged_task<void()> lambda(
[=]() mutable [=]() mutable
{ {
auto loader = GltfAssetLoader_create(tEngine, tMaterialProvider); auto loader = GltfAssetLoader_create(tEngine, tMaterialProvider, tNameComponentManager);
PROXY(callback(loader)); PROXY(callback(loader));
}); });
auto fut = _renderThread->add_task(lambda); auto fut = _renderThread->add_task(lambda);

View File

@@ -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);
});
}