From 71bae610152e4a01d58a8920b78f3a6b6ed09b3f Mon Sep 17 00:00:00 2001 From: Nick Fisher Date: Tue, 17 Jun 2025 11:51:07 +0800 Subject: [PATCH] add loadIblFromTexture method --- .../src/ffi/src/thermion_viewer_ffi.dart | 63 ++++++++++++------- .../src/viewer/src/thermion_viewer_base.dart | 9 ++- 2 files changed, 47 insertions(+), 25 deletions(-) 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 62cb3646..8e6eccec 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 @@ -288,40 +288,55 @@ class ThermionViewerFFI extends ThermionViewer { /// /// @override - Future loadIbl(String lightingPath, {double intensity = 30000}) async { - await removeIbl(); + 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(); + final harmonics = bundle.getSphericalHarmonics(); - final ibl = await FFIIndirectLight.fromIrradianceHarmonics(harmonics, + final ibl = await FFIIndirectLight.fromIrradianceHarmonics( + harmonics, + reflectionsTexture: texture, + intensity: intensity, + ); + + await scene.setIndirectLight(ibl); + + if (FILAMENT_WASM) { + //stackRestore(stackPtr); + data.free(); + } + data.free(); + + completer.complete(); + }).then((_) { + _iblTextureUploadComplete = null; + }); + await completer.future; + } + + /// + /// + /// + Future loadIblFromTexture(Texture texture, { double intensity = 30000, bool destroyExisting = true}) async { + await removeIbl(destroy: destroyExisting); + + final ibl = await FFIIndirectLight.fromIrradianceTexture(texture, reflectionsTexture: texture, intensity: intensity); - await scene.setIndirectLight(ibl); - - if (FILAMENT_WASM) { - //stackRestore(stackPtr); - data.free(); - } - data.free(); - - completer.complete(); - }).then((_) { - _iblTextureUploadComplete = null; - }); - await completer.future; + await scene.setIndirectLight(ibl); } /// diff --git a/thermion_dart/lib/src/viewer/src/thermion_viewer_base.dart b/thermion_dart/lib/src/viewer/src/thermion_viewer_base.dart index 2d3a44e7..30fffb51 100644 --- a/thermion_dart/lib/src/viewer/src/thermion_viewer_base.dart +++ b/thermion_dart/lib/src/viewer/src/thermion_viewer_base.dart @@ -97,7 +97,14 @@ abstract class ThermionViewer { /// Creates an indirect light by loading the reflections/irradiance from the KTX file. /// Only one indirect light can be active at any given time; if an indirect light has already been loaded, it will be replaced. /// - Future loadIbl(String lightingPath, {double intensity = 30000}); + Future loadIbl(String lightingPath, + {double intensity = 30000, bool destroyExisting = true}); + + /// + /// + /// + Future loadIblFromTexture(Texture texture, + {double intensity = 30000, bool destroyExisting = true}); /// /// Rotates the IBL & skybox.