itowns 2.44.3-next.40 → 2.44.3-next.42

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 (199) hide show
  1. package/README.md +3 -129
  2. package/package.json +16 -72
  3. package/CODING.md +0 -120
  4. package/CONTRIBUTING.md +0 -150
  5. package/CONTRIBUTORS.md +0 -56
  6. package/LICENSE.md +0 -44
  7. package/changelog.md +0 -1361
  8. package/dist/455.js +0 -2
  9. package/dist/455.js.map +0 -1
  10. package/dist/debug.js +0 -3
  11. package/dist/debug.js.LICENSE.txt +0 -13
  12. package/dist/debug.js.map +0 -1
  13. package/dist/itowns.js +0 -3
  14. package/dist/itowns.js.LICENSE.txt +0 -5
  15. package/dist/itowns.js.map +0 -1
  16. package/dist/itowns_lasparser.js +0 -2
  17. package/dist/itowns_lasparser.js.map +0 -1
  18. package/dist/itowns_lasworker.js +0 -2
  19. package/dist/itowns_lasworker.js.map +0 -1
  20. package/dist/itowns_potree2worker.js +0 -2
  21. package/dist/itowns_potree2worker.js.map +0 -1
  22. package/dist/itowns_widgets.js +0 -2
  23. package/dist/itowns_widgets.js.map +0 -1
  24. package/examples/.eslintrc.cjs +0 -35
  25. package/examples/jsm/.eslintrc.cjs +0 -38
  26. package/lib/Controls/FirstPersonControls.js +0 -308
  27. package/lib/Controls/FlyControls.js +0 -175
  28. package/lib/Controls/GlobeControls.js +0 -1179
  29. package/lib/Controls/PlanarControls.js +0 -1025
  30. package/lib/Controls/StateControl.js +0 -432
  31. package/lib/Controls/StreetControls.js +0 -392
  32. package/lib/Converter/Feature2Mesh.js +0 -614
  33. package/lib/Converter/Feature2Texture.js +0 -175
  34. package/lib/Converter/convertToTile.js +0 -70
  35. package/lib/Converter/textureConverter.js +0 -43
  36. package/lib/Core/3DTiles/C3DTBatchTable.js +0 -131
  37. package/lib/Core/3DTiles/C3DTBatchTableHierarchyExtension.js +0 -96
  38. package/lib/Core/3DTiles/C3DTBoundingVolume.js +0 -157
  39. package/lib/Core/3DTiles/C3DTExtensions.js +0 -97
  40. package/lib/Core/3DTiles/C3DTFeature.js +0 -110
  41. package/lib/Core/3DTiles/C3DTilesEnums.js +0 -20
  42. package/lib/Core/3DTiles/C3DTileset.js +0 -99
  43. package/lib/Core/3DTiles/utils/BinaryPropertyAccessor.js +0 -100
  44. package/lib/Core/AnimationPlayer.js +0 -142
  45. package/lib/Core/CopcNode.js +0 -174
  46. package/lib/Core/Deprecated/Undeprecator.js +0 -74
  47. package/lib/Core/EntwinePointTileNode.js +0 -126
  48. package/lib/Core/Feature.js +0 -489
  49. package/lib/Core/Geographic/CoordStars.js +0 -80
  50. package/lib/Core/Geographic/Coordinates.js +0 -331
  51. package/lib/Core/Geographic/Crs.js +0 -170
  52. package/lib/Core/Geographic/Extent.js +0 -550
  53. package/lib/Core/Geographic/GeoidGrid.js +0 -109
  54. package/lib/Core/Label.js +0 -222
  55. package/lib/Core/MainLoop.js +0 -209
  56. package/lib/Core/Math/Ellipsoid.js +0 -185
  57. package/lib/Core/Picking.js +0 -255
  58. package/lib/Core/PointCloudNode.js +0 -42
  59. package/lib/Core/Potree2Node.js +0 -206
  60. package/lib/Core/Potree2PointAttributes.js +0 -139
  61. package/lib/Core/PotreeNode.js +0 -101
  62. package/lib/Core/Prefab/Globe/Atmosphere.js +0 -295
  63. package/lib/Core/Prefab/Globe/GlobeLayer.js +0 -152
  64. package/lib/Core/Prefab/Globe/GlobeTileBuilder.js +0 -111
  65. package/lib/Core/Prefab/Globe/SkyShader.js +0 -78
  66. package/lib/Core/Prefab/GlobeView.js +0 -156
  67. package/lib/Core/Prefab/Planar/PlanarLayer.js +0 -59
  68. package/lib/Core/Prefab/Planar/PlanarTileBuilder.js +0 -72
  69. package/lib/Core/Prefab/PlanarView.js +0 -62
  70. package/lib/Core/Prefab/TileBuilder.js +0 -82
  71. package/lib/Core/Prefab/computeBufferTileGeometry.js +0 -248
  72. package/lib/Core/Scheduler/Cache.js +0 -17
  73. package/lib/Core/Scheduler/CancelledCommandException.js +0 -15
  74. package/lib/Core/Scheduler/Scheduler.js +0 -294
  75. package/lib/Core/Style.js +0 -660
  76. package/lib/Core/StyleOptions.js +0 -486
  77. package/lib/Core/System/Capabilities.js +0 -63
  78. package/lib/Core/Tile/Tile.js +0 -207
  79. package/lib/Core/Tile/TileGrid.js +0 -49
  80. package/lib/Core/TileGeometry.js +0 -124
  81. package/lib/Core/TileMesh.js +0 -108
  82. package/lib/Core/View.js +0 -1116
  83. package/lib/Layer/C3DTilesLayer.js +0 -459
  84. package/lib/Layer/ColorLayer.js +0 -154
  85. package/lib/Layer/CopcLayer.js +0 -63
  86. package/lib/Layer/ElevationLayer.js +0 -139
  87. package/lib/Layer/EntwinePointTileLayer.js +0 -71
  88. package/lib/Layer/FeatureGeometryLayer.js +0 -77
  89. package/lib/Layer/GeoidLayer.js +0 -80
  90. package/lib/Layer/GeometryLayer.js +0 -233
  91. package/lib/Layer/InfoLayer.js +0 -64
  92. package/lib/Layer/LabelLayer.js +0 -470
  93. package/lib/Layer/Layer.js +0 -335
  94. package/lib/Layer/LayerUpdateState.js +0 -89
  95. package/lib/Layer/LayerUpdateStrategy.js +0 -80
  96. package/lib/Layer/OGC3DTilesLayer.js +0 -543
  97. package/lib/Layer/OrientedImageLayer.js +0 -228
  98. package/lib/Layer/PointCloudLayer.js +0 -405
  99. package/lib/Layer/Potree2Layer.js +0 -171
  100. package/lib/Layer/PotreeLayer.js +0 -72
  101. package/lib/Layer/RasterLayer.js +0 -37
  102. package/lib/Layer/ReferencingLayerProperties.js +0 -62
  103. package/lib/Layer/TiledGeometryLayer.js +0 -459
  104. package/lib/Loader/LASLoader.js +0 -193
  105. package/lib/Loader/Potree2BrotliLoader.js +0 -261
  106. package/lib/Loader/Potree2Loader.js +0 -207
  107. package/lib/Main.js +0 -115
  108. package/lib/MainBundle.js +0 -4
  109. package/lib/Parser/B3dmParser.js +0 -174
  110. package/lib/Parser/CameraCalibrationParser.js +0 -94
  111. package/lib/Parser/GDFParser.js +0 -72
  112. package/lib/Parser/GTXParser.js +0 -75
  113. package/lib/Parser/GeoJsonParser.js +0 -212
  114. package/lib/Parser/GpxParser.js +0 -25
  115. package/lib/Parser/ISGParser.js +0 -71
  116. package/lib/Parser/KMLParser.js +0 -25
  117. package/lib/Parser/LASParser.js +0 -137
  118. package/lib/Parser/MapBoxUrlParser.js +0 -83
  119. package/lib/Parser/PntsParser.js +0 -131
  120. package/lib/Parser/Potree2BinParser.js +0 -92
  121. package/lib/Parser/PotreeBinParser.js +0 -106
  122. package/lib/Parser/PotreeCinParser.js +0 -29
  123. package/lib/Parser/ShapefileParser.js +0 -78
  124. package/lib/Parser/VectorTileParser.js +0 -215
  125. package/lib/Parser/XbilParser.js +0 -120
  126. package/lib/Parser/deprecated/LegacyGLTFLoader.js +0 -1386
  127. package/lib/Parser/iGLTFLoader.js +0 -168
  128. package/lib/Process/3dTilesProcessing.js +0 -304
  129. package/lib/Process/FeatureProcessing.js +0 -76
  130. package/lib/Process/LayeredMaterialNodeProcessing.js +0 -221
  131. package/lib/Process/ObjectRemovalHelper.js +0 -97
  132. package/lib/Process/handlerNodeError.js +0 -23
  133. package/lib/Provider/3dTilesProvider.js +0 -149
  134. package/lib/Provider/DataSourceProvider.js +0 -8
  135. package/lib/Provider/Fetcher.js +0 -233
  136. package/lib/Provider/PointCloudProvider.js +0 -45
  137. package/lib/Provider/TileProvider.js +0 -16
  138. package/lib/Provider/URLBuilder.js +0 -116
  139. package/lib/Renderer/Camera.js +0 -281
  140. package/lib/Renderer/Color.js +0 -56
  141. package/lib/Renderer/ColorLayersOrdering.js +0 -115
  142. package/lib/Renderer/CommonMaterial.js +0 -31
  143. package/lib/Renderer/Label2DRenderer.js +0 -192
  144. package/lib/Renderer/LayeredMaterial.js +0 -243
  145. package/lib/Renderer/OBB.js +0 -151
  146. package/lib/Renderer/OrientedImageCamera.js +0 -118
  147. package/lib/Renderer/OrientedImageMaterial.js +0 -167
  148. package/lib/Renderer/PointsMaterial.js +0 -485
  149. package/lib/Renderer/RasterTile.js +0 -208
  150. package/lib/Renderer/RenderMode.js +0 -31
  151. package/lib/Renderer/Shader/ShaderChunk.js +0 -160
  152. package/lib/Renderer/Shader/ShaderUtils.js +0 -47
  153. package/lib/Renderer/SphereHelper.js +0 -17
  154. package/lib/Renderer/WebXR.js +0 -51
  155. package/lib/Renderer/c3DEngine.js +0 -214
  156. package/lib/Source/C3DTilesGoogleSource.js +0 -74
  157. package/lib/Source/C3DTilesIonSource.js +0 -54
  158. package/lib/Source/C3DTilesSource.js +0 -30
  159. package/lib/Source/CopcSource.js +0 -126
  160. package/lib/Source/EntwinePointTileSource.js +0 -72
  161. package/lib/Source/FileSource.js +0 -188
  162. package/lib/Source/OGC3DTilesGoogleSource.js +0 -29
  163. package/lib/Source/OGC3DTilesIonSource.js +0 -34
  164. package/lib/Source/OGC3DTilesSource.js +0 -21
  165. package/lib/Source/OrientedImageSource.js +0 -59
  166. package/lib/Source/Potree2Source.js +0 -167
  167. package/lib/Source/PotreeSource.js +0 -82
  168. package/lib/Source/Source.js +0 -203
  169. package/lib/Source/TMSSource.js +0 -144
  170. package/lib/Source/VectorTilesSource.js +0 -182
  171. package/lib/Source/WFSSource.js +0 -170
  172. package/lib/Source/WMSSource.js +0 -168
  173. package/lib/Source/WMTSSource.js +0 -92
  174. package/lib/ThreeExtended/capabilities/WebGL.js +0 -69
  175. package/lib/ThreeExtended/libs/ktx-parse.module.js +0 -506
  176. package/lib/ThreeExtended/libs/zstddec.module.js +0 -29
  177. package/lib/ThreeExtended/loaders/DDSLoader.js +0 -200
  178. package/lib/ThreeExtended/loaders/DRACOLoader.js +0 -400
  179. package/lib/ThreeExtended/loaders/GLTFLoader.js +0 -2879
  180. package/lib/ThreeExtended/loaders/KTX2Loader.js +0 -709
  181. package/lib/ThreeExtended/math/ColorSpaces.js +0 -59
  182. package/lib/ThreeExtended/utils/BufferGeometryUtils.js +0 -846
  183. package/lib/ThreeExtended/utils/WorkerPool.js +0 -70
  184. package/lib/Utils/CameraUtils.js +0 -555
  185. package/lib/Utils/DEMUtils.js +0 -350
  186. package/lib/Utils/FeaturesUtils.js +0 -156
  187. package/lib/Utils/Gradients.js +0 -16
  188. package/lib/Utils/OrientationUtils.js +0 -457
  189. package/lib/Utils/ThreeUtils.js +0 -115
  190. package/lib/Utils/gui/C3DTilesStyle.js +0 -215
  191. package/lib/Utils/gui/Main.js +0 -7
  192. package/lib/Utils/gui/Minimap.js +0 -154
  193. package/lib/Utils/gui/Navigation.js +0 -245
  194. package/lib/Utils/gui/Scale.js +0 -107
  195. package/lib/Utils/gui/Searchbar.js +0 -234
  196. package/lib/Utils/gui/Widget.js +0 -80
  197. package/lib/Utils/placeObjectOnGround.js +0 -136
  198. package/lib/Worker/LASLoaderWorker.js +0 -19
  199. package/lib/Worker/Potree2Worker.js +0 -21
