ModelHandle/test/tests/modelutils_test.js

129 lines
5.7 KiB
JavaScript

var assert = require ('assert');
var testUtils = require ('../utils/testutils.js');
describe ('Model Utils', function () {
it ('Mesh Bounding Box', function () {
var cube = OV.GenerateCuboid (null, 1.0, 1.0, 1.0);
let cubeBounds = OV.GetBoundingBox (cube);
assert (OV.CoordIsEqual3D (cubeBounds.min, new OV.Coord3D (0.0, 0.0, 0.0)));
assert (OV.CoordIsEqual3D (cubeBounds.max, new OV.Coord3D (1.0, 1.0, 1.0)));
});
it ('Mesh Instance Bounding Box', function () {
let cube = OV.GenerateCuboid (null, 1.0, 1.0, 1.0);
let transformation = new OV.Transformation (new OV.Matrix ().CreateTranslation (2.0, 0.0, 0.0));
let node = new OV.Node ();
node.SetTransformation (transformation);
let cubeInstance = new OV.MeshInstance (node, cube);
let cubeInstanceBounds = OV.GetBoundingBox (cubeInstance);
assert (OV.CoordIsEqual3D (cubeInstanceBounds.min, new OV.Coord3D (2.0, 0.0, 0.0)));
assert (OV.CoordIsEqual3D (cubeInstanceBounds.max, new OV.Coord3D (3.0, 1.0, 1.0)));
});
it ('Model Bounding Box', function () {
var model = new OV.Model ();
var mesh1 = new OV.Mesh ();
mesh1.AddVertex (new OV.Coord3D (0.0, 0.0, 0.0));
mesh1.AddVertex (new OV.Coord3D (1.0, 0.0, 0.0));
mesh1.AddVertex (new OV.Coord3D (1.0, 1.0, 0.0));
mesh1.AddTriangle (new OV.Triangle (0, 1, 2));
model.AddMeshToRootNode (mesh1);
var mesh2 = new OV.Mesh ();
mesh2.AddVertex (new OV.Coord3D (0.0, 0.0, 1.0));
mesh2.AddVertex (new OV.Coord3D (1.0, 0.0, 1.0));
mesh2.AddVertex (new OV.Coord3D (1.0, 1.0, 1.0));
mesh2.AddTriangle (new OV.Triangle (0, 1, 2));
model.AddMeshToRootNode (mesh2);
OV.FinalizeModel (model, function () { return new OV.PhongMaterial (); });
let mesh1Bounds = OV.GetBoundingBox (model.GetMesh (0));
assert (OV.CoordIsEqual3D (mesh1Bounds.min, new OV.Coord3D (0.0, 0.0, 0.0)));
assert (OV.CoordIsEqual3D (mesh1Bounds.max, new OV.Coord3D (1.0, 1.0, 0.0)));
let mesh2Bounds = OV.GetBoundingBox (model.GetMesh (1));
assert (OV.CoordIsEqual3D (mesh2Bounds.min, new OV.Coord3D (0.0, 0.0, 1.0)));
assert (OV.CoordIsEqual3D (mesh2Bounds.max, new OV.Coord3D (1.0, 1.0, 1.0)));
let modelBounds = OV.GetBoundingBox (model);
assert (OV.CoordIsEqual3D (modelBounds.min, new OV.Coord3D (0.0, 0.0, 0.0)));
assert (OV.CoordIsEqual3D (modelBounds.max, new OV.Coord3D (1.0, 1.0, 1.0)));
});
it ('Tetrahedron Topology Calculation', function () {
let tetrahedron = testUtils.GetModelWithOneMesh (testUtils.GetTetrahedronMesh ());
let topology = OV.GetTopology (tetrahedron);
assert (OV.IsSolid (tetrahedron));
assert.strictEqual (topology.vertices.length, 4);
assert.strictEqual (topology.edges.length, 6);
assert.strictEqual (topology.triangleEdges.length, 4 * 3);
assert.strictEqual (topology.triangles.length, 4);
for (let i = 0; i < topology.vertices.length; i++) {
assert.strictEqual (topology.vertices[i].edges.length, 3);
assert.strictEqual (topology.vertices[i].triangles.length, 3);
}
for (let i = 0; i < topology.edges.length; i++) {
assert.strictEqual (topology.edges[i].triangles.length, 2);
}
});
it ('Cube Topology Calculation', function () {
let cube = testUtils.GetModelWithOneMesh (OV.GenerateCuboid (null, 1.0, 1.0, 1.0));
assert (OV.IsSolid (cube));
let topology = OV.GetTopology (cube);
assert.strictEqual (topology.vertices.length, 8);
assert.strictEqual (topology.edges.length, 12 + 6);
assert.strictEqual (topology.triangleEdges.length, 6 * 2 * 3);
assert.strictEqual (topology.triangles.length, 6 * 2);
let verticesWith4Triangles = 0;
let verticesWith5Triangles = 0;
let verticesWith4Edges = 0;
let verticesWith5Edges = 0;
for (let i = 0; i < topology.vertices.length; i++) {
if (topology.vertices[i].triangles.length == 4) {
verticesWith4Triangles += 1;
} else if (topology.vertices[i].triangles.length == 5) {
verticesWith5Triangles += 1;
}
if (topology.vertices[i].edges.length == 4) {
verticesWith4Edges += 1;
} else if (topology.vertices[i].edges.length == 5) {
verticesWith5Edges += 1;
}
}
assert.strictEqual (verticesWith4Triangles, 4);
assert.strictEqual (verticesWith5Triangles, 4);
assert.strictEqual (verticesWith4Edges, 4);
assert.strictEqual (verticesWith5Edges, 4);
for (let i = 0; i < topology.edges.length; i++) {
assert.strictEqual (topology.edges[i].triangles.length, 2);
}
});
it ('Two Cubes Connecting in One Vertex Topology Calculation', function () {
const model = testUtils.GetTwoCubesConnectingInOneVertexModel ();
let topology = OV.GetTopology (model);
assert.strictEqual (topology.vertices.length, 15);
assert (OV.IsSolid (model));
});
it ('Two Cubes Connecting in One Edge Topology Calculation', function () {
const model = testUtils.GetTwoCubesConnectingInOneEdgeModel ();
let topology = OV.GetTopology (model);
assert.strictEqual (topology.vertices.length, 14);
assert (OV.IsSolid (model));
});
it ('Two Cubes Connecting in One Face Topology Calculation', function () {
const model = testUtils.GetTwoCubesConnectingInOneFaceModel ();
let topology = OV.GetTopology (model);
assert.strictEqual (topology.vertices.length, 12);
assert (OV.IsSolid (model));
});
});