itowns 2.44.3-next.8 → 2.45.0

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