From 3783081456a454f2765f94449f832ad53efa01c3 Mon Sep 17 00:00:00 2001 From: Nick Fisher Date: Thu, 19 Jun 2025 11:52:44 +0800 Subject: [PATCH] in viewer, ensure onTextureUploadComplete callbacks are passed through to KTX1Bundle.createTexture --- .../src/implementation/ffi_ktx1_bundle.dart | 6 +- .../filament/src/interface/ktx1_bundle.dart | 4 +- .../src/ffi/src/thermion_viewer_ffi.dart | 64 +++++++++++-------- 3 files changed, 41 insertions(+), 33 deletions(-) diff --git a/thermion_dart/lib/src/filament/src/implementation/ffi_ktx1_bundle.dart b/thermion_dart/lib/src/filament/src/implementation/ffi_ktx1_bundle.dart index ec770830..b90207c3 100644 --- a/thermion_dart/lib/src/filament/src/implementation/ffi_ktx1_bundle.dart +++ b/thermion_dart/lib/src/filament/src/implementation/ffi_ktx1_bundle.dart @@ -44,13 +44,13 @@ class FFIKtx1Bundle extends Ktx1Bundle { return FFIKtx1Bundle(bundle); } - Future createTexture() async { + Future createTexture({VoidCallback? onTextureUploadComplete, int? requestId}) async { final texturePtr = await withPointerCallback((cb) { Ktx1Reader_createTextureRenderThread( (FilamentApp.instance as FFIFilamentApp).engine, pointer, - 0, - nullptr, + requestId ?? 0, + onTextureUploadComplete ?? nullptr, cb); }); return FFITexture(FilamentApp.instance!.engine, texturePtr); diff --git a/thermion_dart/lib/src/filament/src/interface/ktx1_bundle.dart b/thermion_dart/lib/src/filament/src/interface/ktx1_bundle.dart index 14674ecc..a629a366 100644 --- a/thermion_dart/lib/src/filament/src/interface/ktx1_bundle.dart +++ b/thermion_dart/lib/src/filament/src/interface/ktx1_bundle.dart @@ -1,7 +1,6 @@ import 'package:thermion_dart/thermion_dart.dart'; abstract class Ktx1Bundle { - /// /// /// @@ -10,7 +9,8 @@ abstract class Ktx1Bundle { /// /// /// - Future createTexture(); + Future createTexture( + {VoidCallback? onTextureUploadComplete, int? requestId}); /// /// 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 54d040ff..d5162ff5 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 @@ -267,7 +267,7 @@ class ThermionViewerFFI extends ThermionViewer { withVoidCallback((requestId, onTextureUploadComplete) async { var bundle = await FFIKtx1Bundle.create(data); - _skyboxTexture = await bundle.createTexture() as FFITexture; + _skyboxTexture = await bundle.createTexture(onTextureUploadComplete: onTextureUploadComplete, requestId: requestId) as FFITexture; _skybox = await FilamentApp.instance!.buildSkybox(texture: _skyboxTexture) as FFISkybox; @@ -287,53 +287,61 @@ class ThermionViewerFFI extends ThermionViewer { /// /// @override - Future loadIbl(String lightingPath, {double intensity = 30000, bool destroyExisting= true}) async { - await removeIbl(destroy:destroyExisting); + Future loadIbl(String lightingPath, + {double intensity = 30000, bool destroyExisting = true}) async { + await removeIbl(destroy: destroyExisting); final completer = Completer(); _iblTextureUploadComplete = withVoidCallback((requestId, onTextureUploadComplete) async { - late Pointer stackPtr; - if (FILAMENT_WASM) { - //stackPtr = stackSave(); - } + late Pointer stackPtr; + if (FILAMENT_WASM) { + //stackPtr = stackSave(); + } - var data = await FilamentApp.instance!.loadResource(lightingPath); + var data = await FilamentApp.instance!.loadResource(lightingPath); - final bundle = await FFIKtx1Bundle.create(data); + final bundle = await FFIKtx1Bundle.create(data); - final texture = await bundle.createTexture(); - final harmonics = bundle.getSphericalHarmonics(); + final texture = await bundle.createTexture(onTextureUploadComplete: onTextureUploadComplete, requestId: requestId); + final harmonics = bundle.getSphericalHarmonics(); - final ibl = await FFIIndirectLight.fromIrradianceHarmonics( - harmonics, - reflectionsTexture: texture, - intensity: intensity, - ); + final ibl = await FFIIndirectLight.fromIrradianceHarmonics( + harmonics, + reflectionsTexture: texture, + intensity: intensity, + ); - await scene.setIndirectLight(ibl); + await scene.setIndirectLight(ibl); - if (FILAMENT_WASM) { - //stackRestore(stackPtr); - data.free(); - } - data.free(); + if (FILAMENT_WASM) { + //stackRestore(stackPtr); + data.free(); + } + data.free(); - completer.complete(); - }).then((_) { - _iblTextureUploadComplete = null; - }); + completer.complete(); + _logger.info("IBL texture upload complete"); + }).then((_) { + _logger.info("IBL texture upload complete"); + _iblTextureUploadComplete = null; + }).onError((err, st) { + _logger.severe(err.toString()); + }); await completer.future; } /// /// /// - Future loadIblFromTexture(Texture texture, { Texture? reflectionsTexture = null, double intensity = 30000, bool destroyExisting = true}) async { + Future loadIblFromTexture(Texture texture, + {Texture? reflectionsTexture = null, + double intensity = 30000, + bool destroyExisting = true}) async { await removeIbl(destroy: destroyExisting); final ibl = await FFIIndirectLight.fromIrradianceTexture(texture, - reflectionsTexture: reflectionsTexture, intensity: intensity); + reflectionsTexture: reflectionsTexture, intensity: intensity); await scene.setIndirectLight(ibl); }