refactor: continual refactor to support multiple render targets

This commit is contained in:
Nick Fisher
2024-09-28 18:28:05 +08:00
parent 65e60da288
commit 921a994eb6
51 changed files with 1714 additions and 877 deletions

View File

@@ -67,7 +67,9 @@ void main() async {
print(frustum.plane5.normal);
print(frustum.plane5.constant);
await viewer.setCameraLensProjection(
var camera = await viewer.getMainCamera();
await camera.setLensProjection(
near: 10.0, far: 1000.0, aspect: 1.0, focalLength: 28.0);
frustum = await viewer.getCameraFrustum();
print(frustum.plane5.normal);
@@ -75,8 +77,8 @@ void main() async {
});
test('set custom projection/culling matrix', () async {
var viewer =
await testHelper.createViewer(bg: kRed, cameraPosition: Vector3(0, 0, 4));
var viewer = await testHelper.createViewer(
bg: kRed, cameraPosition: Vector3(0, 0, 4));
var camera = await viewer.getMainCamera();
final cube = await viewer.createGeometry(GeometryHelper.cube());
@@ -155,7 +157,7 @@ void main() async {
expect(await viewer.getActiveCamera(), newCamera);
await testHelper.capture(viewer, "create_camera_new_camera");
final mainCamera = await viewer.getMainCamera();
await viewer.setActiveCamera(mainCamera);
expect(await viewer.getActiveCamera(), mainCamera);

View File

@@ -0,0 +1,17 @@
import 'package:test/test.dart';
import 'helpers.dart';
void main() async {
final testHelper = TestHelper("gizmo");
group('gizmo', () {
test('add gizmo to scene', () async {
var viewer = await testHelper.createViewer();
var view = await viewer.getViewAt(0);
var gizmo = await viewer.createGizmo(view);
await testHelper.capture(viewer, "gizmo_add_to_scene");
await viewer.dispose();
});
});
}

View File

@@ -77,6 +77,8 @@ class TestHelper {
outDir = Directory("$testDir/output/${dir}");
// outDir.deleteSync(recursive: true);
outDir.createSync();
DynamicLibrary.open('${testDir}/libThermionTextureSwift.dylib');
}
Future capture(ThermionViewer viewer, String outputFilename,
@@ -84,33 +86,28 @@ class TestHelper {
await Future.delayed(Duration(milliseconds: 10));
var outPath = p.join(outDir.path, "$outputFilename.bmp");
var pixelBuffer = await viewer.capture(
view: view, swapChain ?? this.swapChain, renderTarget: renderTarget);
view: view,
swapChain: swapChain ?? this.swapChain,
renderTarget: renderTarget);
view ??= await viewer.getViewAt(0);
var vp = await view.getViewport();
await savePixelBufferToBmp(
pixelBuffer,
vp.width,
vp.height,
outPath);
await savePixelBufferToBmp(pixelBuffer, vp.width, vp.height, outPath);
return pixelBuffer;
}
Future<int> createTexture(int width, int height) async {
Future<ThermionTextureSwift> createTexture(int width, int height) async {
final packageUri = findPackageRoot('thermion_dart');
final lib = ThermionDartTexture1(DynamicLibrary.open(
'${packageUri.toFilePath()}/native/lib/macos/swift/libthermion_swift.dylib'));
final object = ThermionDartTexture.new1(lib);
var testDir = Directory("${packageUri.toFilePath()}/test").path;
final object = ThermionTextureSwift.new1();
object.initWithWidth_height_(width, height);
return object.metalTextureAddress;
return object;
}
Future<ThermionViewer> createViewer(
{img.Color? bg,
Vector3? cameraPosition,
viewportDimensions = (width: 500, height: 500)}) async {
final texture = await createTexture(
viewportDimensions.width, viewportDimensions.height);
final resourceLoader = calloc<ResourceLoaderWrapper>(1);
var loadToOut = NativeCallable<
Void Function(Pointer<Char>,

View File

@@ -647,16 +647,6 @@ void main() async {
});
});
group("render thread", () {
test("request frame on render thread", () async {
var viewer = await testHelper.createViewer();
viewer.requestFrame();
await Future.delayed(Duration(milliseconds: 20));
await viewer.dispose();
});
});
// group("unproject", () {
// test("unproject", () async {
// final dimensions = (width: 1280, height: 768);

Binary file not shown.

View File

@@ -0,0 +1,33 @@
import 'dart:async';
import 'dart:ffi';
import 'package:test/test.dart';
import 'helpers.dart';
void main() async {
final testHelper = TestHelper("render_thread");
group("render thread/capture", () {
test("request frame on render thread", () async {
var viewer = await testHelper.createViewer();
await viewer.setBackgroundColor(1.0, 0.0, 0.0, 1.0);
var texture = await testHelper.createTexture(500, 500);
var renderTarget = await viewer.createRenderTarget(
500, 500, texture.metalTextureAddress);
final view = await viewer.getViewAt(0);
await view.setRenderTarget(renderTarget);
await viewer.render();
await Future.delayed(Duration(milliseconds: 1));
var data = texture.getTextureBytes()!;
var pixels = data.bytes.cast<Uint8>().asTypedList(data.length);
savePixelBufferToBmp(
pixels, 500, 500, "${testHelper.testDir}/request_frame.bmp");
await viewer.dispose();
});
});
}

View File

@@ -1,5 +1,3 @@
import 'dart:math';
import 'package:test/test.dart';
import 'package:thermion_dart/thermion_dart.dart';
import 'package:vector_math/vector_math_64.dart';
@@ -9,11 +7,17 @@ void main() async {
final testHelper = TestHelper("view");
group('view tests', () {
test('get camera from view', () async {
var viewer = await testHelper.createViewer();
var view = await viewer.getViewAt(0);
expect(await view.getCamera(), isNotNull);
});
test('one swapchain, render view to render target', () async {
var viewer = await testHelper.createViewer();
final texture = await testHelper.createTexture(500, 500);
final renderTarget = await viewer.createRenderTarget(500, 500, texture);
final renderTarget = await viewer.createRenderTarget(500, 500, texture.metalTextureAddress);
viewer.setRenderTarget(renderTarget);
await viewer.setBackgroundColor(1.0, 0, 0, 1);
@@ -27,9 +31,10 @@ void main() async {
"default_swapchain_default_view_render_target");
});
test('create secondary view, same swapchain', () async {
test('create secondary view, default swapchain', () async {
var viewer = await testHelper.createViewer();
await viewer.setBackgroundColor(1.0, 0, 0, 1);
final cube = await viewer.createGeometry(GeometryHelper.cube());
var mainCamera = await viewer.getMainCamera();
@@ -71,48 +76,28 @@ void main() async {
var mainCamera = await viewer.getMainCamera();
mainCamera.setTransform(Matrix4.translation(Vector3(0, 0, 5)));
final swapChain = await viewer.createSwapChain(200, 400);
final swapChain = await viewer.createSwapChain(1, 1);
await testHelper.capture(
viewer, "create_swapchain_default_view_default_swapchain");
final view = await viewer.createView();
final texture = await testHelper.createTexture(400, 400);
final renderTarget = await viewer.createRenderTarget(400, 400, texture);
final texture = await testHelper.createTexture(200, 400);
final renderTarget = await viewer.createRenderTarget(200, 400, texture.metalTextureAddress);
await view.setRenderTarget(renderTarget);
await view.updateViewport(400, 400);
await view.updateViewport(200, 400);
view.setCamera(mainCamera);
mainCamera.setLensProjection(aspect: 0.5);
await testHelper.capture(
viewer,
view: view,
swapChain: swapChain,
renderTarget: renderTarget,
"create_swapchain_new_view_new_swapchain",
"create_swapchain_secondary_view_new_swapchain",
);
// var newCamera = await viewer.createCamera();
// newCamera.setTransform(Matrix4.translation(Vector3(0.0, 0.0, 10.0)));
// newCamera.setLensProjection();
// view.setCamera(newCamera);
// await testHelper.capture(
// viewer,
// "created_view_with_new_camera",
// view: view,
// );
// await testHelper.capture(
// viewer,
// "default_view_main_camera_no_change",
// );
// // await view.updateViewport(200, 400);
// // await view.setRenderTarget(renderTarget);
// // await viewer.setBackgroundColor(1.0, 0.0, 0.0, 1.0);
// // await testHelper.capture(viewer, "create_view_with_render_target",
// // renderTarget: renderTarget);
await viewer.dispose();
});
});

View File

@@ -47,9 +47,9 @@ late String testDir;
void main() async {
final packageUri = findPackageRoot('thermion_dart');
testDir = Directory("${packageUri.toFilePath()}/test").path;
final lib = ThermionDartTexture1(DynamicLibrary.open(
final lib = ThermionTexture1(DynamicLibrary.open(
'${packageUri.toFilePath()}/native/lib/macos/swift/libthermion_swift.dylib'));
final object = ThermionDartTexture.new1(lib);
final object = ThermionTexture.new1(lib);
object.initWithWidth_height_(500, 500);
final resourceLoader = calloc<ResourceLoaderWrapper>(1);

View File

@@ -43,9 +43,9 @@ late String testDir;
void main() async {
final packageUri = findPackageRoot('thermion_dart');
testDir = Directory("${packageUri.toFilePath()}/test").path;
final lib = ThermionDartTexture1(DynamicLibrary.open(
final lib = ThermionTexture1(DynamicLibrary.open(
'${packageUri.toFilePath()}/native/lib/macos/swift/libthermion_swift.dylib'));
final object = ThermionDartTexture.new1(lib);
final object = ThermionTexture.new1(lib);
object.initWithWidth_height_(500, 500);
final resourceLoader = calloc<ResourceLoaderWrapper>(1);