From d20ff0a6f153693bad5875a3d06fd6d31f5ebc40 Mon Sep 17 00:00:00 2001 From: Nick Fisher Date: Tue, 24 Jun 2025 10:36:10 +0800 Subject: [PATCH] don't require SwapChain to be passed to viewer.render - this will just render into all registered swapchains --- .../filament/src/interface/filament_app.dart | 9 ++++- .../src/ffi/src/thermion_viewer_ffi.dart | 40 ++++++++++--------- .../src/viewer/src/thermion_viewer_base.dart | 4 +- thermion_dart/test/render_thread_tests.dart | 13 +----- 4 files changed, 33 insertions(+), 33 deletions(-) diff --git a/thermion_dart/lib/src/filament/src/interface/filament_app.dart b/thermion_dart/lib/src/filament/src/interface/filament_app.dart index 3e0f37ac..5e9d8365 100644 --- a/thermion_dart/lib/src/filament/src/interface/filament_app.dart +++ b/thermion_dart/lib/src/filament/src/interface/filament_app.dart @@ -203,8 +203,8 @@ abstract class FilamentApp { /// /// /// - Future setMaterialInstanceAt( - ThermionEntity entity, int primitiveIndex, MaterialInstance materialInstance); + Future setMaterialInstanceAt(ThermionEntity entity, int primitiveIndex, + MaterialInstance materialInstance); /// /// @@ -216,6 +216,11 @@ abstract class FilamentApp { /// Future unregister(covariant SwapChain swapChain, covariant View view); + /// + /// + /// + Future> getSwapChains(); + /// /// /// diff --git a/thermion_dart/lib/src/viewer/src/ffi/src/thermion_viewer_ffi.dart b/thermion_dart/lib/src/viewer/src/ffi/src/thermion_viewer_ffi.dart index 840f5b78..71d90237 100644 --- a/thermion_dart/lib/src/viewer/src/ffi/src/thermion_viewer_ffi.dart +++ b/thermion_dart/lib/src/viewer/src/ffi/src/thermion_viewer_ffi.dart @@ -123,25 +123,29 @@ class ThermionViewerFFI extends ThermionViewer { /// /// @override - Future render(SwapChain swapchain) async { - await withBoolCallback( - (cb) => Renderer_beginFrameRenderThread( - app.renderer, - (swapchain as FFISwapChain).swapChain, - 0.toBigInt, - cb, - ), - ); + Future render() async { + final swapChains = + await (FilamentApp.instance as FFIFilamentApp).getSwapChains(); + for (final swapChain in swapChains) { + await withBoolCallback( + (cb) => Renderer_beginFrameRenderThread( + app.renderer, + swapChain.getNativeHandle(), + 0.toBigInt, + cb, + ), + ); - await withVoidCallback( - (requestId, cb) => - Renderer_renderRenderThread(app.renderer, view.view, requestId, cb), - ); - await withVoidCallback( - (requestId, cb) => - Renderer_endFrameRenderThread(app.renderer, requestId, cb), - ); - await FilamentApp.instance!.flush(); + await withVoidCallback( + (requestId, cb) => + Renderer_renderRenderThread(app.renderer, view.view, requestId, cb), + ); + await withVoidCallback( + (requestId, cb) => + Renderer_endFrameRenderThread(app.renderer, requestId, cb), + ); + await FilamentApp.instance!.flush(); + } } double _msPerFrame = 1000.0 / 60.0; diff --git a/thermion_dart/lib/src/viewer/src/thermion_viewer_base.dart b/thermion_dart/lib/src/viewer/src/thermion_viewer_base.dart index 43499b0e..02fafb09 100644 --- a/thermion_dart/lib/src/viewer/src/thermion_viewer_base.dart +++ b/thermion_dart/lib/src/viewer/src/thermion_viewer_base.dart @@ -39,9 +39,9 @@ abstract class ThermionViewer { Future setRendering(bool render); /// - /// Render a single frame immediately. + /// Render a single frame immediately into all registered swapchains. /// - Future render(SwapChain swapChain); + Future render(); /// /// diff --git a/thermion_dart/test/render_thread_tests.dart b/thermion_dart/test/render_thread_tests.dart index 20fab8e9..4eddc431 100644 --- a/thermion_dart/test/render_thread_tests.dart +++ b/thermion_dart/test/render_thread_tests.dart @@ -13,20 +13,11 @@ void main() async { test("request frame on render thread", () async { await testHelper.withViewer((viewer) async { await viewer.render(); - - await Future.delayed(Duration(milliseconds: 1)); - - // var data = viewer.metalTexture.getTextureBytes()!; - // var pixels = data.bytes.cast().asTypedList(data.length); - - // savePixelBufferToBmp( - // pixels, 500, 500, "${testHelper.testDir}/request_frame.bmp"); - + await Future.delayed(Duration(seconds: 1)); await viewer.setRendering(true); - await Future.delayed(Duration(seconds: 1)); await FilamentApp.instance!.requestFrame(); await testHelper.capture(viewer.view, "render_thread_2"); - }); + }, addSkybox: true); }); }