Files
cup_edit/test/bone_driver_test.dart
2023-04-26 17:49:44 +08:00

74 lines
2.7 KiB
Dart

import 'dart:convert';
import 'dart:math';
import 'dart:typed_data';
import 'package:flutter_test/flutter_test.dart';
import 'package:polyvox_filament/animations/bone_driver.dart';
import 'package:vector_math/vector_math.dart';
void main() {
group('BoneDriver', () {
test('constructor sets correct values', () {
Quaternion rotMin = Quaternion.identity();
Quaternion rotMax = Quaternion.axisAngle(Vector3(1, 0, 0), 0.5);
Vector3 transMin = Vector3.zero();
Vector3 transMax = Vector3(1, 1, 1);
BoneDriver boneDriver = BoneDriver(
'bone1', 'blendshape1', rotMin, rotMax, transMin, transMax);
expect(boneDriver.bone, 'bone1');
expect(boneDriver.blendshape, 'blendshape1');
expect(boneDriver.rotMin, rotMin);
expect(boneDriver.rotMax, rotMax);
expect(boneDriver.transMin, transMin);
expect(boneDriver.transMax, transMax);
});
test('fromJsonObject creates BoneDriver instance correctly', () {
dynamic jsonObject = {
"bone": "bone1",
"blendshape": "blendshape1",
"rotMin": Quaternion.identity().storage,
"rotMax": Quaternion.axisAngle(Vector3(1, 0, 0), 0.5).storage,
"transMin": Vector3.zero().storage,
"transMax": Vector3(1, 1, 1).storage
};
BoneDriver boneDriver = BoneDriver.fromJsonObject(jsonObject);
expect(boneDriver.bone, 'bone1');
expect(boneDriver.blendshape, 'blendshape1');
expect(boneDriver.rotMin.absoluteError(Quaternion.identity()), 0);
expect(
boneDriver.rotMax
.absoluteError(Quaternion.axisAngle(Vector3(1, 0, 0), 0.5)),
0);
expect(boneDriver.transMin.absoluteError(Vector3.zero()), 0);
expect(boneDriver.transMax.absoluteError(Vector3(1, 1, 1)), 0);
});
test('transform generates correct Quaternions', () {
Quaternion rotMin = Quaternion.identity();
Quaternion rotMax = Quaternion.axisAngle(Vector3(1, 0, 0), 0.5);
BoneDriver boneDriver =
BoneDriver('bone1', 'blendshape1', rotMin, rotMax, null, null);
List<double> morphTargetFrameData = [-1, 0, 1];
List<Quaternion> expectedResult = [
Quaternion(rotMin.x, rotMin.y, rotMin.z, 1.0),
Quaternion((rotMin.x + rotMax.x) / 2, (rotMin.y + rotMax.y) / 2,
(rotMin.z + rotMax.z) / 2, 1.0),
Quaternion(rotMax.x, rotMax.y, rotMax.z, 1.0),
];
Iterable<Quaternion> result = boneDriver.transform(morphTargetFrameData);
List<Quaternion> resultAsList = result.toList();
expect(resultAsList.length, expectedResult.length);
for (int i = 0; i < expectedResult.length; i++) {
expect(resultAsList[i].absoluteError(expectedResult[i]), 0);
}
});
});
}