@ifc-lite/viewer 1.17.2 → 1.17.4

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 (520) hide show
  1. package/.turbo/turbo-build.log +34 -24
  2. package/.turbo/turbo-typecheck.log +1 -42
  3. package/CHANGELOG.md +24 -0
  4. package/DESKTOP_CONTRACT_VERSION +1 -0
  5. package/dist/assets/arrow-CZ5kQ26f.js +20 -0
  6. package/dist/assets/basketViewActivator-BmnNtVfZ.js +1 -0
  7. package/dist/assets/bcf-DOG9_WPX.js +281 -0
  8. package/dist/assets/{browser-BDShTXzi.js → browser-C5TFR7sH.js} +1 -1
  9. package/dist/assets/cesium-ADbP7waU.css +1 -0
  10. package/dist/assets/cesium-DUOzBlqv.js +17817 -0
  11. package/dist/assets/drawing-2d-gWfpdfYe.js +257 -0
  12. package/dist/assets/epsg-index.generated-BjJrt_0S.js +1 -0
  13. package/dist/assets/exporters-ChAtBmlj.js +80367 -0
  14. package/dist/assets/geometry.worker-BQ0rzNo-.js +1 -0
  15. package/dist/assets/ids-B4jTqB1O.js +1 -0
  16. package/dist/assets/ifc-lite_bg-BX4E7TX8.wasm +0 -0
  17. package/dist/assets/index-Co8E2-FE.js +106013 -0
  18. package/dist/assets/index-DckuDqlv.css +1 -0
  19. package/dist/assets/lens-CSASnhAL.js +1 -0
  20. package/dist/assets/maplibre-gl-CGLcoNXc.js +811 -0
  21. package/dist/assets/native-bridge-BRvbckFQ.js +429 -0
  22. package/dist/assets/{arrow2-bb-jcVEo.js → parquet-CEXmQNRO.js} +2 -2
  23. package/dist/assets/sandbox-DZiNLNMk.js +5933 -0
  24. package/dist/assets/server-client-BV8zHZ7Y.js +626 -0
  25. package/dist/assets/tauri-core-stub-D8Fa-u43.js +1 -0
  26. package/dist/assets/tauri-dialog-stub-r7Wksg7o.js +1 -0
  27. package/dist/assets/tauri-fs-stub-BdeRC7aK.js +1 -0
  28. package/dist/assets/wasm-bridge-g01g7T9b.js +1 -0
  29. package/dist/assets/zip-DBEtpeu6.js +12 -0
  30. package/dist/cesium/Assets/IAU2006_XYS/IAU2006_XYS_0.json +1 -0
  31. package/dist/cesium/Assets/IAU2006_XYS/IAU2006_XYS_1.json +1 -0
  32. package/dist/cesium/Assets/IAU2006_XYS/IAU2006_XYS_10.json +1 -0
  33. package/dist/cesium/Assets/IAU2006_XYS/IAU2006_XYS_11.json +1 -0
  34. package/dist/cesium/Assets/IAU2006_XYS/IAU2006_XYS_12.json +1 -0
  35. package/dist/cesium/Assets/IAU2006_XYS/IAU2006_XYS_13.json +1 -0
  36. package/dist/cesium/Assets/IAU2006_XYS/IAU2006_XYS_14.json +1 -0
  37. package/dist/cesium/Assets/IAU2006_XYS/IAU2006_XYS_15.json +1 -0
  38. package/dist/cesium/Assets/IAU2006_XYS/IAU2006_XYS_16.json +1 -0
  39. package/dist/cesium/Assets/IAU2006_XYS/IAU2006_XYS_17.json +1 -0
  40. package/dist/cesium/Assets/IAU2006_XYS/IAU2006_XYS_18.json +1 -0
  41. package/dist/cesium/Assets/IAU2006_XYS/IAU2006_XYS_19.json +1 -0
  42. package/dist/cesium/Assets/IAU2006_XYS/IAU2006_XYS_2.json +1 -0
  43. package/dist/cesium/Assets/IAU2006_XYS/IAU2006_XYS_20.json +1 -0
  44. package/dist/cesium/Assets/IAU2006_XYS/IAU2006_XYS_21.json +1 -0
  45. package/dist/cesium/Assets/IAU2006_XYS/IAU2006_XYS_22.json +1 -0
  46. package/dist/cesium/Assets/IAU2006_XYS/IAU2006_XYS_23.json +1 -0
  47. package/dist/cesium/Assets/IAU2006_XYS/IAU2006_XYS_24.json +1 -0
  48. package/dist/cesium/Assets/IAU2006_XYS/IAU2006_XYS_25.json +1 -0
  49. package/dist/cesium/Assets/IAU2006_XYS/IAU2006_XYS_26.json +1 -0
  50. package/dist/cesium/Assets/IAU2006_XYS/IAU2006_XYS_27.json +1 -0
  51. package/dist/cesium/Assets/IAU2006_XYS/IAU2006_XYS_3.json +1 -0
  52. package/dist/cesium/Assets/IAU2006_XYS/IAU2006_XYS_4.json +1 -0
  53. package/dist/cesium/Assets/IAU2006_XYS/IAU2006_XYS_5.json +1 -0
  54. package/dist/cesium/Assets/IAU2006_XYS/IAU2006_XYS_6.json +1 -0
  55. package/dist/cesium/Assets/IAU2006_XYS/IAU2006_XYS_7.json +1 -0
  56. package/dist/cesium/Assets/IAU2006_XYS/IAU2006_XYS_8.json +1 -0
  57. package/dist/cesium/Assets/IAU2006_XYS/IAU2006_XYS_9.json +1 -0
  58. package/dist/cesium/Assets/Images/bing_maps_credit.png +0 -0
  59. package/dist/cesium/Assets/Images/cesium_credit.png +0 -0
  60. package/dist/cesium/Assets/Images/google_earth_credit.png +0 -0
  61. package/dist/cesium/Assets/Images/ion-credit.png +0 -0
  62. package/dist/cesium/Assets/Textures/LensFlare/DirtMask.jpg +0 -0
  63. package/dist/cesium/Assets/Textures/LensFlare/StarBurst.jpg +0 -0
  64. package/dist/cesium/Assets/Textures/NaturalEarthII/0/0/0.jpg +0 -0
  65. package/dist/cesium/Assets/Textures/NaturalEarthII/0/1/0.jpg +0 -0
  66. package/dist/cesium/Assets/Textures/NaturalEarthII/1/0/0.jpg +0 -0
  67. package/dist/cesium/Assets/Textures/NaturalEarthII/1/0/1.jpg +0 -0
  68. package/dist/cesium/Assets/Textures/NaturalEarthII/1/1/0.jpg +0 -0
  69. package/dist/cesium/Assets/Textures/NaturalEarthII/1/1/1.jpg +0 -0
  70. package/dist/cesium/Assets/Textures/NaturalEarthII/1/2/0.jpg +0 -0
  71. package/dist/cesium/Assets/Textures/NaturalEarthII/1/2/1.jpg +0 -0
  72. package/dist/cesium/Assets/Textures/NaturalEarthII/1/3/0.jpg +0 -0
  73. package/dist/cesium/Assets/Textures/NaturalEarthII/1/3/1.jpg +0 -0
  74. package/dist/cesium/Assets/Textures/NaturalEarthII/2/0/0.jpg +0 -0
  75. package/dist/cesium/Assets/Textures/NaturalEarthII/2/0/1.jpg +0 -0
  76. package/dist/cesium/Assets/Textures/NaturalEarthII/2/0/2.jpg +0 -0
  77. package/dist/cesium/Assets/Textures/NaturalEarthII/2/0/3.jpg +0 -0
  78. package/dist/cesium/Assets/Textures/NaturalEarthII/2/1/0.jpg +0 -0
  79. package/dist/cesium/Assets/Textures/NaturalEarthII/2/1/1.jpg +0 -0
  80. package/dist/cesium/Assets/Textures/NaturalEarthII/2/1/2.jpg +0 -0
  81. package/dist/cesium/Assets/Textures/NaturalEarthII/2/1/3.jpg +0 -0
  82. package/dist/cesium/Assets/Textures/NaturalEarthII/2/2/0.jpg +0 -0
  83. package/dist/cesium/Assets/Textures/NaturalEarthII/2/2/1.jpg +0 -0
  84. package/dist/cesium/Assets/Textures/NaturalEarthII/2/2/2.jpg +0 -0
  85. package/dist/cesium/Assets/Textures/NaturalEarthII/2/2/3.jpg +0 -0
  86. package/dist/cesium/Assets/Textures/NaturalEarthII/2/3/0.jpg +0 -0
  87. package/dist/cesium/Assets/Textures/NaturalEarthII/2/3/1.jpg +0 -0
  88. package/dist/cesium/Assets/Textures/NaturalEarthII/2/3/2.jpg +0 -0
  89. package/dist/cesium/Assets/Textures/NaturalEarthII/2/3/3.jpg +0 -0
  90. package/dist/cesium/Assets/Textures/NaturalEarthII/2/4/0.jpg +0 -0
  91. package/dist/cesium/Assets/Textures/NaturalEarthII/2/4/1.jpg +0 -0
  92. package/dist/cesium/Assets/Textures/NaturalEarthII/2/4/2.jpg +0 -0
  93. package/dist/cesium/Assets/Textures/NaturalEarthII/2/4/3.jpg +0 -0
  94. package/dist/cesium/Assets/Textures/NaturalEarthII/2/5/0.jpg +0 -0
  95. package/dist/cesium/Assets/Textures/NaturalEarthII/2/5/1.jpg +0 -0
  96. package/dist/cesium/Assets/Textures/NaturalEarthII/2/5/2.jpg +0 -0
  97. package/dist/cesium/Assets/Textures/NaturalEarthII/2/5/3.jpg +0 -0
  98. package/dist/cesium/Assets/Textures/NaturalEarthII/2/6/0.jpg +0 -0
  99. package/dist/cesium/Assets/Textures/NaturalEarthII/2/6/1.jpg +0 -0
  100. package/dist/cesium/Assets/Textures/NaturalEarthII/2/6/2.jpg +0 -0
  101. package/dist/cesium/Assets/Textures/NaturalEarthII/2/6/3.jpg +0 -0
  102. package/dist/cesium/Assets/Textures/NaturalEarthII/2/7/0.jpg +0 -0
  103. package/dist/cesium/Assets/Textures/NaturalEarthII/2/7/1.jpg +0 -0
  104. package/dist/cesium/Assets/Textures/NaturalEarthII/2/7/2.jpg +0 -0
  105. package/dist/cesium/Assets/Textures/NaturalEarthII/2/7/3.jpg +0 -0
  106. package/dist/cesium/Assets/Textures/NaturalEarthII/tilemapresource.xml +14 -0
  107. package/dist/cesium/Assets/Textures/SkyBox/tycho2t3_80_mx.jpg +0 -0
  108. package/dist/cesium/Assets/Textures/SkyBox/tycho2t3_80_my.jpg +0 -0
  109. package/dist/cesium/Assets/Textures/SkyBox/tycho2t3_80_mz.jpg +0 -0
  110. package/dist/cesium/Assets/Textures/SkyBox/tycho2t3_80_px.jpg +0 -0
  111. package/dist/cesium/Assets/Textures/SkyBox/tycho2t3_80_py.jpg +0 -0
  112. package/dist/cesium/Assets/Textures/SkyBox/tycho2t3_80_pz.jpg +0 -0
  113. package/dist/cesium/Assets/Textures/maki/airfield.png +0 -0
  114. package/dist/cesium/Assets/Textures/maki/airport.png +0 -0
  115. package/dist/cesium/Assets/Textures/maki/alcohol-shop.png +0 -0
  116. package/dist/cesium/Assets/Textures/maki/america-football.png +0 -0
  117. package/dist/cesium/Assets/Textures/maki/art-gallery.png +0 -0
  118. package/dist/cesium/Assets/Textures/maki/bakery.png +0 -0
  119. package/dist/cesium/Assets/Textures/maki/bank.png +0 -0
  120. package/dist/cesium/Assets/Textures/maki/bar.png +0 -0
  121. package/dist/cesium/Assets/Textures/maki/baseball.png +0 -0
  122. package/dist/cesium/Assets/Textures/maki/basketball.png +0 -0
  123. package/dist/cesium/Assets/Textures/maki/beer.png +0 -0
  124. package/dist/cesium/Assets/Textures/maki/bicycle.png +0 -0
  125. package/dist/cesium/Assets/Textures/maki/building.png +0 -0
  126. package/dist/cesium/Assets/Textures/maki/bus.png +0 -0
  127. package/dist/cesium/Assets/Textures/maki/cafe.png +0 -0
  128. package/dist/cesium/Assets/Textures/maki/camera.png +0 -0
  129. package/dist/cesium/Assets/Textures/maki/campsite.png +0 -0
  130. package/dist/cesium/Assets/Textures/maki/car.png +0 -0
  131. package/dist/cesium/Assets/Textures/maki/cemetery.png +0 -0
  132. package/dist/cesium/Assets/Textures/maki/cesium.png +0 -0
  133. package/dist/cesium/Assets/Textures/maki/chemist.png +0 -0
  134. package/dist/cesium/Assets/Textures/maki/cinema.png +0 -0
  135. package/dist/cesium/Assets/Textures/maki/circle-stroked.png +0 -0
  136. package/dist/cesium/Assets/Textures/maki/circle.png +0 -0
  137. package/dist/cesium/Assets/Textures/maki/city.png +0 -0
  138. package/dist/cesium/Assets/Textures/maki/clothing-store.png +0 -0
  139. package/dist/cesium/Assets/Textures/maki/college.png +0 -0
  140. package/dist/cesium/Assets/Textures/maki/commercial.png +0 -0
  141. package/dist/cesium/Assets/Textures/maki/cricket.png +0 -0
  142. package/dist/cesium/Assets/Textures/maki/cross.png +0 -0
  143. package/dist/cesium/Assets/Textures/maki/dam.png +0 -0
  144. package/dist/cesium/Assets/Textures/maki/danger.png +0 -0
  145. package/dist/cesium/Assets/Textures/maki/disability.png +0 -0
  146. package/dist/cesium/Assets/Textures/maki/dog-park.png +0 -0
  147. package/dist/cesium/Assets/Textures/maki/embassy.png +0 -0
  148. package/dist/cesium/Assets/Textures/maki/emergency-telephone.png +0 -0
  149. package/dist/cesium/Assets/Textures/maki/entrance.png +0 -0
  150. package/dist/cesium/Assets/Textures/maki/farm.png +0 -0
  151. package/dist/cesium/Assets/Textures/maki/fast-food.png +0 -0
  152. package/dist/cesium/Assets/Textures/maki/ferry.png +0 -0
  153. package/dist/cesium/Assets/Textures/maki/fire-station.png +0 -0
  154. package/dist/cesium/Assets/Textures/maki/fuel.png +0 -0
  155. package/dist/cesium/Assets/Textures/maki/garden.png +0 -0
  156. package/dist/cesium/Assets/Textures/maki/gift.png +0 -0
  157. package/dist/cesium/Assets/Textures/maki/golf.png +0 -0
  158. package/dist/cesium/Assets/Textures/maki/grocery.png +0 -0
  159. package/dist/cesium/Assets/Textures/maki/hairdresser.png +0 -0
  160. package/dist/cesium/Assets/Textures/maki/harbor.png +0 -0
  161. package/dist/cesium/Assets/Textures/maki/heart.png +0 -0
  162. package/dist/cesium/Assets/Textures/maki/heliport.png +0 -0
  163. package/dist/cesium/Assets/Textures/maki/hospital.png +0 -0
  164. package/dist/cesium/Assets/Textures/maki/ice-cream.png +0 -0
  165. package/dist/cesium/Assets/Textures/maki/industrial.png +0 -0
  166. package/dist/cesium/Assets/Textures/maki/land-use.png +0 -0
  167. package/dist/cesium/Assets/Textures/maki/laundry.png +0 -0
  168. package/dist/cesium/Assets/Textures/maki/library.png +0 -0
  169. package/dist/cesium/Assets/Textures/maki/lighthouse.png +0 -0
  170. package/dist/cesium/Assets/Textures/maki/lodging.png +0 -0
  171. package/dist/cesium/Assets/Textures/maki/logging.png +0 -0
  172. package/dist/cesium/Assets/Textures/maki/london-underground.png +0 -0
  173. package/dist/cesium/Assets/Textures/maki/marker-stroked.png +0 -0
  174. package/dist/cesium/Assets/Textures/maki/marker.png +0 -0
  175. package/dist/cesium/Assets/Textures/maki/minefield.png +0 -0
  176. package/dist/cesium/Assets/Textures/maki/mobilephone.png +0 -0
  177. package/dist/cesium/Assets/Textures/maki/monument.png +0 -0
  178. package/dist/cesium/Assets/Textures/maki/museum.png +0 -0
  179. package/dist/cesium/Assets/Textures/maki/music.png +0 -0
  180. package/dist/cesium/Assets/Textures/maki/oil-well.png +0 -0
  181. package/dist/cesium/Assets/Textures/maki/park.png +0 -0
  182. package/dist/cesium/Assets/Textures/maki/park2.png +0 -0
  183. package/dist/cesium/Assets/Textures/maki/parking-garage.png +0 -0
  184. package/dist/cesium/Assets/Textures/maki/parking.png +0 -0
  185. package/dist/cesium/Assets/Textures/maki/pharmacy.png +0 -0
  186. package/dist/cesium/Assets/Textures/maki/pitch.png +0 -0
  187. package/dist/cesium/Assets/Textures/maki/place-of-worship.png +0 -0
  188. package/dist/cesium/Assets/Textures/maki/playground.png +0 -0
  189. package/dist/cesium/Assets/Textures/maki/police.png +0 -0
  190. package/dist/cesium/Assets/Textures/maki/polling-place.png +0 -0
  191. package/dist/cesium/Assets/Textures/maki/post.png +0 -0
  192. package/dist/cesium/Assets/Textures/maki/prison.png +0 -0
  193. package/dist/cesium/Assets/Textures/maki/rail-above.png +0 -0
  194. package/dist/cesium/Assets/Textures/maki/rail-light.png +0 -0
  195. package/dist/cesium/Assets/Textures/maki/rail-metro.png +0 -0
  196. package/dist/cesium/Assets/Textures/maki/rail-underground.png +0 -0
  197. package/dist/cesium/Assets/Textures/maki/rail.png +0 -0
  198. package/dist/cesium/Assets/Textures/maki/religious-christian.png +0 -0
  199. package/dist/cesium/Assets/Textures/maki/religious-jewish.png +0 -0
  200. package/dist/cesium/Assets/Textures/maki/religious-muslim.png +0 -0
  201. package/dist/cesium/Assets/Textures/maki/restaurant.png +0 -0
  202. package/dist/cesium/Assets/Textures/maki/roadblock.png +0 -0
  203. package/dist/cesium/Assets/Textures/maki/rocket.png +0 -0
  204. package/dist/cesium/Assets/Textures/maki/school.png +0 -0
  205. package/dist/cesium/Assets/Textures/maki/scooter.png +0 -0
  206. package/dist/cesium/Assets/Textures/maki/shop.png +0 -0
  207. package/dist/cesium/Assets/Textures/maki/skiing.png +0 -0
  208. package/dist/cesium/Assets/Textures/maki/slaughterhouse.png +0 -0
  209. package/dist/cesium/Assets/Textures/maki/soccer.png +0 -0
  210. package/dist/cesium/Assets/Textures/maki/square-stroked.png +0 -0
  211. package/dist/cesium/Assets/Textures/maki/square.png +0 -0
  212. package/dist/cesium/Assets/Textures/maki/star-stroked.png +0 -0
  213. package/dist/cesium/Assets/Textures/maki/star.png +0 -0
  214. package/dist/cesium/Assets/Textures/maki/suitcase.png +0 -0
  215. package/dist/cesium/Assets/Textures/maki/swimming.png +0 -0
  216. package/dist/cesium/Assets/Textures/maki/telephone.png +0 -0
  217. package/dist/cesium/Assets/Textures/maki/tennis.png +0 -0
  218. package/dist/cesium/Assets/Textures/maki/theatre.png +0 -0
  219. package/dist/cesium/Assets/Textures/maki/toilets.png +0 -0
  220. package/dist/cesium/Assets/Textures/maki/town-hall.png +0 -0
  221. package/dist/cesium/Assets/Textures/maki/town.png +0 -0
  222. package/dist/cesium/Assets/Textures/maki/triangle-stroked.png +0 -0
  223. package/dist/cesium/Assets/Textures/maki/triangle.png +0 -0
  224. package/dist/cesium/Assets/Textures/maki/village.png +0 -0
  225. package/dist/cesium/Assets/Textures/maki/warehouse.png +0 -0
  226. package/dist/cesium/Assets/Textures/maki/waste-basket.png +0 -0
  227. package/dist/cesium/Assets/Textures/maki/water.png +0 -0
  228. package/dist/cesium/Assets/Textures/maki/wetland.png +0 -0
  229. package/dist/cesium/Assets/Textures/maki/zoo.png +0 -0
  230. package/dist/cesium/Assets/Textures/moonSmall.jpg +0 -0
  231. package/dist/cesium/Assets/Textures/pin.svg +1 -0
  232. package/dist/cesium/Assets/Textures/waterNormals.jpg +0 -0
  233. package/dist/cesium/Assets/Textures/waterNormalsSmall.jpg +0 -0
  234. package/dist/cesium/Assets/approximateTerrainHeights.json +1 -0
  235. package/dist/cesium/ThirdParty/Workers/package.json +1 -0
  236. package/dist/cesium/ThirdParty/Workers/zip-web-worker.js +1 -0
  237. package/dist/cesium/ThirdParty/basis_transcoder.wasm +0 -0
  238. package/dist/cesium/ThirdParty/draco_decoder.wasm +0 -0
  239. package/dist/cesium/ThirdParty/google-earth-dbroot-parser.js +1 -0
  240. package/dist/cesium/ThirdParty/wasm_splats_bg.wasm +0 -0
  241. package/dist/cesium/ThirdParty/zip-module.wasm +0 -0
  242. package/dist/cesium/Widgets/Animation/Animation.css +127 -0
  243. package/dist/cesium/Widgets/Animation/lighter.css +70 -0
  244. package/dist/cesium/Widgets/BaseLayerPicker/BaseLayerPicker.css +108 -0
  245. package/dist/cesium/Widgets/BaseLayerPicker/lighter.css +22 -0
  246. package/dist/cesium/Widgets/Cesium3DTilesInspector/Cesium3DTilesInspector.css +102 -0
  247. package/dist/cesium/Widgets/CesiumInspector/CesiumInspector.css +113 -0
  248. package/dist/cesium/Widgets/CesiumWidget/CesiumWidget.css +119 -0
  249. package/dist/cesium/Widgets/CesiumWidget/lighter.css +14 -0
  250. package/dist/cesium/Widgets/FullscreenButton/FullscreenButton.css +8 -0
  251. package/dist/cesium/Widgets/Geocoder/Geocoder.css +70 -0
  252. package/dist/cesium/Widgets/Geocoder/lighter.css +17 -0
  253. package/dist/cesium/Widgets/I3SBuildingSceneLayerExplorer/I3SBuildingSceneLayerExplorer.css +27 -0
  254. package/dist/cesium/Widgets/Images/ImageryProviders/ArcGisMapServiceWorldHillshade.png +0 -0
  255. package/dist/cesium/Widgets/Images/ImageryProviders/ArcGisMapServiceWorldImagery.png +0 -0
  256. package/dist/cesium/Widgets/Images/ImageryProviders/ArcGisMapServiceWorldOcean.png +0 -0
  257. package/dist/cesium/Widgets/Images/ImageryProviders/azureAerial.png +0 -0
  258. package/dist/cesium/Widgets/Images/ImageryProviders/azureRoads.png +0 -0
  259. package/dist/cesium/Widgets/Images/ImageryProviders/bingAerial.png +0 -0
  260. package/dist/cesium/Widgets/Images/ImageryProviders/bingAerialLabels.png +0 -0
  261. package/dist/cesium/Widgets/Images/ImageryProviders/bingRoads.png +0 -0
  262. package/dist/cesium/Widgets/Images/ImageryProviders/blueMarble.png +0 -0
  263. package/dist/cesium/Widgets/Images/ImageryProviders/earthAtNight.png +0 -0
  264. package/dist/cesium/Widgets/Images/ImageryProviders/googleContour.png +0 -0
  265. package/dist/cesium/Widgets/Images/ImageryProviders/googleRoadmap.png +0 -0
  266. package/dist/cesium/Widgets/Images/ImageryProviders/googleSatellite.png +0 -0
  267. package/dist/cesium/Widgets/Images/ImageryProviders/googleSatelliteLabels.png +0 -0
  268. package/dist/cesium/Widgets/Images/ImageryProviders/mapQuestOpenStreetMap.png +0 -0
  269. package/dist/cesium/Widgets/Images/ImageryProviders/mapboxSatellite.png +0 -0
  270. package/dist/cesium/Widgets/Images/ImageryProviders/mapboxStreets.png +0 -0
  271. package/dist/cesium/Widgets/Images/ImageryProviders/mapboxTerrain.png +0 -0
  272. package/dist/cesium/Widgets/Images/ImageryProviders/naturalEarthII.png +0 -0
  273. package/dist/cesium/Widgets/Images/ImageryProviders/openStreetMap.png +0 -0
  274. package/dist/cesium/Widgets/Images/ImageryProviders/sentinel-2.png +0 -0
  275. package/dist/cesium/Widgets/Images/ImageryProviders/stadiaAlidadeSmooth.png +0 -0
  276. package/dist/cesium/Widgets/Images/ImageryProviders/stadiaAlidadeSmoothDark.png +0 -0
  277. package/dist/cesium/Widgets/Images/ImageryProviders/stamenToner.png +0 -0
  278. package/dist/cesium/Widgets/Images/ImageryProviders/stamenWatercolor.png +0 -0
  279. package/dist/cesium/Widgets/Images/NavigationHelp/Mouse.svg +84 -0
  280. package/dist/cesium/Widgets/Images/NavigationHelp/MouseLeft.svg +76 -0
  281. package/dist/cesium/Widgets/Images/NavigationHelp/MouseMiddle.svg +76 -0
  282. package/dist/cesium/Widgets/Images/NavigationHelp/MouseRight.svg +76 -0
  283. package/dist/cesium/Widgets/Images/NavigationHelp/Touch.svg +120 -0
  284. package/dist/cesium/Widgets/Images/NavigationHelp/TouchDrag.svg +129 -0
  285. package/dist/cesium/Widgets/Images/NavigationHelp/TouchRotate.svg +76 -0
  286. package/dist/cesium/Widgets/Images/NavigationHelp/TouchTilt.svg +135 -0
  287. package/dist/cesium/Widgets/Images/NavigationHelp/TouchZoom.svg +74 -0
  288. package/dist/cesium/Widgets/Images/TerrainProviders/CesiumWorldTerrain.png +0 -0
  289. package/dist/cesium/Widgets/Images/TerrainProviders/Ellipsoid.png +0 -0
  290. package/dist/cesium/Widgets/Images/TimelineIcons.png +0 -0
  291. package/dist/cesium/Widgets/Images/info-loading.gif +0 -0
  292. package/dist/cesium/Widgets/InfoBox/InfoBox.css +92 -0
  293. package/dist/cesium/Widgets/InfoBox/InfoBoxDescription.css +178 -0
  294. package/dist/cesium/Widgets/NavigationHelpButton/NavigationHelpButton.css +93 -0
  295. package/dist/cesium/Widgets/NavigationHelpButton/lighter.css +38 -0
  296. package/dist/cesium/Widgets/PerformanceWatchdog/PerformanceWatchdog.css +15 -0
  297. package/dist/cesium/Widgets/ProjectionPicker/ProjectionPicker.css +38 -0
  298. package/dist/cesium/Widgets/SceneModePicker/SceneModePicker.css +56 -0
  299. package/dist/cesium/Widgets/SelectionIndicator/SelectionIndicator.css +20 -0
  300. package/dist/cesium/Widgets/Timeline/Timeline.css +103 -0
  301. package/dist/cesium/Widgets/Timeline/lighter.css +23 -0
  302. package/dist/cesium/Widgets/VRButton/VRButton.css +8 -0
  303. package/dist/cesium/Widgets/Viewer/Viewer.css +107 -0
  304. package/dist/cesium/Widgets/VoxelInspector/VoxelInspector.css +16 -0
  305. package/dist/cesium/Widgets/lighter.css +237 -0
  306. package/dist/cesium/Widgets/lighterShared.css +46 -0
  307. package/dist/cesium/Widgets/shared.css +103 -0
  308. package/dist/cesium/Widgets/widgets.css +1342 -0
  309. package/dist/cesium/Workers/chunk-23ZQ2IVV.js +29 -0
  310. package/dist/cesium/Workers/chunk-2EQO3Q56.js +26 -0
  311. package/dist/cesium/Workers/chunk-2MJIIVP4.js +26 -0
  312. package/dist/cesium/Workers/chunk-2TE5NTVD.js +26 -0
  313. package/dist/cesium/Workers/chunk-2ZBHLJST.js +26 -0
  314. package/dist/cesium/Workers/chunk-5TJMAQVL.js +26 -0
  315. package/dist/cesium/Workers/chunk-6BD4U3VO.js +26 -0
  316. package/dist/cesium/Workers/chunk-7TVGLKQF.js +26 -0
  317. package/dist/cesium/Workers/chunk-BTSYJ5XU.js +26 -0
  318. package/dist/cesium/Workers/chunk-BXMEEOCS.js +63 -0
  319. package/dist/cesium/Workers/chunk-BYLCY7GP.js +29 -0
  320. package/dist/cesium/Workers/chunk-CTHM3W6I.js +26 -0
  321. package/dist/cesium/Workers/chunk-CUUSNIVQ.js +26 -0
  322. package/dist/cesium/Workers/chunk-E3JOOS3S.js +26 -0
  323. package/dist/cesium/Workers/chunk-E7KYDCM5.js +26 -0
  324. package/dist/cesium/Workers/chunk-EDVBB7SS.js +27 -0
  325. package/dist/cesium/Workers/chunk-EFBN7QNX.js +26 -0
  326. package/dist/cesium/Workers/chunk-EQ4YRVWL.js +26 -0
  327. package/dist/cesium/Workers/chunk-F6PRE7D6.js +26 -0
  328. package/dist/cesium/Workers/chunk-FC4ZZ65J.js +26 -0
  329. package/dist/cesium/Workers/chunk-FFBVWF2L.js +26 -0
  330. package/dist/cesium/Workers/chunk-GBAA6GVX.js +26 -0
  331. package/dist/cesium/Workers/chunk-ICALLYLG.js +26 -0
  332. package/dist/cesium/Workers/chunk-ILRYTWTP.js +26 -0
  333. package/dist/cesium/Workers/chunk-IRNLBSEJ.js +26 -0
  334. package/dist/cesium/Workers/chunk-IX4VMHEV.js +26 -0
  335. package/dist/cesium/Workers/chunk-L6QHHACZ.js +26 -0
  336. package/dist/cesium/Workers/chunk-LI2ZSORM.js +26 -0
  337. package/dist/cesium/Workers/chunk-LSLE2RL4.js +26 -0
  338. package/dist/cesium/Workers/chunk-M4HLDBCG.js +26 -0
  339. package/dist/cesium/Workers/chunk-MJHHSGEH.js +26 -0
  340. package/dist/cesium/Workers/chunk-NMVKML6W.js +26 -0
  341. package/dist/cesium/Workers/chunk-OCWJRAXS.js +26 -0
  342. package/dist/cesium/Workers/chunk-OIRKANTH.js +26 -0
  343. package/dist/cesium/Workers/chunk-OIT7J4IC.js +26 -0
  344. package/dist/cesium/Workers/chunk-OLZ3FYUM.js +26 -0
  345. package/dist/cesium/Workers/chunk-Q5BPHJQF.js +26 -0
  346. package/dist/cesium/Workers/chunk-QFM5DCMQ.js +26 -0
  347. package/dist/cesium/Workers/chunk-QKUIYMGC.js +28 -0
  348. package/dist/cesium/Workers/chunk-S44JILQT.js +26 -0
  349. package/dist/cesium/Workers/chunk-SLT4J352.js +26 -0
  350. package/dist/cesium/Workers/chunk-SQMIIXB7.js +26 -0
  351. package/dist/cesium/Workers/chunk-TJ4XLGBQ.js +26 -0
  352. package/dist/cesium/Workers/chunk-TNSUQXWK.js +27 -0
  353. package/dist/cesium/Workers/chunk-UBOGZS7F.js +26 -0
  354. package/dist/cesium/Workers/chunk-V3OSTMM6.js +26 -0
  355. package/dist/cesium/Workers/chunk-V7QEYVP3.js +26 -0
  356. package/dist/cesium/Workers/chunk-VUKYSU4H.js +26 -0
  357. package/dist/cesium/Workers/chunk-W37FE5GR.js +26 -0
  358. package/dist/cesium/Workers/chunk-WBOV35NL.js +26 -0
  359. package/dist/cesium/Workers/chunk-WPMZLB3Y.js +26 -0
  360. package/dist/cesium/Workers/chunk-WWWZVEEH.js +26 -0
  361. package/dist/cesium/Workers/chunk-XFIQ5DEQ.js +28 -0
  362. package/dist/cesium/Workers/chunk-XQHLGIO7.js +26 -0
  363. package/dist/cesium/Workers/chunk-XUSCFAVF.js +26 -0
  364. package/dist/cesium/Workers/chunk-YP7I5QBZ.js +26 -0
  365. package/dist/cesium/Workers/chunk-Z3QF2EHT.js +26 -0
  366. package/dist/cesium/Workers/combineGeometry.js +26 -0
  367. package/dist/cesium/Workers/createBoxGeometry.js +26 -0
  368. package/dist/cesium/Workers/createBoxOutlineGeometry.js +26 -0
  369. package/dist/cesium/Workers/createCircleGeometry.js +26 -0
  370. package/dist/cesium/Workers/createCircleOutlineGeometry.js +26 -0
  371. package/dist/cesium/Workers/createCoplanarPolygonGeometry.js +26 -0
  372. package/dist/cesium/Workers/createCoplanarPolygonOutlineGeometry.js +26 -0
  373. package/dist/cesium/Workers/createCorridorGeometry.js +26 -0
  374. package/dist/cesium/Workers/createCorridorOutlineGeometry.js +26 -0
  375. package/dist/cesium/Workers/createCylinderGeometry.js +26 -0
  376. package/dist/cesium/Workers/createCylinderOutlineGeometry.js +26 -0
  377. package/dist/cesium/Workers/createEllipseGeometry.js +26 -0
  378. package/dist/cesium/Workers/createEllipseOutlineGeometry.js +26 -0
  379. package/dist/cesium/Workers/createEllipsoidGeometry.js +26 -0
  380. package/dist/cesium/Workers/createEllipsoidOutlineGeometry.js +26 -0
  381. package/dist/cesium/Workers/createFrustumGeometry.js +26 -0
  382. package/dist/cesium/Workers/createFrustumOutlineGeometry.js +26 -0
  383. package/dist/cesium/Workers/createGeometry.js +26 -0
  384. package/dist/cesium/Workers/createGroundPolylineGeometry.js +26 -0
  385. package/dist/cesium/Workers/createPlaneGeometry.js +26 -0
  386. package/dist/cesium/Workers/createPlaneOutlineGeometry.js +26 -0
  387. package/dist/cesium/Workers/createPolygonGeometry.js +26 -0
  388. package/dist/cesium/Workers/createPolygonOutlineGeometry.js +26 -0
  389. package/dist/cesium/Workers/createPolylineGeometry.js +26 -0
  390. package/dist/cesium/Workers/createPolylineVolumeGeometry.js +26 -0
  391. package/dist/cesium/Workers/createPolylineVolumeOutlineGeometry.js +26 -0
  392. package/dist/cesium/Workers/createRectangleGeometry.js +26 -0
  393. package/dist/cesium/Workers/createRectangleOutlineGeometry.js +26 -0
  394. package/dist/cesium/Workers/createSimplePolylineGeometry.js +26 -0
  395. package/dist/cesium/Workers/createSphereGeometry.js +26 -0
  396. package/dist/cesium/Workers/createSphereOutlineGeometry.js +26 -0
  397. package/dist/cesium/Workers/createTaskProcessorWorker.js +26 -0
  398. package/dist/cesium/Workers/createVectorTileClampedPolylines.js +26 -0
  399. package/dist/cesium/Workers/createVectorTileGeometries.js +26 -0
  400. package/dist/cesium/Workers/createVectorTilePoints.js +26 -0
  401. package/dist/cesium/Workers/createVectorTilePolygons.js +26 -0
  402. package/dist/cesium/Workers/createVectorTilePolylines.js +26 -0
  403. package/dist/cesium/Workers/createVerticesFromCesium3DTilesTerrain.js +26 -0
  404. package/dist/cesium/Workers/createVerticesFromGoogleEarthEnterpriseBuffer.js +26 -0
  405. package/dist/cesium/Workers/createVerticesFromHeightmap.js +26 -0
  406. package/dist/cesium/Workers/createVerticesFromQuantizedTerrainMesh.js +26 -0
  407. package/dist/cesium/Workers/createWallGeometry.js +26 -0
  408. package/dist/cesium/Workers/createWallOutlineGeometry.js +26 -0
  409. package/dist/cesium/Workers/decodeDraco.js +26 -0
  410. package/dist/cesium/Workers/decodeGoogleEarthEnterprisePacket.js +26 -0
  411. package/dist/cesium/Workers/decodeI3S.js +26 -0
  412. package/dist/cesium/Workers/gaussianSplatSorter.js +26 -0
  413. package/dist/cesium/Workers/gaussianSplatTextureGenerator.js +26 -0
  414. package/dist/cesium/Workers/incrementallyBuildTerrainPicker.js +26 -0
  415. package/dist/cesium/Workers/transcodeKTX2.js +56 -0
  416. package/dist/cesium/Workers/transferTypedArrayTest.js +26 -0
  417. package/dist/cesium/Workers/upsampleQuantizedTerrainMesh.js +26 -0
  418. package/dist/cesium/Workers/upsampleVerticesFromCesium3DTilesTerrain.js +26 -0
  419. package/dist/index.html +13 -2
  420. package/package.json +27 -19
  421. package/src/App.tsx +1 -17
  422. package/src/components/viewer/BCFPanel.tsx +46 -4
  423. package/src/components/viewer/CesiumOverlay.tsx +672 -0
  424. package/src/components/viewer/CesiumSettingsDialog.tsx +100 -0
  425. package/src/components/viewer/ChatPanel.tsx +54 -16
  426. package/src/components/viewer/CommandPalette.tsx +6 -1
  427. package/src/components/viewer/DesktopEntitlementBanner.tsx +74 -0
  428. package/src/components/viewer/ExportChangesButton.tsx +24 -4
  429. package/src/components/viewer/ExportDialog.tsx +38 -9
  430. package/src/components/viewer/HierarchyPanel.tsx +202 -6
  431. package/src/components/viewer/IDSPanel.tsx +52 -3
  432. package/src/components/viewer/KeyboardShortcutsDialog.tsx +1 -1
  433. package/src/components/viewer/MainToolbar.tsx +353 -27
  434. package/src/components/viewer/PropertiesPanel.tsx +306 -131
  435. package/src/components/viewer/ScriptPanel.tsx +34 -8
  436. package/src/components/viewer/Section2DPanel.tsx +3 -2
  437. package/src/components/viewer/SettingsPage.tsx +430 -0
  438. package/src/components/viewer/StatusBar.tsx +17 -1
  439. package/src/components/viewer/UpgradePage.tsx +6 -4
  440. package/src/components/viewer/ViewerLayout.tsx +47 -6
  441. package/src/components/viewer/Viewport.tsx +49 -8
  442. package/src/components/viewer/ViewportContainer.tsx +285 -32
  443. package/src/components/viewer/ViewportOverlays.tsx +129 -27
  444. package/src/components/viewer/hierarchy/treeDataBuilder.ts +2 -1
  445. package/src/components/viewer/properties/EpsgLookupDialog.tsx +418 -0
  446. package/src/components/viewer/properties/GeoreferencingPanel.tsx +703 -0
  447. package/src/components/viewer/properties/LocationMap.tsx +730 -0
  448. package/src/components/viewer/properties/ModelMetadataPanel.tsx +3 -70
  449. package/src/components/viewer/selectionHandlers.ts +4 -3
  450. package/src/components/viewer/useAnimationLoop.ts +4 -0
  451. package/src/components/viewer/useGeometryStreaming.ts +127 -40
  452. package/src/components/viewer/useMouseControls.ts +4 -1
  453. package/src/hooks/bcfIdLookup.ts +13 -11
  454. package/src/hooks/ids/idsColorSystem.ts +3 -8
  455. package/src/hooks/ingest/viewerModelIngest.ts +275 -0
  456. package/src/hooks/useIDS.ts +32 -17
  457. package/src/hooks/useIfc.ts +7 -1
  458. package/src/hooks/useIfcCache.ts +28 -15
  459. package/src/hooks/useIfcFederation.ts +59 -227
  460. package/src/hooks/useIfcLoader.ts +1656 -130
  461. package/src/hooks/useIfcServer.ts +0 -69
  462. package/src/lib/desktop/ClerkDesktopEntitlementSync.tsx +175 -0
  463. package/src/lib/desktop/desktopEntitlementEvents.ts +39 -0
  464. package/src/lib/desktop-entitlement.ts +45 -0
  465. package/src/lib/desktop-product.ts +124 -0
  466. package/src/lib/geo/cesium-bridge.ts +310 -0
  467. package/src/lib/geo/kmz-exporter.ts +112 -0
  468. package/src/lib/geo/reproject.ts +370 -0
  469. package/src/lib/lens/adapter.ts +3 -1
  470. package/src/lib/recent-files.ts +2 -1
  471. package/src/main.tsx +1 -0
  472. package/src/sdk/adapters/export-adapter.ts +14 -1
  473. package/src/sdk/adapters/viewer-adapter.ts +5 -9
  474. package/src/sdk/adapters/visibility-adapter.ts +6 -9
  475. package/src/services/analysis-extensions.ts +125 -0
  476. package/src/services/app-navigation.ts +13 -0
  477. package/src/services/bsdd.ts +53 -4
  478. package/src/services/cacheService.ts +1 -1
  479. package/src/services/desktop-cache.ts +43 -0
  480. package/src/services/desktop-export.ts +77 -0
  481. package/src/services/desktop-harness.ts +196 -0
  482. package/src/services/desktop-logger.ts +20 -0
  483. package/src/services/desktop-native-metadata.ts +207 -0
  484. package/src/services/desktop-panel-actions.ts +43 -0
  485. package/src/services/desktop-preferences.ts +44 -0
  486. package/src/services/file-dialog.ts +147 -0
  487. package/src/services/tauri-core-stub.ts +7 -0
  488. package/src/services/tauri-dialog-stub.ts +7 -0
  489. package/src/services/tauri-fs-stub.ts +7 -0
  490. package/src/store/basketVisibleSet.ts +3 -4
  491. package/src/store/globalId.ts +79 -0
  492. package/src/store/index.ts +41 -2
  493. package/src/store/slices/cesiumSlice.ts +122 -0
  494. package/src/store/slices/chatSlice.ts +5 -1
  495. package/src/store/slices/dataSlice.ts +139 -28
  496. package/src/store/slices/desktopEntitlementSlice.ts +86 -0
  497. package/src/store/slices/loadingSlice.ts +14 -2
  498. package/src/store/slices/modelSlice.ts +58 -3
  499. package/src/store/slices/mutationSlice.ts +178 -0
  500. package/src/store/slices/pinboardSlice.ts +4 -8
  501. package/src/store/types.ts +96 -2
  502. package/src/store.ts +1 -1
  503. package/src/utils/desktopModelSnapshot.ts +358 -0
  504. package/src/utils/ifcConfig.ts +6 -1
  505. package/src/utils/nativeSpatialDataStore.ts +250 -0
  506. package/src/utils/serverDataModel.ts +4 -0
  507. package/src/utils/spatialHierarchy.ts +10 -11
  508. package/vite.config.ts +41 -0
  509. package/dist/assets/Arrow.dom-BhOg9lpn.js +0 -20
  510. package/dist/assets/arrow2_bg-BlXl-cSQ.js +0 -1
  511. package/dist/assets/basketViewActivator-BRG5DBmM.js +0 -1
  512. package/dist/assets/desktop-cache-oPzaWXYE.js +0 -1
  513. package/dist/assets/geometry.worker-kgiT_Qhh.js +0 -1
  514. package/dist/assets/ifc-lite_bg-FNRmpSvM.wasm +0 -0
  515. package/dist/assets/index-B1Ecw4AU.js +0 -189756
  516. package/dist/assets/index-Ba4eoTe7.css +0 -1
  517. package/dist/assets/index-CrgYBjTn.js +0 -229
  518. package/dist/assets/module-6F3E5H7Y-tx0BadV3.js +0 -6
  519. package/dist/assets/native-bridge-Crsb7TKz.js +0 -111
  520. package/dist/assets/wasm-bridge-mJUhb7uk.js +0 -1
