diff --git a/source/model/modelutils.js b/source/model/modelutils.js index 61789b2..a9e589c 100644 --- a/source/model/modelutils.js +++ b/source/model/modelutils.js @@ -51,24 +51,6 @@ OV.FlipMeshTrianglesOrientation = function (mesh) } }; -OV.GetMeshBoundingBox = function (mesh) -{ - let min = new OV.Coord3D (Infinity, Infinity, Infinity); - let max = new OV.Coord3D (-Infinity, -Infinity, -Infinity); - - for (let i = 0; i < mesh.VertexCount (); i++) { - let vertex = mesh.GetVertex (i); - min.x = Math.min (min.x, vertex.x); - min.y = Math.min (min.y, vertex.y); - min.z = Math.min (min.z, vertex.z); - max.x = Math.max (max.x, vertex.x); - max.y = Math.max (max.y, vertex.y); - max.z = Math.max (max.z, vertex.z); - } - - return [min, max]; -}; - OV.IsModelEmpty = function (model) { for (let i = 0; i < model.MeshCount (); i++) { @@ -220,3 +202,23 @@ OV.EnumerateModelTrianglesWithNormals = function (model, onTriangle) } } }; + +OV.GetMeshBoundingBox = function (mesh) +{ + let box = new OV.Box3D ( + new OV.Coord3D (Infinity, Infinity, Infinity), + new OV.Coord3D (-Infinity, -Infinity, -Infinity) + ); + + for (let i = 0; i < mesh.VertexCount (); i++) { + let vertex = mesh.GetVertex (i); + box.min.x = Math.min (box.min.x, vertex.x); + box.min.y = Math.min (box.min.y, vertex.y); + box.min.z = Math.min (box.min.z, vertex.z); + box.max.x = Math.max (box.max.x, vertex.x); + box.max.y = Math.max (box.max.y, vertex.y); + box.max.z = Math.max (box.max.z, vertex.z); + } + + return box; +}; diff --git a/test/tests/modelutils_test.js b/test/tests/modelutils_test.js index 3c33bd1..bd11e51 100644 --- a/test/tests/modelutils_test.js +++ b/test/tests/modelutils_test.js @@ -79,6 +79,34 @@ describe ('Model Utils', function () { }); }); + it ('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) { diff --git a/test/utils/testutils.js b/test/utils/testutils.js index 77b3ae0..5eca5a5 100644 --- a/test/utils/testutils.js +++ b/test/utils/testutils.js @@ -127,8 +127,8 @@ module.exports = uvCount : mesh.TextureUVCount (), triangleCount : mesh.TriangleCount (), boundingBox : { - min : [boundingBox[0].x, boundingBox[0].y, boundingBox[0].z], - max : [boundingBox[1].x, boundingBox[1].y, boundingBox[1].z] + min : [boundingBox.min.x, boundingBox.min.y, boundingBox.min.z], + max : [boundingBox.max.x, boundingBox.max.y, boundingBox.max.z] } }; obj.meshes.push (meshObj);