From 66d3bf65fdc5fd9d890c6ad651223860e392f51d Mon Sep 17 00:00:00 2001 From: Nick Fisher Date: Tue, 10 Jun 2025 09:08:30 +0800 Subject: [PATCH] add view test for multiple views rendering into the same render target --- thermion_dart/test/view_tests.dart | 63 ++++++++++++++++++++++++++++-- 1 file changed, 60 insertions(+), 3 deletions(-) diff --git a/thermion_dart/test/view_tests.dart b/thermion_dart/test/view_tests.dart index 81b7a8a7..9d5dcb09 100644 --- a/thermion_dart/test/view_tests.dart +++ b/thermion_dart/test/view_tests.dart @@ -202,6 +202,64 @@ void main() async { isFloat: true); }); + /// + /// + /// + test('render two views to same render target', () async { + final viewportDimensions = (width: 500, height: 500); + final swapChain = await FilamentApp.instance!.createHeadlessSwapChain( + viewportDimensions.width, viewportDimensions.height); + final views = []; + + await FilamentApp.instance!.setClearOptions(0, 0, 0, 0, + clear: false, clearStencil: 0, discard: false); + + final renderTarget = await FilamentApp.instance!.createRenderTarget( + viewportDimensions.width, viewportDimensions.height) as FFIRenderTarget; + + for (int i = 0; i < 2; i++) { + final camera = await FilamentApp.instance!.createCamera() as FFICamera; + await camera.setLensProjection(); + final view = await FilamentApp.instance!.createView() as FFIView; + final scene = await FilamentApp.instance!.createScene() as FFIScene; + await view.setScene(scene); + await view.setRenderable(true); + await view.setViewport( + viewportDimensions.width, viewportDimensions.height); + await view.setFrustumCullingEnabled(false); + await view.setPostProcessing(false); + + await view.setRenderTarget(renderTarget); + + await FilamentApp.instance!.register(swapChain, view); + await view.setCamera(camera); + views.add(view); + + await camera.lookAt(Vector3(0, 4, 12), + focus: Vector3(i == 0 ? -2 : 2, 0, 0)); + + var cube = await FilamentApp.instance!.createGeometry( + GeometryHelper.cube(flipUvs: true), nullptr) as FFIAsset; + + await scene.add(cube); + } + var result = await FilamentApp.instance! + .capture(swapChain, captureRenderTarget: true); + + await savePixelBufferToBmp( + result.first.$2, + viewportDimensions.width, + viewportDimensions.height, + p.join(testHelper.outDir.path, "two_views_same_render_target1.bmp"), + isFloat: true); + await savePixelBufferToBmp( + result.last.$2, + viewportDimensions.width, + viewportDimensions.height, + p.join(testHelper.outDir.path, "two_views_same_render_target2.bmp"), + isFloat: true); + }); + test('render depth buffer to render target', () async { final viewportDimensions = (width: 500, height: 500); final swapChain = await FilamentApp.instance!.createHeadlessSwapChain( @@ -293,10 +351,9 @@ void main() async { await testHelper.capture(viewer.view, "fog_options_disabled"); - await viewer.view.setFogOptions(FogOptions( - enabled: true, distance: 0, density: 0.5)); + await viewer.view + .setFogOptions(FogOptions(enabled: true, distance: 0, density: 0.5)); await testHelper.capture(viewer.view, "fog_options_enabled"); - }, addSkybox: true, postProcessing: true); }); }