@openglobus/og 0.13.7 → 0.13.10

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (106) hide show
  1. package/README.md +1 -1
  2. package/css/og.css +388 -129
  3. package/dist/@openglobus/og.css +1 -1
  4. package/dist/@openglobus/og.esm.js +2 -2
  5. package/dist/@openglobus/og.esm.js.map +1 -1
  6. package/dist/@openglobus/og.umd.js +2 -2
  7. package/dist/@openglobus/og.umd.js.map +1 -1
  8. package/package.json +20 -19
  9. package/src/og/Globe.js +15 -16
  10. package/src/og/Object3d.js +417 -0
  11. package/src/og/arial.js +1705 -1703
  12. package/src/og/camera/Camera.js +640 -640
  13. package/src/og/control/EarthCoordinates.js +1 -1
  14. package/src/og/control/GeoImageDragControl.js +102 -75
  15. package/src/og/control/LayerAnimation.js +383 -0
  16. package/src/og/control/LayerSwitcher.js +506 -159
  17. package/src/og/control/Lighting.js +27 -27
  18. package/src/og/control/MouseNavigation.js +460 -460
  19. package/src/og/control/RulerSwitcher.js +69 -0
  20. package/src/og/control/Sun.js +170 -170
  21. package/src/og/control/UIhelpers.js +146 -0
  22. package/src/og/control/ZoomControl.js +0 -2
  23. package/src/og/control/index.js +5 -1
  24. package/src/og/control/ruler/Ruler.js +43 -0
  25. package/src/og/control/ruler/RulerScene.js +374 -0
  26. package/src/og/control/visibleExtent/Segment.js +3 -5
  27. package/src/og/ellipsoid/Ellipsoid.js +19 -0
  28. package/src/og/ellipsoid/wgs84.js +1 -1
  29. package/src/og/entity/Entity.js +1 -1
  30. package/src/og/entity/GeoObject.js +1 -1
  31. package/src/og/entity/LabelHandler.js +6 -2
  32. package/src/og/entity/LabelWorker.js +38 -53
  33. package/src/og/layer/BaseGeoImage.js +347 -312
  34. package/src/og/layer/CanvasTiles.js +312 -290
  35. package/src/og/layer/GeoImage.js +222 -214
  36. package/src/og/layer/GeoVideo.js +291 -291
  37. package/src/og/layer/Layer.js +94 -70
  38. package/src/og/layer/Material.js +109 -109
  39. package/src/og/layer/Vector.js +81 -14
  40. package/src/og/layer/XYZ.js +23 -11
  41. package/src/og/light/LightSource.js +364 -363
  42. package/src/og/math/Vec3.js +1 -1
  43. package/src/og/math.js +6 -6
  44. package/src/og/quadTree/Node.js +8 -6
  45. package/src/og/renderer/Renderer.js +2 -3
  46. package/src/og/res/images.js +0 -2
  47. package/src/og/scene/Planet.js +106 -44
  48. package/src/og/segment/Segment.js +34 -64
  49. package/src/og/segment/Slice.js +1 -1
  50. package/src/og/shaders/drawnode.js +1 -1
  51. package/src/og/shaders/label.js +30 -42
  52. package/src/og/terrain/GlobusTerrain.js +31 -20
  53. package/src/og/terrain/MapboxTerrain.js +1 -1
  54. package/src/og/utils/BaseWorker.js +46 -0
  55. package/src/og/utils/FontAtlas.js +1 -2
  56. package/src/og/utils/GeoImageCreator.js +164 -161
  57. package/src/og/utils/Loader.js +187 -153
  58. package/src/og/utils/NormalMapCreator.js +403 -412
  59. package/src/og/utils/PlainSegmentWorker.js +29 -55
  60. package/src/og/utils/TerrainWorker.js +572 -589
  61. package/src/og/utils/VectorTileCreator.js +1 -1
  62. package/src/og/utils/functionComposition.js +13 -0
  63. package/src/og/webgl/Handler.js +42 -41
  64. package/src/og/webgl/ProgramController.js +143 -143
  65. package/types/Object3d.d.ts +22 -0
  66. package/types/arial.d.ts +1 -0
  67. package/types/camera/PlanetCamera.d.ts +4 -0
  68. package/types/control/GeoImageDragControl.d.ts +2 -0
  69. package/types/control/LayerAnimation.d.ts +73 -0
  70. package/types/control/LayerSwitcher.d.ts +55 -11
  71. package/types/control/MouseNavigation.d.ts +1 -0
  72. package/types/control/MouseWheelZoomControl.d.ts +1 -0
  73. package/types/control/Sun.d.ts +2 -1
  74. package/types/control/TouchNavigation.d.ts +1 -0
  75. package/types/control/UIhelpers.d.ts +13 -0
  76. package/types/control/index.d.ts +3 -1
  77. package/types/control/ruler/Ruler.d.ts +13 -0
  78. package/types/control/ruler/RulerScene.d.ts +48 -0
  79. package/types/ellipsoid/Ellipsoid.d.ts +8 -0
  80. package/types/entity/LabelHandler.d.ts +2 -0
  81. package/types/entity/LabelWorker.d.ts +5 -7
  82. package/types/layer/BaseGeoImage.d.ts +9 -1
  83. package/types/layer/CanvasTiles.d.ts +5 -1
  84. package/types/layer/GeoImage.d.ts +1 -0
  85. package/types/layer/GeoTexture2d.d.ts +1 -0
  86. package/types/layer/Layer.d.ts +28 -32
  87. package/types/layer/Vector.d.ts +9 -0
  88. package/types/layer/WMS.d.ts +1 -0
  89. package/types/layer/XYZ.d.ts +8 -5
  90. package/types/math.d.ts +2 -2
  91. package/types/quadTree/EntityCollectionNode.d.ts +7 -0
  92. package/types/quadTree/Node.d.ts +1 -2
  93. package/types/renderer/Renderer.d.ts +1 -1
  94. package/types/renderer/RendererEvents.d.ts +16 -0
  95. package/types/res/images.d.ts +0 -1
  96. package/types/scene/Planet.d.ts +21 -6
  97. package/types/segment/SegmentLonLat.d.ts +2 -0
  98. package/types/terrain/BilTerrain.d.ts +6 -0
  99. package/types/terrain/GlobusTerrain.d.ts +7 -0
  100. package/types/terrain/MapboxTerrain.d.ts +8 -0
  101. package/types/utils/BaseWorker.d.ts +14 -0
  102. package/types/utils/Loader.d.ts +4 -1
  103. package/types/utils/PlainSegmentWorker.d.ts +4 -6
  104. package/types/utils/TerrainWorker.d.ts +4 -6
  105. package/types/utils/functionComposition.d.ts +5 -0
  106. package/types/webgl/Handler.d.ts +4 -1
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@openglobus/og",
3
- "version": "0.13.7",
4
- "description": "[OpenGlobus](http://www.openglobus.org/) is a javascript library designed to display interactive 3d maps and planets with map tiles, imagery and vector data, markers and 3d objects. It uses the WebGL technology, open source and completely free.",
3
+ "version": "0.13.10",
4
+ "description": "[OpenGlobus](https://www.openglobus.org/) is a javascript library designed to display interactive 3d maps and planets with map tiles, imagery and vector data, markers and 3d objects. It uses the WebGL technology, open source and completely free.",
5
5
  "directories": {
6
6
  "example": "./sandbox"
7
7
  },
