diff --git a/thermion_dart/test/camera_tests.dart b/thermion_dart/test/camera_tests.dart index 39677e59..7a2db0dd 100644 --- a/thermion_dart/test/camera_tests.dart +++ b/thermion_dart/test/camera_tests.dart @@ -7,6 +7,7 @@ void main() async { final testHelper = TestHelper("integration"); group('camera', () { + test('getCameraModelMatrix, getCameraPosition, rotation', () async { var viewer = await testHelper.createViewer(); var matrix = await viewer.getCameraModelMatrix(); @@ -23,6 +24,8 @@ void main() async { expect(position.x, 2.0); expect(position.y, 2.0); expect(position.z, 2.0); + + await viewer.dispose(); }); test('getCameraViewMatrix', () async { @@ -46,19 +49,24 @@ void main() async { expect(position.x, closeTo(3.0, 1e-6)); expect(position.y, closeTo(4.0, 1e-6)); expect(position.z, closeTo(5.0, 1e-6)); + await viewer.dispose(); + }); test('getCameraProjectionMatrix', () async { var viewer = await testHelper.createViewer(); var projectionMatrix = await viewer.getCameraProjectionMatrix(); print(projectionMatrix); + await viewer.dispose(); }); test('getCameraCullingProjectionMatrix', () async { + throw Exception("TODO"); var viewer = await testHelper.createViewer(); var matrix = await viewer.getCameraCullingProjectionMatrix(); print(matrix); - throw Exception("TODO"); + await viewer.dispose(); + }); test('getCameraFrustum', () async { @@ -74,6 +82,8 @@ void main() async { frustum = await viewer.getCameraFrustum(); print(frustum.plane5.normal); print(frustum.plane5.constant); + + await viewer.dispose(); }); test('set orthographic projection', () async { @@ -85,6 +95,7 @@ void main() async { await camera.setProjection(Projection.Orthographic, -0.05, 0.05, -0.05, 0.05, 0.05, 10000); await testHelper.capture( viewer, "camera_set_orthographic_projection"); + await viewer.dispose(); }); test('set custom projection/culling matrix', () async { @@ -92,12 +103,13 @@ void main() async { bg: kRed, cameraPosition: Vector3(0, 0, 4)); var camera = await viewer.getMainCamera(); final cube = await viewer.createGeometry(GeometryHelper.cube()); - + // cube is visible when inside the frustum, cube is visible var projectionMatrix = makeOrthographicMatrix(-10.0, 10.0, -10.0, 10.0, 0.05, 10000); await camera.setProjectionMatrixWithCulling( projectionMatrix, 0.05, 10000); + await testHelper.capture( viewer, "camera_projection_culling_matrix_object_in_frustum"); @@ -107,6 +119,8 @@ void main() async { await camera.setProjectionMatrixWithCulling(projectionMatrix, 0.05, 1); await testHelper.capture( viewer, "camera_projection_culling_matrix_object_outside_frustum"); + + await viewer.dispose(); }); test('setting transform on camera updates model matrix (no parent)', @@ -123,6 +137,8 @@ void main() async { expect(modelMatrix.getColumn(3).y, 0.0); expect(modelMatrix.getColumn(3).z, 0.0); expect(modelMatrix.getColumn(3).w, 1.0); + + await viewer.dispose(); }); test('setting transform on camera updates model matrix (with parent)', @@ -150,6 +166,7 @@ void main() async { expect(modelMatrix.getColumn(3).y, 1.0); expect(modelMatrix.getColumn(3).z, 0.0); expect(modelMatrix.getColumn(3).w, 1.0); + await viewer.dispose(); }); test('create camera', () async { @@ -178,6 +195,8 @@ void main() async { expect(viewer.getCameraAt(0), await viewer.getMainCamera()); expect(viewer.getCameraAt(1), newCamera); await expectLater(() => viewer.getCameraAt(2), throwsA(isA())); + + await viewer.dispose(); }); }); } diff --git a/thermion_dart/test/gltf_tests.dart b/thermion_dart/test/gltf_tests.dart index 627fe1ef..bb9c6718 100644 --- a/thermion_dart/test/gltf_tests.dart +++ b/thermion_dart/test/gltf_tests.dart @@ -20,7 +20,7 @@ void main() async { test('load glb from buffer', () async { var viewer = await testHelper.createViewer(); - var buffer = File("${testHelper.testDir}/cube.glb").readAsBytesSync(); + var buffer = File("${testHelper.testDir}/assets/cube.glb").readAsBytesSync(); var model = await viewer.loadGlbFromBuffer(buffer); await viewer.transformToUnitCube(model); await viewer.setBackgroundColor(0.0, 0.0, 1.0, 1.0); @@ -28,6 +28,7 @@ void main() async { await viewer .setCameraRotation(Quaternion.axisAngle(Vector3(1, 0, 0), -0.5)); await testHelper.capture(viewer, "load_glb_from_buffer"); + await viewer.dispose(); }); test('load glb from buffer with priority', () async { @@ -38,7 +39,7 @@ void main() async { await viewer .setCameraRotation(Quaternion.axisAngle(Vector3(1, 0, 0), -0.5)); - var buffer = File("${testHelper.testDir}/cube.glb").readAsBytesSync(); + var buffer = File("${testHelper.testDir}/assets/cube.glb").readAsBytesSync(); var model1 = await viewer.loadGlbFromBuffer(buffer, priority: 7); var model2 = await viewer.loadGlbFromBuffer(buffer, priority: 0); @@ -51,6 +52,8 @@ void main() async { entity, "baseColorFactor", 0, 0, 1.0, 0.0, 1.0); } await testHelper.capture(viewer, "load_glb_from_buffer_with_priority"); + + await viewer.dispose(); }); }); } diff --git a/thermion_dart/test/helpers.dart b/thermion_dart/test/helpers.dart index ddaf1a41..268fe648 100644 --- a/thermion_dart/test/helpers.dart +++ b/thermion_dart/test/helpers.dart @@ -76,19 +76,24 @@ class TestHelper { outDir = Directory("$testDir/output/${dir}"); // outDir.deleteSync(recursive: true); - outDir.createSync(); - DynamicLibrary.open('${testDir}/libThermionTextureSwift.dylib'); - + outDir.createSync(recursive: true); + if(Platform.isMacOS) { + DynamicLibrary.open('${testDir}/libThermionTextureSwift.dylib'); + } } Future capture(ThermionViewer viewer, String outputFilename, {View? view, SwapChain? swapChain, RenderTarget? renderTarget}) async { + await Future.delayed(Duration(milliseconds: 10)); var outPath = p.join(outDir.path, "$outputFilename.bmp"); + var pixelBuffer = await viewer.capture( view: view, swapChain: swapChain ?? this.swapChain, renderTarget: renderTarget); + await viewer.render(); + view ??= await viewer.getViewAt(0); var vp = await view.getViewport(); await savePixelBufferToBmp(pixelBuffer, vp.width, vp.height, outPath); diff --git a/thermion_dart/test/render_thread_tests.dart b/thermion_dart/test/render_thread_tests.dart new file mode 100644 index 00000000..231adbc5 --- /dev/null +++ b/thermion_dart/test/render_thread_tests.dart @@ -0,0 +1,28 @@ +import 'package:test/test.dart'; +import 'helpers.dart'; + +void main() async { + final testHelper = TestHelper("renderThread"); + + group('camera', () { + test('getCameraModelMatrix, getCameraPosition, rotation', () async { + var viewer = await testHelper.createViewer(); + var matrix = await viewer.getCameraModelMatrix(); + expect(matrix.trace(), 4); + + await viewer.setCameraPosition(2.0, 2.0, 2.0); + matrix = await viewer.getCameraModelMatrix(); + var position = matrix.getColumn(3).xyz; + expect(position.x, 2.0); + expect(position.y, 2.0); + expect(position.z, 2.0); + + position = await viewer.getCameraPosition(); + expect(position.x, 2.0); + expect(position.y, 2.0); + expect(position.z, 2.0); + }); + + + }); +} diff --git a/thermion_dart/test/skybox_tests.dart b/thermion_dart/test/skybox_tests.dart index e1a87695..0984f97d 100644 --- a/thermion_dart/test/skybox_tests.dart +++ b/thermion_dart/test/skybox_tests.dart @@ -10,10 +10,11 @@ void main() async { test('load skybox', () async { var viewer = await testHelper.createViewer(); await viewer.loadSkybox( - "file:///${testHelper.testDir}/assets/default_env_skybox.ktx"); + "file://${testHelper.testDir}/assets/default_env_skybox.ktx"); await testHelper.capture(viewer, "load_skybox"); await viewer.removeSkybox(); await testHelper.capture(viewer, "remove_skybox"); + await viewer.dispose(); }); }); } diff --git a/thermion_dart/test/view_tests.dart b/thermion_dart/test/view_tests.dart index f7603bc8..6b0acb41 100644 --- a/thermion_dart/test/view_tests.dart +++ b/thermion_dart/test/view_tests.dart @@ -13,6 +13,9 @@ void main() async { var viewer = await testHelper.createViewer(); var view = await viewer.getViewAt(0); expect(await view.getCamera(), isNotNull); + + await viewer.dispose(); + }); test('one swapchain, render view to render target', () async { @@ -32,6 +35,9 @@ void main() async { viewer, renderTarget: renderTarget, "default_swapchain_default_view_render_target"); + + await viewer.dispose(); + }); test('create secondary view, default swapchain', () async {