var assert = require ('assert'); var testUtils = require ('../utils/testutils.js'); describe ('Model Utils', function () { it ('Create Merged Model', 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.AddMesh (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.AddMesh (mesh2); OV.FinalizeModel (model, function () { return new OV.Material (); }); assert.deepStrictEqual (testUtils.ModelToObject (model), { name : '', materials : [ { name : '' } ], meshes : [ { name : '', triangles : [ { vertices : [0, 0, 0, 1, 0, 0, 1, 1, 0], normals : [0, 0, 1, 0, 0, 1, 0, 0, 1], uvs : [], mat : 0 } ] }, { name : '', triangles : [ { vertices : [0, 0, 1, 1, 0, 1, 1, 1, 1], normals : [0, 0, 1, 0, 0, 1, 0, 0, 1], uvs : [], mat : 0 } ] } ] }); var mergedModel = OV.CreateMergedModel (model); assert.deepStrictEqual (testUtils.ModelToObject (mergedModel), { name : '', materials : [ { name : '' } ], meshes : [ { name : '', triangles : [ { vertices : [0, 0, 0, 1, 0, 0, 1, 1, 0], normals : [0, 0, 1, 0, 0, 1, 0, 0, 1], uvs : [], mat : 0 }, { vertices : [0, 0, 1, 1, 0, 1, 1, 1, 1], normals : [0, 0, 1, 0, 0, 1, 0, 0, 1], uvs : [], mat : 0 } ] } ] }); }); it ('Mesh Bounding Box', function () { var cube = testUtils.GetCubeMesh (); let cubeBounds = OV.GetMeshBoundingBox (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 ('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.AddMesh (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.AddMesh (mesh2); OV.FinalizeModel (model, function () { return new OV.Material (); }); let mesh1Bounds = OV.GetMeshBoundingBox (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.GetMeshBoundingBox (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))); }); it ('Mesh Volume Calculation', function () { function GetTriangleArea (v0, v1, v2) { let a = OV.CoordDistance3D (v0, v1); let b = OV.CoordDistance3D (v1, v2); let c = OV.CoordDistance3D (v0, v2); let s = (a + b + c) / 2.0; let areaSquare = s * (s - a) * (s - b) * (s - c); if (areaSquare < 0.0) { return 0.0; } return Math.sqrt (areaSquare); } var model = testUtils.GetCubeModel (); let surface = 0.0; let volume = 0.0; for (let i = 0; i < model.MeshCount (); i++) { let mesh = model.GetMesh (i); for (j = 0; j < mesh.TriangleCount (); j++) { let triangle = mesh.GetTriangle (j); let v0 = mesh.GetVertex (triangle.v0); let v1 = mesh.GetVertex (triangle.v1); let v2 = mesh.GetVertex (triangle.v2); surface += GetTriangleArea (v0, v1, v2); let signedVolume = OV.DotVector3D (v0, OV.CrossVector3D (v1, v2)) / 6.0; volume += signedVolume; } } assert (OV.IsEqual (volume, 1.0)); assert (OV.IsEqual (surface, 6.0)); }); });