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); }); }