@ifc-lite/viewer 1.17.3 → 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 (495) hide show
  1. package/.turbo/turbo-build.log +39 -30
  2. package/.turbo/turbo-typecheck.log +1 -1
  3. package/CHANGELOG.md +15 -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-D5-QWGO9.js → bcf-DOG9_WPX.js} +1 -1
  8. package/dist/assets/{browser-CKs-FY1P.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/{exporters-C_6J153K.js → exporters-ChAtBmlj.js} +2225 -1754
  12. package/dist/assets/geometry.worker-BQ0rzNo-.js +1 -0
  13. package/dist/assets/ifc-lite_bg-BX4E7TX8.wasm +0 -0
  14. package/dist/assets/{index-jhBr1wbn.js → index-Co8E2-FE.js} +28959 -24612
  15. package/dist/assets/index-DckuDqlv.css +1 -0
  16. package/dist/assets/{maplibre-gl-BpvwNKKy.js → maplibre-gl-CGLcoNXc.js} +1 -1
  17. package/dist/assets/native-bridge-BRvbckFQ.js +429 -0
  18. package/dist/assets/{sandbox-B79eavQ3.js → sandbox-DZiNLNMk.js} +5 -5
  19. package/dist/assets/{server-client-D3bUPJJc.js → server-client-BV8zHZ7Y.js} +4 -4
  20. package/dist/assets/tauri-core-stub-D8Fa-u43.js +1 -0
  21. package/dist/assets/tauri-dialog-stub-r7Wksg7o.js +1 -0
  22. package/dist/assets/tauri-fs-stub-BdeRC7aK.js +1 -0
  23. package/dist/assets/wasm-bridge-g01g7T9b.js +1 -0
  24. package/dist/assets/{zip-B-jFFAGa.js → zip-DBEtpeu6.js} +3 -3
  25. package/dist/cesium/Assets/IAU2006_XYS/IAU2006_XYS_0.json +1 -0
  26. package/dist/cesium/Assets/IAU2006_XYS/IAU2006_XYS_1.json +1 -0
  27. package/dist/cesium/Assets/IAU2006_XYS/IAU2006_XYS_10.json +1 -0
  28. package/dist/cesium/Assets/IAU2006_XYS/IAU2006_XYS_11.json +1 -0
  29. package/dist/cesium/Assets/IAU2006_XYS/IAU2006_XYS_12.json +1 -0
  30. package/dist/cesium/Assets/IAU2006_XYS/IAU2006_XYS_13.json +1 -0
  31. package/dist/cesium/Assets/IAU2006_XYS/IAU2006_XYS_14.json +1 -0
  32. package/dist/cesium/Assets/IAU2006_XYS/IAU2006_XYS_15.json +1 -0
  33. package/dist/cesium/Assets/IAU2006_XYS/IAU2006_XYS_16.json +1 -0
  34. package/dist/cesium/Assets/IAU2006_XYS/IAU2006_XYS_17.json +1 -0
  35. package/dist/cesium/Assets/IAU2006_XYS/IAU2006_XYS_18.json +1 -0
  36. package/dist/cesium/Assets/IAU2006_XYS/IAU2006_XYS_19.json +1 -0
  37. package/dist/cesium/Assets/IAU2006_XYS/IAU2006_XYS_2.json +1 -0
  38. package/dist/cesium/Assets/IAU2006_XYS/IAU2006_XYS_20.json +1 -0
  39. package/dist/cesium/Assets/IAU2006_XYS/IAU2006_XYS_21.json +1 -0
  40. package/dist/cesium/Assets/IAU2006_XYS/IAU2006_XYS_22.json +1 -0
  41. package/dist/cesium/Assets/IAU2006_XYS/IAU2006_XYS_23.json +1 -0
  42. package/dist/cesium/Assets/IAU2006_XYS/IAU2006_XYS_24.json +1 -0
  43. package/dist/cesium/Assets/IAU2006_XYS/IAU2006_XYS_25.json +1 -0
  44. package/dist/cesium/Assets/IAU2006_XYS/IAU2006_XYS_26.json +1 -0
  45. package/dist/cesium/Assets/IAU2006_XYS/IAU2006_XYS_27.json +1 -0
  46. package/dist/cesium/Assets/IAU2006_XYS/IAU2006_XYS_3.json +1 -0
  47. package/dist/cesium/Assets/IAU2006_XYS/IAU2006_XYS_4.json +1 -0
  48. package/dist/cesium/Assets/IAU2006_XYS/IAU2006_XYS_5.json +1 -0
  49. package/dist/cesium/Assets/IAU2006_XYS/IAU2006_XYS_6.json +1 -0
  50. package/dist/cesium/Assets/IAU2006_XYS/IAU2006_XYS_7.json +1 -0
  51. package/dist/cesium/Assets/IAU2006_XYS/IAU2006_XYS_8.json +1 -0
  52. package/dist/cesium/Assets/IAU2006_XYS/IAU2006_XYS_9.json +1 -0
  53. package/dist/cesium/Assets/Images/bing_maps_credit.png +0 -0
  54. package/dist/cesium/Assets/Images/cesium_credit.png +0 -0
  55. package/dist/cesium/Assets/Images/google_earth_credit.png +0 -0
  56. package/dist/cesium/Assets/Images/ion-credit.png +0 -0
  57. package/dist/cesium/Assets/Textures/LensFlare/DirtMask.jpg +0 -0
  58. package/dist/cesium/Assets/Textures/LensFlare/StarBurst.jpg +0 -0
  59. package/dist/cesium/Assets/Textures/NaturalEarthII/0/0/0.jpg +0 -0
  60. package/dist/cesium/Assets/Textures/NaturalEarthII/0/1/0.jpg +0 -0
  61. package/dist/cesium/Assets/Textures/NaturalEarthII/1/0/0.jpg +0 -0
  62. package/dist/cesium/Assets/Textures/NaturalEarthII/1/0/1.jpg +0 -0
  63. package/dist/cesium/Assets/Textures/NaturalEarthII/1/1/0.jpg +0 -0
  64. package/dist/cesium/Assets/Textures/NaturalEarthII/1/1/1.jpg +0 -0
  65. package/dist/cesium/Assets/Textures/NaturalEarthII/1/2/0.jpg +0 -0
  66. package/dist/cesium/Assets/Textures/NaturalEarthII/1/2/1.jpg +0 -0
  67. package/dist/cesium/Assets/Textures/NaturalEarthII/1/3/0.jpg +0 -0
  68. package/dist/cesium/Assets/Textures/NaturalEarthII/1/3/1.jpg +0 -0
  69. package/dist/cesium/Assets/Textures/NaturalEarthII/2/0/0.jpg +0 -0
  70. package/dist/cesium/Assets/Textures/NaturalEarthII/2/0/1.jpg +0 -0
  71. package/dist/cesium/Assets/Textures/NaturalEarthII/2/0/2.jpg +0 -0
  72. package/dist/cesium/Assets/Textures/NaturalEarthII/2/0/3.jpg +0 -0
  73. package/dist/cesium/Assets/Textures/NaturalEarthII/2/1/0.jpg +0 -0
  74. package/dist/cesium/Assets/Textures/NaturalEarthII/2/1/1.jpg +0 -0
  75. package/dist/cesium/Assets/Textures/NaturalEarthII/2/1/2.jpg +0 -0
  76. package/dist/cesium/Assets/Textures/NaturalEarthII/2/1/3.jpg +0 -0
  77. package/dist/cesium/Assets/Textures/NaturalEarthII/2/2/0.jpg +0 -0
  78. package/dist/cesium/Assets/Textures/NaturalEarthII/2/2/1.jpg +0 -0
  79. package/dist/cesium/Assets/Textures/NaturalEarthII/2/2/2.jpg +0 -0
  80. package/dist/cesium/Assets/Textures/NaturalEarthII/2/2/3.jpg +0 -0
  81. package/dist/cesium/Assets/Textures/NaturalEarthII/2/3/0.jpg +0 -0
  82. package/dist/cesium/Assets/Textures/NaturalEarthII/2/3/1.jpg +0 -0
  83. package/dist/cesium/Assets/Textures/NaturalEarthII/2/3/2.jpg +0 -0
  84. package/dist/cesium/Assets/Textures/NaturalEarthII/2/3/3.jpg +0 -0
  85. package/dist/cesium/Assets/Textures/NaturalEarthII/2/4/0.jpg +0 -0
  86. package/dist/cesium/Assets/Textures/NaturalEarthII/2/4/1.jpg +0 -0
  87. package/dist/cesium/Assets/Textures/NaturalEarthII/2/4/2.jpg +0 -0
  88. package/dist/cesium/Assets/Textures/NaturalEarthII/2/4/3.jpg +0 -0
  89. package/dist/cesium/Assets/Textures/NaturalEarthII/2/5/0.jpg +0 -0
  90. package/dist/cesium/Assets/Textures/NaturalEarthII/2/5/1.jpg +0 -0
  91. package/dist/cesium/Assets/Textures/NaturalEarthII/2/5/2.jpg +0 -0
  92. package/dist/cesium/Assets/Textures/NaturalEarthII/2/5/3.jpg +0 -0
  93. package/dist/cesium/Assets/Textures/NaturalEarthII/2/6/0.jpg +0 -0
  94. package/dist/cesium/Assets/Textures/NaturalEarthII/2/6/1.jpg +0 -0
  95. package/dist/cesium/Assets/Textures/NaturalEarthII/2/6/2.jpg +0 -0
  96. package/dist/cesium/Assets/Textures/NaturalEarthII/2/6/3.jpg +0 -0
  97. package/dist/cesium/Assets/Textures/NaturalEarthII/2/7/0.jpg +0 -0
  98. package/dist/cesium/Assets/Textures/NaturalEarthII/2/7/1.jpg +0 -0
  99. package/dist/cesium/Assets/Textures/NaturalEarthII/2/7/2.jpg +0 -0
  100. package/dist/cesium/Assets/Textures/NaturalEarthII/2/7/3.jpg +0 -0
  101. package/dist/cesium/Assets/Textures/NaturalEarthII/tilemapresource.xml +14 -0
  102. package/dist/cesium/Assets/Textures/SkyBox/tycho2t3_80_mx.jpg +0 -0
  103. package/dist/cesium/Assets/Textures/SkyBox/tycho2t3_80_my.jpg +0 -0
  104. package/dist/cesium/Assets/Textures/SkyBox/tycho2t3_80_mz.jpg +0 -0
  105. package/dist/cesium/Assets/Textures/SkyBox/tycho2t3_80_px.jpg +0 -0
  106. package/dist/cesium/Assets/Textures/SkyBox/tycho2t3_80_py.jpg +0 -0
  107. package/dist/cesium/Assets/Textures/SkyBox/tycho2t3_80_pz.jpg +0 -0
  108. package/dist/cesium/Assets/Textures/maki/airfield.png +0 -0
  109. package/dist/cesium/Assets/Textures/maki/airport.png +0 -0
  110. package/dist/cesium/Assets/Textures/maki/alcohol-shop.png +0 -0
  111. package/dist/cesium/Assets/Textures/maki/america-football.png +0 -0
  112. package/dist/cesium/Assets/Textures/maki/art-gallery.png +0 -0
  113. package/dist/cesium/Assets/Textures/maki/bakery.png +0 -0
  114. package/dist/cesium/Assets/Textures/maki/bank.png +0 -0
  115. package/dist/cesium/Assets/Textures/maki/bar.png +0 -0
  116. package/dist/cesium/Assets/Textures/maki/baseball.png +0 -0
  117. package/dist/cesium/Assets/Textures/maki/basketball.png +0 -0
  118. package/dist/cesium/Assets/Textures/maki/beer.png +0 -0
  119. package/dist/cesium/Assets/Textures/maki/bicycle.png +0 -0
  120. package/dist/cesium/Assets/Textures/maki/building.png +0 -0
  121. package/dist/cesium/Assets/Textures/maki/bus.png +0 -0
  122. package/dist/cesium/Assets/Textures/maki/cafe.png +0 -0
  123. package/dist/cesium/Assets/Textures/maki/camera.png +0 -0
  124. package/dist/cesium/Assets/Textures/maki/campsite.png +0 -0
  125. package/dist/cesium/Assets/Textures/maki/car.png +0 -0
  126. package/dist/cesium/Assets/Textures/maki/cemetery.png +0 -0
  127. package/dist/cesium/Assets/Textures/maki/cesium.png +0 -0
  128. package/dist/cesium/Assets/Textures/maki/chemist.png +0 -0
  129. package/dist/cesium/Assets/Textures/maki/cinema.png +0 -0
  130. package/dist/cesium/Assets/Textures/maki/circle-stroked.png +0 -0
  131. package/dist/cesium/Assets/Textures/maki/circle.png +0 -0
  132. package/dist/cesium/Assets/Textures/maki/city.png +0 -0
  133. package/dist/cesium/Assets/Textures/maki/clothing-store.png +0 -0
  134. package/dist/cesium/Assets/Textures/maki/college.png +0 -0
  135. package/dist/cesium/Assets/Textures/maki/commercial.png +0 -0
  136. package/dist/cesium/Assets/Textures/maki/cricket.png +0 -0
  137. package/dist/cesium/Assets/Textures/maki/cross.png +0 -0
  138. package/dist/cesium/Assets/Textures/maki/dam.png +0 -0
  139. package/dist/cesium/Assets/Textures/maki/danger.png +0 -0
  140. package/dist/cesium/Assets/Textures/maki/disability.png +0 -0
  141. package/dist/cesium/Assets/Textures/maki/dog-park.png +0 -0
  142. package/dist/cesium/Assets/Textures/maki/embassy.png +0 -0
  143. package/dist/cesium/Assets/Textures/maki/emergency-telephone.png +0 -0
  144. package/dist/cesium/Assets/Textures/maki/entrance.png +0 -0
  145. package/dist/cesium/Assets/Textures/maki/farm.png +0 -0
  146. package/dist/cesium/Assets/Textures/maki/fast-food.png +0 -0
  147. package/dist/cesium/Assets/Textures/maki/ferry.png +0 -0
  148. package/dist/cesium/Assets/Textures/maki/fire-station.png +0 -0
  149. package/dist/cesium/Assets/Textures/maki/fuel.png +0 -0
  150. package/dist/cesium/Assets/Textures/maki/garden.png +0 -0
  151. package/dist/cesium/Assets/Textures/maki/gift.png +0 -0
  152. package/dist/cesium/Assets/Textures/maki/golf.png +0 -0
  153. package/dist/cesium/Assets/Textures/maki/grocery.png +0 -0
  154. package/dist/cesium/Assets/Textures/maki/hairdresser.png +0 -0
  155. package/dist/cesium/Assets/Textures/maki/harbor.png +0 -0
  156. package/dist/cesium/Assets/Textures/maki/heart.png +0 -0
  157. package/dist/cesium/Assets/Textures/maki/heliport.png +0 -0
  158. package/dist/cesium/Assets/Textures/maki/hospital.png +0 -0
  159. package/dist/cesium/Assets/Textures/maki/ice-cream.png +0 -0
  160. package/dist/cesium/Assets/Textures/maki/industrial.png +0 -0
  161. package/dist/cesium/Assets/Textures/maki/land-use.png +0 -0
  162. package/dist/cesium/Assets/Textures/maki/laundry.png +0 -0
  163. package/dist/cesium/Assets/Textures/maki/library.png +0 -0
  164. package/dist/cesium/Assets/Textures/maki/lighthouse.png +0 -0
  165. package/dist/cesium/Assets/Textures/maki/lodging.png +0 -0
  166. package/dist/cesium/Assets/Textures/maki/logging.png +0 -0
  167. package/dist/cesium/Assets/Textures/maki/london-underground.png +0 -0
  168. package/dist/cesium/Assets/Textures/maki/marker-stroked.png +0 -0
  169. package/dist/cesium/Assets/Textures/maki/marker.png +0 -0
  170. package/dist/cesium/Assets/Textures/maki/minefield.png +0 -0
  171. package/dist/cesium/Assets/Textures/maki/mobilephone.png +0 -0
  172. package/dist/cesium/Assets/Textures/maki/monument.png +0 -0
  173. package/dist/cesium/Assets/Textures/maki/museum.png +0 -0
  174. package/dist/cesium/Assets/Textures/maki/music.png +0 -0
  175. package/dist/cesium/Assets/Textures/maki/oil-well.png +0 -0
  176. package/dist/cesium/Assets/Textures/maki/park.png +0 -0
  177. package/dist/cesium/Assets/Textures/maki/park2.png +0 -0
  178. package/dist/cesium/Assets/Textures/maki/parking-garage.png +0 -0
  179. package/dist/cesium/Assets/Textures/maki/parking.png +0 -0
  180. package/dist/cesium/Assets/Textures/maki/pharmacy.png +0 -0
  181. package/dist/cesium/Assets/Textures/maki/pitch.png +0 -0
  182. package/dist/cesium/Assets/Textures/maki/place-of-worship.png +0 -0
  183. package/dist/cesium/Assets/Textures/maki/playground.png +0 -0
  184. package/dist/cesium/Assets/Textures/maki/police.png +0 -0
  185. package/dist/cesium/Assets/Textures/maki/polling-place.png +0 -0
  186. package/dist/cesium/Assets/Textures/maki/post.png +0 -0
  187. package/dist/cesium/Assets/Textures/maki/prison.png +0 -0
  188. package/dist/cesium/Assets/Textures/maki/rail-above.png +0 -0
  189. package/dist/cesium/Assets/Textures/maki/rail-light.png +0 -0
  190. package/dist/cesium/Assets/Textures/maki/rail-metro.png +0 -0
  191. package/dist/cesium/Assets/Textures/maki/rail-underground.png +0 -0
  192. package/dist/cesium/Assets/Textures/maki/rail.png +0 -0
  193. package/dist/cesium/Assets/Textures/maki/religious-christian.png +0 -0
  194. package/dist/cesium/Assets/Textures/maki/religious-jewish.png +0 -0
  195. package/dist/cesium/Assets/Textures/maki/religious-muslim.png +0 -0
  196. package/dist/cesium/Assets/Textures/maki/restaurant.png +0 -0
  197. package/dist/cesium/Assets/Textures/maki/roadblock.png +0 -0
  198. package/dist/cesium/Assets/Textures/maki/rocket.png +0 -0
  199. package/dist/cesium/Assets/Textures/maki/school.png +0 -0
  200. package/dist/cesium/Assets/Textures/maki/scooter.png +0 -0
  201. package/dist/cesium/Assets/Textures/maki/shop.png +0 -0
  202. package/dist/cesium/Assets/Textures/maki/skiing.png +0 -0
  203. package/dist/cesium/Assets/Textures/maki/slaughterhouse.png +0 -0
  204. package/dist/cesium/Assets/Textures/maki/soccer.png +0 -0
  205. package/dist/cesium/Assets/Textures/maki/square-stroked.png +0 -0
  206. package/dist/cesium/Assets/Textures/maki/square.png +0 -0
  207. package/dist/cesium/Assets/Textures/maki/star-stroked.png +0 -0
  208. package/dist/cesium/Assets/Textures/maki/star.png +0 -0
  209. package/dist/cesium/Assets/Textures/maki/suitcase.png +0 -0
  210. package/dist/cesium/Assets/Textures/maki/swimming.png +0 -0
  211. package/dist/cesium/Assets/Textures/maki/telephone.png +0 -0
  212. package/dist/cesium/Assets/Textures/maki/tennis.png +0 -0
  213. package/dist/cesium/Assets/Textures/maki/theatre.png +0 -0
  214. package/dist/cesium/Assets/Textures/maki/toilets.png +0 -0
  215. package/dist/cesium/Assets/Textures/maki/town-hall.png +0 -0
  216. package/dist/cesium/Assets/Textures/maki/town.png +0 -0
  217. package/dist/cesium/Assets/Textures/maki/triangle-stroked.png +0 -0
  218. package/dist/cesium/Assets/Textures/maki/triangle.png +0 -0
  219. package/dist/cesium/Assets/Textures/maki/village.png +0 -0
  220. package/dist/cesium/Assets/Textures/maki/warehouse.png +0 -0
  221. package/dist/cesium/Assets/Textures/maki/waste-basket.png +0 -0
  222. package/dist/cesium/Assets/Textures/maki/water.png +0 -0
  223. package/dist/cesium/Assets/Textures/maki/wetland.png +0 -0
  224. package/dist/cesium/Assets/Textures/maki/zoo.png +0 -0
  225. package/dist/cesium/Assets/Textures/moonSmall.jpg +0 -0
  226. package/dist/cesium/Assets/Textures/pin.svg +1 -0
  227. package/dist/cesium/Assets/Textures/waterNormals.jpg +0 -0
  228. package/dist/cesium/Assets/Textures/waterNormalsSmall.jpg +0 -0
  229. package/dist/cesium/Assets/approximateTerrainHeights.json +1 -0
  230. package/dist/cesium/ThirdParty/Workers/package.json +1 -0
  231. package/dist/cesium/ThirdParty/Workers/zip-web-worker.js +1 -0
  232. package/dist/cesium/ThirdParty/basis_transcoder.wasm +0 -0
  233. package/dist/cesium/ThirdParty/draco_decoder.wasm +0 -0
  234. package/dist/cesium/ThirdParty/google-earth-dbroot-parser.js +1 -0
  235. package/dist/cesium/ThirdParty/wasm_splats_bg.wasm +0 -0
  236. package/dist/cesium/ThirdParty/zip-module.wasm +0 -0
  237. package/dist/cesium/Widgets/Animation/Animation.css +127 -0
  238. package/dist/cesium/Widgets/Animation/lighter.css +70 -0
  239. package/dist/cesium/Widgets/BaseLayerPicker/BaseLayerPicker.css +108 -0
  240. package/dist/cesium/Widgets/BaseLayerPicker/lighter.css +22 -0
  241. package/dist/cesium/Widgets/Cesium3DTilesInspector/Cesium3DTilesInspector.css +102 -0
  242. package/dist/cesium/Widgets/CesiumInspector/CesiumInspector.css +113 -0
  243. package/dist/cesium/Widgets/CesiumWidget/CesiumWidget.css +119 -0
  244. package/dist/cesium/Widgets/CesiumWidget/lighter.css +14 -0
  245. package/dist/cesium/Widgets/FullscreenButton/FullscreenButton.css +8 -0
  246. package/dist/cesium/Widgets/Geocoder/Geocoder.css +70 -0
  247. package/dist/cesium/Widgets/Geocoder/lighter.css +17 -0
  248. package/dist/cesium/Widgets/I3SBuildingSceneLayerExplorer/I3SBuildingSceneLayerExplorer.css +27 -0
  249. package/dist/cesium/Widgets/Images/ImageryProviders/ArcGisMapServiceWorldHillshade.png +0 -0
  250. package/dist/cesium/Widgets/Images/ImageryProviders/ArcGisMapServiceWorldImagery.png +0 -0
  251. package/dist/cesium/Widgets/Images/ImageryProviders/ArcGisMapServiceWorldOcean.png +0 -0
  252. package/dist/cesium/Widgets/Images/ImageryProviders/azureAerial.png +0 -0
  253. package/dist/cesium/Widgets/Images/ImageryProviders/azureRoads.png +0 -0
  254. package/dist/cesium/Widgets/Images/ImageryProviders/bingAerial.png +0 -0
  255. package/dist/cesium/Widgets/Images/ImageryProviders/bingAerialLabels.png +0 -0
  256. package/dist/cesium/Widgets/Images/ImageryProviders/bingRoads.png +0 -0
  257. package/dist/cesium/Widgets/Images/ImageryProviders/blueMarble.png +0 -0
  258. package/dist/cesium/Widgets/Images/ImageryProviders/earthAtNight.png +0 -0
  259. package/dist/cesium/Widgets/Images/ImageryProviders/googleContour.png +0 -0
  260. package/dist/cesium/Widgets/Images/ImageryProviders/googleRoadmap.png +0 -0
  261. package/dist/cesium/Widgets/Images/ImageryProviders/googleSatellite.png +0 -0
  262. package/dist/cesium/Widgets/Images/ImageryProviders/googleSatelliteLabels.png +0 -0
  263. package/dist/cesium/Widgets/Images/ImageryProviders/mapQuestOpenStreetMap.png +0 -0
  264. package/dist/cesium/Widgets/Images/ImageryProviders/mapboxSatellite.png +0 -0
  265. package/dist/cesium/Widgets/Images/ImageryProviders/mapboxStreets.png +0 -0
  266. package/dist/cesium/Widgets/Images/ImageryProviders/mapboxTerrain.png +0 -0
  267. package/dist/cesium/Widgets/Images/ImageryProviders/naturalEarthII.png +0 -0
  268. package/dist/cesium/Widgets/Images/ImageryProviders/openStreetMap.png +0 -0
  269. package/dist/cesium/Widgets/Images/ImageryProviders/sentinel-2.png +0 -0
  270. package/dist/cesium/Widgets/Images/ImageryProviders/stadiaAlidadeSmooth.png +0 -0
  271. package/dist/cesium/Widgets/Images/ImageryProviders/stadiaAlidadeSmoothDark.png +0 -0
  272. package/dist/cesium/Widgets/Images/ImageryProviders/stamenToner.png +0 -0
  273. package/dist/cesium/Widgets/Images/ImageryProviders/stamenWatercolor.png +0 -0
  274. package/dist/cesium/Widgets/Images/NavigationHelp/Mouse.svg +84 -0
  275. package/dist/cesium/Widgets/Images/NavigationHelp/MouseLeft.svg +76 -0
  276. package/dist/cesium/Widgets/Images/NavigationHelp/MouseMiddle.svg +76 -0
  277. package/dist/cesium/Widgets/Images/NavigationHelp/MouseRight.svg +76 -0
  278. package/dist/cesium/Widgets/Images/NavigationHelp/Touch.svg +120 -0
  279. package/dist/cesium/Widgets/Images/NavigationHelp/TouchDrag.svg +129 -0
  280. package/dist/cesium/Widgets/Images/NavigationHelp/TouchRotate.svg +76 -0
  281. package/dist/cesium/Widgets/Images/NavigationHelp/TouchTilt.svg +135 -0
  282. package/dist/cesium/Widgets/Images/NavigationHelp/TouchZoom.svg +74 -0
  283. package/dist/cesium/Widgets/Images/TerrainProviders/CesiumWorldTerrain.png +0 -0
  284. package/dist/cesium/Widgets/Images/TerrainProviders/Ellipsoid.png +0 -0
  285. package/dist/cesium/Widgets/Images/TimelineIcons.png +0 -0
  286. package/dist/cesium/Widgets/Images/info-loading.gif +0 -0
  287. package/dist/cesium/Widgets/InfoBox/InfoBox.css +92 -0
  288. package/dist/cesium/Widgets/InfoBox/InfoBoxDescription.css +178 -0
  289. package/dist/cesium/Widgets/NavigationHelpButton/NavigationHelpButton.css +93 -0
  290. package/dist/cesium/Widgets/NavigationHelpButton/lighter.css +38 -0
  291. package/dist/cesium/Widgets/PerformanceWatchdog/PerformanceWatchdog.css +15 -0
  292. package/dist/cesium/Widgets/ProjectionPicker/ProjectionPicker.css +38 -0
  293. package/dist/cesium/Widgets/SceneModePicker/SceneModePicker.css +56 -0
  294. package/dist/cesium/Widgets/SelectionIndicator/SelectionIndicator.css +20 -0
  295. package/dist/cesium/Widgets/Timeline/Timeline.css +103 -0
  296. package/dist/cesium/Widgets/Timeline/lighter.css +23 -0
  297. package/dist/cesium/Widgets/VRButton/VRButton.css +8 -0
  298. package/dist/cesium/Widgets/Viewer/Viewer.css +107 -0
  299. package/dist/cesium/Widgets/VoxelInspector/VoxelInspector.css +16 -0
  300. package/dist/cesium/Widgets/lighter.css +237 -0
  301. package/dist/cesium/Widgets/lighterShared.css +46 -0
  302. package/dist/cesium/Widgets/shared.css +103 -0
  303. package/dist/cesium/Widgets/widgets.css +1342 -0
  304. package/dist/cesium/Workers/chunk-23ZQ2IVV.js +29 -0
  305. package/dist/cesium/Workers/chunk-2EQO3Q56.js +26 -0
  306. package/dist/cesium/Workers/chunk-2MJIIVP4.js +26 -0
  307. package/dist/cesium/Workers/chunk-2TE5NTVD.js +26 -0
  308. package/dist/cesium/Workers/chunk-2ZBHLJST.js +26 -0
  309. package/dist/cesium/Workers/chunk-5TJMAQVL.js +26 -0
  310. package/dist/cesium/Workers/chunk-6BD4U3VO.js +26 -0
  311. package/dist/cesium/Workers/chunk-7TVGLKQF.js +26 -0
  312. package/dist/cesium/Workers/chunk-BTSYJ5XU.js +26 -0
  313. package/dist/cesium/Workers/chunk-BXMEEOCS.js +63 -0
  314. package/dist/cesium/Workers/chunk-BYLCY7GP.js +29 -0
  315. package/dist/cesium/Workers/chunk-CTHM3W6I.js +26 -0
  316. package/dist/cesium/Workers/chunk-CUUSNIVQ.js +26 -0
  317. package/dist/cesium/Workers/chunk-E3JOOS3S.js +26 -0
  318. package/dist/cesium/Workers/chunk-E7KYDCM5.js +26 -0
  319. package/dist/cesium/Workers/chunk-EDVBB7SS.js +27 -0
  320. package/dist/cesium/Workers/chunk-EFBN7QNX.js +26 -0
  321. package/dist/cesium/Workers/chunk-EQ4YRVWL.js +26 -0
  322. package/dist/cesium/Workers/chunk-F6PRE7D6.js +26 -0
  323. package/dist/cesium/Workers/chunk-FC4ZZ65J.js +26 -0
  324. package/dist/cesium/Workers/chunk-FFBVWF2L.js +26 -0
  325. package/dist/cesium/Workers/chunk-GBAA6GVX.js +26 -0
  326. package/dist/cesium/Workers/chunk-ICALLYLG.js +26 -0
  327. package/dist/cesium/Workers/chunk-ILRYTWTP.js +26 -0
  328. package/dist/cesium/Workers/chunk-IRNLBSEJ.js +26 -0
  329. package/dist/cesium/Workers/chunk-IX4VMHEV.js +26 -0
  330. package/dist/cesium/Workers/chunk-L6QHHACZ.js +26 -0
  331. package/dist/cesium/Workers/chunk-LI2ZSORM.js +26 -0
  332. package/dist/cesium/Workers/chunk-LSLE2RL4.js +26 -0
  333. package/dist/cesium/Workers/chunk-M4HLDBCG.js +26 -0
  334. package/dist/cesium/Workers/chunk-MJHHSGEH.js +26 -0
  335. package/dist/cesium/Workers/chunk-NMVKML6W.js +26 -0
  336. package/dist/cesium/Workers/chunk-OCWJRAXS.js +26 -0
  337. package/dist/cesium/Workers/chunk-OIRKANTH.js +26 -0
  338. package/dist/cesium/Workers/chunk-OIT7J4IC.js +26 -0
  339. package/dist/cesium/Workers/chunk-OLZ3FYUM.js +26 -0
  340. package/dist/cesium/Workers/chunk-Q5BPHJQF.js +26 -0
  341. package/dist/cesium/Workers/chunk-QFM5DCMQ.js +26 -0
  342. package/dist/cesium/Workers/chunk-QKUIYMGC.js +28 -0
  343. package/dist/cesium/Workers/chunk-S44JILQT.js +26 -0
  344. package/dist/cesium/Workers/chunk-SLT4J352.js +26 -0
  345. package/dist/cesium/Workers/chunk-SQMIIXB7.js +26 -0
  346. package/dist/cesium/Workers/chunk-TJ4XLGBQ.js +26 -0
  347. package/dist/cesium/Workers/chunk-TNSUQXWK.js +27 -0
  348. package/dist/cesium/Workers/chunk-UBOGZS7F.js +26 -0
  349. package/dist/cesium/Workers/chunk-V3OSTMM6.js +26 -0
  350. package/dist/cesium/Workers/chunk-V7QEYVP3.js +26 -0
  351. package/dist/cesium/Workers/chunk-VUKYSU4H.js +26 -0
  352. package/dist/cesium/Workers/chunk-W37FE5GR.js +26 -0
  353. package/dist/cesium/Workers/chunk-WBOV35NL.js +26 -0
  354. package/dist/cesium/Workers/chunk-WPMZLB3Y.js +26 -0
  355. package/dist/cesium/Workers/chunk-WWWZVEEH.js +26 -0
  356. package/dist/cesium/Workers/chunk-XFIQ5DEQ.js +28 -0
  357. package/dist/cesium/Workers/chunk-XQHLGIO7.js +26 -0
  358. package/dist/cesium/Workers/chunk-XUSCFAVF.js +26 -0
  359. package/dist/cesium/Workers/chunk-YP7I5QBZ.js +26 -0
  360. package/dist/cesium/Workers/chunk-Z3QF2EHT.js +26 -0
  361. package/dist/cesium/Workers/combineGeometry.js +26 -0
  362. package/dist/cesium/Workers/createBoxGeometry.js +26 -0
  363. package/dist/cesium/Workers/createBoxOutlineGeometry.js +26 -0
  364. package/dist/cesium/Workers/createCircleGeometry.js +26 -0
  365. package/dist/cesium/Workers/createCircleOutlineGeometry.js +26 -0
  366. package/dist/cesium/Workers/createCoplanarPolygonGeometry.js +26 -0
  367. package/dist/cesium/Workers/createCoplanarPolygonOutlineGeometry.js +26 -0
  368. package/dist/cesium/Workers/createCorridorGeometry.js +26 -0
  369. package/dist/cesium/Workers/createCorridorOutlineGeometry.js +26 -0
  370. package/dist/cesium/Workers/createCylinderGeometry.js +26 -0
  371. package/dist/cesium/Workers/createCylinderOutlineGeometry.js +26 -0
  372. package/dist/cesium/Workers/createEllipseGeometry.js +26 -0
  373. package/dist/cesium/Workers/createEllipseOutlineGeometry.js +26 -0
  374. package/dist/cesium/Workers/createEllipsoidGeometry.js +26 -0
  375. package/dist/cesium/Workers/createEllipsoidOutlineGeometry.js +26 -0
  376. package/dist/cesium/Workers/createFrustumGeometry.js +26 -0
  377. package/dist/cesium/Workers/createFrustumOutlineGeometry.js +26 -0
  378. package/dist/cesium/Workers/createGeometry.js +26 -0
  379. package/dist/cesium/Workers/createGroundPolylineGeometry.js +26 -0
  380. package/dist/cesium/Workers/createPlaneGeometry.js +26 -0
  381. package/dist/cesium/Workers/createPlaneOutlineGeometry.js +26 -0
  382. package/dist/cesium/Workers/createPolygonGeometry.js +26 -0
  383. package/dist/cesium/Workers/createPolygonOutlineGeometry.js +26 -0
  384. package/dist/cesium/Workers/createPolylineGeometry.js +26 -0
  385. package/dist/cesium/Workers/createPolylineVolumeGeometry.js +26 -0
  386. package/dist/cesium/Workers/createPolylineVolumeOutlineGeometry.js +26 -0
  387. package/dist/cesium/Workers/createRectangleGeometry.js +26 -0
  388. package/dist/cesium/Workers/createRectangleOutlineGeometry.js +26 -0
  389. package/dist/cesium/Workers/createSimplePolylineGeometry.js +26 -0
  390. package/dist/cesium/Workers/createSphereGeometry.js +26 -0
  391. package/dist/cesium/Workers/createSphereOutlineGeometry.js +26 -0
  392. package/dist/cesium/Workers/createTaskProcessorWorker.js +26 -0
  393. package/dist/cesium/Workers/createVectorTileClampedPolylines.js +26 -0
  394. package/dist/cesium/Workers/createVectorTileGeometries.js +26 -0
  395. package/dist/cesium/Workers/createVectorTilePoints.js +26 -0
  396. package/dist/cesium/Workers/createVectorTilePolygons.js +26 -0
  397. package/dist/cesium/Workers/createVectorTilePolylines.js +26 -0
  398. package/dist/cesium/Workers/createVerticesFromCesium3DTilesTerrain.js +26 -0
  399. package/dist/cesium/Workers/createVerticesFromGoogleEarthEnterpriseBuffer.js +26 -0
  400. package/dist/cesium/Workers/createVerticesFromHeightmap.js +26 -0
  401. package/dist/cesium/Workers/createVerticesFromQuantizedTerrainMesh.js +26 -0
  402. package/dist/cesium/Workers/createWallGeometry.js +26 -0
  403. package/dist/cesium/Workers/createWallOutlineGeometry.js +26 -0
  404. package/dist/cesium/Workers/decodeDraco.js +26 -0
  405. package/dist/cesium/Workers/decodeGoogleEarthEnterprisePacket.js +26 -0
  406. package/dist/cesium/Workers/decodeI3S.js +26 -0
  407. package/dist/cesium/Workers/gaussianSplatSorter.js +26 -0
  408. package/dist/cesium/Workers/gaussianSplatTextureGenerator.js +26 -0
  409. package/dist/cesium/Workers/incrementallyBuildTerrainPicker.js +26 -0
  410. package/dist/cesium/Workers/transcodeKTX2.js +56 -0
  411. package/dist/cesium/Workers/transferTypedArrayTest.js +26 -0
  412. package/dist/cesium/Workers/upsampleQuantizedTerrainMesh.js +26 -0
  413. package/dist/cesium/Workers/upsampleVerticesFromCesium3DTilesTerrain.js +26 -0
  414. package/dist/index.html +10 -8
  415. package/package.json +15 -12
  416. package/src/App.tsx +1 -17
  417. package/src/components/viewer/BCFPanel.tsx +46 -4
  418. package/src/components/viewer/CesiumOverlay.tsx +672 -0
  419. package/src/components/viewer/CesiumSettingsDialog.tsx +100 -0
  420. package/src/components/viewer/ChatPanel.tsx +54 -16
  421. package/src/components/viewer/CommandPalette.tsx +6 -1
  422. package/src/components/viewer/DesktopEntitlementBanner.tsx +74 -0
  423. package/src/components/viewer/ExportChangesButton.tsx +6 -1
  424. package/src/components/viewer/ExportDialog.tsx +22 -6
  425. package/src/components/viewer/HierarchyPanel.tsx +196 -0
  426. package/src/components/viewer/IDSPanel.tsx +52 -3
  427. package/src/components/viewer/KeyboardShortcutsDialog.tsx +1 -1
  428. package/src/components/viewer/MainToolbar.tsx +353 -27
  429. package/src/components/viewer/PropertiesPanel.tsx +218 -79
  430. package/src/components/viewer/ScriptPanel.tsx +34 -8
  431. package/src/components/viewer/SettingsPage.tsx +430 -0
  432. package/src/components/viewer/StatusBar.tsx +17 -1
  433. package/src/components/viewer/UpgradePage.tsx +6 -4
  434. package/src/components/viewer/ViewerLayout.tsx +47 -6
  435. package/src/components/viewer/Viewport.tsx +49 -8
  436. package/src/components/viewer/ViewportContainer.tsx +280 -28
  437. package/src/components/viewer/ViewportOverlays.tsx +129 -27
  438. package/src/components/viewer/properties/GeoreferencingPanel.tsx +117 -5
  439. package/src/components/viewer/properties/LocationMap.tsx +458 -17
  440. package/src/components/viewer/selectionHandlers.ts +4 -3
  441. package/src/components/viewer/useAnimationLoop.ts +4 -0
  442. package/src/components/viewer/useGeometryStreaming.ts +127 -40
  443. package/src/components/viewer/useMouseControls.ts +4 -1
  444. package/src/hooks/ingest/viewerModelIngest.ts +275 -0
  445. package/src/hooks/useIDS.ts +1 -1
  446. package/src/hooks/useIfc.ts +7 -1
  447. package/src/hooks/useIfcCache.ts +28 -15
  448. package/src/hooks/useIfcFederation.ts +57 -225
  449. package/src/hooks/useIfcLoader.ts +1656 -130
  450. package/src/hooks/useIfcServer.ts +0 -69
  451. package/src/lib/desktop/ClerkDesktopEntitlementSync.tsx +175 -0
  452. package/src/lib/desktop/desktopEntitlementEvents.ts +39 -0
  453. package/src/lib/desktop-entitlement.ts +45 -0
  454. package/src/lib/desktop-product.ts +124 -0
  455. package/src/lib/geo/cesium-bridge.ts +310 -0
  456. package/src/lib/geo/reproject.ts +151 -25
  457. package/src/lib/recent-files.ts +2 -1
  458. package/src/services/analysis-extensions.ts +125 -0
  459. package/src/services/app-navigation.ts +13 -0
  460. package/src/services/bsdd.ts +53 -4
  461. package/src/services/cacheService.ts +1 -1
  462. package/src/services/desktop-cache.ts +43 -0
  463. package/src/services/desktop-export.ts +77 -0
  464. package/src/services/desktop-harness.ts +196 -0
  465. package/src/services/desktop-logger.ts +20 -0
  466. package/src/services/desktop-native-metadata.ts +207 -0
  467. package/src/services/desktop-panel-actions.ts +43 -0
  468. package/src/services/desktop-preferences.ts +44 -0
  469. package/src/services/file-dialog.ts +147 -0
  470. package/src/services/tauri-core-stub.ts +7 -0
  471. package/src/services/tauri-dialog-stub.ts +7 -0
  472. package/src/services/tauri-fs-stub.ts +7 -0
  473. package/src/store/index.ts +40 -2
  474. package/src/store/slices/cesiumSlice.ts +122 -0
  475. package/src/store/slices/chatSlice.ts +5 -1
  476. package/src/store/slices/dataSlice.ts +139 -28
  477. package/src/store/slices/desktopEntitlementSlice.ts +86 -0
  478. package/src/store/slices/loadingSlice.ts +14 -2
  479. package/src/store/slices/modelSlice.ts +58 -3
  480. package/src/store/types.ts +96 -2
  481. package/src/store.ts +1 -1
  482. package/src/utils/desktopModelSnapshot.ts +358 -0
  483. package/src/utils/ifcConfig.ts +6 -1
  484. package/src/utils/nativeSpatialDataStore.ts +250 -0
  485. package/src/utils/serverDataModel.ts +4 -0
  486. package/src/utils/spatialHierarchy.ts +10 -11
  487. package/vite.config.ts +24 -0
  488. package/dist/assets/arrow-DJf2ErbF.js +0 -20
  489. package/dist/assets/basketViewActivator-aojwdomq.js +0 -1
  490. package/dist/assets/desktop-cache-oPzaWXYE.js +0 -1
  491. package/dist/assets/geometry.worker-Nz9_YIqh.js +0 -1
  492. package/dist/assets/ifc-lite_bg-eSkBTizQ.wasm +0 -0
  493. package/dist/assets/index-pbE7itQS.css +0 -1
  494. package/dist/assets/native-bridge-DSIyEYXG.js +0 -113
  495. package/dist/assets/wasm-bridge-B0J07fZZ.js +0 -1
@@ -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();
@@ -0,0 +1,275 @@
1
+ /* This Source Code Form is subject to the terms of the Mozilla Public
2
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
3
+ * file, You can obtain one at https://mozilla.org/MPL/2.0/. */
4
+
5
+ import { IfcParser, parseIfcx, type IfcDataStore } from '@ifc-lite/parser';
6
+ import { GeometryProcessor, GeometryQuality, type CoordinateInfo, type GeometryResult, type MeshData } from '@ifc-lite/geometry';
7
+ import { loadGLBToMeshData } from '@ifc-lite/cache';
8
+ import type { SchemaVersion } from '../../store/types.js';
9
+ import { calculateMeshBounds, calculateStoreyHeights, createCoordinateInfo, normalizeColor } from '../../utils/localParsingUtils.js';
10
+
11
+ type RgbaColor = [number, number, number, number];
12
+
13
+ interface RawIfcxMesh {
14
+ expressId?: number;
15
+ express_id?: number;
16
+ id?: number;
17
+ positions: Float32Array | number[];
18
+ indices: Uint32Array | number[];
19
+ normals: Float32Array | number[];
20
+ color?: [number, number, number, number] | [number, number, number];
21
+ ifcType?: string;
22
+ ifc_type?: string;
23
+ }
24
+
25
+ export interface ViewerModelPayload {
26
+ dataStore: IfcDataStore;
27
+ geometryResult: GeometryResult;
28
+ schemaVersion: SchemaVersion;
29
+ }
30
+
31
+ export interface StepBatchEvent {
32
+ batchIndex: number;
33
+ estimatedTotal: number;
34
+ totalSoFar: number;
35
+ meshes: MeshData[];
36
+ coordinateInfo?: CoordinateInfo | null;
37
+ }
38
+
39
+ export interface StepRtcOffsetEvent {
40
+ rtcOffset: { x: number; y: number; z: number };
41
+ }
42
+
43
+ export interface StepBufferIngestOptions {
44
+ fileName: string;
45
+ buffer: ArrayBuffer;
46
+ fileSizeMB: number;
47
+ getDynamicBatchSize: (fileSizeMB: number) => number | { initial: number; subsequent: number };
48
+ onProgress?: (progress: { phase: string; percent: number }) => void;
49
+ onBatch?: (event: StepBatchEvent) => void;
50
+ onColorUpdate?: (updates: Map<number, RgbaColor>) => void;
51
+ onSpatialReady?: (dataStore: IfcDataStore) => void;
52
+ onRtcOffset?: (event: StepRtcOffsetEvent) => void;
53
+ shouldAbort?: () => boolean;
54
+ }
55
+
56
+ export interface StepBufferIngestResult extends ViewerModelPayload {
57
+ allMeshes: MeshData[];
58
+ cumulativeColorUpdates: Map<number, RgbaColor>;
59
+ }
60
+
61
+ export function convertIfcxMeshes(rawMeshes: RawIfcxMesh[]): MeshData[] {
62
+ return rawMeshes.map((mesh) => {
63
+ const positions = mesh.positions instanceof Float32Array ? mesh.positions : new Float32Array(mesh.positions || []);
64
+ const indices = mesh.indices instanceof Uint32Array ? mesh.indices : new Uint32Array(mesh.indices || []);
65
+ const normals = mesh.normals instanceof Float32Array ? mesh.normals : new Float32Array(mesh.normals || []);
66
+
67
+ return {
68
+ expressId: mesh.expressId ?? mesh.express_id ?? mesh.id ?? 0,
69
+ positions,
70
+ indices,
71
+ normals,
72
+ color: normalizeColor(mesh.color),
73
+ ifcType: mesh.ifcType ?? mesh.ifc_type ?? 'IfcProduct',
74
+ };
75
+ }).filter((mesh) => mesh.positions.length > 0 && mesh.indices.length > 0);
76
+ }
77
+
78
+ export function createMinimalGlbDataStore(buffer: ArrayBuffer, meshCount: number): IfcDataStore {
79
+ return {
80
+ fileSize: buffer.byteLength,
81
+ schemaVersion: 'IFC4' as const,
82
+ entityCount: meshCount,
83
+ parseTime: 0,
84
+ source: new Uint8Array(0),
85
+ entityIndex: { byId: new Map(), byType: new Map() },
86
+ strings: { getString: () => undefined, getStringId: () => undefined, count: 0 } as unknown as IfcDataStore['strings'],
87
+ entities: { count: 0, getId: () => 0, getType: () => 0, getName: () => undefined, getGlobalId: () => undefined } as unknown as IfcDataStore['entities'],
88
+ properties: { count: 0, getPropertiesForEntity: () => [], getPropertySetForEntity: () => [] } as unknown as IfcDataStore['properties'],
89
+ quantities: { count: 0, getQuantitiesForEntity: () => [] } as unknown as IfcDataStore['quantities'],
90
+ relationships: { count: 0, getRelationships: () => [], getRelated: () => [] } as unknown as IfcDataStore['relationships'],
91
+ spatialHierarchy: null as unknown as IfcDataStore['spatialHierarchy'],
92
+ } as unknown as IfcDataStore;
93
+ }
94
+
95
+ export function normalizeDataStoreStoreys(dataStore: IfcDataStore): IfcDataStore {
96
+ if (dataStore.spatialHierarchy && dataStore.spatialHierarchy.storeyHeights.size === 0 && dataStore.spatialHierarchy.storeyElevations.size > 1) {
97
+ const calculatedHeights = calculateStoreyHeights(dataStore.spatialHierarchy.storeyElevations);
98
+ for (const [storeyId, height] of calculatedHeights) {
99
+ dataStore.spatialHierarchy.storeyHeights.set(storeyId, height);
100
+ }
101
+ }
102
+ return dataStore;
103
+ }
104
+
105
+ export function getMaxExpressId(dataStore: IfcDataStore, meshes: MeshData[]): number {
106
+ const maxExpressIdFromMeshes = meshes.reduce((max, mesh) => Math.max(max, mesh.expressId), 0);
107
+ let maxExpressIdFromEntities = 0;
108
+ if (dataStore.entityIndex?.byId) {
109
+ for (const key of dataStore.entityIndex.byId.keys()) {
110
+ if (key > maxExpressIdFromEntities) {
111
+ maxExpressIdFromEntities = key;
112
+ }
113
+ }
114
+ }
115
+ return Math.max(maxExpressIdFromMeshes, maxExpressIdFromEntities);
116
+ }
117
+
118
+ export async function parseIfcxViewerModel(
119
+ buffer: ArrayBuffer,
120
+ onProgress?: (progress: { phase: string; percent: number }) => void,
121
+ ): Promise<ViewerModelPayload> {
122
+ const ifcxResult = await parseIfcx(buffer, {
123
+ onProgress: (progress) => {
124
+ onProgress?.({
125
+ phase: `IFCX ${progress.phase}`,
126
+ percent: 10 + (progress.percent * 0.8),
127
+ });
128
+ },
129
+ });
130
+
131
+ const meshes = convertIfcxMeshes(ifcxResult.meshes);
132
+ if (meshes.length === 0 && ifcxResult.entityCount > 0) {
133
+ throw new Error('overlay-only-ifcx');
134
+ }
135
+
136
+ const { bounds, stats } = calculateMeshBounds(meshes);
137
+ return {
138
+ dataStore: {
139
+ fileSize: ifcxResult.fileSize,
140
+ schemaVersion: 'IFC5' as const,
141
+ entityCount: ifcxResult.entityCount,
142
+ parseTime: ifcxResult.parseTime,
143
+ source: new Uint8Array(buffer),
144
+ entityIndex: { byId: new Map(), byType: new Map() },
145
+ strings: ifcxResult.strings,
146
+ entities: ifcxResult.entities,
147
+ properties: ifcxResult.properties,
148
+ quantities: ifcxResult.quantities,
149
+ relationships: ifcxResult.relationships,
150
+ spatialHierarchy: ifcxResult.spatialHierarchy,
151
+ } as unknown as IfcDataStore,
152
+ geometryResult: {
153
+ meshes,
154
+ totalVertices: stats.totalVertices,
155
+ totalTriangles: stats.totalTriangles,
156
+ coordinateInfo: createCoordinateInfo(bounds),
157
+ },
158
+ schemaVersion: 'IFC5',
159
+ };
160
+ }
161
+
162
+ export async function parseGlbViewerModel(buffer: ArrayBuffer): Promise<ViewerModelPayload> {
163
+ const meshes = loadGLBToMeshData(new Uint8Array(buffer));
164
+ if (meshes.length === 0) {
165
+ throw new Error('glb-empty');
166
+ }
167
+
168
+ const { bounds, stats } = calculateMeshBounds(meshes);
169
+ return {
170
+ dataStore: createMinimalGlbDataStore(buffer, meshes.length),
171
+ geometryResult: {
172
+ meshes,
173
+ totalVertices: stats.totalVertices,
174
+ totalTriangles: stats.totalTriangles,
175
+ coordinateInfo: createCoordinateInfo(bounds),
176
+ },
177
+ schemaVersion: 'IFC4',
178
+ };
179
+ }
180
+
181
+ export async function parseStepBufferViewerModel(options: StepBufferIngestOptions): Promise<StepBufferIngestResult> {
182
+ const geometryProcessor = new GeometryProcessor({ quality: GeometryQuality.Balanced });
183
+ await geometryProcessor.init();
184
+
185
+ const parser = new IfcParser();
186
+ const wasmApi = geometryProcessor.getApi();
187
+ const allMeshes: MeshData[] = [];
188
+ const cumulativeColorUpdates = new Map<number, RgbaColor>();
189
+ let finalCoordinateInfo: CoordinateInfo | null = null;
190
+ let batchIndex = 0;
191
+ let estimatedTotal = 0;
192
+ let capturedRtcOffset: { x: number; y: number; z: number } | null = null;
193
+
194
+ const dataStorePromise = parser.parseColumnar(options.buffer, {
195
+ wasmApi,
196
+ onSpatialReady: (partialStore) => {
197
+ if (options.shouldAbort?.()) {
198
+ return;
199
+ }
200
+ options.onSpatialReady?.(normalizeDataStoreStoreys(partialStore));
201
+ },
202
+ });
203
+
204
+ for await (const event of geometryProcessor.processAdaptive(new Uint8Array(options.buffer), {
205
+ sizeThreshold: 2 * 1024 * 1024,
206
+ batchSize: options.getDynamicBatchSize(options.fileSizeMB),
207
+ })) {
208
+ if (options.shouldAbort?.()) {
209
+ break;
210
+ }
211
+ switch (event.type) {
212
+ case 'start':
213
+ estimatedTotal = event.totalEstimate;
214
+ break;
215
+ case 'colorUpdate':
216
+ for (const [expressId, color] of event.updates) {
217
+ cumulativeColorUpdates.set(expressId, color);
218
+ }
219
+ options.onColorUpdate?.(event.updates);
220
+ break;
221
+ case 'rtcOffset':
222
+ if (event.hasRtc) {
223
+ capturedRtcOffset = event.rtcOffset;
224
+ options.onRtcOffset?.({ rtcOffset: event.rtcOffset });
225
+ }
226
+ break;
227
+ case 'batch':
228
+ batchIndex += 1;
229
+ for (let i = 0; i < event.meshes.length; i++) {
230
+ allMeshes.push(event.meshes[i]);
231
+ }
232
+ finalCoordinateInfo = event.coordinateInfo ?? null;
233
+ options.onBatch?.({
234
+ batchIndex,
235
+ estimatedTotal,
236
+ totalSoFar: event.totalSoFar,
237
+ meshes: event.meshes,
238
+ coordinateInfo: event.coordinateInfo ?? null,
239
+ });
240
+ options.onProgress?.({
241
+ phase: `Processing geometry (${event.totalSoFar} meshes)`,
242
+ percent: 10 + Math.min(80, (allMeshes.length / 1000) * 0.8),
243
+ });
244
+ break;
245
+ case 'complete':
246
+ finalCoordinateInfo = event.coordinateInfo ?? null;
247
+ break;
248
+ }
249
+ }
250
+
251
+ const dataStore = normalizeDataStoreStoreys(await dataStorePromise);
252
+ if (!finalCoordinateInfo) {
253
+ finalCoordinateInfo = createCoordinateInfo(calculateMeshBounds(allMeshes).bounds);
254
+ }
255
+ if (capturedRtcOffset) {
256
+ finalCoordinateInfo.wasmRtcOffset = capturedRtcOffset;
257
+ }
258
+
259
+ return {
260
+ dataStore,
261
+ geometryResult: {
262
+ meshes: allMeshes,
263
+ totalVertices: allMeshes.reduce((sum, mesh) => sum + mesh.positions.length / 3, 0),
264
+ totalTriangles: allMeshes.reduce((sum, mesh) => sum + mesh.indices.length / 3, 0),
265
+ coordinateInfo: finalCoordinateInfo,
266
+ },
267
+ schemaVersion: dataStore.schemaVersion === 'IFC4X3'
268
+ ? 'IFC4X3'
269
+ : dataStore.schemaVersion === 'IFC4'
270
+ ? 'IFC4'
271
+ : 'IFC2X3',
272
+ allMeshes,
273
+ cumulativeColorUpdates,
274
+ };
275
+ }
@@ -793,7 +793,7 @@ export function useIDS(options: UseIDSOptions = {}): UseIDSResult {
793
793
  const url = URL.createObjectURL(blob);
794
794
  const a = globalThis.document.createElement('a');
795
795
  a.href = url;
796
- a.download = `ids-report-${new Date().toISOString().split('T')[0]}.bcf`;
796
+ a.download = `ids-report-${new Date().toISOString().split('T')[0]}.bcfzip`;
797
797
  a.click();
798
798
  URL.revokeObjectURL(url);
799
799
 
@@ -14,7 +14,7 @@
14
14
 
15
15
  import { useMemo, useRef } from 'react';
16
16
  import { useShallow } from 'zustand/react/shallow';
17
- import { useViewerStore } from '../store.js';
17
+ import { useViewerStore } from '@/store';
18
18
  import { IfcQuery } from '@ifc-lite/query';
19
19
  import type { IfcDataStore } from '@ifc-lite/parser';
20
20
 
@@ -26,6 +26,8 @@ export function useIfc() {
26
26
  const {
27
27
  loading,
28
28
  progress,
29
+ geometryProgress,
30
+ metadataProgress,
29
31
  error,
30
32
  ifcDataStore,
31
33
  geometryResult,
@@ -45,6 +47,8 @@ export function useIfc() {
45
47
  } = useViewerStore(useShallow((s) => ({
46
48
  loading: s.loading,
47
49
  progress: s.progress,
50
+ geometryProgress: s.geometryProgress,
51
+ metadataProgress: s.metadataProgress,
48
52
  error: s.error,
49
53
  ifcDataStore: s.ifcDataStore,
50
54
  geometryResult: s.geometryResult,
@@ -94,6 +98,8 @@ export function useIfc() {
94
98
  // Legacy single-model API (backward compatibility)
95
99
  loading,
96
100
  progress,
101
+ geometryProgress,
102
+ metadataProgress,
97
103
  error,
98
104
  ifcDataStore,
99
105
  geometryResult,