@cognite/reveal 3.2.0 → 4.0.0-dev.20221026

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 (212) hide show
  1. package/3cc243f31966a3b9fa0e.worker.js.LICENSE.txt +24 -0
  2. package/README.md +30 -1
  3. package/extensions/datasource.d.ts +1 -1
  4. package/extensions/datasource.js +2 -2
  5. package/extensions/datasource.js.map +1 -0
  6. package/index.d.ts +5 -2
  7. package/index.js +2 -2
  8. package/index.js.LICENSE.txt +8 -0
  9. package/index.js.map +1 -0
  10. package/package.json +6 -9
  11. package/packages/360-images/index.d.ts +6 -0
  12. package/packages/360-images/src/Image360Entity.d.ts +44 -0
  13. package/packages/360-images/src/Image360EntityFactory.d.ts +13 -0
  14. package/packages/360-images/src/Image360Facade.d.ts +20 -0
  15. package/packages/360-images/src/Image360Icon.d.ts +16 -0
  16. package/packages/api/src/api-helpers/Image360ApiHelper.d.ts +28 -0
  17. package/packages/api/src/public/RevealManager.d.ts +2 -3
  18. package/packages/api/src/public/migration/Cognite3DViewer.d.ts +44 -19
  19. package/packages/api/src/public/migration/types.d.ts +16 -14
  20. package/packages/api/src/public/types.d.ts +2 -1
  21. package/packages/api/src/storage/RevealManagerHelper.d.ts +1 -1
  22. package/packages/cad-geometry-loaders/index.d.ts +0 -1
  23. package/packages/cad-geometry-loaders/src/CadManager.d.ts +2 -2
  24. package/packages/cad-geometry-loaders/src/CadModelUpdateHandler.d.ts +1 -1
  25. package/packages/cad-geometry-loaders/src/InternalRevealCadOptions.d.ts +0 -6
  26. package/packages/cad-geometry-loaders/src/createCadManager.d.ts +3 -3
  27. package/packages/cad-geometry-loaders/src/sector/SectorLoader.d.ts +1 -2
  28. package/packages/cad-geometry-loaders/src/sector/culling/computeSectorCost.d.ts +0 -1
  29. package/packages/cad-geometry-loaders/src/sector/culling/takensectors/index.d.ts +0 -1
  30. package/packages/cad-model/src/CadModelFactory.d.ts +1 -2
  31. package/packages/cad-model/src/wrappers/CadNode.d.ts +2 -9
  32. package/packages/cad-model/src/wrappers/Cognite3DModel.d.ts +2 -2
  33. package/packages/cad-parsers/index.d.ts +2 -7
  34. package/packages/cad-parsers/src/cad/types.d.ts +0 -12
  35. package/packages/cad-parsers/src/metadata/CadModelMetadata.d.ts +1 -1
  36. package/packages/cad-parsers/src/metadata/CadModelMetadataRepository.d.ts +1 -1
  37. package/packages/cad-parsers/src/metadata/types.d.ts +0 -1
  38. package/packages/cad-parsers/src/utilities/computeBoundingBoxFromAttributes.d.ts +5 -1
  39. package/packages/cad-styling/index.d.ts +2 -1
  40. package/packages/cad-styling/src/CdfNodeCollectionBase.d.ts +20 -0
  41. package/packages/cad-styling/src/NodeCollectionDeserializer.d.ts +4 -9
  42. package/packages/cad-styling/src/NodeIdNodeCollection.d.ts +30 -0
  43. package/packages/cad-styling/src/PropertyFilterNodeCollection.d.ts +3 -15
  44. package/packages/cad-styling/src/SinglePropertyFilterNodeCollection.d.ts +2 -14
  45. package/packages/cad-styling/src/TreeIndexNodeCollection.d.ts +2 -0
  46. package/packages/camera-manager/index.d.ts +2 -0
  47. package/packages/camera-manager/src/ComboControls.d.ts +1 -3
  48. package/packages/camera-manager/src/Keyboard.d.ts +2 -1
  49. package/packages/camera-manager/src/ProxyCameraManager.d.ts +25 -0
  50. package/packages/camera-manager/src/StationaryCameraManager.d.ts +27 -0
  51. package/packages/data-providers/index.d.ts +21 -0
  52. package/packages/data-providers/src/Image360Provider.d.ts +6 -0
  53. package/packages/data-providers/src/ModelDataProvider.d.ts +21 -0
  54. package/packages/{modeldata-api → data-providers}/src/ModelIdentifier.d.ts +0 -0
  55. package/packages/{modeldata-api → data-providers}/src/ModelMetadataProvider.d.ts +0 -0
  56. package/packages/data-providers/src/PointCloudStylableObjectProvider.d.ts +8 -0
  57. package/packages/data-providers/src/image-360-data-providers/Cdf360ImageEventProvider.d.ts +16 -0
  58. package/packages/data-providers/src/image-360-data-providers/Local360ImageProvider.d.ts +8 -0
  59. package/packages/{modeldata-api/src → data-providers/src/metadata-providers}/CdfModelMetadataProvider.d.ts +3 -3
  60. package/packages/{modeldata-api/src → data-providers/src/metadata-providers}/LocalModelMetadataProvider.d.ts +3 -3
  61. package/packages/{modeldata-api/src → data-providers/src/model-data-providers}/CdfModelDataProvider.d.ts +1 -1
  62. package/packages/{modeldata-api/src → data-providers/src/model-data-providers}/LocalModelDataProvider.d.ts +1 -1
  63. package/packages/{modeldata-api/src → data-providers/src/model-identifiers}/CdfModelIdentifier.d.ts +1 -1
  64. package/packages/{modeldata-api/src → data-providers/src/model-identifiers}/LocalModelIdentifier.d.ts +1 -1
  65. package/packages/data-providers/src/pointcloud-stylable-object-providers/CdfPointCloudStylableObjectProvider.d.ts +14 -0
  66. package/packages/data-providers/src/pointcloud-stylable-object-providers/DummyPointCloudStylableObjectProvider.d.ts +9 -0
  67. package/packages/data-providers/src/pointcloud-stylable-object-providers/StylableObject.d.ts +12 -0
  68. package/packages/data-providers/src/pointcloud-stylable-object-providers/cdfAnnotationsToObjects.d.ts +5 -0
  69. package/packages/data-providers/src/pointcloud-stylable-object-providers/types.d.ts +19 -0
  70. package/packages/data-providers/src/types.d.ts +44 -0
  71. package/packages/{modeldata-api/src → data-providers/src/utilities}/applyDefaultModelTransformation.d.ts +1 -1
  72. package/packages/{modeldata-api/src/utilities.d.ts → data-providers/src/utilities/fetchWithStatusCheck.d.ts} +0 -2
  73. package/packages/data-source/src/CdfDataSource.d.ts +1 -1
  74. package/packages/data-source/src/DataSource.d.ts +1 -1
  75. package/packages/data-source/src/LocalDataSource.d.ts +1 -1
  76. package/packages/metrics/src/types.d.ts +1 -1
  77. package/packages/model-base/src/MetadataRepository.d.ts +1 -1
  78. package/packages/pointcloud-styling/index.d.ts +7 -0
  79. package/packages/pointcloud-styling/src/AnnotationIdPointCloudObjectCollection.d.ts +13 -0
  80. package/packages/pointcloud-styling/src/PointCloudAppearance.d.ts +10 -0
  81. package/packages/pointcloud-styling/src/PointCloudObjectCollection.d.ts +23 -0
  82. package/packages/pointcloud-styling/src/StyledPointCloudObjectCollection.d.ts +13 -0
  83. package/packages/pointclouds/index.d.ts +4 -1
  84. package/packages/pointclouds/src/CognitePointCloudModel.d.ts +68 -17
  85. package/packages/pointclouds/src/PointCloudFactory.d.ts +9 -4
  86. package/packages/pointclouds/src/PointCloudIntersection.d.ts +4 -0
  87. package/packages/pointclouds/src/PointCloudManager.d.ts +6 -5
  88. package/packages/pointclouds/src/PointCloudMetadata.d.ts +2 -2
  89. package/packages/pointclouds/src/PointCloudMetadataRepository.d.ts +1 -1
  90. package/packages/pointclouds/src/PointCloudNode.d.ts +17 -8
  91. package/packages/pointclouds/src/PointCloudPickingHandler.d.ts +4 -0
  92. package/packages/pointclouds/src/PotreeNodeWrapper.d.ts +28 -15
  93. package/packages/pointclouds/src/PotreePnextLoader.d.ts +1 -1
  94. package/packages/pointclouds/src/classificationsProviders/IPointClassificationsProvider.d.ts +8 -0
  95. package/packages/pointclouds/src/classificationsProviders/LocalPointClassificationsProvider.d.ts +9 -0
  96. package/packages/pointclouds/src/classificationsProviders/UrlPointClassificationsProvider.d.ts +12 -0
  97. package/packages/pointclouds/src/constants.d.ts +5 -0
  98. package/packages/pointclouds/src/createPointCloudManager.d.ts +4 -2
  99. package/packages/pointclouds/src/decomposeStylableObjects.d.ts +5 -0
  100. package/packages/pointclouds/src/potree-three-loader/Potree.d.ts +5 -10
  101. package/packages/pointclouds/src/potree-three-loader/geometry/PointCloudEptGeometry.d.ts +7 -12
  102. package/packages/pointclouds/src/potree-three-loader/geometry/PointCloudEptGeometryNode.d.ts +2 -1
  103. package/packages/pointclouds/src/potree-three-loader/index.d.ts +0 -1
  104. package/packages/pointclouds/src/potree-three-loader/loading/ClassificationInfo.d.ts +15 -0
  105. package/packages/pointclouds/src/potree-three-loader/loading/EptBinaryLoader.d.ts +6 -3
  106. package/packages/pointclouds/src/potree-three-loader/loading/EptJson.d.ts +25 -0
  107. package/packages/pointclouds/src/potree-three-loader/loading/EptLoader.d.ts +2 -2
  108. package/packages/pointclouds/src/potree-three-loader/loading/ILoader.d.ts +1 -1
  109. package/packages/pointclouds/src/potree-three-loader/tree/PointCloudOctree.d.ts +4 -4
  110. package/packages/pointclouds/src/potree-three-loader/tree/PointCloudOctreePickerHelper.d.ts +1 -1
  111. package/packages/pointclouds/src/potree-three-loader/types/IPotree.d.ts +2 -1
  112. package/packages/pointclouds/src/potree-three-loader/utils/createObjectIdMaps.d.ts +6 -0
  113. package/packages/pointclouds/src/potree-three-loader/utils/utils.d.ts +4 -0
  114. package/packages/pointclouds/src/potree-three-loader/workers/assignPointsToObjectsWithWasm.d.ts +5 -0
  115. package/packages/pointclouds/src/potree-three-loader/workers/eptBinaryDecoder.worker.d.ts +7 -18
  116. package/packages/pointclouds/src/potree-three-loader/workers/parseEpt.d.ts +4 -0
  117. package/packages/pointclouds/src/potree-three-loader/workers/types.d.ts +33 -0
  118. package/packages/pointclouds/wasm/index.d.ts +18 -0
  119. package/packages/rendering/index.d.ts +7 -3
  120. package/packages/rendering/src/PointCloudMaterialManager.d.ts +19 -0
  121. package/packages/rendering/src/pointcloud-rendering/PointCloudMaterial.d.ts +121 -0
  122. package/packages/rendering/src/pointcloud-rendering/PointCloudObjectAppearanceTexture.d.ts +30 -0
  123. package/packages/rendering/src/pointcloud-rendering/PointCloudObjectIdMaps.d.ts +7 -0
  124. package/packages/rendering/src/pointcloud-rendering/classification.d.ts +2 -0
  125. package/packages/{pointclouds/src/potree-three-loader/rendering → rendering/src/pointcloud-rendering}/constants.d.ts +7 -5
  126. package/packages/rendering/src/pointcloud-rendering/enums.d.ts +24 -0
  127. package/packages/{pointclouds/src/potree-three-loader/rendering → rendering/src/pointcloud-rendering}/gradients/SpectralGradient.d.ts +0 -0
  128. package/packages/rendering/src/pointcloud-rendering/index.d.ts +8 -0
  129. package/packages/rendering/src/pointcloud-rendering/texture-generation.d.ts +8 -0
  130. package/packages/{pointclouds/src/potree-three-loader/rendering → rendering/src/pointcloud-rendering}/types.d.ts +9 -1
  131. package/packages/rendering/src/render-passes/PointCloudEffectsPass.d.ts +3 -8
  132. package/packages/rendering/src/render-passes/PostProcessingPass.d.ts +1 -0
  133. package/packages/rendering/src/render-passes/types.d.ts +12 -11
  134. package/packages/rendering/src/render-pipeline-providers/DefaultRenderPipelineProvider.d.ts +2 -1
  135. package/packages/rendering/src/render-pipeline-providers/PointCloudRenderPipelineProvider.d.ts +2 -1
  136. package/packages/rendering/src/rendering/shaders.d.ts +4 -0
  137. package/packages/rendering/src/rendering/types.d.ts +0 -1
  138. package/packages/rendering/src/utilities/renderUtilities.d.ts +4 -2
  139. package/packages/sector-loader/index.d.ts +0 -1
  140. package/packages/sector-loader/src/GltfSectorLoader.d.ts +1 -1
  141. package/packages/sector-loader/src/GltfSectorRepository.d.ts +1 -1
  142. package/packages/tools/index.d.ts +0 -3
  143. package/packages/tools/src/Cognite3DViewerToolBase.d.ts +1 -1
  144. package/packages/tools/src/HtmlOverlay/HtmlOverlayTool.d.ts +1 -1
  145. package/packages/tools/src/Measurement/MeasurementTool.d.ts +1 -1
  146. package/packages/utilities/index.d.ts +7 -4
  147. package/packages/utilities/src/SceneHandler.d.ts +6 -6
  148. package/packages/utilities/src/events/types.d.ts +9 -1
  149. package/packages/utilities/src/linalg.d.ts +11 -0
  150. package/packages/utilities/src/shapes/Box.d.ts +12 -0
  151. package/packages/utilities/src/shapes/CompositeShape.d.ts +13 -0
  152. package/packages/utilities/src/shapes/Cylinder.d.ts +14 -0
  153. package/packages/utilities/src/shapes/ISerializableShape.d.ts +11 -0
  154. package/packages/utilities/src/shapes/IShape.d.ts +9 -0
  155. package/packages/utilities/src/shapes/SerializableBox.d.ts +8 -0
  156. package/packages/utilities/src/shapes/SerializableCompositeShape.d.ts +7 -0
  157. package/packages/utilities/src/shapes/SerializableCylinder.d.ts +10 -0
  158. package/packages/utilities/src/shapes/index.d.ts +11 -0
  159. package/packages/utilities/src/three/createDistinctColors.d.ts +5 -0
  160. package/packages/utilities/src/three/fromThreeVector3.d.ts +5 -0
  161. package/packages/utilities/src/workers/workerize-transferable/index.d.ts +7 -0
  162. package/packages/utilities/src/workers/workerize-transferable/message-types.d.ts +4 -0
  163. package/packages/utilities/src/workers/workerize-transferable/on-main.d.ts +13 -0
  164. package/packages/utilities/src/workers/workerize-transferable/on-worker.d.ts +14 -0
  165. package/packages/utilities/src/workers/workerize-transferable/util.d.ts +10 -0
  166. package/packages/utilities/src/worldToViewport.d.ts +4 -0
  167. package/tools.js +2 -2
  168. package/tools.js.map +1 -0
  169. package/eptBinaryDecoder.worker.map +0 -1
  170. package/extensions/datasource.map +0 -1
  171. package/index.map +0 -1
  172. package/packages/cad-geometry-loaders/src/sector/culling/ByVisibilityGpuSectorCuller.d.ts +0 -51
  173. package/packages/cad-geometry-loaders/src/sector/culling/OrderSectorsByVisibilityCoverage.d.ts +0 -106
  174. package/packages/cad-geometry-loaders/src/sector/culling/RenderAlreadyLoadedGeometryProvider.d.ts +0 -11
  175. package/packages/cad-geometry-loaders/src/sector/culling/createV8SectorCuller.d.ts +0 -7
  176. package/packages/cad-geometry-loaders/src/sector/culling/takensectors/TakenV8SectorMap.d.ts +0 -17
  177. package/packages/cad-geometry-loaders/src/sector/culling/takensectors/TakenV8SectorTree.d.ts +0 -24
  178. package/packages/cad-geometry-loaders/src/utilities/rxOperations.d.ts +0 -6
  179. package/packages/cad-model/src/batching/InstancedMeshManager.d.ts +0 -20
  180. package/packages/cad-parsers/src/cad/CadSectorParser.d.ts +0 -15
  181. package/packages/cad-parsers/src/cad/filterInstanceMesh.d.ts +0 -6
  182. package/packages/cad-parsers/src/cad/filterPrimitivesV8.d.ts +0 -9
  183. package/packages/cad-parsers/src/cad/primitiveGeometries.d.ts +0 -30
  184. package/packages/cad-parsers/src/cad/triangleMeshes.d.ts +0 -6
  185. package/packages/cad-parsers/src/metadata/parsers/CadMetadataParserV8.d.ts +0 -6
  186. package/packages/cad-parsers/src/utilities/float32BufferToMatrix.d.ts +0 -12
  187. package/packages/modeldata-api/index.d.ts +0 -12
  188. package/packages/modeldata-api/src/types.d.ts +0 -43
  189. package/packages/pointclouds/src/createPointClassKey.d.ts +0 -5
  190. package/packages/pointclouds/src/potree-three-loader/rendering/PointCloudMaterial.d.ts +0 -204
  191. package/packages/pointclouds/src/potree-three-loader/rendering/classification.d.ts +0 -2
  192. package/packages/pointclouds/src/potree-three-loader/rendering/clipping.d.ts +0 -12
  193. package/packages/pointclouds/src/potree-three-loader/rendering/enums.d.ts +0 -46
  194. package/packages/pointclouds/src/potree-three-loader/rendering/features.d.ts +0 -6
  195. package/packages/pointclouds/src/potree-three-loader/rendering/index.d.ts +0 -5
  196. package/packages/pointclouds/src/potree-three-loader/rendering/texture-generation.d.ts +0 -5
  197. package/packages/pointclouds/src/potree-three-loader/utils/math.d.ts +0 -1
  198. package/packages/rendering/src/rendering/createSimpleGeometryMesh.d.ts +0 -6
  199. package/packages/rendering/src/rendering/primitives.d.ts +0 -12
  200. package/packages/sector-loader/src/V8SectorRepository.d.ts +0 -26
  201. package/packages/sector-loader/src/v8/SimpleAndDetailedToSector3D.d.ts +0 -20
  202. package/packages/sector-loader/src/v8/arrays.d.ts +0 -5
  203. package/packages/sector-loader/src/v8/groupMeshesByNumber.d.ts +0 -8
  204. package/packages/sector-loader/src/v8/sectorUtilities.d.ts +0 -16
  205. package/packages/tools/src/DebugLoadedSectorsTool.d.ts +0 -23
  206. package/packages/tools/src/Geomap/Geomap.d.ts +0 -17
  207. package/packages/tools/src/Geomap/GeomapTool.d.ts +0 -23
  208. package/packages/tools/src/Geomap/MapConfig.d.ts +0 -195
  209. package/packages/utilities/src/networking/isTheSameDomain.d.ts +0 -11
  210. package/packages/utilities/src/revealEnv.d.ts +0 -10
  211. package/packages/utilities/src/workers/WorkerPool.d.ts +0 -14
  212. package/tools.map +0 -1
