test updates

This commit is contained in:
Nick Fisher
2024-09-19 12:52:27 +08:00
parent 60530fad6b
commit ce2266d0ed

View File

@@ -8,6 +8,7 @@ import 'package:animation_tools_dart/animation_tools_dart.dart';
import 'package:path/path.dart' as p;
import 'package:thermion_dart/thermion_dart/utils/geometry.dart';
import 'package:thermion_dart/thermion_dart/viewer/events.dart';
import 'package:thermion_dart/thermion_dart/viewer/ffi/thermion_viewer_ffi.dart';
import 'package:vector_math/vector_math_64.dart';
import 'helpers.dart';
@@ -24,7 +25,7 @@ void main() async {
Future _capture(ThermionViewer viewer, String outputFilename) async {
var outPath = p.join(outDir.path, "$outputFilename.bmp");
var pixelBuffer = await viewer.capture();
await pixelBufferToBmp(pixelBuffer, viewportDimensions.width,
await savePixelBufferToBmp(pixelBuffer, viewportDimensions.width,
viewportDimensions.height, outPath);
}
@@ -110,15 +111,50 @@ void main() async {
});
group("gltf", () {
test('load glb', () async {
test('load glb from file', () async {
var viewer = await createViewer();
var model = await viewer.loadGlb("$testDir/cube.glb");
var model = await viewer.loadGlb("file://$testDir/cube.glb");
await viewer.transformToUnitCube(model);
await viewer.setBackgroundColor(0.0, 0.0, 1.0, 1.0);
await viewer.setCameraPosition(0, 1, 5);
await viewer
.setCameraRotation(Quaternion.axisAngle(Vector3(1, 0, 0), -0.5));
await _capture(viewer, "load_glb");
await _capture(viewer, "load_glb_from_file");
});
test('load glb from buffer', () async {
var viewer = await createViewer();
var buffer = File("$testDir/cube.glb").readAsBytesSync();
var model = await viewer.loadGlbFromBuffer(buffer);
await viewer.transformToUnitCube(model);
await viewer.setBackgroundColor(0.0, 0.0, 1.0, 1.0);
await viewer.setCameraPosition(0, 1, 5);
await viewer
.setCameraRotation(Quaternion.axisAngle(Vector3(1, 0, 0), -0.5));
await _capture(viewer, "load_glb_from_buffer");
});
test('load glb from buffer with priority', () async {
var viewer = await createViewer();
await viewer.addDirectLight(DirectLight.sun());
await viewer.setBackgroundColor(1.0, 1.0, 1.0, 1.0);
await viewer.setCameraPosition(0, 3, 5);
await viewer
.setCameraRotation(Quaternion.axisAngle(Vector3(1, 0, 0), -0.5));
var buffer = File("$testDir/cube.glb").readAsBytesSync();
var model1 = await viewer.loadGlbFromBuffer(buffer, priority: 7);
var model2 = await viewer.loadGlbFromBuffer(buffer, priority: 0);
for (final entity in await viewer.getChildEntities(model1, true)) {
await viewer.setMaterialPropertyFloat4(
entity, "baseColorFactor", 0, 0, 0, 1.0, 1.0);
}
for (final entity in await viewer.getChildEntities(model2, true)) {
await viewer.setMaterialPropertyFloat4(
entity, "baseColorFactor", 0, 0, 1.0, 0.0, 1.0);
}
await _capture(viewer, "load_glb_from_buffer_with_priority");
});
});
@@ -242,12 +278,27 @@ void main() async {
});
group("custom geometry", () {
test('create cube (no uvs/normals)', () async {
var viewer = await createViewer();
await viewer.addLight(LightType.SUN, 6500, 1000000, 0, 0, 0, 0, 0, -1);
await viewer.setCameraPosition(0, 2, 6);
await viewer
.setCameraRotation(Quaternion.axisAngle(Vector3(1, 0, 0), -pi / 8));
await viewer.setBackgroundColor(1.0, 1.0, 1.0, 1.0);
await viewer
.createGeometry(GeometryHelper.cube(normals: false, uvs: false));
await _capture(viewer, "geometry_cube_no_uv_no_normal");
});
test('create cube (no normals)', () async {
var viewer = await createViewer();
var light = await viewer.addLight(
LightType.POINT, 6500, 1000000, 0, 0.6, 0.6, 0, 0, 0,
falloffRadius: 2.0);
await viewer.setCameraPosition(0, 0, 6);
LightType.POINT, 6500, 10000000, 0, 2, 0, 0, 0, 0,
falloffRadius: 100.0);
await viewer.setCameraPosition(0, 2, 6);
await viewer
.setCameraRotation(Quaternion.axisAngle(Vector3(1, 0, 0), -pi / 8));
await viewer.setBackgroundColor(1.0, 0.0, 1.0, 1.0);
await viewer
.createGeometry(GeometryHelper.cube(normals: false, uvs: false));
@@ -258,15 +309,36 @@ void main() async {
var viewer = await createViewer();
var light = await viewer.addLight(
LightType.POINT, 6500, 1000000, 0, 0.5, 1, 0, 0, 0,
LightType.POINT, 6500, 10000000, 0, 2, 0, 0, 0, 0,
falloffRadius: 100.0);
await viewer.setCameraPosition(0, 0, 6);
await viewer.setBackgroundColor(1.0, 0.0, 1.0, 1.0);
await viewer.setCameraPosition(0, 2, 6);
await viewer
.setCameraRotation(Quaternion.axisAngle(Vector3(1, 0, 0), -pi / 8));
await viewer.setBackgroundColor(1.0, 1.0, 1.0, 1.0);
await viewer
.createGeometry(GeometryHelper.cube(normals: true, uvs: false));
await _capture(viewer, "geometry_cube_with_normals");
});
test('create cube with custom material instance', () async {
var viewer = await createViewer();
await viewer.addLight(LightType.SUN, 6500, 1000000, 0, 0, 0, 0, 0, -1);
await viewer.setCameraPosition(0, 2, 6);
await viewer
.setCameraRotation(Quaternion.axisAngle(Vector3(1, 0, 0), -pi / 8));
await viewer.setBackgroundColor(1.0, 0.0, 1.0, 1.0);
// var materialInstance =
// await viewer.createUbershaderMaterialInstance(unlit: true);
final cube = await viewer.createGeometry(
GeometryHelper.cube(uvs: false, normals: true),
materialInstance: null);
// await viewer.setMaterialPropertyFloat4(
// cube, "baseColorFactor", 0, 0.0, 1.0, 0.0, 0.0);
// await viewer.destroyMaterialInstance(materialInstance);
await _capture(viewer, "geometry_cube_with_custom_material");
});
test('create sphere (no normals)', () async {
var viewer = await createViewer();
await viewer.setBackgroundColor(0.0, 0.0, 1.0, 1.0);
@@ -445,16 +517,35 @@ void main() async {
});
});
// test('enable grid overlay', () async {
// await viewer.setBackgroundColor(0, 0, 0, 1);
// await viewer.setCameraPosition(0, 0.5, 0);
// await viewer
// .setCameraRotation(Quaternion.axisAngle(Vector3(1, 0, 0), -0.1));
// await viewer.setRendering(true);
// await viewer.setLayerEnabled(2, true);
// await _capture(viewer, "grid");
// await viewer.setRendering(false);
// });
group("layers & overlays", () {
test('enable grid overlay', () async {
var viewer = await createViewer();
await viewer.setBackgroundColor(0, 0, 0, 1);
await viewer
.setCameraRotation(Quaternion.axisAngle(Vector3(1, 0, 0), -pi / 8));
await viewer.setCameraPosition(0, 2, 0);
await _capture(viewer, "grid_overlay_default");
await viewer.setLayerEnabled(7, true);
await _capture(viewer, "grid_overlay_enabled");
await viewer.setLayerEnabled(7, false);
await _capture(viewer, "grid_overlay_disabled");
});
test('load glb from buffer with layer', () async {
var viewer = await createViewer();
await viewer.setBackgroundColor(1, 0, 1, 1);
await viewer.setCameraPosition(0, 2, 5);
await viewer
.setCameraRotation(Quaternion.axisAngle(Vector3(1, 0, 0), -0.5));
var buffer = File("$testDir/cube.glb").readAsBytesSync();
var model = await viewer.loadGlbFromBuffer(buffer, layer: 1);
await _capture(viewer, "load_glb_from_buffer_with_layer_disabled");
await viewer.setLayerEnabled(1, true);
await _capture(viewer, "load_glb_from_buffer_with_layer_enabled");
});
});
// test('point light', () async {
// var model = await viewer.loadGlb("$testDir/cube.glb");
@@ -618,4 +709,71 @@ void main() async {
await _capture(viewer, "stencil_highlight_multiple_geometry_removed");
});
});
group("texture", () {
test("create/apply/dispose texture", () async {
var viewer = await createViewer();
var textureData =
File("$testDir/cube_texture_512x512.png").readAsBytesSync();
var texture = await viewer.createTexture(textureData);
await viewer.setBackgroundColor(0.0, 0.0, 0.0, 1.0);
await viewer.createIbl(1.0, 1.0, 1.0, 60000.0);
await viewer.setCameraPosition(0, 2, 6);
await viewer
.setCameraRotation(Quaternion.axisAngle(Vector3(1, 0, 0), -pi / 8));
var cube = await viewer.createGeometry(GeometryHelper.cube());
await viewer.applyTexture(texture, cube,
materialIndex: 0, parameterName: "baseColorMap");
await _capture(viewer, "texture_applied_to_geometry");
await viewer.removeEntity(cube);
await viewer.destroyTexture(texture);
});
});
group("unproject", () {
test("unproject", () async {
var viewer = await createViewer();
await viewer.setPostProcessing(false);
// await viewer.setToneMapping(ToneMapper.LINEAR);
await viewer.setBackgroundColor(1.0, 1.0, 1.0, 1.0);
// await viewer.createIbl(1.0, 1.0, 1.0, 100000);
await viewer.addLight(LightType.SUN, 6500, 100000, -2, 0, 0, 1, -1, 0);
await viewer.addLight(LightType.SPOT, 6500, 500000, 0, 0, 2, 0, 0, -1,
falloffRadius: 10, spotLightConeInner: 1.0, spotLightConeOuter: 2.0);
await viewer.setCameraPosition(-3, 4, 6);
await viewer.setCameraRotation(
Quaternion.axisAngle(Vector3(0, 1, 0), -pi / 8) *
Quaternion.axisAngle(Vector3(1, 0, 0), -pi / 6));
var cube =
await viewer.createGeometry(GeometryHelper.cube(), keepData: true);
await viewer.setMaterialPropertyFloat4(
cube, "baseColorFactor", 0, 1.0, 1.0, 1.0, 1.0);
var textureData =
File("$testDir/cube_texture_512x512.png").readAsBytesSync();
var texture = await viewer.createTexture(textureData);
await viewer.applyTexture(texture, cube,
materialIndex: 0, parameterName: "baseColorMap");
await _capture(viewer, "unproject_temporary");
var pixelBuffer =
await (await viewer as ThermionViewerFFI).unproject(cube, 256, 256);
await savePixelBufferToBmp(
pixelBuffer, 256, 256, p.join(outDir.path, "unproject.bmp"));
var pixelBufferPng = await bmpToPng(pixelBuffer, 256, 256);
File("${outDir.path}/unproject_texture.png")
.writeAsBytesSync(pixelBufferPng);
var reconstructed = await viewer.createTexture(pixelBufferPng);
await viewer.applyTexture(reconstructed, cube);
await _capture(viewer, "unproject_reconstruct");
});
});
}