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

@@ -256,19 +256,17 @@ abstract class FilamentApp<T> {
Future<MaterialInstance> createImageMaterialInstance();
///
/// Returns pixel buffer(s) for [view] (or, if null, all views associated
/// Returns pixel buffer(s) for [view] (or, if null, all views associated
/// with [swapChain] by calling [register]).
///
///
/// Pixel buffers will be returned in RGBA float32 format.
///
Future<List<(View,Uint8List)>> capture(covariant SwapChain swapChain,
{
covariant View? view,
Future<List<(View, Uint8List)>> capture(covariant SwapChain swapChain,
{covariant View? view,
bool captureRenderTarget = false,
PixelDataFormat pixelDataFormat = PixelDataFormat.RGBA,
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,
{List<MaterialInstance>? materialInstances,
bool keepData = false});
{List<MaterialInstance>? materialInstances, bool keepData = false});
///
///
///
Future flush();
}

View File

@@ -681,7 +681,8 @@ class FFIFilamentApp extends FilamentApp<Pointer> {
beforeRender?.call(view);
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) {
Renderer_renderRenderThread(
renderer,
@@ -695,17 +696,18 @@ class FFIFilamentApp extends FilamentApp<Pointer> {
}
await withVoidCallback((cb) {
Renderer_readPixelsRenderThread(
renderer,
view.view,
view.renderTarget == null ? nullptr : view.renderTarget!.renderTarget,
// TPixelDataFormat.PIXELDATAFORMAT_RGBA,
// TPixelDataType.PIXELDATATYPE_UBYTE,
pixelDataFormat.value,
pixelDataType.value,
pixelBuffer.address,
pixelBuffer.length,
cb
);
renderer,
view.view,
view.renderTarget == null
? nullptr
: view.renderTarget!.renderTarget,
// TPixelDataFormat.PIXELDATAFORMAT_RGBA,
// TPixelDataType.PIXELDATATYPE_UBYTE,
pixelDataFormat.value,
pixelDataType.value,
pixelBuffer.address,
pixelBuffer.length,
cb);
});
pixelBuffers.add((view, pixelBuffer));
}
@@ -866,7 +868,8 @@ class FFIFilamentApp extends FilamentApp<Pointer> {
///
///
@override
Future<ThermionAsset> createGeometry(Geometry geometry, Pointer animationManager,
Future<ThermionAsset> createGeometry(
Geometry geometry, Pointer animationManager,
{List<MaterialInstance>? materialInstances,
bool keepData = false,
bool addToScene = true}) async {
@@ -903,6 +906,13 @@ class FFIFilamentApp extends FilamentApp<Pointer> {
return FFIAsset(assetPtr, this, animationManager.cast<TAnimationManager>());
}
///
///
///
Future flush() async {
await withVoidCallback((cb) => Engine_flushAndWaitRenderThead(engine, cb));
}
}
class FinalizableUint8List implements Finalizable {