add flush() method on FilamentApp

This commit is contained in:
Nick Fisher
2025-03-28 10:01:26 +08:00
parent cd1c2f3827
commit 289749115b
2 changed files with 33 additions and 22 deletions

View File

@@ -261,14 +261,12 @@ abstract class FilamentApp<T> {
/// ///
/// Pixel buffers will be returned in RGBA float32 format. /// Pixel buffers will be returned in RGBA float32 format.
/// ///
Future<List<(View,Uint8List)>> capture(covariant SwapChain swapChain, Future<List<(View, Uint8List)>> capture(covariant SwapChain swapChain,
{ {covariant View? view,
covariant View? view,
bool captureRenderTarget = false, bool captureRenderTarget = false,
PixelDataFormat pixelDataFormat = PixelDataFormat.RGBA, PixelDataFormat pixelDataFormat = PixelDataFormat.RGBA,
PixelDataType pixelDataType = PixelDataType.UBYTE, PixelDataType pixelDataType = PixelDataType.UBYTE,
Future Function(View)? beforeRender} Future Function(View)? beforeRender});
);
/// ///
/// ///
@@ -302,7 +300,10 @@ abstract class FilamentApp<T> {
/// ///
/// ///
Future<ThermionAsset> createGeometry(Geometry geometry, T animationManager, Future<ThermionAsset> createGeometry(Geometry geometry, T animationManager,
{List<MaterialInstance>? materialInstances, {List<MaterialInstance>? materialInstances, bool keepData = false});
bool keepData = false});
///
///
///
Future flush();
} }

View File

@@ -681,7 +681,8 @@ class FFIFilamentApp extends FilamentApp<Pointer> {
beforeRender?.call(view); beforeRender?.call(view);
final viewport = await view.getViewport(); final viewport = await view.getViewport();
final pixelBuffer = Uint8List(viewport.width * viewport.height * 4 * sizeOf<Float>()); final pixelBuffer =
Uint8List(viewport.width * viewport.height * 4 * sizeOf<Float>());
await withVoidCallback((cb) { await withVoidCallback((cb) {
Renderer_renderRenderThread( Renderer_renderRenderThread(
renderer, renderer,
@@ -697,15 +698,16 @@ class FFIFilamentApp extends FilamentApp<Pointer> {
Renderer_readPixelsRenderThread( Renderer_readPixelsRenderThread(
renderer, renderer,
view.view, view.view,
view.renderTarget == null ? nullptr : view.renderTarget!.renderTarget, view.renderTarget == null
? nullptr
: view.renderTarget!.renderTarget,
// TPixelDataFormat.PIXELDATAFORMAT_RGBA, // TPixelDataFormat.PIXELDATAFORMAT_RGBA,
// TPixelDataType.PIXELDATATYPE_UBYTE, // TPixelDataType.PIXELDATATYPE_UBYTE,
pixelDataFormat.value, pixelDataFormat.value,
pixelDataType.value, pixelDataType.value,
pixelBuffer.address, pixelBuffer.address,
pixelBuffer.length, pixelBuffer.length,
cb cb);
);
}); });
pixelBuffers.add((view, pixelBuffer)); pixelBuffers.add((view, pixelBuffer));
} }
@@ -866,7 +868,8 @@ class FFIFilamentApp extends FilamentApp<Pointer> {
/// ///
/// ///
@override @override
Future<ThermionAsset> createGeometry(Geometry geometry, Pointer animationManager, Future<ThermionAsset> createGeometry(
Geometry geometry, Pointer animationManager,
{List<MaterialInstance>? materialInstances, {List<MaterialInstance>? materialInstances,
bool keepData = false, bool keepData = false,
bool addToScene = true}) async { bool addToScene = true}) async {
@@ -903,6 +906,13 @@ class FFIFilamentApp extends FilamentApp<Pointer> {
return FFIAsset(assetPtr, this, animationManager.cast<TAnimationManager>()); return FFIAsset(assetPtr, this, animationManager.cast<TAnimationManager>());
} }
///
///
///
Future flush() async {
await withVoidCallback((cb) => Engine_flushAndWaitRenderThead(engine, cb));
}
} }
class FinalizableUint8List implements Finalizable { class FinalizableUint8List implements Finalizable {