in viewer, ensure onTextureUploadComplete callbacks are passed through to KTX1Bundle.createTexture
This commit is contained in:
@@ -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);
|
||||||
|
|||||||
@@ -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});
|
||||||
|
|
||||||
///
|
///
|
||||||
///
|
///
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user