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,11 +123,14 @@ class ThermionViewerFFI extends ThermionViewer {
/// ///
/// ///
@override @override
Future render(SwapChain swapchain) async { Future render() async {
final swapChains =
await (FilamentApp.instance as FFIFilamentApp).getSwapChains();
for (final swapChain in swapChains) {
await withBoolCallback( await withBoolCallback(
(cb) => Renderer_beginFrameRenderThread( (cb) => Renderer_beginFrameRenderThread(
app.renderer, app.renderer,
(swapchain as FFISwapChain).swapChain, swapChain.getNativeHandle(),
0.toBigInt, 0.toBigInt,
cb, cb,
), ),
@@ -143,6 +146,7 @@ class ThermionViewerFFI extends ThermionViewer {
); );
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);
}); });
} }