@@ -18,11 +18,11 @@ import {
18
18
  Hash,
19
19
  Database,
20
20
  Building2,
21
- Globe,
22
21
  Ruler,
23
22
  } from 'lucide-react';
24
23
  import { ScrollArea } from '@/components/ui/scroll-area';
25
24
  import { PropertySetCard } from './PropertySetCard';
25
+ import { GeoreferencingPanel } from './GeoreferencingPanel';
26
26
  import type { PropertySet } from './encodingUtils';
27
27
  import type { FederatedModel } from '@/store/types';
28
28
  import { extractGeoreferencingOnDemand, extractLengthUnitScale, type IfcDataStore } from '@ifc-lite/parser';
@@ -147,7 +147,7 @@ export function ModelMetadataPanel({ model }: { model: FederatedModel }) {
147
147
  {formatDate(model.loadedAt)}
148
148
  </span>
149
149
  </div>
150
- {dataStore && (
150
+ {dataStore && dataStore.parseTime != null && (
151
151
  <div className="flex items-center gap-3 px-3 py-2">
152
152
  <Clock className="h-3.5 w-3.5 text-zinc-400 shrink-0" />
153
153
  <span className="text-xs text-zinc-500">Parse Time</span>
@@ -212,74 +212,7 @@ export function ModelMetadataPanel({ model }: { model: FederatedModel }) {
212
212
  </div>
213
213
 
214
214
  {/* Georeferencing */}
215
- {georef && (
216
- <div className="border-b border-zinc-200 dark:border-zinc-800">
217
- <div className="p-3 bg-teal-50/50 dark:bg-teal-950/20">
218
- <div className="flex items-center gap-2">
219
- <Globe className="h-3.5 w-3.5 text-teal-600 dark:text-teal-400" />
220
- <h4 className="font-bold text-xs uppercase tracking-wide text-teal-700 dark:text-teal-300">
221
- Georeferencing
222
- </h4>
223
- </div>
224
- </div>
225
- <div className="divide-y divide-zinc-100 dark:divide-zinc-900">
226
- {georef.projectedCRS?.name && (
227
- <div className="flex items-center gap-3 px-3 py-2">
228
- <span className="text-xs text-zinc-500 shrink-0">CRS</span>
229
- <span className="text-xs font-mono text-teal-700 dark:text-teal-400 ml-auto truncate max-w-[65%]">
230
- {georef.projectedCRS.name}
231
- </span>
232
- </div>
233
- )}
234
- {georef.projectedCRS?.geodeticDatum && (
235
- <div className="flex items-center gap-3 px-3 py-2">
236
- <span className="text-xs text-zinc-500 shrink-0">Geodetic Datum</span>
237
- <span className="text-xs font-mono text-teal-700 dark:text-teal-400 ml-auto">
238
- {georef.projectedCRS.geodeticDatum}
239
- </span>
240
- </div>
241
- )}
242
- {georef.projectedCRS?.mapProjection && (
243
- <div className="flex items-center gap-3 px-3 py-2">
244
- <span className="text-xs text-zinc-500 shrink-0">Projection</span>
245
- <span className="text-xs font-mono text-teal-700 dark:text-teal-400 ml-auto truncate max-w-[65%]">
246
- {georef.projectedCRS.mapProjection}
247
- </span>
248
- </div>
249
- )}
250
- {georef.mapConversion && (
251
- <>
252
- <div className="flex items-center gap-3 px-3 py-2">
253
- <span className="text-xs text-zinc-500 shrink-0">Eastings</span>
254
- <span className="text-xs font-mono text-teal-700 dark:text-teal-400 ml-auto tabular-nums">
255
- {georef.mapConversion.eastings.toFixed(3)}
256
- </span>
257
- </div>
258
- <div className="flex items-center gap-3 px-3 py-2">
259
- <span className="text-xs text-zinc-500 shrink-0">Northings</span>
260
- <span className="text-xs font-mono text-teal-700 dark:text-teal-400 ml-auto tabular-nums">
261
- {georef.mapConversion.northings.toFixed(3)}
262
- </span>
263
- </div>
264
- <div className="flex items-center gap-3 px-3 py-2">
265
- <span className="text-xs text-zinc-500 shrink-0">Height</span>
266
- <span className="text-xs font-mono text-teal-700 dark:text-teal-400 ml-auto tabular-nums">
267
- {georef.mapConversion.orthogonalHeight.toFixed(3)}
268
- </span>
269
- </div>
270
- {georef.mapConversion.scale != null && georef.mapConversion.scale !== 1.0 && (
271
- <div className="flex items-center gap-3 px-3 py-2">
272
- <span className="text-xs text-zinc-500 shrink-0">Scale</span>
273
- <span className="text-xs font-mono text-teal-700 dark:text-teal-400 ml-auto">
274
- {georef.mapConversion.scale}
275
- </span>
276
- </div>
277
- )}
278
- </>
279
- )}
280
- </div>
281
- </div>
282
- )}
215
+ <GeoreferencingPanel georef={georef} modelId={model.id} enableEditing schemaVersion={model.schemaVersion} coordinateInfo={model.geometryResult?.coordinateInfo} geometryResult={model.geometryResult} />
283
216
 
284
217
  {/* IfcProject Data */}
285
218
  {projectData && (
@@ -39,22 +39,23 @@ export async function handleSelectionClick(ctx: MouseHandlerContext, e: MouseEve
39
39
  const now = Date.now();
40
40
  const timeSinceLastClick = now - ctx.lastClickTimeRef.current;
41
41
  const clickPos = { x, y };
42
-
43
42
  if (ctx.lastClickPosRef.current &&
44
43
  timeSinceLastClick < 300 &&
45
44
  Math.abs(clickPos.x - ctx.lastClickPosRef.current.x) < 5 &&
46
45
  Math.abs(clickPos.y - ctx.lastClickPosRef.current.y) < 5) {
46
+ const pickOptions = ctx.getPickOptions();
47
47
  // Double-click - isolate element
48
48
  // Uses visibility filtering so only visible elements can be selected
49
- const pickResult = await renderer.pick(x, y, ctx.getPickOptions());
49
+ const pickResult = await renderer.pick(x, y, pickOptions);
50
50
  if (pickResult) {
51
51
  ctx.handlePickForSelection(pickResult);
52
52
  }
53
53
  ctx.lastClickTimeRef.current = 0;
54
54
  ctx.lastClickPosRef.current = null;
55
55
  } else {
56
+ const pickOptions = ctx.getPickOptions();
56
57
  // Single click - uses visibility filtering so only visible elements can be selected
57
- const pickResult = await renderer.pick(x, y, ctx.getPickOptions());
58
+ const pickResult = await renderer.pick(x, y, pickOptions);
58
59
 
59
60
  // Multi-selection with Ctrl/Cmd
60
61
  if (e.ctrlKey || e.metaKey) {
@@ -29,6 +29,8 @@ export interface UseAnimationLoopParams {
29
29
  lastFrameTimeRef: MutableRefObject<number>;
30
30
  mouseIsDraggingRef: MutableRefObject<boolean>;
31
31
  activeToolRef: MutableRefObject<string>;
32
+ /** When set, clips model below this Y value (terrain clipping for Cesium overlay). */
33
+ terrainClipYRef: MutableRefObject<number | null>;
32
34
  hiddenEntitiesRef: MutableRefObject<Set<number>>;
33
35
  isolatedEntitiesRef: MutableRefObject<Set<number> | null>;
34
36
  selectedEntityIdRef: MutableRefObject<number | null>;
@@ -62,6 +64,7 @@ export function useAnimationLoop(params: UseAnimationLoopParams): void {
62
64
  lastFrameTimeRef,
63
65
  mouseIsDraggingRef,
64
66
  activeToolRef,
67
+ terrainClipYRef,
65
68
  hiddenEntitiesRef,
66
69
  isolatedEntitiesRef,
67
70
  selectedEntityIdRef,
@@ -171,6 +174,7 @@ export function useAnimationLoop(params: UseAnimationLoopParams): void {
171
174
  min: sectionRangeRef.current?.min,
172
175
  max: sectionRangeRef.current?.max,
173
176
  } : undefined,
177
+ terrainClipY: terrainClipYRef.current ?? undefined,
174
178
  });
175
179
  lastRenderTime = currentTime;
176
180
  }
@@ -21,6 +21,7 @@
21
21
  import { useEffect, useRef, type MutableRefObject } from 'react';
22
22
  import type { Renderer } from '@ifc-lite/renderer';
23
23
  import type { MeshData, CoordinateInfo } from '@ifc-lite/geometry';
24
+ import { logToDesktopTerminal } from '@/services/desktop-logger';
24
25
 
25
26
  export interface UseGeometryStreamingParams {
26
27
  rendererRef: MutableRefObject<Renderer | null>;
@@ -37,6 +38,8 @@ export interface UseGeometryStreamingParams {
37
38
  clearPendingMeshColorUpdates: () => void;
38
39
  clearPendingColorUpdates: () => void;
39
40
  clearColorRef: MutableRefObject<[number, number, number, number]>;
41
+ releaseGeometryAfterFinalize?: boolean;
42
+ onGeometryReleased?: () => void;
40
43
  }
41
44
 
42
45
  // Default bounds used when geometry is cleared
@@ -47,6 +50,11 @@ const DEFAULT_BOUNDS = {
47
50
 
48
51
  const MAX_VALID_COORD = 10000;
49
52
 
53
+ function traceGeometrySync(message: string): void {
54
+ console.log(`[GeomSync] ${message}`);
55
+ void logToDesktopTerminal('info', `[GeomSync] ${message}`);
56
+ }
57
+
50
58
  export function useGeometryStreaming(params: UseGeometryStreamingParams): void {
51
59
  const {
52
60
  rendererRef,
@@ -61,6 +69,8 @@ export function useGeometryStreaming(params: UseGeometryStreamingParams): void {
61
69
  clearPendingMeshColorUpdates,
62
70
  clearPendingColorUpdates,
63
71
  clearColorRef,
72
+ releaseGeometryAfterFinalize = false,
73
+ onGeometryReleased,
64
74
  } = params;
65
75
 
66
76
  // ─── Tracking refs ───────────────────────────────────────────────────
@@ -71,6 +81,33 @@ export function useGeometryStreaming(params: UseGeometryStreamingParams): void {
71
81
  const finalBoundsRefittedRef = useRef(false);
72
82
  const cameraSnapshotRef = useRef<{ px: number; py: number; pz: number; tx: number; ty: number; tz: number } | null>(null);
73
83
  const prevIsStreamingRef = useRef(isStreaming);
84
+ const queuePumpTimerRef = useRef<ReturnType<typeof globalThis.setTimeout> | null>(null);
85
+
86
+ // Only activate the timer-based queue pump when the tab is background-throttled
87
+ // (rAF stops firing). In the foreground, the animation loop already drains the
88
+ // queue every frame — a parallel setTimeout(0) pump doubles the GPU work and
89
+ // hurts Chrome (Dawn) where each buffer op is an IPC round-trip.
90
+ const ensureQueuePump = () => {
91
+ if (queuePumpTimerRef.current !== null) return;
92
+ if (!globalThis.document?.hidden) return; // rAF is active — let the animation loop drain
93
+ queuePumpTimerRef.current = globalThis.setTimeout(() => {
94
+ queuePumpTimerRef.current = null;
95
+ const renderer = rendererRef.current;
96
+ if (!renderer || !isInitialized) return;
97
+ const device = renderer.getGPUDevice();
98
+ const pipeline = renderer.getPipeline();
99
+ const scene = renderer.getScene();
100
+ if (!device || !pipeline || !scene.hasQueuedMeshes()) return;
101
+ const flushed = scene.flushPending(device, pipeline);
102
+ if (flushed) {
103
+ renderer.clearCaches();
104
+ renderer.requestRender();
105
+ }
106
+ if (scene.hasQueuedMeshes()) {
107
+ ensureQueuePump();
108
+ }
109
+ }, 0);
110
+ };
74
111
 
75
112
  // ─── Main geometry effect ────────────────────────────────────────────
76
113
  // Runs on every geometry change (new file, incremental batch, visibility toggle).
@@ -81,6 +118,7 @@ export function useGeometryStreaming(params: UseGeometryStreamingParams): void {
81
118
  // Geometry cleared/null — reset so next load is fresh
82
119
  if (!geometry) {
83
120
  if (lastGeometryLengthRef.current > 0 || lastGeometryRef.current !== null) {
121
+ traceGeometrySync(`geometry cleared lastLength=${lastGeometryLengthRef.current}`);
84
122
  lastGeometryLengthRef.current = 0;
85
123
  lastGeometryRef.current = null;
86
124
  processedMeshIdsRef.current.clear();
@@ -121,7 +159,9 @@ export function useGeometryStreaming(params: UseGeometryStreamingParams): void {
121
159
  }
122
160
 
123
161
  if (isNewFile) {
162
+ traceGeometrySync(`new file currentLength=${currentLength} lastLength=${lastLength} releaseAfterFinalize=${releaseGeometryAfterFinalize}`);
124
163
  scene.clear();
164
+ scene.setEphemeralStreamingMode(releaseGeometryAfterFinalize);
125
165
  processedMeshIdsRef.current.clear();
126
166
  cameraFittedRef.current = false;
127
167
  finalBoundsRefittedRef.current = false;
@@ -132,14 +172,18 @@ export function useGeometryStreaming(params: UseGeometryStreamingParams): void {
132
172
  geometryBoundsRef.current = { ...DEFAULT_BOUNDS };
133
173
  } else if (!isIncremental && currentLength !== lastLength) {
134
174
  if (currentLength < lastLength) {
175
+ traceGeometrySync(`geometry rebuilt after shrink currentLength=${currentLength} lastLength=${lastLength}`);
135
176
  // Length decreased (model hidden) — rebuild scene, keep camera
136
177
  scene.clear();
178
+ scene.setEphemeralStreamingMode(releaseGeometryAfterFinalize);
137
179
  processedMeshIdsRef.current.clear();
138
180
  lastGeometryLengthRef.current = 0;
139
181
  lastGeometryRef.current = geometry;
140
182
  } else {
183
+ traceGeometrySync(`geometry rebuilt after replace currentLength=${currentLength} lastLength=${lastLength} releaseAfterFinalize=${releaseGeometryAfterFinalize}`);
141
184
  // New file while another was open — full reset
142
185
  scene.clear();
186
+ scene.setEphemeralStreamingMode(releaseGeometryAfterFinalize);
143
187
  processedMeshIdsRef.current.clear();
144
188
  cameraFittedRef.current = false;
145
189
  finalBoundsRefittedRef.current = false;
@@ -193,6 +237,10 @@ export function useGeometryStreaming(params: UseGeometryStreamingParams): void {
193
237
  if (isStreaming) {
194
238
  // Queue for the animation loop — zero GPU work here.
195
239
  scene.queueMeshes(newMeshes);
240
+ // Desktop benchmark windows can become background-throttled, which
241
+ // stalls requestAnimationFrame-based draining. Keep a timer-based
242
+ // pump active so large native loads still finish offscreen.
243
+ ensureQueuePump();
196
244
  } else {
197
245
  // Non-streaming: process immediately (visibility toggles, etc.)
198
246
  scene.appendToBatches(newMeshes, device, pipeline, false);
@@ -230,66 +278,105 @@ export function useGeometryStreaming(params: UseGeometryStreamingParams): void {
230
278
  renderer.requestRender();
231
279
  }, [geometry, geometryVersion, coordinateInfo, isInitialized, isStreaming]);
232
280
 
281
+ useEffect(() => {
282
+ return () => {
283
+ if (queuePumpTimerRef.current !== null) {
284
+ globalThis.clearTimeout(queuePumpTimerRef.current);
285
+ queuePumpTimerRef.current = null;
286
+ }
287
+ };
288
+ }, []);
289
+
233
290
  // ─── Streaming complete: finalize + bounds refit ─────────────────────
234
291
  useEffect(() => {
235
292
  const renderer = rendererRef.current;
236
293
  if (!renderer || !isInitialized) return;
237
294
 
238
295
  if (prevIsStreamingRef.current && !isStreaming) {
239
- // Flush any remaining queued meshes synchronously before finalize
240
- const device = renderer.getGPUDevice();
241
- const pipeline = renderer.getPipeline();
242
296
  const scene = renderer.getScene();
243
- if (device && pipeline && scene.hasQueuedMeshes()) {
244
- scene.flushPending(device, pipeline);
245
- }
246
-
297
+ traceGeometrySync(
298
+ `stream transition complete geometryLength=${geometry?.length ?? 0} queued=${scene.hasQueuedMeshes()} batches=${scene.getBatchedMeshes().length}`
299
+ );
247
300
  renderer.requestRender();
248
301
 
249
- // Defer heavy work so the browser processes pending input events first.
250
- // Streaming fragments keep rendering until proper batches replace them.
251
302
  const capturedGeometry = geometry;
252
- const timer = setTimeout(() => {
253
- const r = rendererRef.current;
254
- if (!r) return;
255
-
256
- console.log('[GeomStream] Streaming ended — starting finalize');
257
-
258
- // Compute exact bounds and refit camera (fast ~15ms scan)
259
- if (cameraFittedRef.current && !finalBoundsRefittedRef.current && capturedGeometry && capturedGeometry.length > 0) {
260
- const t0 = performance.now();
261
- const exactBounds = computeBounds(capturedGeometry);
262
- console.log(`[GeomStream] computeBounds: ${(performance.now() - t0).toFixed(0)}ms`);
263
- if (exactBounds) {
264
- if (!userMovedCamera(r, cameraSnapshotRef.current)) {
265
- r.getCamera().fitToBounds(exactBounds.min, exactBounds.max);
303
+ let timeoutId: ReturnType<typeof globalThis.setTimeout> | null = null;
304
+ let rafId: number | null = null;
305
+
306
+ const startFinalize = () => {
307
+ timeoutId = globalThis.setTimeout(() => {
308
+ const r = rendererRef.current;
309
+ if (!r) return;
310
+
311
+ console.log('[GeomStream] Streaming ended — starting finalize');
312
+ traceGeometrySync(
313
+ `finalize start geometryLength=${capturedGeometry?.length ?? 0} releaseAfterFinalize=${releaseGeometryAfterFinalize}`
314
+ );
315
+
316
+ // Compute exact bounds and refit camera (fast ~15ms scan)
317
+ if (cameraFittedRef.current && !finalBoundsRefittedRef.current && capturedGeometry && capturedGeometry.length > 0) {
318
+ const t0 = performance.now();
319
+ const exactBounds = computeBounds(capturedGeometry);
320
+ console.log(`[GeomStream] computeBounds: ${(performance.now() - t0).toFixed(0)}ms`);
321
+ if (exactBounds) {
322
+ if (!userMovedCamera(r, cameraSnapshotRef.current)) {
323
+ r.getCamera().fitToBounds(exactBounds.min, exactBounds.max);
324
+ }
325
+ geometryBoundsRef.current = exactBounds;
326
+ finalBoundsRefittedRef.current = true;
266
327
  }
267
- geometryBoundsRef.current = exactBounds;
268
- finalBoundsRefittedRef.current = true;
269
328
  }
270
- }
271
329
 
272
- // Time-sliced finalize: rebuild proper batches in ~8ms chunks
273
- const dev = r.getGPUDevice();
274
- const pipe = r.getPipeline();
275
- if (dev && pipe) {
276
- const t0 = performance.now();
277
- r.getScene().finalizeStreamingAsync(dev, pipe).then(() => {
278
- const batchCount = r.getScene().getBatchedMeshes().length;
279
- let totalIdx = 0;
280
- for (const b of r.getScene().getBatchedMeshes()) totalIdx += b.indexCount;
281
- console.log(`[GeomStream] finalizeStreamingAsync complete: ${(performance.now() - t0).toFixed(0)}ms → ${batchCount} consolidated batches, ${(totalIdx / 3 / 1e6).toFixed(1)}M triangles`);
330
+ // Time-sliced finalize: rebuild proper batches in ~8ms chunks
331
+ if (releaseGeometryAfterFinalize) {
332
+ r.getScene().finishEphemeralStreaming();
333
+ onGeometryReleased?.();
282
334
  r.clearCaches();
283
335
  r.requestRender();
284
- });
336
+ traceGeometrySync(`ephemeral finalize complete batches=${r.getScene().getBatchedMeshes().length}`);
337
+ return;
338
+ }
339
+
340
+ const dev = r.getGPUDevice();
341
+ const pipe = r.getPipeline();
342
+ if (dev && pipe) {
343
+ const t0 = performance.now();
344
+ r.getScene().finalizeStreamingAsync(dev, pipe).then(() => {
345
+ const batchCount = r.getScene().getBatchedMeshes().length;
346
+ let totalIdx = 0;
347
+ for (const b of r.getScene().getBatchedMeshes()) totalIdx += b.indexCount;
348
+ console.log(`[GeomStream] finalizeStreamingAsync complete: ${(performance.now() - t0).toFixed(0)}ms → ${batchCount} consolidated batches, ${(totalIdx / 3 / 1e6).toFixed(1)}M triangles`);
349
+ traceGeometrySync(
350
+ `finalize complete elapsed=${(performance.now() - t0).toFixed(0)}ms batches=${batchCount} queued=${r.getScene().hasQueuedMeshes()}`
351
+ );
352
+ r.clearCaches();
353
+ r.requestRender();
354
+ });
355
+ }
356
+ }, 0);
357
+ };
358
+
359
+ const waitForQueueDrain = () => {
360
+ const currentRenderer = rendererRef.current;
361
+ if (!currentRenderer) return;
362
+ if (!currentRenderer.getScene().hasQueuedMeshes()) {
363
+ startFinalize();
364
+ return;
285
365
  }
286
- }, 0);
366
+ currentRenderer.requestRender();
367
+ rafId = requestAnimationFrame(waitForQueueDrain);
368
+ };
369
+
370
+ waitForQueueDrain();
287
371
 
288
372
  prevIsStreamingRef.current = isStreaming;
289
- return () => clearTimeout(timer);
373
+ return () => {
374
+ if (timeoutId !== null) globalThis.clearTimeout(timeoutId);
375
+ if (rafId !== null) cancelAnimationFrame(rafId);
376
+ };
290
377
  }
291
378
  prevIsStreamingRef.current = isStreaming;
292
- }, [isStreaming, isInitialized]);
379
+ }, [isStreaming, isInitialized, releaseGeometryAfterFinalize, onGeometryReleased]);
293
380
 
294
381
  // ─── Mesh color updates (style/material deferred colors) ─────────────
295
382
  useEffect(() => {
@@ -129,6 +129,8 @@ export interface UseMouseControlsParams {
129
129
  RENDER_THROTTLE_MS_SMALL: number;
130
130
  RENDER_THROTTLE_MS_LARGE: number;
131
131
  RENDER_THROTTLE_MS_HUGE: number;
132
+ /** When true, wheel zoom uses unrestricted pure-dolly mode (Cesium) */
133
+ fastZoomRef: MutableRefObject<boolean>;
132
134
  }
133
135
 
134
136
  export function useMouseControls(params: UseMouseControlsParams): void {
@@ -476,7 +478,8 @@ export function useMouseControls(params: UseMouseControlsParams): void {
476
478
  const rect = canvas.getBoundingClientRect();
477
479
  const mouseX = e.clientX - rect.left;
478
480
  const mouseY = e.clientY - rect.top;
479
- camera.zoom(e.deltaY, false, mouseX, mouseY, canvas.width, canvas.height);
481
+ const fastZoom = e.shiftKey || params.fastZoomRef.current;
482
+ camera.zoom(e.deltaY, false, mouseX, mouseY, canvas.width, canvas.height, fastZoom);
480
483
 
481
484
  isInteractingRef.current = true;
482
485
  renderer.requestRender();
@@ -9,7 +9,9 @@
9
9
  * accounting for multi-model federation offsets and single-model fallback.
10
10
  */
11
11
 
12
- import type { FederatedModel, IfcDataStore } from '@/store/types';
12
+ import type { FederatedModel } from '@/store/types';
13
+ import type { IfcDataStore } from '@ifc-lite/parser';
14
+ import { fromGlobalIdFromModels, toGlobalIdFromModels } from '@/store/globalId';
13
15
 
14
16
  export interface IdLookupResult {
15
17
  expressId: number;
@@ -29,8 +31,10 @@ export function globalIdToExpressId(
29
31
  for (const [modelId, model] of models.entries()) {
30
32
  const localExpressId = model.ifcDataStore?.entities?.getExpressIdByGlobalId(globalIdString);
31
33
  if (localExpressId !== undefined && localExpressId > 0) {
32
- const offset = model.idOffset ?? 0;
33
- return { expressId: localExpressId + offset, modelId };
34
+ return {
35
+ expressId: toGlobalIdFromModels(models, modelId, localExpressId),
36
+ modelId,
37
+ };
34
38
  }
35
39
  }
36
40
  // Single-model fallback
@@ -52,14 +56,12 @@ export function expressIdToGlobalId(
52
56
  models: Map<string, FederatedModel>,
53
57
  ifcDataStore: IfcDataStore | null | undefined,
54
58
  ): string | null {
55
- // Multi-model path: search federated models
56
- for (const model of models.values()) {
57
- const offset = model.idOffset ?? 0;
58
- const localExpressId = expressId - offset;
59
- if (localExpressId > 0 && localExpressId <= (model.maxExpressId ?? Infinity)) {
60
- const globalIdString = model.ifcDataStore?.entities?.getGlobalId(localExpressId);
61
- if (globalIdString) return globalIdString;
62
- }
59
+ // Multi-model path: resolve through the centralized reverse conversion helper
60
+ const resolved = fromGlobalIdFromModels(models, expressId);
61
+ if (resolved && resolved.modelId !== 'legacy') {
62
+ const model = models.get(resolved.modelId);
63
+ const globalIdString = model?.ifcDataStore?.entities?.getGlobalId(resolved.expressId);
64
+ if (globalIdString) return globalIdString;
63
65
  }
64
66
  // Single-model fallback: use legacy ifcDataStore directly
65
67
  if (models.size === 0 && ifcDataStore?.entities) {
@@ -11,6 +11,7 @@
11
11
 
12
12
  import type { IDSValidationReport } from '@ifc-lite/ids';
13
13
  import type { GeometryResult } from '@ifc-lite/geometry';
14
+ import { toGlobalIdFromModels } from '../../store/globalId.js';
14
15
 
15
16
  /** RGBA color tuple in 0-1 range */
16
17
  export type ColorTuple = [number, number, number, number];
@@ -66,10 +67,7 @@ export function buildValidationColorUpdates(
66
67
  const globalIdsToUpdate = new Set<number>();
67
68
  for (const specResult of report.specificationResults) {
68
69
  for (const entityResult of specResult.entityResults) {
69
- const model = models.get(entityResult.modelId);
70
- const globalId = model
71
- ? entityResult.expressId + (model.idOffset ?? 0)
72
- : entityResult.expressId;
70
+ const globalId = toGlobalIdFromModels(models, entityResult.modelId, entityResult.expressId);
73
71
  globalIdsToUpdate.add(globalId);
74
72
  }
75
73
  }
@@ -86,10 +84,7 @@ export function buildValidationColorUpdates(
86
84
  // Process all entity results
87
85
  for (const specResult of report.specificationResults) {
88
86
  for (const entityResult of specResult.entityResults) {
89
- const model = models.get(entityResult.modelId);
90
- const globalId = model
91
- ? entityResult.expressId + (model.idOffset ?? 0)
92
- : entityResult.expressId;
87
+ const globalId = toGlobalIdFromModels(models, entityResult.modelId, entityResult.expressId);
93
88
 
94
89
  if (entityResult.passed && displayOptions.highlightPassed) {
95
90
  colorUpdates.set(globalId, passedClr);