@@ -9,16 +9,17 @@
9
9
  "style": "./css/og.css",
10
10
  "types": "./types/index.d.ts",
11
11
  "scripts": {
12
- "api": "jsdoc -t ./jsdoc -r ./src/ -c ./jsdoc/conf.json -d ./api",
12
+ "api": "jsdoc -r ./src/ -c ./jsdoc.conf.json -d ./api",
13
13
  "serve": "ws",
14
14
  "build": "rollup -c",
15
15
  "webgl": "rollup -c --environment entry:webgl",
16
16
  "core": "rollup -c --environment entry:core",
17
- "test": "jest --env=jsdom",
17
+ "test": "jest --env=jsdom --runInBand --ci --coverage=false",
18
18
  "test_watch": "jest --env=jsdom --watch",
19
19
  "lint": "eslint -c ./.eslintrc.js src/og",
20
20
  "generate_types": "rm -rf types; tsc src/**/*.js --declaration --allowJs --emitDeclarationOnly --outDir types",
21
- "compile_js_as_ts": "tsc src/og/index.js --AllowJs --checkJs --outDir dist/@openglobus/src/"
21
+ "compile_js_as_ts": "tsc src/og/index.js --AllowJs --checkJs --outDir dist/@openglobus/src/",
22
+ "font": "node ./fonts/index.js"
22
23
  },
