viral-viewer-2 7.4.9 → 7.6.1

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 (90) hide show
  1. package/LICENSE +12 -12
  2. package/dist/{batched-mesh-simplifier-v3jwcYIo.mjs → batched-mesh-simplifier-ChPz5s7Z.mjs} +1 -1
  3. package/dist/components/animation/viral-animation.d.ts +24 -8
  4. package/dist/components/camera/viral-camera.d.ts +8 -1
  5. package/dist/components/custom-objects/viral-batched-mesh-v3.d.ts +7 -0
  6. package/dist/components/custom-objects/viral-batched-mesh.d.ts +4 -1
  7. package/dist/components/custom-objects/viral-bim-world.d.ts +9 -0
  8. package/dist/components/custom-objects/viral-bim.model.d.ts +2 -0
  9. package/dist/components/custom-objects/viral-instanced-mesh-v2.d.ts +22 -0
  10. package/dist/components/data-manager/ifc-property-mapper.d.ts +38 -0
  11. package/dist/components/data-manager/ifc-spatial-tree.d.ts +13 -0
  12. package/dist/components/data-manager/viral-data-manager.d.ts +58 -2
  13. package/dist/components/duplication-analyzer/draw-call-rebalancer.d.ts +50 -0
  14. package/dist/components/editor/block/editor-block.d.ts +27 -0
  15. package/dist/components/editor/block/profile-edit-tool.d.ts +55 -0
  16. package/dist/components/editor/building-removal-tool.d.ts +29 -0
  17. package/dist/components/editor/catalog/catalog-data.d.ts +2 -0
  18. package/dist/components/editor/catalog/catalog-types.d.ts +15 -0
  19. package/dist/components/editor/commands/add-object-command.d.ts +11 -0
  20. package/dist/components/editor/commands/delete-object-command.d.ts +11 -0
  21. package/dist/components/editor/commands/editor-command-history.d.ts +13 -0
  22. package/dist/components/editor/commands/editor-command.d.ts +5 -0
  23. package/dist/components/editor/commands/transform-command.d.ts +18 -0
  24. package/dist/components/editor/editor-object.d.ts +42 -0
  25. package/dist/components/editor/hover/editor-hover-feedback.d.ts +28 -0
  26. package/dist/components/editor/library-panel/editor-library-panel.d.ts +22 -0
  27. package/dist/components/editor/persistence/editor-persistence-types.d.ts +21 -0
  28. package/dist/components/editor/persistence/editor-persistence.d.ts +12 -0
  29. package/dist/components/editor/persistence/editor-serializer.d.ts +3 -0
  30. package/dist/components/editor/placement/area-placement-tool.d.ts +54 -0
  31. package/dist/components/editor/placement/line-placement-tool.d.ts +41 -0
  32. package/dist/components/editor/placement/placement-preview.d.ts +3 -0
  33. package/dist/components/editor/placement/point-placement-tool.d.ts +29 -0
  34. package/dist/components/editor/placement/snap-utils.d.ts +4 -0
  35. package/dist/components/editor/placement/terrain-raycast.d.ts +6 -0
  36. package/dist/components/editor/snapping/editor-snap.d.ts +11 -0
  37. package/dist/components/editor/upload/editor-drag-drop.d.ts +17 -0
  38. package/dist/components/editor/upload/upload-service.d.ts +18 -0
  39. package/dist/components/editor/viral-editor-input.d.ts +28 -0
  40. package/dist/components/editor/viral-editor.d.ts +110 -0
  41. package/dist/components/landscape/coord-converter.d.ts +35 -0
  42. package/dist/components/landscape/coord-converter.test.d.ts +1 -0
  43. package/dist/components/landscape/elevation-fetcher.d.ts +40 -0
  44. package/dist/components/landscape/elevation-fetcher.test.d.ts +1 -0
  45. package/dist/components/landscape/free-landscape-provider.d.ts +5 -0
  46. package/dist/components/landscape/landscape-generator.script.d.ts +42 -0
  47. package/dist/components/landscape/landscape-generator.script.test.d.ts +1 -0
  48. package/dist/components/landscape/landscape-generator.worker.d.ts +32 -0
  49. package/dist/components/landscape/landscape-mesh-builder.d.ts +9 -0
  50. package/dist/components/landscape/landscape-mesh-builder.test.d.ts +1 -0
  51. package/dist/components/landscape/landscape-provider.d.ts +16 -0
  52. package/dist/components/landscape/landscape-types.d.ts +74 -0
  53. package/dist/components/landscape/mapbox-landscape-provider.d.ts +16 -0
  54. package/dist/components/landscape/mvt-fetcher.d.ts +15 -0
  55. package/dist/components/landscape/osm-fetcher.d.ts +12 -0
  56. package/dist/components/landscape/osm-fetcher.test.d.ts +1 -0
  57. package/dist/components/landscape/terrain-style.d.ts +26 -0
  58. package/dist/components/landscape/traffic-overlay.d.ts +3 -0
  59. package/dist/components/loader/viral-ifc.loader.d.ts +25 -0
  60. package/dist/components/loader/viral-revit.loader.d.ts +4 -0
  61. package/dist/components/loader/viral.loader.d.ts +6 -0
  62. package/dist/components/material/viral-material-manager.d.ts +5 -0
  63. package/dist/components/post-processing/post-processing-renderer.d.ts +5 -0
  64. package/dist/components/renderer/viral-renderer.d.ts +7 -0
  65. package/dist/components/telemetry/performance-metrics.d.ts +46 -0
  66. package/dist/components/visibility-manager/day-night-simulator.d.ts +18 -0
  67. package/dist/components/visibility-manager/viral-visibility-manager.d.ts +10 -0
  68. package/dist/components/worker/load-batched-element.worker.d.ts +25 -2
  69. package/dist/components/worker-script/load-ifc-element.worker.d.ts +1 -0
  70. package/dist/entities/event.d.ts +7 -1
  71. package/dist/entities/viewer-option.d.ts +14 -1
  72. package/dist/gui/draggable-modal/viral-draggable-modal.d.ts +2 -0
  73. package/dist/gui/landscape-layer-panel/landscape-layer-panel.d.ts +33 -0
  74. package/dist/gui/map-picker/map-picker-modal.d.ts +86 -0
  75. package/dist/gui/tools/tools/viral-tool-editor.d.ts +8 -0
  76. package/dist/gui/tools/tools/viral-tool-landscape.d.ts +8 -0
  77. package/dist/gui/tools/viral-tools.d.ts +4 -0
  78. package/dist/index-BYebJWDv.mjs +74425 -0
  79. package/dist/index.mjs +53 -50
  80. package/dist/types.d.ts +7 -0
  81. package/dist/utils/cooperative.d.ts +12 -0
  82. package/dist/utils/cooperative.test.d.ts +1 -0
  83. package/dist/utils/transferable.d.ts +9 -0
  84. package/dist/utils/transferable.test.d.ts +1 -0
  85. package/dist/viral-viewer-api.d.ts +17 -2
  86. package/dist/web-ifc-mt.wasm +0 -0
  87. package/dist/web-ifc-node.wasm +0 -0
  88. package/dist/web-ifc.wasm +0 -0
  89. package/package.json +56 -50
  90. package/dist/index-Ca3N1MMc.mjs +0 -60317
package/LICENSE CHANGED
@@ -1,13 +1,13 @@
1
- Viralution Viewer License
2
- Copyright (c) 2025, Viralution
3
- All rights reserved.
4
-
5
- NOTICE: NO RIGHTS GRANTED
6
-
7
- No permission is granted to any individual, organization, or entity to use, copy, modify, sublicense, merge, publish, distribute, sell, or otherwise exploit this software in any form, in whole or in part.
8
-
9
- THE SOFTWARE IS PROVIDED "AS IS," WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, AND NONINFRINGEMENT.
10
-
11
- IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES, OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT, OR OTHERWISE, ARISING FROM, OUT OF, OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
12
-
1
+ Viralution Viewer License
2
+ Copyright (c) 2025, Viralution
3
+ All rights reserved.
4
+
5
+ NOTICE: NO RIGHTS GRANTED
6
+
7
+ No permission is granted to any individual, organization, or entity to use, copy, modify, sublicense, merge, publish, distribute, sell, or otherwise exploit this software in any form, in whole or in part.
8
+
9
+ THE SOFTWARE IS PROVIDED "AS IS," WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, AND NONINFRINGEMENT.
10
+
11
+ IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES, OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT, OR OTHERWISE, ARISING FROM, OUT OF, OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
12
+
13
13
  ANY VIOLATION OF THIS LICENSE MAY RESULT IN LEGAL ACTION.
