diff --git a/sandbox/embed_selfhost_fullscreen.html b/sandbox/embed_selfhost_fullscreen.html
index 79ce964..d320f04 100644
--- a/sandbox/embed_selfhost_fullscreen.html
+++ b/sandbox/embed_selfhost_fullscreen.html
@@ -34,6 +34,7 @@
+
diff --git a/sandbox/embed_selfhost_multiple.html b/sandbox/embed_selfhost_multiple.html
index 7bb646e..503bdcc 100644
--- a/sandbox/embed_selfhost_multiple.html
+++ b/sandbox/embed_selfhost_multiple.html
@@ -35,6 +35,7 @@
+
diff --git a/sandbox/embed_selfhost_single.html b/sandbox/embed_selfhost_single.html
index f6a0b73..516c86e 100644
--- a/sandbox/embed_selfhost_single.html
+++ b/sandbox/embed_selfhost_single.html
@@ -34,6 +34,7 @@
+
diff --git a/sandbox/embed_selfhost_single_scroll.html b/sandbox/embed_selfhost_single_scroll.html
index 3616919..98bdb2c 100644
--- a/sandbox/embed_selfhost_single_scroll.html
+++ b/sandbox/embed_selfhost_single_scroll.html
@@ -34,6 +34,7 @@
+
diff --git a/source/model/generator.js b/source/model/generator.js
new file mode 100644
index 0000000..a92279d
--- /dev/null
+++ b/source/model/generator.js
@@ -0,0 +1,74 @@
+OV.GeneratorParams = class
+{
+ constructor ()
+ {
+ this.material = null;
+ this.transformation = null;
+ }
+};
+
+OV.Generator = class
+{
+ constructor (params)
+ {
+ this.params = params || new OV.GeneratorParams ();
+ this.mesh = new OV.Mesh ();
+ }
+
+ GetMesh ()
+ {
+ return this.mesh;
+ }
+
+ AddVertex (x, y, z)
+ {
+ let coord = new OV.Coord3D (x, y, z);
+ if (this.params.transformation !== null) {
+ coord = this.params.transformation.TransformCoord3D (coord);
+ }
+ return this.mesh.AddVertex (coord);
+ }
+
+ AddTriangle (v0, v1, v2)
+ {
+ let triangle = new OV.Triangle (v0, v1, v2);
+ if (this.params.material !== null) {
+ triangle.SetMaterial (this.params.material);
+ }
+ return this.mesh.AddTriangle (triangle);
+ }
+
+ AddConvexPolygon (vertices)
+ {
+ for (let vertexIndex = 0; vertexIndex < vertices.length - 2; vertexIndex++) {
+ this.AddTriangle (
+ vertices[0],
+ vertices[vertexIndex + 1],
+ vertices[vertexIndex + 2]
+ );
+ }
+ }
+};
+
+OV.GenerateCuboid = function (genParams, xSize, ySize, zSize)
+{
+ let generator = new OV.Generator (genParams);
+
+ generator.AddVertex (0.0, 0.0, 0.0);
+ generator.AddVertex (xSize, 0.0, 0.0);
+ generator.AddVertex (xSize, ySize, 0.0);
+ generator.AddVertex (0.0, ySize, 0.0);
+ generator.AddVertex (0.0, 0.0, zSize);
+ generator.AddVertex (xSize, 0.0, zSize);
+ generator.AddVertex (xSize, ySize, zSize);
+ generator.AddVertex (0.0, ySize, zSize);
+
+ generator.AddConvexPolygon ([0, 3, 2, 1]);
+ generator.AddConvexPolygon ([0, 1, 5, 4]);
+ generator.AddConvexPolygon ([1, 2, 6, 5]);
+ generator.AddConvexPolygon ([2, 3, 7, 6]);
+ generator.AddConvexPolygon ([3, 0, 4, 7]);
+ generator.AddConvexPolygon ([4, 5, 6, 7]);
+
+ return generator.GetMesh ();
+};
diff --git a/test/tests/generator_test.js b/test/tests/generator_test.js
new file mode 100644
index 0000000..b454572
--- /dev/null
+++ b/test/tests/generator_test.js
@@ -0,0 +1,9 @@
+var assert = require ('assert');
+
+describe ('Generator', function () {
+ it ('Cuboid', function () {
+ const cuboid = OV.GenerateCuboid (null, 1.0, 1.0, 1.0);
+ assert (OV.IsSolid (cuboid));
+ assert (OV.IsEqual (OV.CalculateVolume (cuboid), 1.0));
+ });
+});
diff --git a/tools/config.json b/tools/config.json
index d8db6e1..ae2ed76 100644
--- a/tools/config.json
+++ b/tools/config.json
@@ -30,6 +30,7 @@
"source/model/modelutils.js",
"source/model/modelfinalization.js",
"source/model/quantities.js",
+ "source/model/generator.js",
"source/import/importerutils.js",
"source/import/importerbase.js",
"source/import/importerobj.js",
diff --git a/website/embed.html b/website/embed.html
index f0f950a..f2277e2 100644
--- a/website/embed.html
+++ b/website/embed.html
@@ -43,6 +43,7 @@
+
diff --git a/website/index.html b/website/index.html
index 70b1935..29cc5dc 100644
--- a/website/index.html
+++ b/website/index.html
@@ -43,6 +43,7 @@
+