blob: 57c0a8f47aeff614b04198bcb9465f20334ec01e [file] [log] [blame]
part of vector_math_test;
class GeometryTest extends BaseTest {
void testGenerateNormals() {
final Vector3List positions = new Vector3List.fromList([
new Vector3(-1.0, 1.0, 1.0),
new Vector3(1.0, 1.0, 1.0),
new Vector3(1.0, 1.0, -1.0),
new Vector3(1.0, -1.0, 1.0),
]);
final Uint16List indices = new Uint16List.fromList([
0, 1, 2,
3, 2, 1
]);
Vector3List normals = new Vector3List(positions.length);
generateNormals(normals, positions, indices);
relativeTest(normals[0], new Vector3(0.0, 1.0, 0.0));
relativeTest(normals[1], new Vector3(0.70710, 0.70710, 0.0));
relativeTest(normals[2], new Vector3(0.70710, 0.70710, 0.0));
relativeTest(normals[3], new Vector3(1.0, 0.0, 0.0));
}
void testGenerateTangents() {
final Vector3List positions = new Vector3List.fromList([
new Vector3(-1.0, 1.0, 1.0),
new Vector3(1.0, 1.0, 1.0),
new Vector3(1.0, 1.0, -1.0),
new Vector3(1.0, -1.0, 1.0),
]);
final Vector3List normals = new Vector3List.fromList([
new Vector3(0.0, 1.0, 0.0),
new Vector3(0.70710, 0.70710, 0.0),
new Vector3(0.70710, 0.70710, 0.0),
new Vector3(1.0, 0.0, 0.0),
]);
final Vector2List texCoords = new Vector2List.fromList([
new Vector2(-1.0, 1.0),
new Vector2(1.0, 1.0),
new Vector2(1.0, -1.0),
new Vector2(-1.0, 1.0),
]);
final Uint16List indices = new Uint16List.fromList([
0, 1, 2,
3, 2, 1
]);
Vector4List tangents = new Vector4List(positions.length);
generateTangents(tangents, positions, normals, texCoords, indices);
relativeTest(tangents[0], new Vector4(1.0, 0.0, 0.0, -1.0));
relativeTest(tangents[1], new Vector4(0.70710, 0.70710, 0.0, 1.0));
relativeTest(tangents[2], new Vector4(0.70710, 0.70710, 0.0, 1.0));
relativeTest(tangents[3], new Vector4(0.0, 1.0, 0.0, 1.0));
}
MeshGeometry filterUnitCube(GeometryFilter filter) {
CubeGenerator generator = new CubeGenerator();
return generator.createCube(1.0, 1.0, 1.0, filters: [filter]);
}
void testTransformFilter() {
Matrix4 scaleMat = new Matrix4.identity();
scaleMat.scale(2.0, 2.0, 2.0);
TransformFilter filter = new TransformFilter(scaleMat);
MeshGeometry cube = filterUnitCube(filter);
// Check to ensure all the vertices were properly scaled
Vector3List positions = cube.getViewForAttrib("POSITION");
for(int i = 0; i < positions.length; ++i) {
Vector3 position = positions[i];
expect(position.storage[0].abs(), equals(2.0));
expect(position.storage[1].abs(), equals(2.0));
expect(position.storage[2].abs(), equals(2.0));
}
}
void testFlatShadeFilter() {
FlatShadeFilter filter = new FlatShadeFilter();
MeshGeometry cube = filterUnitCube(filter);
// Flat shading removes indices and duplicates vertices
expect(cube.indices, equals(null));
expect(cube.length, equals(36));
}
void testBarycentricFilter() {
BarycentricFilter filter = new BarycentricFilter();
MeshGeometry cube = filterUnitCube(filter);
// Generating barycentric coords removes indices and duplicates vertices
expect(cube.indices, equals(null));
expect(cube.length, equals(36));
expect(cube.getViewForAttrib("BARYCENTRIC"), isNotNull);
}
void testColorFilter() {
Vector4 filterColor = new Vector4(1.0, 0.0, 0.0, 1.0);
ColorFilter filter = new ColorFilter(filterColor);
MeshGeometry cube = filterUnitCube(filter);
// Ensure that the same color was applied to all vertices
Vector4List colors = cube.getViewForAttrib("COLOR");
for(int i = 0; i < colors.length; ++i) {
Vector4 color = colors[i];
relativeTest(color, filterColor);
}
}
void run() {
// Attribute Generation tests
test('normal generation', testGenerateNormals);
test('tangent generation', testGenerateTangents);
// Filter tests
test('transform filter', testTransformFilter);
test('flat shade filter', testFlatShadeFilter);
test('barycentric filter', testBarycentricFilter);
test('color filter', testColorFilter);
}
}