@@ -1,4 +1,4 @@
1
- import { B as S, a as V, V as Z } from "./index-Ca3N1MMc.mjs";
1
+ import { B as S, a as V, V as Z } from "./index-BYebJWDv.mjs";
2
2
  (function() {
3
3
  var s = "b9H79Tebbbe9ok9Geueu9Geub9Gbb9Gruuuuuuueu9Gvuuuuueu9Gduueu9Gluuuueu9Gvuuuuub9Gouuuuuub9Gluuuub9GiuuueuiE8AdilveoveovrrwrrrDDoDrbqqbelve9Weiiviebeoweuec;G:Qdkr:PlCo9TW9T9VV95dbH9F9F939H79T9F9J9H229F9Jt9VV7bb8F9TW79O9V9Wt9FW9U9J9V9KW9wWVtW949c919M9MWV9mW4W2be8A9TW79O9V9Wt9FW9U9J9V9KW9wWVtW949c919M9MWVbd8F9TW79O9V9Wt9FW9U9J9V9KW9wWVtW949c919M9MWV9c9V919U9KbiE9TW79O9V9Wt9FW9U9J9V9KW9wWVtW949wWV79P9V9UblY9TW79O9V9Wt9FW9U9J9V9KW69U9KW949c919M9MWVbv8E9TW79O9V9Wt9FW9U9J9V9KW69U9KW949c919M9MWV9c9V919U9Kbo8A9TW79O9V9Wt9FW9U9J9V9KW69U9KW949wWV79P9V9UbrE9TW79O9V9Wt9FW9U9J9V9KW69U9KW949tWG91W9U9JWbwa9TW79O9V9Wt9FW9U9J9V9KW69U9KW949tWG91W9U9JW9c9V919U9KbDL9TW79O9V9Wt9FW9U9J9V9KWS9P2tWV9p9JtbqK9TW79O9V9Wt9FW9U9J9V9KWS9P2tWV9r919HtbkL9TW79O9V9Wt9FW9U9J9V9KWS9P2tWVT949WbxY9TW79O9V9Wt9FW9U9J9V9KWS9P2tWVJ9V29VVbmE9TW79O9V9Wt9F9V9Wt9P9T9P96W9wWVtW94J9H9J9OWbza9TW79O9V9Wt9F9V9Wt9P9T9P96W9wWVtW94J9H9J9OW9ttV9P9WbHa9TW79O9V9Wt9F9V9Wt9P9T9P96W9wWVtW94SWt9J9O9sW9T9H9WbOK9TW79O9V9Wt9F79W9Ht9P9H29t9VVt9sW9T9H9WbAl79IV9RbXDwebcekdKYq;i28Adbk:Bhdhud9:8Jjjjjbc;qw9Rgr8KjjjjbcbhwdnaeTmbabcbyd;C:kjjbaoaocb9iEgDc:GeV86bbarc;adfcbcjdz:xjjjb8AdnaiTmbarc;adfadalz:wjjjb8Akarc;abfalfcbcbcjdal9RalcFe0Ez:xjjjb8Aarc;abfarc;adfalz:wjjjb8AarcUf9cb83ibarc8Wf9cb83ibarcyf9cb83ibarcaf9cb83ibarcKf9cb83ibarczf9cb83ibar9cb83iwar9cb83ibcj;abal9Uc;WFbGcjdalca0Ehqdnaicd6mbavcd9imbaDTmbadcefhkaqci2gxal2hmarc;alfclfhParc;qlfceVhsarc;qofclVhzarc;qofcKfhHarc;qofczfhOcbhAincdhCcbhodnavci6mbaH9cb83ibaO9cb83ibar9cb83i;yoar9cb83i;qoadaAfgoybbhXcbhQincbhwcbhLdninaoalfhKaoybbgYaX7aLVhLawcP0meaKhoaYhXawcefgwaQfai6mbkkcbhXarc;qofhwincwh8AcwhEdnaLaX93gocFeGg3cs0mbclhEa3ci0mba3cb9hcethEkdnaocw4cFeGg3cs0mbclh8Aa3ci0mba3cb9hceth8Aka8AaEfh3awydbh5cwh8AcwhEdnaocz4cFeGg8Ecs0mbclhEa8Eci0mba8Ecb9hcethEka3a5fh3dnaocFFFFb0mbclh8AaocFFF8F0mbaocFFFr0ceth8Akawa3aEfa8AfBdbawclfhwaXcefgXcw9hmbkaKhoaYhXaQczfgQai6mbkcbhocehwazhLinawaoaLydbarc;qofaocdtfydb6EhoaLclfhLawcefgwcw9hmbkcihCkcbh3arc;qlfcbcjdz:xjjjb8Aarc;alfcwfcbBdbar9cb83i;alaoclth8Fadhaaqhhakh5inarc;qlfadcba3cufgoaoa30Eal2falz:wjjjb8Aaiahaiah6Ehgdnaqaia39Ra3aqfai6EgYcsfc9WGgoaY9nmbarc;qofaYfcbaoaY9Rz:xjjjb8Akada3al2fh8Jcbh8Kina8Ka8FVcl4hQarc;alfa8Kcdtfh8LaAh8Mcbh8Nina8NaAfhwdndndndndndna8KPldebidkasa8Mc98GgLfhoa5aLfh8Aarc;qlfawc98GgLfRbbhXcwhwinaoRbbawtaXVhXaocefhoawcwfgwca9hmbkaYTmla8Ncith8Ea8JaLfhEcbhKinaERbbhLcwhoa8AhwinawRbbaotaLVhLawcefhwaocwfgoca9hmbkarc;qofaKfaLaX7aQ93a8E486bba8Aalfh8AaEalfhEaLhXaKcefgKaY9hmbxlkkaYTmia8Mc9:Ghoa8NcitcwGhEarc;qlfawceVfRbbcwtarc;qlfawc9:GfRbbVhLarc;qofhwaghXinawa5aofRbbcwtaaaofRbbVg8AaL9RgLcetaLcztcz91cs47cFFiGaE486bbaoalfhoawcefhwa8AhLa3aXcufgX9hmbxikkaYTmda8Jawfhoarc;qlfawfRbbhLarc;qofhwaghXinawaoRbbg8AaL9RgLcetaLcKtcK91cr4786bbawcefhwaoalfhoa8AhLa3aXcufgX9hmbxdkkaYTmeka8LydbhEcbhKarc;qofhoincdhLcbhwinaLaoawfRbbcb9hfhLawcefgwcz9hmbkclhXcbhwinaXaoawfRbbcd0fhXawcefgwcz9hmbkcwh8Acbhwina8AaoawfRbbcP0fh8Aawcefgwcz9hmbkaLaXaLaX6Egwa8Aawa8A6Egwczawcz6EaEfhEaoczfhoaKczfgKaY6mbka8LaEBdbka8Mcefh8Ma8Ncefg8Ncl9hmbka8Kcefg8KaC9hmbkaaamfhaahaxfhha5amfh5a3axfg3ai6mbkcbhocehwaPhLinawaoaLydbarc;alfaocdtfydb6EhoaLclfhLawcefgXhwaCaX9hmbkaraAcd4fa8FcdVaoaocdSE86bbaAclfgAal6mbkkabaefh8Kabcefhoalcd4gecbaDEhkadcefhOarc;abfceVhHcbhmdndninaiam9nmearc;qofcbcjdz:xjjjb8Aa8Kao9Rak6mdadamal2gwfhxcbh8JaOawfhzaocbakz:xjjjbghakfh5aqaiam9Ramaqfai6Egscsfgocl4cifcd4hCaoc9WGg8LThPindndndndndndndndndndnaDTmbara8Jcd4fRbbgLciGPlbedlbkasTmdaxa8Jfhoarc;abfa8JfRbbhLarc;qofhwashXinawaoRbbg8AaL9RgLcetaLcKtcK91cr4786bbawcefhwaoalfhoa8AhLaXcufgXmbxikkasTmia8JcitcwGhEarc;abfa8JceVfRbbcwtarc;abfa8Jc9:GgofRbbVhLaxaofhoarc;qofhwashXinawao8Vbbg8AaL9RgLcetaLcztcz91cs47cFFiGaE486bbawcefhwaoalfhoa8AhLaXcufgXmbxdkkaHa8Jc98GgEfhoazaEfh8Aarc;abfaEfRbbhXcwhwinaoRbbawtaXVhXaocefhoawcwfgwca9hmbkasTmbaLcl4hYa8JcitcKGh3axaEfhEcbhKinaERbbhLcwhoa8AhwinawRbbaotaLVhLawcefhwaocwfgoca9hmbkarc;qofaKfaLaX7aY93a3486bba8Aalfh8AaEalfhEaLhXaKcefgKas9hmbkkaDmbcbhoxlka8LTmbcbhodninarc;qofaofgwcwf8Pibaw8Pib:e9qTmeaoczfgoa8L9pmdxbkkdnavmbcehoxikcbhEaChKaChYinarc;qofaEfgocwf8Pibhyao8Pibh8PcdhLcbhwinaLaoawfRbbcb9hfhLawcefgwcz9hmbkclhXcbhwinaXaoawfRbbcd0fhXawcefgwcz9hmbkcwh8Acbhwina8AaoawfRbbcP0fh8Aawcefgwcz9hmbkaLaXaLaX6Egoa8Aaoa8A6Egoczaocz6EaYfhYaocucbaya8P:e9cb9sEgwaoaw6EaKfhKaEczfgEa8L9pmdxbkkaha8Jcd4fgoaoRbbcda8JcetcoGtV86bbxikdnaKas6mbaYas6mbaha8Jcd4fgoaoRbbcia8JcetcoGtV86bba8Ka59Ras6mra5arc;qofasz:wjjjbasfh5xikaKaY9phokaha8Jcd4fgwawRbbaoa8JcetcoGtV86bbka8Ka59RaC6mla5cbaCz:xjjjbgAaCfhYdndna8LmbaPhoxekdna8KaY9RcK9pmbaPhoxekaocdtc:q1jjbfcj1jjbaDEg5ydxggcetc;:FFFeGh8Fcuh3cuagtcu7cFeGhacbh8Marc;qofhLinarc;qofa8MfhQczhEdndndnagPDbeeeeeeedekcucbaQcwf8PibaQ8Pib:e9cb9sEhExekcbhoa8FhEinaEaaaLaofRbb9nfhEaocefgocz9hmbkkcih8Ecbh8Ainczhwdndndna5a8AcdtfydbgKPDbeeeeeeedekcucbaQcwf8PibaQ8Pib:e9cb9sEhwxekaKcetc;:FFFeGhwcuaKtcu7cFeGhXcbhoinawaXaLaofRbb9nfhwaocefgocz9hmbkkdndnawaE6mbaKa39hmeawaE9hmea5a8EcdtfydbcwSmeka8Ah8EawhEka8Acefg8Aci9hmbkaAa8Mco4fgoaoRbba8Ea8Mci4coGtV86bbdndndna5a8Ecdtfydbg3PDdbbbbbbbebkdncwa39Tg8ETmbcua3tcu7hwdndna3ceSmbcbh8NaLhQinaQhoa8Eh8AcbhXinaoRbbgEawcFeGgKaEaK6EaXa3tVhXaocefhoa8Acufg8AmbkaYaX86bbaQa8EfhQaYcefhYa8Na8Efg8Ncz6mbxdkkcbh8NaLhQinaQhoa8Eh8AcbhXinaoRbbgEawcFeGgKaEaK6EaXcetVhXaocefhoa8Acufg8AmbkaYaX:T9cFe:d9c:c:qj:bw9:9c:q;c1:I1e:d9c:b:c:e1z9:9ca188bbaQa8EfhQaYcefhYa8Na8Efg8Ncz6mbkkcbhoinaYaLaofRbbgX86bbaYaXawcFeG9pfhYaocefgocz9hmbxikkdna3ceSmbinaYcb86bbaYcefhYxbkkinaYcb86bbaYcefhYxbkkaYaQ8Pbb83bbaYcwfaQcwf8Pbb83bbaYczfhYka8Mczfg8Ma8L9pgomeaLczfhLa8KaY9RcK9pmbkkaoTmlaYh5aYTmlka8Jcefg8Jal9hmbkarc;abfaxascufal2falz:wjjjb8Aasamfhma5hoa5mbkcbhwxdkdna8Kao9RakalfgwcKcaaDEgLawaL0EgX9pmbcbhwxdkdnawaL9pmbaocbaXaw9Rgwz:xjjjbawfhokaoarc;adfalz:wjjjbalfhodnaDTmbaoaraez:wjjjbaefhokaoab9Rhwxekcbhwkarc;qwf8Kjjjjbawk5babaeadaialcdcbyd;C:kjjbz:bjjjbk9reduaecd4gdaefgicaaica0Eabcj;abae9Uc;WFbGcjdaeca0Egifcufai9Uae2aiadfaicl4cifcd4f2fcefkmbcbabBd;C:kjjbk:Ese5u8Jjjjjbc;ae9Rgl8Kjjjjbcbhvdnaici9UgocHfae0mbabcbyd;m:kjjbgrc;GeV86bbalc;abfcFecjez:xjjjb8AalcUfgw9cu83ibalc8WfgD9cu83ibalcyfgq9cu83ibalcafgk9cu83ibalcKfgx9cu83ibalczfgm9cu83ibal9cu83iwal9cu83ibabaefc9WfhPabcefgsaofhednaiTmbcmcsarcb9kgzEhHcbhOcbhAcbhCcbhXcbhQindnaeaP9nmbcbhvxikaQcufhvadaCcdtfgLydbhKaLcwfydbhYaLclfydbh8AcbhEdndndninalc;abfavcsGcitfgoydlh3dndndnaoydbgoaK9hmba3a8ASmekdnaoa8A9hmba3aY9hmbaEcefhExekaoaY9hmea3aK9hmeaEcdfhEkaEc870mdaXcufhvaLaEciGcx2goc;i1jjbfydbcdtfydbh3aLaoc;e1jjbfydbcdtfydbh8AaLaoc;a1jjbfydbcdtfydbhKcbhodnindnalavcsGcdtfydba39hmbaohYxdkcuhYavcufhvaocefgocz9hmbkkaOa3aOSgvaYce9iaYaH9oVgoGfhOdndndncbcsavEaYaoEgvcs9hmbarce9imba3a3aAa3cefaASgvEgAcefSmecmcsavEhvkasavaEcdtc;WeGV86bbavcs9hmea3aA9Rgvcetavc8F917hvinaeavcFb0crtavcFbGV86bbaecefheavcje6hoavcr4hvaoTmbka3hAxvkcPhvasaEcdtcPV86bba3hAkavTmiavaH9omicdhocehEaQhYxlkavcufhvaEclfgEc;ab9hmbkkdnaLceaYaOSceta8AaOSEcx2gvc;a1jjbfydbcdtfydbgKTaLavc;e1jjbfydbcdtfydbg8AceSGaLavc;i1jjbfydbcdtfydbg3cdSGaOcb9hGazGg5ce9hmbaw9cu83ibaD9cu83ibaq9cu83ibak9cu83ibax9cu83ibam9cu83ibal9cu83iwal9cu83ibcbhOkcbhEaXcufgvhodnindnalaocsGcdtfydba8A9hmbaEhYxdkcuhYaocufhoaEcefgEcz9hmbkkcbhodnindnalavcsGcdtfydba39hmbaohExdkcuhEavcufhvaocefgocz9hmbkkaOaKaOSg8EfhLdndnaYcm0mbaYcefhYxekcbcsa8AaLSgvEhYaLavfhLkdndnaEcm0mbaEcefhExekcbcsa3aLSgvEhEaLavfhLkc9:cua8EEh8FcbhvaEaYcltVgacFeGhodndndninavc:W1jjbfRbbaoSmeavcefgvcz9hmbxdkka5aKaO9havcm0VVmbasavc;WeV86bbxekasa8F86bbaeaa86bbaecefhekdna8EmbaKaA9Rgvcetavc8F917hvinaeavcFb0gocrtavcFbGV86bbavcr4hvaecefheaombkaKhAkdnaYcs9hmba8AaA9Rgvcetavc8F917hvinaeavcFb0gocrtavcFbGV86bbavcr4hvaecefheaombka8AhAkdnaEcs9hmba3aA9Rgvcetavc8F917hvinaeavcFb0gocrtavcFbGV86bbavcr4hvaecefheaombka3hAkalaXcdtfaKBdbaXcefcsGhvdndnaYPzbeeeeeeeeeeeeeebekalavcdtfa8ABdbaXcdfcsGhvkdndnaEPzbeeeeeeeeeeeeeebekalavcdtfa3BdbavcefcsGhvkcihoalc;abfaQcitfgEaKBdlaEa8ABdbaQcefcsGhYcdhEavhXaLhOxekcdhoalaXcdtfa3BdbcehEaXcefcsGhXaQhYkalc;abfaYcitfgva8ABdlava3Bdbalc;abfaQaEfcsGcitfgva3BdlavaKBdbascefhsaQaofcsGhQaCcifgCai6mbkkdnaeaP9nmbcbhvxekcbhvinaeavfavc:W1jjbfRbb86bbavcefgvcz9hmbkaeab9Ravfhvkalc;aef8KjjjjbavkZeeucbhddninadcefgdc8F0meceadtae6mbkkadcrfcFeGcr9Uci2cdfabci9U2cHfkmbcbabBd;m:kjjbk:Adewu8Jjjjjbcz9Rhlcbhvdnaicvfae0mbcbhvabcbRb;m:kjjbc;qeV86bbal9cb83iwabcefhoabaefc98fhrdnaiTmbcbhwcbhDindnaoar6mbcbskadaDcdtfydbgqalcwfawaqav9Rgvavc8F91gv7av9Rc507gwcdtfgkydb9Rgvc8E91c9:Gavcdt7awVhvinaoavcFb0gecrtavcFbGV86bbavcr4hvaocefhoaembkakaqBdbaqhvaDcefgDai9hmbkkdnaoar9nmbcbskaocbBbbaoab9RclfhvkavkBeeucbhddninadcefgdc8F0meceadtae6mbkkadcwfcFeGcr9Uab2cvfk:bvli99dui99ludnaeTmbcuadcetcuftcu7:Zhvdndncuaicuftcu7:ZgoJbbbZMgr:lJbbb9p9DTmbar:Ohwxekcjjjj94hwkcbhicbhDinalclfIdbgrJbbbbJbbjZalIdbgq:lar:lMalcwfIdbgk:lMgr:varJbbbb9BEgrNhxaqarNhrdndnakJbbbb9GTmbaxhqxekJbbjZar:l:tgqaq:maxJbbbb9GEhqJbbjZax:l:tgxax:marJbbbb9GEhrkdndnalcxfIdbgxJbbj:;axJbbj:;9GEgkJbbjZakJbbjZ9FEavNJbbbZJbbb:;axJbbbb9GEMgx:lJbbb9p9DTmbax:Ohmxekcjjjj94hmkdndnaqJbbj:;aqJbbj:;9GEgxJbbjZaxJbbjZ9FEaoNJbbbZJbbb:;aqJbbbb9GEMgq:lJbbb9p9DTmbaq:OhPxekcjjjj94hPkdndnarJbbj:;arJbbj:;9GEgqJbbjZaqJbbjZ9FEaoNJbbbZJbbb:;arJbbbb9GEMgr:lJbbb9p9DTmbar:Ohsxekcjjjj94hskdndnadcl9hmbabaifgzas86bbazcifam86bbazcdfaw86bbazcefaP86bbxekabaDfgzas87ebazcofam87ebazclfaw87ebazcdfaP87ebkalczfhlaiclfhiaDcwfhDaecufgembkkk;hlld99eud99eudnaeTmbdndncuaicuftcu7:ZgvJbbbZMgo:lJbbb9p9DTmbao:Ohixekcjjjj94hikaic;8FiGhrinabcofcicdalclfIdb:lalIdb:l9EgialcwfIdb:lalaicdtfIdb:l9EEgialcxfIdb:lalaicdtfIdb:l9EEgiarV87ebdndnJbbj:;JbbjZalaicdtfIdbJbbbb9DEgoalaicd7cdtfIdbJ;Zl:1ZNNgwJbbj:;awJbbj:;9GEgDJbbjZaDJbbjZ9FEavNJbbbZJbbb:;awJbbbb9GEMgw:lJbbb9p9DTmbaw:Ohqxekcjjjj94hqkabcdfaq87ebdndnalaicefciGcdtfIdbJ;Zl:1ZNaoNgwJbbj:;awJbbj:;9GEgDJbbjZaDJbbjZ9FEavNJbbbZJbbb:;awJbbbb9GEMgw:lJbbb9p9DTmbaw:Ohqxekcjjjj94hqkabaq87ebdndnaoalaicufciGcdtfIdbJ;Zl:1ZNNgoJbbj:;aoJbbj:;9GEgwJbbjZawJbbjZ9FEavNJbbbZJbbb:;aoJbbbb9GEMgo:lJbbb9p9DTmbao:Ohixekcjjjj94hikabclfai87ebabcwfhbalczfhlaecufgembkkk;3viDue99eu8Jjjjjbcjd9Rgo8Kjjjjbadcd4hrdndndndnavcd9hmbadcl6meaohwarhDinawc:CuBdbawclfhwaDcufgDmbkaeTmiadcl6mdarcdthqalhkcbhxinaohwakhDarhminawawydbgPcbaDIdbgs:8cL4cFeGc:cufasJbbbb9BEgzaPaz9kEBdbaDclfhDawclfhwamcufgmmbkakaqfhkaxcefgxaeSmixbkkaeTmdxekaeTmekarcdthkavce9hhqadcl6hdcbhxindndndnaqmbadmdc:CuhDalhwarhminaDcbawIdbgs:8cL4cFeGc:cufasJbbbb9BEgPaDaP9kEhDawclfhwamcufgmmbxdkkc:CuhDdndnavPleddbdkadmdaohwalhmarhPinawcbamIdbgs:8cL4cFeGgzc;:bazc;:b0Ec:cufasJbbbb9BEBdbamclfhmawclfhwaPcufgPmbxdkkadmecbhwarhminaoawfcbalawfIdbgs:8cL4cFeGgPc8AaPc8A0Ec:cufasJbbbb9BEBdbawclfhwamcufgmmbkkadmbcbhwarhPinaDhmdnavceSmbaoawfydbhmkdndnalawfIdbgscjjj;8iamai9RcefgmcLt9R::NJbbbZJbbb:;asJbbbb9GEMgs:lJbbb9p9DTmbas:Ohzxekcjjjj94hzkabawfazcFFFrGamcKtVBdbawclfhwaPcufgPmbkkabakfhbalakfhlaxcefgxae9hmbkkaocjdf8Kjjjjbk:Ylvdud99due99iudnaeTmbceaicufgvthocuaitcu7:Zhrcuavtcu7:Zhwcbhvadcl9hhDcbhqindndnalcwfIdbgkJbbbbakJbbbb9GEgkJbbjZakJbbjZ9FEarNJbbbZMgk:lJbbb9p9DTmbak:Ohixekcjjjj94hikdndnalIdbgkJbbbbakJbbbb9GEgkJbbjZakJbbjZ9FEarNJbbbZMgk:lJbbb9p9DTmbak:Ohdxekcjjjj94hdkadai9Rcd9TgxaifhidndnalclfIdbgkJbbbbakJbbbb9GEgkJbbjZakJbbjZ9FEarNJbbbZMgk:lJbbb9p9DTmbak:Ohdxekcjjjj94hdkadai9Rcd9ThddndnalcxfIdbgkJbbbbakJbbbb9GEgkJbbjZakJbbjZ9FEawNJbbbZMgk:lJbbb9p9DTmbak:Ohmxekcjjjj94hmkadaifhiaoamVhmdndnaDmbabavfgPai86bbaPcifam86bbaPcdfad86bbaPcefax86bbxekabaqfgPai87ebaPcofam87ebaPclfad87ebaPcdfax87ebkalczfhlavclfhvaqcwfhqaecufgembkkk;YqdXui998Jjjjjbc:qd9Rgv8Kjjjjbavc:Sefcbc;Kbz:xjjjb8AcbhodnadTmbcbhoaiTmbdndnabaeSmbaehrxekavcuadcdtgwadcFFFFi0Ecbyd;q:kjjbHjjjjbbgrBd:SeavceBd:mdaraeawz:wjjjb8Akavc:GefcwfcbBdbav9cb83i:Geavc:Gefaradaiavc:Sefz:pjjjbavyd:GehDadci9Ugqcbyd;q:kjjbHjjjjbbheavc:Sefavyd:mdgkcdtfaeBdbavakcefgwBd:mdaecbaqz:xjjjbhxavc:SefawcdtfcuaicdtaicFFFFi0Ecbyd;q:kjjbHjjjjbbgmBdbavakcdfgPBd:mdalc;ebfhsaDheamhwinawalIdbasaeydbgzcwazcw6EcdtfIdbMUdbaeclfheawclfhwaicufgimbkavc:SefaPcdtfcuaqcdtadcFFFF970Ecbyd;q:kjjbHjjjjbbgPBdbdnadci6mbarheaPhwaqhiinawamaeydbcdtfIdbamaeclfydbcdtfIdbMamaecwfydbcdtfIdbMUdbaecxfheawclfhwaicufgimbkkakcifhoalc;ebfhHavc;qbfhOavheavyd:KehAavyd:OehCcbhzcbhwcbhXcehQinaehLcihkarawci2gKcdtfgeydbhsaeclfydbhdabaXcx2fgicwfaecwfydbgYBdbaiclfadBdbaiasBdbaxawfce86bbaOaYBdwaOadBdlaOasBdbaPawcdtfcbBdbdnazTmbcihkaLhiinaOakcdtfaiydbgeBdbakaeaY9haeas9haead9hGGfhkaiclfhiazcufgzmbkkaXcefhXcbhzinaCaAarazaKfcdtfydbcdtgifydbcdtfgYheaDaifgdydbgshidnasTmbdninaeydbawSmeaeclfheaicufgiTmdxbkkaeaYascdtfc98fydbBdbadadydbcufBdbkazcefgzci9hmbkdndnakTmbcuhwJbbbbh8Acbhdavyd:KehYavyd:OehKindndnaDaOadcdtfydbcdtgzfydbgembadcefhdxekadcs0hiamazfgsIdbhEasalcbadcefgdaiEcdtfIdbaHaecwaecw6EcdtfIdbMg3Udba3aE:th3aecdthiaKaYazfydbcdtfheinaPaeydbgzcdtfgsa3asIdbMgEUdbaEa8Aa8AaE9DgsEh8AazawasEhwaeclfheaic98fgimbkkadak9hmbkawcu9hmekaQaq9pmdindnaxaQfRbbmbaQhwxdkaqaQcefgQ9hmbxikkakczakcz6EhzaOheaLhOawcu9hmbkkaocdtavc:Seffc98fhedninaoTmeaeydbcbyd;u:kjjbH:bjjjbbaec98fheaocufhoxbkkavc:qdf8Kjjjjbk;IlevucuaicdtgvaicFFFFi0Egocbyd;q:kjjbHjjjjbbhralalyd9GgwcdtfarBdbalawcefBd9GabarBdbaocbyd;q:kjjbHjjjjbbhralalyd9GgocdtfarBdbalaocefBd9GabarBdlcuadcdtadcFFFFi0Ecbyd;q:kjjbHjjjjbbhralalyd9GgocdtfarBdbalaocefBd9GabarBdwabydbcbavz:xjjjb8Aadci9UhDdnadTmbabydbhoaehladhrinaoalydbcdtfgvavydbcefBdbalclfhlarcufgrmbkkdnaiTmbabydbhlabydlhrcbhvaihoinaravBdbarclfhralydbavfhvalclfhlaocufgombkkdnadci6mbabydlhrabydwhvcbhlinaecwfydbhoaeclfydbhdaraeydbcdtfgwawydbgwcefBdbavawcdtfalBdbaradcdtfgdadydbgdcefBdbavadcdtfalBdbaraocdtfgoaoydbgocefBdbavaocdtfalBdbaecxfheaDalcefgl9hmbkkdnaiTmbabydlheabydbhlinaeaeydbalydb9RBdbalclfhlaeclfheaicufgimbkkkQbabaeadaic;K1jjbz:ojjjbkQbabaeadaic;m:jjjbz:ojjjbk9DeeuabcFeaicdtz:xjjjbhlcbhbdnadTmbindnalaeydbcdtfgiydbcu9hmbaiabBdbabcefhbkaeclfheadcufgdmbkkabk:Vvioud9:du8Jjjjjbc;Wa9Rgl8Kjjjjbcbhvalcxfcbc;Kbz:xjjjb8AalcuadcitgoadcFFFFe0Ecbyd;q:kjjbHjjjjbbgrBdxalceBd2araeadaicezNjjjbalcuaoadcjjjjoGEcbyd;q:kjjbHjjjjbbgwBdzadcdthednadTmbabhiinaiavBdbaiclfhiadavcefgv9hmbkkawaefhDalabBdwalawBdl9cbhqindnadTmbaq9cq9:hkarhvaDhiadheinaiav8Pibak1:NcFrG87ebavcwfhvaicdfhiaecufgembkkalclfaq:NceGcdtfydbhxalclfaq9ce98gq:NceGcdtfydbhmalc;Wbfcbcjaz:xjjjb8AaDhvadhidnadTmbinalc;Wbfav8VebcdtfgeaeydbcefBdbavcdfhvaicufgimbkkcbhvcbhiinalc;WbfavfgeydbhoaeaiBdbaoaifhiavclfgvcja9hmbkadhvdndnadTmbinalc;WbfaDamydbgicetf8VebcdtfgeaeydbgecefBdbaxaecdtfaiBdbamclfhmavcufgvmbkaq9cv9smdcbhvinabawydbcdtfavBdbawclfhwadavcefgv9hmbxdkkaq9cv9smekkclhvdninavc98Smealcxfavfydbcbyd;u:kjjbH:bjjjbbavc98fhvxbkkalc;Waf8Kjjjjbk:Jwliuo99iud9:cbhv8Jjjjjbca9Rgoczfcwfcbyd:8:kjjbBdbaocb8Pd:0:kjjb83izaocwfcbyd;i:kjjbBdbaocb8Pd;a:kjjb83ibaicd4hrdndnadmbJFFuFhwJFFuuhDJFFuuhqJFFuFhkJFFuuhxJFFuFhmxekarcdthPaehsincbhiinaoczfaifgzasaifIdbgwazIdbgDaDaw9EEUdbaoaifgzawazIdbgDaDaw9DEUdbaiclfgicx9hmbkasaPfhsavcefgvad9hmbkaoIdKhDaoIdwhwaoIdChqaoIdlhkaoIdzhxaoIdbhmkdnadTmbJbbbbJbFu9hJbbbbamax:tgmamJbbbb9DEgmakaq:tgkakam9DEgkawaD:tgwawak9DEgw:vawJbbbb9BEhwdnalmbarcdthoindndnaeclfIdbaq:tawNJbbbZMgk:lJbbb9p9DTmbak:Ohixekcjjjj94hikai:S9cC:ghHdndnaeIdbax:tawNJbbbZMgk:lJbbb9p9DTmbak:Ohixekcjjjj94hikaHai:S:ehHdndnaecwfIdbaD:tawNJbbbZMgk:lJbbb9p9DTmbak:Ohixekcjjjj94hikabaHai:T9cy:g:e83ibaeaofheabcwfhbadcufgdmbxdkkarcdthoindndnaeIdbax:tawNJbbbZMgk:lJbbb9p9DTmbak:Ohixekcjjjj94hikai:SgH9ca:gaH9cz:g9cjjj;4s:d:eaH9cFe:d:e9cF:bj;4:pj;ar:d9c:bd9:9c:p;G:d;4j:E;ar:d9cH9:9c;d;H:W:y:m:g;d;Hb:d9cv9:9c;j:KM;j:KM;j:Kd:dhOdndnaeclfIdbaq:tawNJbbbZMgk:lJbbb9p9DTmbak:Ohixekcjjjj94hikai:SgH9ca:gaH9cz:g9cjjj;4s:d:eaH9cFe:d:e9cF:bj;4:pj;ar:d9c:bd9:9c:p;G:d;4j:E;ar:d9cH9:9c;d;H:W:y:m:g;d;Hb:d9cq9:9cM;j:KM;j:KM;jl:daO:ehOdndnaecwfIdbaD:tawNJbbbZMgk:lJbbb9p9DTmbak:Ohixekcjjjj94hikabaOai:SgH9ca:gaH9cz:g9cjjj;4s:d:eaH9cFe:d:e9cF:bj;4:pj;ar:d9c:bd9:9c:p;G:d;4j:E;ar:d9cH9:9c;d;H:W:y:m:g;d;Hb:d9cC9:9c:KM;j:KM;j:KMD:d:e83ibaeaofheabcwfhbadcufgdmbkkk9teiucbcbyd;y:kjjbgeabcifc98GfgbBd;y:kjjbdndnabZbcztgd9nmbcuhiabad9RcFFifcz4nbcuSmekaehikaik;teeeudndnaeabVciGTmbabhixekdndnadcz9pmbabhixekabhiinaiaeydbBdbaiaeydlBdlaiaeydwBdwaiaeydxBdxaeczfheaiczfhiadc9Wfgdcs0mbkkadcl6mbinaiaeydbBdbaeclfheaiclfhiadc98fgdci0mbkkdnadTmbinaiaeRbb86bbaicefhiaecefheadcufgdmbkkabk:3eedudndnabciGTmbabhixekaecFeGc:b:c:ew2hldndnadcz9pmbabhixekabhiinaialBdxaialBdwaialBdlaialBdbaiczfhiadc9Wfgdcs0mbkkadcl6mbinaialBdbaiclfhiadc98fgdci0mbkkdnadTmbinaiae86bbaicefhiadcufgdmbkkabk9teiucbcbyd;y:kjjbgeabcrfc94GfgbBd;y:kjjbdndnabZbcztgd9nmbcuhiabad9RcFFifcz4nbcuSmekaehikaik9:eiuZbhedndncbyd;y:kjjbgdaecztgi9nmbcuheadai9RcFFifcz4nbcuSmekadhekcbabae9Rcifc98Gcbyd;y:kjjbfgdBd;y:kjjbdnadZbcztge9nmbadae9RcFFifcz4nb8Akkk;Qddbcjwk;mdbbbbdbbblbbbwbbbbbbbebbbdbbblbbbwbbbbbbbbbbbbbbbb4:h9w9N94:P:gW:j9O:ye9Pbbbbbbebbbdbbbebbbdbbbbbbbdbbbbbbbebbbbbbb:l29hZ;69:9kZ;N;76Z;rg97Z;z;o9xZ8J;B85Z;:;u9yZ;b;k9HZ:2;Z9DZ9e:l9mZ59A8KZ:r;T3Z:A:zYZ79OHZ;j4::8::Y:D9V8:bbbb9s:49:Z8R:hBZ9M9M;M8:L;z;o8:;8:PG89q;x:J878R:hQ8::M:B;e87bbbbbbjZbbjZbbjZ:E;V;N8::Y:DsZ9i;H;68:xd;R8:;h0838:;W:NoZbbbb:WV9O8:uf888:9i;H;68:9c9G;L89;n;m9m89;D8Ko8:bbbbf:8tZ9m836ZS:2AZL;zPZZ818EZ9e:lxZ;U98F8:819E;68:FFuuFFuuFFuuFFuFFFuFFFuFbc;mqkzebbbebbbdbbb9G:vbb", D = new Uint8Array([
4
4
  32,
@@ -3,14 +3,30 @@ import type { ViralViewerApi } from "../../viral-viewer-api";
3
3
  export declare class ViralAnimation {
4
4
  viralViewerApi: ViralViewerApi;
5
5
  clock: Clock;
6
- private lastSpatialUpdateTime;
7
- private lastCleanupTime;
8
- private spatialUpdateInterval;
9
- private cleanupInterval;
6
+ private _needsRender;
7
+ private _rafId;
8
+ private _isRainEnabled;
10
9
  constructor(viralViewerApi: ViralViewerApi);
11
- devAnimation(): void;
12
- animation(): void;
13
- rainAnimation(): void;
14
- private isRainEnabled;
10
+ /**
11
+ * Request a render frame. Safe to call multiple times per frame —
12
+ * coalesced via dirty flag. Schedules rAF only if not already scheduled.
13
+ */
14
+ requestRender(): void;
15
+ /**
16
+ * Start the animation loop. Called once during initialization.
17
+ * Replaces the old devAnimation()/animation() unconditional loop.
18
+ */
19
+ start(): void;
20
+ private _tick;
21
+ /**
22
+ * Determine if the animation loop should stay alive.
23
+ * Only returns true when continuous updates are needed.
24
+ */
25
+ private _isAnimating;
26
+ /**
27
+ * Update rain particle positions. Called each tick when rain is enabled.
28
+ */
29
+ private _updateRainPositions;
15
30
  toggleRain(value: boolean): void;
31
+ dispose(): void;
16
32
  }
@@ -1,5 +1,5 @@
1
1
  import CameraControls from "camera-controls";
2
- import { type Object3D, OrthographicCamera, PerspectiveCamera, Raycaster, Vector3 } from "three";
2
+ import { Box3, type Object3D, OrthographicCamera, PerspectiveCamera, Raycaster, Vector3 } from "three";
3
3
  import { ViralCameraEventType, type ViralutionCamera, type ViralViewerState } from "../..";
4
4
  import type { ViralViewerApi } from "../../viral-viewer-api";
5
5
  export declare class ViralCamera {
@@ -18,6 +18,7 @@ export declare class ViralCamera {
18
18
  cameraControls: CameraControls | null;
19
19
  targetElement: HTMLElement;
20
20
  onUsing: boolean;
21
+ private _homeBounds;
21
22
  constructor(viralViewerApi: ViralViewerApi);
22
23
  setupCamera(): void;
23
24
  private _isFirstInit;
@@ -61,4 +62,10 @@ export declare class ViralCamera {
61
62
  * @param camera
62
63
  */
63
64
  focusCameraOnModel(camera: ViralutionCamera, transition?: boolean): Promise<void>;
65
+ /**
66
+ * Focus camera on a Three.js Box3 directly (no Revit coordinate transform).
67
+ * Used by IFC loader and backHome for IFC models.
68
+ */
69
+ focusCameraOnBounds(bounds: Box3, transition?: boolean): Promise<void>;
70
+ setHomeBounds(bounds: Box3): void;
64
71
  }
@@ -94,6 +94,13 @@ export declare class ViralBatchedMeshV3 extends Object3D {
94
94
  * Append more elements to this batched mesh (streaming/incremental loading).
95
95
  */
96
96
  batch(newBufferElements: BufferElement[]): void;
97
+ /**
98
+ * [INFRA-04] Apply GPU usage hints to the merged BatchedMesh geometry.
99
+ * Position/normal/index are write-once → StaticDrawUsage.
100
+ * V3 colors are managed via DataTexture (_colorsTexture), not BufferAttribute,
101
+ * so DynamicDrawUsage is not applicable for color here.
102
+ */
103
+ private _applyGeometryUsageHints;
97
104
  private _ensureCapacity;
98
105
  /**
99
106
  * O(1) raycast result → element identification.
@@ -1,4 +1,4 @@
1
- import { Box3, BufferGeometry, type Color, type Material, Mesh, Vector3 } from "three";
1
+ import { Box3, BufferGeometry, type Color, type Material, Mesh, type Raycaster, Vector3 } from "three";
2
2
  import { type LineMaterial } from "three/examples/jsm/Addons";
3
3
  import { type BufferElement } from "../..";
4
4
  import type { WorkerThreadPool } from "../worker/base/worker-pool";
@@ -8,10 +8,13 @@ import type { WorkerThreadPool } from "../worker/base/worker-pool";
8
8
  */
9
9
  export declare const SELECTION_ALPHA = 0.99;
10
10
  export declare class ViralBatchedMesh extends Mesh {
11
+ private static readonly _tempVec3A;
12
+ private static readonly _tempBox3A;
11
13
  globalMaterialIndex: number;
12
14
  private workerPool;
13
15
  private _depthPrePassMesh;
14
16
  constructor(geometry?: BufferGeometry, material?: Material, workerPool?: WorkerThreadPool | null);
17
+ raycast(raycaster: Raycaster, intersects: any[]): void;
15
18
  /**
16
19
  * *for tracking and manage element visibility, for instance hide object
17
20
  */
@@ -11,6 +11,8 @@ import { ViralInstancedMeshV2 } from "./viral-instanced-mesh-v2";
11
11
  *
12
12
  */
13
13
  export declare class ViralBIMWorld extends Mesh {
14
+ private static readonly _tempMatrix4A;
15
+ private static readonly _tempVec3A;
14
16
  workerPool: WorkerThreadPool | null;
15
17
  bimModels: ViralBIMModel[];
16
18
  private _workerBlobUrl;
@@ -50,6 +52,7 @@ export declare class ViralBIMWorld extends Mesh {
50
52
  addInstancedMesh(mesh: ViralInstancedMeshV2): void;
51
53
  getInstancedMesh(globalMaterialIndex: number): ViralInstancedMeshV2 | undefined;
52
54
  getInstancedMeshes(): ViralInstancedMeshV2[];
55
+ removeInstancedMesh(mesh: ViralInstancedMeshV2): void;
53
56
  hide(elements?: {
54
57
  modelId: string;
55
58
  elementId: string;
@@ -191,4 +194,10 @@ export declare class ViralBIMWorld extends Mesh {
191
194
  * *then regenerate again
192
195
  */
193
196
  dispose(): void;
197
+ /**
198
+ * [INFRA-09] Cooperative async dispose — yields to event loop between mesh disposals.
199
+ * Prevents UI freezes when disposing large scenes with hundreds of meshes.
200
+ * Use this instead of synchronous `dispose()` when called from user-initiated actions.
201
+ */
202
+ disposeCooperative(): Promise<void>;
194
203
  }
@@ -1,4 +1,5 @@
1
1
  import { Dictionary, type RenderMaterial, type ViralutionElement } from "../..";
2
+ import type { SpatialTreeNode } from "../data-manager/ifc-spatial-tree";
2
3
  /**
3
4
  * this is a wrapper to manage whole BIM Model
4
5
  */
@@ -7,5 +8,6 @@ export declare class ViralBIMModel {
7
8
  elements: ViralutionElement[];
8
9
  materials: RenderMaterial[];
9
10
  mapMaterialsToMaterialManager: Dictionary<number, number>;
11
+ spatialTree: SpatialTreeNode | null;
10
12
  dispose(): void;
11
13
  }
@@ -8,6 +8,10 @@ import { type BufferElement } from "../..";
8
8
  export declare const SELECTION_ALPHA = 0.99;
9
9
  export declare class ViralInstancedMeshV2 extends Object3D {
10
10
  protected material?: Material | undefined;
11
+ private static readonly _tempMatrix4A;
12
+ private static readonly _tempVec3A;
13
+ private static readonly _tempMatrix4B;
14
+ private static readonly _tempBox3A;
11
15
  globalMaterialIndex: number;
12
16
  private _depthPrePassMeshes;
13
17
  constructor(material?: Material | undefined);
@@ -134,6 +138,24 @@ export declare class ViralInstancedMeshV2 extends Object3D {
134
138
  modelId: string;
135
139
  elementId: string;
136
140
  }[];
141
+ /** Per-element opacity map. Key: "modelId:elementId", Value: opacity number. */
142
+ get elementOpacity(): ReadonlyMap<string, number>;
143
+ /** Temporary colors map. Key: "modelId:elementId". */
144
+ get temporaryColors(): ReadonlyMap<string, {
145
+ r: number;
146
+ g: number;
147
+ b: number;
148
+ }>;
149
+ /** Ghost colors map. Key: "modelId:elementId". */
150
+ get ghostColors(): ReadonlyMap<string, {
151
+ r: number;
152
+ g: number;
153
+ b: number;
154
+ }>;
155
+ /** Set of hidden element keys ("modelId:elementId"). */
156
+ get hiddenSet(): ReadonlySet<string>;
157
+ /** Set of isolated element keys ("modelId:elementId"). */
158
+ get isolatedSet(): ReadonlySet<string>;
137
159
  private _hiddenSet;
138
160
  private _isolatedSet;
139
161
  private static readonly ZERO_MATRIX;
@@ -0,0 +1,38 @@
1
+ import type { ViralutionParameter } from "../../entities/data";
2
+ /** Structured result from getIFCProperties() */
3
+ export interface IFCPropertyResult {
4
+ /** Entity attributes (GlobalId, Name, Description, ObjectType, Tag) */
5
+ attributes: {
6
+ [key: string]: ViralutionParameter;
7
+ };
8
+ /** Instance property sets, keyed by pset name */
9
+ propertySets: {
10
+ [psetName: string]: {
11
+ [key: string]: ViralutionParameter;
12
+ };
13
+ };
14
+ /** Quantity sets, keyed by qset name */
15
+ quantitySets: {
16
+ [qsetName: string]: {
17
+ [key: string]: ViralutionParameter;
18
+ };
19
+ };
20
+ /** Type-level properties (from IfcTypeObject), keyed by pset name */
21
+ typeProperties: {
22
+ [psetName: string]: {
23
+ [key: string]: ViralutionParameter;
24
+ };
25
+ };
26
+ /** Classifications (Uniformat, OmniClass, etc.) */
27
+ classifications: {
28
+ [key: string]: ViralutionParameter;
29
+ };
30
+ /** Material assignments */
31
+ materials: {
32
+ [key: string]: ViralutionParameter;
33
+ };
34
+ /** Document references */
35
+ documents: {
36
+ [key: string]: ViralutionParameter;
37
+ };
38
+ }
@@ -0,0 +1,13 @@
1
+ /** Consumer-friendly spatial tree node with element type grouping. */
2
+ export interface SpatialTreeNode {
3
+ expressId: number;
4
+ name: string;
5
+ type: string;
6
+ children: SpatialTreeNode[];
7
+ elementGroups: Array<{
8
+ typeName: string;
9
+ ids: number[];
10
+ }>;
11
+ /** Recursive count of all elements in this node and descendants */
12
+ totalElements: number;
13
+ }
@@ -1,4 +1,8 @@
1
- import { CheckClashResult, CompareModelsResult, DataTree, GroupByResult, type ViralutionInformation, type ViralutionTrackingModel, type ViralViewerApi } from "../..";
1
+ import { CheckClashResult, CompareModelsResult, DataTree, GroupByResult, type ViralutionParameter, type ViralutionInformation, type ViralutionTrackingModel, type ViralViewerApi } from "../..";
2
+ import type { IFCPropertyResult } from "./ifc-property-mapper";
3
+ import type { SpatialTreeNode } from "./ifc-spatial-tree";
4
+ export type { IFCPropertyResult } from "./ifc-property-mapper";
5
+ export type { SpatialTreeNode } from "./ifc-spatial-tree";
2
6
  export declare class ViralDataManager {
3
7
  viralViewerApi: ViralViewerApi;
4
8
  dataTree: DataTree[];
@@ -29,7 +33,7 @@ export declare class ViralDataManager {
29
33
  */
30
34
  addData(data: ViralutionInformation): void;
31
35
  getElementData(modelId: number, elementId: number): {
32
- [key: string]: import("../..").ViralutionParameter;
36
+ [key: string]: ViralutionParameter;
33
37
  } | null;
34
38
  getLinkedElements(modelId: number, elementId: number): number[] | null;
35
39
  /**
@@ -81,6 +85,25 @@ export declare class ViralDataManager {
81
85
  [key: string]: string;
82
86
  };
83
87
  }) => void): void;
88
+ /**
89
+ * Get full IFC BIM data for an element using on-demand extraction.
90
+ * Returns structured property data: attributes, property sets, quantity sets,
91
+ * type properties, classifications, materials, and document references.
92
+ *
93
+ * Returns null if the model has no IFC data store (non-IFC model or data parse failed).
94
+ *
95
+ * @param modelId Model index in bimWorld.bimModels
96
+ * @param elementId IFC expressId of the element
97
+ */
98
+ getIFCProperties(_modelId: number, _elementId: number): IFCPropertyResult | null;
99
+ /**
100
+ * Populate DataTree for an IFC model from its IfcDataStore.
101
+ * Adds entity attributes (Name, ObjectType, GlobalId) as ViralutionParameter groups
102
+ * so that existing search() and getElementData() APIs work with IFC models.
103
+ *
104
+ * Called automatically when an IFC model finishes loading.
105
+ */
106
+ populateIFCDataTree(modelId: number): void;
84
107
  searchValue: string;
85
108
  searchElementData(prefix?: string): {
86
109
  modelId: string;
@@ -137,4 +160,37 @@ export declare class ViralDataManager {
137
160
  modelId: string;
138
161
  elementId: string;
139
162
  }[];
163
+ /**
164
+ * Get the IFC spatial hierarchy as a consumer-friendly tree structure.
165
+ * Returns a SpatialTreeNode tree (Project > Site > Building > Storey)
166
+ * with elements grouped by IFC type under each node.
167
+ *
168
+ * Returns null if the model has no IFC data store or no spatial hierarchy.
169
+ *
170
+ * @param modelId Model index in bimWorld.bimModels
171
+ */
172
+ getSpatialTree(modelId: number): SpatialTreeNode | null;
173
+ /**
174
+ * Get all element IDs contained in a specific storey.
175
+ * Uses ifc-lite's SpatialHierarchy.getStoreyElements() for efficient lookup.
176
+ *
177
+ * Returns empty array if the model has no IFC data store or the storeyId is invalid.
178
+ *
179
+ * @param modelId Model index in bimWorld.bimModels
180
+ * @param storeyId expressId of the IfcBuildingStorey
181
+ */
182
+ getElementsByStorey(modelId: number, storeyId: number): number[];
183
+ private _findNode;
184
+ private _collectElementIds;
185
+ /**
186
+ * Get the containing storey expressId for a given element.
187
+ * Uses ifc-lite's SpatialHierarchy.elementToStorey map for O(1) lookup.
188
+ *
189
+ * Returns null if the model has no IFC data store or the element has no storey assignment.
190
+ *
191
+ * @param modelId Model index in bimWorld.bimModels
192
+ * @param elementId expressId of the element
193
+ */
194
+ getStoreyForElement(modelId: number, elementId: number): number | null;
195
+ private _findStoreyForElement;
140
196
  }
@@ -0,0 +1,50 @@
1
+ import { type Material } from "three";
2
+ import type { ViralBIMWorld } from "../custom-objects/viral-bim-world";
3
+ /**
4
+ * Post-load draw call budget enforcement.
5
+ *
6
+ * After all chunks have loaded, counts the total instanced draw calls,
7
+ * ranks instanced mesh types by vertex-savings efficiency, and demotes
8
+ * low-value types to batched meshes so the total stays within budget.
9
+ *
10
+ * The swap is atomic: the replacement batched mesh is added to the scene
11
+ * before the old instanced mesh is removed, so there is never a frame
12
+ * with missing geometry.
13
+ */
14
+ declare class DrawCallRebalancer {
15
+ private readonly bimWorld;
16
+ private readonly useBatchedMeshV3;
17
+ private readonly materialManager;
18
+ private static readonly _tempMatrix;
19
+ private static readonly _tempVec3;
20
+ private readonly DEFAULT_DRAW_CALL_BUDGET;
21
+ private readonly DEFAULT_V1_VERTEX_LIMIT;
22
+ private readonly MAX_V1_VERTEX_LIMIT;
23
+ constructor(bimWorld: ViralBIMWorld, useBatchedMeshV3: boolean, materialManager: {
24
+ materials: Material[];
25
+ mergeMaterials: Material[];
26
+ });
27
+ /**
28
+ * Analyse all instanced mesh types and demote low-value ones to
29
+ * batched meshes if the total instanced draw call count exceeds
30
+ * the budget.
31
+ *
32
+ * Yields to the main thread between demotions to avoid blocking
33
+ * the render loop.
34
+ */
35
+ rebalance(budget?: number): Promise<void>;
36
+ private static yieldToMain;
37
+ private collectStats;
38
+ private replacementMeshCount;
39
+ private determineDemotions;
40
+ private demoteInstancedMesh;
41
+ private buildAndSwapV1;
42
+ private splitByVertexLimit;
43
+ private buildAndSwapV3;
44
+ private captureState;
45
+ private applyState;
46
+ private applyTransformToBuffer;
47
+ private createOptimizedMaterial;
48
+ private createOptimizedMaterialV3;
49
+ }
50
+ export { DrawCallRebalancer };
@@ -0,0 +1,27 @@
1
+ import { Group, type Object3D, Vector3 } from "three";
2
+ import type { Vector2 } from "three";
3
+ import { EditorObject, type EditorObjectMetadata } from "../editor-object";
4
+ export interface LineBlockProfile {
5
+ type: "line";
6
+ points: Vector3[];
7
+ spacing: number;
8
+ catalogItemId: string;
9
+ }
10
+ export interface AreaBlockProfile {
11
+ type: "area";
12
+ points: Vector2[];
13
+ spacing: number;
14
+ drawMode: "polygon" | "rectangle";
15
+ catalogItemId: string;
16
+ }
17
+ export type BlockProfile = LineBlockProfile | AreaBlockProfile;
18
+ export declare class EditorBlock extends EditorObject {
19
+ childObjects: EditorObject[];
20
+ profile: BlockProfile;
21
+ originPosition: Vector3;
22
+ constructor(group: Group, metadata: EditorObjectMetadata, profile: BlockProfile, children: EditorObject[]);
23
+ get group(): Group;
24
+ addChild(child: EditorObject): void;
25
+ removeChild(childId: string): EditorObject | null;
26
+ getChildMeshes(): Object3D[];
27
+ }
@@ -0,0 +1,55 @@
1
+ import { Group, Vector3 } from "three";
2
+ import type { ViralViewerApi } from "../../../viral-viewer-api";
3
+ import type { BlockProfile } from "./editor-block";
4
+ export interface ProfileEditResult {
5
+ profile: BlockProfile;
6
+ positions: Vector3[];
7
+ }
8
+ export declare class ProfileEditTool {
9
+ private _viralViewerApi;
10
+ private _editorGroup;
11
+ active: boolean;
12
+ handleSelected: boolean;
13
+ onFinish: ((result: ProfileEditResult) => void) | null;
14
+ onCancel: (() => void) | null;
15
+ private _profile;
16
+ private _points;
17
+ private _previewGroup;
18
+ private _handles;
19
+ private _selectedHandle;
20
+ private _previewLine;
21
+ private _previewObjects;
22
+ private _mathPlane;
23
+ private _raycaster;
24
+ private _onMouseDown;
25
+ private _onMouseUp;
26
+ private _onKeyDown;
27
+ private _onObjectChange;
28
+ private _onDraggingChanged;
29
+ private _savedShowX;
30
+ private _savedShowY;
31
+ private _savedShowZ;
32
+ private _savedMode;
33
+ private _gizmoActive;
34
+ constructor(_viralViewerApi: ViralViewerApi, _editorGroup: Group);
35
+ start(profile: BlockProfile): void;
36
+ cancel(): void;
37
+ finish(): ProfileEditResult | null;
38
+ private _selectHandle;
39
+ private _deselectHandle;
40
+ private _syncHandleToPoints;
41
+ private _bindListeners;
42
+ private _unbindListeners;
43
+ private _hitTestHandles;
44
+ private _buildUpdatedProfile;
45
+ private _computePositions;
46
+ private _computeLinePositions;
47
+ private _computeAreaPositions;
48
+ private _pointInPolygon;
49
+ private _rebuildPreview;
50
+ private _updatePreviewGeometry;
51
+ private _drawLinePath;
52
+ private _drawAreaOutline;
53
+ private _showPreviewObjects;
54
+ private _clearAll;
55
+ }
@@ -0,0 +1,29 @@
1
+ import type { ViralEditor } from "./viral-editor";
2
+ export declare class BuildingRemovalTool {
3
+ private _editor;
4
+ private _tooltip;
5
+ private _highlight;
6
+ private _selectedGroupIndex;
7
+ private _hoveredGroupIndex;
8
+ private _onMouseMove;
9
+ private _onMouseClick;
10
+ private _lastRaycastTime;
11
+ private _bvhReady;
12
+ constructor(_editor: ViralEditor);
13
+ enable(): void;
14
+ disable(): void;
15
+ get hasSelection(): boolean;
16
+ get hasHover(): boolean;
17
+ deleteSelected(): boolean;
18
+ deselect(): void;
19
+ private _ensureBVH;
20
+ private _getBuildingsMesh;
21
+ private _raycastBuildings;
22
+ private _findGroupBinary;
23
+ private _showTooltip;
24
+ private _hideTooltip;
25
+ private _clearHover;
26
+ private _showHighlight;
27
+ private _clearHighlight;
28
+ dispose(): void;
29
+ }
@@ -0,0 +1,2 @@
1
+ import type { CatalogCategory } from "./catalog-types";
2
+ export declare const CATALOG_DATA: CatalogCategory[];
@@ -0,0 +1,15 @@
1
+ export interface CatalogItem {
2
+ id: string;
3
+ name: string;
4
+ category: string;
5
+ icon: string;
6
+ geometryType: "box" | "cylinder" | "sphere" | "cone";
7
+ defaultScale: [number, number, number];
8
+ color: number;
9
+ }
10
+ export interface CatalogCategory {
11
+ id: string;
12
+ name: string;
13
+ icon: string;
14
+ items: CatalogItem[];
15
+ }
@@ -0,0 +1,11 @@
1
+ import type { EditorObject } from "../editor-object";
2
+ import type { ViralEditor } from "../viral-editor";
3
+ import type { EditorCommand } from "./editor-command";
4
+ export declare class AddObjectCommand implements EditorCommand {
5
+ private _editor;
6
+ private _editorObject;
7
+ readonly type = "add-object";
8
+ constructor(_editor: ViralEditor, _editorObject: EditorObject);
9
+ execute(): void;
10
+ undo(): void;
11
+ }
@@ -0,0 +1,11 @@
1
+ import type { EditorObject } from "../editor-object";
2
+ import type { ViralEditor } from "../viral-editor";
3
+ import type { EditorCommand } from "./editor-command";
4
+ export declare class DeleteObjectCommand implements EditorCommand {
5
+ private _editor;
6
+ private _editorObject;
7
+ readonly type = "delete-object";
8
+ constructor(_editor: ViralEditor, _editorObject: EditorObject);
9
+ execute(): void;
10
+ undo(): void;
11
+ }
@@ -0,0 +1,13 @@
1
+ import type { EditorCommand } from "./editor-command";
2
+ export declare class EditorCommandHistory {
3
+ onPush: (() => void) | null;
4
+ private _undoStack;
5
+ private _redoStack;
6
+ private _maxHistory;
7
+ get canUndo(): boolean;
8
+ get canRedo(): boolean;
9
+ push(command: EditorCommand): void;
10
+ undo(): boolean;
11
+ redo(): boolean;
12
+ clear(): void;
13
+ }
@@ -0,0 +1,5 @@
1
+ export interface EditorCommand {
2
+ readonly type: string;
3
+ execute(): void;
4
+ undo(): void;
5
+ }
@@ -0,0 +1,18 @@
1
+ import { Euler, Vector3 } from "three";
2
+ import type { EditorObject } from "../editor-object";
3
+ import type { ViralEditor } from "../viral-editor";
4
+ import type { EditorCommand } from "./editor-command";
5
+ export declare class TransformCommand implements EditorCommand {
6
+ private _editor;
7
+ private _editorObject;
8
+ readonly type = "transform";
9
+ private _beforePosition;
10
+ private _beforeRotation;
11
+ private _beforeScale;
12
+ private _afterPosition;
13
+ private _afterRotation;
14
+ private _afterScale;
15
+ constructor(_editor: ViralEditor, _editorObject: EditorObject, beforePosition: Vector3, beforeRotation: Euler, beforeScale: Vector3, afterPosition: Vector3, afterRotation: Euler, afterScale: Vector3);
16
+ execute(): void;
17
+ undo(): void;
18
+ }