diff --git a/sandbox/embed_selfhost_fullscreen.html b/sandbox/embed_selfhost_fullscreen.html
index 9dc03bb..d328d69 100644
--- a/sandbox/embed_selfhost_fullscreen.html
+++ b/sandbox/embed_selfhost_fullscreen.html
@@ -29,6 +29,7 @@
+
diff --git a/sandbox/embed_selfhost_multiple.html b/sandbox/embed_selfhost_multiple.html
index 2ea6dfc..6cd79d1 100644
--- a/sandbox/embed_selfhost_multiple.html
+++ b/sandbox/embed_selfhost_multiple.html
@@ -30,6 +30,7 @@
+
diff --git a/sandbox/embed_selfhost_single.html b/sandbox/embed_selfhost_single.html
index f7fd6d8..7bd8929 100644
--- a/sandbox/embed_selfhost_single.html
+++ b/sandbox/embed_selfhost_single.html
@@ -29,6 +29,7 @@
+
diff --git a/sandbox/embed_selfhost_single_scroll.html b/sandbox/embed_selfhost_single_scroll.html
index 55bbb66..55e418a 100644
--- a/sandbox/embed_selfhost_single_scroll.html
+++ b/sandbox/embed_selfhost_single_scroll.html
@@ -29,6 +29,7 @@
+
diff --git a/source/model/enumerator.js b/source/model/enumerator.js
new file mode 100644
index 0000000..64e4710
--- /dev/null
+++ b/source/model/enumerator.js
@@ -0,0 +1,100 @@
+OV.Enumerator = class
+{
+ constructor ()
+ {
+
+ }
+
+ EnumerateVertices (onVertex)
+ {
+
+ }
+
+ EnumerateTriangles (onTriangle)
+ {
+
+ }
+};
+
+OV.MeshEnumerator = class extends OV.Enumerator
+{
+ constructor (mesh)
+ {
+ super ();
+ this.mesh = mesh;
+ }
+
+ EnumerateVertices (onVertex)
+ {
+ for (let vertexIndex = 0; vertexIndex < this.mesh.VertexCount (); vertexIndex++) {
+ let vertex = this.mesh.GetVertex (vertexIndex);
+ onVertex (vertex);
+ }
+ }
+
+ EnumerateTriangles (onTriangle)
+ {
+ for (let triangleIndex = 0; triangleIndex < this.mesh.TriangleCount (); triangleIndex++) {
+ let triangle = this.mesh.GetTriangle (triangleIndex);
+ let v0 = this.mesh.GetVertex (triangle.v0);
+ let v1 = this.mesh.GetVertex (triangle.v1);
+ let v2 = this.mesh.GetVertex (triangle.v2);
+ onTriangle (v0, v1, v2);
+ }
+ }
+};
+
+OV.MeshEnumerator = class extends OV.Enumerator
+{
+ constructor (mesh)
+ {
+ super ();
+ this.mesh = mesh;
+ }
+
+ EnumerateVertices (onVertex)
+ {
+ for (let vertexIndex = 0; vertexIndex < this.mesh.VertexCount (); vertexIndex++) {
+ let vertex = this.mesh.GetVertex (vertexIndex);
+ onVertex (vertex);
+ }
+ }
+
+ EnumerateTriangles (onTriangle)
+ {
+ for (let triangleIndex = 0; triangleIndex < this.mesh.TriangleCount (); triangleIndex++) {
+ let triangle = this.mesh.GetTriangle (triangleIndex);
+ let v0 = this.mesh.GetVertex (triangle.v0);
+ let v1 = this.mesh.GetVertex (triangle.v1);
+ let v2 = this.mesh.GetVertex (triangle.v2);
+ onTriangle (v0, v1, v2);
+ }
+ }
+};
+
+OV.ModelEnumerator = class extends OV.Enumerator
+{
+ constructor (model)
+ {
+ super ();
+ this.model = model;
+ }
+
+ EnumerateVertices (onVertex)
+ {
+ for (let meshIndex = 0; meshIndex < this.model.MeshCount (); meshIndex++) {
+ let mesh = this.model.GetMesh (meshIndex);
+ let enumerator = new OV.MeshEnumerator (mesh);
+ enumerator.EnumerateVertices (onVertex);
+ }
+ }
+
+ EnumerateTriangles (onTriangle)
+ {
+ for (let meshIndex = 0; meshIndex < this.model.MeshCount (); meshIndex++) {
+ let mesh = this.model.GetMesh (meshIndex);
+ let enumerator = new OV.MeshEnumerator (mesh);
+ enumerator.EnumerateTriangles (onTriangle);
+ }
+ }
+};
diff --git a/source/model/modelutils.js b/source/model/modelutils.js
index 9d63b84..5ac4d91 100644
--- a/source/model/modelutils.js
+++ b/source/model/modelutils.js
@@ -174,65 +174,37 @@ OV.EnumerateModelVerticesAndTriangles = function (model, callbacks)
}
};
-OV.EnumerateMeshTriangles = function (mesh, onTriangle)
-{
- for (let triangleIndex = 0; triangleIndex < mesh.TriangleCount (); triangleIndex++) {
- let triangle = mesh.GetTriangle (triangleIndex);
- let v0 = mesh.GetVertex (triangle.v0);
- let v1 = mesh.GetVertex (triangle.v1);
- let v2 = mesh.GetVertex (triangle.v2);
- onTriangle (v0, v1, v2);
- }
-};
-
-OV.EnumerateModelTriangles = function (model, onTriangle)
-{
- for (let meshIndex = 0; meshIndex < model.MeshCount (); meshIndex++) {
- let mesh = model.GetMesh (meshIndex);
- OV.EnumerateMeshTriangles (mesh, onTriangle);
- }
-};
-
OV.EnumerateModelTrianglesWithNormals = function (model, onTriangle)
{
- for (let meshIndex = 0; meshIndex < model.MeshCount (); meshIndex++) {
- let mesh = model.GetMesh (meshIndex);
- for (let triangleIndex = 0; triangleIndex < mesh.TriangleCount (); triangleIndex++) {
- let triangle = mesh.GetTriangle (triangleIndex);
- let v0 = mesh.GetVertex (triangle.v0);
- let v1 = mesh.GetVertex (triangle.v1);
- let v2 = mesh.GetVertex (triangle.v2);
- let normal = OV.CalculateTriangleNormal (v0, v1, v2);
- onTriangle (v0, v1, v2, normal);
- }
- }
+ let enumerator = new OV.ModelEnumerator (model);
+ enumerator.EnumerateTriangles (function (v0, v1, v2) {
+ let normal = OV.CalculateTriangleNormal (v0, v1, v2);
+ onTriangle (v0, v1, v2, normal);
+ });
};
+OV.GetBoundingBox = function (enumerator)
+{
+ let calculator = new OV.BoundingBoxCalculator3D ();
+ enumerator.EnumerateVertices (function (vertex) {
+ calculator.AddPoint (vertex);
+ });
+ return calculator.GetBox ();
+};
OV.GetMeshBoundingBox = function (mesh)
{
- let calculator = new OV.BoundingBoxCalculator3D ();
- for (let i = 0; i < mesh.VertexCount (); i++) {
- let vertex = mesh.GetVertex (i);
- calculator.AddPoint (vertex);
- }
- return calculator.GetBox ();
+ let enumerator = new OV.MeshEnumerator (mesh);
+ return OV.GetBoundingBox (enumerator);
};
OV.GetModelBoundingBox = function (model)
{
- let calculator = new OV.BoundingBoxCalculator3D ();
- for (let i = 0; i < model.MeshCount (); i++) {
- let mesh = model.GetMesh (i);
- for (let j = 0; j < mesh.VertexCount (); j++) {
- let vertex = mesh.GetVertex (j);
- calculator.AddPoint (vertex);
- }
- }
- return calculator.GetBox ();
+ let enumerator = new OV.ModelEnumerator (model);
+ return OV.GetBoundingBox (enumerator);
};
-OV.GetModelTopology = function (model)
+OV.GetTopology = function (enumerator)
{
function GetVertexIndex (vertex, octree, topology)
{
@@ -244,11 +216,11 @@ OV.GetModelTopology = function (model)
return index;
}
- const boundingBox = OV.GetModelBoundingBox (model);
+ let boundingBox = OV.GetBoundingBox (enumerator);
let octree = new OV.Octree (boundingBox);
let topology = new OV.Topology ();
- OV.EnumerateModelTriangles (model, function (v0, v1, v2) {
+ enumerator.EnumerateTriangles (function (v0, v1, v2) {
let v0Index = GetVertexIndex (v0, octree, topology);
let v1Index = GetVertexIndex (v1, octree, topology);
let v2Index = GetVertexIndex (v2, octree, topology);
@@ -257,7 +229,19 @@ OV.GetModelTopology = function (model)
return topology;
};
-OV.IsModelSolid = function (model)
+OV.GetMeshTopology = function (mesh)
+{
+ let enumerator = new OV.MeshEnumerator (mesh);
+ return OV.GetTopology (enumerator);
+};
+
+OV.GetModelTopology = function (model)
+{
+ let enumerator = new OV.ModelEnumerator (model);
+ return OV.GetTopology (enumerator);
+};
+
+OV.IsSolid = function (enumerator)
{
function GetEdgeOrientationInTriangle (topology, triangleIndex, edgeIndex)
{
@@ -277,7 +261,7 @@ OV.IsModelSolid = function (model)
return null;
}
- const topology = OV.GetModelTopology (model);
+ const topology = OV.GetTopology (enumerator);
for (let edgeIndex = 0; edgeIndex < topology.edges.length; edgeIndex++) {
const edge = topology.edges[edgeIndex];
if (edge.triangles.length !== 2) {
@@ -291,3 +275,15 @@ OV.IsModelSolid = function (model)
}
return true;
};
+
+OV.IsMeshSolid = function (mesh)
+{
+ let enumerator = new OV.MeshEnumerator (mesh);
+ return OV.IsSolid (enumerator);
+};
+
+OV.IsModelSolid = function (model)
+{
+ let enumerator = new OV.ModelEnumerator (model);
+ return OV.IsSolid (enumerator);
+};
diff --git a/source/model/quantities.js b/source/model/quantities.js
index dee1297..e914364 100644
--- a/source/model/quantities.js
+++ b/source/model/quantities.js
@@ -16,23 +16,47 @@ OV.GetTetrahedronSignedVolume = function (v0, v1, v2)
return OV.DotVector3D (v0, OV.CrossVector3D (v1, v2)) / 6.0;
};
-OV.CalculateModelVolume = function (model)
+OV.CalculateVolume = function (enumerator)
{
- if (!OV.IsModelSolid (model)) {
+ if (!OV.IsSolid (enumerator)) {
return null;
}
let volume = 0.0;
- OV.EnumerateModelTriangles (model, function (v0, v1, v2) {
+ enumerator.EnumerateTriangles (function (v0, v1, v2) {
volume += OV.GetTetrahedronSignedVolume (v0, v1, v2);
});
return volume;
};
-OV.CalculateModelSurfaceArea = function (model)
+OV.CalculateMeshVolume = function (mesh)
+{
+ let enumerator = new OV.MeshEnumerator (mesh);
+ return OV.CalculateVolume (enumerator);
+};
+
+OV.CalculateModelVolume = function (model)
+{
+ let enumerator = new OV.ModelEnumerator (model);
+ return OV.CalculateVolume (enumerator);
+};
+
+OV.CalculateSurfaceArea = function (enumerator)
{
let surface = 0.0;
- OV.EnumerateModelTriangles (model, function (v0, v1, v2) {
+ enumerator.EnumerateTriangles (function (v0, v1, v2) {
surface += OV.GetTriangleArea (v0, v1, v2);
});
return surface;
};
+
+OV.CalculateMeshSurfaceArea = function (mesh)
+{
+ let enumerator = new OV.MeshEnumerator (mesh);
+ return OV.CalculateSurfaceArea (enumerator);
+};
+
+OV.CalculateModelSurfaceArea = function (model)
+{
+ let enumerator = new OV.ModelEnumerator (model);
+ return OV.CalculateSurfaceArea (enumerator);
+};
diff --git a/test/tests/quantities_test.js b/test/tests/quantities_test.js
index bfb976b..cacf156 100644
--- a/test/tests/quantities_test.js
+++ b/test/tests/quantities_test.js
@@ -3,67 +3,72 @@ var testUtils = require ('../utils/testutils.js');
describe ('Quantities', function () {
it ('Cube Volume Calculation', function () {
- const model = testUtils.GetModelWithOneMesh (testUtils.GetCubeMesh ());
- const volume = OV.CalculateModelVolume (model);
- assert (OV.IsEqual (volume, 1.0));
+ const mesh = testUtils.GetCubeMesh ();
+ const model = testUtils.GetModelWithOneMesh (mesh);
+ assert (OV.IsEqual (OV.CalculateMeshVolume (mesh), 1.0));
+ assert (OV.IsEqual (OV.CalculateModelVolume (model), 1.0));
});
it ('Cube with Missing Face Volume Calculation', function () {
- const model = testUtils.GetModelWithOneMesh (testUtils.GetCubeWithOneMissingFaceMesh ());
- const volume = OV.CalculateModelVolume (model);
- assert.strictEqual (volume, null);
+ const mesh = testUtils.GetCubeWithOneMissingFaceMesh ();
+ const model = testUtils.GetModelWithOneMesh (mesh);
+ assert.strictEqual (OV.CalculateModelVolume (model), null);
});
it ('Cube with Wrongly Oriented Triangle Volume Calculation', function () {
- var cube = new OV.Mesh ();
- cube.AddVertex (new OV.Coord3D (0.0, 0.0, 0.0));
- cube.AddVertex (new OV.Coord3D (1.0, 0.0, 0.0));
- cube.AddVertex (new OV.Coord3D (1.0, 1.0, 0.0));
- cube.AddVertex (new OV.Coord3D (0.0, 1.0, 0.0));
- cube.AddVertex (new OV.Coord3D (0.0, 0.0, 1.0));
- cube.AddVertex (new OV.Coord3D (1.0, 0.0, 1.0));
- cube.AddVertex (new OV.Coord3D (1.0, 1.0, 1.0));
- cube.AddVertex (new OV.Coord3D (0.0, 1.0, 1.0));
- cube.AddTriangle (new OV.Triangle (0, 1, 5));
- cube.AddTriangle (new OV.Triangle (0, 5, 4));
- cube.AddTriangle (new OV.Triangle (1, 2, 6));
- cube.AddTriangle (new OV.Triangle (1, 6, 5));
- cube.AddTriangle (new OV.Triangle (2, 3, 7));
- cube.AddTriangle (new OV.Triangle (2, 7, 6));
- cube.AddTriangle (new OV.Triangle (3, 0, 4));
- cube.AddTriangle (new OV.Triangle (3, 4, 7));
- cube.AddTriangle (new OV.Triangle (0, 3, 2));
- cube.AddTriangle (new OV.Triangle (0, 2, 1));
- cube.AddTriangle (new OV.Triangle (4, 5, 6));
- cube.AddTriangle (new OV.Triangle (4, 7, 6));
- const model = testUtils.GetModelWithOneMesh (cube);
- const volume = OV.CalculateModelVolume (model);
- assert.strictEqual (volume, null);
+ var mesh = new OV.Mesh ();
+ mesh.AddVertex (new OV.Coord3D (0.0, 0.0, 0.0));
+ mesh.AddVertex (new OV.Coord3D (1.0, 0.0, 0.0));
+ mesh.AddVertex (new OV.Coord3D (1.0, 1.0, 0.0));
+ mesh.AddVertex (new OV.Coord3D (0.0, 1.0, 0.0));
+ mesh.AddVertex (new OV.Coord3D (0.0, 0.0, 1.0));
+ mesh.AddVertex (new OV.Coord3D (1.0, 0.0, 1.0));
+ mesh.AddVertex (new OV.Coord3D (1.0, 1.0, 1.0));
+ mesh.AddVertex (new OV.Coord3D (0.0, 1.0, 1.0));
+ mesh.AddTriangle (new OV.Triangle (0, 1, 5));
+ mesh.AddTriangle (new OV.Triangle (0, 5, 4));
+ mesh.AddTriangle (new OV.Triangle (1, 2, 6));
+ mesh.AddTriangle (new OV.Triangle (1, 6, 5));
+ mesh.AddTriangle (new OV.Triangle (2, 3, 7));
+ mesh.AddTriangle (new OV.Triangle (2, 7, 6));
+ mesh.AddTriangle (new OV.Triangle (3, 0, 4));
+ mesh.AddTriangle (new OV.Triangle (3, 4, 7));
+ mesh.AddTriangle (new OV.Triangle (0, 3, 2));
+ mesh.AddTriangle (new OV.Triangle (0, 2, 1));
+ mesh.AddTriangle (new OV.Triangle (4, 5, 6));
+ mesh.AddTriangle (new OV.Triangle (4, 7, 6));
+ const model = testUtils.GetModelWithOneMesh (mesh);
+ assert.strictEqual (OV.CalculateMeshVolume (mesh), null);
+ assert.strictEqual (OV.CalculateModelVolume (model), null);
});
it ('Cube Surface Area Calculation', function () {
- const model = testUtils.GetModelWithOneMesh (testUtils.GetCubeMesh ());
- const surface = OV.CalculateModelSurfaceArea (model);
- assert (OV.IsEqual (surface, 6.0));
+ const mesh = testUtils.GetCubeMesh ();
+ const model = testUtils.GetModelWithOneMesh (mesh);
+ assert (OV.IsEqual (OV.CalculateMeshSurfaceArea (mesh), 6.0));
+ assert (OV.IsEqual (OV.CalculateModelSurfaceArea (model), 6.0));
});
it ('Cube with Missing Face Surface Area Calculation', function () {
- const model = testUtils.GetModelWithOneMesh (testUtils.GetCubeWithOneMissingFaceMesh ());
- const surface = OV.CalculateModelSurfaceArea (model);
- assert (OV.IsEqual (surface, 5.0));
+ const mesh = testUtils.GetCubeWithOneMissingFaceMesh ();
+ const model = testUtils.GetModelWithOneMesh (mesh);
+ assert (OV.IsEqual (OV.CalculateMeshSurfaceArea (mesh), 5.0));
+ assert (OV.IsEqual (OV.CalculateModelSurfaceArea (model), 5.0));
});
it ('Tetrahedron Volume Calculation', function () {
let edgeLength = OV.CoordDistance3D (new OV.Coord3D (1.0, 1.0, 1.0), new OV.Coord3D (-1.0, -1.0, 1.0));
- const model = testUtils.GetModelWithOneMesh (testUtils.GetTetrahedronMesh ());
- const volume = OV.CalculateModelVolume (model);
- assert (OV.IsEqual (volume, Math.pow (edgeLength, 3.0) / (6.0 * Math.sqrt (2))));
+ const mesh = testUtils.GetTetrahedronMesh ();
+ const model = testUtils.GetModelWithOneMesh (mesh);
+ assert (OV.IsEqual (OV.CalculateMeshVolume (mesh), Math.pow (edgeLength, 3.0) / (6.0 * Math.sqrt (2))));
+ assert (OV.IsEqual (OV.CalculateModelVolume (model), Math.pow (edgeLength, 3.0) / (6.0 * Math.sqrt (2))));
});
it ('Tetrahedron Surface Area Calculation', function () {
let edgeLength = OV.CoordDistance3D (new OV.Coord3D (1.0, 1.0, 1.0), new OV.Coord3D (-1.0, -1.0, 1.0));
- const model = testUtils.GetModelWithOneMesh (testUtils.GetTetrahedronMesh ());
- const surface = OV.CalculateModelSurfaceArea (model);
- assert (OV.IsEqual (surface, Math.sqrt (3) * Math.pow (edgeLength, 2.0)));
+ const mesh = testUtils.GetTetrahedronMesh ();
+ const model = testUtils.GetModelWithOneMesh (mesh);
+ assert (OV.IsEqual (OV.CalculateMeshSurfaceArea (mesh), Math.sqrt (3) * Math.pow (edgeLength, 2.0)));
+ assert (OV.IsEqual (OV.CalculateModelSurfaceArea (model), Math.sqrt (3) * Math.pow (edgeLength, 2.0)));
});
});
diff --git a/tools/config.json b/tools/config.json
index 7322743..cda65a2 100644
--- a/tools/config.json
+++ b/tools/config.json
@@ -25,6 +25,7 @@
"source/model/meshbuffer.js",
"source/model/model.js",
"source/model/topology.js",
+ "source/model/enumerator.js",
"source/model/modelutils.js",
"source/model/modelfinalization.js",
"source/model/quantities.js",
diff --git a/website/embed.html b/website/embed.html
index 02704e0..1fcf68b 100644
--- a/website/embed.html
+++ b/website/embed.html
@@ -38,6 +38,7 @@
+
diff --git a/website/index.html b/website/index.html
index 00cbde8..a5ec717 100644
--- a/website/index.html
+++ b/website/index.html
@@ -38,6 +38,7 @@
+