vim-web 0.5.0-dev.9 → 0.6.0-dev.0

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 (89) hide show
  1. package/dist/style.css +34 -7
  2. package/dist/types/core-viewers/shared/index.d.ts +2 -0
  3. package/dist/types/core-viewers/shared/inputAdapter.d.ts +2 -1
  4. package/dist/types/core-viewers/shared/keyboardHandler.d.ts +1 -1
  5. package/dist/types/core-viewers/shared/loadResult.d.ts +55 -0
  6. package/dist/types/core-viewers/shared/mouseHandler.d.ts +4 -1
  7. package/dist/types/core-viewers/shared/raycaster.d.ts +5 -5
  8. package/dist/types/core-viewers/shared/vimCollection.d.ts +25 -0
  9. package/dist/types/core-viewers/ultra/loadRequest.d.ts +6 -28
  10. package/dist/types/core-viewers/ultra/viewer.d.ts +6 -1
  11. package/dist/types/core-viewers/ultra/viewport.d.ts +6 -0
  12. package/dist/types/core-viewers/ultra/vim.d.ts +3 -1
  13. package/dist/types/core-viewers/ultra/vimCollection.d.ts +15 -11
  14. package/dist/types/core-viewers/webgl/index.d.ts +0 -1
  15. package/dist/types/core-viewers/webgl/loader/index.d.ts +3 -3
  16. package/dist/types/core-viewers/webgl/loader/materials/index.d.ts +1 -0
  17. package/dist/types/core-viewers/webgl/loader/materials/pickingMaterial.d.ts +42 -0
  18. package/dist/types/core-viewers/webgl/loader/mesh.d.ts +3 -1
  19. package/dist/types/core-viewers/webgl/loader/progressive/insertableGeometry.d.ts +6 -1
  20. package/dist/types/core-viewers/webgl/loader/progressive/insertableMesh.d.ts +6 -3
  21. package/dist/types/core-viewers/webgl/loader/progressive/instancedMesh.d.ts +5 -0
  22. package/dist/types/core-viewers/webgl/loader/progressive/instancedMeshFactory.d.ts +8 -1
  23. package/dist/types/core-viewers/webgl/loader/progressive/legacyMeshFactory.d.ts +4 -1
  24. package/dist/types/core-viewers/webgl/loader/progressive/loadRequest.d.ts +21 -0
  25. package/dist/types/core-viewers/webgl/loader/progressive/subsetBuilder.d.ts +2 -1
  26. package/dist/types/core-viewers/webgl/loader/progressive/subsetRequest.d.ts +3 -2
  27. package/dist/types/core-viewers/webgl/loader/vim.d.ts +12 -2
  28. package/dist/types/core-viewers/webgl/loader/vimCollection.d.ts +78 -0
  29. package/dist/types/core-viewers/webgl/loader/vimSettings.d.ts +11 -4
  30. package/dist/types/core-viewers/webgl/viewer/camera/cameraMovement.d.ts +8 -0
  31. package/dist/types/core-viewers/webgl/viewer/gizmos/gizmoOrbit.d.ts +22 -17
  32. package/dist/types/core-viewers/webgl/viewer/gizmos/markers/gizmoMarker.d.ts +1 -0
  33. package/dist/types/core-viewers/webgl/viewer/raycaster.d.ts +3 -1
  34. package/dist/types/core-viewers/webgl/viewer/rendering/gpuPicker.d.ts +127 -0
  35. package/dist/types/core-viewers/webgl/viewer/rendering/renderScene.d.ts +2 -2
  36. package/dist/types/core-viewers/webgl/viewer/rendering/renderer.d.ts +7 -0
  37. package/dist/types/core-viewers/webgl/viewer/rendering/renderingSection.d.ts +4 -0
  38. package/dist/types/core-viewers/webgl/viewer/settings/viewerSettings.d.ts +11 -6
  39. package/dist/types/core-viewers/webgl/viewer/viewer.d.ts +16 -1
  40. package/dist/types/core-viewers/webgl/viewer/viewport.d.ts +1 -1
  41. package/dist/types/react-viewers/bim/bimPanel.d.ts +3 -3
  42. package/dist/types/react-viewers/controlbar/controlBarIds.d.ts +32 -36
  43. package/dist/types/react-viewers/errors/errorStyle.d.ts +1 -1
  44. package/dist/types/react-viewers/helpers/loadRequest.d.ts +14 -16
  45. package/dist/types/react-viewers/helpers/reactUtils.d.ts +2 -1
  46. package/dist/types/react-viewers/helpers/utils.d.ts +8 -0
  47. package/dist/types/react-viewers/panels/axesPanel.d.ts +2 -1
  48. package/dist/types/react-viewers/panels/index.d.ts +1 -0
  49. package/dist/types/react-viewers/panels/isolationPanel.d.ts +2 -0
  50. package/dist/types/react-viewers/panels/loadingBox.d.ts +1 -1
  51. package/dist/types/react-viewers/panels/messageBox.d.ts +2 -0
  52. package/dist/types/react-viewers/panels/sidePanel.d.ts +1 -1
  53. package/dist/types/react-viewers/settings/anySettings.d.ts +7 -0
  54. package/dist/types/react-viewers/settings/index.d.ts +1 -1
  55. package/dist/types/react-viewers/settings/settingsInputBox.d.ts +4 -0
  56. package/dist/types/react-viewers/settings/settingsItem.d.ts +30 -0
  57. package/dist/types/react-viewers/settings/settingsKeys.d.ts +46 -0
  58. package/dist/types/react-viewers/settings/settingsPanel.d.ts +5 -4
  59. package/dist/types/react-viewers/settings/settingsPanelContent.d.ts +6 -0
  60. package/dist/types/react-viewers/settings/settingsState.d.ts +11 -11
  61. package/dist/types/react-viewers/settings/settingsStorage.d.ts +3 -3
  62. package/dist/types/react-viewers/settings/settingsSubtitle.d.ts +2 -0
  63. package/dist/types/react-viewers/settings/settingsToggle.d.ts +11 -0
  64. package/dist/types/react-viewers/state/controlBarState.d.ts +41 -7
  65. package/dist/types/react-viewers/state/sharedIsolation.d.ts +2 -0
  66. package/dist/types/react-viewers/ultra/controlBar.d.ts +4 -1
  67. package/dist/types/react-viewers/ultra/index.d.ts +1 -0
  68. package/dist/types/react-viewers/ultra/settings.d.ts +13 -0
  69. package/dist/types/react-viewers/ultra/settingsPanel.d.ts +5 -0
  70. package/dist/types/react-viewers/ultra/viewer.d.ts +3 -1
  71. package/dist/types/react-viewers/ultra/viewerRef.d.ts +3 -0
  72. package/dist/types/react-viewers/urls.d.ts +0 -1
  73. package/dist/types/react-viewers/webgl/index.d.ts +1 -0
  74. package/dist/types/react-viewers/webgl/loading.d.ts +19 -24
  75. package/dist/types/react-viewers/webgl/settings.d.ts +36 -0
  76. package/dist/types/react-viewers/webgl/settingsPanel.d.ts +12 -0
  77. package/dist/types/react-viewers/webgl/viewer.d.ts +3 -3
  78. package/dist/types/react-viewers/webgl/viewerRef.d.ts +32 -8
  79. package/dist/types/utils/asyncQueue.d.ts +15 -0
  80. package/dist/types/utils/index.d.ts +1 -1
  81. package/dist/vim-web.iife.js +49873 -49090
  82. package/dist/vim-web.iife.js.map +1 -1
  83. package/dist/vim-web.js +49690 -48907
  84. package/dist/vim-web.js.map +1 -1
  85. package/package.json +1 -1
  86. package/dist/types/core-viewers/webgl/loader/progressive/open.d.ts +0 -12
  87. package/dist/types/core-viewers/webgl/loader/progressive/vimRequest.d.ts +0 -44
  88. package/dist/types/react-viewers/settings/settings.d.ts +0 -61
  89. package/dist/types/utils/result.d.ts +0 -13
