in viewer, ensure onTextureUploadComplete callbacks are passed through to KTX1Bundle.createTexture

This commit is contained in:
Nick Fisher
2025-06-19 11:52:44 +08:00
parent 0a9b1a82e2
commit 3783081456
3 changed files with 41 additions and 33 deletions

View File

@@ -44,13 +44,13 @@ class FFIKtx1Bundle extends Ktx1Bundle {
return FFIKtx1Bundle(bundle); return FFIKtx1Bundle(bundle);
} }
Future<Texture> createTexture() async { Future<Texture> createTexture({VoidCallback? onTextureUploadComplete, int? requestId}) async {
final texturePtr = await withPointerCallback<TTexture>((cb) { final texturePtr = await withPointerCallback<TTexture>((cb) {
Ktx1Reader_createTextureRenderThread( Ktx1Reader_createTextureRenderThread(
(FilamentApp.instance as FFIFilamentApp).engine, (FilamentApp.instance as FFIFilamentApp).engine,
pointer, pointer,
0, requestId ?? 0,
nullptr, onTextureUploadComplete ?? nullptr,
cb); cb);
}); });
return FFITexture(FilamentApp.instance!.engine, texturePtr); return FFITexture(FilamentApp.instance!.engine, texturePtr);

View File

@@ -1,7 +1,6 @@
import 'package:thermion_dart/thermion_dart.dart'; import 'package:thermion_dart/thermion_dart.dart';
abstract class Ktx1Bundle { abstract class Ktx1Bundle {
/// ///
/// ///
/// ///
@@ -10,7 +9,8 @@ abstract class Ktx1Bundle {
/// ///
/// ///
/// ///
Future<Texture> createTexture(); Future<Texture> createTexture(
{VoidCallback? onTextureUploadComplete, int? requestId});
/// ///
/// ///

View File

@@ -267,7 +267,7 @@ class ThermionViewerFFI extends ThermionViewer {
withVoidCallback((requestId, onTextureUploadComplete) async { withVoidCallback((requestId, onTextureUploadComplete) async {
var bundle = await FFIKtx1Bundle.create(data); 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) _skybox = await FilamentApp.instance!.buildSkybox(texture: _skyboxTexture)
as FFISkybox; as FFISkybox;
@@ -287,53 +287,61 @@ class ThermionViewerFFI extends ThermionViewer {
/// ///
/// ///
@override @override
Future loadIbl(String lightingPath, {double intensity = 30000, bool destroyExisting= true}) async { Future loadIbl(String lightingPath,
await removeIbl(destroy:destroyExisting); {double intensity = 30000, bool destroyExisting = true}) async {
await removeIbl(destroy: destroyExisting);
final completer = Completer(); final completer = Completer();
_iblTextureUploadComplete = _iblTextureUploadComplete =
withVoidCallback((requestId, onTextureUploadComplete) async { withVoidCallback((requestId, onTextureUploadComplete) async {
late Pointer stackPtr; late Pointer stackPtr;
if (FILAMENT_WASM) { if (FILAMENT_WASM) {
//stackPtr = stackSave(); //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 texture = await bundle.createTexture(onTextureUploadComplete: onTextureUploadComplete, requestId: requestId);
final harmonics = bundle.getSphericalHarmonics(); final harmonics = bundle.getSphericalHarmonics();
final ibl = await FFIIndirectLight.fromIrradianceHarmonics( final ibl = await FFIIndirectLight.fromIrradianceHarmonics(
harmonics, harmonics,
reflectionsTexture: texture, reflectionsTexture: texture,
intensity: intensity, intensity: intensity,
); );
await scene.setIndirectLight(ibl); await scene.setIndirectLight(ibl);
if (FILAMENT_WASM) { if (FILAMENT_WASM) {
//stackRestore(stackPtr); //stackRestore(stackPtr);
data.free(); data.free();
} }
data.free(); data.free();
completer.complete(); completer.complete();
}).then((_) { _logger.info("IBL texture upload complete");
_iblTextureUploadComplete = null; }).then((_) {
}); _logger.info("IBL texture upload complete");
_iblTextureUploadComplete = null;
}).onError((err, st) {
_logger.severe(err.toString());
});
await completer.future; 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); await removeIbl(destroy: destroyExisting);
final ibl = await FFIIndirectLight.fromIrradianceTexture(texture, final ibl = await FFIIndirectLight.fromIrradianceTexture(texture,
reflectionsTexture: reflectionsTexture, intensity: intensity); reflectionsTexture: reflectionsTexture, intensity: intensity);
await scene.setIndirectLight(ibl); await scene.setIndirectLight(ibl);
} }