itowns 2.44.3-next.4 → 2.44.3-next.41

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 (217) 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 -608
  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 -726
  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/TileGeometry.js +0 -40
  100. package/lib/Core/TileMesh.js +0 -108
  101. package/lib/Core/View.js +0 -1109
  102. package/lib/Layer/C3DTilesLayer.js +0 -455
  103. package/lib/Layer/ColorLayer.js +0 -128
  104. package/lib/Layer/CopcLayer.js +0 -58
  105. package/lib/Layer/ElevationLayer.js +0 -107
  106. package/lib/Layer/EntwinePointTileLayer.js +0 -64
  107. package/lib/Layer/FeatureGeometryLayer.js +0 -63
  108. package/lib/Layer/GeoidLayer.js +0 -80
  109. package/lib/Layer/GeometryLayer.js +0 -202
  110. package/lib/Layer/InfoLayer.js +0 -64
  111. package/lib/Layer/LabelLayer.js +0 -452
  112. package/lib/Layer/Layer.js +0 -304
  113. package/lib/Layer/LayerUpdateState.js +0 -89
  114. package/lib/Layer/LayerUpdateStrategy.js +0 -80
  115. package/lib/Layer/OGC3DTilesLayer.js +0 -387
  116. package/lib/Layer/OrientedImageLayer.js +0 -222
  117. package/lib/Layer/PointCloudLayer.js +0 -359
  118. package/lib/Layer/Potree2Layer.js +0 -164
  119. package/lib/Layer/PotreeLayer.js +0 -65
  120. package/lib/Layer/RasterLayer.js +0 -27
  121. package/lib/Layer/ReferencingLayerProperties.js +0 -62
  122. package/lib/Layer/TiledGeometryLayer.js +0 -403
  123. package/lib/Loader/LASLoader.js +0 -193
  124. package/lib/Loader/Potree2BrotliLoader.js +0 -261
  125. package/lib/Loader/Potree2Loader.js +0 -207
  126. package/lib/Main.js +0 -115
  127. package/lib/MainBundle.js +0 -4
  128. package/lib/Parser/B3dmParser.js +0 -174
  129. package/lib/Parser/CameraCalibrationParser.js +0 -94
  130. package/lib/Parser/GDFParser.js +0 -72
  131. package/lib/Parser/GTXParser.js +0 -75
  132. package/lib/Parser/GeoJsonParser.js +0 -212
  133. package/lib/Parser/GpxParser.js +0 -25
  134. package/lib/Parser/ISGParser.js +0 -71
  135. package/lib/Parser/KMLParser.js +0 -25
  136. package/lib/Parser/LASParser.js +0 -137
  137. package/lib/Parser/MapBoxUrlParser.js +0 -83
  138. package/lib/Parser/PntsParser.js +0 -131
  139. package/lib/Parser/Potree2BinParser.js +0 -92
  140. package/lib/Parser/PotreeBinParser.js +0 -106
  141. package/lib/Parser/PotreeCinParser.js +0 -29
  142. package/lib/Parser/ShapefileParser.js +0 -78
  143. package/lib/Parser/VectorTileParser.js +0 -202
  144. package/lib/Parser/XbilParser.js +0 -108
  145. package/lib/Parser/deprecated/LegacyGLTFLoader.js +0 -1386
  146. package/lib/Parser/iGLTFLoader.js +0 -168
  147. package/lib/Process/3dTilesProcessing.js +0 -304
  148. package/lib/Process/FeatureProcessing.js +0 -76
  149. package/lib/Process/LayeredMaterialNodeProcessing.js +0 -221
  150. package/lib/Process/ObjectRemovalHelper.js +0 -97
  151. package/lib/Process/handlerNodeError.js +0 -23
  152. package/lib/Provider/3dTilesProvider.js +0 -149
  153. package/lib/Provider/DataSourceProvider.js +0 -8
  154. package/lib/Provider/Fetcher.js +0 -229
  155. package/lib/Provider/PointCloudProvider.js +0 -45
  156. package/lib/Provider/TileProvider.js +0 -16
  157. package/lib/Provider/URLBuilder.js +0 -105
  158. package/lib/Renderer/Camera.js +0 -281
  159. package/lib/Renderer/Color.js +0 -56
  160. package/lib/Renderer/ColorLayersOrdering.js +0 -115
  161. package/lib/Renderer/CommonMaterial.js +0 -31
  162. package/lib/Renderer/Label2DRenderer.js +0 -190
  163. package/lib/Renderer/LayeredMaterial.js +0 -243
  164. package/lib/Renderer/OBB.js +0 -153
  165. package/lib/Renderer/OrientedImageCamera.js +0 -118
  166. package/lib/Renderer/OrientedImageMaterial.js +0 -167
  167. package/lib/Renderer/PointsMaterial.js +0 -485
  168. package/lib/Renderer/RasterTile.js +0 -209
  169. package/lib/Renderer/RenderMode.js +0 -31
  170. package/lib/Renderer/Shader/ShaderChunk.js +0 -160
  171. package/lib/Renderer/Shader/ShaderUtils.js +0 -47
  172. package/lib/Renderer/SphereHelper.js +0 -23
  173. package/lib/Renderer/WebXR.js +0 -51
  174. package/lib/Renderer/c3DEngine.js +0 -214
  175. package/lib/Source/C3DTilesGoogleSource.js +0 -74
  176. package/lib/Source/C3DTilesIonSource.js +0 -54
  177. package/lib/Source/C3DTilesSource.js +0 -30
  178. package/lib/Source/CopcSource.js +0 -115
  179. package/lib/Source/EntwinePointTileSource.js +0 -62
  180. package/lib/Source/FileSource.js +0 -189
  181. package/lib/Source/OGC3DTilesGoogleSource.js +0 -29
  182. package/lib/Source/OGC3DTilesIonSource.js +0 -34
  183. package/lib/Source/OGC3DTilesSource.js +0 -21
  184. package/lib/Source/OrientedImageSource.js +0 -59
  185. package/lib/Source/Potree2Source.js +0 -167
  186. package/lib/Source/PotreeSource.js +0 -82
  187. package/lib/Source/Source.js +0 -223
  188. package/lib/Source/TMSSource.js +0 -143
  189. package/lib/Source/VectorTilesSource.js +0 -178
  190. package/lib/Source/WFSSource.js +0 -165
  191. package/lib/Source/WMSSource.js +0 -130
  192. package/lib/Source/WMTSSource.js +0 -86
  193. package/lib/ThreeExtended/capabilities/WebGL.js +0 -69
  194. package/lib/ThreeExtended/libs/ktx-parse.module.js +0 -470
  195. package/lib/ThreeExtended/libs/zstddec.module.js +0 -29
  196. package/lib/ThreeExtended/loaders/DDSLoader.js +0 -200
  197. package/lib/ThreeExtended/loaders/DRACOLoader.js +0 -399
  198. package/lib/ThreeExtended/loaders/GLTFLoader.js +0 -2876
  199. package/lib/ThreeExtended/loaders/KTX2Loader.js +0 -625
  200. package/lib/ThreeExtended/utils/BufferGeometryUtils.js +0 -846
  201. package/lib/ThreeExtended/utils/WorkerPool.js +0 -70
  202. package/lib/Utils/CameraUtils.js +0 -555
  203. package/lib/Utils/DEMUtils.js +0 -350
  204. package/lib/Utils/FeaturesUtils.js +0 -156
  205. package/lib/Utils/Gradients.js +0 -16
  206. package/lib/Utils/OrientationUtils.js +0 -457
  207. package/lib/Utils/ThreeUtils.js +0 -115
  208. package/lib/Utils/gui/C3DTilesStyle.js +0 -216
  209. package/lib/Utils/gui/Main.js +0 -7
  210. package/lib/Utils/gui/Minimap.js +0 -154
  211. package/lib/Utils/gui/Navigation.js +0 -245
  212. package/lib/Utils/gui/Scale.js +0 -107
  213. package/lib/Utils/gui/Searchbar.js +0 -234
  214. package/lib/Utils/gui/Widget.js +0 -80
  215. package/lib/Utils/placeObjectOnGround.js +0 -137
  216. package/lib/Worker/LASLoaderWorker.js +0 -19
  217. package/lib/Worker/Potree2Worker.js +0 -21
