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.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(
ffi.Pointer<TEngine> tEngine,
ffi.Pointer<TMaterialProvider> tMaterialProvider,
ffi.Pointer<TNameComponentManager> tNameComponentManager,
);
@ffi.Native<
@@ -2718,6 +2719,7 @@ external void AnimationManager_resetToRestPoseRenderThread(
ffi.Void Function(
ffi.Pointer<TEngine>,
ffi.Pointer<TMaterialProvider>,
ffi.Pointer<TNameComponentManager>,
ffi.Pointer<
ffi.NativeFunction<
ffi.Void Function(
@@ -2725,6 +2727,7 @@ external void AnimationManager_resetToRestPoseRenderThread(
external void GltfAssetLoader_createRenderThread(
ffi.Pointer<TEngine> tEngine,
ffi.Pointer<TMaterialProvider> tMaterialProvider,
ffi.Pointer<TNameComponentManager> tNameComponentManager,
ffi.Pointer<
ffi.NativeFunction<ffi.Void Function(ffi.Pointer<TGltfAssetLoader>)>>
callback,

View File

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

View File

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

View File

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

View File

@@ -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,

View File

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

View File

@@ -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<filament::Engine *>(tEngine);
auto *nameComponentManager = reinterpret_cast<utils::NameComponentManager *>(tNameComponentManager);
auto *materialProvider = reinterpret_cast<gltfio::MaterialProvider *>(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<TGltfAssetLoader *>(assetLoader);
}

View File

@@ -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<void()> lambda(
[=]() mutable
{
auto loader = GltfAssetLoader_create(tEngine, tMaterialProvider);
auto loader = GltfAssetLoader_create(tEngine, tMaterialProvider, tNameComponentManager);
PROXY(callback(loader));
});
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);
});
}