@@ -1,470 +0,0 @@
1
- import * as THREE from 'three';
2
- import LayerUpdateState from "./LayerUpdateState.js";
3
- import ObjectRemovalHelper from "../Process/ObjectRemovalHelper.js";
4
- import GeometryLayer from "./GeometryLayer.js";
5
- import Coordinates from "../Core/Geographic/Coordinates.js";
6
- import Extent from "../Core/Geographic/Extent.js";
7
- import Label from "../Core/Label.js";
8
- import { readExpression, StyleContext } from "../Core/Style.js";
9
- import { ScreenGrid } from "../Renderer/Label2DRenderer.js";
10
- const context = new StyleContext();
11
- const coord = new Coordinates('EPSG:4326', 0, 0, 0);
12
- const _extent = new Extent('EPSG:4326', 0, 0, 0, 0);
13
- const nodeDimensions = new THREE.Vector2();
14
- const westNorthNode = new THREE.Vector2();
15
- const labelPosition = new THREE.Vector2();
16
-
17
- /**
18
- * DomNode is a node in the tree data structure of labels divs.
19
- *
20
- * @class DomNode
21
- */
22
- class DomNode {
23
- #domVisibility = false;
24
- constructor() {
25
- this.dom = document.createElement('div');
26
- this.dom.style.display = 'none';
27
- this.visible = true;
28
- }
29
- get visible() {
30
- return this.#domVisibility;
31
- }
32
- set visible(v) {
33
- if (v !== this.#domVisibility) {
34
- this.#domVisibility = v;
35
- this.dom.style.display = v ? 'block' : 'none';
36
- }
37
- }
38
- hide() {
39
- this.visible = false;
40
- }
41
- show() {
42
- this.visible = true;
43
- }
44
- add(node) {
45
- this.dom.append(node.dom);
46
- }
47
- }
48
-
49
- /**
50
- * LabelsNode is node of tree data structure for LabelLayer.
51
- * the node is made of dom elements and 3D labels.
52
- *
53
- * @class LabelsNode
54
- */
55
- class LabelsNode extends THREE.Group {
56
- constructor(node) {
57
- super();
58
- // attached node parent
59
- this.nodeParent = node;
60
- // When this is set, it calculates the position in that frame and resets this property to false.
61
- this.needsUpdate = true;
62
- }
63
-
64
- // instanciate dom elements
65
- initializeDom() {
66
- // create root dom
67
- this.domElements = new DomNode();
68
- // create labels container dom
69
- this.domElements.labels = new DomNode();
70
- this.domElements.add(this.domElements.labels);
71
- this.domElements.labels.dom.style.opacity = '0';
72
- }
73
-
74
- // add node label
75
- // add label 3d and dom label
76
- addLabel(label) {
77
- // add 3d object
78
- this.add(label);
79
-
80
- // add dom label
81
- this.domElements.labels.dom.append(label.content);
82
-
83
- // Batch update the dimensions of labels all at once to avoid
84
- // redraw for at least this tile.
85
- label.initDimensions();
86
-
87
- // add horizon culling point if it's necessary
88
- // the horizon culling is applied to nodes that trace the horizon which
89
- // corresponds to the low zoom node, that's why the culling is done for a zoom lower than 4.
90
- if (this.nodeParent.layer.isGlobeLayer && this.nodeParent.level < 4) {
91
- label.horizonCullingPoint = new THREE.Vector3();
92
- }
93
- }
94
-
95
- // remove node label
96
- // remove label 3d and dom label
97
- removeLabel(label) {
98
- // remove 3d object
99
- this.remove(label);
100
-
101
- // remove dom label
102
- this.domElements.labels.dom.removeChild(label.content);
103
- }
104
-
105
- // update position if it's necessary
106
- updatePosition(label) {
107
- if (this.needsUpdate) {
108
- // update elevation from elevation layer.
109
- if (this.needsAltitude) {
110
- label.updateElevationFromLayer(this.nodeParent.layer, [this.nodeParent]);
111
- }
112
-
113
- // update elevation label
114
- label.update3dPosition(this.nodeParent.layer.crs);
115
-
116
- // update horizon culling
117
- label.updateHorizonCullingPoint();
118
- }
119
- }
120
-
121
- // return labels count
122
- count() {
123
- return this.children.length;
124
- }
125
- get labels() {
126
- return this.children;
127
- }
128
- }
129
-
130
- /**
131
- * A layer to handle a bunch of `Label`. This layer can be created on its own,
132
- * but it is better to use the option `addLabelLayer` on another `Layer` to let
133
- * it work with it (see the `vector_tile_raster_2d` example). Supported for Points features, not yet
134
- * for Lines and Polygons features.
135
- *
136
- * @property {boolean} isLabelLayer - Used to checkout whether this layer is a
137
- * LabelLayer. Default is true. You should not change this, as it is used
138
- * internally for optimisation.
139
- */
140
- class LabelLayer extends GeometryLayer {
141
- #filterGrid = (() => new ScreenGrid())();
142
- /**
143
- * @extends Layer
144
- *
145
- * @param {string} id - The id of the layer, that should be unique. It is
146
- * not mandatory, but an error will be emitted if this layer is added a
147
- * {@link View} that already has a layer going by that id.
148
- * @param {Object} [config] - Optional configuration, all elements in it
149
- * will be merged as is in the layer. For example, if the configuration
150
- * contains three elements `name, protocol, extent`, these elements will be
151
- * available using `layer.name` or something else depending on the property
152
- * name.
153
- * @param {boolean} [config.performance=true] - remove labels that have no chance of being visible.
154
- * if the `config.performance` is set to true then the performance is improved
155
- * proportional to the amount of unnecessary labels that are removed.
156
- * Indeed, even in the best case, labels will never be displayed. By example, if there's many labels.
157
- * We advise you to not use this option if your data is optimized.
158
- * @param {domElement|function} config.domElement - An HTML domElement.
159
- * If set, all `Label` displayed within the current instance `LabelLayer`
160
- * will be this domElement.
161
- *
162
- * It can be set to a method. The single parameter of this method gives the
163
- * properties of each feature on which a `Label` is created.
164
- *
165
- * If set, all the parameters set in the `LabelLayer` `Style.text` will be overridden,
166
- * except for the `Style.text.anchor` parameter which can help place the label.
167
- */
168
- constructor(id) {
169
- let config = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
170
- const {
171
- domElement,
172
- performance = true,
173
- forceClampToTerrain = false,
174
- margin,
175
- ...geometryConfig
176
- } = config;
177
- super(id, config.object3d || new THREE.Group(), geometryConfig);
178
- this.isLabelLayer = true;
179
- this.domElement = new DomNode();
180
- this.domElement.show();
181
- this.domElement.dom.id = `itowns-label-${this.id}`;
182
- this.buildExtent = true;
183
- this.crs = config.source.crs;
184
- this.performance = performance;
185
- this.forceClampToTerrain = forceClampToTerrain;
186
- this.margin = margin;
187
- this.toHide = new THREE.Group();
188
- this.labelDomelement = domElement;
189
-
190
- // The margin property defines a space around each label that cannot be occupied by another label.
191
- // For example, if some labelLayer has a margin value of 5, there will be at least 10 pixels
192
- // between each labels of the layer
193
- // TODO : this property should be moved to Style after refactoring style properties structure
194
- this.margin = config.margin;
195
- }
196
- get visible() {
197
- return super.visible;
198
- }
199
- set visible(value) {
200
- super.visible = value;
201
- if (value) {
202
- this.domElement?.show();
203
- } else {
204
- this.domElement?.hide();
205
- }
206
- }
207
- get submittedLabelNodes() {
208
- return this.object3d.children;
209
- }
210
-
211
- /**
212
- * Reads each {@link FeatureGeometry} that contains label configuration, and
213
- * creates the corresponding {@link Label}. To create a `Label`, a geometry
214
- * needs to have a `label` object with at least a few properties:
215
- * - `content`, which refers to `Label#content`
216
- * - `position`, which refers to `Label#position`
217
- * - (optional) `config`, containing miscellaneous configuration for the
218
- * label
219
- *
220
- * The geometry (or its parent Feature) needs to have a Style set.
221
- *
222
- * @param {FeatureCollection} data - The FeatureCollection to read the
223
- * labels from.
224
- * @param {Extent|Tile} extentOrTile
225
- *
226
- * @return {Label[]} An array containing all the created labels.
227
- */
228
- convert(data, extentOrTile) {
229
- const labels = [];
230
-
231
- // Converting the extent now is faster for further operation
232
- if (extentOrTile.isExtent) {
233
- extentOrTile.as(data.crs, _extent);
234
- } else {
235
- extentOrTile.toExtent(data.crs, _extent);
236
- }
237
- coord.crs = data.crs;
238
- context.setZoom(extentOrTile.zoom);
239
- data.features.forEach(f => {
240
- if (f.style.text) {
241
- if (Object.keys(f.style.text).length === 0) {
242
- return;
243
- }
244
- }
245
- context.setFeature(f);
246
- const featureField = f.style?.text?.field;
247
-
248
- // determine if altitude style is specified by the user
249
- const altitudeStyle = f.style?.point?.base_altitude;
250
- const isDefaultElevationStyle = altitudeStyle instanceof Function && altitudeStyle.name == 'baseAltitudeDefault';
251
-
252
- // determine if the altitude needs update with ElevationLayer
253
- labels.needsAltitude = labels.needsAltitude || this.forceClampToTerrain === true || isDefaultElevationStyle && !f.hasRawElevationData;
254
- f.geometries.forEach(g => {
255
- context.setGeometry(g);
256
- this.style.setContext(context);
257
- const layerField = this.style.text && this.style.text.field;
258
- const geometryField = g.properties.style && g.properties.style.text && g.properties.style.text.field;
259
- let content;
260
- if (this.labelDomelement) {
261
- content = readExpression(this.labelDomelement, context);
262
- } else if (!geometryField && !featureField && !layerField) {
263
- // Check if there is an icon, with no text
264
- if (!(g.properties.style && (g.properties.style.icon.source || g.properties.style.icon.key)) && !(f.style && f.style.icon && (f.style.icon.source || f.style.icon.key)) && !(this.style.icon && (this.style.icon.source || this.style.icon.key))) {
265
- return;
266
- }
267
- }
268
- if (this.style.zoom.min > this.style.context.zoom || this.style.zoom.max <= this.style.context.zoom) {
269
- return;
270
- }
271
-
272
- // NOTE: this only works fine for POINT.
273
- // It needs more work for LINE and POLYGON as we currently only use the first point of the entity
274
-
275
- g.indices.forEach(i => {
276
- coord.setFromArray(f.vertices, g.size * i.offset);
277
- // Transform coordinate to data.crs projection
278
- coord.applyMatrix4(data.matrixWorld);
279
- if (!_extent.isPointInside(coord)) {
280
- return;
281
- }
282
- const label = new Label(content, coord.clone(), this.style);
283
- label.layerId = this.id;
284
- label.order = f.order;
285
- label.padding = this.margin || label.padding;
286
- labels.push(label);
287
- });
288
- });
289
- });
290
- return labels;
291
- }
292
-
293
- // placeholder
294
- preUpdate(context, sources) {
295
- if (sources.has(this.parent)) {
296
- this.object3d.clear();
297
- this.#filterGrid.width = this.parent.maxScreenSizeNode * 0.5;
298
- this.#filterGrid.height = this.parent.maxScreenSizeNode * 0.5;
299
- this.#filterGrid.resize();
300
- }
301
- }
302
- #submitToRendering(labelsNode) {
303
- this.object3d.add(labelsNode);
304
- }
305
- #disallowToRendering(labelsNode) {
306
- this.toHide.add(labelsNode);
307
- }
308
- #findClosestDomElement(node) {
309
- if (node.parent?.isTileMesh) {
310
- return node.parent.link[this.id]?.domElements || this.#findClosestDomElement(node.parent);
311
- } else {
312
- return this.domElement;
313
- }
314
- }
315
- #hasLabelChildren(object) {
316
- return object.children.every(c => c.layerUpdateState && c.layerUpdateState[this.id]?.hasFinished());
317
- }
318
-
319
- // Remove all labels invisible with pre-culling with screen grid
320
- // We use the screen grid with maximum size of node on screen
321
- #removeCulledLabels(node) {
322
- // copy labels array
323
- const labels = node.children.slice();
324
-
325
- // reset filter
326
- this.#filterGrid.reset();
327
-
328
- // sort labels by order
329
- labels.sort((a, b) => b.order - a.order);
330
- labels.forEach(label => {
331
- // get node dimensions
332
- node.nodeParent.extent.planarDimensions(nodeDimensions);
333
- coord.crs = node.nodeParent.extent.crs;
334
-
335
- // get west/north node coordinates
336
- coord.setFromValues(node.nodeParent.extent.west, node.nodeParent.extent.north, 0).toVector3(westNorthNode);
337
-
338
- // get label position
339
- coord.copy(label.coordinates).as(node.nodeParent.extent.crs, coord).toVector3(labelPosition);
340
-
341
- // transform label position to local node system
342
- labelPosition.sub(westNorthNode);
343
- labelPosition.y += nodeDimensions.y;
344
- labelPosition.divide(nodeDimensions).multiplyScalar(this.#filterGrid.width);
345
-
346
- // update the projected position to transform to local filter grid sytem
347
- label.updateProjectedPosition(labelPosition.x, labelPosition.y);
348
-
349
- // use screen grid to remove all culled labels
350
- if (!this.#filterGrid.insert(label)) {
351
- node.removeLabel(label);
352
- }
353
- });
354
- }
355
- update(context, layer, node, parent) {
356
- if (!parent && node.link[layer.id]) {
357
- // if node has been removed dispose three.js resource
358
- ObjectRemovalHelper.removeChildrenAndCleanupRecursively(this, node);
359
- return;
360
- }
361
- const labelsNode = node.link[layer.id] || new LabelsNode(node);
362
- node.link[layer.id] = labelsNode;
363
- if (this.frozen || !node.visible || !this.visible) {
364
- return;
365
- }
366
- if (!node.material.visible && this.#hasLabelChildren(node)) {
367
- return this.#disallowToRendering(labelsNode);
368
- }
369
- const extentsDestination = node.getExtentsByProjection(this.source.crs) || [node.extent];
370
- const zoomDest = extentsDestination[0].zoom;
371
- if (zoomDest < layer.zoom.min || zoomDest > layer.zoom.max) {
372
- return this.#disallowToRendering(labelsNode);
373
- }
374
- if (node.layerUpdateState[this.id] === undefined) {
375
- node.layerUpdateState[this.id] = new LayerUpdateState();
376
- }
377
- if (!this.source.extentInsideLimit(node.extent, zoomDest)) {
378
- node.layerUpdateState[this.id].noMoreUpdatePossible();
379
- return;
380
- } else if (this.#hasLabelChildren(node.parent)) {
381
- if (!node.material.visible) {
382
- labelsNode.needsUpdate = true;
383
- }
384
- this.#submitToRendering(labelsNode);
385
- return;
386
- } else if (!node.layerUpdateState[this.id].canTryUpdate()) {
387
- return;
388
- }
389
- node.layerUpdateState[this.id].newTry();
390
- const command = {
391
- layer: this,
392
- extentsSource: extentsDestination,
393
- view: context.view,
394
- requester: node
395
- };
396
- return context.scheduler.execute(command).then(result => {
397
- if (!result) {
398
- return;
399
- }
400
- const renderer = context.view.mainLoop.gfxEngine.label2dRenderer;
401
- labelsNode.initializeDom();
402
- this.#findClosestDomElement(node).add(labelsNode.domElements);
403
- result.forEach(labels => {
404
- // Clean if there isnt' parent
405
- if (!node.parent) {
406
- labels.forEach(l => {
407
- ObjectRemovalHelper.removeChildrenAndCleanupRecursively(this, l);
408
- renderer.removeLabelDOM(l);
409
- });
410
- return;
411
- }
412
- labelsNode.needsAltitude = labelsNode.needsAltitude || labels.needsAltitude;
413
-
414
- // Add all labels for this tile at once to batch it
415
- labels.forEach(label => {
416
- if (node.extent.isPointInside(label.coordinates)) {
417
- labelsNode.addLabel(label);
418
- }
419
- });
420
- });
421
- if (labelsNode.count()) {
422
- labelsNode.domElements.labels.hide();
423
- labelsNode.domElements.labels.dom.style.opacity = '1.0';
424
- node.addEventListener('show', () => labelsNode.domElements.labels.show());
425
- node.addEventListener('hidden', () => this.#disallowToRendering(labelsNode));
426
-
427
- // Necessary event listener, to remove any Label attached to
428
- node.addEventListener('removed', () => this.removeNodeDomElement(node));
429
- if (labelsNode.needsAltitude && node.material.getElevationLayer()) {
430
- node.material.getElevationLayer().addEventListener('rasterElevationLevelChanged', () => {
431
- labelsNode.needsUpdate = true;
432
- });
433
- }
434
- if (this.performance) {
435
- this.#removeCulledLabels(labelsNode);
436
- }
437
- }
438
- node.layerUpdateState[this.id].noMoreUpdatePossible();
439
- });
440
- }
441
- removeLabelsFromNodeRecursive(node) {
442
- node.children.forEach(c => {
443
- if (c.link[this.id]) {
444
- delete c.link[this.id];
445
- }
446
- this.removeLabelsFromNodeRecursive(c);
447
- });
448
- this.removeNodeDomElement(node);
449
- }
450
- removeNodeDomElement(node) {
451
- if (node.link[this.id]?.domElements) {
452
- const child = node.link[this.id].domElements.dom;
453
- child.parentElement.removeChild(child);
454
- delete node.link[this.id].domElements;
455
- }
456
- }
457
-
458
- /**
459
- * All layer's objects and domElements are removed.
460
- * @param {boolean} [clearCache=false] Whether to clear the layer cache or not
461
- */
462
- delete(clearCache) {
463
- if (clearCache) {
464
- this.cache.clear();
465
- }
466
- this.domElement.dom.parentElement.removeChild(this.domElement.dom);
467
- this.parent.level0Nodes.forEach(obj => this.removeLabelsFromNodeRecursive(obj));
468
- }
469
- }
470
- export default LabelLayer;