@openglobus/og 0.14.10 → 0.15.1

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 (140) hide show
  1. package/css/og.css +378 -275
  2. package/dist/@openglobus/og.css +1 -1
  3. package/dist/@openglobus/og.esm.js +2 -2
  4. package/dist/@openglobus/og.esm.js.map +1 -1
  5. package/dist/@openglobus/og.umd.js +2 -2
  6. package/dist/@openglobus/og.umd.js.map +1 -1
  7. package/package.json +18 -17
  8. package/src/og/Clock.js +218 -194
  9. package/src/og/Globe.js +5 -5
  10. package/src/og/Object3d.js +104 -145
  11. package/src/og/camera/Camera.js +31 -27
  12. package/src/og/camera/PlanetCamera.js +22 -14
  13. package/src/og/cons.js +107 -107
  14. package/src/og/control/Atmosphere.js +396 -0
  15. package/src/og/control/CompassButton.js +11 -18
  16. package/src/og/control/Control.js +197 -188
  17. package/src/og/control/GeoImageDragControl.js +84 -66
  18. package/src/og/control/LayerSwitcher.js +56 -138
  19. package/src/og/control/Lighting.js +314 -186
  20. package/src/og/control/MouseNavigation.js +2 -2
  21. package/src/og/control/RulerSwitcher.js +24 -19
  22. package/src/og/control/ScaleControl.js +30 -10
  23. package/src/og/control/SimpleSkyBackground.js +210 -0
  24. package/src/og/control/Sun.js +3 -1
  25. package/src/og/control/ZoomControl.js +30 -42
  26. package/src/og/control/index.js +6 -0
  27. package/src/og/control/ruler/RulerScene.js +5 -23
  28. package/src/og/control/selection/Selection.js +99 -0
  29. package/src/og/control/selection/SelectionScene.js +350 -0
  30. package/src/og/control/timeline/TimelineControl.js +99 -0
  31. package/src/og/control/timeline/TimelineModel.js +133 -0
  32. package/src/og/control/timeline/TimelineView.js +449 -0
  33. package/src/og/control/timeline/timelineUtils.js +132 -0
  34. package/src/og/ellipsoid/Ellipsoid.js +120 -93
  35. package/src/og/ellipsoid/wgs84.js +13 -13
  36. package/src/og/entity/Entity.js +36 -9
  37. package/src/og/entity/EntityCollection.js +0 -2
  38. package/src/og/entity/GeoObject.js +72 -56
  39. package/src/og/entity/GeoObjectHandler.js +487 -656
  40. package/src/og/entity/GeometryHandler.js +1341 -1337
  41. package/src/og/entity/Polyline.js +0 -16
  42. package/src/og/entity/Ray.js +0 -10
  43. package/src/og/entity/RayHandler.js +3 -44
  44. package/src/og/entity/Strip.js +1 -6
  45. package/src/og/index.js +13 -7
  46. package/src/og/input/input.js +3 -1
  47. package/src/og/layer/CanvasTiles.js +39 -34
  48. package/src/og/layer/Layer.js +69 -9
  49. package/src/og/layer/Material.js +1 -8
  50. package/src/og/layer/WMS.js +16 -5
  51. package/src/og/light/LightSource.js +2 -0
  52. package/src/og/math/Line3.js +140 -139
  53. package/src/og/math/Plane.js +118 -117
  54. package/src/og/math/Ray.js +242 -239
  55. package/src/og/math/Vec3.js +56 -37
  56. package/src/og/math/Vec4.js +3 -4
  57. package/src/og/math.js +21 -21
  58. package/src/og/quadTree/Node.js +5 -4
  59. package/src/og/quadTree/index.js +12 -0
  60. package/src/og/renderer/Renderer.js +64 -37
  61. package/src/og/renderer/RendererEvents.js +1071 -1065
  62. package/src/og/scene/Planet.js +354 -174
  63. package/src/og/scene/RenderNode.js +27 -12
  64. package/src/og/segment/Segment.js +0 -5
  65. package/src/og/shaders/atmos.js +332 -0
  66. package/src/og/shaders/drawnode.js +475 -109
  67. package/src/og/shaders/geoObject.js +96 -51
  68. package/src/og/shaders/polyline.js +212 -17
  69. package/src/og/shaders/ray.js +13 -6
  70. package/src/og/shaders/toneMapping.js +5 -5
  71. package/src/og/shaders/utils.js +88 -0
  72. package/src/og/terrain/GlobusTerrain.js +5 -4
  73. package/src/og/terrain/MapboxTerrain.js +231 -52
  74. package/src/og/ui/Button.js +106 -0
  75. package/src/og/ui/ButtonGroup.js +57 -0
  76. package/src/og/ui/Dialog.js +242 -0
  77. package/src/og/ui/Slider.js +144 -0
  78. package/src/og/ui/ToggleButton.js +51 -0
  79. package/src/og/{control → ui}/UIhelpers.js +11 -2
  80. package/src/og/ui/View.js +190 -0
  81. package/src/og/utils/shared.js +960 -942
  82. package/src/og/webgl/Framebuffer.js +308 -387
  83. package/src/og/webgl/Handler.js +90 -30
  84. package/src/og/webgl/Multisample.js +8 -0
  85. package/types/Clock.d.ts +7 -2
  86. package/types/Object3d.d.ts +14 -3
  87. package/types/camera/Camera.d.ts +18 -17
  88. package/types/camera/PlanetCamera.d.ts +3 -1
  89. package/types/control/Atmosphere.d.ts +15 -0
  90. package/types/control/CompassButton.d.ts +1 -2
  91. package/types/control/GeoImageDragControl.d.ts +7 -1
  92. package/types/control/LayerSwitcher.d.ts +5 -6
  93. package/types/control/Lighting.d.ts +32 -7
  94. package/types/control/ScaleControl.d.ts +2 -1
  95. package/types/control/SimpleSkyBackground.d.ts +15 -0
  96. package/types/control/ZoomControl.d.ts +0 -1
  97. package/types/control/index.d.ts +4 -1
  98. package/types/control/ruler/RulerScene.d.ts +0 -1
  99. package/types/control/selection/Selection.d.ts +49 -0
  100. package/types/control/selection/SelectionScene.d.ts +34 -0
  101. package/types/ellipsoid/Ellipsoid.d.ts +3 -2
  102. package/types/entity/Entity.d.ts +8 -0
  103. package/types/entity/GeoObject.d.ts +28 -22
  104. package/types/entity/GeoObjectHandler.d.ts +16 -56
  105. package/types/entity/Ray.d.ts +0 -3
  106. package/types/entity/RayHandler.d.ts +0 -4
  107. package/types/index.d.ts +9 -6
  108. package/types/input/input.d.ts +2 -0
  109. package/types/layer/CanvasTiles.d.ts +1 -0
  110. package/types/layer/Layer.d.ts +9 -0
  111. package/types/layer/WMS.d.ts +7 -3
  112. package/types/math/Plane.d.ts +1 -1
  113. package/types/math/Vec3.d.ts +19 -16
  114. package/types/math/Vec4.d.ts +2 -3
  115. package/types/math.d.ts +20 -20
  116. package/types/quadTree/index.d.ts +10 -0
  117. package/types/renderer/Renderer.d.ts +11 -37
  118. package/types/scene/Planet.d.ts +27 -1
  119. package/types/scene/RenderNode.d.ts +2 -1
  120. package/types/segment/Segment.d.ts +1 -1
  121. package/types/shaders/atmos.d.ts +4 -0
  122. package/types/shaders/drawnode.d.ts +3 -2
  123. package/types/shaders/utils.d.ts +1 -0
  124. package/types/terrain/GlobusTerrain.d.ts +1 -1
  125. package/types/terrain/MapboxTerrain.d.ts +2 -1
  126. package/types/ui/Button.d.ts +21 -0
  127. package/types/ui/Dialog.d.ts +41 -0
  128. package/types/ui/Slider.d.ts +30 -0
  129. package/types/ui/ToggleButton.d.ts +10 -0
  130. package/types/{control → ui}/UIhelpers.d.ts +1 -1
  131. package/types/ui/View.d.ts +32 -0
  132. package/types/utils/shared.d.ts +16 -14
  133. package/types/webgl/Framebuffer.d.ts +2 -5
  134. package/types/webgl/Handler.d.ts +15 -10
  135. package/types/webgl/Multisample.d.ts +2 -0
  136. package/src/og/ajax.js +0 -204
  137. package/src/og/entity/Object3d.js +0 -504
  138. package/src/og/utils/quadTreeType.js +0 -11
  139. package/types/ajax.d.ts +0 -24
  140. package/types/utils/quadTreeType.d.ts +0 -8