@@ -1,221 +0,0 @@
1
- import { chooseNextLevelToFetch } from "../Layer/LayerUpdateStrategy.js";
2
- import LayerUpdateState from "../Layer/LayerUpdateState.js";
3
- import handlingError from "./handlerNodeError.js";
4
- function materialCommandQueuePriorityFunction(material) {
5
- // We know that 'node' is visible because commands can only be
6
- // issued for visible nodes.
7
- // TODO: need priorization of displayed nodes
8
- // Then prefer displayed node over non-displayed one
9
- return material.visible ? 100 : 10;
10
- }
11
- function refinementCommandCancellationFn(cmd) {
12
- if (!cmd.requester.parent || !cmd.requester.material) {
13
- return true;
14
- }
15
- // Cancel the command if the tile already has a better texture.
16
- // This is only needed for elevation layers, because we may have several
17
- // concurrent layers but we can only use one texture.
18
- if (cmd.layer.isElevationLayer && cmd.requester.material.getElevationLayer() && cmd.targetLevel <= cmd.requester.material.getElevationLayer().level) {
19
- return true;
20
- }
21
-
22
- // Cancel the command if the layer was removed between command scheduling and command execution
23
- if (!cmd.requester.layerUpdateState[cmd.layer.id] || !cmd.layer.source._featuresCaches[cmd.layer.crs]) {
24
- return true;
25
- }
26
- return !cmd.requester.material.visible;
27
- }
28
- function buildCommand(view, layer, extentsSource, extentsDestination, requester) {
29
- return {
30
- view,
31
- layer,
32
- extentsSource,
33
- extentsDestination,
34
- requester,
35
- priority: materialCommandQueuePriorityFunction(requester.material),
36
- earlyDropFunction: refinementCommandCancellationFn
37
- };
38
- }
39
- export function updateLayeredMaterialNodeImagery(context, layer, node, parent) {
40
- const material = node.material;
41
- if (!parent || !material) {
42
- return;
43
- }
44
- const extentsDestination = node.getExtentsByProjection(layer.crs);
45
- const zoom = extentsDestination[0].zoom;
46
- if (zoom > layer.zoom.max || zoom < layer.zoom.min) {
47
- return;
48
- }
49
- let nodeLayer = material.getLayer(layer.id);
50
-
51
- // Initialisation
52
- if (node.layerUpdateState[layer.id] === undefined) {
53
- node.layerUpdateState[layer.id] = new LayerUpdateState();
54
- if (!layer.source.extentInsideLimit(node.extent, zoom)) {
55
- // we also need to check that tile's parent doesn't have a texture for this layer,
56
- // because even if this tile is outside of the layer, it could inherit it's
57
- // parent texture
58
- if (!(!layer.noTextureParentOutsideLimit && parent.material && parent.material.getLayer && parent.material.getLayer(layer.id))) {
59
- node.layerUpdateState[layer.id].noMoreUpdatePossible();
60
- return;
61
- } // ok, we're going to inherit our parent's texture
62
- }
63
- if (!nodeLayer) {
64
- // Create new raster node
65
- nodeLayer = layer.setupRasterNode(node);
66
-
67
- // Init the node by parent
68
- const parentLayer = parent.material?.getLayer(layer.id);
69
- nodeLayer.initFromParent(parentLayer, extentsDestination);
70
- }
71
-
72
- // Proposed new process, two separate processes:
73
- // * FIRST PASS: initNodeXXXFromParent and get out of the function
74
- // * SECOND PASS: Fetch best texture
75
-
76
- // The two-step allows you to filter out unnecessary requests
77
- // Indeed in the second pass, their state (not visible or not displayed) can block them to fetch
78
- if (nodeLayer.level >= layer.source.zoom.min) {
79
- context.view.notifyChange(node, false);
80
- return;
81
- }
82
- }
83
-
84
- // Node is hidden, no need to update it
85
- if (!material.visible) {
86
- return;
87
- }
88
-
89
- // An update is pending / or impossible -> abort
90
- if (!layer.visible || !node.layerUpdateState[layer.id].canTryUpdate()) {
91
- return;
92
- }
93
- if (nodeLayer.level >= extentsDestination[0].zoom) {
94
- // default decision method
95
- node.layerUpdateState[layer.id].noMoreUpdatePossible();
96
- return;
97
- }
98
-
99
- // is fetching data from this layer disabled?
100
- if (layer.frozen) {
101
- return;
102
- }
103
- const failureParams = node.layerUpdateState[layer.id].failureParams;
104
- const destinationLevel = extentsDestination[0].zoom || node.level;
105
- const targetLevel = chooseNextLevelToFetch(layer.updateStrategy.type, node, destinationLevel, nodeLayer.level, layer, failureParams);
106
- if (!layer.source.isVectorSource && targetLevel <= nodeLayer.level || targetLevel > destinationLevel) {
107
- if (failureParams.lowestLevelError != Infinity) {
108
- // this is the highest level found in case of error.
109
- node.layerUpdateState[layer.id].noMoreUpdatePossible();
110
- }
111
- return;
112
- } else if (!layer.source.extentInsideLimit(node.extent, targetLevel)) {
113
- node.layerUpdateState[layer.id].noData({
114
- targetLevel
115
- });
116
- context.view.notifyChange(node, false);
117
- return;
118
- }
119
- const extentsSource = extentsDestination.map(e => e.tiledExtentParent(targetLevel));
120
- node.layerUpdateState[layer.id].newTry();
121
- const command = buildCommand(context.view, layer, extentsSource, extentsDestination, node);
122
- return context.scheduler.execute(command).then(result => {
123
- // Does nothing if the layer has been removed while command was being or waiting to be executed
124
- if (!node.layerUpdateState[layer.id]) {
125
- return;
126
- }
127
- // TODO: Handle error : result is undefined in provider. throw error
128
- const pitchs = extentsDestination.map((ext, i) => ext.offsetToParent(result[i].extent, nodeLayer.offsetScales[i]));
129
- nodeLayer.setTextures(result, pitchs);
130
- node.layerUpdateState[layer.id].success();
131
- }, err => handlingError(err, node, layer, targetLevel, context.view));
132
- }
133
- export function updateLayeredMaterialNodeElevation(context, layer, node, parent) {
134
- const material = node.material;
135
- if (!parent || !material) {
136
- return;
137
- }
138
-
139
- // TODO: we need either
140
- // - compound or exclusive layers
141
- // - support for multiple elevation layers
142
-
143
- // Elevation is currently handled differently from color layers.
144
- // This is caused by a LayeredMaterial limitation: only 1 elevation texture
145
- // can be used (where a tile can have N textures x M layers)
146
- const extentsDestination = node.getExtentsByProjection(layer.crs);
147
- const zoom = extentsDestination[0].zoom;
148
- if (zoom > layer.zoom.max || zoom < layer.zoom.min) {
149
- return;
150
- }
151
- // Init elevation layer, and inherit from parent if possible
152
- let nodeLayer = material.getElevationLayer();
153
- if (!nodeLayer) {
154
- nodeLayer = layer.setupRasterNode(node);
155
- }
156
- if (node.layerUpdateState[layer.id] === undefined) {
157
- node.layerUpdateState[layer.id] = new LayerUpdateState();
158
- const parentLayer = parent.material?.getLayer(layer.id);
159
- nodeLayer.initFromParent(parentLayer, extentsDestination);
160
- if (nodeLayer.level >= layer.source.zoom.min) {
161
- context.view.notifyChange(node, false);
162
- return;
163
- }
164
- }
165
-
166
- // Possible conditions to *not* update the elevation texture
167
- if (layer.frozen || !material.visible || !node.layerUpdateState[layer.id].canTryUpdate()) {
168
- return;
169
- }
170
- const failureParams = node.layerUpdateState[layer.id].failureParams;
171
- const targetLevel = chooseNextLevelToFetch(layer.updateStrategy.type, node, extentsDestination[0].zoom, nodeLayer.level, layer, failureParams);
172
- if (targetLevel <= nodeLayer.level || targetLevel > extentsDestination[0].zoom) {
173
- node.layerUpdateState[layer.id].noMoreUpdatePossible();
174
- return;
175
- } else if (!layer.source.extentInsideLimit(node.extent, targetLevel)) {
176
- node.layerUpdateState[layer.id].noData({
177
- targetLevel
178
- });
179
- context.view.notifyChange(node, false);
180
- return;
181
- }
182
- const extentsSource = extentsDestination.map(e => e.tiledExtentParent(targetLevel));
183
- node.layerUpdateState[layer.id].newTry();
184
- const command = buildCommand(context.view, layer, extentsSource, extentsDestination, node);
185
- return context.scheduler.execute(command).then(result => {
186
- // Does nothing if the layer has been removed while command was being or waiting to be executed
187
- if (!node.layerUpdateState[layer.id]) {
188
- return;
189
- }
190
-
191
- // Do not apply the new texture if its level is < than the current
192
- // one. This is only needed for elevation layers, because we may
193
- // have several concurrent layers but we can only use one texture.
194
- if (targetLevel <= nodeLayer.level) {
195
- node.layerUpdateState[layer.id].noMoreUpdatePossible();
196
- return;
197
- }
198
- const pitchs = extentsDestination.map((ext, i) => ext.offsetToParent(result[i].extent, nodeLayer.offsetScales[i]));
199
- nodeLayer.setTextures(result, pitchs);
200
- node.layerUpdateState[layer.id].success();
201
- }, err => handlingError(err, node, layer, targetLevel, context.view));
202
- }
203
- export function removeLayeredMaterialNodeLayer(layerId) {
204
- /**
205
- * @param {TileMesh} node - The node to udpate.
206
- */
207
- return function (node) {
208
- if (node.material?.removeLayer) {
209
- if (node.material.elevationLayerIds.indexOf(layerId) > -1) {
210
- node.setBBoxZ({
211
- min: 0,
212
- max: 0
213
- });
214
- }
215
- node.material.removeLayer(layerId);
216
- }
217
- if (node.layerUpdateState && node.layerUpdateState[layerId]) {
218
- delete node.layerUpdateState[layerId];
219
- }
220
- };
221
- }
@@ -1,97 +0,0 @@
1
- function disposeSingleMaterialAndTextures(material) {
2
- material.dispose();
3
- // dispose textures
4
- for (const key of Object.keys(material)) {
5
- const val = material[key];
6
- if (val && val.isTexture) {
7
- val.dispose();
8
- }
9
- }
10
- }
11
- export default {
12
- /**
13
- * Cleanup obj to release three.js allocated resources
14
- * @param {Object3D} obj object to release
15
- */
16
- cleanup(obj) {
17
- obj.layer = null;
18
-
19
- // THREE.Scene dispose function displays a deprecation message
20
- if (!obj.isScene && typeof obj.dispose === 'function') {
21
- obj.dispose();
22
- } else {
23
- if (obj.geometry) {
24
- obj.geometry.dispose();
25
- // the Object Removal Helper causes inconsistencies
26
- // when it assigns null to a geometry present in the Cache.
27
- // Actually, the cache can provide a mesh whose geometry is null.
28
- // see https://github.com/iTowns/itowns/issues/869
29
- // obj.geometry = null;
30
- }
31
- if (obj.material) {
32
- if (Array.isArray(obj.material)) {
33
- for (const material of obj.material) {
34
- disposeSingleMaterialAndTextures(material);
35
- }
36
- } else {
37
- disposeSingleMaterialAndTextures(obj.material);
38
- }
39
- }
40
- obj.dispatchEvent({
41
- type: 'dispose'
42
- });
43
- }
44
- },
45
- /**
46
- * Remove obj's children belonging to a layer.
47
- * Neither obj nor its children will be disposed!
48
- * @param {Layer} layer The layer that objects must belong to. Other object are ignored
49
- * @param {Object3D} obj The Object3D we want to clean
50
- * @return {Array} an array of removed Object3D from obj (not including the recursive removals)
51
- */
52
- removeChildren(layer, obj) {
53
- const toRemove = obj.children.filter(c => (c.layer && c.layer.id) === layer.id);
54
- obj.remove(...toRemove);
55
- return toRemove;
56
- },
57
- /**
58
- * Remove an obj and all its children belonging to a layer and only cleanup the obj (and not its children).
59
- * obj will be disposed but its children **won't**!
60
- * @param {Layer} layer The layer that objects must belong to. Other object are ignored
61
- * @param {Object3D} obj The Object3D we want to clean
62
- * @return {Array} an array of removed Object3D from obj (not including the recursive removals)
63
- */
64
- removeChildrenAndCleanup(layer, obj) {
65
- const toRemove = obj.children.filter(c => (c.layer && c.layer.id) === layer.id);
66
- obj.remove(...toRemove);
67
- if (obj.layer === layer) {
68
- this.cleanup(obj);
69
- }
70
- return toRemove;
71
- },
72
- /**
73
- * Recursively remove an obj and all its children belonging to a layer.
74
- * All removed obj will have their geometry/material disposed.
75
- * @param {Layer} layer The layer that objects must belong to. Other object are ignored
76
- * @param {Object3D} obj The Object3D we want to clean
77
- * @return {Array} an array of removed Object3D from obj (not including the recursive removals)
78
- */
79
- removeChildrenAndCleanupRecursively(layer, obj) {
80
- // Objects are filtered by id because the obj hierarchy may also contain labels that have been added as childs
81
- // of the objects which have their own removal logic
82
- let toRemove = obj.children.filter(c => c.layer && c.layer.id === layer.id);
83
- const linked = obj.link && obj.link[layer.id];
84
- if (linked?.children.length) {
85
- toRemove = toRemove.concat(linked.children);
86
- delete obj.link[layer.id];
87
- }
88
- for (const c of toRemove) {
89
- this.removeChildrenAndCleanupRecursively(layer, c);
90
- }
91
- obj.remove(...toRemove);
92
- if (obj.layer && obj.layer.id === layer.id) {
93
- this.cleanup(obj);
94
- }
95
- return toRemove;
96
- }
97
- };
@@ -1,23 +0,0 @@
1
- // max retry loading before changing the status to definitiveError
2
- const MAX_RETRY = 4;
3
- export default function handlingError(err, node, layer, targetLevel, view) {
4
- // Cancel error handling if the layer was removed between command scheduling and its execution
5
- if (!node.layerUpdateState[layer.id]) {
6
- return;
7
- }
8
- if (err.isCancelledCommandException) {
9
- node.layerUpdateState[layer.id].success();
10
- } else if (err instanceof SyntaxError) {
11
- node.layerUpdateState[layer.id].failure(0, true);
12
- } else {
13
- const definitiveError = node.layerUpdateState[layer.id].errorCount > MAX_RETRY;
14
- node.layerUpdateState[layer.id].failure(Date.now(), definitiveError, {
15
- targetLevel
16
- });
17
- if (!definitiveError) {
18
- window.setTimeout(() => {
19
- view.notifyChange(node, false);
20
- }, node.layerUpdateState[layer.id].secondsUntilNextTry() * 1000);
21
- }
22
- }
23
- }
@@ -1,149 +0,0 @@
1
- import * as THREE from 'three';
2
- import B3dmParser from "../Parser/B3dmParser.js";
3
- import PntsParser from "../Parser/PntsParser.js";
4
- import Fetcher from "./Fetcher.js";
5
- import ReferLayerProperties from "../Layer/ReferencingLayerProperties.js";
6
- import PointsMaterial from "../Renderer/PointsMaterial.js";
7
- // A bit weird but temporary until we remove this deprecated provider. Mainly to benefit from the enableDracoLoader and enableKtx2Loader
8
- // methods.
9
- import { itownsGLTFLoader } from "../Layer/OGC3DTilesLayer.js";
10
- const utf8Decoder = new TextDecoder();
11
- function b3dmToMesh(data, layer, url) {
12
- const urlBase = THREE.LoaderUtils.extractUrlBase(url);
13
- const options = {
14
- gltfUpAxis: layer.tileset.asset.gltfUpAxis,
15
- urlBase,
16
- overrideMaterials: layer.overrideMaterials,
17
- doNotPatchMaterial: layer.doNotPatchMaterial,
18
- registeredExtensions: layer.registeredExtensions,
19
- layer
20
- };
21
- return B3dmParser.parse(data, options).then(result => {
22
- const batchTable = result.batchTable;
23
- // object3d is actually a THREE.Scene
24
- const object3d = result.gltf.scene;
25
- return {
26
- batchTable,
27
- object3d
28
- };
29
- });
30
- }
31
- function gltfToMesh(data, layer, url) {
32
- const urlBase = THREE.LoaderUtils.extractUrlBase(url);
33
- return itownsGLTFLoader.parseAsync(data, urlBase).then(result => ({
34
- object3d: result.scene
35
- }));
36
- }
37
- function pntsParse(data, layer) {
38
- return PntsParser.parse(data, layer.registeredExtensions).then(result => {
39
- const material = layer.material ? layer.material.clone() : new PointsMaterial({
40
- size: 1,
41
- mode: layer.pntsMode,
42
- shape: layer.pntsShape,
43
- classificationScheme: layer.classification,
44
- sizeMode: layer.pntsSizeMode,
45
- minAttenuatedSize: layer.pntsMinAttenuatedSize,
46
- maxAttenuatedSize: layer.pntsMaxAttenuatedSize
47
- });
48
-
49
- // refer material properties in the layer so when layers opacity and visibility is updated, the material is
50
- // automatically updated
51
- ReferLayerProperties(material, layer);
52
-
53
- // creation points with geometry and material
54
- const points = new THREE.Points(result.point.geometry, material);
55
- if (result.point.offset) {
56
- points.position.copy(result.point.offset);
57
- }
58
- return {
59
- object3d: points,
60
- batchTable: result.batchTable
61
- };
62
- });
63
- }
64
- export function configureTile(tile, layer, metadata, parent) {
65
- tile.frustumCulled = false;
66
- tile.layer = layer;
67
-
68
- // parse metadata
69
- if (metadata.transform) {
70
- tile.applyMatrix4(metadata.transform);
71
- }
72
- tile.geometricError = metadata.geometricError;
73
- tile.tileId = metadata.tileId;
74
- if (metadata.refine) {
75
- tile.additiveRefinement = metadata.refine.toUpperCase() === 'ADD';
76
- } else {
77
- tile.additiveRefinement = parent ? parent.additiveRefinement : false;
78
- }
79
- tile.viewerRequestVolume = metadata.viewerRequestVolume;
80
- tile.boundingVolume = metadata.boundingVolume;
81
- tile.updateMatrixWorld();
82
- }
83
- function executeCommand(command) {
84
- const layer = command.layer;
85
- const metadata = command.metadata;
86
- const tile = new THREE.Object3D();
87
- configureTile(tile, layer, metadata, command.requester);
88
- // Patch for supporting 3D Tiles pre 1.0 (metadata.content.url) and 1.0
89
- // (metadata.content.uri)
90
- const path = metadata.content && (metadata.content.url || metadata.content.uri);
91
- const setLayer = obj => {
92
- obj.userData.metadata = metadata;
93
- obj.layer = layer;
94
- };
95
- if (path) {
96
- // Check if we have relative or absolute url (with tileset's lopocs for example)
97
- let url = path.startsWith('http') ? path : metadata.baseURL + path;
98
- if (layer.source.isC3DTilesGoogleSource) {
99
- url = layer.source.getTileUrl(url);
100
- }
101
- const supportedFormats = {
102
- b3dm: b3dmToMesh,
103
- pnts: pntsParse,
104
- gltf: gltfToMesh
105
- };
106
- return Fetcher.arrayBuffer(url, layer.source.networkOptions).then(result => {
107
- if (result !== undefined) {
108
- let func;
109
- const magic = utf8Decoder.decode(new Uint8Array(result, 0, 4));
110
- if (magic[0] === '{') {
111
- result = JSON.parse(utf8Decoder.decode(new Uint8Array(result)));
112
- // Another specifics of 3D tiles from Google: tilesets in tilesets are required from the root base
113
- // url and not from their parent base url
114
- const newPrefix = layer.source.isC3DTilesGoogleSource ? layer.source.baseUrl : url.slice(0, url.lastIndexOf('/') + 1);
115
- layer.tileset.extendTileset(result, metadata.tileId, newPrefix, layer.registeredExtensions);
116
- } else if (magic == 'b3dm') {
117
- func = supportedFormats.b3dm;
118
- } else if (magic == 'pnts') {
119
- layer.hasPnts = true;
120
- func = supportedFormats.pnts;
121
- } else if (magic == 'glTF') {
122
- func = supportedFormats.gltf;
123
- } else {
124
- return Promise.reject(`Unsupported magic code ${magic}`);
125
- }
126
- if (func) {
127
- // TODO: request should be delayed if there is a viewerRequestVolume
128
- return func(result, layer, url).then(content => {
129
- tile.content = content.object3d;
130
- if (content.batchTable) {
131
- tile.batchTable = content.batchTable;
132
- }
133
- tile.add(content.object3d);
134
- tile.traverse(setLayer);
135
- return tile;
136
- });
137
- }
138
- }
139
- tile.traverse(setLayer);
140
- return tile;
141
- });
142
- } else {
143
- tile.traverse(setLayer);
144
- return Promise.resolve(tile);
145
- }
146
- }
147
- export default {
148
- executeCommand
149
- };
@@ -1,8 +0,0 @@
1
- export default {
2
- executeCommand(command) {
3
- const layer = command.layer;
4
- const src = command.extentsSource;
5
- const dst = command.extentsDestination || src;
6
- return Promise.all(src.map((from, i) => layer.getData(from, dst[i])));
7
- }
8
- };