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);
}
Future<Texture> createTexture() async {
Future<Texture> createTexture({VoidCallback? onTextureUploadComplete, int? requestId}) async {
final texturePtr = await withPointerCallback<TTexture>((cb) {
Ktx1Reader_createTextureRenderThread(
(FilamentApp.instance as FFIFilamentApp).engine,
pointer,
0,
nullptr,
requestId ?? 0,
onTextureUploadComplete ?? nullptr,
cb);
});
return FFITexture(FilamentApp.instance!.engine, texturePtr);

View File

@@ -1,7 +1,6 @@
import 'package:thermion_dart/thermion_dart.dart';
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 {
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,7 +287,8 @@ class ThermionViewerFFI extends ThermionViewer {
///
///
@override
Future loadIbl(String lightingPath, {double intensity = 30000, bool destroyExisting= true}) async {
Future loadIbl(String lightingPath,
{double intensity = 30000, bool destroyExisting = true}) async {
await removeIbl(destroy: destroyExisting);
final completer = Completer();
@@ -302,7 +303,7 @@ class ThermionViewerFFI extends ThermionViewer {
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 ibl = await FFIIndirectLight.fromIrradianceHarmonics(
@@ -320,8 +321,12 @@ class ThermionViewerFFI extends ThermionViewer {
data.free();
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;
}
@@ -329,7 +334,10 @@ class ThermionViewerFFI extends ThermionViewer {
///
///
///
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,