@@ -42,7 +42,7 @@ const EVENT_NAMES = [
42
42
  * @param {string} [options.url="//openglobus.org/heights/srtm3/{z}/{y}/{x}.ddm"] - Terrain source path url template. Default is openglobus ddm elevation file.
43
43
  * @param {Array.<number>} [options.gridSizeByZoom] - Array of segment triangulation grid sizes where array index agreed to the segment zoom index.
44
44
  * @param {number} [options.plainGridSize=32] - Elevation grid size. Default is 32x32. Must be power of two.
45
- * @param {string} [options.responseType="arraybuffer"] - Ajax responce type.
45
+ * @param {string} [options.responseType="arraybuffer"] - Responce type.
46
46
  * @param {number} [options.MAX_LOADING_TILES] - Maximum at one time loading tiles.
47
47
  * @param {Array.<number>} [gridSizeByZoom] - Array of values, where each value corresponds to the size of a tile(or segment) on the globe. Each value must be power of two.
48
48
  * @fires og.terrain.GlobusTerrain#load
@@ -163,7 +163,7 @@ class GlobusTerrain extends EmptyTerrain {
163
163
  }
164
164
 
165
165
  isBlur(segment) {
166
- if (segment.tileZoom >= 8) {
166
+ if (segment.tileZoom >= 6) {
167
167
  return true;
168
168
  }
169
169
  return false;
@@ -369,7 +369,8 @@ class GlobusTerrain extends EmptyTerrain {
369
369
  let heights = this._createHeights(response.data,
370
370
  segment.tileIndex,
371
371
  segment.tileX, segment.tileY, segment.tileZoom,
372
- segment.getExtent()
372
+ segment.getExtent(),
373
+ segment.tileZoom === this.maxZoom
373
374
  );
374
375
 
375
376
  this._elevationCache[segment.tileIndex] = {
@@ -399,7 +400,7 @@ class GlobusTerrain extends EmptyTerrain {
399
400
 
400
401
  _getSubdomain() {
401
402
  this._requestCount++;
402
- return this._s[Math.floor(this._requestCount % (this._requestsPeerSubdomian * this._s.length) / this._requestsPeerSubdomian)];
403
+ return this._s[Math.floor(this._requestCount % (this._requestsPeerSubdomian * this._s.length) / this._requestsPeerSubdomian)];
403
404
  }
404
405
 
405
406
  _buildURL(x, y, z) {
@@ -2,10 +2,15 @@ import { getTileExtent } from "../mercator.js";
2
2
  import { Layer } from "../layer/Layer.js";
3
3
  import { GlobusTerrain } from "./GlobusTerrain.js";
4
4
  import { isPowerOfTwo } from "../math.js";
5
+ import * as mercator from "../mercator.js";
5
6
 
6
7
  const KEY =
7
8
  "pk.eyJ1IjoiZm94bXVsZGVyODMiLCJhIjoiY2pqYmR3dG5oM2Z1bzNrczJqYm5pODhuNSJ9.Y4DRmEPhb-XSlCR9CAXACQ";
8
9
 
10
+ const rgb2Height = (r, g, b) => {
11
+ return -10000 + 0.1 * (r * 256 * 256 + g * 256 + b);
12
+ };
13
+
9
14
  class MapboxTerrain extends GlobusTerrain {
10
15
  constructor(name, options = {}) {
11
16
  super(name || "mapbox", options);
@@ -39,10 +44,12 @@ class MapboxTerrain extends GlobusTerrain {
39
44
  this._imageSize = options.imageSize || 256;
40
45
 
41
46
  this._ctx = this._createTemporalCanvas(this._imageSize);
47
+
48
+ this._imageDataCache = {};
42
49
  }
43
50
 
44
51
  isBlur(segment) {
45
- if (segment.tileZoom >= 13) {
52
+ if (segment.tileZoom >= 16) {
46
53
  return true;
47
54
  }
48
55
  return false;
@@ -52,15 +59,19 @@ class MapboxTerrain extends GlobusTerrain {
52
59
  let canvas = document.createElement("canvas");
53
60
  canvas.width = size;
54
61
  canvas.height = size;
55
- return canvas.getContext("2d");
62
+ return canvas.getContext("2d",
63
+ {
64
+ willReadFrequently: true
65
+ });
56
66
  }
57
67
 
58
- _createHeights(data, tileIndex, tileX, tileY, tileZoom, extent) {
59
- const SIZE = data.width;
68
+ _createHeights(data, tileIndex, tileX, tileY, tileZoom, extent, preventChildren) {
60
69
 
61
- this._ctx.clearRect(0, 0, SIZE, SIZE);
70
+ this._ctx.clearRect(0, 0, this._imageSize, this._imageSize);
62
71
  this._ctx.drawImage(data, 0, 0);
63
- let rgbaData = this._ctx.getImageData(0, 0, SIZE, SIZE).data;
72
+ let rgbaData = this._ctx.getImageData(0, 0, this._imageSize, this._imageSize).data;
73
+
74
+ const SIZE = data.width;
64
75
 
65
76
  //
66
77
  //Non power of two images
@@ -71,25 +82,42 @@ class MapboxTerrain extends GlobusTerrain {
71
82
  return outCurrenElevations;
72
83
  }
73
84
 
74
- // TODO:
75
- //if (this._imageSize === this.plainGridSize) {
76
- // let elevationsSize = (this.plainGridSize + 1) * (this.plainGridSize + 1);
77
- // let d = SIZE / this.plainGridSize;
85
+ if (this._imageSize === this.plainGridSize) {
86
+ let elevationsSize = (this.plainGridSize + 1) * (this.plainGridSize + 1);
87
+ let outCurrenElevations = new Float32Array(elevationsSize);
88
+ for (let k = 0, len = this._imageSize * this._imageSize; k < len; k++) {
89
+ let j = k % this._imageSize,
90
+ i = Math.floor(k / this._imageSize);
91
+ let fromInd4 = k * 4;
92
+ let h = rgb2Height(rgbaData[fromInd4], rgbaData[fromInd4 + 1], rgbaData[fromInd4 + 2]);
93
+ outCurrenElevations[i * (this._imageSize + 1) + j] = h;
94
+ }
95
+
96
+ for (let i = 0, len = this._imageSize; i < len; i++) {
97
+ let j = this._imageSize - 1;
98
+ let fromInd4 = (i * this._imageSize + j) * 4;
99
+ let h = rgb2Height(rgbaData[fromInd4], rgbaData[fromInd4 + 1], rgbaData[fromInd4 + 2]);
100
+ outCurrenElevations[i * (this._imageSize + 1) + this._imageSize] = h;
101
+ }
78
102
 
79
- // let outCurrenElevations = new Float32Array(elevationsSize);
103
+ for (let j = 0, len = this._imageSize; j < len; j++) {
104
+ let i = this._imageSize - 1;
105
+ let fromInd4 = (i * this._imageSize + j) * 4;
106
+ let h = rgb2Height(rgbaData[fromInd4], rgbaData[fromInd4 + 1], rgbaData[fromInd4 + 2]);
107
+ outCurrenElevations[this._imageSize * (this._imageSize + 1) + j] = h;
108
+ }
80
109
 
81
- // for (let i = 0, len = outCurrenElevations.length; i < len; i++) {
82
- // let i4 = i * 4;
83
- // outCurrenElevations[i] = -10000 + 0.1 * (rgbaData[i4] * 256 * 256 + rgbaData[i4 + 1] * 256 + rgbaData[i4 + 2]);
84
- // }
110
+ let h = rgb2Height(rgbaData[rgbaData.length - 4], rgbaData[rgbaData.length - 3], rgbaData[rgbaData.length - 2]);
111
+ outCurrenElevations[outCurrenElevations.length - 1] = h;
85
112
 
86
- // return outCurrenElevations;
87
- //}
113
+ return outCurrenElevations;
114
+ }
88
115
 
89
116
  //
90
117
  // Power of two images
91
118
  //
92
119
  let elevationsSize = (this.plainGridSize + 1) * (this.plainGridSize + 1);
120
+
93
121
  let d = SIZE / this.plainGridSize;
94
122
 
95
123
  let outCurrenElevations = new Float32Array(elevationsSize);
@@ -102,40 +130,99 @@ class MapboxTerrain extends GlobusTerrain {
102
130
  }
103
131
  }
104
132
 
105
- extractElevationTilesMapbox(
106
- rgbaData,
107
- this.noDataValues,
108
- outCurrenElevations,
109
- outChildrenElevations
110
- );
133
+ if (preventChildren) {
134
+ extractElevationTilesMapboxNoChildren(rgbaData, this.noDataValues, outCurrenElevations);
135
+ } else {
136
+ extractElevationTilesMapbox(
137
+ rgbaData,
138
+ this.noDataValues,
139
+ outCurrenElevations,
140
+ outChildrenElevations
141
+ );
142
+ }
111
143
 
112
144
  this._elevationCache[tileIndex] = {
113
145
  heights: outCurrenElevations,
114
146
  extent: extent//segment.getExtent()
115
147
  };
116
148
 
117
- for (let i = 0; i < d; i++) {
118
- for (let j = 0; j < d; j++) {
119
- let x = tileX * 2 + j,
120
- y = tileY * 2 + i,
121
- z = tileZoom + 1;
122
- let tileIndex = Layer.getTileIndex(x, y, z);
123
- this._elevationCache[tileIndex] = {
124
- heights: outChildrenElevations[i][j],
125
- extent: getTileExtent(x, y, z)
126
- };
149
+ if (!preventChildren) {
150
+ for (let i = 0; i < d; i++) {
151
+ for (let j = 0; j < d; j++) {
152
+ let x = tileX * 2 + j,
153
+ y = tileY * 2 + i,
154
+ z = tileZoom + 1;
155
+ let tileIndex = Layer.getTileIndex(x, y, z);
156
+ this._elevationCache[tileIndex] = {
157
+ heights: outChildrenElevations[i][j],
158
+ extent: getTileExtent(x, y, z)
159
+ };
160
+ }
127
161
  }
128
162
  }
129
163
 
130
164
  return outCurrenElevations;
131
165
  }
166
+
167
+ getHeightAsync(lonLat, callback, zoom) {
168
+ if (!lonLat || lonLat.lat > mercator.MAX_LAT || lonLat.lat < mercator.MIN_LAT) {
169
+ callback(0);
170
+ return true;
171
+ }
172
+
173
+ let z = zoom || this.maxZoom,
174
+ size = mercator.POLE2 / Math.pow(2, z),
175
+ merc = mercator.forward(lonLat),
176
+ x = Math.floor((mercator.POLE + merc.lon) / size),
177
+ y = Math.floor((mercator.POLE - merc.lat) / size);
178
+
179
+ let tileIndex = Layer.getTileIndex(x, y, z),
180
+ extent = mercator.getTileExtent(x, y, z);
181
+
182
+ let sizeImgW = extent.getWidth() / (this._imageSize - 1),
183
+ sizeImgH = extent.getHeight() / (this._imageSize - 1);
184
+
185
+ let i = this._imageSize - Math.ceil((merc.lat - extent.southWest.lat) / sizeImgH) - 1,
186
+ j = Math.floor((merc.lon - extent.southWest.lon) / sizeImgW);
187
+ let index = (i * this._imageSize + j) * 4;
188
+
189
+ if (this._imageDataCache[tileIndex]) {
190
+ let data = this._imageDataCache[tileIndex];
191
+ callback(rgb2Height(data[index], data[index + 1], data[index + 2]));
192
+ return true;
193
+ }
194
+
195
+ if (!this._fetchCache[tileIndex]) {
196
+ let url = this._buildURL(x, y, z);
197
+ this._fetchCache[tileIndex] = this._loader.fetch({
198
+ src: url,
199
+ type: this._dataType
200
+ });
201
+ }
202
+
203
+ this._fetchCache[tileIndex].then((response) => {
204
+ if (response.status === "ready") {
205
+ this._ctx.clearRect(0, 0, this._imageSize, this._imageSize);
206
+ this._ctx.drawImage(response.data, 0, 0);
207
+ let data = this._ctx.getImageData(0, 0, 256, 256).data;
208
+ this._imageDataCache[tileIndex] = data;
209
+ callback(rgb2Height(data[index], data[index + 1], data[index + 2]));
210
+ } else if (response.status === "error") {
211
+ callback(0);
212
+ } else {
213
+ this._fetchCache[tileIndex] = null;
214
+ delete this._fetchCache[tileIndex];
215
+ }
216
+ });
217
+
218
+ return false;
219
+ }
132
220
  }
133
221
 
134
222
  function extractElevationTilesMapboxNonPowerOfTwo(rgbaData, outCurrenElevations) {
135
223
  for (let i = 0, len = outCurrenElevations.length; i < len; i++) {
136
224
  let i4 = i * 4;
137
- outCurrenElevations[i] =
138
- -10000 + 0.1 * (rgbaData[i4] * 256 * 256 + rgbaData[i4 + 1] * 256 + rgbaData[i4 + 2]);
225
+ outCurrenElevations[i] = rgb2Height(rgbaData[i4], rgbaData[i4 + 1], rgbaData[i4 + 2]);
139
226
  }
140
227
  }
141
228
 
@@ -161,8 +248,8 @@ function extractElevationTilesMapbox(
161
248
  ) {
162
249
  let k4 = k * 4;
163
250
 
164
- let height =
165
- -10000 + 0.1 * (rgbaData[k4] * 256 * 256 + rgbaData[k4 + 1] * 256 + rgbaData[k4 + 2]);
251
+ let height = rgb2Height(rgbaData[k4], rgbaData[k4 + 1], rgbaData[k4 + 2]);
252
+ //-10000 + 0.1 * (rgbaData[k4] * 256 * 256 + rgbaData[k4 + 1] * 256 + rgbaData[k4 + 2]);
166
253
 
167
254
  let isNoDataCurrent = MapboxTerrain.checkNoDataValue(noDataValues, height),
168
255
  isNoDataRight = false,
@@ -189,9 +276,8 @@ function extractElevationTilesMapbox(
189
276
 
190
277
  if ((j + 1) % destSize === 0 && j !== sourceSize - 1) {
191
278
  //current tile
192
- rightHeight =
193
- -10000 +
194
- 0.1 * (rgbaData[k4 + 4] * 256 * 256 + rgbaData[k4 + 5] * 256 + rgbaData[k4 + 6]);
279
+ rightHeight = rgb2Height(rgbaData[k4 + 4], rgbaData[k4 + 5], rgbaData[k4 + 6]);
280
+ // -10000 + 0.1 * (rgbaData[k4 + 4] * 256 * 256 + rgbaData[k4 + 5] * 256 + rgbaData[k4 + 6]);
195
281
 
196
282
  isNoDataRight = MapboxTerrain.checkNoDataValue(noDataValues, rightHeight);
197
283
 
@@ -217,12 +303,8 @@ function extractElevationTilesMapbox(
217
303
  //current tile
218
304
  sourceSize4 = sourceSize * 4;
219
305
 
220
- bottomHeight =
221
- -10000 +
222
- 0.1 *
223
- (rgbaData[k4 + sourceSize4] * 256 * 256 +
224
- rgbaData[k4 + sourceSize4 + 1] * 256 +
225
- rgbaData[k4 + sourceSize4 + 2]);
306
+ bottomHeight = rgb2Height(rgbaData[k4 + sourceSize4], rgbaData[k4 + sourceSize4 + 1], rgbaData[k4 + sourceSize4 + 2]);
307
+ // -10000 + 0.1 * (rgbaData[k4 + sourceSize4] * 256 * 256 + rgbaData[k4 + sourceSize4 + 1] * 256 + rgbaData[k4 + sourceSize4 + 2]);
226
308
 
227
309
  isNoDataBottom = MapboxTerrain.checkNoDataValue(noDataValues, bottomHeight);
228
310
 
@@ -251,12 +333,8 @@ function extractElevationTilesMapbox(
251
333
  i !== sourceSize - 1
252
334
  ) {
253
335
  //current tile
254
- let rightBottomHeight =
255
- -10000 +
256
- 0.1 *
257
- (rgbaData[k4 + sourceSize4 + 4] * 256 * 256 +
258
- rgbaData[k4 + sourceSize4 + 5] * 256 +
259
- rgbaData[k4 + sourceSize4 + 6]);
336
+ let rightBottomHeight = rgb2Height(rgbaData[k4 + sourceSize4 + 4], rgbaData[k4 + sourceSize4 + 5], rgbaData[k4 + sourceSize4 + 6]);
337
+ // -10000 + 0.1 * (rgbaData[k4 + sourceSize4 + 4] * 256 * 256 + rgbaData[k4 + sourceSize4 + 5] * 256 + rgbaData[k4 + sourceSize4 + 6]);
260
338
 
261
339
  let isNoDataRightBottom = MapboxTerrain.checkNoDataValue(
262
340
  noDataValues,
@@ -289,4 +367,105 @@ function extractElevationTilesMapbox(
289
367
  }
290
368
  }
291
369
 
370
+ function extractElevationTilesMapboxNoChildren(
371
+ rgbaData,
372
+ noDataValues,
373
+ outCurrenElevations
374
+ ) {
375
+ let destSize = Math.sqrt(outCurrenElevations.length) - 1;
376
+ let sourceSize = Math.sqrt(rgbaData.length / 4);
377
+ let dt = sourceSize / destSize;
378
+
379
+ let rightHeight = 0,
380
+ bottomHeight = 0,
381
+ sourceSize4 = 0;
382
+
383
+ for (
384
+ let k = 0, currIndex = 0, sourceDataLength = rgbaData.length / 4;
385
+ k < sourceDataLength;
386
+ k++
387
+ ) {
388
+ let k4 = k * 4;
389
+
390
+ let height = rgb2Height(rgbaData[k4], rgbaData[k4 + 1], rgbaData[k4 + 2]);
391
+ //-10000 + 0.1 * (rgbaData[k4] * 256 * 256 + rgbaData[k4 + 1] * 256 + rgbaData[k4 + 2]);
392
+
393
+ let isNoDataCurrent = MapboxTerrain.checkNoDataValue(noDataValues, height),
394
+ isNoDataRight = false,
395
+ isNoDataBottom = false;
396
+
397
+ let i = Math.floor(k / sourceSize),
398
+ j = k % sourceSize;
399
+
400
+ let tileX = Math.floor(j / destSize),
401
+ tileY = Math.floor(i / destSize);
402
+
403
+ if ((i + tileY) % dt === 0 && (j + tileX) % dt === 0) {
404
+ outCurrenElevations[currIndex++] = height;
405
+ }
406
+
407
+ if ((j + 1) % destSize === 0 && j !== sourceSize - 1) {
408
+ //current tile
409
+ rightHeight = rgb2Height(rgbaData[k4 + 4], rgbaData[k4 + 5], rgbaData[k4 + 6]);
410
+ //-10000 + 0.1 * (rgbaData[k4 + 4] * 256 * 256 + rgbaData[k4 + 5] * 256 + rgbaData[k4 + 6]);
411
+
412
+ isNoDataRight = MapboxTerrain.checkNoDataValue(noDataValues, rightHeight);
413
+
414
+ let middleHeight = height;
415
+
416
+ if (!(isNoDataCurrent || isNoDataRight)) {
417
+ middleHeight = (height + rightHeight) * 0.5;
418
+ }
419
+
420
+ if ((i + tileY) % dt === 0) {
421
+ outCurrenElevations[currIndex++] = middleHeight;
422
+ }
423
+ }
424
+
425
+ if ((i + 1) % destSize === 0 && i !== sourceSize - 1) {
426
+ //current tile
427
+ sourceSize4 = sourceSize * 4;
428
+
429
+ bottomHeight = rgb2Height(rgbaData[k4 + sourceSize4], rgbaData[k4 + sourceSize4 + 1], rgbaData[k4 + sourceSize4 + 2]);
430
+ // -10000 + 0.1 * (rgbaData[k4 + sourceSize4] * 256 * 256 + rgbaData[k4 + sourceSize4 + 1] * 256 + rgbaData[k4 + sourceSize4 + 2]);
431
+
432
+ isNoDataBottom = MapboxTerrain.checkNoDataValue(noDataValues, bottomHeight);
433
+
434
+ let middleHeight = (height + bottomHeight) * 0.5;
435
+
436
+ if (!(isNoDataCurrent || isNoDataBottom)) {
437
+ middleHeight = (height + bottomHeight) * 0.5;
438
+ }
439
+
440
+ if ((j + tileX) % dt === 0) {
441
+ outCurrenElevations[currIndex++] = middleHeight;
442
+ }
443
+ }
444
+
445
+ if (
446
+ (j + 1) % destSize === 0 &&
447
+ j !== sourceSize - 1 &&
448
+ (i + 1) % destSize === 0 &&
449
+ i !== sourceSize - 1
450
+ ) {
451
+ //current tile
452
+ let rightBottomHeight = rgb2Height(rgbaData[k4 + sourceSize4 + 4], rgbaData[k4 + sourceSize4 + 5], rgbaData[k4 + sourceSize4 + 6]);
453
+ // -10000 + 0.1 * (rgbaData[k4 + sourceSize4 + 4] * 256 * 256 + rgbaData[k4 + sourceSize4 + 5] * 256 + rgbaData[k4 + sourceSize4 + 6]);
454
+
455
+ let isNoDataRightBottom = MapboxTerrain.checkNoDataValue(
456
+ noDataValues,
457
+ rightBottomHeight
458
+ );
459
+
460
+ let middleHeight = height;
461
+
462
+ if (!(isNoDataCurrent || isNoDataRight || isNoDataBottom || isNoDataRightBottom)) {
463
+ middleHeight = (height + rightHeight + bottomHeight + rightBottomHeight) * 0.25;
464
+ }
465
+
466
+ outCurrenElevations[currIndex++] = middleHeight;
467
+ }
468
+ }
469
+ }
470
+
292
471
  export { MapboxTerrain };
@@ -0,0 +1,106 @@
1
+ 'use strict'
2
+
3
+ import { View } from './View.js';
4
+ import { stringTemplate } from '../utils/shared.js';
5
+
6
+ const TEMPLATE =
7
+ `<div class="og-button">
8
+ <div class="og-button-icon">{icon}</div>
9
+ <div class="og-button-text">{text}</div>
10
+ </div>`;
11
+
12
+ class Button extends View {
13
+ constructor(options = {}) {
14
+ super({
15
+ template: stringTemplate(TEMPLATE, {
16
+ icon: options.icon || "",
17
+ text: options.text || ""
18
+ }),
19
+ ...options,
20
+ eventList: ["click", "mousedown", "mouseup", "touchstart", "touchend", "touchcancel", ...(options.eventList || [])]
21
+ });
22
+
23
+ this.name = options.name || "";
24
+
25
+ this.$icon;
26
+ this.$text;
27
+ }
28
+
29
+ render(params) {
30
+ super.render(params);
31
+ this.$icon = this.select(".og-button-icon");
32
+ this.$text = this.select(".og-button-text");
33
+ this.el.__og_button__ = this;
34
+ this._initEvents();
35
+ return this;
36
+ }
37
+
38
+ _initEvents() {
39
+ this._onMouseClick_ = this._onMouseClick.bind(this);
40
+ this.el.addEventListener("click", this._onMouseClick_);
41
+
42
+ this._onMouseDown_ = this._onMouseDown.bind(this);
43
+ this.el.addEventListener("mousedown", this._onMouseDown_);
44
+
45
+ this._onMouseUp_ = this._onMouseUp.bind(this);
46
+ this.el.addEventListener("mouseup", this._onMouseUp_);
47
+
48
+ this._onTouchStart_ = this._onTouchStart.bind(this);
49
+ this.el.addEventListener("touchstart", this._onTouchStart_);
50
+
51
+ this._onTouchEnd_ = this._onTouchEnd.bind(this);
52
+ this.el.addEventListener("touchend", this._onTouchEnd_);
53
+
54
+ this._onTouchCancel_ = this._onTouchCancel.bind(this);
55
+ this.el.addEventListener("touchcancel", this._onTouchCancel_);
56
+
57
+ }
58
+
59
+ _onMouseDown(e) {
60
+ e = e || window.event;
61
+ e.preventDefault();
62
+ this._events.dispatch(this._events.mousedown, this, e);
63
+ }
64
+
65
+ _onMouseUp(e) {
66
+ e = e || window.event;
67
+ e.preventDefault();
68
+ this._events.dispatch(this._events.mouseup, this, e);
69
+ }
70
+
71
+ _onTouchStart(e) {
72
+ e = e || window.event;
73
+ e.preventDefault();
74
+ this._events.dispatch(this._events.touchstart, this, e);
75
+ }
76
+
77
+ _onTouchEnd(e) {
78
+ e = e || window.event;
79
+ e.preventDefault();
80
+ this._events.dispatch(this._events.touchend, this, e);
81
+ }
82
+
83
+ _onTouchCancel(e) {
84
+ e = e || window.event;
85
+ e.preventDefault();
86
+ this._events.dispatch(this._events.touchcancel, this, e);
87
+ }
88
+
89
+ _onMouseClick(e) {
90
+ e = e || window.event;
91
+ e.preventDefault();
92
+ this._events.dispatch(this._events.click, this, e);
93
+ }
94
+
95
+ remove() {
96
+ this._clearEvents();
97
+ super.remove();
98
+ }
99
+
100
+ _clearEvents() {
101
+ this.el.removeEventListener("click", this._onMouseClick_);
102
+ this._onMouseClick_ = undefined;
103
+ }
104
+ }
105
+
106
+ export { Button }
@@ -0,0 +1,57 @@
1
+ 'use strict';
2
+
3
+ import { Events } from '../Events.js';
4
+
5
+ class ButtonGroup {
6
+ constructor(options) {
7
+ this._events = new Events(["change", ...(options.eventList || [])]);
8
+
9
+ this._buttons = options.buttons
10
+ for (let i = 0; i < this._buttons.length; i++) {
11
+ this._bindButton(this._buttons[i]);
12
+ }
13
+ }
14
+
15
+ on(eventName, callback, sender) {
16
+ this._events.on(eventName, callback, sender);
17
+ }
18
+
19
+ off(eventName, callback) {
20
+ this._events.off(eventName, callback);
21
+ }
22
+
23
+ _bindButton(button) {
24
+ button.on("change", this._onChange, this);
25
+ }
26
+
27
+ add(button) {
28
+ this._buttons.push(button);
29
+ this._bindButton(button);
30
+ }
31
+
32
+ _onChange(isActive, btn) {
33
+ if (isActive) {
34
+ btn.preventClick = true;
35
+ for (let i = 0; i < this._buttons.length; i++) {
36
+ let bi = this._buttons[i];
37
+ if (!bi.isEqual(btn)) {
38
+ bi.setActive(false);
39
+ bi.preventClick = false;
40
+ }
41
+ }
42
+ this._events.dispatch(this._events.change, btn);
43
+ }
44
+ }
45
+
46
+ remove(button) {
47
+ for (let i = 0; i < this._buttons.length; i++) {
48
+ if (this._buttons[i].isEqual(button)) {
49
+ this._buttons.splice(i);
50
+ button.off("change", this._onChange);
51
+ return;
52
+ }
53
+ }
54
+ }
55
+ }
56
+
57
+ export { ButtonGroup }