don't require SwapChain to be passed to viewer.render - this will just render into all registered swapchains

This commit is contained in:
Nick Fisher
2025-06-24 10:36:10 +08:00
parent c7d4d9cb33
commit d20ff0a6f1
4 changed files with 33 additions and 33 deletions

View File

@@ -203,8 +203,8 @@ abstract class FilamentApp<T> {
/// ///
/// ///
/// ///
Future setMaterialInstanceAt( Future setMaterialInstanceAt(ThermionEntity entity, int primitiveIndex,
ThermionEntity entity, int primitiveIndex, MaterialInstance materialInstance); MaterialInstance materialInstance);
/// ///
/// ///
@@ -216,6 +216,11 @@ abstract class FilamentApp<T> {
/// ///
Future unregister(covariant SwapChain swapChain, covariant View view); Future unregister(covariant SwapChain swapChain, covariant View view);
///
///
///
Future<Iterable<SwapChain>> getSwapChains();
/// ///
/// ///
/// ///

View File

@@ -123,25 +123,29 @@ class ThermionViewerFFI extends ThermionViewer {
/// ///
/// ///
@override @override
Future render(SwapChain swapchain) async { Future render() async {
await withBoolCallback( final swapChains =
(cb) => Renderer_beginFrameRenderThread( await (FilamentApp.instance as FFIFilamentApp).getSwapChains();
app.renderer, for (final swapChain in swapChains) {
(swapchain as FFISwapChain).swapChain, await withBoolCallback(
0.toBigInt, (cb) => Renderer_beginFrameRenderThread(
cb, app.renderer,
), swapChain.getNativeHandle(),
); 0.toBigInt,
cb,
),
);
await withVoidCallback( await withVoidCallback(
(requestId, cb) => (requestId, cb) =>
Renderer_renderRenderThread(app.renderer, view.view, requestId, cb), Renderer_renderRenderThread(app.renderer, view.view, requestId, cb),
); );
await withVoidCallback( await withVoidCallback(
(requestId, cb) => (requestId, cb) =>
Renderer_endFrameRenderThread(app.renderer, requestId, cb), Renderer_endFrameRenderThread(app.renderer, requestId, cb),
); );
await FilamentApp.instance!.flush(); await FilamentApp.instance!.flush();
}
} }
double _msPerFrame = 1000.0 / 60.0; double _msPerFrame = 1000.0 / 60.0;

View File

@@ -39,9 +39,9 @@ abstract class ThermionViewer {
Future setRendering(bool render); Future setRendering(bool render);
/// ///
/// Render a single frame immediately. /// Render a single frame immediately into all registered swapchains.
/// ///
Future render(SwapChain swapChain); Future render();
/// ///
/// ///

View File

@@ -13,20 +13,11 @@ void main() async {
test("request frame on render thread", () async { test("request frame on render thread", () async {
await testHelper.withViewer((viewer) async { await testHelper.withViewer((viewer) async {
await viewer.render(); await viewer.render();
await Future.delayed(Duration(seconds: 1));
await Future.delayed(Duration(milliseconds: 1));
// var data = viewer.metalTexture.getTextureBytes()!;
// var pixels = data.bytes.cast<Uint8>().asTypedList(data.length);
// savePixelBufferToBmp(
// pixels, 500, 500, "${testHelper.testDir}/request_frame.bmp");
await viewer.setRendering(true); await viewer.setRendering(true);
await Future.delayed(Duration(seconds: 1)); await Future.delayed(Duration(seconds: 1));
await FilamentApp.instance!.requestFrame(); await FilamentApp.instance!.requestFrame();
await testHelper.capture(viewer.view, "render_thread_2"); await testHelper.capture(viewer.view, "render_thread_2");
}); }, addSkybox: true);
}); });
} }