package/dist/style.css CHANGED
@@ -733,8 +733,8 @@ video:where(.vim-component,.vim-component *) {
733
733
  .vc-top-4 {
734
734
  top: 1rem;
735
735
  }
736
- .vc-top-6 {
737
- top: 1.5rem;
736
+ .vc-top-8 {
737
+ top: 2rem;
738
738
  }
739
739
  .vc-top-\[10\%\] {
740
740
  top: 10%;
@@ -828,6 +828,9 @@ video:where(.vim-component,.vim-component *) {
828
828
  .vc-mt-6 {
829
829
  margin-top: 1.5rem;
830
830
  }
831
+ .vc-box-border {
832
+ box-sizing: border-box;
833
+ }
831
834
  .vc-box-content {
832
835
  box-sizing: content-box;
833
836
  }
@@ -987,6 +990,11 @@ video:where(.vim-component,.vim-component *) {
987
990
  margin-top: calc(0.25rem * calc(1 - var(--tw-space-y-reverse)));
988
991
  margin-bottom: calc(0.25rem * var(--tw-space-y-reverse));
989
992
  }
993
+ .vc-space-y-2 > :not([hidden]) ~ :not([hidden]) {
994
+ --tw-space-y-reverse: 0;
995
+ margin-top: calc(0.5rem * calc(1 - var(--tw-space-y-reverse)));
996
+ margin-bottom: calc(0.5rem * var(--tw-space-y-reverse));
997
+ }
990
998
  .vc-self-center {
991
999
  align-self: center;
992
1000
  }
@@ -1025,6 +1033,9 @@ video:where(.vim-component,.vim-component *) {
1025
1033
  .vc-rounded-md {
1026
1034
  border-radius: 0.375rem;
1027
1035
  }
1036
+ .vc-rounded-sm {
1037
+ border-radius: 0.125rem;
1038
+ }
1028
1039
  .vc-rounded-t {
1029
1040
  border-top-left-radius: 0.25rem;
1030
1041
  border-top-right-radius: 0.25rem;
@@ -1069,6 +1080,9 @@ video:where(.vim-component,.vim-component *) {
1069
1080
  --tw-border-opacity: 1;
1070
1081
  border-color: rgb(223 223 225 / var(--tw-border-opacity, 1));
1071
1082
  }
1083
+ .vc-border-gray {
1084
+ border-color: var(--c-gray);
1085
+ }
1072
1086
  .vc-border-gray-divider {
1073
1087
  border-color: var(--c-gray-divider);
1074
1088
  }
@@ -1120,6 +1134,9 @@ video:where(.vim-component,.vim-component *) {
1120
1134
  .vc-p-1 {
1121
1135
  padding: 0.25rem;
1122
1136
  }
1137
+ .vc-p-2 {
1138
+ padding: 0.5rem;
1139
+ }
1123
1140
  .vc-p-5 {
1124
1141
  padding: 1.25rem;
1125
1142
  }
@@ -1157,6 +1174,9 @@ video:where(.vim-component,.vim-component *) {
1157
1174
  .vc-pl-6 {
1158
1175
  padding-left: 1.5rem;
1159
1176
  }
1177
+ .vc-pr-2 {
1178
+ padding-right: 0.5rem;
1179
+ }
1160
1180
  .vc-text-center {
1161
1181
  text-align: center;
1162
1182
  }
@@ -1193,6 +1213,9 @@ video:where(.vim-component,.vim-component *) {
1193
1213
  .vc-font-bold {
1194
1214
  font-weight: 700;
1195
1215
  }
1216
+ .vc-font-medium {
1217
+ font-weight: 500;
1218
+ }
1196
1219
  .vc-font-normal {
1197
1220
  font-weight: 400;
1198
1221
  }
@@ -1284,6 +1307,11 @@ video:where(.vim-component,.vim-component *) {
1284
1307
  --tw-shadow-colored: 0 4px 6px -1px var(--tw-shadow-color), 0 2px 4px -2px var(--tw-shadow-color);
1285
1308
  box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow);
1286
1309
  }
1310
+ .vc-shadow-sm {
1311
+ --tw-shadow: 0 1px 2px 0 rgb(0 0 0 / 0.05);
1312
+ --tw-shadow-colored: 0 1px 2px 0 var(--tw-shadow-color);
1313
+ box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow);
1314
+ }
1287
1315
  .vc-outline-none {
1288
1316
  outline: 2px solid transparent;
1289
1317
  outline-offset: 2px;
@@ -1763,6 +1791,10 @@ video:where(.vim-component,.vim-component *) {
1763
1791
  }
1764
1792
 
1765
1793
  /* === Cursors ===*/
1794
+ .cursor-regular {
1795
+ cursor: default;
1796
+ }
1797
+
1766
1798
  .cursor-orbit:hover {
1767
1799
  cursor: url('data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48c3ZnIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB2aWV3Qm94PSIwIDAgMjQgMjQiPjxkZWZzPjxzdHlsZT4uY2xzLTF7ZmlsbDojZmZmO30uY2xzLTJ7ZmlsbDojMjEyMzI5O30uY2xzLTN7ZmlsbDpub25lO308L3N0eWxlPjwvZGVmcz48ZyBpZD0iRlJBTUVTIj48ZyBpZD0iZnJhbWUiPjxyZWN0IGNsYXNzPSJjbHMtMyIgd2lkdGg9IjI0IiBoZWlnaHQ9IjI0Ii8+PC9nPjwvZz48ZyBpZD0iSUNPTlMiPjxnPjxnPjxwYXRoIGNsYXNzPSJjbHMtMSIgZD0iTTE0LDIwLjIzNGMtNS42NTIsMC0xMC4yNS0yLjYzNi0xMC4yNS01Ljg3NSwwLTEuNzUxLDEuMzA2LTMuMzY2LDMuNjA0LTQuNDgtLjUwOC0uMzEyLS43MDYtLjk2Mi0uNDQtMS40ODgsLjE5NC0uMzg2LC41ODItLjYyNSwxLjAxLS42MjUsLjE0MiwwLC4yODIsLjAyNiwuNDE2LC4wNzlsLjA5NywuMDQyLDIuMTQ4LDEuMDg2Yy42OSwuMzQ5LC45NjksMS4xOTUsLjYyLDEuODg2bC0xLjA4MywyLjE0NWMtLjE5NSwuMzg2LS41ODIsLjYyNS0xLjAxMiwuNjI1LS4xNDEsMC0uMjgtLjAyNS0uNDE0LS4wNzdsLS4wOTgtLjA0NGMtLjU1LS4yNzgtLjY3OC0uODI4LS41NjctMS4zMDYtLjAyMSwuMDExLS4wNDEsLjAyMS0uMDYsLjAzMy0xLjE1NiwuNjUtMS44NDYsMS40NDQtMS44NDYsMi4xMjVzLjY5LDEuNDc2LDEuODQ2LDIuMTI2YzEuNTUzLC44NzMsMy43NTEsMS4zNzQsNi4wMjksMS4zNzRzNC40NzYtLjUwMSw2LjAyOS0xLjM3NGMxLjE1Ni0uNjUsMS44NDYtMS40NDUsMS44NDYtMi4xMjZzLS42OS0xLjQ3NS0xLjg0Ni0yLjEyNWMtMS41NTMtLjg3NC0zLjc1LTEuMzc1LTYuMDI5LTEuMzc1aC0uMTAyYy0uNjI0LDAtMS4xMzItLjQ1Ni0xLjE5Ni0xLjA2Mi0uMDM1LS4zMzQsLjA3My0uNjY4LC4yOTYtLjkxNywuMjIzLS4yNDgsLjU0Mi0uMzkzLC44NzUtLjM5NWguMTI2YzUuNjUyLDAsMTAuMjUsMi42MzUsMTAuMjUsNS44NzRzLTQuNTk4LDUuODc1LTEwLjI1LDUuODc1WiIvPjxwYXRoIGQ9Ik03LjkyNSw4LjAxNmMuMTA4LDAsLjIxNywuMDIsLjMyMywuMDYxLC4wMjYsLjAxMSwuMDUyLC4wMjIsLjA3OCwuMDM1bDIuMTQ1LDEuMDgzYy41NjgsLjI4NywuNzk3LC45ODIsLjUxLDEuNTVsLTEuMDgzLDIuMTQ2Yy0uMTU1LC4zMDgtLjQ2MywuNDg3LS43ODgsLjQ4Ny0uMTA4LDAtLjIxNy0uMDItLjMyNC0uMDYyLS4wMjYtLjAxLS4wNTItLjAyMi0uMDc4LS4wMzUtLjUxMi0uMjU5LS41MzEtLjc5MS0uMzkxLTEuMTY4bC4xNTItLjQxMWMtLjIxNiwuMDk5LS40MjUsLjIwMy0uNjIyLC4zMTMtMS4yNTQsLjcwNi0xLjk3MywxLjU2LTEuOTczLDIuMzQzcy43MTksMS42MzgsMS45NzMsMi4zNDNjMS41ODksLjg5NCwzLjgzMiwxLjQwNyw2LjE1MiwxLjQwN3M0LjU2Mi0uNTEzLDYuMTUyLTEuNDA3YzEuMjU0LS43MDUsMS45NzMtMS41NTksMS45NzMtMi4zNDNzLS43MTktMS42MzgtMS45NzMtMi4zNDNjLTEuNTg5LS44OTQtMy44MzItMS40MDctNi4xNTItMS40MDctLjAzNiwwLS4wNzMsMC0uMTA5LDBoLS4wMDhjLS40OCwwLS44ODMtLjM2Mi0uOTMyLS44NC0uMDU3LS41NSwuMzcyLTEuMDMxLC45MjUtMS4wMzUsLjA0MSwwLC4wODMsMCwuMTI0LDAsNS41MjMsMCwxMCwyLjUxOSwxMCw1LjYyNXMtNC40NzcsNS42MjUtMTAsNS42MjUtMTAtMi41MTgtMTAtNS42MjVjMC0xLjgxNywxLjUzMi0zLjQzMiwzLjkwOS00LjQ2bC0uMDA0LS4wMTEtLjM2Ni0uMTkxYy0uNDM4LS4yMjktLjYxOS0uNzY1LS40MDItMS4xOTQsLjE1Ni0uMzA4LC40NjQtLjQ4NywuNzg4LS40ODdtMC0uNWgwYy0uNTI0LDAtLjk5NywuMjkyLTEuMjM0LC43NjItLjI2MSwuNTE4LS4xNTcsMS4xMzEsLjIxNCwxLjU0OS0yLjE3NiwxLjE1MS0zLjQwNSwyLjc3Mi0zLjQwNSw0LjUzMywwLDMuNDM1LDQuNjEyLDYuMTI1LDEwLjUsNi4xMjVzMTAuNS0yLjY5LDEwLjUtNi4xMjUtNC42MTItNi4xMjUtMTAuNS02LjEyNWgtLjA2NXMtLjA1OSwwLS4wNTksMGMtLjQwNywuMDAzLS43OTMsLjE3Ny0xLjA2MywuNDc5LS4yNywuMzAyLS40MDEsLjcwNi0uMzU5LDEuMTA4LC4wNzYsLjczNCwuNjkxLDEuMjg4LDEuNDMsMS4yODhoLjA2NXMuMDUxLDAsLjA1MSwwYzIuMjM3LDAsNC4zOSwuNDg5LDUuOTA3LDEuMzQyLDEuMDc2LC42MDUsMS43MTgsMS4zMTksMS43MTgsMS45MDhzLS42NDIsMS4zMDItMS43MTgsMS45MDdjLTEuNTE3LC44NTQtMy42NywxLjM0My01LjkwNywxLjM0M3MtNC4zOS0uNDg5LTUuOTA3LTEuMzQyYy0xLjA3Ni0uNjA1LTEuNzE4LTEuMzE4LTEuNzE4LTEuOTA4LDAtLjUyMywuNTA3LTEuMTQ0LDEuMzc0LTEuNzAxLC4wMzgsLjQyMiwuMjU2LC44MjgsLjczNCwxLjA3LC4wNDIsLjAyMSwuMDgyLC4wMzksLjEyMSwuMDU0LC4xNjMsLjA2NCwuMzMzLC4wOTYsLjUwNiwuMDk2LC41MjQsMCwuOTk3LS4yOTIsMS4yMzQtLjc2MmwxLjA4My0yLjE0NWMuMTk5LS4zOTQsLjIzMy0uODQyLC4wOTQtMS4yNjJzLS40MzEtLjc2MS0uODI1LS45NmwtMi4xNDYtMS4wODNjLS4wMzUtLjAxOC0uMDc0LS4wMzUtLjExMy0uMDUxLS4xNzEtLjA2Ny0uMzQxLS4wOTktLjUxMy0uMDk5aDBaIi8+PC9nPjxnPjxjaXJjbGUgY2xhc3M9ImNscy0xIiBjeD0iMTQiIGN5PSIxNC4zNTkiIHI9IjIuNDM4Ii8+PHBhdGggZD0iTTE0LDEyLjE3MmMxLjIwNiwwLDIuMTg4LC45ODEsMi4xODgsMi4xODhzLS45ODEsMi4xODgtMi4xODgsMi4xODgtMi4xODgtLjk4MS0yLjE4OC0yLjE4OCwuOTgxLTIuMTg4LDIuMTg4LTIuMTg4bTAtLjVjLTEuNDgyLDAtMi42ODgsMS4yMDYtMi42ODgsMi42ODhzMS4yMDYsMi42ODgsMi42ODgsMi42ODgsMi42ODgtMS4yMDYsMi42ODgtMi42ODgtMS4yMDYtMi42ODgtMi42ODgtMi42ODhoMFoiLz48L2c+PC9nPjxnPjxwYXRoIGNsYXNzPSJjbHMtMSIgZD0iTTEuMDA3LDUuNzVjLS4zNzIsMC0uNzU3LS4yODEtLjc1Ny0uNzUyVjFDLjI1LC41ODcsLjU4NiwuMjUsMSwuMjVoMy45OThjLjM2OSwwLC42LC4yMzksLjY5MywuNDYzcy4wOTksLjU1Ny0uMTYzLC44MTdMMS41Myw1LjUyOGMtLjE4MywuMTg0LS4zODYsLjIyMi0uNTIzLC4yMjJaIi8+PHBhdGggY2xhc3M9ImNscy0yIiBkPSJNNC45OTgsLjVjLjMxLDAsLjQzMiwuMjM2LC40NjIsLjMwOXMuMTExLC4zMjYtLjEwOCwuNTQ1TDEuMzU0LDUuMzUyYy0uMTIzLC4xMjMtLjI1NiwuMTQ4LS4zNDYsLjE0OC0uMjUsMC0uNTA3LS4xODgtLjUwNy0uNTAyVjFjMC0uMjc2LC4yMjQtLjUsLjUtLjVoMy45OThtMC0uNUgxQy40NDgsMCwwLC40NDgsMCwxdjMuOTk4YzAsLjYwMywuNDkzLDEuMDAyLDEuMDA3LDEuMDAyLC4yNDYsMCwuNDk2LS4wOTEsLjctLjI5NUw1LjcwNSwxLjcwN2MuNjMtLjYzLC4xODQtMS43MDctLjcwNy0xLjcwN2gwWiIvPjwvZz48L2c+PC9zdmc+'),
1768
1800
  auto;
@@ -1778,11 +1810,6 @@ video:where(.vim-component,.vim-component *) {
1778
1810
  auto;
1779
1811
  }
1780
1812
 
1781
- .cursor-pan:active {
1782
- cursor: url('data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48c3ZnIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB2aWV3Qm94PSIwIDAgMjQgMjQiPjxkZWZzPjxzdHlsZT4uY2xzLTF7ZmlsbDojZmZmO30uY2xzLTJ7ZmlsbDojMjEyMzI5O30uY2xzLTN7ZmlsbDpub25lO308L3N0eWxlPjwvZGVmcz48ZyBpZD0iRlJBTUVTIj48ZyBpZD0iZnJhbWUiPjxyZWN0IGNsYXNzPSJjbHMtMyIgd2lkdGg9IjI0IiBoZWlnaHQ9IjI0Ii8+PC9nPjwvZz48ZyBpZD0iSUNPTlMiPjxnPjxwYXRoIGNsYXNzPSJjbHMtMSIgZD0iTTEuMDA3LDUuNzVjLS4zNzIsMC0uNzU3LS4yODEtLjc1Ny0uNzUyVjFDLjI1LC41ODcsLjU4NiwuMjUsMSwuMjVoMy45OThjLjM2OSwwLC42LC4yMzksLjY5MywuNDYzcy4wOTksLjU1Ny0uMTYzLC44MTdMMS41Myw1LjUyOGMtLjE4MywuMTg0LS4zODYsLjIyMi0uNTIzLC4yMjJaIi8+PHBhdGggY2xhc3M9ImNscy0yIiBkPSJNNC45OTgsLjVjLjMxLDAsLjQzMiwuMjM2LC40NjIsLjMwOXMuMTExLC4zMjYtLjEwOCwuNTQ1TDEuMzU0LDUuMzUyYy0uMTIzLC4xMjMtLjI1NiwuMTQ4LS4zNDYsLjE0OC0uMjUsMC0uNTA3LS4xODgtLjUwNy0uNTAyVjFjMC0uMjc2LC4yMjQtLjUsLjUtLjVoMy45OThtMC0uNUgxQy40NDgsMCwwLC40NDgsMCwxdjMuOTk4YzAsLjYwMywuNDkzLDEuMDAyLDEuMDA3LDEuMDAyLC4yNDYsMCwuNDk2LS4wOTEsLjctLjI5NUw1LjcwNSwxLjcwN2MuNjMtLjYzLC4xODQtMS43MDctLjcwNy0xLjcwN2gwWiIvPjwvZz48Zz48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Ik0xNC4xMzksMjMuMDYyYy0xLjY0NywwLTMuMTUzLS43OTMtNC4wMy0yLjEyMmwtMi4xNTktMy4yOTFjLS4yMDktLjMxOS0uMjc1LS42OTUtLjE4Ny0xLjA2MSwuMDg5LS4zNjYsLjMyMi0uNjc3LC42NTYtLjg3NiwuMjM1LS4xNCwuNTA1LS4yMTQsLjc4MS0uMjE0LC4wOCwwLC4xNjEsLjAwNiwuMjQxLC4wMTlsLjU3MiwuMDl2LTMuNjg3YzAtLjY0MiwuNTEzLTEuMTY5LDEuMTY5LTEuMiwuMDIxLDAsLjA0MS0uMDAxLC4wNjItLjAwMSwuNjc4LDAsMS4yMywuNTI2LDEuMjMsMS4xNzJ2LjM5MWMwLC4wODYsLjA3NCwuMTU2LC4xNjQsLjE1NnMuMTY0LS4wNywuMTY0LS4xNTZ2LTEuMjk5YzAtLjY0MiwuNTEzLTEuMTY5LDEuMTY5LTEuMiwuMDIxLDAsLjA0MS0uMDAxLC4wNjItLjAwMSwuNjc4LDAsMS4yMywuNTI2LDEuMjMsMS4xNzJ2MS40ODRjMCwuMDg2LC4wNzQsLjE1NiwuMTY0LC4xNTZzLjE2NC0uMDcsLjE2NC0uMTU2di0uODNjMC0uNjQyLC41MTMtMS4xNjksMS4xNjktMS4yLC4wMjEsMCwuMDQxLS4wMDEsLjA2Mi0uMDAxLC42NzgsMCwxLjIzLC41MjYsMS4yMywxLjE3MnYxLjAxNmMwLC4wODYsLjA3NCwuMTU2LC4xNjQsLjE1NnMuMTY0LS4wNywuMTY0LS4xNTZ2LS4zNjFjMC0uNjQyLC41MTMtMS4xNjksMS4xNjktMS4yLC4wMjEsMCwuMDQxLS4wMDEsLjA2Mi0uMDAxLC42NzgsMCwxLjIzLC41MjYsMS4yMywxLjE3MnY2LjMyOGMwLDIuNDk5LTIuMTM0LDQuNTMxLTQuNzU4LDQuNTMxaC0xLjk0NFoiLz48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Ik0yMC42NzcsMTIuOTA2djUuNjI1YzAsMi40MTYtMi4wNTcsNC4zNzUtNC41OTQsNC4zNzVoLTEuOTQ0Yy0xLjU5LDAtMy4wNDUtLjc2Ni0zLjg5MS0yLjA0OWwtMi4xNTktMy4yOWMtLjE4Ni0uMjgzLS4yNDUtLjYxOC0uMTY2LS45NDQsLjA3OS0uMzI1LC4yODYtLjYwMiwuNTgzLS43NzksLjIwOS0uMTI0LC40NDktLjE5LC42OTQtLjE5LC4wNzEsMCwuMTQzLC4wMDYsLjIxNCwuMDE3bC43NjMsLjExOXYtLjczNnMwLTMuMTM0LDAtMy4xMzRjMC0uNTQ2LC40NC0xLjAxNywxLjAxMy0xLjA0NCwuNjEyLS4wMjksMS4xMiwuNDM3LDEuMTIsMS4wMTR2LjM5MWMwLC4xNzMsLjE0NywuMzEyLC4zMjgsLjMxMmgwYy4xODEsMCwuMzI4LS4xNCwuMzI4LS4zMTJ2LTEuMjk5YzAtLjU0NiwuNDQtMS4wMTcsMS4wMTMtMS4wNDQsLjYxMi0uMDI5LDEuMTIsLjQzNywxLjEyLDEuMDE0djEuNDg0YzAsLjE3MywuMTQ3LC4zMTIsLjMyOCwuMzEyaDBjLjE4MSwwLC4zMjgtLjE0LC4zMjgtLjMxMnYtLjgzYzAtLjU0NiwuNDQtMS4wMTcsMS4wMTMtMS4wNDQsLjYxMi0uMDI5LDEuMTIsLjQzNywxLjEyLDEuMDE0djEuMDE2YzAsLjE3MywuMTQ3LC4zMTIsLjMyOCwuMzEyaDBjLjE4MSwwLC4zMjgtLjE0LC4zMjgtLjMxMnYtLjM2MWMwLS41NDYsLjQ0LTEuMDE3LDEuMDEzLTEuMDQ0LC42MTItLjAyOSwxLjEyLC40MzcsMS4xMiwxLjAxNHYuNzAzWiIvPjxwYXRoIGQ9Ik0yMS4zMzMsMTIuMjAzYzAtLjkwNi0uNzcxLTEuNjQxLTEuNzIzLTEuNjQxLS40NTUsMC0uODY4LC4xNjktMS4xNzYsLjQ0NC0uMjQ0LS42MjQtLjg3My0xLjA2OS0xLjYxMy0xLjA2OWgwYy0uNDU1LDAtLjg2OCwuMTY5LTEuMTc2LC40NDQtLjI0NC0uNjI0LS44NzMtMS4wNjktMS42MTMtMS4wNjktLjgzNSwwLTEuNTMsLjU2Ni0xLjY4OSwxLjMxNi0uMjk4LS4yMzYtLjY4Mi0uMzc5LTEuMS0uMzc5aDBjLS45NTEsMC0xLjcyMywuNzM1LTEuNzIzLDEuNjQxdjMuMTY0Yy0uMTA2LS4wMTctLjIxMy0uMDI1LS4zMjEtLjAyNS0uMzU2LDAtLjcxNywuMDkyLTEuMDQxLC4yODUtLjkyMiwuNTQ5LTEuMjAzLDEuNzA2LS42MjYsMi41ODRsMi4xNTksMy4yOWMuOTI5LDEuNDA3LDIuNTc0LDIuMzQzLDQuNDQ4LDIuMzQzaDEuOTQ0YzIuOSwwLDUuMjUtMi4yMzksNS4yNS01di02LjMyOFptLS42NTYsLjcwM3Y1LjYyNWMwLDIuNDE2LTIuMDU3LDQuMzc1LTQuNTk0LDQuMzc1aC0xLjk0NGMtMS41OSwwLTMuMDQ1LS43NjYtMy44OTEtMi4wNDlsLTIuMTU5LTMuMjljLS4xODYtLjI4My0uMjQ1LS42MTgtLjE2Ni0uOTQ0LC4wNzktLjMyNSwuMjg2LS42MDIsLjU4My0uNzc5LC4yMDktLjEyNCwuNDQ5LS4xOSwuNjk0LS4xOSwuMDcxLDAsLjE0MywuMDA2LC4yMTQsLjAxN2wuNzYzLC4xMTl2LS43MzZzMC0zLjEzNCwwLTMuMTM0YzAtLjU0NiwuNDQtMS4wMTcsMS4wMTMtMS4wNDQsLjYxMi0uMDI5LDEuMTIsLjQzNywxLjEyLDEuMDE0di4zOTFjMCwuMTczLC4xNDcsLjMxMiwuMzI4LC4zMTJoMGMuMTgxLDAsLjMyOC0uMTQsLjMyOC0uMzEydi0xLjI5OWMwLS41NDYsLjQ0LTEuMDE3LDEuMDEzLTEuMDQ0LC42MTItLjAyOSwxLjEyLC40MzcsMS4xMiwxLjAxNHYxLjQ4NGMwLC4xNzMsLjE0NywuMzEyLC4zMjgsLjMxMmgwYy4xODEsMCwuMzI4LS4xNCwuMzI4LS4zMTJ2LS44M2MwLS41NDYsLjQ0LTEuMDE3LDEuMDEzLTEuMDQ0LC42MTItLjAyOSwxLjEyLC40MzcsMS4xMiwxLjAxNHYxLjAxNmMwLC4xNzMsLjE0NywuMzEyLC4zMjgsLjMxMmgwYy4xODEsMCwuMzI4LS4xNCwuMzI4LS4zMTJ2LS4zNjFjMC0uNTQ2LC40NC0xLjAxNywxLjAxMy0xLjA0NCwuNjEyLS4wMjksMS4xMiwuNDM3LDEuMTIsMS4wMTR2LjcwM1oiLz48L2c+PC9nPjwvc3ZnPg=='),
1783
- auto;
1784
- }
1785
-
1786
1813
  .cursor-zoom:hover {
1787
1814
  cursor: url('data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB3aWR0aD0iMjQiIGhlaWdodD0iMjQiIHZpZXdCb3g9IjAgMCAyNCAyNCI+DQogIDxnIGlkPSJhIiBkYXRhLW5hbWU9IkZSQU1FUyI+DQogICAgPGcgaWQ9ImIiIGRhdGEtbmFtZT0iZnJhbWUiPg0KICAgICAgPHJlY3Qgd2lkdGg9IjI0IiBoZWlnaHQ9IjI0IiBmaWxsPSJub25lIi8+DQogICAgPC9nPg0KICA8L2c+DQogIDxnIGlkPSJjIiBkYXRhLW5hbWU9IklDT05TIj4NCiAgICA8cGF0aCBpZD0iZCIgZGF0YS1uYW1lPSJQYXRoIDE1MDc4IiBkPSJNMTQsNC43ODFjLS4wNTYsMC0uMTEyLC4wMDMtLjE2NywuMDA4cy0uMTExLC4wMTMtLjE2NSwuMDI0LS4xMDgsLjAyNC0uMTYxLC4wMzljLS4wNTMsLjAxNi0uMTA0LC4wMzQtLjE1NSwuMDU1bC00LjIyMSwxLjc2Yy0uMTU0LC4wNjMtLjI5NiwuMTUzLS40MTksLjI2NS0uMTA4LC4wOTktLjE5MywuMjE5LS4yNTEsLjM1Mi0uMDU0LC4xMjUtLjA3NiwuMjYxLS4wNjUsLjM5NywuMDE0LC4xNDIsLjA2NCwuMjc3LC4xNDUsLjM5NCwuMDU5LC4wODYsLjEzMSwuMTYzLC4yMTIsLjIyOCwuMDg1LC4wNjgsLjE3OSwuMTI1LC4yNzgsLjE2OSwuMTA0LC4wNDcsLjIxMywuMDgyLC4zMjUsLjEwNSwuMTE2LC4wMjQsLjIzNCwuMDM2LC4zNTIsLjAzNiwuMDU3LDAsLjExNC0uMDAzLC4xNzItLjAwOHMuMTE1LS4wMTQsLjE3MS0uMDI1Yy4wNTctLjAxMSwuMTEzLS4wMjUsLjE2OS0uMDQyLC4wNTYtLjAxNywuMTExLS4wMzcsLjE2NS0uMDZsMi4yNTgtLjk2NS0uNzcsMTEuOTU2LTMuMzA3LTEuNzE3Yy0uMDU5LS4wMy0uMTE5LS4wNTctLjE4MS0uMDgtLjA2Mi0uMDIzLS4xMjUtLjA0MS0uMTg5LS4wNTYtLjA2NC0uMDE1LS4xMjgtLjAyNi0uMTkzLS4wMzMtLjA2NS0uMDA3LS4xMy0uMDExLS4xOTYtLjAxMS0uMTI3LDAtLjI1NCwuMDE0LS4zNzgsLjA0LS4xMjQsLjAyNi0uMjQ0LC4wNjYtLjM1OSwuMTE4LS4xMTQsLjA1Mi0uMjIzLC4xMTYtLjMyMiwuMTkzLS4xLC4wNzYtLjE4OSwuMTY1LS4yNjYsLjI2NC0uMTExLC4xNDEtLjE5MSwuMzA0LS4yMzQsLjQ3OS0uMDM5LC4xNjItLjA0LC4zMzEtLjAwNCwuNDk0LC4wMzcsLjE2NSwuMTExLC4zMTksLjIxNiwuNDUyLC4xMTUsLjE0NSwuMjYsLjI2NSwuNDI1LC4zNTFsNi4zMDksMy4zNjhjLjA2MiwuMDMzLC4xMjYsLjA2MiwuMTkyLC4wODcsLjA2NiwuMDI1LC4xMzMsLjA0NiwuMjAxLC4wNjIsLjI3NCwuMDY2LC41NiwuMDY2LC44MzQsMCwuMDY4LS4wMTcsLjEzNS0uMDM3LC4yMDEtLjA2MiwuMDY2LS4wMjUsLjEzLS4wNTQsLjE5Mi0uMDg3bDYuMzA3LTMuMzY4Yy4xNjQtLjA4NiwuMzA5LS4yMDYsLjQyNC0uMzUxLC4xMDUtLjEzMywuMTc4LS4yODcsLjIxNi0uNDUyLC4wMzYtLjE2MywuMDM1LS4zMzItLjAwNC0uNDk0LS4wNDMtLjE3NC0uMTIyLS4zMzgtLjIzNC0uNDc5LS4wNzctLjA5OS0uMTY3LS4xODgtLjI2Ni0uMjY0LS4xLS4wNzYtLjIwOC0uMTQxLS4zMjItLjE5My0uMTE1LS4wNTItLjIzNi0uMDkyLS4zNTktLjExOC0uMTI0LS4wMjctLjI1MS0uMDQtLjM3OC0uMDQtLjA2NSwwLS4xMzEsLjAwNC0uMTk2LC4wMTEtLjA2NSwuMDA3LS4xMywuMDE4LS4xOTMsLjAzMy0uMDY0LC4wMTUtLjEyNywuMDM0LS4xODksLjA1Ni0uMDYyLC4wMjMtLjEyMiwuMDQ5LS4xODEsLjA4bC0zLjMwNywxLjcxNy0uNzcyLTExLjk1NywyLjI1OCwuOTY1Yy4wNTQsLjAyMywuMTA5LC4wNDMsLjE2NSwuMDYsLjA1NiwuMDE3LC4xMTIsLjAzMSwuMTY5LC4wNDIsLjA1NywuMDExLC4xMTQsLjAyLC4xNzEsLjAyNXMuMTE1LC4wMDgsLjE3MiwuMDA4Yy4xMTgsMCwuMjM2LS4wMTIsLjM1Mi0uMDM2LC4xMTItLjAyMywuMjIxLS4wNTgsLjMyNS0uMTA1LC4wOTktLjA0NCwuMTkzLS4xMDEsLjI3OC0uMTY5LC4wODItLjA2NSwuMTUzLS4xNDIsLjIxMi0uMjI4LC4wODEtLjExNywuMTMxLS4yNTMsLjE0NS0uMzk0LC4wMTItLjEzNS0uMDExLS4yNzEtLjA2NC0uMzk2LS4wNTgtLjEzNC0uMTQ0LS4yNTQtLjI1Mi0uMzUyLS4xMjMtLjExMi0uMjY1LS4yMDItLjQxOS0uMjY1bC00LjIyMS0xLjc2MWMtLjA1MS0uMDIxLS4xMDItLjA0LS4xNTUtLjA1NS0uMDUyLS4wMTYtLjEwNi0uMDI5LS4xNjEtLjAzOXMtLjEwOS0uMDE4LS4xNjUtLjAyNC0uMTExLS4wMDgtLjE2Ny0uMDA4IiBmaWxsPSIjZmZmIiBzdHJva2U9IiMwMDAiIHN0cm9rZS1taXRlcmxpbWl0PSIxMCIgc3Ryb2tlLXdpZHRoPSIuNSIvPg0KICAgIDxnPg0KICAgICAgPHBhdGggZD0iTTEuMDA3LDUuNzVjLS4zNzIsMC0uNzU3LS4yODEtLjc1Ny0uNzUyVjFDLjI1LC41ODcsLjU4NiwuMjUsMSwuMjVoMy45OThjLjM2OSwwLC42LC4yMzksLjY5MywuNDYzcy4wOTksLjU1Ny0uMTYzLC44MTdMMS41Myw1LjUyOGMtLjE4MywuMTg0LS4zODYsLjIyMi0uNTIzLC4yMjJaIiBmaWxsPSIjZmZmIi8+DQogICAgICA8cGF0aCBkPSJNNC45OTgsLjVjLjMxLDAsLjQzMiwuMjM2LC40NjIsLjMwOXMuMTExLC4zMjYtLjEwOCwuNTQ1TDEuMzU0LDUuMzUyYy0uMTIzLC4xMjMtLjI1NiwuMTQ4LS4zNDYsLjE0OC0uMjUsMC0uNTA3LS4xODgtLjUwNy0uNTAyVjFjMC0uMjc2LC4yMjQtLjUsLjUtLjVoMy45OThtMC0uNUgxQy40NDgsMCwwLC40NDgsMCwxdjMuOTk4YzAsLjYwMywuNDkzLDEuMDAyLDEuMDA3LDEuMDAyLC4yNDYsMCwuNDk2LS4wOTEsLjctLjI5NUw1LjcwNSwxLjcwN2MuNjMtLjYzLC4xODQtMS43MDctLjcwNy0xLjcwN2gwWiIgZmlsbD0iIzIxMjMyOSIvPg0KICAgIDwvZz4NCiAgPC9nPg0KPC9zdmc+'),
1788
1815
  auto;
@@ -1,4 +1,5 @@
1
1
  export * from './inputHandler';
2
+ export * from './loadResult';
2
3
  export { PointerMode } from './inputHandler';
3
4
  export type * from './baseInputHandler';
4
5
  export type * from './keyboardHandler';
@@ -7,3 +8,4 @@ export type * from './raycaster';
7
8
  export type * from './selection';
8
9
  export type * from './touchHandler';
9
10
  export type * from './vim';
11
+ export type * from './vimCollection';
@@ -2,6 +2,7 @@ import * as THREE from 'three';
2
2
  export interface IInputAdapter {
3
3
  init: () => void;
4
4
  toggleOrthographic: () => void;
5
+ toggleCameraOrbitMode: () => void;
5
6
  resetCamera: () => void;
6
7
  clearSelection: () => void;
7
8
  frameCamera: () => void;
@@ -17,5 +18,5 @@ export interface IInputAdapter {
17
18
  mouseMove: (pos: THREE.Vector2) => void;
18
19
  selectAtPointer: (pos: THREE.Vector2, add: boolean) => void;
19
20
  frameAtPointer: (pos: THREE.Vector2) => void;
20
- zoom: (value: number) => void;
21
+ zoom: (value: number, pos?: THREE.Vector2) => void;
21
22
  }
@@ -72,7 +72,7 @@ export declare class KeyboardHandler extends BaseInputHandler {
72
72
  * @param code The event.code of the key.
73
73
  * @param handler Callback invoked on key up.
74
74
  */
75
- registerKeyUp(code: string, mode: CallbackMode, handler: () => void): void;
75
+ registerKeyUp(code: string | string[], mode: CallbackMode, handler: () => void): void;
76
76
  private registerKey;
77
77
  /**
78
78
  * Internal key down event handler.
@@ -0,0 +1,55 @@
1
+ export interface ILoadSuccess<T> {
2
+ readonly isSuccess: true;
3
+ readonly isError: false;
4
+ readonly vim: T;
5
+ }
6
+ export interface ILoadError {
7
+ readonly isSuccess: false;
8
+ readonly isError: true;
9
+ readonly error: string;
10
+ readonly details?: string;
11
+ }
12
+ export type ProgressType = 'bytes' | 'percent';
13
+ export interface IProgress {
14
+ type: ProgressType;
15
+ current: number;
16
+ total?: number;
17
+ }
18
+ export type LoadResult<TValue, TError extends ILoadError = ILoadError> = ILoadSuccess<TValue> | TError;
19
+ export declare class LoadSuccess<T> implements ILoadSuccess<T> {
20
+ readonly vim: T;
21
+ readonly isSuccess: true;
22
+ readonly isError: false;
23
+ constructor(vim: T);
24
+ }
25
+ export declare class LoadError implements ILoadError {
26
+ readonly error: string;
27
+ readonly details?: string;
28
+ readonly isSuccess: false;
29
+ readonly isError: true;
30
+ constructor(error: string, details?: string);
31
+ }
32
+ /**
33
+ * Interface for load requests that can be used as a type constraint.
34
+ */
35
+ export interface ILoadRequest<TVim, TError extends ILoadError = ILoadError> {
36
+ readonly isCompleted: boolean;
37
+ getProgress(): AsyncGenerator<IProgress>;
38
+ getResult(): Promise<LoadResult<TVim, TError>>;
39
+ abort(): void;
40
+ }
41
+ /**
42
+ * Base class for loading requests that provides progress tracking via AsyncQueue.
43
+ * Both WebGL and Ultra extend this class with their specific loading logic.
44
+ */
45
+ export declare class LoadRequest<TVim, TError extends ILoadError = ILoadError> implements ILoadRequest<TVim, TError> {
46
+ private _progressQueue;
47
+ private _result;
48
+ private _resultPromise;
49
+ get isCompleted(): boolean;
50
+ getProgress(): AsyncGenerator<IProgress>;
51
+ getResult(): Promise<LoadResult<TVim, TError>>;
52
+ pushProgress(progress: IProgress): void;
53
+ complete(result: LoadResult<TVim, TError>): void;
54
+ abort(): void;
55
+ }
@@ -6,19 +6,22 @@ export declare class MouseHandler extends BaseInputHandler {
6
6
  private _capture;
7
7
  private _dragHandler;
8
8
  private _doubleClickHandler;
9
+ private _clickHandler;
9
10
  onButtonDown: (pos: THREE.Vector2, button: number) => void;
10
11
  onButtonUp: (pos: THREE.Vector2, button: number) => void;
11
12
  onMouseMove: (event: THREE.Vector2) => void;
12
13
  onDrag: DragCallback;
13
14
  onClick: (position: THREE.Vector2, ctrl: boolean) => void;
14
15
  onDoubleClick: (position: THREE.Vector2) => void;
15
- onWheel: (value: number, ctrl: boolean) => void;
16
+ onWheel: (value: number, ctrl: boolean, pos: THREE.Vector2) => void;
17
+ onContextMenu: (position: THREE.Vector2) => void;
16
18
  constructor(canvas: HTMLCanvasElement);
17
19
  protected addListeners(): void;
18
20
  dispose(): void;
19
21
  private handlePointerDown;
20
22
  private handlePointerUp;
21
23
  private handleMouseClick;
24
+ private handleContextMenu;
22
25
  private handlePointerMove;
23
26
  private handleDoubleClick;
24
27
  private onMouseScroll;
@@ -15,13 +15,13 @@ export interface IRaycaster<T> {
15
15
  /**
16
16
  * Raycasts from camera to the screen position to find the first object hit.
17
17
  * @param position - The screen position to raycast from.
18
- * @returns A promise that resolves to the raycast result.
18
+ * @returns A promise that resolves to the raycast result, or undefined if no hit.
19
19
  */
20
- raycastFromScreen(position: THREE.Vector2): Promise<IRaycastResult<T>>;
20
+ raycastFromScreen(position: THREE.Vector2): Promise<IRaycastResult<T> | undefined>;
21
21
  /**
22
22
  * Raycasts from camera to world position to find the first object hit.
23
- * @param position - The world position to raycast from.
24
- * @returns A promise that resolves to the raycast result.
23
+ * @param position - The world position to raycast through.
24
+ * @returns A promise that resolves to the raycast result, or undefined if no hit.
25
25
  */
26
- raycastFromWorld(position: THREE.Vector3): Promise<IRaycastResult<T>>;
26
+ raycastFromWorld(position: THREE.Vector3): Promise<IRaycastResult<T> | undefined>;
27
27
  }
@@ -0,0 +1,25 @@
1
+ import { ISignal } from 'ste-signals';
2
+ import { IVim, IVimElement } from './vim';
3
+ /**
4
+ * Readonly interface for a collection of vims.
5
+ */
6
+ export interface IReadonlyVimCollection<T extends IVim<IVimElement>> {
7
+ /** Number of vims in the collection */
8
+ readonly count: number;
9
+ /** Signal dispatched when collection changes */
10
+ readonly onChanged: ISignal;
11
+ /** Get vim by its stable ID */
12
+ getFromId(id: number): T | undefined;
13
+ /** Get all vims as an array */
14
+ getAll(): ReadonlyArray<T>;
15
+ /** Check if vim is in collection */
16
+ has(vim: T): boolean;
17
+ }
18
+ /**
19
+ * Mutable interface for a collection of vims.
20
+ */
21
+ export interface IVimCollection<T extends IVim<IVimElement>> extends IReadonlyVimCollection<T> {
22
+ add(vim: T): void;
23
+ remove(vim: T): void;
24
+ clear(): void;
25
+ }
@@ -1,35 +1,13 @@
1
1
  import { Vim } from './vim';
2
- export type LoadRequestResult = LoadSuccess | LoadError;
3
- export declare class LoadSuccess {
4
- readonly isError = false;
5
- readonly isSuccess = true;
6
- readonly vim: Vim;
7
- constructor(vim: Vim);
8
- }
9
- export declare class LoadError {
10
- error: VimRequestErrorType;
11
- readonly isError = true;
12
- readonly isSuccess = false;
2
+ import { LoadRequest as BaseLoadRequest, ILoadRequest as BaseILoadRequest, IProgress, LoadError as SharedLoadError } from '../shared/loadResult';
3
+ export type VimRequestErrorType = 'loadingError' | 'downloadingError' | 'serverDisconnected' | 'unknown' | 'cancelled';
4
+ export declare class LoadError extends SharedLoadError {
13
5
  readonly type: VimRequestErrorType;
14
- readonly details: string | undefined;
15
6
  constructor(error: VimRequestErrorType, details?: string);
16
7
  }
17
- export interface ILoadRequest {
18
- get isCompleted(): boolean;
19
- getProgress(): AsyncGenerator<number>;
20
- getResult(): Promise<LoadError | LoadSuccess>;
21
- abort(): void;
22
- }
23
- export type VimRequestErrorType = 'loadingError' | 'downloadingError' | 'serverDisconnected' | 'unknown' | 'cancelled';
24
- export declare class LoadRequest implements ILoadRequest {
25
- private _progress;
26
- private _progressPromise;
27
- private _completionPromise;
28
- private _result;
29
- get isCompleted(): boolean;
30
- getProgress(): AsyncGenerator<number, void, unknown>;
31
- getResult(): Promise<LoadError | LoadSuccess>;
32
- onProgress(progress: number): void;
8
+ export type ILoadRequest = BaseILoadRequest<Vim, LoadError>;
9
+ export declare class LoadRequest extends BaseLoadRequest<Vim, LoadError> {
10
+ onProgress(progress: IProgress): void;
33
11
  success(vim: Vim): this;
34
12
  error(error: VimRequestErrorType, details?: string): this;
35
13
  abort(): void;
@@ -3,7 +3,7 @@ import type { InputHandler } from '../shared';
3
3
  import { ICamera } from './camera';
4
4
  import { ColorManager } from './colorManager';
5
5
  import { IDecoder } from './decoder';
6
- import { ILoadRequest } from './loadRequest';
6
+ import { type ILoadRequest } from './loadRequest';
7
7
  import { ILogger } from './logger';
8
8
  import { IUltraRaycaster } from './raycaster';
9
9
  import { IRenderer } from './renderer';
@@ -20,6 +20,11 @@ export declare const INVALID_HANDLE = 4294967295;
20
20
  * handling connections, and coordinating various components like the camera, decoder, and inputs.
21
21
  */
22
22
  export declare class Viewer {
23
+ /**
24
+ * The type of the viewer, indicating it is a WebGL viewer.
25
+ * Useful for distinguishing between different viewer types in a multi-viewer application.
26
+ */
27
+ readonly type = "ultra";
23
28
  private readonly _decoder;
24
29
  private readonly _socketClient;
25
30
  private readonly _input;
@@ -8,6 +8,8 @@ export interface IViewport {
8
8
  canvas: HTMLCanvasElement;
9
9
  /** Updates the aspect ratio of the viewport on the server */
10
10
  update(): void;
11
+ /** Resizes the viewport to match its parent's dimensions */
12
+ resizeToParent(): void;
11
13
  }
12
14
  /**
13
15
  * Class managing the viewport and canvas resizing functionality
@@ -34,6 +36,10 @@ export declare class Viewport {
34
36
  * Updates the aspect ratio of the viewport on the server
35
37
  */
36
38
  update(): void;
39
+ /**
40
+ * Resizes the viewport to match its parent's dimensions
41
+ */
42
+ resizeToParent(): void;
37
43
  /**
38
44
  * Cleans up resources by removing resize observer and clearing timeouts
39
45
  */
@@ -8,6 +8,7 @@ import { Renderer } from './renderer';
8
8
  import { RpcSafeClient, VimSource } from './rpcSafeClient';
9
9
  import * as THREE from 'three';
10
10
  export declare class Vim implements IVim<Element3D> {
11
+ readonly type = "ultra";
11
12
  readonly source: VimSource;
12
13
  private _handle;
13
14
  private _request;
@@ -18,6 +19,7 @@ export declare class Vim implements IVim<Element3D> {
18
19
  readonly visibility: VisibilitySynchronizer;
19
20
  private _elementColors;
20
21
  private _updatedColors;
22
+ private _removedColors;
21
23
  private _updateScheduled;
22
24
  private _elementCount;
23
25
  private _objects;
@@ -34,7 +36,7 @@ export declare class Vim implements IVim<Element3D> {
34
36
  private _load;
35
37
  private getErrorType;
36
38
  private _getHandle;
37
- getBoundingBoxNodes(nodes: number[] | 'all'): Promise<THREE.Box3 | undefined>;
39
+ getBoundingBoxForElements(elements: number[] | 'all'): Promise<THREE.Box3 | undefined>;
38
40
  getBoundingBox(): Promise<THREE.Box3 | undefined>;
39
41
  getColor(elementIndex: number): THREE.Color | undefined;
40
42
  setColor(elementIndex: number[], color: THREE.Color | undefined): Promise<void>;
@@ -1,13 +1,11 @@
1
- import { ISignal } from "ste-signals";
2
- import { Vim } from "./vim";
3
- export interface IReadonlyVimCollection {
4
- getFromHandle(handle: number): Vim | undefined;
5
- getAll(): ReadonlyArray<Vim>;
1
+ import { ISignal } from 'ste-signals';
2
+ import { IReadonlyVimCollection as ISharedReadonlyVimCollection, IVimCollection } from '../shared/vimCollection';
3
+ import { Vim } from './vim';
4
+ export interface IReadonlyVimCollection extends ISharedReadonlyVimCollection<Vim> {
5
+ /** Get vim at a specific index */
6
6
  getAt(index: number): Vim | undefined;
7
- count: number;
8
- onChanged: ISignal;
9
7
  }
10
- export declare class VimCollection implements IReadonlyVimCollection {
8
+ export declare class VimCollection implements IVimCollection<Vim>, IReadonlyVimCollection {
11
9
  private _vims;
12
10
  private _onChanged;
13
11
  get onChanged(): ISignal;
@@ -24,11 +22,17 @@ export declare class VimCollection implements IReadonlyVimCollection {
24
22
  */
25
23
  remove(vim: Vim): void;
26
24
  /**
27
- * Gets a Vim instance by its handle.
28
- * @param handle - The handle of the Vim instance.
25
+ * Gets a Vim instance by its stable ID.
26
+ * @param id - The ID of the Vim instance.
29
27
  * @returns The Vim instance or undefined if not found.
30
28
  */
31
- getFromHandle(handle: number): Vim | undefined;
29
+ getFromId(id: number): Vim | undefined;
30
+ /**
31
+ * Checks if a vim is in the collection.
32
+ * @param vim - The Vim instance to check.
33
+ * @returns True if the vim is in the collection.
34
+ */
35
+ has(vim: Vim): boolean;
32
36
  /**
33
37
  * Gets a Vim instance at a specific index.
34
38
  * @param index - The index of the Vim instance.
@@ -1,6 +1,5 @@
1
1
  import './style.css';
2
2
  import { BFastSource } from 'vim-format';
3
3
  export type VimSource = BFastSource;
4
- export { IProgressLogs } from 'vim-format';
5
4
  export * from './loader';
6
5
  export * from './viewer';
@@ -1,5 +1,6 @@
1
- export * from './vimSettings';
2
- export { requestVim as request, type RequestSource, type VimRequest } from './progressive/vimRequest';
1
+ export type { VimSettings, VimPartialSettings } from './vimSettings';
2
+ export * from './vimCollection';
3
+ export type { RequestSource, LoadRequest, ILoadRequest } from './progressive/loadRequest';
3
4
  export * as Materials from './materials';
4
5
  export type { Transparency } from './geometry';
5
6
  export type * from './webglAttribute';
@@ -9,7 +10,6 @@ export type * from './elementMapping';
9
10
  export type * from './mesh';
10
11
  export type * from './scene';
11
12
  export type * from './vim';
12
- export type * from './progressive/vimx';
13
13
  export type * from './progressive/g3dOffsets';
14
14
  export type * from './progressive/g3dSubset';
15
15
  export type * from './progressive/insertableGeometry';
@@ -3,6 +3,7 @@ export * from './maskMaterial';
3
3
  export * from './materials';
4
4
  export * from './mergeMaterial';
5
5
  export * from './outlineMaterial';
6
+ export * from './pickingMaterial';
6
7
  export * from './simpleMaterial';
7
8
  export * from './skyboxMaterial';
8
9
  export * from './standardMaterial';
@@ -0,0 +1,42 @@
1
+ /**
2
+ * @module vim-loader/materials
3
+ * Material for GPU picking that outputs element index, depth, and surface normal in a single pass.
4
+ */
5
+ import * as THREE from 'three';
6
+ /**
7
+ * Creates a material for GPU picking that outputs packed IDs, depth, and surface normal.
8
+ *
9
+ * Expects a `packedId` uint attribute pre-packed during mesh building as: (vimIndex << 24) | elementIndex
10
+ *
11
+ * Output format (Float32 RGBA):
12
+ * - R = packed uint as float bits - supports 256 vims × 16M elements
13
+ * - G = depth (distance along camera direction, 0 = miss)
14
+ * - B = normal.x (surface normal X component)
15
+ * - A = normal.y (surface normal Y component)
16
+ *
17
+ * Normal.z is reconstructed as: sqrt(1 - x² - y²), always positive since normal faces camera.
18
+ *
19
+ * @returns A custom shader material for GPU picking.
20
+ */
21
+ export declare function createPickingMaterial(): THREE.ShaderMaterial;
22
+ /**
23
+ * PickingMaterial class that wraps the shader material with camera update functionality.
24
+ */
25
+ export declare class PickingMaterial {
26
+ readonly material: THREE.ShaderMaterial;
27
+ constructor();
28
+ /**
29
+ * Updates the camera uniforms for depth calculation.
30
+ * Must be called before rendering.
31
+ */
32
+ updateCamera(camera: THREE.Camera): void;
33
+ /**
34
+ * Gets or sets the clipping planes for section box support.
35
+ */
36
+ get clippingPlanes(): THREE.Plane[];
37
+ set clippingPlanes(planes: THREE.Plane[]);
38
+ /**
39
+ * Disposes of the material resources.
40
+ */
41
+ dispose(): void;
42
+ }
@@ -52,9 +52,11 @@ export declare class Mesh {
52
52
  static createMerged(mesh: THREE.Mesh, instances: number[], boxes: THREE.Box3[], submeshes: number[]): Mesh;
53
53
  static createInstanced(mesh: THREE.Mesh, instances: number[], boxes: THREE.Box3[]): Mesh;
54
54
  /**
55
- * Overrides mesh material, set to undefine to restore initial material.
55
+ * Sets the material for this mesh.
56
+ * Set to undefined to reset to original materials.
56
57
  */
57
58
  setMaterial(value: ModelMaterial): void;
59
+ private _mergeMaterials;
58
60
  /**
59
61
  * Returns submesh for given index.
60
62
  */
@@ -5,6 +5,7 @@ import * as THREE from 'three';
5
5
  import { G3d, G3dMesh, G3dMaterial } from 'vim-format';
6
6
  import { Scene } from '../scene';
7
7
  import { G3dMeshOffsets } from './g3dOffsets';
8
+ import { ElementMapping } from '../elementMapping';
8
9
  export declare class GeometrySubmesh {
9
10
  instance: number;
10
11
  start: number;
@@ -23,10 +24,13 @@ export declare class InsertableGeometry {
23
24
  private _indexAttribute;
24
25
  private _vertexAttribute;
25
26
  private _colorAttribute;
27
+ private _packedIdAttribute;
28
+ private _mapping;
29
+ private _vimIndex;
26
30
  private _updateStartMesh;
27
31
  private _updateEndMesh;
28
32
  private _meshToUpdate;
29
- constructor(offsets: G3dMeshOffsets, materials: G3dMaterial, transparent: boolean);
33
+ constructor(offsets: G3dMeshOffsets, materials: G3dMaterial, transparent: boolean, mapping?: ElementMapping, vimIndex?: number);
30
34
  get progress(): number;
31
35
  insert(mesh: G3dMesh, at: number): number[];
32
36
  float32ArraysAreEqual(array1: Float32Array, array2: Float32Array): boolean;
@@ -34,6 +38,7 @@ export declare class InsertableGeometry {
34
38
  private setIndex;
35
39
  private setVertex;
36
40
  private setColor;
41
+ private setPackedId;
37
42
  private expandBox;
38
43
  flushUpdate(): void;
39
44
  update(): void;
@@ -8,6 +8,7 @@ import { InsertableSubmesh } from './insertableSubmesh';
8
8
  import { G3dMeshOffsets } from './g3dOffsets';
9
9
  import { Vim } from '../vim';
10
10
  import { ModelMaterial } from '../materials/materials';
11
+ import { ElementMapping } from '../elementMapping';
11
12
  export declare class InsertableMesh {
12
13
  offsets: G3dMeshOffsets;
13
14
  mesh: THREE.Mesh;
@@ -33,7 +34,7 @@ export declare class InsertableMesh {
33
34
  */
34
35
  private _material;
35
36
  geometry: InsertableGeometry;
36
- constructor(offsets: G3dMeshOffsets, materials: G3dMaterial, transparent: boolean);
37
+ constructor(offsets: G3dMeshOffsets, materials: G3dMaterial, transparent: boolean, mapping?: ElementMapping, vimIndex?: number);
37
38
  get progress(): number;
38
39
  insert(g3d: G3dMesh, mesh: number): void;
39
40
  insertFromVim(g3d: G3d, mesh: number): void;
@@ -54,7 +55,9 @@ export declare class InsertableMesh {
54
55
  */
55
56
  getSubmesh(index: number): InsertableSubmesh;
56
57
  /**
57
- * Overrides mesh material, set to undefine to restore initial material.
58
- */
58
+ * Sets the material for this mesh.
59
+ * Set to undefined to reset to original materials.
60
+ */
59
61
  setMaterial(value: ModelMaterial): void;
62
+ private _mergeMaterials;
60
63
  }
@@ -27,7 +27,12 @@ export declare class InstancedMesh {
27
27
  * Returns all submeshes for given index.
28
28
  */
29
29
  getSubmeshes(): InstancedSubmesh[];
30
+ /**
31
+ * Sets the material for this mesh.
32
+ * Set to undefined to reset to original materials.
33
+ */
30
34
  setMaterial(value: ModelMaterial): void;
35
+ private _mergeMaterials;
31
36
  private computeBoundingBoxes;
32
37
  private importBoundingBoxes;
33
38
  computeBoundingBox(boxes: THREE.Box3[]): THREE.Box3;
@@ -3,9 +3,12 @@
3
3
  */
4
4
  import { G3d, G3dMesh, G3dMaterial, MeshSection } from 'vim-format';
5
5
  import { InstancedMesh } from './instancedMesh';
6
+ import { ElementMapping } from '../elementMapping';
6
7
  export declare class InstancedMeshFactory {
7
8
  materials: G3dMaterial;
8
- constructor(materials: G3dMaterial);
9
+ private _mapping;
10
+ private _vimIndex;
11
+ constructor(materials: G3dMaterial, mapping?: ElementMapping, vimIndex?: number);
9
12
  createTransparent(mesh: G3dMesh, instances: number[]): InstancedMesh;
10
13
  createOpaque(mesh: G3dMesh, instances: number[]): InstancedMesh;
11
14
  createOpaqueFromVim(g3d: G3d, mesh: number, instances: number[]): InstancedMesh;
@@ -17,4 +20,8 @@ export declare class InstancedMeshFactory {
17
20
  private computeVertices;
18
21
  private computeColors;
19
22
  private setMatricesFromVimx;
23
+ /**
24
+ * Adds per-instance packed ID attribute for GPU picking.
25
+ */
26
+ private setPackedIds;
20
27
  }