23
24
  "repository": {
24
25
  "type": "git",
@@ -30,7 +31,7 @@
30
31
  "url": "https://github.com/openglobus/openglobus/issues",
31
32
  "email": "mgevlich@gmail.com"
32
33
  },
33
- "homepage": "http://www.openglobus.org",
34
+ "homepage": "https://www.openglobus.org",
34
35
  "exports": {
35
36
  ".": "./src/og/index.js",
36
37
  "./layer": "./src/og/layer/index.js",
@@ -43,24 +44,24 @@
43
44
  "./css/og.css": "./css/og.css"
44
45
  },
45
46
  "devDependencies": {
46
- "@babel/preset-env": "^7.16.11",
47
+ "@babel/preset-env": "^7.18.9",
47
48
  "@rollup/plugin-json": "^4.1.0",
48
- "@types/jest": "^27.4.0",
49
- "eslint": "^8.7.0",
49
+ "@types/jest": "^28.1.6",
50
+ "eslint": "^8.20.0",
50
51
  "jaguarjs-jsdoc": "^1.1.0",
51
- "jest": "^27.4.7",
52
- "jest-canvas-mock": "^2.3.1",
52
+ "jest": "^28.1.3",
53
+ "jest-canvas-mock": "^2.4.0",
54
+ "jest-environment-jsdom": "^28.1.3",
53
55
  "jest-webgl-canvas-mock": "^0.2.3",
54
- "jsdoc": "^3.6.10",
55
- "lint-staged": "^12.3.1",
56
- "local-web-server": "^5.1.1",
57
- "msdf-bmfont-xml": "^2.5.4",
58
- "postcss": "^8.4.5",
59
- "prettier": "^2.5.1",
60
- "rollup": "^2.66.1",
56
+ "jsdoc": "^3.6.11",
57
+ "lint-staged": "^13.0.3",
58
+ "local-web-server": "^5.2.1",
59
+ "postcss": "^8.4.14",
60
+ "prettier": "^2.7.1",
61
+ "rollup": "^2.77.1",
61
62
  "rollup-plugin-postcss": "^4.0.2",
62
63
  "rollup-plugin-terser": "^7.0.2",
63
- "typescript": "^4.5.5"
64
+ "typescript": "^4.7.4"
64
65
  },
65
66
  "lint-staged": {
66
67
  "*.{js,ts}": [
package/src/og/Globe.js CHANGED
@@ -69,7 +69,7 @@ const PLANET_NAME_PREFIX = "globus_planet_";
69
69
  * @param {Number} [options.maxEqualZoomAltitude=15000000.0] - Maximal altitude since segments on the screen bacame the same zoom level
70
70
  * @param {Number} [options.minEqualZoomAltitude=10000.0] - Minimal altitude since segments on the screen bacame the same zoom level
71
71
  * @param {Number} [options.minEqualZoomCameraSlope=0.8] - Minimal camera slope above te globe where segments on the screen bacame the same zoom level
72
- * @param {Number} [options.loadingBatchSize=12] -
72
+ * @param {Number} [options.loadingBatchSize=12] -
73
73
  */
74
74
 
75
75
  class Globe {
@@ -103,15 +103,6 @@ class Globe {
103
103
  this.div.appendChild(this._canvas);
104
104
  this.div.classList.add("ogViewport");
105
105
 
106
- document.addEventListener("visibilitychange", () => {
107
- if (document.visibilityState === 'visible') {
108
- this.renderer.handler.start();
109
- this.renderer && this.renderer.resize();
110
- } else {
111
- this.renderer.handler.stop();
112
- }
113
- });
114
-
115
106
  function _disableWheel(e) {
116
107
  e.preventDefault();
117
108
  }
@@ -137,12 +128,13 @@ class Globe {
137
128
  context: {
138
129
  alpha: false,
139
130
  antialias: false,
140
- powerPreference: "high-performance"
131
+ powerPreference: "high-performance",
132
+ premultipliedAlpha: true
141
133
  }
142
134
  }), {
143
- autoActivate: false,
144
- backgroundColor: createColorRGB(options.backgroundColor, new Vec3(115 / 255, 203 / 255, 249 / 255))
145
- }
135
+ autoActivate: false,
136
+ backgroundColor: createColorRGB(options.backgroundColor, new Vec3(115 / 255, 203 / 255, 249 / 255))
137
+ }
146
138
  );
147
139
  this.renderer.initialize();
148
140
  this.renderer.div = this.div;
@@ -190,9 +182,16 @@ class Globe {
190
182
  });