package/tools.js.map ADDED
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tools.js","mappings":"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","sources":["webpack:///webpack/universalModuleDefinition","webpack:///./packages/tools/src/AxisView/shaders/axisTool.frag","webpack:///./packages/tools/src/AxisView/shaders/axisTool.vert","webpack:///webpack/bootstrap","webpack:///webpack/runtime/compat get default export","webpack:///webpack/runtime/define property getters","webpack:///webpack/runtime/global","webpack:///webpack/runtime/hasOwnProperty shorthand","webpack:///webpack/runtime/make namespace object","webpack:///external commonjs \"three\"","webpack:///./packages/utilities/src/RandomColors.ts","webpack:///./packages/utilities/src/events/EventTrigger.ts","webpack:///./packages/utilities/src/events/clickOrTouchEventOffset.ts","webpack:///external commonjs \"lodash/debounce\"","webpack:///./packages/utilities/src/assertNever.ts","webpack:///./packages/utilities/src/events/InputHandler.ts","webpack:///./packages/utilities/src/determinePowerOfTwoDimensions.ts","webpack:///external commonjs \"assert\"","webpack:///./packages/utilities/src/three/AutoDisposeGroup.ts","webpack:///./packages/utilities/src/three/BoundingBoxLOD.ts","webpack:///./packages/utilities/src/three/visitBox3CornerPoints.ts","webpack:///./packages/utilities/src/WebGLRendererStateHelper.ts","webpack:///./packages/utilities/src/cache/MemoryRequestCache.ts","webpack:///external commonjs \"lodash/chunk\"","webpack:///external commonjs \"lodash/map\"","webpack:///./packages/utilities/src/worldToViewport.ts","webpack:///./packages/utilities/src/shapes/ISerializableShape.ts","webpack:///./packages/utilities/src/DeferredPromise.ts","webpack:///external commonjs \"lodash/remove\"","webpack:///./packages/utilities/src/workers/workerize-transferable/util.ts","webpack:///./packages/tools/src/Cognite3DViewerToolBase.ts","webpack:///external commonjs \"lodash/range\"","webpack:///./packages/tools/src/HtmlOverlay/BucketGrid2D.ts","webpack:///external commonjs \"mixpanel-browser\"","webpack:///external commonjs \"loglevel\"","webpack:///./packages/logger/index.ts","webpack:///external commonjs \"lodash/throttle\"","webpack:///./packages/metrics/src/MetricsLogger.ts","webpack:///./packages/tools/src/HtmlOverlay/HtmlOverlayTool.ts","webpack:///./packages/tools/src/ExplodedViewTool.ts","webpack:///./packages/tools/src/DebugCameraTool.ts","webpack:///external commonjs \"lodash/cloneDeep\"","webpack:///external commonjs \"lodash/merge\"","webpack:///external commonjs \"@tweenjs/tween.js\"","webpack:///external commonjs \"glslify\"","webpack:///./packages/tools/src/AxisView/types.ts","webpack:///./packages/tools/src/AxisView/AxisViewTool.ts","webpack:///./packages/tools/src/Timeline/Keyframe.ts","webpack:///./packages/tools/src/Timeline/TimelineTool.ts","webpack:///./packages/tools/src/Measurement/MeasurementLabels.ts","webpack:///./packages/tools/src/Measurement/styles/Label.css","webpack:///external commonjs \"three-stdlib\"","webpack:///./packages/tools/src/Measurement/MeasurementLine.ts","webpack:///./packages/tools/src/Measurement/MeasurementManager.ts","webpack:///./packages/tools/src/Measurement/MeasurementTool.ts","webpack:///./packages/tools/src/Measurement/styles/ruler.svg"],"sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"@cognite/reveal\"] = factory();\n\telse\n\t\troot[\"@cognite/reveal\"] = factory();\n})((typeof self !== 'undefined' ? self : this), () => {\nreturn ","export default \"precision highp float;\\n#define GLSLIFY 1\\n\\nuniform sampler2D tex;\\n\\nin vec2 vUv;\\n\\nout vec4 color;\\n\\nvoid main()\\n{\\n color = texture(tex, vUv); \\n}\\n\";","export default \"#define GLSLIFY 1\\nuniform mat4 modelMatrix;\\nuniform vec2 scale;\\nuniform vec2 offset;\\n\\nin vec3 position;\\nin vec2 uv;\\n\\nout vec2 vUv;\\n\\nconst mat4 unitOrthographicProjection = mat4(1., 0., 0., 0., 0., 1., 0., 0., 0., 0., -1., 0., 0., 0., 0., 1.);\\n\\nvoid main() {\\n vUv = uv;\\n\\n vec4 clipSpace = unitOrthographicProjection * modelMatrix * vec4(position, 1.0);\\n\\n clipSpace.xy *= scale.xy;\\n\\n clipSpace.xy += vec2(-1., -1.) + offset;\\n\\n gl_Position = clipSpace;\\n}\\n\";","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId](module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = (module) => {\n\tvar getter = module && module.__esModule ?\n\t\t() => (module['default']) :\n\t\t() => (module);\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.g = (function() {\n\tif (typeof globalThis === 'object') return globalThis;\n\ttry {\n\t\treturn this || new Function('return this')();\n\t} catch (e) {\n\t\tif (typeof window === 'object') return window;\n\t}\n})();","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","const __WEBPACK_NAMESPACE_OBJECT__ = require(\"three\");","/*!\n * Copyright 2021 Cognite AS\n */\nimport * as THREE from 'three';\n\n/**\n * Utility class for creating reasonable visible colors. Mainly meant for use\n * in debugging.\n */\nexport class RandomColors {\n private static readonly _colors: Map<number, THREE.Color> = new Map();\n\n /**\n * Returns a color as a THREE.Color.\n * @param colorIndex\n * @returns\n */\n static color(colorIndex: number): THREE.Color {\n const color = RandomColors._colors.get(colorIndex);\n if (color !== undefined) {\n return color;\n }\n\n const newColor = RandomColors.generateRandomColor();\n RandomColors._colors.set(colorIndex, newColor);\n return newColor;\n }\n\n /**\n * Returns color as RGB components between 0 and 255.\n * @param colorIndex Return\n * @returns\n */\n static colorRGB(colorIndex: number): [number, number, number] {\n const c = RandomColors.color(colorIndex);\n return [Math.floor(c.r * 255), Math.floor(c.g * 255), Math.floor(c.b * 255)];\n }\n\n /**\n * Returns a color string suitable for usage in CSS styles.\n * @param colorIndex\n * @returns\n */\n static colorCSS(colorIndex: number): string {\n const [r, g, b] = RandomColors.colorRGB(colorIndex);\n return `rgb(${r}, ${g}, ${b})`;\n }\n\n /**\n * Returns a random color with reasonable lightness and saturation\n * to make the color easily distinguishable from other colors.\n */\n static generateRandomColor(): THREE.Color {\n const hue = Math.random();\n const saturation = 0.4 + Math.random() * 0.6;\n const lightness = 0.3 + 0.4 * Math.random();\n return new THREE.Color().setHSL(hue, saturation, lightness);\n }\n}\n","/*!\n * Copyright 2021 Cognite AS\n */\n\n/**\n * Subscribable event source.\n */\nexport class EventTrigger<TListener extends (...args: any[]) => void> {\n private readonly _listeners: TListener[] = [];\n\n subscribe(listener: TListener): void {\n this._listeners.push(listener);\n }\n\n unsubscribe(listener: TListener): void {\n const index = this._listeners.indexOf(listener);\n if (index !== -1) {\n this._listeners.splice(index, 1);\n }\n }\n\n unsubscribeAll(): void {\n this._listeners.splice(0);\n }\n\n fire(...args: Parameters<TListener>): void {\n this._listeners.forEach(listener => listener(...args));\n }\n}\n","/*!\n * Copyright 2021 Cognite AS\n */\n\n/**\n * Determines clicked or touched coordinate as offset\n * @param ev An MouseEvent or TouchEvent.\n * @param target HTML element to find coordinates relative to.\n * @returns A struct containing coordinates relative to the HTML element provided.\n */\nexport function clickOrTouchEventOffset(\n ev: MouseEvent | TouchEvent,\n target: HTMLElement\n): { offsetX: number; offsetY: number } {\n const rect = target.getBoundingClientRect();\n\n if (ev instanceof MouseEvent) {\n return {\n offsetX: ev.clientX - rect.left,\n offsetY: ev.clientY - rect.top\n };\n } else if (ev.changedTouches.length > 0) {\n const touch = ev.changedTouches[0];\n return {\n offsetX: touch.clientX - rect.left,\n offsetY: touch.clientY - rect.top\n };\n }\n\n // Invalid event\n return {\n offsetX: -1,\n offsetY: -1\n };\n}\n","const __WEBPACK_NAMESPACE_OBJECT__ = require(\"lodash/debounce\");","/*!\n * Copyright 2021 Cognite AS\n */\n\n/**\n * See https://www.typescriptlang.org/docs/handbook/unions-and-intersections.html#union-exhaustiveness-checking\n */\nexport function assertNever(x: never, message?: string): never {\n throw new Error(message || 'Unexpected object: ' + x);\n}\n","/*!\n * Copyright 2021 Cognite AS\n */\nimport { clickOrTouchEventOffset } from './clickOrTouchEventOffset';\nimport { EventTrigger } from './EventTrigger';\nimport debounce from 'lodash/debounce';\nimport { assertNever } from '../assertNever';\nimport { Vector2 } from 'three';\nimport { PointerEventDelegate } from './types';\n\nexport type EventCollection = { [eventName: string]: EventTrigger<(...args: any[]) => void> };\n\nexport class InputHandler {\n private readonly domElement: HTMLElement;\n private static readonly maxMoveDistance = 8;\n private static readonly maxClickDuration = 250;\n\n private readonly _events = {\n click: new EventTrigger<PointerEventDelegate>(),\n hover: new EventTrigger<PointerEventDelegate>()\n };\n\n constructor(domElement: HTMLElement) {\n this.domElement = domElement;\n\n this.setupEventListeners();\n }\n /**\n * @example\n * ```js\n * const onClick = (event) => { console.log(event.offsetX, event.offsetY) };\n * viewer.on('click', onClick);\n * ```\n */\n on(event: 'click' | 'hover', callback: PointerEventDelegate): void {\n switch (event) {\n case 'click':\n this._events.click.subscribe(callback as PointerEventDelegate);\n break;\n\n case 'hover':\n this._events.hover.subscribe(callback as PointerEventDelegate);\n break;\n default:\n assertNever(event);\n }\n }\n\n off(event: 'click' | 'hover', callback: PointerEventDelegate): void {\n switch (event) {\n case 'click':\n this._events.click.unsubscribe(callback as PointerEventDelegate);\n break;\n\n case 'hover':\n this._events.hover.unsubscribe(callback as PointerEventDelegate);\n break;\n default:\n assertNever(event);\n }\n }\n\n dispose(): void {\n disposeOfAllEventListeners(this._events);\n }\n\n private setupEventListeners() {\n const { domElement } = this;\n\n let pointerDown = false;\n let pointerDownTimestamp = 0;\n let validClick = false;\n\n const startOffset = new Vector2();\n\n const onUp = (e: MouseEvent | TouchEvent) => {\n this.handleClickEvent(e, startOffset, pointerDown, validClick, pointerDownTimestamp);\n\n pointerDown = false;\n validClick = false;\n\n // up\n domElement.removeEventListener('mouseup', onUp);\n domElement.removeEventListener('touchend', onUp);\n\n // add back onHover\n domElement.addEventListener('mousemove', this.onHoverCallback);\n };\n\n const onDown = (e: MouseEvent | TouchEvent) => {\n pointerDown = true;\n validClick = true;\n pointerDownTimestamp = e.timeStamp;\n\n const { offsetX, offsetY } = clickOrTouchEventOffset(e, domElement);\n startOffset.set(offsetX, offsetY);\n\n // up\n domElement.addEventListener('mouseup', onUp);\n domElement.addEventListener('touchend', onUp);\n\n // no more onHover\n domElement.removeEventListener('mousemove', this.onHoverCallback);\n };\n\n // down\n domElement.addEventListener('mousedown', onDown);\n domElement.addEventListener('touchstart', onDown);\n\n // on hover callback\n domElement.addEventListener('mousemove', this.onHoverCallback);\n }\n\n private isProperClick(\n e: MouseEvent | TouchEvent,\n startOffset: Vector2,\n pointerDown: boolean,\n validClick: boolean,\n pointerDownTimestamp: number\n ) {\n const { offsetX, offsetY } = clickOrTouchEventOffset(e, this.domElement);\n const clickDuration = e.timeStamp - pointerDownTimestamp;\n\n const hasMovedDuringClick =\n Math.abs(offsetX - startOffset.x) + Math.abs(offsetY - startOffset.y) > InputHandler.maxMoveDistance;\n\n const isProperClick =\n pointerDown && validClick && clickDuration < InputHandler.maxClickDuration && !hasMovedDuringClick;\n\n return isProperClick;\n }\n\n private handleClickEvent(\n e: MouseEvent | TouchEvent,\n startOffset: Vector2,\n pointerDown: boolean,\n validClick: boolean,\n pointerDownTimestamp: number\n ) {\n const isProperClick = this.isProperClick(e, startOffset, pointerDown, validClick, pointerDownTimestamp);\n\n if (isProperClick) {\n const firedEvent = {\n ...clickOrTouchEventOffset(e, this.domElement),\n button: e instanceof MouseEvent ? e.button : undefined\n };\n\n this._events.click.fire(firedEvent);\n }\n }\n\n private readonly onHoverCallback = debounce((e: MouseEvent) => {\n this._events.hover.fire(clickOrTouchEventOffset(e, this.domElement));\n }, 100);\n}\n\n/**\n * Method for deleting all external events that are associated with current instance of a class.\n */\nexport function disposeOfAllEventListeners(eventList: EventCollection): void {\n for (const eventType of Object.keys(eventList)) {\n eventList[eventType].unsubscribeAll();\n }\n}\n","/*!\n * Copyright 2021 Cognite AS\n */\n\n/**\n * Computes minimal power-of-two width and height that holds at least the number of elements provided.\n * This is useful to compute texture sizes.\n */\nexport function determinePowerOfTwoDimensions(elementCount: number): { width: number; height: number } {\n const width = Math.max(1, ceilToPowerOfTwo(Math.sqrt(elementCount)));\n const height = Math.max(1, ceilToPowerOfTwo(elementCount / width));\n return { width, height };\n}\n\nconst log2 = Math.log(2);\nfunction ceilToPowerOfTwo(v: number): number {\n return Math.pow(2, Math.ceil(Math.log(v) / log2));\n}\n","const __WEBPACK_NAMESPACE_OBJECT__ = require(\"assert\");","/*!\n * Copyright 2021 Cognite AS\n */\n\nimport * as THREE from 'three';\n\nconst emptyGeometry = new THREE.BufferGeometry();\n\n/**\n * Referenced count implementation of THREE.Group that\n * automatically disposes all geometries contained in meshes that\n * are direct children of the group.\n */\nexport class AutoDisposeGroup extends THREE.Group {\n private _isDisposed = false;\n private _referenceCount = 0;\n\n reference(): void {\n this.ensureNotDisposed();\n this._referenceCount++;\n }\n\n dereference(): void {\n this.ensureNotDisposed();\n if (this._referenceCount === 0) {\n throw new Error('No references');\n }\n if (--this._referenceCount === 0) {\n this.dispose();\n }\n }\n\n private dispose(): void {\n this.ensureNotDisposed();\n this._isDisposed = true;\n\n for (const child of this.children) {\n if (child instanceof THREE.Mesh && child.geometry !== undefined) {\n child.geometry.dispose();\n\n // // NOTE: Forcefully creating a new reference here to make sure\n // // there are no lingering references to the large geometry buffer\n child.geometry = emptyGeometry;\n }\n if (child instanceof THREE.BufferGeometry) {\n child.dispose();\n }\n }\n\n this.clear();\n }\n\n private ensureNotDisposed() {\n if (this._isDisposed) {\n throw new Error('Already disposed/dereferenced');\n }\n }\n}\n","/*!\n * Copyright 2021 Cognite AS\n */\nimport * as THREE from 'three';\n\n// For BoundingBoxLOD.update()\nconst updateVars = {\n camPos: new THREE.Vector3(),\n bounds: new THREE.Box3()\n};\n\n/**\n * Class similar to THREE.LOD except that it doesn't use `matrixWorld` to determine distance to camera, but a\n * bounding box.\n */\nexport class BoundingBoxLOD extends THREE.Object3D {\n private readonly _boundingBox: THREE.Box3;\n private _activeLevel = 0;\n private readonly _levels: { distance: number; object: THREE.Object3D }[] = [];\n\n // Note! isLOD and autoUpdate is used by WebGLRenderer to perform automatic update of LOD\n // level before rendering\n public readonly isLOD = true;\n public readonly autoUpdate = true;\n\n constructor(boundingBox: THREE.Box3) {\n super();\n this._boundingBox = boundingBox.clone();\n this.type = 'BoundingBoxLOD';\n }\n\n setBoundingBox(boundingBox: THREE.Box3): void {\n this._boundingBox.copy(boundingBox);\n }\n\n addLevel(object: THREE.Object3D, distance: number = 0): void {\n this._levels.push({ object, distance: Math.abs(distance) });\n this._levels.sort((a, b) => b.distance - a.distance);\n object.visible = false;\n this.add(object);\n }\n\n /**\n * Returns the index of the current active LOD. 0 means highest detail.\n */\n getCurrentLevel(): number {\n return this._levels.length > 0 ? this._levels.length - this._activeLevel - 1 : 0;\n }\n\n /**\n * Update selected LOD level based on distance to camera.\n */\n update(camera: THREE.Camera): void {\n this.updateCurrentLevel(camera);\n }\n\n private updateCurrentLevel(camera: THREE.Camera) {\n const levels = this._levels;\n const { camPos, bounds } = updateVars;\n bounds.copy(this._boundingBox).applyMatrix4(this.matrixWorld);\n const cameraZoom = camera instanceof THREE.PerspectiveCamera ? camera.zoom : 1.0;\n\n if (levels.length > 0) {\n camPos.setFromMatrixPosition(camera.matrixWorld);\n const distanceToCamera = bounds.distanceToPoint(camPos) / cameraZoom;\n\n levels[this._activeLevel].object.visible = false;\n this._activeLevel = levels.findIndex(p => distanceToCamera >= p.distance);\n this._activeLevel = this._activeLevel >= 0 ? this._activeLevel : levels.length - 1;\n levels[this._activeLevel].object.visible = true;\n }\n }\n}\n","/*!\n * Copyright 2021 Cognite AS\n */\nimport * as THREE from 'three';\n\nconst visitBox3CornerPointsVars = {\n tmpVector: new THREE.Vector3()\n};\n\n/**\n * Visits each corner point of the box given by applying\n * the callback provided to each of the points.\n * Note that the callback is invoked with a vector\n * that will be changed later, so if this is to be stored\n * it must be cloned first.\n */\nexport function visitBox3CornerPoints(box: THREE.Box3, callback: (corner: THREE.Vector3) => void): void {\n const { tmpVector } = visitBox3CornerPointsVars;\n tmpVector.set(box.min.x, box.min.y, box.min.z); // 000\n callback(tmpVector);\n tmpVector.set(box.min.x, box.min.y, box.max.z); // 001\n callback(tmpVector);\n tmpVector.set(box.min.x, box.max.y, box.min.z); // 010\n callback(tmpVector);\n tmpVector.set(box.min.x, box.max.y, box.max.z); // 011\n callback(tmpVector);\n tmpVector.set(box.max.x, box.min.y, box.min.z); // 100\n callback(tmpVector);\n tmpVector.set(box.max.x, box.min.y, box.max.z); // 101\n callback(tmpVector);\n tmpVector.set(box.max.x, box.max.y, box.min.z); // 110\n callback(tmpVector);\n tmpVector.set(box.max.x, box.max.y, box.max.z); // 111\n callback(tmpVector);\n}\n","/*!\n * Copyright 2021 Cognite AS\n */\nimport * as THREE from 'three';\nimport { Vector4 } from 'three';\n\ntype WebGLRendererState = {\n autoClear?: boolean;\n autoClearDepth?: boolean;\n clearColor?: THREE.Color | string | number;\n clearAlpha?: number;\n size?: THREE.Vector2;\n localClippingEnabled?: boolean;\n renderTarget?: THREE.WebGLRenderTarget | null;\n scissorData?: THREE.Vector4;\n scissorTest?: boolean;\n webGLState?: WebGLState;\n};\n\ntype WebGLState = {\n buffers?: {\n depth?: {\n mask?: boolean;\n test?: boolean;\n };\n };\n};\n\nexport class WebGLRendererStateHelper {\n private _originalState: WebGLRendererState = {};\n private readonly _renderer: THREE.WebGLRenderer;\n\n private static readonly DefaultWebGLState: WebGLState = {\n buffers: {\n depth: {\n mask: true,\n test: true\n }\n }\n };\n\n constructor(renderer: THREE.WebGLRenderer) {\n this._renderer = renderer;\n this._originalState = {};\n }\n\n setScissor(x: number, y: number, width: number, height: number): void {\n const scissorData = this._renderer.getScissor(new Vector4());\n this._originalState = { scissorData, ...this._originalState };\n this._renderer.setScissor(x, y, width, height);\n }\n\n setScissorTest(enabled: boolean): void {\n this._originalState = { scissorTest: this._renderer.getScissorTest(), ...this._originalState };\n this._renderer.setScissorTest(enabled);\n }\n\n setClearColor(color: THREE.Color | number | string, alpha?: number): void {\n this._originalState = {\n clearColor: this._renderer.getClearColor(new THREE.Color()),\n clearAlpha: this._renderer.getClearAlpha(),\n ...this._originalState\n };\n this._renderer.setClearColor(color, alpha);\n }\n\n setWebGLState(state: WebGLState, resetState: WebGLState = WebGLRendererStateHelper.DefaultWebGLState): void {\n this._originalState = {\n webGLState: {\n buffers: state?.buffers ? {} : undefined\n },\n ...this._originalState\n };\n\n if (state?.buffers?.depth) {\n const newTest = state.buffers.depth?.test;\n const newMask = state.buffers.depth?.mask;\n\n this._originalState.webGLState!.buffers!.depth = {\n test: newTest !== undefined ? resetState.buffers?.depth?.test : undefined,\n mask: newMask !== undefined ? resetState.buffers?.depth?.mask : undefined\n };\n\n if (newMask !== undefined) this._renderer.state.buffers.depth.setMask(newMask);\n if (newTest !== undefined) this._renderer.state.buffers.depth.setTest(newTest);\n }\n }\n\n setSize(width: number, height: number): void {\n this._originalState = { size: this._renderer.getSize(new THREE.Vector2()), ...this._originalState };\n this._renderer.setSize(width, height);\n }\n\n set localClippingEnabled(enabled: boolean) {\n this._originalState = { localClippingEnabled: this._renderer.localClippingEnabled, ...this._originalState };\n this._renderer.localClippingEnabled = enabled;\n }\n\n set autoClear(enabled: boolean) {\n this._originalState = { autoClear: this._renderer.autoClear, ...this._originalState };\n this._renderer.autoClear = enabled;\n }\n\n set autoClearDepth(enabled: boolean) {\n this._originalState = { autoClearDepth: this._renderer.autoClearDepth, ...this._originalState };\n this._renderer.autoClearDepth = enabled;\n }\n\n setRenderTarget(renderTarget: THREE.WebGLRenderTarget | null): void {\n this._originalState = { renderTarget: this._renderer.getRenderTarget(), ...this._originalState };\n this._renderer.setRenderTarget(renderTarget);\n }\n\n resetState(): void {\n if (this._originalState.autoClear !== undefined) {\n this._renderer.autoClear = this._originalState.autoClear;\n }\n if (this._originalState.autoClearDepth !== undefined) {\n this._renderer.autoClearDepth = this._originalState.autoClearDepth;\n }\n if (this._originalState.clearColor !== undefined) {\n this._renderer.setClearColor(this._originalState.clearColor, this._originalState.clearAlpha);\n }\n if (this._originalState.localClippingEnabled !== undefined) {\n this._renderer.localClippingEnabled = this._originalState.localClippingEnabled;\n }\n if (this._originalState.size !== undefined) {\n this._renderer.setSize(this._originalState.size.width, this._originalState.size.height);\n }\n if (this._originalState.renderTarget !== undefined) {\n this._renderer.setRenderTarget(this._originalState.renderTarget);\n }\n if (this._originalState.scissorData !== undefined) {\n this._renderer.setScissor(this._originalState.scissorData);\n }\n if (this._originalState.scissorTest !== undefined) {\n this._renderer.setScissorTest(this._originalState.scissorTest);\n }\n if (this._originalState.webGLState !== undefined) {\n this._renderer.state.reset();\n\n if (this._originalState.webGLState?.buffers?.depth) {\n const lastTest = this._originalState.webGLState.buffers.depth?.test;\n const lastMask = this._originalState.webGLState.buffers.depth?.mask;\n\n if (lastMask !== undefined) this._renderer.state.buffers.depth.setMask(lastMask);\n if (lastTest !== undefined) this._renderer.state.buffers.depth.setTest(lastTest);\n }\n }\n\n this._originalState = {};\n }\n}\n","/*!\n * Copyright 2021 Cognite AS\n */\n\nimport { RequestCache } from './RequestCache';\n\nclass TimestampedContainer<T> {\n private _lastAccessTime: number;\n private readonly _value: T;\n\n constructor(value: T) {\n this._value = value;\n this._lastAccessTime = Date.now();\n }\n\n get value() {\n this.touch();\n return this._value;\n }\n\n get lastAccessTime() {\n return this._lastAccessTime;\n }\n\n private touch() {\n this._lastAccessTime = Date.now();\n }\n}\n\nexport interface MemoryRequestCacheOptions {\n maxElementsInCache?: number;\n}\n\nexport class MemoryRequestCache<Key, Data> implements RequestCache<Key, Data> {\n private _maxElementsInCache: number;\n private readonly _data: Map<Key, TimestampedContainer<Data>>;\n private _defaultCleanupCount: number;\n private readonly _removeCallback: ((value: Data) => void) | undefined;\n\n private static readonly CLEANUP_COUNT_TO_CAPACITY_RATIO = 1.0 / 5.0;\n\n constructor(\n maxElementsInCache: number = 50,\n removeCallback?: (value: Data) => void,\n defaultCleanupCount: number = 10\n ) {\n this._data = new Map();\n this._maxElementsInCache = maxElementsInCache;\n this._defaultCleanupCount = Math.max(defaultCleanupCount, 1);\n this._removeCallback = removeCallback;\n }\n\n has(id: Key): boolean {\n return this._data.has(id);\n }\n\n forceInsert(id: Key, data: Data): void {\n if (this.isFull()) {\n this.cleanCache(this._defaultCleanupCount);\n }\n this.insert(id, data);\n }\n\n insert(id: Key, data: Data): void {\n if (this._data.size < this._maxElementsInCache) {\n this._data.set(id, new TimestampedContainer(data));\n } else if (this._maxElementsInCache > 0) {\n throw new Error('Cache full, please clean Cache and retry adding data');\n }\n }\n\n remove(id: Key): void {\n if (this._removeCallback !== undefined) {\n const value = this._data.get(id);\n if (value !== undefined) {\n this._removeCallback(value.value);\n }\n }\n this._data.delete(id);\n }\n\n get(id: Key): Data {\n const data = this._data.get(id);\n if (data !== undefined) {\n // Don't really like the touch for lastTime being hidden within a get function. Should we maybe make a\n // TimeConstrainedCache interface where the geter is called something like getAndUpdateTimestamp for clarity?\n return data.value;\n }\n throw new Error(`Cache element ${id} does not exist`);\n }\n\n isFull(): boolean {\n return this._data.size >= this._maxElementsInCache;\n }\n\n cleanCache(count: number): void {\n const allResults = Array.from(this._data.entries());\n allResults.sort((left, right) => {\n return right[1].lastAccessTime - left[1].lastAccessTime;\n });\n for (let i = 0; i < count; i++) {\n const entry = allResults.pop();\n if (entry !== undefined) {\n this.remove(entry[0]);\n } else {\n return;\n }\n }\n }\n\n resize(cacheSize: number): void {\n this._maxElementsInCache = cacheSize;\n this._defaultCleanupCount = Math.max(cacheSize * MemoryRequestCache.CLEANUP_COUNT_TO_CAPACITY_RATIO, 1);\n\n if (this.isFull()) {\n this.cleanCache(this._data.size - this._maxElementsInCache);\n }\n }\n\n clear(): void {\n if (this._removeCallback !== undefined) {\n for (const value of this._data.values()) {\n this._removeCallback(value.value);\n }\n }\n this._data.clear();\n }\n}\n","const __WEBPACK_NAMESPACE_OBJECT__ = require(\"lodash/chunk\");","const __WEBPACK_NAMESPACE_OBJECT__ = require(\"lodash/map\");","/*!\n * Copyright 2021 Cognite AS\n */\n\nimport * as THREE from 'three';\n\nconst worldToViewportVars = {\n renderSize: new THREE.Vector2(),\n position: new THREE.Vector3()\n};\n\n/**\n * Maps from 3D world coordinates to normalized screen coordinates\n * relative to the canvas being rendered to. X and Y will\n * be in range [0, 1]. Z is in range [-1, 1] if the coordinate\n * is inside the camera near and far planes.\n * @param camera Camera used to project point from 3D to NDC coordinates\n * @param position3D World position in 3D\n * @param out Optionally pre-allocated THREE.Vector3\n * @returns Relative screen coordinates in X, Y and Z in range [-1, 1] if point\n * is within near/far of camera.\n */\n\nexport function worldToNormalizedViewportCoordinates(\n camera: THREE.PerspectiveCamera,\n position3D: THREE.Vector3,\n out: THREE.Vector3 = new THREE.Vector3()\n): THREE.Vector3 {\n const { position } = worldToViewportVars;\n\n // map to normalized device coordinate (NDC) space\n position.copy(position3D);\n position.project(camera);\n\n // map to 2D screen space\n const x = (position.x + 1) / 2;\n const y = (-position.y + 1) / 2;\n\n return out.set(x, y, position.z);\n}\n\n/**\n * Maps from 3D world coordinates to screen coordinates\n * relative to the canvas. X and Y will be in absolute\n * coordinates (0,0 being the top left of the canvas). Z is\n * in range [-1, 1] if the coordinate\n * is inside the camera near and far planes.\n * @param renderer Renderer used to render the \"world\"\n * @param camera Camera used to project point from 3D to NDC coordinates\n * @param position3D World position in 3D\n * @param out Optionally pre-allocated THREE.Vector3\n * @returns Relative screen coordinates in X, Y and Z in range [-1, 1] if point\n * is within near/far of camera.\n */\nexport function worldToViewportCoordinates(\n renderer: THREE.WebGLRenderer,\n camera: THREE.PerspectiveCamera,\n position3D: THREE.Vector3,\n out: THREE.Vector3 = new THREE.Vector3()\n): THREE.Vector3 {\n worldToNormalizedViewportCoordinates(camera, position3D, out);\n\n const { renderSize } = worldToViewportVars;\n renderer.getSize(renderSize);\n\n const canvas = renderer.domElement;\n const { width: canvasWidth, height: canvasHeight } = canvas.getBoundingClientRect();\n\n out.x = Math.round(out.x * canvasWidth);\n out.y = Math.round(out.y * canvasHeight);\n return out;\n}\n\n/**\n * Converts a pixel coordinate to normalized device coordinate (in range [-1, 1])\n */\nexport function pixelToNormalizedDeviceCoordinates(x: number, y: number, width: number, height: number): THREE.Vector2 {\n return new THREE.Vector2((x / width) * 2 - 1, (y / height) * -2 + 1);\n}\n","/*!\n * Copyright 2022 Cognite AS\n */\n\nexport enum ShapeType {\n Box,\n Cylinder,\n Composite\n}\n\nexport interface ISerializableShape {\n readonly shapeType: ShapeType;\n}\n","/*!\n * Copyright 2022 Cognite AS\n */\n\nexport class DeferredPromise<T> implements Promise<T> {\n [Symbol.toStringTag] = 'Promise';\n\n private readonly _promise: Promise<T>;\n private _resolve!: (value: T | PromiseLike<T>) => void;\n private _reject!: (reason: any) => void;\n private _state: 'pending' | 'fulfilled' | 'rejected' = 'pending';\n\n public get state(): 'pending' | 'fulfilled' | 'rejected' {\n return this._state;\n }\n\n constructor() {\n this._promise = new Promise<T>((resolve, reject) => {\n this._resolve = resolve;\n this._reject = reject;\n });\n }\n finally(onfinally?: (() => void) | null): Promise<T> {\n return this._promise.finally(onfinally);\n }\n\n public then<TResult1, TResult2>(\n onfulfilled?: (value: T) => TResult1 | PromiseLike<TResult1>,\n onrejected?: (reason: any) => TResult2 | PromiseLike<TResult2>\n ): Promise<TResult1 | TResult2> {\n return this._promise.then(onfulfilled, onrejected);\n }\n\n public catch<TResult>(onrejected?: (reason: any) => TResult | PromiseLike<TResult>): Promise<T | TResult> {\n return this._promise.catch(onrejected);\n }\n\n public resolve(value: T | PromiseLike<T>): void {\n this._resolve(value);\n this._state = 'fulfilled';\n }\n\n public reject(reason?: any): void {\n this._reject(reason);\n this._state = 'rejected';\n }\n}\n","const __WEBPACK_NAMESPACE_OBJECT__ = require(\"lodash/remove\");","/*!\n * Adopted from https://github.com/naoak/workerize-transferable\n */\nconst globals = getGlobalThis();\n\n/**\n * Get the global scope for browsers that do not support globalThis\n * https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/globalThis\n */\nexport function getGlobalThis(): typeof globalThis {\n if (typeof self !== 'undefined') {\n return self;\n }\n if (typeof window !== 'undefined') {\n return window;\n }\n if (typeof global !== 'undefined') {\n return global;\n }\n throw new Error('unable to locate global object');\n}\n\n/**\n * Test if an object is transferable\n * @param x Object\n */\nexport function isTransferableObject(x: any): boolean {\n return (\n x instanceof ArrayBuffer ||\n x instanceof MessagePort ||\n (globals.ImageBitmap && x instanceof ImageBitmap) ||\n (globals.OffscreenCanvas && x instanceof OffscreenCanvas)\n );\n}\n","/*!\n * Copyright 2021 Cognite AS\n */\n\nimport { assertNever, EventTrigger } from '@reveal/utilities';\n\n/**\n * Base class for tools attaching to a {@link Cognite3DViewer}.\n */\nexport abstract class Cognite3DViewerToolBase {\n private readonly _disposedEvent = new EventTrigger<() => void>();\n private _disposed = false;\n\n /**\n * Registers an event handler that is triggered when {@link Cognite3DViewerToolBase.dispose} is\n * called.\n * @param event\n * @param handler\n * @internal\n */\n on(event: 'disposed', handler: () => void): void {\n switch (event) {\n case 'disposed':\n this._disposedEvent.subscribe(handler);\n break;\n\n default:\n assertNever(event);\n }\n }\n\n /**\n * Unregisters an event handler for the 'disposed'-event.\n * @param event\n * @param handler\n */\n off(event: 'disposed', handler: () => void): void {\n switch (event) {\n case 'disposed':\n this._disposedEvent.unsubscribe(handler);\n break;\n\n default:\n assertNever(event);\n }\n }\n\n /**\n * Disposes the element and triggeres the 'disposed' event before clearing the list\n * of dipose-listeners.\n */\n dispose(): void {\n if (this._disposed) {\n throw new Error('Already disposed');\n }\n this._disposed = true;\n this._disposedEvent.fire();\n this._disposedEvent.unsubscribeAll();\n }\n\n /**\n * Throws an error if the instance has been disposed.\n */\n protected ensureNotDisposed(): void {\n if (this._disposed) {\n throw new Error('The tool has been disposed');\n }\n }\n}\n","const __WEBPACK_NAMESPACE_OBJECT__ = require(\"lodash/range\");","/*!\n * Copyright 2021 Cognite AS\n */\nimport * as THREE from 'three';\nimport range from 'lodash/range';\n\ntype SimpleGrid2DElement<T> = {\n bounds: THREE.Box2;\n element: T;\n};\n\n/**\n * Data structure that splits a 2D region into cells where each cell can contain zero to many\n * elements. Elements can be stored in several cells. This data structure make overlap lookups\n * efficient.\n *\n * Note! This class is tailored for usage with {@link HtmlOverlayTool} and has a few restrictions\n * and assumptions associated with the usage. If used elsewhere, take care as to how this affects\n * performance and behaviour.\n */\nexport class BucketGrid2D<T> {\n private readonly _dimensions: [width: number, height: number];\n private readonly _bounds: THREE.Box2;\n private readonly _cells: SimpleGrid2DElement<T>[][];\n /**\n * Holds elements that has been removed from the collection using {@link removeOverlappingElements}.\n * This is used to avoid expensive re-allocations of cells when removing elements.\n */\n private readonly _removedElements = new Set<T>();\n\n constructor(bounds: THREE.Box2, dimensions: [width: number, height: number]) {\n this._dimensions = dimensions;\n this._cells = range(0, dimensions[0] * dimensions[1]).map(() => new Array<SimpleGrid2DElement<T>>());\n this._bounds = bounds;\n }\n\n insert(bounds: THREE.Box2, element: T): void {\n if (!this._bounds.intersectsBox(bounds)) {\n throw new Error('Element to be added must be partially inside grid');\n }\n if (this._removedElements.has(element)) {\n throw new Error('Re-adding previously taken elements is currently not supported');\n }\n\n for (const cell of this.cellsIntersecting(bounds)) {\n cell.push({ bounds, element });\n }\n }\n\n *overlappingElements(bounds: THREE.Box2): Generator<T> {\n if (!this._bounds.intersectsBox(bounds)) {\n return;\n }\n\n const visitedElements = new Set<T>();\n for (const cell of this.cellsIntersecting(bounds)) {\n for (const candidateElement of cell) {\n if (\n !visitedElements.has(candidateElement.element) &&\n !this._removedElements.has(candidateElement.element) &&\n bounds.intersectsBox(candidateElement.bounds)\n ) {\n visitedElements.add(candidateElement.element);\n yield candidateElement.element;\n }\n }\n }\n }\n\n *removeOverlappingElements(bounds: THREE.Box2): Generator<T> {\n if (!this._bounds.intersectsBox(bounds)) {\n return;\n }\n\n for (const cell of this.cellsIntersecting(bounds)) {\n for (let i = 0; i < cell.length; i++) {\n const candidateElement = cell[i];\n if (!this._removedElements.has(candidateElement.element) && bounds.intersectsBox(candidateElement.bounds)) {\n this._removedElements.add(candidateElement.element);\n yield candidateElement.element;\n }\n }\n }\n }\n\n private *cellsIntersecting(bounds: THREE.Box2): Generator<SimpleGrid2DElement<T>[]> {\n const { min, max } = this._bounds;\n const dimX = this._dimensions[0];\n const dimY = this._dimensions[1];\n const relativeBoundsMinX = (bounds.min.x - min.x) / (max.x - min.x);\n const relativeBoundsMaxX = (bounds.max.x - min.x) / (max.x - min.x);\n const relativeBoundsMinY = (bounds.min.y - min.y) / (max.y - min.y);\n const relativeBoundsMaxY = (bounds.max.y - min.y) / (max.y - min.y);\n\n const clamp = THREE.MathUtils.clamp;\n const minI = clamp(Math.floor(dimX * relativeBoundsMinX), 0, dimX - 1);\n const maxI = clamp(Math.floor(dimX * relativeBoundsMaxX), 0, dimX - 1);\n const minJ = clamp(Math.floor(dimY * relativeBoundsMinY), 0, dimY - 1);\n const maxJ = clamp(Math.floor(dimY * relativeBoundsMaxY), 0, dimY - 1);\n for (let j = minJ; j <= maxJ; ++j) {\n for (let i = minI; i <= maxI; ++i) {\n yield this._cells[j * dimX + i];\n }\n }\n }\n}\n","const __WEBPACK_NAMESPACE_OBJECT__ = require(\"mixpanel-browser\");","const __WEBPACK_NAMESPACE_OBJECT__ = require(\"loglevel\");","/*!\n * Copyright 2021 Cognite AS\n */\n\nimport log from './src/Log';\nexport default log;\n","const __WEBPACK_NAMESPACE_OBJECT__ = require(\"lodash/throttle\");","/*!\n * Copyright 2021 Cognite AS\n */\n\nimport * as THREE from 'three';\nimport mixpanel from 'mixpanel-browser';\nimport log from '@reveal/logger';\n\nimport { TrackedEvents, EventProps } from './types';\nimport throttle from 'lodash/throttle';\n\n/**\n * Source: https://stackoverflow.com/a/2117523/167251\n */\nfunction generateUuidv4(): string {\n return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) {\n const r = (Math.random() * 16) | 0,\n v = c == 'x' ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n}\n\nconst { VERSION, MIXPANEL_TOKEN } = process.env;\n\n// Don't identify users in MixPanel to avoid GDPR problems\nconst mixpanelDistinctId = 'reveal-single-user';\n\nexport class MetricsLogger {\n private readonly _sessionProps: {\n VERSION: string;\n project: string;\n application: string;\n sessionId: string;\n };\n\n private static readonly TrackCameraNavigationThrottleDelay = 5000;\n private static readonly TrackCadNodeTransformOverriddenThrottleDelay = 1000;\n\n private constructor(project: string, applicationId: string, eventProps: EventProps) {\n // Even though mixpanel has an opt out property, the mixpanel object\n // used by Metrics is not available here, so we have our own way of opting out.\n\n mixpanel.init(MIXPANEL_TOKEN!, {\n batch_requests: true,\n disable_cookie: true,\n disable_persistence: true,\n // Don't send IP which disables geolocation\n ip: false,\n // Avoid sending a bunch of properties that might help identifying a user\n property_blacklist: [\n // https://help.mixpanel.com/hc/en-us/articles/115004613766-Default-Properties-Collected-by-Mixpanel#profile-properties-javascript\n '$city',\n '$region',\n 'mp_country_code',\n '$geo_source',\n '$timezone',\n 'mp_lib',\n '$lib_version',\n '$device_id',\n '$user_id',\n '$current_url',\n '$screen_width',\n '$screen_height',\n '$referrer',\n '$referring_domain',\n '$initial_referrer',\n '$initial_referring_domain'\n ]\n });\n // Reset device ID (even if we don't send it)\n mixpanel.reset();\n\n mixpanel.identify(mixpanelDistinctId);\n\n this._sessionProps = {\n VERSION: VERSION!,\n project: 'unknown',\n application: 'unknown',\n // Use a random identifier because we want to don't track users over multiple sessions to not\n // violate GDPR.\n sessionId: generateUuidv4()\n };\n\n if (project) {\n this._sessionProps.project = project;\n }\n if (applicationId) {\n this._sessionProps.application = applicationId;\n }\n this.innerTrackEvent('init', eventProps);\n }\n\n static init(logMetrics: boolean, project: string, applicationId: string, eventProps: EventProps): void {\n if (globalThis.revealMetricsLogger === undefined && logMetrics) {\n const metricsLogger = new MetricsLogger(project, applicationId, eventProps);\n globalThis.revealMetricsLogger = { metricsLogger };\n }\n }\n\n private innerTrackEvent(eventName: TrackedEvents, eventProps: EventProps): void {\n const combined = { ...this._sessionProps, ...eventProps };\n mixpanel.track(eventName, combined);\n }\n\n static trackEvent(eventName: TrackedEvents, eventProps: EventProps): void {\n if (globalThis.revealMetricsLogger) {\n globalThis.revealMetricsLogger.metricsLogger.innerTrackEvent(eventName, eventProps);\n }\n }\n\n static trackCreateTool(toolName: string): void {\n MetricsLogger.trackEvent('toolCreated', { toolName });\n }\n\n static trackLoadModel(eventProps: EventProps, modelIdentifier: any, modelVersion: number): void {\n MetricsLogger.trackEvent('loadModel', { ...eventProps, modelIdentifier, modelVersion });\n }\n\n static trackCadModelStyled(nodeCollectionClassToken: string, appearance: any): void {\n MetricsLogger.trackEvent('cadModelStyleAssigned', { nodeCollectionClassToken, style: appearance });\n }\n\n private static readonly trackCadNodeTransformOverriddenVars = {\n zeroVector: new THREE.Vector3(0, 0, 0),\n oneVector: new THREE.Vector3(1, 1, 1),\n identityRotation: new THREE.Quaternion().identity(),\n\n translation: new THREE.Vector3(),\n scale: new THREE.Vector3(),\n rotation: new THREE.Quaternion()\n };\n\n /**\n * Track use of CAD node transform overrides. Note that the metric is throttled and will only trigger\n * once per second.\n * @param nodeCount Number of nodes affected by the transform override\n * @param matrix Matrix used to override the node transform\n */\n static readonly trackCadNodeTransformOverridden = throttle(\n (nodeCount: number, matrix: THREE.Matrix4) => MetricsLogger.trackCadNodeTransformOverriddenImpl(nodeCount, matrix),\n MetricsLogger.TrackCadNodeTransformOverriddenThrottleDelay\n );\n\n private static trackCadNodeTransformOverriddenImpl(nodeCount: number, matrix: THREE.Matrix4): void {\n const { zeroVector, oneVector, identityRotation, translation, scale, rotation } =\n MetricsLogger.trackCadNodeTransformOverriddenVars;\n matrix.decompose(translation, rotation, scale);\n\n const hasRotation = Math.abs(rotation.angleTo(identityRotation)) > 1e-5;\n const hasTranslation = translation.distanceToSquared(zeroVector) > 1e-5;\n const hasScale = scale.distanceToSquared(oneVector) > 1e-5;\n MetricsLogger.trackEvent('cadNodeTransformOverridden', {\n nodeCount,\n hasTranslation,\n hasRotation,\n hasScale\n });\n }\n\n /**\n * Track camera navigation events. Note that the metric is throttled and will only trigger\n * once per second.\n */\n static readonly trackCameraNavigation = throttle(\n (eventProps: EventProps) => MetricsLogger.trackCameraNavigationImpl(eventProps),\n MetricsLogger.TrackCameraNavigationThrottleDelay\n );\n\n private static trackCameraNavigationImpl(eventProps: EventProps): void {\n MetricsLogger.trackEvent('cameraNavigated', eventProps);\n }\n\n static trackError(error: Error, eventProps: EventProps): void {\n log.error(error);\n\n if (error !== undefined) {\n this.trackEvent('error', {\n message: error.message || error,\n name: error.name,\n stack: error.stack,\n ...eventProps\n });\n } else {\n this.trackEvent('error', {\n name: 'unknown',\n ...eventProps\n });\n }\n }\n}\n","/*!\n * Copyright 2021 Cognite AS\n */\n\nimport * as THREE from 'three';\n\nimport { Cognite3DViewerToolBase } from '../Cognite3DViewerToolBase';\nimport { BucketGrid2D } from './BucketGrid2D';\n\nimport { MetricsLogger } from '@reveal/metrics';\nimport { DisposedDelegate, SceneRenderedDelegate } from '@reveal/utilities';\nimport { assertNever, worldToViewportCoordinates } from '@reveal/utilities';\nimport debounce from 'lodash/debounce';\nimport { Cognite3DViewer } from '@reveal/api';\n\n/**\n * Callback that is triggered whenever the 2D position of an overlay is updated\n * in {@link HtmlOverlayTool}.\n */\nexport type HtmlOverlayPositionUpdatedDelegate = (\n element: HTMLElement,\n position2D: THREE.Vector2,\n position3D: THREE.Vector3,\n distanceToCamera: number,\n userData: any\n) => void;\n\n/**\n * Callback that is triggered when a set of overlays are clustered together in\n * {@link HtmlOverlayTool}.\n */\nexport type HtmlOverlayCreateClusterDelegate = (\n overlayElements: {\n htmlElement: HTMLElement;\n userData: any;\n }[]\n) => HTMLElement;\n\n/**\n * Options for an overlay added using {@link HtmlOverlayTool.add}.\n */\nexport type HtmlOverlayOptions = {\n /**\n * Callback that is triggered whenever the position of the overlay is updated. Optional.\n */\n positionUpdatedCallback?: HtmlOverlayPositionUpdatedDelegate;\n /**\n * Optional user specified data that is provided to the {@link HtmlOverlayCreateClusterDelegate} and\n * {@link HtmlOverlayPositionUpdatedDelegate}.\n */\n userData?: any;\n};\n\n/**\n * Controls how close overlay elements are clustered together.\n */\nexport type HtmlOverlayToolClusteringOptions = {\n /**\n * Currently only 'overlapInScreenSpace' is supported. In this mode,\n * overlays are clustered together into a single element as defined by\n * the {@link createClusterElementCallback} and hidden when they overlap\n * in screen space. The composite element is placed at the midpoint of\n * all clustered elements.\n *\n * Clustered elements are faded in/out using CSS styling `transition`,\n * `opacity` and `visibility`.\n */\n mode: 'overlapInScreenSpace';\n\n /**\n * Callback that is triggered when a set of overlays are clustered together\n * to create a \"composite\" element as a placeholder for the clustered elements.\n * Note that this callback will be triggered every frame for each cluster so it\n * must be performant.\n */\n createClusterElementCallback: HtmlOverlayCreateClusterDelegate;\n};\n\nexport type HtmlOverlayToolOptions = {\n clusteringOptions?: HtmlOverlayToolClusteringOptions;\n};\n\ntype HtmlOverlayElement = {\n position3D: THREE.Vector3;\n options: HtmlOverlayOptions;\n\n state: {\n visible: boolean;\n position2D: THREE.Vector2;\n width: number;\n height: number;\n };\n};\n\n/**\n \n * Manages HTMLoverlays for {@link Cognite3DViewer}. Attaches HTML elements to a\n * 3D position and updates its position/visibility as user moves the camera. This is\n * useful to create HTML overlays to highlight information about key positions in the 3D model.\n *\n * Attached elements *must* have CSS style 'position: absolute'. It's also recommended\n * in most cases to have styles 'pointer-events: none' and 'touch-action: none' to avoid\n * interfering with 3D navigation. Consider also applying 'transform: translate(-50%, -50%)'\n * to anchor the center of the element rather than the top-left corner. In some cases the\n * `zIndex`-attribute is necessary for the element to appear on top of the viewer.\n *\n * @example\n * ```js\n * const el = document.createElement('div');\n * el.style.position = 'absolute'; // Required!\n * // Anchor to center of element\n * el.style.transform = 'translate(-50%, -50%)';\n * // Avoid being target for events\n * el.style.pointerEvents = 'none;\n * el.style.touchAction = 'none';\n * // Render in front of other elements\n * el.style.zIndex = 10;\n *\n * el.style.color = 'red';\n * el.innerHtml = '<h1>Overlay</h1>';\n *\n * const overlayTool = new HtmlOverlayTool(viewer);\n * overlayTool.add(el, new THREE.Vector3(10, 10, 10));\n * // ...\n * overlayTool.remove(el);\n * // or, to remove all attached elements\n * overlayTool.clear();\n *\n * // detach the tool from the viewer\n * overlayTool.dispose();\n * ```\n */\nexport class HtmlOverlayTool extends Cognite3DViewerToolBase {\n private readonly _viewer: Cognite3DViewer;\n private readonly _options: HtmlOverlayToolOptions;\n private readonly _htmlOverlays: Map<HTMLElement, HtmlOverlayElement> = new Map();\n private readonly _compositeOverlays: HTMLElement[] = [];\n private _visible: boolean;\n\n private readonly _onSceneRenderedHandler: SceneRenderedDelegate;\n private readonly _onViewerDisposedHandler: DisposedDelegate;\n // Allocate variables needed for processing once to avoid allocations\n private readonly _preallocatedVariables = {\n camPos: new THREE.Vector3(),\n camNormal: new THREE.Vector3(),\n point: new THREE.Vector3(),\n nearPlane: new THREE.Plane(),\n farPlane: new THREE.Plane(),\n position2D: new THREE.Vector2()\n };\n\n private readonly scheduleUpdate: () => void;\n\n private get viewerDomElement(): HTMLElement {\n return this._viewer.domElement;\n }\n\n private get viewerCamera(): THREE.PerspectiveCamera {\n return this._viewer.getCamera();\n }\n\n private get viewerRenderer(): THREE.WebGLRenderer {\n return this._viewer.renderer;\n }\n\n constructor(viewer: Cognite3DViewer, options?: HtmlOverlayToolOptions) {\n super();\n\n this._onSceneRenderedHandler = this.onSceneRendered.bind(this);\n this._onViewerDisposedHandler = this.onViewerDisposed.bind(this);\n this._options = options ?? {};\n this._viewer = viewer;\n this._viewer.on('sceneRendered', this._onSceneRenderedHandler);\n this._viewer.on('disposed', this._onViewerDisposedHandler);\n\n this.scheduleUpdate = debounce(() => this.forceUpdate(), 20);\n\n this._visible = true;\n\n MetricsLogger.trackCreateTool('HtmlOverlayTool');\n }\n\n /**\n * Returns all added HTML elements along with their 3D positions.\n */\n get elements(): { element: HTMLElement; position3D: THREE.Vector3 }[] {\n return Array.from(this._htmlOverlays.entries()).map(([element, info]) => {\n return { element, position3D: info.position3D };\n });\n }\n\n /**\n * Removes all elements and detaches from the viewer.\n * @override\n */\n dispose(): void {\n this._viewer.off('sceneRendered', this._onSceneRenderedHandler);\n this._viewer.off('disposed', this._onViewerDisposedHandler);\n this.clear();\n super.dispose();\n }\n\n /**\n * Registers a HTML overlay that will be updated on rendering.\n *\n * @param htmlElement\n * @param position3D\n * @param options\n */\n add(htmlElement: HTMLElement, position3D: THREE.Vector3, options: HtmlOverlayOptions = {}): void {\n this.ensureNotDisposed();\n\n if (this.viewerDomElement.contains(htmlElement)) {\n throw new Error(`Element is already attached to viewer`);\n }\n\n htmlElement.style.visibility = 'hidden';\n\n // Note! Must be part of DOM tree before we do getComputedStyle(), so add before check\n this.viewerDomElement.appendChild(htmlElement);\n const style = getComputedStyle(htmlElement);\n if (style.position !== 'absolute') {\n this.viewerDomElement.removeChild(htmlElement);\n throw new Error(`htmlElement style must have a position of absolute. but was '${style.position}'`);\n }\n\n const element: HtmlOverlayElement = {\n position3D,\n options,\n state: {\n position2D: new THREE.Vector2(),\n width: -1,\n height: -1,\n visible: true\n }\n };\n this._htmlOverlays.set(htmlElement, element);\n\n this.scheduleUpdate();\n }\n\n /**\n * Removes a overlay and removes it from the DOM.\n * @param htmlElement\n */\n remove(htmlElement: HTMLElement): void {\n this.ensureNotDisposed();\n if (!this.viewerDomElement.contains(htmlElement) || !this._htmlOverlays.has(htmlElement)) {\n throw new Error(`Element is not attached to viewer`);\n }\n this.viewerDomElement.removeChild(htmlElement);\n this._htmlOverlays.delete(htmlElement);\n }\n\n /**\n * Removes all attached HTML overlay elements.\n */\n clear(): void {\n const overlays = Array.from(this._htmlOverlays.keys());\n for (const element of overlays) {\n this.remove(element);\n }\n this.forceUpdate();\n }\n\n /**\n * Hide/unhide all HTML overlay elements.\n * @param enable\n */\n visible(enable: boolean): void {\n const visible = enable === true ? 'visible' : 'hidden';\n this._visible = enable;\n\n this._htmlOverlays.forEach((_element, htmlElement) => {\n htmlElement.style.visibility = visible;\n });\n\n this._compositeOverlays.forEach(element => {\n element.style.visibility = visible;\n });\n //update the elements when visibilty is back to show overlay.\n this.forceUpdate();\n }\n\n /**\n * Updates positions of all overlays. This is automatically managed and there\n * shouldn't be any reason to trigger this unless the attached elements are\n * modified externally.\n *\n * Calling this function often might cause degraded performance.\n */\n forceUpdate(): void {\n // Do not update elements if overlay visibility is set to hidden/false.\n if (!this._visible) {\n return;\n }\n this.ensureNotDisposed();\n this.cleanupClusterElements();\n if (this._htmlOverlays.size === 0) {\n return;\n }\n this.updateNewElementSizes();\n\n const camera = this.viewerCamera;\n const renderer = this.viewerRenderer;\n const { camPos, camNormal, point, nearPlane, farPlane, position2D } = this._preallocatedVariables;\n\n // Determine near/far plane to cull based on distance. Note! We don't cull outside the \"walls\"\n // of the frustum to allow HTML elements that are partially outside the edges. The HTML clipping\n // will fix this anyways\n camera.getWorldPosition(camPos);\n camera.getWorldDirection(camNormal);\n point.copy(camPos).addScaledVector(camNormal, camera.near);\n nearPlane.setFromNormalAndCoplanarPoint(camNormal, point);\n point.copy(camPos).addScaledVector(camNormal, camera.far);\n farPlane.setFromNormalAndCoplanarPoint(camNormal, point);\n\n this._htmlOverlays.forEach((element, htmlElement) => {\n const {\n position3D,\n options: { positionUpdatedCallback, userData },\n state\n } = element;\n\n const insideCameraPlanes =\n nearPlane.distanceToPoint(position3D) >= 0.0 && farPlane.distanceToPoint(position3D) <= 0.0;\n // TODO 2021-11-19 larsmoa: Replace worldToViewportCoordinates() with something that doesn't cause\n // canvas.getClientBoundingRect() to be called when PR #1700 is done.\n // https://github.com/cognitedata/reveal/pull/1700\n const { x, y } = worldToViewportCoordinates(renderer, camera, position3D);\n\n if (insideCameraPlanes) {\n state.position2D.set(x, y);\n state.visible = true;\n } else {\n // Outside frustum - hide point\n state.visible = false;\n }\n\n if (positionUpdatedCallback) {\n position2D.set(x, y);\n const distanceToCamera = camPos.distanceTo(position3D);\n positionUpdatedCallback(htmlElement, position2D, position3D, distanceToCamera, userData);\n }\n });\n this.clusterElements();\n this.commitDOMChanges();\n }\n\n /**\n * Update size of new elements. This is only done once as this causes\n * layout to be invalidated which is an expensive operation.\n */\n private updateNewElementSizes() {\n this._htmlOverlays.forEach((element, htmlElement) => {\n if (element.state.width === -1) {\n const clientRect = htmlElement.getBoundingClientRect();\n element.state.width = clientRect.width;\n element.state.height = clientRect.height;\n }\n });\n }\n\n private commitDOMChanges() {\n const canvas = this.viewerRenderer.domElement;\n // Compute once as updating styles below will cause (unnecessary)\n // recomputation which slows down the process\n const offsetLeft = canvas.offsetLeft;\n const offsetTop = canvas.offsetTop;\n\n this._htmlOverlays.forEach((element, htmlElement) => {\n const { state } = element;\n htmlElement.style.left = `${state.position2D.x + offsetLeft}px`;\n htmlElement.style.top = `${state.position2D.y + offsetTop}px`;\n\n if (state.visible && htmlElement.style.visibility !== 'visible') {\n fadeIn(htmlElement);\n } else if (!state.visible && htmlElement.style.visibility !== 'hidden') {\n fadeOut(htmlElement);\n }\n });\n\n this._compositeOverlays.forEach(htmlElement => {\n this.viewerDomElement.appendChild(htmlElement);\n });\n }\n\n private clusterElements() {\n const options = this._options.clusteringOptions;\n if (options === undefined) {\n return;\n }\n\n switch (options.mode) {\n case 'overlapInScreenSpace':\n this.clusterByOverlapInScreenSpace(options.createClusterElementCallback);\n break;\n\n default:\n assertNever(options.mode, `Unsupported clustering mode: '${options.mode}`);\n }\n }\n\n private cleanupClusterElements(): void {\n this._compositeOverlays.forEach(element => {\n this.viewerDomElement.removeChild(element);\n });\n this._compositeOverlays.splice(0);\n }\n\n private clusterByOverlapInScreenSpace(createClusterElementCallback: HtmlOverlayCreateClusterDelegate) {\n type Element = HtmlOverlayElement & { htmlElement: HTMLElement };\n\n const canvas = this.viewerRenderer.domElement;\n const canvasBounds = domRectToBox2(canvas.getBoundingClientRect());\n const canvasSize = canvasBounds.getSize(new THREE.Vector2());\n canvasBounds.set(new THREE.Vector2(0, 0), canvasSize);\n // Compute once as updating styles below will cause (unnecessary)\n // recomputation which slows down the process\n\n const grid = new BucketGrid2D<Element>(canvasBounds, [10, 10]);\n for (const [htmlElement, element] of this._htmlOverlays.entries()) {\n const { state } = element;\n const elementBounds = createElementBounds(element);\n if (!state.visible || !elementBounds.intersectsBox(canvasBounds)) {\n continue;\n }\n grid.insert(elementBounds, { htmlElement, ...element });\n }\n\n const elementBounds = new THREE.Box2();\n const clusterMidpoint = new THREE.Vector2();\n for (const element of this._htmlOverlays.values()) {\n const { state } = element;\n createElementBounds(element, elementBounds);\n if (!state.visible || !elementBounds.intersectsBox(canvasBounds)) {\n continue;\n }\n\n const cluster = Array.from(grid.removeOverlappingElements(elementBounds));\n if (cluster.length > 1) {\n const midpoint = cluster\n .reduce((position, element) => position.add(element.state.position2D), clusterMidpoint.set(0, 0))\n .divideScalar(cluster.length);\n const compositeElement = createClusterElementCallback(\n cluster.map(element => ({ htmlElement: element.htmlElement, userData: element.options.userData }))\n );\n // Hide all elements in cluster\n cluster.forEach(element => (element.state.visible = false));\n // ... and replace with a composite\n this.addComposite(compositeElement, midpoint);\n }\n }\n }\n\n private addComposite(htmlElement: HTMLElement, position: THREE.Vector2) {\n const canvas = this.viewerRenderer.domElement;\n htmlElement.style.visibility = 'visible';\n htmlElement.style.left = `${position.x + canvas.offsetLeft}px`;\n htmlElement.style.top = `${position.y + canvas.offsetTop}px`;\n this._compositeOverlays.push(htmlElement);\n }\n\n private onSceneRendered(): void {\n this.forceUpdate();\n }\n\n private onViewerDisposed(): void {\n this.dispose();\n }\n}\n\n/**\n * Hides an element and applies a CSS transition.\n */\nfunction fadeOut(htmlElement: HTMLElement) {\n // https://stackoverflow.com/a/4861306\n htmlElement.style.visibility = 'hidden';\n htmlElement.style.opacity = '0';\n htmlElement.style.transition = 'visibility 0s 0.2s, opacity 0.2s linear';\n}\n\n/**\n * Shows an element and applies a CSS transition.\n */\nfunction fadeIn(htmlElement: HTMLElement) {\n // https://stackoverflow.com/a/4861306\n htmlElement.style.visibility = 'visible';\n htmlElement.style.opacity = '1';\n htmlElement.style.transition = 'opacity 0.2s linear';\n}\n\nfunction domRectToBox2(rect: DOMRect, out?: THREE.Box2): THREE.Box2 {\n out = out ?? new THREE.Box2();\n out.min.set(rect.left, rect.top);\n out.max.set(rect.right, rect.bottom);\n return out;\n}\n\nfunction createElementBounds(element: HtmlOverlayElement, out?: THREE.Box2) {\n const { state } = element;\n out = out ?? new THREE.Box2();\n out.min.set(state.position2D.x, state.position2D.y);\n out.max.set(state.position2D.x + state.width, state.position2D.y + state.height);\n return out;\n}\n","/*!\n * Copyright 2021 Cognite AS\n */\nimport * as THREE from 'three';\nimport { Cognite3DViewerToolBase } from './Cognite3DViewerToolBase';\nimport { MetricsLogger } from '@reveal/metrics';\nimport { Cognite3DModel } from '@reveal/api';\n\nexport class ExplodedViewTool extends Cognite3DViewerToolBase {\n private readonly _cadModel: Cognite3DModel;\n private _treeBoundingBoxdata!: Promise<{ treeIndex: number; direction: THREE.Vector3; transform: THREE.Matrix4 }[]>;\n private readonly _rootTreeIndex: number;\n\n public get readyPromise(): Promise<void> {\n return this._treeBoundingBoxdata.then();\n }\n\n constructor(treeIndex: number, cadModel: Cognite3DModel) {\n super();\n\n this._cadModel = cadModel;\n this._rootTreeIndex = treeIndex;\n\n this.preloadBoundingBoxData(cadModel, treeIndex);\n\n MetricsLogger.trackCreateTool('ExplodedViewTool');\n }\n\n public async expand(expandRadius: number): Promise<void> {\n const expandData = await this._treeBoundingBoxdata;\n\n await Promise.all(\n expandData.map(({ treeIndex, direction, transform }) => {\n if (expandRadius === 0) {\n this._cadModel.resetNodeTransformByTreeIndex(treeIndex);\n return Promise.resolve(0);\n }\n\n transform.setPosition(direction.x * expandRadius, direction.y * expandRadius, direction.z * expandRadius);\n\n return this._cadModel.setNodeTransformByTreeIndex(treeIndex, transform);\n })\n );\n }\n\n public reset(): void {\n this._cadModel.resetNodeTransformByTreeIndex(this._rootTreeIndex, true);\n }\n\n private preloadBoundingBoxData(cadModel: Cognite3DModel, treeIndex: number) {\n const rootTreeIndexBoundingBox = cadModel\n .getBoundingBoxByTreeIndex(treeIndex)\n .then(rootBoundingBox => rootBoundingBox.getCenter(new THREE.Vector3()));\n\n const subTreeBoundingBoxes = cadModel\n .getSubtreeTreeIndices(treeIndex)\n .then(subTreeIndices => {\n if (subTreeIndices.count > 1000) {\n throw new Error(`Subtree size of ${subTreeIndices.count} is too large (max size = 1000)`);\n }\n\n return subTreeIndices;\n })\n .then(subTreeIndices => {\n return Promise.all(\n subTreeIndices.toArray().map(async subTreeIndex => {\n // TODO 2021-06-09 larsmoa: We could make this a lot more efficient by\n // batching bounding box lookups together to one/a few API calls rather than\n // one per node\n const subTreeBox = await cadModel.getBoundingBoxByTreeIndex(subTreeIndex);\n return {\n subTreeIndex: subTreeIndex,\n subTreeIndexBoundingBoxCenter: subTreeBox.getCenter(new THREE.Vector3())\n };\n })\n );\n });\n\n this._treeBoundingBoxdata = Promise.all([rootTreeIndexBoundingBox, subTreeBoundingBoxes])\n .then(data => {\n const [rootCenter, subTreeCenters] = data;\n return subTreeCenters.map(({ subTreeIndex, subTreeIndexBoundingBoxCenter }) => {\n return {\n treeIndex: subTreeIndex,\n direction: new THREE.Vector3().subVectors(subTreeIndexBoundingBoxCenter, rootCenter),\n transform: new THREE.Matrix4()\n };\n });\n })\n .then(async payloads => {\n await Promise.all(\n payloads.map(payload => {\n return cadModel.setNodeTransformByTreeIndex(payload.treeIndex, payload.transform);\n })\n );\n return payloads;\n });\n }\n}\n","/*!\n * Copyright 2021 Cognite AS\n */\n\nimport * as THREE from 'three';\nimport { DisposedDelegate } from './types';\n\nimport { Cognite3DViewerToolBase } from './Cognite3DViewerToolBase';\nimport { Cognite3DViewer } from '@reveal/api';\n\nexport class DebugCameraTool extends Cognite3DViewerToolBase {\n private readonly _viewer: Cognite3DViewer;\n private readonly _onViewerDisposedHandler: DisposedDelegate;\n private _cameraHelper?: THREE.CameraHelper;\n\n private get viewerCamera(): THREE.PerspectiveCamera {\n return this._viewer.getCamera();\n }\n\n constructor(viewer: Cognite3DViewer) {\n super();\n\n this._onViewerDisposedHandler = this.onViewerDisposed.bind(this);\n this._viewer = viewer;\n this._viewer.on('disposed', this._onViewerDisposedHandler);\n }\n\n /**\n * Removes all elements and detaches from the viewer.\n * @override\n */\n dispose(): void {\n this._viewer.off('disposed', this._onViewerDisposedHandler);\n super.dispose();\n }\n\n showCameraHelper(): void {\n this.hideCameraHelper();\n this._cameraHelper = new THREE.CameraHelper(this.viewerCamera.clone() as THREE.PerspectiveCamera);\n this._viewer.addObject3D(this._cameraHelper);\n }\n\n hideCameraHelper(): void {\n if (this._cameraHelper !== undefined) {\n this._viewer.removeObject3D(this._cameraHelper);\n this._cameraHelper = undefined;\n }\n }\n\n private onViewerDisposed(): void {\n this.dispose();\n }\n}\n","const __WEBPACK_NAMESPACE_OBJECT__ = require(\"lodash/cloneDeep\");","const __WEBPACK_NAMESPACE_OBJECT__ = require(\"lodash/merge\");","const __WEBPACK_NAMESPACE_OBJECT__ = require(\"@tweenjs/tween.js\");","const __WEBPACK_NAMESPACE_OBJECT__ = require(\"glslify\");","/*!\n * Copyright 2021 Cognite AS\n */\n\nimport * as THREE from 'three';\n\n/**\n * Configuration of {@link AxisViewTool}.\n */\nexport type AxisBoxConfig = {\n /**\n * Size in pixels of the axis tool.\n */\n size?: number;\n /**\n * Position, either absolute or relative.\n */\n position?: AbsolutePosition | RelativePosition;\n /**\n * How long the camera animation lasts when\n * clicking a face of the orientation box.\n */\n animationSpeed?: number;\n /**\n * Configuration for each of the faces of the orientation box.\n * Note that Reveal uses a right-handed Y up coordinate system,\n * which might differ from the original model space. To account\n * for this, you might want to reassign labels of the faces.\n */\n faces?: {\n xPositiveFace?: AxisBoxFaceConfig;\n xNegativeFace?: AxisBoxFaceConfig;\n yPositiveFace?: AxisBoxFaceConfig;\n yNegativeFace?: AxisBoxFaceConfig;\n zPositiveFace?: AxisBoxFaceConfig;\n zNegativeFace?: AxisBoxFaceConfig;\n };\n /**\n * Configuration of the compass \"base\" of the tool.\n */\n compass?: AxisBoxCompassConfig;\n};\n\n/**\n * Absolute position in pixels.\n */\nexport type AbsolutePosition = {\n xAbsolute: number;\n yAbsolute: number;\n};\n\n/**\n * Relative position from a corner of the viewer\n * and a given padding.\n */\nexport type RelativePosition = {\n corner: Corner;\n padding: THREE.Vector2;\n};\n\n/**\n * Configuration of each face of the orientation box.\n */\nexport type AxisBoxFaceConfig = {\n /**\n * Label of the respective face, e.g. 'X' or 'Right'.\n */\n label?: string;\n fontSize?: number;\n fontColor?: THREE.Color;\n outlineSize?: number;\n outlineColor?: THREE.Color;\n faceColor?: THREE.Color;\n};\n\n/**\n * Configuration of the compass.\n */\nexport type AxisBoxCompassConfig = {\n /**\n * Label of the orientation indicator. Defaults\n * to 'N' for north.\n */\n ringLabel?: string;\n /**\n * Offset in radians of the orientation indicator.\n */\n labelDelta?: number;\n fontSize?: number;\n fontColor?: THREE.Color;\n tickColor?: THREE.Color;\n};\n\n/**\n * A corner of the viewer.\n */\nexport enum Corner {\n TopRight,\n TopLeft,\n BottomLeft,\n BottomRight\n}\n\nexport const defaultAxisBoxCompassConfig: AxisBoxCompassConfig = {\n ringLabel: 'N',\n labelDelta: Math.PI,\n fontSize: undefined,\n fontColor: new THREE.Color(0xff0000),\n tickColor: new THREE.Color(0x949494)\n};\n\nexport const defaultFaceConfig: AxisBoxFaceConfig = {\n label: '',\n fontSize: undefined,\n fontColor: new THREE.Color(0x333333),\n outlineSize: undefined,\n outlineColor: new THREE.Color(0x333333),\n faceColor: new THREE.Color(0x949494)\n};\n\nexport const defaultAxisBoxConfig: Required<AxisBoxConfig> = {\n size: 128,\n position: {\n corner: Corner.BottomRight,\n padding: new THREE.Vector2()\n },\n animationSpeed: 200,\n faces: {\n xPositiveFace: {\n ...defaultFaceConfig,\n label: 'Right'\n },\n xNegativeFace: {\n ...defaultFaceConfig,\n label: 'Left'\n },\n yPositiveFace: {\n ...defaultFaceConfig,\n label: 'Up'\n },\n yNegativeFace: {\n ...defaultFaceConfig,\n label: 'Down'\n },\n zPositiveFace: {\n ...defaultFaceConfig,\n label: 'Front'\n },\n zNegativeFace: {\n ...defaultFaceConfig,\n label: 'Back'\n }\n },\n compass: defaultAxisBoxCompassConfig\n};\n","/*!\n * Copyright 2021 Cognite AS\n */\n\nimport * as THREE from 'three';\nimport cloneDeep from 'lodash/cloneDeep';\nimport merge from 'lodash/merge';\nimport TWEEN from '@tweenjs/tween.js';\nimport glsl from 'glslify';\n\nimport { Cognite3DViewerToolBase } from '../Cognite3DViewerToolBase';\nimport {\n AxisBoxConfig,\n defaultAxisBoxConfig,\n AxisBoxFaceConfig,\n Corner,\n AbsolutePosition,\n RelativePosition\n} from './types';\nimport { MetricsLogger } from '@reveal/metrics';\nimport { Cognite3DViewer } from '@reveal/api';\n\nexport class AxisViewTool extends Cognite3DViewerToolBase {\n private readonly _layoutConfig: Required<AxisBoxConfig>;\n\n private readonly _boxFaceGeometry: THREE.PlaneGeometry;\n\n private readonly _viewer: Cognite3DViewer;\n\n private readonly _axisGroup: THREE.Group;\n\n private readonly _interactiveObjects: THREE.Mesh[];\n private readonly _raycaster: THREE.Raycaster;\n\n private readonly _screenPosition: THREE.Vector2;\n\n private readonly _disposeClickDiv: () => void;\n\n private _dynamicUpdatePosition = () => {};\n private readonly _updateClickDiv = () => {};\n\n constructor(viewer: Cognite3DViewer, config?: AxisBoxConfig) {\n super();\n\n this._screenPosition = new THREE.Vector2();\n this._boxFaceGeometry = new THREE.PlaneGeometry(0.9, 0.9, 1, 1);\n\n this._raycaster = new THREE.Raycaster();\n this._raycaster.layers.enableAll();\n\n this._viewer = viewer;\n\n this._layoutConfig = merge(cloneDeep(defaultAxisBoxConfig), config);\n\n this._axisGroup = new THREE.Group();\n this._axisGroup.name = 'Axis View Tool';\n this._axisGroup.renderOrder = 1;\n this._interactiveObjects = this.createAxisCross(this._axisGroup);\n\n [this._updateClickDiv, this._disposeClickDiv] = this.createClickDiv(viewer);\n this.addAxisBoxToViewer(this._axisGroup, this._layoutConfig.position!);\n\n MetricsLogger.trackCreateTool('AxisViewTool');\n }\n\n public dispose(): void {\n super.dispose();\n this._viewer.removeObject3D(this._axisGroup);\n this._disposeClickDiv();\n }\n\n private createClickDiv(viewer: Cognite3DViewer) {\n const canvasElement = viewer.domElement.querySelector('canvas');\n if (canvasElement === null) {\n throw new Error('Could not find canvas');\n }\n const divElement = document.createElement('div');\n divElement.style.position = 'absolute';\n divElement.style.height = `${this._layoutConfig.size}px`;\n divElement.style.width = `${this._layoutConfig.size}px`;\n divElement.style.zIndex = '1';\n\n divElement.addEventListener('mousedown', event => {\n event.stopPropagation();\n });\n\n divElement.addEventListener('contextmenu', event => event.preventDefault());\n\n divElement.addEventListener('mouseup', event => {\n const rect = viewer.domElement.getBoundingClientRect();\n const x = event.clientX - rect.left;\n const y = event.clientY - rect.top;\n this.handleClick(x, y, rect);\n event.stopPropagation();\n });\n\n viewer.domElement.appendChild(divElement);\n\n return [\n () => {\n divElement.style.left = `${this._screenPosition.x}px`;\n divElement.style.bottom = `${this._screenPosition.y}px`;\n },\n () => {\n viewer.domElement.removeChild(divElement);\n }\n ];\n }\n\n private addAxisBoxToViewer(axisGroup: THREE.Group, position: AbsolutePosition | RelativePosition) {\n const size = this._layoutConfig.size;\n\n if (isAbsolute(position)) {\n this._screenPosition.x = position.xAbsolute;\n this._screenPosition.y = position.yAbsolute;\n } else {\n switch (position.corner) {\n case Corner.BottomRight:\n this._screenPosition.y = position.padding.y;\n\n this._dynamicUpdatePosition = () => {\n this._screenPosition.x = this._viewer.renderer.domElement.clientWidth - position.padding.x - size;\n };\n break;\n\n case Corner.TopRight:\n this._dynamicUpdatePosition = () => {\n this._screenPosition.x = this._viewer.renderer.domElement.clientWidth - position.padding.x - size;\n this._screenPosition.y = this._viewer.renderer.domElement.clientHeight - position.padding.y - size;\n };\n break;\n\n case Corner.TopLeft:\n this._screenPosition.x = position.padding.x;\n this._dynamicUpdatePosition = () => {\n this._screenPosition.y = this._viewer.renderer.domElement.clientHeight - position.padding.y - size;\n };\n break;\n\n case Corner.BottomLeft:\n this._screenPosition.x = position.padding.x;\n this._screenPosition.y = position.padding.y;\n break;\n default:\n throw new Error(`Unknown corner position for Axis Cross: Corner = ${position.corner}`);\n }\n this._dynamicUpdatePosition();\n }\n\n this._viewer.addObject3D(axisGroup);\n\n function isAbsolute(position: AbsolutePosition | RelativePosition): position is AbsolutePosition {\n return (\n (position as AbsolutePosition).xAbsolute !== undefined && (position as AbsolutePosition).yAbsolute !== undefined\n );\n }\n }\n\n private handleClick(xScreenPos: number, yScreenPos: number, boundingRect: DOMRect): boolean {\n const xNdc = (2 * (xScreenPos - this._screenPosition.x)) / this._layoutConfig.size - 1;\n const yNdc = (2 * (boundingRect.height - yScreenPos - this._screenPosition.y)) / this._layoutConfig.size - 1;\n const rayOrigin = new THREE.Vector3(xNdc, yNdc, 1);\n const rayDirection = new THREE.Vector3(0, 0, -1).normalize();\n this._raycaster.set(rayOrigin, rayDirection);\n\n const intersects = this._raycaster.intersectObjects(this._interactiveObjects);\n\n if (!(intersects.length > 0)) return false;\n\n const targetPosition = intersects[0].object.position.clone().normalize();\n const targetUp = (intersects[0].object.userData.upVector as THREE.Vector3).clone();\n\n this.moveCameraTo(targetPosition, targetUp);\n\n return true;\n }\n\n private createAxisCross(axisGroup: THREE.Group) {\n const compass = this.createCompass();\n axisGroup.add(compass);\n\n const interactiveObjects = this.createBoxFaces();\n axisGroup.add(...interactiveObjects);\n\n this.setupTransformOnRender(axisGroup);\n\n return interactiveObjects;\n }\n\n private setupTransformOnRender(axisGroup: THREE.Group) {\n axisGroup.children[0].onBeforeRender = (renderer: THREE.WebGLRenderer) => {\n this._dynamicUpdatePosition();\n axisGroup.quaternion.copy(this._viewer.getCamera().quaternion).invert();\n axisGroup.updateMatrixWorld();\n this._updateClickDiv();\n\n const cWidth = renderer.domElement.clientWidth;\n const cHeight = renderer.domElement.clientHeight;\n\n const renderSize = new THREE.Vector2();\n renderer.getSize(renderSize);\n\n const size = this._layoutConfig.size;\n\n const scale = new THREE.Vector2(size / cWidth, size / cHeight);\n const offset = new THREE.Vector2(\n (this._screenPosition.x / cWidth) * 2 + size / cWidth,\n (this._screenPosition.y / cHeight) * 2 + size / cHeight\n );\n\n axisGroup.traverse(node => {\n if (node instanceof THREE.Mesh) {\n (node.material as THREE.RawShaderMaterial).uniforms.offset.value = offset;\n (node.material as THREE.RawShaderMaterial).uniforms.scale.value = scale;\n (node.material as THREE.RawShaderMaterial).uniformsNeedUpdate = true;\n }\n });\n };\n }\n\n private createBoxFaces() {\n const facesConfig = this._layoutConfig.faces;\n\n const posXFace = this.createBoxFace(new THREE.Vector3(1, 0, 0), facesConfig.xPositiveFace!);\n const negXFace = this.createBoxFace(new THREE.Vector3(-1, 0, 0), facesConfig.xNegativeFace!);\n\n const posYFace = this.createBoxFace(\n new THREE.Vector3(0, 1, 0),\n facesConfig.yPositiveFace!,\n new THREE.Vector3(0, 0, -1)\n );\n const negYFace = this.createBoxFace(\n new THREE.Vector3(0, -1, 0),\n facesConfig.yNegativeFace!,\n new THREE.Vector3(0, 0, 1)\n );\n\n const posZFace = this.createBoxFace(new THREE.Vector3(0, 0, 1), facesConfig.zPositiveFace!);\n const negZFace = this.createBoxFace(new THREE.Vector3(0, 0, -1), facesConfig.zNegativeFace!);\n\n return [posXFace, negXFace, posYFace, negYFace, posZFace, negZFace];\n }\n\n private createCompass() {\n const compassPlaneGeometry = new THREE.PlaneGeometry(2, 2, 1, 1);\n const compass = new THREE.Mesh(\n compassPlaneGeometry,\n new THREE.RawShaderMaterial({\n vertexShader: glsl(require('./shaders/axisTool.vert').default),\n fragmentShader: glsl(require('./shaders/axisTool.frag').default),\n uniforms: {\n offset: { value: new THREE.Vector2() },\n scale: { value: new THREE.Vector2() },\n tex: { value: this.createCompassTexture() }\n },\n side: THREE.DoubleSide,\n glslVersion: THREE.GLSL3,\n depthTest: false,\n blending: THREE.CustomBlending,\n blendDst: THREE.OneMinusSrcAlphaFactor,\n blendSrc: THREE.SrcAlphaFactor\n })\n );\n\n compass.frustumCulled = false;\n compass.renderOrder = 1;\n\n const x = Math.sin(this._layoutConfig.compass.labelDelta!);\n const z = Math.cos(this._layoutConfig.compass.labelDelta!);\n\n compass.position.y = -0.45;\n compass.up.copy(new THREE.Vector3(x, 0, z));\n compass.lookAt(0, 0, 0);\n\n return compass;\n }\n\n private createCompassTexture() {\n const compassLayout = this._layoutConfig.compass;\n const textureSize = this._layoutConfig.size;\n\n const canvas = document.createElement('canvas');\n canvas.width = textureSize;\n canvas.height = textureSize;\n const context = canvas.getContext('2d')!;\n\n const halfSize = textureSize / 2;\n const radius = halfSize - halfSize / 4;\n\n const tickWidth = textureSize / 32;\n const tickSpace = textureSize / 8;\n\n context.strokeStyle = compassLayout.tickColor!.getStyle();\n context.lineWidth = textureSize / 16;\n context.setLineDash([tickWidth, tickSpace]);\n context.beginPath();\n context.arc(halfSize, halfSize, radius, 0, 2 * Math.PI);\n context.stroke();\n\n if (compassLayout.ringLabel && compassLayout.ringLabel.length > 0) {\n const fontSize = compassLayout.fontSize ?? textureSize / 5;\n context.font = `bold ${fontSize}px Arial`;\n context.textAlign = 'center';\n context.fillStyle = compassLayout.fontColor!.getStyle();\n context.fillText(compassLayout.ringLabel, halfSize, halfSize * (1 / 4) + fontSize / 3);\n }\n\n return new THREE.CanvasTexture(canvas);\n }\n\n private getFaceTexture(faceConfig: AxisBoxFaceConfig, size: number) {\n const textureSize = size / 2;\n\n const canvas = document.createElement('canvas');\n canvas.width = textureSize;\n canvas.height = textureSize;\n\n const context = canvas.getContext('2d')!;\n context.fillStyle = faceConfig.outlineColor!.getStyle();\n context.fillRect(0, 0, textureSize, textureSize);\n context.fillStyle = faceConfig.faceColor!.getStyle();\n\n const outlineSize = faceConfig.outlineSize ?? textureSize / 32;\n context.fillRect(outlineSize, outlineSize, textureSize - outlineSize * 2, textureSize - outlineSize * 2);\n context.fill();\n\n if (faceConfig.label !== '') {\n const fontSize = faceConfig.fontSize ?? textureSize / 3;\n context.font = `bold ${fontSize}px Arial`;\n context.textAlign = 'center';\n context.fillStyle = faceConfig.fontColor!.getStyle();\n context.fillText(faceConfig.label!, textureSize / 2, textureSize / 2 + fontSize / 3);\n }\n\n return new THREE.CanvasTexture(canvas);\n }\n\n private createBoxFace(position: THREE.Vector3, faceConfig: AxisBoxFaceConfig, upVector = new THREE.Vector3(0, 1, 0)) {\n const face = new THREE.Mesh(\n this._boxFaceGeometry,\n new THREE.RawShaderMaterial({\n vertexShader: glsl(require('./shaders/axisTool.vert').default),\n fragmentShader: glsl(require('./shaders/axisTool.frag').default),\n uniforms: {\n offset: { value: new THREE.Vector2() },\n scale: { value: new THREE.Vector2() },\n tex: { value: this.getFaceTexture(faceConfig, this._layoutConfig.size) }\n },\n depthTest: false,\n glslVersion: THREE.GLSL3,\n // Even if this isn't transparent, we want ThreeJS to draw the object\n // after transparent objects so its correctly blended\n transparent: true\n })\n );\n\n face.frustumCulled = false;\n face.renderOrder = 1000; // Draw last (i.e. on top)\n\n face.position.copy(position.multiplyScalar(0.5 * this._boxFaceGeometry.parameters.width));\n face.lookAt(position.multiplyScalar(2));\n\n face.userData.upVector = upVector;\n\n return face;\n }\n\n private moveCameraTo(targetAxis: THREE.Vector3, targetUpAxis: THREE.Vector3) {\n const cameraManager = this._viewer.cameraManager;\n\n const { position: currentCameraPosition, target: cameraTarget, rotation } = cameraManager.getCameraState();\n\n const targetRelativeStartPosition = currentCameraPosition.clone().sub(cameraTarget);\n const radius = targetRelativeStartPosition.length();\n\n const normalizedFrom = targetRelativeStartPosition.clone().normalize();\n\n const omega = Math.acos(normalizedFrom.dot(targetAxis));\n\n const from = { t: 0 };\n const to = { t: 1 };\n\n const animation = new TWEEN.Tween(from);\n\n const forward = targetAxis.clone();\n\n const fromRotation = rotation.clone();\n const toRotation = new THREE.Quaternion().setFromRotationMatrix(\n new THREE.Matrix4().makeBasis(targetUpAxis.clone().cross(forward), targetUpAxis, forward)\n );\n\n const epsilon = 1e-6;\n\n if (fromRotation.angleTo(toRotation) < epsilon) {\n return;\n }\n\n const tmpPosition = new THREE.Vector3();\n const tmpRotation = new THREE.Quaternion();\n\n const tween = animation\n .to(to, this._layoutConfig.animationSpeed)\n .onUpdate(() => {\n tmpPosition\n .copy(normalizedFrom)\n .multiplyScalar(Math.sin((1 - from.t) * omega) / Math.sin(omega))\n .add(targetAxis.clone().multiplyScalar(Math.sin(from.t * omega) / Math.sin(omega)));\n\n tmpPosition.multiplyScalar(radius);\n tmpPosition.add(cameraTarget);\n\n tmpRotation.slerpQuaternions(fromRotation, toRotation, from.t);\n\n cameraManager.setCameraState({ position: tmpPosition, rotation: tmpRotation });\n })\n .onComplete(() => {\n cameraManager.setCameraState({ position: tmpPosition, target: cameraTarget });\n })\n .start(TWEEN.now());\n\n tween.update(TWEEN.now());\n }\n}\n","/*!\n * Copyright 2021 Cognite AS\n */\n\nimport { Cognite3DModel } from '@reveal/api';\nimport { NodeAppearance, NodeCollection } from '@reveal/cad-styling';\nimport { MetricsLogger } from '@reveal/metrics';\n\n/**\n * Timeline Key Frames contains parameters to access Nodes, Styles for the Timeline\n */\nexport class Keyframe {\n private readonly _date: Date;\n private readonly _model: Cognite3DModel;\n private readonly _nodeCollectionAndAppearance: { nodes: NodeCollection; nodeAppearance: NodeAppearance }[] = [];\n\n constructor(model: Cognite3DModel, date: Date) {\n this._model = model;\n this._date = date;\n }\n\n /**\n * Get date of the Keyframe\n * @returns date\n */\n public getKeyframeDate(): Date {\n return this._date;\n }\n\n /**\n * Assigns the styles for the node set for the model for this Keyframe\n */\n public activate(): void {\n this._nodeCollectionAndAppearance.forEach((node, _index) => {\n this._model.assignStyledNodeCollection(node.nodes, node.nodeAppearance);\n });\n }\n\n /**\n * Removes the style for the model\n */\n public deactivate(): void {\n this._nodeCollectionAndAppearance.forEach((node, _index) => {\n this._model.unassignStyledNodeCollection(node.nodes);\n });\n }\n\n /**\n * Add node & style to the collection. If the collection has been added, the style is updated to the\n * appearance provided.\n * @param nodeCollection Node set to apply the Styles\n * @param nodeAppearance Style to assign to the node collection\n */\n public assignStyledNodeCollection(nodeCollection: NodeCollection, nodeAppearance: NodeAppearance): void {\n MetricsLogger.trackCadModelStyled(nodeCollection.classToken, nodeAppearance);\n\n const index = this._nodeCollectionAndAppearance.findIndex(x => x.nodes === nodeCollection);\n if (index !== -1) {\n this._nodeCollectionAndAppearance[index].nodeAppearance = nodeAppearance;\n } else {\n this._nodeCollectionAndAppearance.push({ nodes: nodeCollection, nodeAppearance });\n }\n }\n\n /**\n * Remove Node & Style for this keyframe's nodeCollection and nodeAppearance\n * @param nodeCollection Nodes to be unassign from node collection\n */\n public unassignStyledNodeCollection(nodeCollection: NodeCollection): void {\n const index = this._nodeCollectionAndAppearance.findIndex(x => x.nodes === nodeCollection);\n if (index === -1) {\n throw new Error('Node collection has not been assigned to model');\n }\n this._nodeCollectionAndAppearance.splice(index, 1);\n }\n}\n","/*!\n * Copyright 2021 Cognite AS\n */\n\nimport TWEEN from '@tweenjs/tween.js';\n\nimport { Cognite3DViewerToolBase } from '../Cognite3DViewerToolBase';\nimport { Keyframe } from './Keyframe';\nimport { TimelineDateUpdateDelegate } from './types';\nimport { EventTrigger, assertNever } from '@reveal/utilities';\nimport { Cognite3DModel } from '@reveal/api';\n\n/**\n * Tool to applying styles to nodes based on date to play them over in Timeline\n */\nexport class TimelineTool extends Cognite3DViewerToolBase {\n private readonly _model: Cognite3DModel;\n private readonly _keyframes: Keyframe[];\n private _playback: TWEEN.Tween | undefined = undefined;\n private readonly _events = { dateChanged: new EventTrigger<TimelineDateUpdateDelegate>() };\n\n constructor(cadModel: Cognite3DModel) {\n super();\n\n this._model = cadModel;\n this._keyframes = new Array<Keyframe>();\n }\n\n /**\n * Subscribe to the Date changed event\n * @param event `dateChanged` event\n * @param listener Listen to Timeline date Update during Playback\n */\n public subscribe(event: 'dateChanged', listener: TimelineDateUpdateDelegate): void {\n switch (event) {\n case 'dateChanged':\n this._events.dateChanged.subscribe(listener);\n break;\n default:\n assertNever(event, `Unsupported event: '${event}'`);\n }\n }\n\n /**\n * Unsubscribe to the Date changed event\n * @param event `dateChanged` event\n * @param listener Remove Listen to Timeline date Update\n */\n public unsubscribe(event: 'dateChanged', listener: TimelineDateUpdateDelegate): void {\n switch (event) {\n case 'dateChanged':\n this._events.dateChanged.unsubscribe(listener);\n break;\n default:\n assertNever(event, `Unsupported event: '${event}'`);\n }\n }\n\n /**\n * Create Key frame for the Timeline\n * @param date - date value by Date.now() since January 1, 1970\n */\n public createKeyframe(date: Date): Keyframe {\n const keyframe = new Keyframe(this._model, date);\n this._keyframes.push(keyframe);\n this.sortKeyframesByDates();\n\n return keyframe;\n }\n\n /**\n * Returns the keyframe at the date given, or undefined if not found.\n * @param date\n * @returns\n */\n public getKeyframeByDate(date: Date): Keyframe | undefined {\n return this._keyframes.find(candidate => candidate.getKeyframeDate() === date);\n }\n\n /**\n * Removes the Keyframe from the timeline. Does nothing if the keyframe isn't part of the timeline.\n * @param keyframe - Keyframe to be removed from the timeline\n */\n public removeKeyframe(keyframe: Keyframe): void {\n const index = this._keyframes.findIndex(obj => obj === keyframe);\n\n if (index > -1) {\n this._keyframes.splice(index, 1);\n }\n }\n\n /**\n * Removes the Keyframe from the Timeline\n * @param date - Date of the Keyframe to be removed from the Timeline\n */\n public removeKeyframeByDate(date: Date): void {\n const index = this._keyframes.findIndex(obj => obj.getKeyframeDate() === date);\n\n if (index > -1) {\n this._keyframes.splice(index, 1);\n }\n }\n\n /**\n * Starts playback of Timeline\n * @param startDate - Keyframe date to start the Playback of Keyframes\n * @param endDate - Keyframe date to stop the Playback of Keyframes\n * @param totalDurationInMilliSeconds - Number of milliseconds for all Keyframe within startDate & endDate to be rendered\n */\n public play(startDate: Date, endDate: Date, totalDurationInMilliSeconds: number): void {\n this.stop();\n\n const playState = { dateInMs: startDate.getTime() };\n const to = { dateInMs: endDate.getTime() };\n const tween = new TWEEN.Tween(playState).to(to, totalDurationInMilliSeconds);\n let currentKeyframeIndex = -1;\n tween.onUpdate(() => {\n const date = new Date(playState.dateInMs);\n\n // Forward active keyframe to last keyframe that is before current date\n const prevIndex = currentKeyframeIndex;\n while (\n currentKeyframeIndex < this._keyframes.length - 1 &&\n this._keyframes[currentKeyframeIndex + 1].getKeyframeDate().getTime() <= date.getTime()\n ) {\n currentKeyframeIndex++;\n }\n\n if (currentKeyframeIndex !== prevIndex) {\n if (prevIndex !== -1) {\n this._keyframes[prevIndex].deactivate();\n }\n this._keyframes[currentKeyframeIndex].activate();\n }\n\n this._events.dateChanged.fire({\n date: date,\n activeKeyframe: this._keyframes[currentKeyframeIndex],\n startDate: startDate,\n endDate: endDate\n });\n });\n\n this._playback = tween;\n tween.start();\n }\n\n /**\n * Stops any ongoing playback\n */\n public stop(): void {\n if (this._playback !== undefined) {\n this._playback.stop();\n this._playback = undefined;\n }\n }\n\n /**\n * Pause any ongoing playback\n */\n public pause(): void {\n if (this._playback !== undefined && this._playback.isPlaying()) {\n this._playback.pause();\n }\n }\n\n /**\n * Resume any paused playback\n */\n public resume(): void {\n if (this._playback !== undefined && this._playback.isPaused()) {\n this._playback.resume();\n }\n }\n\n /**\n * Provides all Keyframes in the Timeline\n * @returns All Keyframes in Timeline\n */\n public getAllKeyframes(): Keyframe[] {\n return this._keyframes.slice();\n }\n\n public dispose(): void {\n super.dispose();\n this._events.dateChanged.unsubscribeAll();\n }\n\n /**\n * Sort the Timeline Keyframe by their Date\n */\n private sortKeyframesByDates() {\n if (this._keyframes.length > 1) {\n this._keyframes.sort((a: Keyframe, b: Keyframe) => {\n return a.getKeyframeDate().getTime() - b.getKeyframeDate().getTime();\n });\n }\n }\n}\n","/*!\n * Copyright 2022 Cognite AS\n */\n\nimport labelCSS from './styles/Label.css';\n\nexport class MeasurementLabels {\n static readonly stylesId = 'reveal-measurement-label';\n\n constructor() {\n MeasurementLabels.ensureStylesLoaded();\n }\n\n /**\n * Create a HTML element with a string and return the element.\n * @param label String on the label.\n * @returns HTMLDivElement.\n */\n createLabel(label: string): HTMLDivElement {\n const element = document.createElement('div');\n element.innerText = label;\n element.className = MeasurementLabels.stylesId;\n return element;\n }\n\n /**\n * Load the the styles from the CSS and appends them to the label.\n * @returns Return if styles already loaded.\n */\n private static ensureStylesLoaded() {\n if (document.getElementById(MeasurementLabels.stylesId)) {\n return;\n }\n\n const style = document.createElement('style');\n style.id = MeasurementLabels.stylesId;\n style.appendChild(document.createTextNode(labelCSS));\n document.head.appendChild(style);\n }\n}\n","export default \".reveal-measurement-label {\\n\\tposition: absolute;\\n\\n /* Anchor to the center of the element and ignore events */\\n transform: translate(-50%, -50%);\\n pointer-events: none;\\n touch-action: none;\\n user-select: none;\\n border-radius: 6px;\\n\\n /* Make it look nice */\\n padding: 6px;\\n color: #fff;\\n background: #232323da;\\n border: #ffffff22 solid 1px;\\n overflow: hidden;\\n white-space: nowrap;\\n\\n /*Font - fallback to generic font if Inter not available*/\\n font-family: 'Inter', sans-serif;\\n font-style: normal;\\n font-weight: 500;\\n}\\n\";","const __WEBPACK_NAMESPACE_OBJECT__ = require(\"three-stdlib\");","/*!\n * Copyright 2022 Cognite AS\n */\n\nimport * as THREE from 'three';\nimport { LineGeometry, LineMaterial, Line2 } from 'three-stdlib';\n\nexport class MeasurementLine {\n private readonly _geometry: LineGeometry;\n private readonly _meshes: THREE.Group;\n private readonly _fixedWidthLineMaterial: LineMaterial;\n private readonly _adaptiveWidthLineMaterial: LineMaterial;\n private readonly _position: Float32Array;\n\n constructor(lineWidth: number, lineColor: THREE.Color, startPoint: THREE.Vector3) {\n this._position = new Float32Array(6);\n this._geometry = new LineGeometry();\n\n //Adaptive Line width\n this._adaptiveWidthLineMaterial = new LineMaterial({\n color: lineColor.getHex(),\n linewidth: lineWidth,\n worldUnits: true,\n depthTest: false\n });\n\n //Fixed line Width.\n this._fixedWidthLineMaterial = new LineMaterial({\n color: lineColor.getHex(),\n linewidth: 2, // Tests have shown this to work reasonable on tested devices\n worldUnits: false,\n depthTest: false\n });\n\n this._meshes = new THREE.Group();\n this._meshes.name = 'Measurement';\n\n const onBeforeRenderTrigger = new THREE.Mesh(new THREE.BufferGeometry());\n onBeforeRenderTrigger.name = 'onBeforeRenderTrigger trigger (no geometry)';\n onBeforeRenderTrigger.frustumCulled = false;\n const resolution = new THREE.Vector2();\n onBeforeRenderTrigger.onBeforeRender = renderer => {\n const { width, height } = renderer.domElement.getBoundingClientRect();\n resolution.set(width, height);\n this._adaptiveWidthLineMaterial.resolution = this._fixedWidthLineMaterial.resolution = resolution;\n };\n this._meshes.add(onBeforeRenderTrigger);\n this.startLine(startPoint);\n }\n\n dispose(): void {\n if (this._geometry) {\n this._geometry.dispose();\n }\n this._adaptiveWidthLineMaterial.dispose();\n this._fixedWidthLineMaterial.dispose();\n this._meshes.clear();\n this._meshes.removeFromParent();\n }\n\n get meshes(): THREE.Group {\n return this._meshes;\n }\n\n /**\n * Update the measuring line end point.\n * @param endPoint Second point of the line to end the measurement.\n */\n updateLine(endPoint: THREE.Vector3): void {\n this._position[3] = endPoint.x;\n this._position[4] = endPoint.y;\n this._position[5] = endPoint.z;\n //Update the line geometry end point.\n this._geometry.setPositions(this._position);\n }\n\n /**\n * Get the distance between the measuring line start point & end point.\n * @returns Return distance between start & end point of the line.\n */\n getMeasuredDistance(): number {\n const startPoint = new THREE.Vector3(this._position[0], this._position[1], this._position[2]);\n const endPoint = new THREE.Vector3(this._position[3], this._position[4], this._position[5]);\n return endPoint.distanceTo(startPoint);\n }\n\n /**\n * Calculate mid point on the Line.\n * @returns Returns mid point between start and end points.\n */\n getMidPointOnLine(): THREE.Vector3 {\n const startPoint = new THREE.Vector3(this._position[0], this._position[1], this._position[2]);\n const endPoint = new THREE.Vector3(this._position[3], this._position[4], this._position[5]);\n let direction = endPoint.clone().sub(startPoint);\n const length = direction.length();\n direction = direction.normalize().multiplyScalar(length * 0.5);\n\n return startPoint.clone().add(direction);\n }\n\n /**\n * Update current line width.\n * @param lineWidth Width of the measuring line mesh.\n */\n updateLineWidth(lineWidth: number): void {\n this._adaptiveWidthLineMaterial.linewidth = lineWidth;\n }\n\n /**\n * Update current line color.\n * @param color Color of the measuring line mesh.\n */\n updateLineColor(color: THREE.Color): void {\n this._fixedWidthLineMaterial.color = this._adaptiveWidthLineMaterial.color = color;\n }\n\n /**\n * Generate line geometry and create the mesh.\n * @param point Point from where the line will be generated.\n */\n private startLine(point: THREE.Vector3): void {\n this._position[0] = this._position[3] = point.x;\n this._position[1] = this._position[4] = point.y;\n this._position[2] = this._position[5] = point.z;\n\n this._geometry.setPositions(this._position);\n\n const adaptiveMesh = new Line2(this._geometry, this._adaptiveWidthLineMaterial);\n //Assign bounding sphere & box for the line to support raycasting.\n adaptiveMesh.computeLineDistances();\n //Make sure line are rendered in-front of other objects.\n adaptiveMesh.renderOrder = 100;\n\n //Fixed line width when camera is zoom out or far away from the line.\n const fixedMesh = new Line2(this._geometry, this._fixedWidthLineMaterial);\n fixedMesh.computeLineDistances();\n fixedMesh.renderOrder = 100;\n\n this._meshes.add(adaptiveMesh);\n this._meshes.add(fixedMesh);\n }\n}\n","/*!\n * Copyright 2022 Cognite AS\n */\n\nimport * as THREE from 'three';\nimport { HtmlOverlayTool } from '../HtmlOverlay/HtmlOverlayTool';\nimport { MeasurementLabels } from './MeasurementLabels';\nimport { MeasurementLine } from './MeasurementLine';\nimport { MeasurementOptions } from './types';\n\nexport type Measurement = {\n readonly measurementId: number;\n readonly startPoint: THREE.Vector3;\n readonly endPoint: THREE.Vector3;\n readonly distanceInMeters: number;\n};\n\nexport class MeasurementManager {\n private readonly _measurementLabel: MeasurementLabels;\n private readonly _line: MeasurementLine;\n private readonly _options: Required<MeasurementOptions>;\n private readonly _domElement: HTMLElement;\n private readonly _camera: THREE.Camera;\n private readonly _meshGroup: THREE.Group;\n private readonly _htmlOverlay: HtmlOverlayTool;\n private _labelElement: HTMLDivElement | undefined;\n private readonly _distanceToCamera: number;\n private readonly _startPoint: THREE.Vector3;\n private _measurement: Measurement = {\n measurementId: 0,\n startPoint: new THREE.Vector3(),\n endPoint: new THREE.Vector3(),\n distanceInMeters: 0\n };\n\n constructor(\n viewerDomElement: HTMLElement,\n camera: THREE.Camera,\n meshGroup: THREE.Group,\n options: Required<MeasurementOptions>,\n overlay: HtmlOverlayTool,\n startPoint: THREE.Vector3\n ) {\n this._options = options;\n this._measurementLabel = new MeasurementLabels();\n this._htmlOverlay = overlay;\n this._domElement = viewerDomElement;\n this._camera = camera;\n this._meshGroup = meshGroup;\n this._startPoint = startPoint;\n this._distanceToCamera = this._camera.getWorldPosition(new THREE.Vector3()).distanceTo(startPoint);\n this._line = this.startMeasurement(startPoint);\n this._meshGroup.add(this._line.meshes);\n }\n\n /**\n * Update the measurement line end point to the provided mouse coordinates\n */\n update(mouseEvent: { offsetX: number; offsetY: number }): void {\n const { offsetX, offsetY } = mouseEvent;\n this._line.updateLine(this.pointerTo3DPosition(offsetX, offsetY));\n }\n\n /**\n * End the measurement.\n * @param point World position at which measuring line ends.\n */\n endMeasurement(point: THREE.Vector3): void {\n const { distanceToLabelCallback } = this._options;\n //Update the line with final end point.\n this._line.updateLine(point);\n const label = distanceToLabelCallback(this._line.getMeasuredDistance());\n //Add the measurement label.\n this._labelElement = this.addLabel(this._line.getMidPointOnLine(), label);\n this._measurement = {\n measurementId: Date.now(),\n startPoint: this._startPoint,\n endPoint: point,\n distanceInMeters: this._line.getMeasuredDistance()\n };\n }\n\n /**\n * Remove the measurement.\n */\n removeMeasurement(): void {\n this._meshGroup.remove(this._line.meshes);\n\n if (this._labelElement) {\n this._htmlOverlay.remove(this._labelElement);\n }\n\n if (this._line) {\n this._line.dispose();\n }\n }\n\n getMeasurement(): Readonly<Measurement> {\n return this._measurement;\n }\n\n /**\n * Update current line width.\n * @param lineWidth Width of the measuring line mesh.\n */\n updateLineWidth(lineWidth: number): void {\n this._line.updateLineWidth(lineWidth);\n }\n\n /**\n * Update current line color.\n * @param color Color of the measuring line mesh.\n */\n updateLineColor(color: THREE.Color): void {\n this._line.updateLineColor(color);\n }\n\n /**\n * Start the measurement.\n * @param point World position to start measurement operation from.\n */\n private startMeasurement(point: THREE.Vector3): MeasurementLine {\n return new MeasurementLine(this._options.lineWidth, this._options.color, point);\n }\n\n /**\n * Creates a measurement label, add it to HTMLOverlay and return the created label element.\n * @param position Label position.\n * @param label Label text.\n * @returns HTML element.\n */\n private addLabel(position: THREE.Vector3, label: string): HTMLDivElement {\n const labelElement = this._measurementLabel.createLabel(label);\n this._htmlOverlay.add(labelElement, position);\n return labelElement;\n }\n\n private pointerTo3DPosition(offsetX: number, offsetY: number) {\n const position = new THREE.Vector3();\n //Get position based on the mouse pointer X and Y value.\n const mouse = new THREE.Vector2();\n mouse.x = (offsetX / this._domElement.clientWidth) * 2 - 1;\n mouse.y = -(offsetY / this._domElement.clientHeight) * 2 + 1;\n\n const direction = new THREE.Vector3();\n const ray = new THREE.Ray();\n const origin = new THREE.Vector3();\n\n //Set the origin of the Ray to camera.\n origin.setFromMatrixPosition(this._camera.matrixWorld);\n ray.origin.copy(origin);\n //Calculate the camera direction.\n direction.set(mouse.x, mouse.y, 0.5).unproject(this._camera).sub(ray.origin).normalize();\n ray.direction.copy(direction);\n //Note: Using the initial/start point as reference for ray to emit till that distance from camera.\n ray.at(this._distanceToCamera, position);\n\n return position;\n }\n}\n","/*!\n * Copyright 2022 Cognite AS\n */\n\nimport { Cognite3DViewer } from '@reveal/api';\nimport { Cognite3DViewerToolBase } from '../Cognite3DViewerToolBase';\nimport { assertNever, DisposedDelegate, EventTrigger } from '@reveal/utilities';\nimport * as THREE from 'three';\nimport {\n MeasurementAddedDelegate,\n MeasurementStartedDelegate,\n MeasurementEndedDelegate,\n MeasurementOptions\n} from './types';\nimport { MeasurementManager, Measurement } from './MeasurementManager';\nimport { MeasurementLabels } from './MeasurementLabels';\nimport { HtmlOverlayTool, HtmlOverlayToolOptions } from '../HtmlOverlay/HtmlOverlayTool';\nimport rulerSvg from '!!raw-loader!./styles/ruler.svg';\nimport { MetricsLogger } from '@reveal/metrics';\n\ntype MeasurementEvents = 'added' | 'started' | 'ended' | 'disposed';\n\n/**\n * Enables {@link Cognite3DViewer} to perform a point to point measurement.\n * This can be achieved by selecting a point on the 3D Object and drag the pointer to\n * required point to get measurement of the distance.\n * The tools default measurement is in \"Meters\" as supported in Reveal, but it also provides\n * user to customise the measuring units based on their convinience with the callback.\n *\n * @example\n * ```js\n * const measurementTool = new MeasurementTool(viewer);\n * measurementTool.enterMeasurementMode();\n * // ...\n * measurementTool.exitMeasurementMode();\n *\n * // detach the tool from the viewer\n * measurementTool.dispose();\n * ```\n * @example\n * ```jsx runnable\n * const measurementTool = new MeasurementTool(viewer, {distanceToLabelCallback: (distanceInMeters) => {\n * // 1 meters = 3.281 feet\n * const distancesInFeet = distanceInMeters * 3.281;\n * return { distanceInMeters: distancesInFeet, units: 'ft'};\n * }});\n * measurementTool.enterMeasurementMode();\n```\n */\nexport class MeasurementTool extends Cognite3DViewerToolBase {\n /**\n * Returns measurement mode state, is measurement mode started or ended.\n */\n get isInMeasurementMode(): boolean {\n return this._measurementMode;\n }\n\n private _options: Required<MeasurementOptions>;\n private readonly _viewer: Cognite3DViewer;\n private readonly _geometryGroup = new THREE.Group();\n private readonly _measurements: MeasurementManager[];\n private _activeMeasurement: MeasurementManager | undefined;\n private readonly _htmlOverlay: HtmlOverlayTool;\n private _measurementMode: boolean;\n\n private readonly _handleLabelClustering = this.createCombineClusterElement.bind(this);\n private readonly _handlePointerClick = this.onPointerClick.bind(this);\n private readonly _handlePointerMove = this.onPointerMove.bind(this);\n private readonly _handleMeasurementCancel = this.onKeyDown.bind(this);\n\n private readonly _events = {\n measurementAdded: new EventTrigger<MeasurementAddedDelegate>(),\n measurementStarted: new EventTrigger<MeasurementStartedDelegate>(),\n measurementEnded: new EventTrigger<MeasurementEndedDelegate>(),\n disposed: new EventTrigger<DisposedDelegate>()\n };\n\n private readonly _overlayOptions: HtmlOverlayToolOptions = {\n clusteringOptions: { mode: 'overlapInScreenSpace', createClusterElementCallback: this._handleLabelClustering }\n };\n\n private static readonly defaultLineOptions: Required<MeasurementOptions> = {\n distanceToLabelCallback: d => MeasurementTool.metersLabelCallback(d),\n lineWidth: 0.01,\n color: new THREE.Color(0xff8746)\n };\n\n constructor(viewer: Cognite3DViewer, options?: MeasurementOptions) {\n super();\n this._viewer = viewer;\n this._options = {\n ...MeasurementTool.defaultLineOptions,\n ...options\n };\n this._measurements = [];\n this._measurementMode = false;\n this._htmlOverlay = new HtmlOverlayTool(this._viewer, this._overlayOptions);\n\n this._geometryGroup.name = MeasurementTool.name;\n this._viewer.addObject3D(this._geometryGroup);\n\n MetricsLogger.trackCreateTool('MeasurementTool');\n }\n\n /**\n * Triggered when the tool is disposed. Listeners should clean up any\n * resources held and remove the reference to the tool.\n * @example\n * ```js\n * measurementTool.on('disposed', onMeasurementDispose);\n * ```\n */\n on(event: 'disposed', callback: DisposedDelegate): void;\n\n /**\n * Triggered when a measurement is added into the Cognite3DViewer.\n * @example\n * ```js\n * measurementTool.on('added', onMeasurementAdded);\n * ```\n */\n on(event: 'added', callback: MeasurementAddedDelegate): void;\n\n /**\n * Triggered when a measurement mode is started.\n * @example\n * ```js\n * measurementTool.on('started', onMeasurementStarted);\n * ```\n */\n on(event: 'started', callback: MeasurementStartedDelegate): void;\n\n /**\n * Triggered when measurement mode is ended.\n * @example\n * ```js\n * measurementTool.on('ended', onMeasurementEnded);\n * ```\n */\n on(event: 'ended', callback: MeasurementEndedDelegate): void;\n\n /**\n * Subscribe to the Measurement events\n * @param event `MeasurementEvents` event\n * @param callback Callback to measurements events\n */\n on(\n event: MeasurementEvents,\n callback: MeasurementAddedDelegate | MeasurementStartedDelegate | MeasurementEndedDelegate | DisposedDelegate\n ): void {\n switch (event) {\n case 'added':\n this._events.measurementAdded.subscribe(callback as MeasurementAddedDelegate);\n break;\n case 'started':\n this._events.measurementStarted.subscribe(callback as MeasurementStartedDelegate);\n break;\n case 'ended':\n this._events.measurementEnded.subscribe(callback as MeasurementEndedDelegate);\n break;\n case 'disposed':\n this._events.disposed.subscribe(callback as DisposedDelegate);\n break;\n default:\n assertNever(event, `Unsupported event: '${event}'`);\n }\n }\n\n /**\n * @example\n * ```js\n * measurementTool.off('disposed', onMeasurementDispose);\n * ```\n */\n off(event: 'disposed', callback: DisposedDelegate): void;\n\n /**\n * @example\n * ```js\n * measurementTool.off('added', onMeasurementAdded);\n * ```\n */\n off(event: 'added', callback: MeasurementAddedDelegate): void;\n\n /**\n * @example\n * ```js\n * measurementTool.off('started', onMeasurementStarted);\n * ```\n */\n off(event: 'started', callback: MeasurementStartedDelegate): void;\n\n /**\n * @example\n * ```js\n * measurementTool.off('ended', onMeasurementEnded);\n * ```\n */\n off(event: 'ended', callback: MeasurementEndedDelegate): void;\n\n /**\n * Unsubscribe to the Measurement event\n * @param event `MeasurementEvents` event\n * @param callback Callback to measurements events\n */\n off(\n event: MeasurementEvents,\n callback: MeasurementAddedDelegate | MeasurementStartedDelegate | MeasurementEndedDelegate | DisposedDelegate\n ): void {\n switch (event) {\n case 'added':\n this._events.measurementAdded.unsubscribe(callback as MeasurementAddedDelegate);\n break;\n case 'started':\n this._events.measurementStarted.unsubscribe(callback as MeasurementStartedDelegate);\n break;\n case 'ended':\n this._events.measurementEnded.unsubscribe(callback as MeasurementEndedDelegate);\n break;\n case 'disposed':\n this._events.disposed.unsubscribe(callback as DisposedDelegate);\n break;\n default:\n assertNever(event, `Unsupported event: '${event}'`);\n }\n }\n\n /**\n * Enter into point to point measurement mode.\n */\n enterMeasurementMode(): void {\n if (this._measurementMode) {\n throw new Error('Measurement mode is active, call exitMeasurementMode()');\n }\n this._viewer.on('click', this._handlePointerClick);\n this._events.measurementStarted.fire();\n this._measurementMode = true;\n }\n\n /**\n * Exit measurement mode.\n */\n exitMeasurementMode(): void {\n if (!this._measurementMode) {\n throw new Error('Measurement mode is not active, call enterMeasurementMode()');\n }\n this.cancelActiveMeasurement();\n this._viewer.off('click', this._handlePointerClick);\n this._events.measurementEnded.fire();\n this._measurementMode = false;\n }\n\n /**\n * Removes a measurement from the Cognite3DViewer.\n * @param measurement Measurement to be removed from Cognite3DViewer.\n */\n removeMeasurement(measurement: Measurement): void {\n const index = this._measurements.findIndex(\n measurementManager => measurementManager.getMeasurement() === measurement\n );\n if (index === -1) {\n throw new Error('Measurement not found');\n }\n this._measurements[index].removeMeasurement();\n this._measurements.splice(index, 1);\n this._viewer.requestRedraw();\n }\n\n /**\n * Removes all measurements from the Cognite3DViewer.\n */\n removeAllMeasurements(): void {\n //clear all mesh, geometry & labels.\n this._measurements.forEach(measurement => {\n measurement.removeMeasurement();\n });\n this._measurements.splice(0);\n this._viewer.requestRedraw();\n }\n\n /**\n * Sets the visiblity of labels in the Measurement.\n * @param enable\n */\n setMeasurementLabelsVisible(enable: boolean): void {\n this._htmlOverlay.visible(enable);\n }\n\n /**\n * Sets Measurement line width, color and label units value for the next measurment.\n * @param options MeasurementOptions to set line width, color and callback for custom operation on measurement labels.\n */\n setLineOptions(options: MeasurementOptions): void {\n this._options = {\n ...this._options,\n ...options\n };\n }\n\n /**\n * Update selected line width.\n * @param measurement Measurement to be updated.\n * @param lineWidth Width of the measuring line.\n */\n updateLineWidth(measurement: Measurement, lineWidth: number): void {\n const index = this._measurements.findIndex(\n measurementManager => measurementManager.getMeasurement() === measurement\n );\n if (index === -1) {\n throw new Error('Measurement not found');\n }\n this._measurements[index].updateLineWidth(lineWidth);\n this._viewer.requestRedraw();\n }\n\n /**\n * Update selected line color.\n * @param measurement Measurement to be updated.\n * @param color Color of the measuring line.\n */\n updateLineColor(measurement: Measurement, color: THREE.Color): void {\n const index = this._measurements.findIndex(\n measurementManager => measurementManager.getMeasurement() === measurement\n );\n if (index === -1) {\n throw new Error('Measurement not found');\n }\n this._measurements[index].updateLineColor(color);\n this._viewer.requestRedraw();\n }\n\n /**\n * Get all measurements from {@link Cognite3DViewer}.\n * @returns Array of Measurements containing Id, start point, end point & measured distance.\n */\n getAllMeasurements(): Measurement[] {\n return this._measurements.map(measurement => measurement.getMeasurement());\n }\n\n /**\n * Dispose Measurement Tool.\n */\n dispose(): void {\n this.removeAllMeasurements();\n this.exitMeasurementMode();\n this._activeMeasurement?.removeMeasurement();\n this._htmlOverlay.dispose();\n this._geometryGroup.clear();\n this._viewer.removeObject3D(this._geometryGroup);\n this._events.measurementAdded.unsubscribeAll();\n this._events.measurementStarted.unsubscribeAll();\n this._events.measurementEnded.unsubscribeAll();\n super.dispose();\n }\n\n private async onPointerClick(event: { offsetX: number; offsetY: number }): Promise<void> {\n const { offsetX, offsetY } = event;\n\n const intersection = await this._viewer.getIntersectionFromPixel(offsetX, offsetY);\n\n if (!intersection) {\n return;\n }\n\n if (!this._activeMeasurement) {\n const camera = this._viewer.getCamera();\n const domElement = this._viewer.domElement;\n this._activeMeasurement = new MeasurementManager(\n domElement,\n camera,\n this._geometryGroup,\n this._options,\n this._htmlOverlay,\n intersection.point\n );\n this._viewer.domElement.addEventListener('pointermove', this._handlePointerMove);\n window.addEventListener('keydown', this._handleMeasurementCancel);\n } else {\n this._activeMeasurement.endMeasurement(intersection.point);\n const measurement = this._activeMeasurement.getMeasurement();\n\n this._measurements.push(this._activeMeasurement);\n this._activeMeasurement = undefined;\n // To avoid issue when exiting measurement mode when a measurement 'added' event called\n this._events.measurementAdded.fire(this._measurements[this._measurements.length - 1].getMeasurement());\n this._viewer.domElement.removeEventListener('pointermove', this._handlePointerMove);\n window.removeEventListener('keydown', this._handleMeasurementCancel);\n\n MetricsLogger.trackEvent('measurementAdded', { measurement });\n }\n this._viewer.requestRedraw();\n }\n\n private onPointerMove(event: { offsetX: number; offsetY: number }) {\n if (this._activeMeasurement) {\n this._activeMeasurement!.update(event);\n this._viewer.requestRedraw();\n }\n }\n\n /**\n * Create and return combine ruler icon as HTMLDivElement.\n * @returns HTMLDivElement.\n */\n private createCombineClusterElement() {\n // TODO 2022-07-05 larsmoa: Move all ownership of labels here - currently responsibility is split\n // between several classes which is *bad*\n // pramodcog: as clustering is related to tool, it would be ideal to have it here.\n const combineElement = document.createElement('div');\n combineElement.className = MeasurementLabels.stylesId;\n combineElement.innerHTML = rulerSvg;\n\n return combineElement;\n }\n\n private static metersLabelCallback(distanceInMeters: number): string {\n return `${distanceInMeters.toFixed(2)} m`;\n }\n\n /**\n * To cancel an active measurement `Escape` key is processed and remove all its related data & events.\n * @param event Keyboard event to process for `Escape` key\n */\n private onKeyDown(event: KeyboardEvent) {\n if (event.metaKey || event.altKey || event.ctrlKey) {\n return;\n }\n\n if (event.key === 'Escape') {\n //Cancel active measurement\n this.cancelActiveMeasurement();\n event.preventDefault();\n }\n }\n\n /**\n * Cancel the active measurement.\n */\n private cancelActiveMeasurement() {\n if (this._activeMeasurement) {\n this._activeMeasurement.removeMeasurement();\n this._activeMeasurement = undefined;\n this._viewer.requestRedraw();\n this._viewer.domElement.removeEventListener('pointermove', this._handlePointerMove);\n }\n }\n}\n","export default \"<?xml version=\\\"1.0\\\" encoding=\\\"UTF-8\\\"?>\\n<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" xmlns:xlink=\\\"http://www.w3.org/1999/xlink\\\" width=\\\"50px\\\" height=\\\"20px\\\" viewBox=\\\"0 0 50 20\\\" version=\\\"1.1\\\">\\n<g id=\\\"surface1\\\">\\n<path style=\\\" stroke:none;fill-rule:nonzero;fill:rgb(100%,100%,100%);fill-opacity:0.8;\\\" d=\\\"M 0.832031 4 C 0.371094 4 0 4.148438 0 4.332031 L 0 10 C 0 10.183594 0.371094 10.332031 0.832031 10.332031 C 1.292969 10.332031 1.667969 10.183594 1.667969 10 L 1.667969 4.332031 C 1.667969 4.148438 1.292969 4 0.832031 4 Z M 0.832031 4 \\\"/>\\n<path style=\\\" stroke:none;fill-rule:nonzero;fill:rgb(100%,100%,100%);fill-opacity:0.8;\\\" d=\\\"M 49.167969 4 C 48.707031 4 48.332031 4.148438 48.332031 4.332031 L 48.332031 10 C 48.332031 10.183594 48.707031 10.332031 49.167969 10.332031 C 49.628906 10.332031 50 10.183594 50 10 L 50 4.332031 C 50 4.148438 49.628906 4 49.167969 4 Z M 49.167969 4 \\\"/>\\n<path style=\\\" stroke:none;fill-rule:nonzero;fill:rgb(100%,100%,100%);fill-opacity:0.8;\\\" d=\\\"M 49.582031 11.332031 L 46.25 11.332031 C 46.019531 11.332031 45.835938 11.40625 45.835938 11.5 L 45.835938 12.332031 C 45.835938 12.515625 45.460938 12.667969 45 12.667969 C 44.542969 12.667969 44.167969 12.519531 44.167969 12.332031 L 44.167969 11.5 C 44.167969 11.40625 43.980469 11.332031 43.75 11.332031 L 41.25 11.332031 C 41.019531 11.332031 40.835938 11.40625 40.835938 11.5 L 40.835938 13 C 40.835938 13.183594 40.460938 13.332031 40 13.332031 C 39.542969 13.332031 39.167969 13.183594 39.167969 13 L 39.167969 11.5 C 39.167969 11.40625 38.980469 11.332031 38.75 11.332031 L 36.25 11.332031 C 36.019531 11.332031 35.832031 11.40625 35.832031 11.5 L 35.835938 12.332031 C 35.835938 12.515625 35.460938 12.667969 35 12.667969 C 34.539062 12.667969 34.167969 12.519531 34.167969 12.332031 L 34.167969 11.5 C 34.167969 11.40625 33.980469 11.332031 33.75 11.332031 L 31.25 11.332031 C 31.019531 11.332031 30.832031 11.40625 30.832031 11.5 L 30.835938 13 C 30.835938 13.183594 30.460938 13.332031 30 13.332031 C 29.539062 13.332031 29.167969 13.183594 29.167969 13 L 29.167969 11.5 C 29.167969 11.40625 28.980469 11.332031 28.75 11.332031 L 26.25 11.332031 C 26.019531 11.332031 25.832031 11.40625 25.832031 11.5 L 25.835938 12.332031 C 25.835938 12.515625 25.460938 12.667969 25 12.667969 C 24.539062 12.667969 24.167969 12.519531 24.167969 12.332031 L 24.167969 11.5 C 24.167969 11.40625 23.980469 11.332031 23.75 11.332031 L 21.25 11.332031 C 21.019531 11.332031 20.832031 11.40625 20.832031 11.5 L 20.835938 13 C 20.835938 13.183594 20.460938 13.332031 20 13.332031 C 19.539062 13.332031 19.167969 13.183594 19.167969 13 L 19.167969 11.5 C 19.167969 11.40625 18.980469 11.332031 18.75 11.332031 L 16.25 11.332031 C 16.019531 11.332031 15.832031 11.40625 15.832031 11.5 L 15.835938 12.332031 C 15.835938 12.515625 15.460938 12.667969 15 12.667969 C 14.539062 12.667969 14.167969 12.519531 14.167969 12.332031 L 14.167969 11.5 C 14.167969 11.40625 13.980469 11.332031 13.75 11.332031 L 11.25 11.332031 C 11.019531 11.332031 10.832031 11.40625 10.832031 11.5 L 10.835938 13 C 10.835938 13.183594 10.460938 13.332031 10 13.332031 C 9.539062 13.332031 9.167969 13.183594 9.167969 13 L 9.167969 11.5 C 9.167969 11.40625 8.980469 11.332031 8.75 11.332031 L 6.25 11.332031 C 6.019531 11.332031 5.832031 11.40625 5.832031 11.5 L 5.832031 12.332031 C 5.832031 12.519531 5.460938 12.667969 5 12.667969 C 4.539062 12.667969 4.167969 12.519531 4.167969 12.332031 L 4.167969 11.5 C 4.167969 11.40625 3.980469 11.332031 3.75 11.332031 L 0.417969 11.332031 C 0.1875 11.332031 0 11.40625 0 11.5 L 0 15.832031 C 0 15.925781 0.1875 16 0.417969 16 L 49.582031 16 C 49.8125 16 50 15.925781 50 15.832031 L 50 11.5 C 50 11.40625 49.8125 11.332031 49.582031 11.332031 Z M 49.582031 11.332031 \\\"/>\\n<path style=\\\" stroke:none;fill-rule:nonzero;fill:rgb(100%,100%,100%);fill-opacity:0.8;\\\" d=\\\"M 46.488281 7.121094 L 42.617188 5.121094 C 42.410156 5.011719 42.066406 4.972656 41.761719 5.019531 C 41.453125 5.066406 41.25 5.191406 41.25 5.332031 L 41.25 7 L 8.75 7 L 8.75 5.332031 C 8.75 5.191406 8.546875 5.066406 8.238281 5.019531 C 7.933594 4.972656 7.589844 5.011719 7.382812 5.121094 L 3.511719 7.121094 C 3.394531 7.183594 3.332031 7.257812 3.332031 7.332031 C 3.332031 7.410156 3.394531 7.484375 3.511719 7.546875 L 7.382812 9.546875 C 7.53125 9.625 7.75 9.667969 7.976562 9.667969 C 8.0625 9.667969 8.152344 9.660156 8.238281 9.648438 C 8.546875 9.597656 8.75 9.472656 8.75 9.332031 L 8.75 7.667969 L 41.25 7.667969 L 41.25 9.332031 C 41.25 9.472656 41.453125 9.597656 41.757812 9.648438 C 41.84375 9.660156 41.933594 9.667969 42.023438 9.667969 C 42.246094 9.667969 42.464844 9.625 42.617188 9.546875 L 46.488281 7.546875 C 46.605469 7.484375 46.667969 7.410156 46.667969 7.332031 C 46.667969 7.257812 46.605469 7.183594 46.488281 7.121094 Z M 46.488281 7.121094 \\\"/>\\n</g>\\n</svg>\\n\";"],"names":["root","factory","exports","module","define","amd","self","this","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","undefined","__webpack_modules__","n","getter","__esModule","d","a","definition","key","o","Object","defineProperty","enumerable","get","g","globalThis","Function","e","window","obj","prop","prototype","hasOwnProperty","call","r","Symbol","toStringTag","value","require","RandomColors","static","colorIndex","color","_colors","newColor","generateRandomColor","set","c","Math","floor","b","colorRGB","hue","random","saturation","lightness","setHSL","Map","EventTrigger","_listeners","subscribe","listener","push","unsubscribe","index","indexOf","splice","unsubscribeAll","fire","args","forEach","clickOrTouchEventOffset","ev","target","rect","getBoundingClientRect","MouseEvent","offsetX","clientX","left","offsetY","clientY","top","changedTouches","length","touch","assertNever","x","message","Error","InputHandler","constructor","domElement","_events","click","hover","onHoverCallback","setupEventListeners","on","event","callback","off","dispose","eventList","eventType","keys","disposeOfAllEventListeners","pointerDown","pointerDownTimestamp","validClick","startOffset","Vector2","onUp","handleClickEvent","removeEventListener","addEventListener","onDown","timeStamp","isProperClick","clickDuration","hasMovedDuringClick","abs","y","maxMoveDistance","maxClickDuration","firedEvent","button","log","AutoDisposeGroup","_isDisposed","_referenceCount","reference","ensureNotDisposed","dereference","child","children","THREE","Mesh","geometry","emptyGeometry","BufferGeometry","clear","BoundingBoxLOD","boundingBox","super","_activeLevel","_levels","isLOD","autoUpdate","_boundingBox","clone","type","setBoundingBox","copy","addLevel","object","distance","sort","visible","add","getCurrentLevel","update","camera","updateCurrentLevel","levels","camPos","bounds","updateVars","applyMatrix4","matrixWorld","cameraZoom","PerspectiveCamera","zoom","setFromMatrixPosition","distanceToCamera","distanceToPoint","findIndex","p","WebGLRendererStateHelper","renderer","_originalState","_renderer","setScissor","width","height","scissorData","getScissor","Vector4","setScissorTest","enabled","scissorTest","getScissorTest","setClearColor","alpha","clearColor","getClearColor","clearAlpha","getClearAlpha","setWebGLState","state","resetState","DefaultWebGLState","webGLState","buffers","depth","newTest","test","newMask","mask","setMask","setTest","setSize","size","getSize","localClippingEnabled","autoClear","autoClearDepth","setRenderTarget","renderTarget","getRenderTarget","reset","lastTest","lastMask","TimestampedContainer","_value","_lastAccessTime","Date","now","lastAccessTime","MemoryRequestCache","maxElementsInCache","removeCallback","defaultCleanupCount","_data","_maxElementsInCache","_defaultCleanupCount","max","_removeCallback","has","id","forceInsert","data","isFull","cleanCache","insert","remove","delete","count","allResults","Array","from","entries","right","i","entry","pop","resize","cacheSize","CLEANUP_COUNT_TO_CAPACITY_RATIO","values","worldToViewportVars","renderSize","position","ShapeType","Cognite3DViewerToolBase","_disposedEvent","_disposed","handler","BucketGrid2D","dimensions","_removedElements","Set","_dimensions","_cells","map","_bounds","element","intersectsBox","cell","cellsIntersecting","visitedElements","candidateElement","min","dimX","dimY","relativeBoundsMinX","relativeBoundsMaxX","relativeBoundsMinY","relativeBoundsMaxY","clamp","minI","maxI","minJ","maxJ","j","VERSION","MIXPANEL_TOKEN","MetricsLogger","project","applicationId","eventProps","batch_requests","disable_cookie","disable_persistence","ip","property_blacklist","_sessionProps","application","sessionId","replace","toString","innerTrackEvent","logMetrics","revealMetricsLogger","metricsLogger","eventName","combined","toolName","trackEvent","modelIdentifier","modelVersion","nodeCollectionClassToken","appearance","style","nodeCount","matrix","zeroVector","oneVector","identityRotation","translation","scale","rotation","trackCadNodeTransformOverriddenVars","decompose","hasRotation","angleTo","hasTranslation","distanceToSquared","hasScale","error","name","stack","TrackCameraNavigationThrottleDelay","TrackCadNodeTransformOverriddenThrottleDelay","identity","trackCadNodeTransformOverridden","trackCadNodeTransformOverriddenImpl","trackCameraNavigation","trackCameraNavigationImpl","HtmlOverlayTool","viewer","options","_htmlOverlays","_compositeOverlays","_preallocatedVariables","camNormal","point","nearPlane","farPlane","position2D","_onSceneRenderedHandler","onSceneRendered","bind","_onViewerDisposedHandler","onViewerDisposed","_options","_viewer","scheduleUpdate","forceUpdate","_visible","trackCreateTool","viewerDomElement","viewerCamera","getCamera","viewerRenderer","elements","info","position3D","htmlElement","contains","visibility","appendChild","getComputedStyle","removeChild","overlays","enable","_element","cleanupClusterElements","updateNewElementSizes","getWorldPosition","getWorldDirection","addScaledVector","near","setFromNormalAndCoplanarPoint","far","positionUpdatedCallback","userData","insideCameraPlanes","out","z","worldToNormalizedViewportCoordinates","canvas","canvasWidth","canvasHeight","round","worldToViewportCoordinates","distanceTo","clusterElements","commitDOMChanges","clientRect","offsetLeft","offsetTop","opacity","transition","fadeIn","fadeOut","clusteringOptions","mode","clusterByOverlapInScreenSpace","createClusterElementCallback","canvasBounds","bottom","canvasSize","grid","elementBounds","createElementBounds","clusterMidpoint","cluster","removeOverlappingElements","midpoint","reduce","divideScalar","compositeElement","addComposite","ExplodedViewTool","treeIndex","cadModel","_cadModel","_rootTreeIndex","preloadBoundingBoxData","readyPromise","_treeBoundingBoxdata","then","async","expandRadius","expandData","Promise","all","direction","transform","resetNodeTransformByTreeIndex","resolve","setPosition","setNodeTransformByTreeIndex","rootTreeIndexBoundingBox","getBoundingBoxByTreeIndex","rootBoundingBox","getCenter","subTreeBoundingBoxes","getSubtreeTreeIndices","subTreeIndices","toArray","subTreeIndex","subTreeIndexBoundingBoxCenter","rootCenter","subTreeCenters","subVectors","payloads","payload","DebugCameraTool","showCameraHelper","hideCameraHelper","_cameraHelper","addObject3D","removeObject3D","Corner","defaultAxisBoxCompassConfig","ringLabel","labelDelta","PI","fontSize","fontColor","tickColor","defaultFaceConfig","label","outlineSize","outlineColor","faceColor","defaultAxisBoxConfig","corner","BottomRight","padding","animationSpeed","faces","xPositiveFace","xNegativeFace","yPositiveFace","yNegativeFace","zPositiveFace","zNegativeFace","compass","AxisViewTool","config","_dynamicUpdatePosition","_updateClickDiv","_screenPosition","_boxFaceGeometry","_raycaster","layers","enableAll","_layoutConfig","_axisGroup","renderOrder","_interactiveObjects","createAxisCross","_disposeClickDiv","createClickDiv","addAxisBoxToViewer","querySelector","divElement","document","createElement","zIndex","stopPropagation","preventDefault","handleClick","axisGroup","xAbsolute","yAbsolute","isAbsolute","clientWidth","TopRight","clientHeight","TopLeft","BottomLeft","xScreenPos","yScreenPos","boundingRect","xNdc","yNdc","rayOrigin","rayDirection","normalize","intersects","intersectObjects","targetPosition","targetUp","upVector","moveCameraTo","createCompass","interactiveObjects","createBoxFaces","setupTransformOnRender","onBeforeRender","quaternion","invert","updateMatrixWorld","cWidth","cHeight","offset","traverse","node","material","uniforms","uniformsNeedUpdate","facesConfig","createBoxFace","compassPlaneGeometry","vertexShader","fragmentShader","tex","createCompassTexture","side","glslVersion","depthTest","blending","blendDst","blendSrc","frustumCulled","sin","cos","up","lookAt","compassLayout","textureSize","context","getContext","halfSize","radius","tickWidth","tickSpace","strokeStyle","getStyle","lineWidth","setLineDash","beginPath","arc","stroke","font","textAlign","fillStyle","fillText","getFaceTexture","faceConfig","fillRect","fill","face","transparent","multiplyScalar","parameters","targetAxis","targetUpAxis","cameraManager","currentCameraPosition","cameraTarget","getCameraState","targetRelativeStartPosition","sub","normalizedFrom","omega","acos","dot","t","animation","forward","fromRotation","toRotation","setFromRotationMatrix","makeBasis","cross","tmpPosition","tmpRotation","to","onUpdate","slerpQuaternions","setCameraState","onComplete","start","Keyframe","model","date","_nodeCollectionAndAppearance","_model","_date","getKeyframeDate","activate","_index","assignStyledNodeCollection","nodes","nodeAppearance","deactivate","unassignStyledNodeCollection","nodeCollection","trackCadModelStyled","classToken","TimelineTool","_playback","dateChanged","_keyframes","createKeyframe","keyframe","sortKeyframesByDates","getKeyframeByDate","find","candidate","removeKeyframe","removeKeyframeByDate","play","startDate","endDate","totalDurationInMilliSeconds","stop","playState","dateInMs","getTime","tween","currentKeyframeIndex","prevIndex","activeKeyframe","pause","isPlaying","resume","isPaused","getAllKeyframes","slice","MeasurementLabels","ensureStylesLoaded","createLabel","innerText","className","stylesId","getElementById","createTextNode","head","MeasurementLine","lineColor","startPoint","_position","Float32Array","_geometry","LineGeometry","_adaptiveWidthLineMaterial","LineMaterial","getHex","linewidth","worldUnits","_fixedWidthLineMaterial","_meshes","onBeforeRenderTrigger","resolution","startLine","removeFromParent","meshes","updateLine","endPoint","setPositions","getMeasuredDistance","getMidPointOnLine","updateLineWidth","updateLineColor","adaptiveMesh","Line2","computeLineDistances","fixedMesh","MeasurementManager","meshGroup","overlay","_measurement","measurementId","distanceInMeters","_measurementLabel","_htmlOverlay","_domElement","_camera","_meshGroup","_startPoint","_distanceToCamera","_line","startMeasurement","mouseEvent","pointerTo3DPosition","endMeasurement","distanceToLabelCallback","_labelElement","addLabel","removeMeasurement","getMeasurement","labelElement","mouse","ray","origin","unproject","at","MeasurementTool","_geometryGroup","_handleLabelClustering","createCombineClusterElement","_handlePointerClick","onPointerClick","_handlePointerMove","onPointerMove","_handleMeasurementCancel","onKeyDown","measurementAdded","measurementStarted","measurementEnded","disposed","_overlayOptions","defaultLineOptions","_measurements","_measurementMode","isInMeasurementMode","enterMeasurementMode","exitMeasurementMode","cancelActiveMeasurement","measurement","measurementManager","requestRedraw","removeAllMeasurements","setMeasurementLabelsVisible","setLineOptions","getAllMeasurements","_activeMeasurement","intersection","getIntersectionFromPixel","combineElement","innerHTML","toFixed","metaKey","altKey","ctrlKey","metersLabelCallback"],"sourceRoot":""}
@@ -1 +0,0 @@
1
- {"version":3,"file":"eptBinaryDecoder.worker.worker.js","mappings":"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","sources":["webpack://@cognite/reveal/./packages/pointclouds/src/potree-three-loader/workers/eptBinaryDecoder.worker.ts"],"sourcesContent":["const ctx: Worker = self as any;\n\nctx.onmessage = function (arg0: any) {\n parseEpt(arg0);\n};\n\nexport type ParsedEptData = {\n numPoints: number;\n tightBoundingBox: { min: number[]; max: number[] };\n mean: number[];\n position: ArrayBuffer;\n color: ArrayBuffer | undefined;\n intensity: ArrayBuffer | undefined;\n classification: ArrayBuffer | undefined;\n returnNumber: ArrayBuffer | undefined;\n numberOfReturns: ArrayBuffer | undefined;\n pointSourceId: ArrayBuffer | undefined;\n indices: ArrayBuffer;\n};\n\ntype SchemaEntry = {\n name: string;\n size: number;\n type: 'signed' | 'unsigned' | 'float';\n};\n\nfunction parseEpt(event: MessageEvent): void {\n const buffer = event.data.buffer;\n const view = new DataView(buffer);\n const schema: SchemaEntry[] = event.data.schema;\n const scale = event.data.scale;\n const offset = event.data.offset;\n const mins = event.data.mins;\n\n const dimensions: Record<string, SchemaEntry> = schema.reduce((p, c) => {\n p[c.name] = c;\n return p;\n }, {} as Record<string, SchemaEntry>);\n\n const dimOffset = (name: string) => {\n let offset = 0;\n for (let i = 0; i < schema.length; ++i) {\n if (schema[i].name === name) return offset;\n offset += schema[i].size;\n }\n return undefined;\n };\n\n function getExtractor(name: string) {\n const offset = dimOffset(name)!;\n const type = dimensions[name].type;\n const size = dimensions[name].size;\n\n if (type == 'signed')\n switch (size) {\n case 1:\n return (p: number) => view.getInt8(p + offset);\n case 2:\n return (p: number) => view.getInt16(p + offset, true);\n case 4:\n return (p: number) => view.getInt32(p + offset, true);\n default:\n throw Error('Unrecognized byte size for \"signed\" numbers');\n }\n if (type == 'unsigned')\n switch (size) {\n case 1:\n return (p: number) => view.getUint8(p + offset);\n case 2:\n return (p: number) => view.getUint16(p + offset, true);\n case 4:\n return (p: number) => view.getUint32(p + offset, true);\n default:\n throw Error('Unrecognized byte size for \"unsigned\" numbers');\n }\n if (type == 'float')\n switch (size) {\n case 4:\n return (p: number) => view.getFloat32(p + offset, true);\n case 8:\n return (p: number) => view.getFloat64(p + offset, true);\n default:\n throw Error('Unrecognized byte size for \"float\" numbers');\n }\n\n const str = JSON.stringify(dimensions[name]);\n throw new Error(`Invalid dimension specification for ${name}: ${str}`);\n }\n\n const pointSize = schema.reduce((p: number, c) => p + c.size, 0);\n const numPoints = buffer.byteLength / pointSize;\n\n let rgbBuffer: ArrayBuffer | undefined;\n let intensityBuffer: ArrayBuffer | undefined;\n let classificationBuffer: ArrayBuffer | undefined;\n let returnNumberBuffer: ArrayBuffer | undefined;\n let numberOfReturnsBuffer: ArrayBuffer | undefined;\n let pointSourceIdBuffer: ArrayBuffer | undefined;\n\n let rgb: Uint8Array | undefined;\n let intensity: Float32Array | undefined;\n let classification: Uint8Array | undefined;\n let returnNumber: Uint8Array | undefined;\n let numberOfReturns: Uint8Array | undefined;\n let pointSourceId: Uint16Array | undefined;\n\n let rgbExtractor: ((name: number) => number)[];\n let intensityExtractor: (name: number) => number;\n let classificationExtractor: (name: number) => number;\n let returnNumberExtractor: (name: number) => number;\n let numberOfReturnsExtractor: (name: number) => number;\n let pointSourceIdExtractor: (name: number) => number;\n\n let twoByteColor = false;\n\n if (!dimensions['X'] || !dimensions['Y'] || !dimensions['Z']) {\n throw Error('Point cloud did not contain position data');\n }\n\n const xyzBuffer = new ArrayBuffer(numPoints * 4 * 3);\n const xyz = new Float32Array(xyzBuffer);\n const xyzExtractor = [getExtractor('X'), getExtractor('Y'), getExtractor('Z')];\n\n if (dimensions['Red'] && dimensions['Green'] && dimensions['Blue']) {\n rgbBuffer = new ArrayBuffer(numPoints * 4);\n rgb = new Uint8Array(rgbBuffer);\n rgbExtractor = [getExtractor('Red'), getExtractor('Green'), getExtractor('Blue')];\n\n let r: number, g: number, b: number, pos: number;\n for (let i = 0; i < numPoints && !twoByteColor; ++i) {\n pos = i * pointSize;\n r = rgbExtractor[0](pos);\n g = rgbExtractor[1](pos);\n b = rgbExtractor[2](pos);\n if (r > 255 || g > 255 || b > 255) twoByteColor = true;\n }\n }\n\n if (dimensions['Intensity']) {\n intensityBuffer = new ArrayBuffer(numPoints * 4);\n intensity = new Float32Array(intensityBuffer);\n intensityExtractor = getExtractor('Intensity');\n }\n\n if (dimensions['Classification']) {\n classificationBuffer = new ArrayBuffer(numPoints);\n classification = new Uint8Array(classificationBuffer);\n classificationExtractor = getExtractor('Classification');\n }\n\n if (dimensions['ReturnNumber']) {\n returnNumberBuffer = new ArrayBuffer(numPoints);\n returnNumber = new Uint8Array(returnNumberBuffer);\n returnNumberExtractor = getExtractor('ReturnNumber');\n }\n\n if (dimensions['NumberOfReturns']) {\n numberOfReturnsBuffer = new ArrayBuffer(numPoints);\n numberOfReturns = new Uint8Array(numberOfReturnsBuffer);\n numberOfReturnsExtractor = getExtractor('NumberOfReturns');\n }\n\n if (dimensions['PointSourceId']) {\n pointSourceIdBuffer = new ArrayBuffer(numPoints * 2);\n pointSourceId = new Uint16Array(pointSourceIdBuffer);\n pointSourceIdExtractor = getExtractor('PointSourceId');\n }\n\n const mean = [0, 0, 0];\n const bounds = {\n min: [Number.MAX_VALUE, Number.MAX_VALUE, Number.MAX_VALUE],\n max: [-Number.MAX_VALUE, -Number.MAX_VALUE, -Number.MAX_VALUE]\n };\n\n let x: number;\n let y: number;\n let z: number;\n let r: number;\n let g: number;\n let b: number;\n\n for (let i = 0; i < numPoints; ++i) {\n const pos = i * pointSize;\n if (xyz) {\n x = xyzExtractor[0](pos) * scale.x + offset.x - mins[0];\n y = xyzExtractor[1](pos) * scale.y + offset.y - mins[1];\n z = xyzExtractor[2](pos) * scale.z + offset.z - mins[2];\n\n mean[0] += x / numPoints;\n mean[1] += y / numPoints;\n mean[2] += z / numPoints;\n\n bounds.min[0] = Math.min(bounds.min[0], x);\n bounds.min[1] = Math.min(bounds.min[1], y);\n bounds.min[2] = Math.min(bounds.min[2], z);\n\n bounds.max[0] = Math.max(bounds.max[0], x);\n bounds.max[1] = Math.max(bounds.max[1], y);\n bounds.max[2] = Math.max(bounds.max[2], z);\n\n xyz[3 * i + 0] = x;\n xyz[3 * i + 1] = y;\n xyz[3 * i + 2] = z;\n }\n\n if (rgb) {\n r = rgbExtractor![0](pos);\n g = rgbExtractor![1](pos);\n b = rgbExtractor![2](pos);\n\n if (twoByteColor) {\n r /= 256;\n g /= 256;\n b /= 256;\n }\n\n rgb[4 * i + 0] = r;\n rgb[4 * i + 1] = g;\n rgb[4 * i + 2] = b;\n }\n\n if (intensity) intensity[i] = intensityExtractor!(pos);\n if (classification) classification[i] = classificationExtractor!(pos);\n if (returnNumber) returnNumber[i] = returnNumberExtractor!(pos);\n if (numberOfReturns) numberOfReturns[i] = numberOfReturnsExtractor!(pos);\n if (pointSourceId) pointSourceId[i] = pointSourceIdExtractor!(pos);\n }\n\n const indicesBuffer = new ArrayBuffer(numPoints * 4);\n const indices = new Uint32Array(indicesBuffer);\n for (let i = 0; i < numPoints; ++i) {\n indices[i] = i;\n }\n\n const message: ParsedEptData = {\n numPoints: numPoints,\n tightBoundingBox: bounds,\n mean: mean,\n\n position: xyzBuffer,\n color: rgbBuffer,\n intensity: intensityBuffer,\n classification: classificationBuffer,\n returnNumber: returnNumberBuffer,\n numberOfReturns: numberOfReturnsBuffer,\n pointSourceId: pointSourceIdBuffer,\n indices: indicesBuffer\n };\n\n function assertDefined(buffer: ArrayBuffer | undefined): buffer is ArrayBuffer {\n return buffer !== undefined;\n }\n\n const transferables = [\n message.position,\n message.color,\n message.intensity,\n message.classification,\n message.returnNumber,\n message.numberOfReturns,\n message.pointSourceId,\n message.indices\n ].filter(assertDefined);\n\n ctx.postMessage(message, transferables);\n}\n\nexport default null as any;\n"],"names":["ctx","self","onmessage","arg0","event","buffer","data","view","DataView","schema","scale","offset","mins","dimensions","reduce","p","c","name","getExtractor","i","length","size","dimOffset","type","getInt8","getInt16","getInt32","Error","getUint8","getUint16","getUint32","getFloat32","getFloat64","str","JSON","stringify","pointSize","numPoints","byteLength","rgbBuffer","intensityBuffer","classificationBuffer","returnNumberBuffer","numberOfReturnsBuffer","pointSourceIdBuffer","rgb","intensity","classification","returnNumber","numberOfReturns","pointSourceId","rgbExtractor","intensityExtractor","classificationExtractor","returnNumberExtractor","numberOfReturnsExtractor","pointSourceIdExtractor","twoByteColor","xyzBuffer","ArrayBuffer","xyz","Float32Array","xyzExtractor","r","g","b","pos","Uint8Array","Uint16Array","mean","bounds","min","Number","MAX_VALUE","max","x","y","z","Math","indicesBuffer","indices","Uint32Array","message","tightBoundingBox","position","color","transferables","filter","undefined","postMessage","parseEpt"],"sourceRoot":""}
@@ -1 +0,0 @@
1
- {"version":3,"file":"extensions/datasource.js","mappings":";CAAA,SAA2CA,EAAMC,GAC1B,iBAAZC,SAA0C,iBAAXC,OACxCA,OAAOD,QAAUD,IACQ,mBAAXG,QAAyBA,OAAOC,IAC9CD,OAAO,GAAIH,GACe,iBAAZC,QACdA,QAAQ,mBAAqBD,IAE7BD,EAAK,mBAAqBC,IAR5B,CASoB,oBAATK,KAAuBA,KAAOC,MAAO,uBCRhD,IAAIC,EAAsB,CCA1BA,EAAwB,CAACN,EAASO,KACjC,IAAI,IAAIC,KAAOD,EACXD,EAAoBG,EAAEF,EAAYC,KAASF,EAAoBG,EAAET,EAASQ,IAC5EE,OAAOC,eAAeX,EAASQ,EAAK,CAAEI,YAAY,EAAMC,IAAKN,EAAWC,MCJ3EF,EAAwB,CAACQ,EAAKC,IAAUL,OAAOM,UAAUC,eAAeC,KAAKJ,EAAKC,GCClFT,EAAyBN,IACH,oBAAXmB,QAA0BA,OAAOC,aAC1CV,OAAOC,eAAeX,EAASmB,OAAOC,YAAa,CAAEC,MAAO,WAE7DX,OAAOC,eAAeX,EAAS,aAAc,CAAEqB,OAAO,uECIhD,MAAM,EAMXC,YAAYC,EAAiBC,GAC3BnB,KAAKoB,iBAAmBN,OAAO,GAAGI,KAAWC,KAC7CnB,KAAKkB,QAAUA,EACflB,KAAKmB,WAAaA,EAGbE,WACL,MAAO,GAAG,EAAmBC,SAASC,OAAOvB,KAAKoB,sBCtBtD,MAAM,EAA+BI,QAAQ,SC8B7C,IAAY,EAAAC,SAAAA,EAAA,MAAY,KACtB,+BAIA,oCAIA,gCACA,2BC/B8B,IAAI,WAAgBC,IAAI,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,GAAI,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,GCTjEF,QAAQ","sources":["webpack://@cognite/reveal/webpack/universalModuleDefinition","webpack://@cognite/reveal/webpack/bootstrap","webpack://@cognite/reveal/webpack/runtime/define property getters","webpack://@cognite/reveal/webpack/runtime/hasOwnProperty shorthand","webpack://@cognite/reveal/webpack/runtime/make namespace object","webpack://@cognite/reveal/./packages/modeldata-api/src/CdfModelIdentifier.ts","webpack://@cognite/reveal/external commonjs \"three\"","webpack://@cognite/reveal/./packages/modeldata-api/src/types.ts","webpack://@cognite/reveal/./packages/modeldata-api/src/applyDefaultModelTransformation.ts","webpack://@cognite/reveal/external commonjs \"@cognite/sdk-core\""],"sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"@cognite/reveal\"] = factory();\n\telse\n\t\troot[\"@cognite/reveal\"] = factory();\n})((typeof self !== 'undefined' ? self : this), () => {\nreturn ","// The require scope\nvar __webpack_require__ = {};\n\n","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","/*!\n * Copyright 2021 Cognite AS\n */\nimport { ModelIdentifier } from '..';\n\n/**\n * Identifies a 3D model stored in CDF by the combination of a modelId, a revisionId\n * and a format.\n */\nexport class CdfModelIdentifier implements ModelIdentifier {\n readonly revealInternalId: symbol;\n\n readonly modelId: number;\n readonly revisionId: number;\n\n constructor(modelId: number, revisionId: number) {\n this.revealInternalId = Symbol(`${modelId}/${revisionId}`);\n this.modelId = modelId;\n this.revisionId = revisionId;\n }\n\n public toString(): string {\n return `${CdfModelIdentifier.name} (${String(this.revealInternalId)})`;\n }\n}\n","const __WEBPACK_NAMESPACE_OBJECT__ = require(\"three\");","/*!\n * Copyright 2021 Cognite AS\n */\n\nexport interface JsonFileProvider {\n getJsonFile(baseUrl: string, fileName: string): Promise<any>;\n}\n\nexport interface BinaryFileProvider {\n getBinaryFile(baseUrl: string, fileName: string): Promise<ArrayBuffer>;\n}\n\n/**\n * Provides data for 3D models.\n */\nexport interface ModelDataProvider extends JsonFileProvider, BinaryFileProvider {\n /**\n * Download and parse a JSON file and return the resulting struct.\n * @param baseUrl Base URL of the model.\n * @param fileName Filename of JSON file.\n */\n getJsonFile(baseUrl: string, fileName: string): Promise<any>;\n /**\n * Downloads a binary blob.\n * @param baseUrl Base URL of the model.\n * @param fileName Filename of binary file.\n */\n getBinaryFile(baseUrl: string, fileName: string): Promise<ArrayBuffer>;\n}\n\nexport enum File3dFormat {\n EptPointCloud = 'ept-pointcloud',\n /**\n * V8 models only due to bug for version checks in Reveal <3.0\n */\n RevealCadModel = 'reveal-directory',\n /**\n * Reveal v9 and above (GLTF based output)\n */\n GltfCadModel = 'gltf-directory',\n AnyFormat = 'all-outputs'\n}\n\nexport interface BlobOutputMetadata {\n blobId: number;\n format: File3dFormat | string;\n version: number;\n}\n","/*!\n * Copyright 2021 Cognite AS\n */\n\nimport * as THREE from 'three';\n\nimport { File3dFormat } from './types';\n\n// The below is equal to new THREE.Matrix4().makeRotationFromEuler(new THREE.Euler(-Math.PI / 2, 0, 0));\nconst cadFromCdfToThreeMatrix = new THREE.Matrix4().set(1, 0, 0, 0, 0, 0, 1, 0, 0, -1, 0, 0, 0, 0, 0, 1);\n\nexport function applyDefaultModelTransformation(matrix: THREE.Matrix4, format: File3dFormat | string): void {\n switch (format) {\n case File3dFormat.RevealCadModel:\n case File3dFormat.GltfCadModel:\n case File3dFormat.EptPointCloud:\n matrix.premultiply(cadFromCdfToThreeMatrix);\n break;\n\n default:\n throw new Error(`Unknown model format '${format}`);\n }\n}\n","const __WEBPACK_NAMESPACE_OBJECT__ = require(\"@cognite/sdk-core\");"],"names":["root","factory","exports","module","define","amd","self","this","__webpack_require__","definition","key","o","Object","defineProperty","enumerable","get","obj","prop","prototype","hasOwnProperty","call","Symbol","toStringTag","value","constructor","modelId","revisionId","revealInternalId","toString","name","String","require","File3dFormat","set"],"sourceRoot":""}