191
183
  }
192
184
 
193
- // Attach terrain provider
185
+ // Attach terrain provider (can be one object or array)
194
186
  if (options.terrain) {
195
- this.planet.setTerrain(options.terrain);
187
+ if (Array.isArray(options.terrain)) {
188
+ this.planet.setTerrain(options.terrain[0]); // If array get the terrain from 1st element
189
+ this.planet._terrainPool = options.terrain;
190
+ } else {
191
+ this.planet.setTerrain(options.terrain);
192
+ this.planet._terrainPool = [options.terrain];
193
+ }
194
+
196
195
  } else {
197
196
  this.planet.setTerrain(new EmptyTerrain());
198
197
  }
@@ -0,0 +1,417 @@
1
+ /* eslint-disable no-param-reassign */
2
+ 'use strict';
3
+
4
+ import { htmlColorToFloat32Array } from './utils/shared.js';
5
+ import { Vec3 } from './math/Vec3.js';
6
+
7
+ function getColor(color) {
8
+ if (color instanceof Array) {
9
+ return color;
10
+ } else if (typeof color === 'string') {
11
+ return htmlColorToFloat32Array(color);
12
+ }
13
+ return [1.0, 1.0, 1.0, 1.0];
14
+ }
15
+
16
+ class Object3d {
17
+ constructor(data) {
18
+
19
+ this._name = data.name || "noname";
20
+ this._vertices = data.vertices || [];
21
+ this._texCoords = [];
22
+
23
+ this.color = getColor(data.color);
24
+
25
+ if (data.scale) {
26
+ Object3d.scale(this._vertices, data.scale);
27
+ }
28
+
29
+ if (data.indexes) {
30
+ this._indexes = data.indexes || [];
31
+ this._normals = data.normals || [];
32
+ } else {
33
+ this._normals = Object3d.getNormals(this._vertices);
34
+ this._indexes = new Array(this._vertices.length);
35
+ for (let i = 0, len = this._indexes.length; i < len; i++) {
36
+ this._indexes[i] = i;
37
+ }
38
+ }
39
+ }
40
+
41
+ get name() {
42
+ return this._name;
43
+ }
44
+
45
+ get vertices() {
46
+ return this._vertices;
47
+ }
48
+
49
+ get normals() {
50
+ return this._normals;
51
+ }
52
+
53
+ get indexes() {
54
+ return this._indexes;
55
+ }
56
+
57
+ static scale(vertices, s) {
58
+ for (let i = 0; i < vertices.length; i++) {
59
+ vertices[i] *= s;
60
+ }
61
+ }
62
+
63
+ static centroid(vertices) {
64
+ let minX = 1000.0, minY = 1000.0, minZ = 1000.0,
65
+ maxX = -1000.0, maxY = -1000.0, maxZ = -1000.0;
66
+
67
+ for (let i = 0; i < vertices.length; i += 3) {
68
+ let x = vertices[i],
69
+ y = vertices[i + 1],
70
+ z = vertices[i + 2];
71
+ if (x < minX) minX = x;
72
+ if (y < minY) minY = y;
73
+ if (z < minZ) minZ = z;
74
+ if (x > maxX) maxX = x;
75
+ if (y > maxY) maxY = y;
76
+ if (z > maxZ) maxZ = z;
77
+ }
78
+
79
+ return [
80
+ minX + (maxX - minX) * 0.5,
81
+ minY + (maxY - minY) * 0.5,
82
+ minZ + (maxZ - minZ) * 0.5
83
+ ];
84
+ }
85
+
86
+ static translate(vertices, v) {
87
+ for (let i = 0; i < vertices.length; i += 3) {
88
+ vertices[i] -= v[0];
89
+ vertices[i + 1] -= v[1];
90
+ vertices[i + 2] -= v[2];
91
+ }
92
+ }
93
+
94
+ static getNormals(vertices) {
95
+ let res = new Array(vertices.length);
96
+
97
+ for (var i = 0; i < vertices.length; i += 9) {
98
+
99
+ let t03 = i,
100
+ t13 = i + 3,
101
+ t23 = i + 6,
102
+ v0_x = vertices[t03],
103
+ v0_y = vertices[t03 + 1],
104
+ v0_z = vertices[t03 + 2],
105
+ v1_x = vertices[t13],
106
+ v1_y = vertices[t13 + 1],
107
+ v1_z = vertices[t13 + 2],
108
+ v2_x = vertices[t23],
109
+ v2_y = vertices[t23 + 1],
110
+ v2_z = vertices[t23 + 2],
111
+ vv0_x = v1_x - v0_x,
112
+ vv0_y = v1_y - v0_y,
113
+ vv0_z = v1_z - v0_z,
114
+ vv1_x = v2_x - v0_x,
115
+ vv1_y = v2_y - v0_y,
116
+ vv1_z = v2_z - v0_z,
117
+ n_x = vv0_y * vv1_z - vv0_z * vv1_y,
118
+ n_y = vv0_z * vv1_x - vv0_x * vv1_z,
119
+ n_z = vv0_x * vv1_y - vv0_y * vv1_x;
120
+
121
+ let l = Math.sqrt(n_x * n_x + n_y * n_y + n_z * n_z);
122
+
123
+ n_x /= l;
124
+ n_y /= l;
125
+ n_z /= l;
126
+
127
+ res[t03] = n_x;
128
+ res[t03 + 1] = n_y;
129
+ res[t03 + 2] = n_z;
130
+
131
+ res[t13] = n_x;
132
+ res[t13 + 1] = n_y;
133
+ res[t13 + 2] = n_z;
134
+
135
+ res[t23] = n_x;
136
+ res[t23 + 1] = n_y;
137
+ res[t23 + 2] = n_z;
138
+ }
139
+
140
+ return res;
141
+ }
142
+
143
+ static createSphere(lonBands = 16, latBands = 16, radius = 1.0, offsetX = 0, offsetY = 0, offsetZ = 0) {
144
+
145
+ let vertices = [],
146
+ indexes = [],
147
+ normals = [];
148
+
149
+ for (let latNumber = 0; latNumber <= latBands; latNumber++) {
150
+ var theta = latNumber * Math.PI / latBands;
151
+ var sinTheta = Math.sin(theta);
152
+ var cosTheta = Math.cos(theta);
153
+
154
+ for (let longNumber = 0; longNumber <= lonBands; longNumber++) {
155
+ var phi = longNumber * 2 * Math.PI / lonBands;
156
+ var sinPhi = Math.sin(phi);
157
+ var cosPhi = Math.cos(phi);
158
+ var x = cosPhi * sinTheta + offsetX;
159
+ var y = cosTheta + offsetY;
160
+ var z = sinPhi * sinTheta + offsetZ;
161
+ //var u = 1 - (longNumber / lonBands);
162
+ //var v = latNumber / latBands;
163
+ normals.push(x);
164
+ normals.push(y);
165
+ normals.push(z);
166
+ //texCoords.push(u);
167
+ //texCoords.push(v);
168
+ vertices.push(radius * x);
169
+ vertices.push(radius * y);
170
+ vertices.push(radius * z);
171
+ }
172
+ }
173
+
174
+ for (let latNumber = 0; latNumber < latBands; latNumber++) {
175
+ for (let longNumber = 0; longNumber < lonBands; longNumber++) {
176
+ var first = (latNumber * (lonBands + 1)) + longNumber;
177
+ var second = first + lonBands + 1;
178
+
179
+ indexes.push(first);
180
+ indexes.push(first + 1);
181
+ indexes.push(second);
182
+
183
+ indexes.push(second);
184
+ indexes.push(first + 1);
185
+ indexes.push(second + 1);
186
+ }
187
+ }
188
+
189
+ return new Object3d({
190
+ 'vertices': vertices,
191
+ 'normals': normals,
192
+ 'indexes': indexes
193
+ });
194
+ }
195
+
196
+ static createDisc(radius = 1.0, height = 0.0, radialSegments = 8, isTop = true, startIndex = 0, offsetX = 0, offsetY, offsetZ = 0) {
197
+
198
+ let vertices = [],
199
+ indexes = [],
200
+ normals = [];
201
+
202
+ let thetaStart = 0.0,
203
+ thetaLength = Math.PI * 2;
204
+
205
+ let sign = (isTop === true) ? 1.0 : -1.0;
206
+
207
+ let centerIndexStart = startIndex;
208
+
209
+ for (let x = 1; x <= radialSegments; x++) {
210
+ vertices.push(0 + offsetX, height * sign + offsetY, 0 + offsetZ);
211
+ normals.push(0, sign, 0);
212
+ //texCoords.push(0.5, 0.5);
213
+ startIndex++;
214
+ }
215
+
216
+ let centerIndexEnd = startIndex;
217
+
218
+ for (let x = 0; x <= radialSegments; x++) {
219
+
220
+ let u = x / radialSegments;
221
+ let theta = u * thetaLength + thetaStart;
222
+
223
+ let cosTheta = Math.cos(theta);
224
+ let sinTheta = Math.sin(theta);
225
+
226
+ vertices.push(radius * sinTheta + offsetX, height * sign + offsetY, radius * cosTheta + offsetZ);
227
+ normals.push(0, sign, 0);
228
+ //texCoords.push((cosTheta * 0.5) + 0.5, (sinTheta * 0.5 * sign) + 0.5);
229
+
230
+ startIndex++;
231
+ }
232
+
233
+ for (let x = 0; x < radialSegments; x++) {
234
+ let c = centerIndexStart + x,
235
+ i = centerIndexEnd + x;
236
+ if (isTop === true) {
237
+ indexes.push(i, i + 1, c);
238
+ } else {
239
+ indexes.push(i + 1, i, c);
240
+ }
241
+ }
242
+
243
+ return new Object3d({
244
+ 'vertices': vertices,
245
+ 'normals': normals,
246
+ 'indexes': indexes
247
+ });
248
+ }
249
+
250
+ static createCylinder(radiusTop = 1.0, radiusBottom = 1.0, height = 1.0, radialSegments = 32, heightSegments = 1.0, isTop = true, isBottom = true, offsetX = 0, offsetY = 0, offsetZ = 0) {
251
+
252
+ let vertices = [],
253
+ indexes = [],
254
+ normals = [];
255
+
256
+ let thetaStart = 0.0,
257
+ thetaLength = Math.PI * 2;
258
+
259
+ let index = 0;
260
+ let indexArray = [];
261
+
262
+ let normal = new Vec3();
263
+
264
+ var slope = (radiusBottom - radiusTop) / height;
265
+
266
+ for (let y = 0; y <= heightSegments; y++) {
267
+
268
+ let indexRow = [];
269
+
270
+ let v = y / heightSegments;
271
+
272
+ let radius = v * (radiusBottom - radiusTop) + radiusTop;
273
+
274
+ for (let x = 0; x <= radialSegments; x++) {
275
+
276
+ let u = x / radialSegments;
277
+
278
+ let theta = u * thetaLength + thetaStart;
279
+
280
+ let sinTheta = Math.sin(theta),
281
+ cosTheta = Math.cos(theta);
282
+
283
+ vertices.push(radius * sinTheta + offsetX, -v * height + height + offsetY, radius * cosTheta + offsetZ);
284
+
285
+ normal.set(sinTheta, slope, cosTheta).normalize();
286
+ normals.push(normal.x, normal.y, normal.z);
287
+
288
+ //texCoords.push(u, 1 - v);
289
+
290
+ indexRow.push(index++);
291
+ }
292
+ indexArray.push(indexRow);
293
+ }
294
+
295
+ for (let x = 0; x < radialSegments; x++) {
296
+ for (let y = 0; y < heightSegments; y++) {
297
+
298
+ let a = indexArray[y][x],
299
+ b = indexArray[y + 1][x],
300
+ c = indexArray[y + 1][x + 1],
301
+ d = indexArray[y][x + 1];
302
+
303
+ indexes.push(a, b, d);
304
+ indexes.push(b, c, d);
305
+ }
306
+ }
307
+
308
+ if (radiusTop !== 0.0 && isTop) {
309
+ let cap = Object3d.createDisc(radiusTop, height, radialSegments, true, index, offsetX, offsetY, offsetZ);
310
+ vertices.push(...cap.vertices);
311
+ normals.push(...cap.normals);
312
+ indexes.push(...cap.indexes);
313
+ }
314
+
315
+ if (radiusBottom !== 0.0 && isBottom) {
316
+ let cap = Object3d.createDisc(radiusBottom, 0, radialSegments, false, index + (isTop ? (1 + 2 * radialSegments) : 0), offsetX, offsetY, offsetZ);
317
+ vertices.push(...cap.vertices);
318
+ normals.push(...cap.normals);
319
+ indexes.push(...cap.indexes);
320
+ }
321
+
322
+ return new Object3d({
323
+ 'vertices': vertices,
324
+ 'normals': normals,
325
+ 'indexes': indexes
326
+ });
327
+ }
328
+
329
+ static createCube(length = 1, height = 1, depth = 1, xOffset = 0, yOffset = 0, zOffset = 0) {
330
+ let l = length * 0.5 + xOffset,
331
+ h = height * 0.5 + yOffset,
332
+ d = depth * 0.5 + zOffset;
333
+
334
+ return new Object3d({
335
+ vertices: [
336
+ //bottom
337
+ -l, -h, d,
338
+ l, -h, -d,
339
+ l, -h, d,
340
+ -l, -h, d,
341
+ -l, -h, -d,
342
+ l, -h, -d,
343
+
344
+ //top
345
+ -l, h, d,
346
+ l, h, d,
347
+ l, h, -d,
348
+ -l, h, d,
349
+ l, h, -d,
350
+ -l, h, -d,
351
+
352
+ //front
353
+ -l, -h, d,
354
+ l, -h, d,
355
+ -l, h, d,
356
+ -l, h, d,
357
+ l, -h, d,
358
+ l, h, d,
359
+
360
+ //back
361
+ -l, -h, -d,
362
+ -l, h, -d,
363
+ l, -h, -d,
364
+ -l, h, -d,
365
+ l, h, -d,
366
+ l, -h, -d,
367
+
368
+ //left
369
+ l, -h, d,
370
+ l, -h, -d,
371
+ l, h, d,
372
+ l, h, d,
373
+ l, -h, -d,
374
+ l, h, -d,
375
+
376
+ //right
377
+ -l, -h, d,
378
+ -l, h, d,
379
+ -l, -h, -d,
380
+ -l, h, d,
381
+ -l, h, -d,
382
+ -l, -h, -d
383
+ ]
384
+ });
385
+ }
386
+
387
+ static createArrow(back = 0.0, height = 2.1, front = -15) {
388
+ return new Object3d({
389
+ vertices: [
390
+ 0, height, 0,
391
+ 7, 0, 6,
392
+ 0, 0, front,
393
+
394
+ 0, 0, back,
395
+ 7, 0, 6,
396
+ 0, height, 0,
397
+
398
+ -7, 0, 6,
399
+ 0, 0, back,
400
+ 0, height, 0,
401
+
402
+ -7, 0, 6,
403
+ 0, height, 0,
404
+ 0, 0, front,
405
+
406
+ -7, 0, 6,
407
+ 0, 0, front,
408
+ 0, 0, back,
409
+ 0, 0, back,
410
+ 0, 0, front,
411
+ 7, 0, 6
412
+ ]
413
+ });
414
+ }
415
+ }
416
+
417
+ export { Object3d };