vim-web 0.3.42 → 0.3.43

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 (26) hide show
  1. package/dist/types/core-viewers/ultra/index.d.ts +1 -1
  2. package/dist/types/core-viewers/ultra/viewer/socketClient.d.ts +10 -3
  3. package/dist/types/core-viewers/ultra/viewer/viewer.d.ts +2 -3
  4. package/dist/types/core-viewers/webgl/loader/materials/ghostMaterial.d.ts +16 -0
  5. package/dist/types/core-viewers/webgl/loader/materials/simpleMaterial.d.ts +10 -5
  6. package/dist/types/core-viewers/webgl/loader/materials/viewerMaterials.d.ts +9 -8
  7. package/dist/types/core-viewers/webgl/loader/mesh.d.ts +2 -1
  8. package/dist/types/core-viewers/webgl/loader/progressive/insertableMesh.d.ts +2 -1
  9. package/dist/types/core-viewers/webgl/loader/progressive/instancedMesh.d.ts +3 -1
  10. package/dist/types/core-viewers/webgl/loader/scene.d.ts +3 -2
  11. package/dist/types/core-viewers/webgl/viewer/environment/environment.d.ts +0 -6
  12. package/dist/types/core-viewers/webgl/viewer/rendering/renderScene.d.ts +8 -4
  13. package/dist/types/core-viewers/webgl/viewer/rendering/renderer.d.ts +5 -9
  14. package/dist/types/core-viewers/webgl/viewer/selection.d.ts +1 -0
  15. package/dist/types/core-viewers/webgl/viewer/settings/viewerSettings.d.ts +4 -39
  16. package/dist/types/react-viewers/helpers/inputs.d.ts +1 -2
  17. package/dist/types/react-viewers/helpers/isolation.d.ts +91 -50
  18. package/dist/types/react-viewers/settings/settings.d.ts +3 -2
  19. package/dist/vim-web.iife.js +355 -556
  20. package/dist/vim-web.iife.js.map +1 -1
  21. package/dist/vim-web.js +361 -562
  22. package/dist/vim-web.js.map +1 -1
  23. package/package.json +1 -1
  24. package/dist/types/core-viewers/webgl/images.d.ts +0 -4
  25. package/dist/types/core-viewers/webgl/loader/materials/isolationMaterial.d.ts +0 -12
  26. package/dist/types/core-viewers/webgl/viewer/environment/groundPlane.d.ts +0 -25
package/dist/vim-web.js CHANGED
@@ -45333,6 +45333,7 @@ class ObjectAttribute {
45333
45333
  return this._value;
45334
45334
  }
45335
45335
  apply(value) {
45336
+ value ?? this.defaultValue;
45336
45337
  if (this._value === value) return false;
45337
45338
  this._value = value;
45338
45339
  if (!this._meshes) return false;
@@ -45700,9 +45701,15 @@ class Object3D2 {
45700
45701
  return this._visibleAttribute.value;
45701
45702
  }
45702
45703
  set visible(value) {
45704
+ var _a2;
45703
45705
  if (this._visibleAttribute.apply(value)) {
45704
45706
  this.vim.scene.setDirty();
45705
45707
  }
45708
+ if (value) {
45709
+ (_a2 = this._meshes) == null ? void 0 : _a2.forEach((m) => {
45710
+ m.mesh.mesh.visible = true;
45711
+ });
45712
+ }
45706
45713
  }
45707
45714
  /**
45708
45715
  * Gets or sets the display color of this object.
@@ -47646,7 +47653,6 @@ function createBasicOpaque() {
47646
47653
  vertexColors: true,
47647
47654
  flatShading: true,
47648
47655
  side: DoubleSide
47649
- //shininess: 20
47650
47656
  });
47651
47657
  }
47652
47658
  function createBasicTransparent() {
@@ -47912,107 +47918,69 @@ function createMaskMaterial() {
47912
47918
  `
47913
47919
  });
47914
47920
  }
47915
- function createIsolationMaterial() {
47921
+ function createGhostMaterial() {
47916
47922
  return new ShaderMaterial({
47923
+ userData: {
47924
+ isGhost: true
47925
+ },
47917
47926
  uniforms: {
47918
- opacity: { value: 0.1 },
47927
+ // Uniform controlling the overall transparency of the non-visible objects.
47928
+ opacity: { value: 1e-3 },
47929
+ // Uniform specifying the fill color for non-visible objects.
47919
47930
  fillColor: { value: new Vector3$1(0, 0, 0) }
47920
47931
  },
47932
+ // Render only the front side of faces to prevent drawing internal geometry.
47933
+ side: FrontSide,
47934
+ // Enable support for vertex colors.
47921
47935
  vertexColors: true,
47936
+ // Enable transparency for the material.
47922
47937
  transparent: true,
47938
+ // Enable clipping planes for geometry slicing.
47923
47939
  clipping: true,
47940
+ // Prevent writing to the depth buffer for proper blending of transparent objects.
47941
+ depthWrite: false,
47942
+ // Perform depth testing to ensure correct rendering order.
47943
+ depthTest: true,
47924
47944
  vertexShader: (
47925
47945
  /* glsl */
47926
47946
  `
47927
-
47928
- #include <common>
47929
- #include <logdepthbuf_pars_vertex>
47930
47947
  #include <clipping_planes_pars_vertex>
47931
-
47932
- // VISIBILITY
47933
- // Instance or vertex attribute to hide objects
47934
- // Used as instance attribute for instanced mesh and as vertex attribute for merged meshes.
47935
- attribute float ignore;
47936
-
47937
- // Passed to fragment to discard them
47938
- varying float vIgnore;
47939
- varying vec3 vPosition;
47940
-
47941
47948
 
47942
- // COLORING
47943
- varying vec3 vColor;
47944
-
47945
- // attribute for color override
47946
- // merged meshes use it as vertex attribute
47947
- // instanced meshes use it as an instance attribute
47948
- attribute float colored;
47949
-
47950
- // There seems to be an issue where setting mehs.instanceColor
47951
- // doesn't properly set USE_INSTANCING_COLOR
47952
- // so we always use it as a fix
47953
- #ifndef USE_INSTANCING_COLOR
47954
- attribute vec3 instanceColor;
47955
- #endif
47949
+ // Attribute to determine if an object or vertex should be visible.
47950
+ // Used as an instance attribute for instanced meshes or a vertex attribute for merged meshes.
47951
+ attribute float ignore;
47956
47952
 
47957
47953
  void main() {
47954
+ // Standard transformations to calculate vertex position.
47958
47955
  #include <begin_vertex>
47959
47956
  #include <project_vertex>
47960
47957
  #include <clipping_planes_vertex>
47961
- #include <logdepthbuf_vertex>
47962
-
47963
- // VISIBILITY
47964
- // Set frag ignore from instance or vertex attribute
47965
- vIgnore = ignore;
47966
-
47967
- // COLORING
47968
- vColor = color.xyz;
47969
-
47970
- // colored == 1 -> instance color
47971
- // colored == 0 -> vertex color
47972
- #ifdef USE_INSTANCING
47973
- vColor.xyz = colored * instanceColor.xyz + (1.0f - colored) * color.xyz;
47974
- #endif
47975
47958
 
47976
-
47977
- // ORDERING
47978
- if(vIgnore > 0.0f){
47979
- gl_Position.z = 1.0f;
47980
- }else{
47981
- gl_Position.z = -1.0f;
47959
+ // Hide objects or vertices where the 'ignore' attribute is set to 0.
47960
+ if (ignore == 0.0) {
47961
+ // Push the vertex far out of view, effectively hiding it.
47962
+ gl_Position = vec4(1e20, 1e20, 1e20, 1.0);
47982
47963
  }
47983
-
47984
- // LIGHTING
47985
- vPosition = vec3(mvPosition ) / mvPosition .w;
47986
47964
  }
47987
- `
47965
+ `
47988
47966
  ),
47989
47967
  fragmentShader: (
47990
47968
  /* glsl */
47991
47969
  `
47992
47970
  #include <clipping_planes_pars_fragment>
47993
- varying float vIgnore;
47971
+
47972
+ // Uniform controlling the transparency level of the material.
47994
47973
  uniform float opacity;
47974
+ // Uniform specifying the fill color for non-visible objects.
47995
47975
  uniform vec3 fillColor;
47996
- varying vec3 vPosition;
47997
- varying vec3 vColor;
47998
47976
 
47999
47977
  void main() {
47978
+ // Handle clipping planes to discard fragments outside the defined planes.
48000
47979
  #include <clipping_planes_fragment>
48001
-
48002
- if (vIgnore > 0.0f){
48003
- gl_FragColor = vec4(fillColor, opacity);
48004
- }
48005
- else{
48006
- gl_FragColor = vec4(vColor.x, vColor.y, vColor.z, 1.0f);
48007
-
48008
- // LIGHTING
48009
- vec3 normal = normalize( cross(dFdx(vPosition), dFdy(vPosition)) );
48010
- float light = dot(normal, normalize(vec3(1.4142f, 1.732f, 2.2360f)));
48011
- light = 0.5 + (light *0.5);
48012
- gl_FragColor.xyz *= light;
48013
- }
47980
+ // Set the fragment color to the specified fill color and opacity.
47981
+ gl_FragColor = vec4(fillColor, opacity);
48014
47982
  }
48015
- `
47983
+ `
48016
47984
  )
48017
47985
  });
48018
47986
  }
@@ -48300,42 +48268,40 @@ function createMergeMaterial() {
48300
48268
  }
48301
48269
  function createSimpleMaterial() {
48302
48270
  return new ShaderMaterial({
48303
- uniforms: {
48304
- opacity: { value: 0.1 },
48305
- fillColor: { value: new Vector3$1(0, 0, 0) }
48306
- },
48271
+ side: DoubleSide,
48272
+ // No uniforms are needed for this shader.
48273
+ uniforms: {},
48274
+ // Enable vertex colors for both instanced and merged meshes.
48307
48275
  vertexColors: true,
48308
- // transparent: true,
48276
+ // Enable support for clipping planes.
48309
48277
  clipping: true,
48310
48278
  vertexShader: (
48311
48279
  /* glsl */
48312
48280
  `
48313
-
48314
48281
  #include <common>
48315
48282
  #include <logdepthbuf_pars_vertex>
48316
48283
  #include <clipping_planes_pars_vertex>
48317
-
48284
+
48318
48285
  // VISIBILITY
48319
- // Instance or vertex attribute to hide objects
48320
- // Used as instance attribute for instanced mesh and as vertex attribute for merged meshes.
48286
+ // Determines if an object or vertex should be visible.
48287
+ // Used as an instance attribute for instanced meshes or as a vertex attribute for merged meshes.
48321
48288
  attribute float ignore;
48322
48289
 
48323
- // Passed to fragment to discard them
48324
- varying float vIgnore;
48290
+ // LIGHTING
48291
+ // Passes the vertex position to the fragment shader for lighting calculations.
48325
48292
  varying vec3 vPosition;
48326
48293
 
48327
-
48328
48294
  // COLORING
48295
+ // Passes the color of the vertex or instance to the fragment shader.
48329
48296
  varying vec3 vColor;
48330
48297
 
48331
- // attribute for color override
48332
- // merged meshes use it as vertex attribute
48333
- // instanced meshes use it as an instance attribute
48298
+ // Determines whether to use instance color (1.0) or vertex color (0.0).
48299
+ // For merged meshes, this is used as a vertex attribute.
48300
+ // For instanced meshes, this is used as an instance attribute.
48334
48301
  attribute float colored;
48335
48302
 
48336
- // There seems to be an issue where setting mehs.instanceColor
48337
- // doesn't properly set USE_INSTANCING_COLOR
48338
- // so we always use it as a fix
48303
+ // Fix for a known issue where setting mesh.instanceColor does not properly enable USE_INSTANCING_COLOR.
48304
+ // This ensures that instance colors are always used when required.
48339
48305
  #ifndef USE_INSTANCING_COLOR
48340
48306
  attribute vec3 instanceColor;
48341
48307
  #endif
@@ -48346,49 +48312,59 @@ function createSimpleMaterial() {
48346
48312
  #include <clipping_planes_vertex>
48347
48313
  #include <logdepthbuf_vertex>
48348
48314
 
48349
- // VISIBILITY
48350
- // Set frag ignore from instance or vertex attribute
48351
- vIgnore = ignore;
48315
+ // If ignore is greater than 0, hide the object by moving it far out of view.
48316
+ if (ignore > 0.0) {
48317
+ gl_Position = vec4(1e20, 1e20, 1e20, 1.0);
48318
+ return;
48319
+ }
48352
48320
 
48353
48321
  // COLORING
48322
+ // Default to the vertex color.
48354
48323
  vColor = color.xyz;
48355
48324
 
48356
- // colored == 1 -> instance color
48357
- // colored == 0 -> vertex color
48325
+ // Blend instance and vertex colors based on the colored attribute.
48326
+ // colored == 1.0 -> use instance color.
48327
+ // colored == 0.0 -> use vertex color.
48358
48328
  #ifdef USE_INSTANCING
48359
- vColor.xyz = colored * instanceColor.xyz + (1.0f - colored) * color.xyz;
48329
+ vColor.xyz = colored * instanceColor.xyz + (1.0 - colored) * color.xyz;
48360
48330
  #endif
48361
48331
 
48362
- gl_Position.z = -10.0f;
48363
-
48364
48332
  // LIGHTING
48365
- vPosition = vec3(mvPosition ) / mvPosition .w;
48333
+ // Pass the model-view position to the fragment shader for lighting calculations.
48334
+ vPosition = vec3(mvPosition) / mvPosition.w;
48366
48335
  }
48367
48336
  `
48368
48337
  ),
48369
48338
  fragmentShader: (
48370
48339
  /* glsl */
48371
48340
  `
48341
+ #include <common>
48342
+ #include <logdepthbuf_pars_fragment>
48372
48343
  #include <clipping_planes_pars_fragment>
48373
- varying float vIgnore;
48344
+
48345
+
48346
+ // Position and color data passed from the vertex shader.
48374
48347
  varying vec3 vPosition;
48375
48348
  varying vec3 vColor;
48376
48349
 
48377
48350
  void main() {
48378
48351
  #include <clipping_planes_fragment>
48352
+ #include <logdepthbuf_fragment>
48379
48353
 
48380
- if (vIgnore > 0.0f){
48381
- discard;
48382
- }
48383
- else{
48384
- gl_FragColor = vec4(vColor.x, vColor.y, vColor.z, 1.0f);
48354
+ // Set the fragment color to the interpolated vertex or instance color.
48355
+ gl_FragColor = vec4(vColor, 1.0);
48385
48356
 
48386
- // LIGHTING
48387
- vec3 normal = normalize( cross(dFdx(vPosition), dFdy(vPosition)) );
48388
- float light = dot(normal, normalize(vec3(1.4142f, 1.732f, 2.2360f)));
48389
- light = 0.5 + (light *0.5);
48390
- gl_FragColor.xyz *= light;
48391
- }
48357
+ // LIGHTING
48358
+ // Compute a pseudo-normal using screen-space derivatives of the vertex position.
48359
+ vec3 normal = normalize(cross(dFdx(vPosition), dFdy(vPosition)));
48360
+
48361
+ // Apply simple directional lighting.
48362
+ // Normalize the light direction for consistent shading.
48363
+ float light = dot(normal, normalize(vec3(1.4142, 1.732, 2.236)));
48364
+ light = 0.5 + (light * 0.5); // Adjust light intensity to range [0.5, 1.0].
48365
+
48366
+ // Modulate the fragment color by the lighting intensity.
48367
+ gl_FragColor.xyz *= light;
48392
48368
  }
48393
48369
  `
48394
48370
  )
@@ -48487,7 +48463,7 @@ class SkyboxMaterial extends ShaderMaterial {
48487
48463
  }
48488
48464
  }
48489
48465
  const _ViewerMaterials = class _ViewerMaterials {
48490
- constructor(opaque, transparent, simple, wireframe, isolation, mask, outline, merge, skyBox) {
48466
+ constructor(opaque, transparent, simple, wireframe, ghost2, mask, outline, merge, skyBox) {
48491
48467
  /**
48492
48468
  * Material used for opaque model geometry.
48493
48469
  */
@@ -48507,7 +48483,7 @@ const _ViewerMaterials = class _ViewerMaterials {
48507
48483
  /**
48508
48484
  * Material used to show traces of hidden objects.
48509
48485
  */
48510
- __publicField(this, "isolation");
48486
+ __publicField(this, "ghost");
48511
48487
  /**
48512
48488
  * Material used to filter out what is not selected for selection outline effect.
48513
48489
  */
@@ -48535,7 +48511,7 @@ const _ViewerMaterials = class _ViewerMaterials {
48535
48511
  this.transparent = transparent ?? createTransparent();
48536
48512
  this.simple = simple ?? createSimpleMaterial();
48537
48513
  this.wireframe = wireframe ?? createWireframe();
48538
- this.isolation = isolation ?? createIsolationMaterial();
48514
+ this.ghost = ghost2 ?? createGhostMaterial();
48539
48515
  this.mask = mask ?? createMaskMaterial();
48540
48516
  this.outline = outline ?? new OutlineMaterial();
48541
48517
  this.merge = merge ?? new MergeMaterial();
@@ -48557,8 +48533,8 @@ const _ViewerMaterials = class _ViewerMaterials {
48557
48533
  applySettings(settings2) {
48558
48534
  this.opaque.color = settings2.materials.standard.color;
48559
48535
  this.transparent.color = settings2.materials.standard.color;
48560
- this.isolationOpacity = settings2.materials.isolation.opacity;
48561
- this.isolationColor = settings2.materials.isolation.color;
48536
+ this.ghostOpacity = settings2.materials.ghost.opacity;
48537
+ this.ghostColor = settings2.materials.ghost.color;
48562
48538
  this.wireframeColor = settings2.materials.highlight.color;
48563
48539
  this.wireframeOpacity = settings2.materials.highlight.opacity;
48564
48540
  this.sectionStrokeWitdh = settings2.materials.section.strokeWidth;
@@ -48587,26 +48563,27 @@ const _ViewerMaterials = class _ViewerMaterials {
48587
48563
  this._onUpdate.dispatch();
48588
48564
  }
48589
48565
  /**
48590
- * Determines the opacity of the isolation material.
48566
+ * Determines the opacity of the ghost material.
48591
48567
  */
48592
- get isolationOpacity() {
48593
- return this.isolation.opacity;
48568
+ get ghostOpacity() {
48569
+ const mat = this.ghost;
48570
+ return mat.uniforms.opacity.value;
48594
48571
  }
48595
- set isolationOpacity(opacity) {
48596
- const mat = this.isolation;
48572
+ set ghostOpacity(opacity) {
48573
+ const mat = this.ghost;
48597
48574
  mat.uniforms.opacity.value = opacity;
48598
48575
  mat.uniformsNeedUpdate = true;
48599
48576
  this._onUpdate.dispatch();
48600
48577
  }
48601
48578
  /**
48602
- * Determines the color of the isolation material.
48579
+ * Determines the color of the ghost material.
48603
48580
  */
48604
- get isolationColor() {
48605
- const mat = this.isolation;
48581
+ get ghostColor() {
48582
+ const mat = this.ghost;
48606
48583
  return mat.uniforms.fillColor.value;
48607
48584
  }
48608
- set isolationColor(color) {
48609
- const mat = this.isolation;
48585
+ set ghostColor(color) {
48586
+ const mat = this.ghost;
48610
48587
  mat.uniforms.fillColor.value = color;
48611
48588
  mat.uniformsNeedUpdate = true;
48612
48589
  this._onUpdate.dispatch();
@@ -48667,10 +48644,11 @@ const _ViewerMaterials = class _ViewerMaterials {
48667
48644
  }
48668
48645
  set clippingPlanes(value) {
48669
48646
  this._clippingPlanes = value;
48647
+ this.simple.clippingPlanes = value ?? null;
48670
48648
  this.opaque.clippingPlanes = value ?? null;
48671
48649
  this.transparent.clippingPlanes = value ?? null;
48672
48650
  this.wireframe.clippingPlanes = value ?? null;
48673
- this.isolation.clippingPlanes = value ?? null;
48651
+ this.ghost.clippingPlanes = value ?? null;
48674
48652
  this.mask.clippingPlanes = value ?? null;
48675
48653
  this._onUpdate.dispatch();
48676
48654
  }
@@ -48790,7 +48768,7 @@ const _ViewerMaterials = class _ViewerMaterials {
48790
48768
  this.opaque.dispose();
48791
48769
  this.transparent.dispose();
48792
48770
  this.wireframe.dispose();
48793
- this.isolation.dispose();
48771
+ this.ghost.dispose();
48794
48772
  this.mask.dispose();
48795
48773
  this.outline.dispose();
48796
48774
  }
@@ -48902,16 +48880,12 @@ class InsertableMesh {
48902
48880
  setMaterial(value) {
48903
48881
  if (this._material === value) return;
48904
48882
  if (this.ignoreSceneMaterial) return;
48905
- if (value) {
48906
- if (!this._material) {
48907
- this._material = this.mesh.material;
48908
- }
48909
- this.mesh.material = value;
48910
- } else {
48911
- if (this._material) {
48912
- this.mesh.material = this._material;
48913
- this._material = void 0;
48914
- }
48883
+ this.mesh.material = value ?? this._material;
48884
+ this.mesh.geometry.clearGroups();
48885
+ if (value instanceof Array) {
48886
+ value.forEach((m, i) => {
48887
+ this.mesh.geometry.addGroup(0, Infinity, i);
48888
+ });
48915
48889
  }
48916
48890
  }
48917
48891
  }
@@ -48969,13 +48943,17 @@ class InstancedMesh2 {
48969
48943
  // State
48970
48944
  __publicField(this, "ignoreSceneMaterial");
48971
48945
  __publicField(this, "_material");
48946
+ __publicField(this, "size", 0);
48947
+ var _a2;
48972
48948
  this.g3dMesh = g3d2;
48973
48949
  this.mesh = mesh;
48974
48950
  this.mesh.userData.vim = this;
48975
48951
  this.bimInstances = g3d2 instanceof distExports$2.G3dMesh ? instances.map((i) => g3d2.scene.instanceNodes[i]) : instances;
48976
48952
  this.meshInstances = instances;
48977
48953
  this.boxes = g3d2 instanceof distExports$2.G3dMesh ? this.importBoundingBoxes() : this.computeBoundingBoxes();
48954
+ this.size = ((_a2 = this.boxes[0]) == null ? void 0 : _a2.getSize(new Vector3$1()).length()) ?? 0;
48978
48955
  this.boundingBox = this.computeBoundingBox(this.boxes);
48956
+ this._material = this.mesh.material;
48979
48957
  }
48980
48958
  get merged() {
48981
48959
  return false;
@@ -48999,16 +48977,12 @@ class InstancedMesh2 {
48999
48977
  setMaterial(value) {
49000
48978
  if (this._material === value) return;
49001
48979
  if (this.ignoreSceneMaterial) return;
49002
- if (value) {
49003
- if (!this._material) {
49004
- this._material = this.mesh.material;
49005
- }
49006
- this.mesh.material = value;
49007
- } else {
49008
- if (this._material) {
49009
- this.mesh.material = this._material;
49010
- this._material = void 0;
49011
- }
48980
+ this.mesh.material = value ?? this._material;
48981
+ this.mesh.geometry.clearGroups();
48982
+ if (value instanceof Array) {
48983
+ value.forEach((m, i) => {
48984
+ this.mesh.geometry.addGroup(0, Infinity, i);
48985
+ });
49012
48986
  }
49013
48987
  }
49014
48988
  computeBoundingBoxes() {
@@ -49947,7 +49921,7 @@ async function loadFromVim(bfast2, settings2, onProgress) {
49947
49921
  }
49948
49922
  return vim;
49949
49923
  }
49950
- let DeferredPromise$2 = class DeferredPromise extends Promise {
49924
+ let DeferredPromise$1 = class DeferredPromise extends Promise {
49951
49925
  constructor(executor = () => {
49952
49926
  }) {
49953
49927
  var _a2;
@@ -50010,8 +49984,8 @@ class VimRequest {
50010
49984
  __publicField(this, "_error");
50011
49985
  // Promises to await progress updates and completion
50012
49986
  __publicField(this, "_progress", { loaded: 0, total: 0, all: /* @__PURE__ */ new Map() });
50013
- __publicField(this, "_progressPromise", new DeferredPromise$2());
50014
- __publicField(this, "_completionPromise", new DeferredPromise$2());
49987
+ __publicField(this, "_progressPromise", new DeferredPromise$1());
49988
+ __publicField(this, "_completionPromise", new DeferredPromise$1());
50015
49989
  this._source = source;
50016
49990
  this._settings = settings2;
50017
49991
  this.startRequest();
@@ -50025,7 +49999,7 @@ class VimRequest {
50025
49999
  const vim = await open(this._bfast, this._settings, (progress) => {
50026
50000
  this._progress = progress;
50027
50001
  this._progressPromise.resolve(progress);
50028
- this._progressPromise = new DeferredPromise$2();
50002
+ this._progressPromise = new DeferredPromise$1();
50029
50003
  });
50030
50004
  this._vimResult = vim;
50031
50005
  } catch (err) {
@@ -50080,9 +50054,6 @@ function isPlainObject(o) {
50080
50054
  }
50081
50055
  return true;
50082
50056
  }
50083
- const floor$1 = `
50084
- data:image/png;base64,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
50085
- `;
50086
50057
  class AxesSettings {
50087
50058
  constructor(init) {
50088
50059
  __publicField(this, "size", 84);
@@ -50158,14 +50129,6 @@ const defaultViewerSettings = {
50158
50129
  // less white
50159
50130
  sharpness: 2
50160
50131
  },
50161
- groundPlane: {
50162
- visible: false,
50163
- encoding: "base64",
50164
- texture: floor$1,
50165
- opacity: 1,
50166
- color: new Color(16777215),
50167
- size: 5
50168
- },
50169
50132
  skylight: {
50170
50133
  skyColor: new Color(16777215),
50171
50134
  groundColor: new Color(16777215),
@@ -50193,9 +50156,9 @@ const defaultViewerSettings = {
50193
50156
  color: new Color(7000831),
50194
50157
  opacity: 0.5
50195
50158
  },
50196
- isolation: {
50159
+ ghost: {
50197
50160
  color: new Color(5132892),
50198
- opacity: 0.08
50161
+ opacity: 0.01
50199
50162
  },
50200
50163
  section: {
50201
50164
  strokeWidth: 0.01,
@@ -52383,6 +52346,9 @@ class Selection {
52383
52346
  });
52384
52347
  this._onValueChanged.dispatch();
52385
52348
  }
52349
+ any() {
52350
+ return this._objects.size > 0;
52351
+ }
52386
52352
  /**
52387
52353
  * Returns true if the given object is currently selected.
52388
52354
  * @param {IObject} object The object to check for selection.
@@ -52492,92 +52458,6 @@ class Selection {
52492
52458
  this._materials.focusIntensity = focus / 2;
52493
52459
  }
52494
52460
  }
52495
- class GroundPlane {
52496
- constructor(settings2) {
52497
- __publicField(this, "mesh");
52498
- __publicField(this, "_source");
52499
- __publicField(this, "_size", 1);
52500
- // disposable
52501
- __publicField(this, "_geometry");
52502
- __publicField(this, "_material");
52503
- __publicField(this, "_texture");
52504
- this._geometry = new PlaneGeometry();
52505
- this._material = new MeshBasicMaterial({
52506
- transparent: true,
52507
- depthTest: true,
52508
- depthWrite: false
52509
- });
52510
- this.mesh = new Mesh(this._geometry, this._material);
52511
- this.mesh.renderOrder = -1;
52512
- this._size = settings2.groundPlane.size;
52513
- this.mesh.visible = settings2.groundPlane.visible;
52514
- this.applyTexture(
52515
- settings2.groundPlane.encoding,
52516
- settings2.groundPlane.texture
52517
- );
52518
- this._material.color.copy(settings2.groundPlane.color);
52519
- this._material.opacity = settings2.groundPlane.opacity;
52520
- }
52521
- /**
52522
- * Whether the ground plane is visible or not.
52523
- */
52524
- get visible() {
52525
- return this.mesh.visible;
52526
- }
52527
- set visible(value) {
52528
- this.mesh.visible = value;
52529
- }
52530
- adaptToContent(box) {
52531
- const center = box.getCenter(new Vector3$1());
52532
- const position = new Vector3$1(
52533
- center.x,
52534
- box.min.y - Math.abs(box.min.y) * 0.01,
52535
- center.z
52536
- );
52537
- this.mesh.position.copy(position);
52538
- this.mesh.quaternion.copy(
52539
- new Quaternion().setFromEuler(new Euler(1.5 * Math.PI, 0, 0))
52540
- );
52541
- const sphere = box == null ? void 0 : box.getBoundingSphere(new Sphere());
52542
- const size = ((sphere == null ? void 0 : sphere.radius) ?? 1) * this._size;
52543
- const scale = new Vector3$1(1, 1, 1).multiplyScalar(size);
52544
- this.mesh.scale.copy(scale);
52545
- }
52546
- applyTexture(encoding, source) {
52547
- var _a2;
52548
- if (source === this._source) return;
52549
- this._source = source;
52550
- (_a2 = this._texture) == null ? void 0 : _a2.dispose();
52551
- this._texture = void 0;
52552
- if (!source || !encoding) return;
52553
- if (encoding === "url") {
52554
- const loader = new TextureLoader();
52555
- this._texture = loader.load(source);
52556
- }
52557
- if (encoding === "base64") {
52558
- const image = new Image();
52559
- image.src = source;
52560
- const txt = new Texture();
52561
- this._texture = txt;
52562
- this._texture.image = image;
52563
- image.onload = () => {
52564
- txt.needsUpdate = true;
52565
- };
52566
- }
52567
- if (!this._texture) {
52568
- console.error("Failed to load texture: " + source);
52569
- return;
52570
- }
52571
- this._material.map = this._texture;
52572
- }
52573
- dispose() {
52574
- var _a2, _b2, _c;
52575
- (_a2 = this._geometry) == null ? void 0 : _a2.dispose();
52576
- (_b2 = this._material) == null ? void 0 : _b2.dispose();
52577
- (_c = this._texture) == null ? void 0 : _c.dispose();
52578
- this._texture = void 0;
52579
- }
52580
- }
52581
52461
  class Skybox {
52582
52462
  constructor(camera2, renderer, materials, settings2) {
52583
52463
  __publicField(this, "mesh");
@@ -52722,28 +52602,22 @@ class Environment {
52722
52602
  * The array of directional lights in the scene.
52723
52603
  */
52724
52604
  __publicField(this, "sunLights");
52725
- /**
52726
- * The ground plane under the model in the scene.
52727
- */
52728
- __publicField(this, "groundPlane");
52729
52605
  /*
52730
52606
  * The skybox in the scene.
52731
52607
  */
52732
52608
  __publicField(this, "skybox");
52733
52609
  this._camera = camera2;
52734
52610
  this._renderer = renderer;
52735
- this.groundPlane = new GroundPlane(settings2);
52736
52611
  this.skyLight = this.createSkyLight(settings2);
52737
52612
  this.skybox = new Skybox(camera2, renderer, viewerMaterials, settings2);
52738
52613
  this.sunLights = this.createSunLights(settings2);
52739
- this.setupRendererListeners();
52740
52614
  this.addObjectsToRenderer();
52741
52615
  }
52742
52616
  /**
52743
52617
  * Returns all three objects composing the environment
52744
52618
  */
52745
52619
  getObjects() {
52746
- return [this.groundPlane.mesh, this.skyLight, ...this.sunLights.map((l) => l.light), this.skybox.mesh];
52620
+ return [this.skyLight, ...this.sunLights.map((l) => l.light), this.skybox.mesh];
52747
52621
  }
52748
52622
  createSkyLight(settings2) {
52749
52623
  const { skyColor, groundColor, intensity } = settings2.skylight;
@@ -52757,12 +52631,6 @@ class Environment {
52757
52631
  addObjectsToRenderer() {
52758
52632
  this.getObjects().forEach((o) => this._renderer.add(o));
52759
52633
  }
52760
- setupRendererListeners() {
52761
- this._renderer.onBoxUpdated.subscribe(() => {
52762
- const box = this._renderer.getBoundingBox();
52763
- this.groundPlane.adaptToContent(box);
52764
- });
52765
- }
52766
52634
  /**
52767
52635
  * Dispose of all resources.
52768
52636
  */
@@ -52770,7 +52638,6 @@ class Environment {
52770
52638
  this.getObjects().forEach((o) => this._renderer.remove(o));
52771
52639
  this.sunLights.forEach((s) => s.dispose());
52772
52640
  this.skyLight.dispose();
52773
- this.groundPlane.dispose();
52774
52641
  this.skybox.dispose();
52775
52642
  }
52776
52643
  }
@@ -52903,14 +52770,16 @@ class RenderScene {
52903
52770
  __publicField(this, "scene");
52904
52771
  // state
52905
52772
  __publicField(this, "boxUpdated", false);
52773
+ // public value
52774
+ __publicField(this, "smallGhostThreshold", 10);
52906
52775
  __publicField(this, "_vimScenes", []);
52907
52776
  __publicField(this, "_boundingBox");
52908
52777
  __publicField(this, "_memory", 0);
52909
52778
  __publicField(this, "_2dCount", 0);
52910
- __publicField(this, "_material");
52779
+ __publicField(this, "_modelMaterial");
52911
52780
  this.scene = new Scene$1();
52912
52781
  }
52913
- get models() {
52782
+ get meshes() {
52914
52783
  return this._vimScenes.flatMap((s) => s.meshes);
52915
52784
  }
52916
52785
  get estimatedMemory() {
@@ -52957,6 +52826,7 @@ class RenderScene {
52957
52826
  add(target) {
52958
52827
  if (target instanceof Scene2) {
52959
52828
  this.addScene(target);
52829
+ target.material = this._modelMaterial;
52960
52830
  return;
52961
52831
  }
52962
52832
  this._2dCount += this.count2dObjects(target);
@@ -53006,16 +52876,31 @@ class RenderScene {
53006
52876
  this._boundingBox = void 0;
53007
52877
  this._memory = 0;
53008
52878
  }
53009
- get material() {
53010
- return this._material;
52879
+ get modelMaterial() {
52880
+ return this._modelMaterial;
53011
52881
  }
53012
- set material(material) {
53013
- this._material = material;
52882
+ set modelMaterial(material) {
52883
+ this._modelMaterial = material;
53014
52884
  this._vimScenes.forEach((s) => {
53015
- s.meshes.forEach((m) => {
53016
- m.mesh.material = material;
53017
- });
52885
+ s.material = material;
53018
52886
  });
52887
+ this.updateInstanceMeshVisibility();
52888
+ }
52889
+ updateInstanceMeshVisibility() {
52890
+ var _a2, _b2;
52891
+ const hide = ((_b2 = (_a2 = this._modelMaterial) == null ? void 0 : _a2[1]) == null ? void 0 : _b2.userData.isGhost) === true;
52892
+ for (const mesh of this.meshes) {
52893
+ if (mesh instanceof InstancedMesh2) {
52894
+ if (this.smallGhostThreshold <= 0) {
52895
+ mesh.mesh.visible = true;
52896
+ continue;
52897
+ }
52898
+ const visible2 = mesh.getSubmeshes().some(
52899
+ (m) => m.object.visible
52900
+ );
52901
+ mesh.mesh.visible = !(hide && !visible2 && mesh.size < this.smallGhostThreshold);
52902
+ }
52903
+ }
53019
52904
  }
53020
52905
  addScene(scene) {
53021
52906
  this._vimScenes.push(scene);
@@ -55621,7 +55506,6 @@ class RenderingSection {
55621
55506
  this.minZ.constant = -box.min.z;
55622
55507
  this.box.copy(box);
55623
55508
  this._renderer.needsUpdate = true;
55624
- this._renderer.skipAntialias = true;
55625
55509
  }
55626
55510
  /**
55627
55511
  * Determines whether objecets outside the section box will be culled or not.
@@ -56580,7 +56464,6 @@ let Renderer$1 = class Renderer {
56580
56464
  __publicField(this, "_composer");
56581
56465
  __publicField(this, "_materials");
56582
56466
  __publicField(this, "_renderText");
56583
- __publicField(this, "_skipAntialias");
56584
56467
  __publicField(this, "_needsUpdate");
56585
56468
  __publicField(this, "_onSceneUpdate", new distExports$1.SignalDispatcher());
56586
56469
  __publicField(this, "_onBoxUpdated", new distExports$1.SignalDispatcher());
@@ -56642,17 +56525,6 @@ let Renderer$1 = class Renderer {
56642
56525
  set needsUpdate(value) {
56643
56526
  this._needsUpdate = this._needsUpdate || value;
56644
56527
  }
56645
- /**
56646
- * Indicates whether the next render should skip antialiasing.
56647
- * Useful for expensive operations such as the section box.
56648
- * Can only be set to true. Cleared on each render.
56649
- */
56650
- get skipAntialias() {
56651
- return this._skipAntialias;
56652
- }
56653
- set skipAntialias(value) {
56654
- this._skipAntialias = this._skipAntialias || value;
56655
- }
56656
56528
  /**
56657
56529
  * Removes all objects from rendering and disposes the WebGL context.
56658
56530
  */
@@ -56673,6 +56545,12 @@ let Renderer$1 = class Renderer {
56673
56545
  this._scene.scene.background = color;
56674
56546
  this.needsUpdate = true;
56675
56547
  }
56548
+ get modelMaterial() {
56549
+ return this._scene.modelMaterial;
56550
+ }
56551
+ set modelMaterial(material) {
56552
+ this._scene.modelMaterial = material;
56553
+ }
56676
56554
  /**
56677
56555
  * Signal dispatched at the end of each frame if the scene was updated, such as visibility changes.
56678
56556
  */
@@ -56697,6 +56575,12 @@ let Renderer$1 = class Renderer {
56697
56575
  this._renderText = value;
56698
56576
  this.textRenderer.domElement.style.display = value ? "block" : "none";
56699
56577
  }
56578
+ get smallGhostThreshold() {
56579
+ return this._scene.smallGhostThreshold;
56580
+ }
56581
+ set smallGhostThreshold(value) {
56582
+ this._scene.smallGhostThreshold = value;
56583
+ }
56700
56584
  /**
56701
56585
  * Returns the bounding box encompassing all rendered objects.
56702
56586
  * @param target - Box in which to copy the result. A new instance is created if undefined.
@@ -56736,7 +56620,6 @@ let Renderer$1 = class Renderer {
56736
56620
  this._composer.render();
56737
56621
  }
56738
56622
  this._needsUpdate = false;
56739
- this.skipAntialias = false;
56740
56623
  if (this.textEnabled && this._scene.has2dObjects()) {
56741
56624
  this.textRenderer.render(this._scene.scene, this._camera.three);
56742
56625
  }
@@ -57002,14 +56885,6 @@ function parseSettingsFromUrl(url) {
57002
56885
  groundColor: get3("skybox.groundColor", strToColor),
57003
56886
  sharpness: get3("skybox.sharpness", Number.parseFloat)
57004
56887
  },
57005
- groundPlane: {
57006
- visible: get3("groundPlane.visible", strToBool),
57007
- encoding: get3("groundPlane.encoding"),
57008
- texture: get3("groundPlane.texture"),
57009
- opacity: get3("groundPlane.opacity", Number.parseFloat),
57010
- color: get3("groundPlane.color", strToColor),
57011
- size: get3("groundPlane.size", Number.parseFloat)
57012
- },
57013
56888
  skylight: {
57014
56889
  skyColor: get3("skylight.skyColor", strToColor),
57015
56890
  groundColor: get3("skylight.groundColor", strToColor),
@@ -57037,9 +56912,9 @@ function parseSettingsFromUrl(url) {
57037
56912
  color: get3("materials.highlight.color", strToColor),
57038
56913
  opacity: get3("materials.highlight.opacity", Number.parseFloat)
57039
56914
  },
57040
- isolation: {
57041
- color: get3("materials.isolation.color", strToColor),
57042
- opacity: get3("materials.isolation.opacity", Number.parseFloat)
56915
+ ghost: {
56916
+ color: get3("materials.ghost.color", strToColor),
56917
+ opacity: get3("materials.ghost.opacity", Number.parseFloat)
57043
56918
  },
57044
56919
  section: {
57045
56920
  strokeWidth: get3("materials.section.strokeWidth", Number.parseFloat),
@@ -59704,6 +59579,7 @@ const promise = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.definePrope
59704
59579
  ControllablePromise,
59705
59580
  ResolvedPromise
59706
59581
  }, Symbol.toStringTag, { value: "Module" }));
59582
+ const DEFAULT_LOCAL_ULTRA_SERVER_URL = "ws://localhost:8123";
59707
59583
  class SocketClient {
59708
59584
  /**
59709
59585
  * Constructs a new Messenger instance.
@@ -59728,7 +59604,7 @@ class SocketClient {
59728
59604
  __publicField(this, "_state", { status: "disconnected" });
59729
59605
  __publicField(this, "_onStatusUpdate", new distExports.SimpleEventDispatcher());
59730
59606
  __publicField(this, "_connectPromise", new ResolvedPromise(void 0));
59731
- __publicField(this, "_connectingUrl");
59607
+ __publicField(this, "_connectionSettings");
59732
59608
  this._logger = logger;
59733
59609
  this._rpcCallId = 0;
59734
59610
  this._streamLogger = new StreamLogger(logger);
@@ -59761,14 +59637,22 @@ class SocketClient {
59761
59637
  * @returns The WebSocket URL as a string, or undefined if not set.
59762
59638
  */
59763
59639
  get url() {
59764
- return this._connectingUrl;
59640
+ var _a2;
59641
+ return (_a2 = this._connectionSettings) == null ? void 0 : _a2.url;
59765
59642
  }
59766
59643
  /**
59767
59644
  * Connects to a WebSocket server at the specified URL.
59768
59645
  * @param url - The WebSocket URL to connect to.
59769
59646
  * @returns A promise that resolves when the connection is established.
59770
59647
  */
59771
- connect(url) {
59648
+ connect(settings2) {
59649
+ settings2 = {
59650
+ url: (settings2 == null ? void 0 : settings2.url) ?? DEFAULT_LOCAL_ULTRA_SERVER_URL,
59651
+ retries: (settings2 == null ? void 0 : settings2.retries) ?? -1,
59652
+ timeout: (settings2 == null ? void 0 : settings2.timeout) ?? 5e3,
59653
+ retryDelay: (settings2 == null ? void 0 : settings2.retryDelay) ?? 5e3
59654
+ };
59655
+ const url = settings2.url;
59772
59656
  if (!isWebSocketUrl(url)) {
59773
59657
  this._disconnect({ status: "error", error: "connection", serverUrl: url });
59774
59658
  return Promise.reject(new Error(`Invalid WebSocket URL: ${url}`));
@@ -59778,17 +59662,18 @@ class SocketClient {
59778
59662
  return this._connectPromise.promise;
59779
59663
  } else {
59780
59664
  this._clearSocket();
59665
+ this._connectionSettings = void 0;
59781
59666
  this._connectPromise.reject("Connection to a different server");
59782
- this._connectPromise = new ControllablePromise();
59783
59667
  }
59784
- } else if (this._connectingUrl !== url) {
59668
+ }
59669
+ if (this.url !== url) {
59785
59670
  this._connectPromise = new ControllablePromise();
59786
- this._connectingUrl = url;
59671
+ this._connectionSettings = settings2;
59787
59672
  }
59788
59673
  this.updateState({ status: "connecting" });
59789
59674
  try {
59790
59675
  this._socket = new WebSocket(url);
59791
- this._connectionTimeout = setTimeout(() => this._onClose(), 5e3);
59676
+ this._connectionTimeout = setTimeout(() => this._onClose(), settings2.timeout);
59792
59677
  this._socket.onopen = (e) => {
59793
59678
  this._onOpen(e);
59794
59679
  };
@@ -59811,15 +59696,15 @@ class SocketClient {
59811
59696
  * Disconnects from the current WebSocket server.
59812
59697
  */
59813
59698
  disconnect(error) {
59814
- this._logger.log("Disconnecting from: ", this._connectingUrl);
59815
- this._connectingUrl = void 0;
59699
+ this._logger.log("Disconnecting from: ", this.url);
59700
+ this._connectionSettings = void 0;
59816
59701
  this._disconnect(error);
59817
59702
  }
59818
59703
  /**
59819
59704
  * Handles the disconnection logic, stopping logging and clearing the socket.
59820
59705
  */
59821
59706
  _disconnect(error) {
59822
- console.log("disconnect", error);
59707
+ this._logger.log("disconnect", error);
59823
59708
  clearTimeout(this._reconnectTimeout);
59824
59709
  clearTimeout(this._connectionTimeout);
59825
59710
  this._streamLogger.stopLogging();
@@ -59900,21 +59785,30 @@ class SocketClient {
59900
59785
  this._logger.log("Connected to: ", (_a2 = this._socket) == null ? void 0 : _a2.url);
59901
59786
  this.updateState({ status: "connected" });
59902
59787
  this._streamLogger.startLoggging();
59903
- this._connectPromise.resolve();
59788
+ this._connectPromise.resolve(true);
59904
59789
  }
59905
59790
  /**
59906
59791
  * Handler for WebSocket 'close' event.
59907
59792
  * @param _event - The event object.
59908
59793
  */
59909
59794
  _onClose(_event) {
59910
- clearTimeout(this._connectionTimeout);
59911
- this._disconnect({ status: "error", error: "connection", serverUrl: this._connectingUrl });
59795
+ const connecting = this.state.status === "connecting" || this.state.status === "validating";
59912
59796
  this._logger.log("WebSocket closed.");
59797
+ clearTimeout(this._connectionTimeout);
59798
+ this._disconnect({ status: "error", error: "connection", serverUrl: this.url });
59799
+ if (connecting && this._connectionSettings.retries === 0) {
59800
+ this._logger.log("No more retries left");
59801
+ this._connectPromise.resolve(false);
59802
+ return;
59803
+ }
59913
59804
  this._logger.log("Attempting to reconnect in 5 seconds");
59914
59805
  this._reconnectTimeout = setTimeout(() => {
59915
59806
  this.updateState({ status: "connecting" });
59916
- this.connect(this._connectingUrl);
59917
- }, 5e3);
59807
+ if (connecting) {
59808
+ this._connectionSettings.retries--;
59809
+ }
59810
+ this.connect(this._connectionSettings);
59811
+ }, this._connectionSettings.retryDelay);
59918
59812
  }
59919
59813
  /**
59920
59814
  * Sends binary data over the WebSocket connection.
@@ -60287,31 +60181,6 @@ class Decoder {
60287
60181
  this._pendingFrame = frame;
60288
60182
  }
60289
60183
  }
60290
- let DeferredPromise$1 = class DeferredPromise2 extends Promise {
60291
- constructor(executor = () => {
60292
- }) {
60293
- var _a2;
60294
- let resolver;
60295
- let rejector;
60296
- super((resolve, reject) => {
60297
- resolver = resolve;
60298
- rejector = reject;
60299
- return executor(resolve, reject);
60300
- });
60301
- __publicField(this, "resolve");
60302
- __publicField(this, "reject");
60303
- __publicField(this, "initialCallStack");
60304
- this.resolve = resolver;
60305
- this.reject = rejector;
60306
- this.initialCallStack = (_a2 = Error().stack) == null ? void 0 : _a2.split("\n").slice(2).join("\n");
60307
- }
60308
- /** @throws error with amended call stack */
60309
- rejectWithError(error) {
60310
- var _a2;
60311
- error.stack = [(_a2 = error.stack) == null ? void 0 : _a2.split("\n")[0], this.initialCallStack].join("\n");
60312
- this.reject(error);
60313
- }
60314
- };
60315
60184
  class LoadSuccess {
60316
60185
  constructor(vim) {
60317
60186
  __publicField(this, "isError", false);
@@ -60334,8 +60203,8 @@ class LoadError {
60334
60203
  let LoadRequest$1 = class LoadRequest {
60335
60204
  constructor() {
60336
60205
  __publicField(this, "_progress", 0);
60337
- __publicField(this, "_progressPromise", new DeferredPromise$1());
60338
- __publicField(this, "_completionPromise", new DeferredPromise$1());
60206
+ __publicField(this, "_progressPromise", new ControllablePromise());
60207
+ __publicField(this, "_completionPromise", new ControllablePromise());
60339
60208
  __publicField(this, "_result");
60340
60209
  }
60341
60210
  get isCompleted() {
@@ -60348,18 +60217,18 @@ let LoadRequest$1 = class LoadRequest {
60348
60217
  return;
60349
60218
  }
60350
60219
  while (this._result === void 0) {
60351
- await this._progressPromise;
60220
+ await this._progressPromise.promise;
60352
60221
  yield this._progress;
60353
60222
  }
60354
60223
  }
60355
60224
  async getResult() {
60356
- await this._completionPromise;
60225
+ await this._completionPromise.promise;
60357
60226
  return this._result;
60358
60227
  }
60359
60228
  onProgress(progress) {
60360
60229
  this._progress = progress;
60361
60230
  this._progressPromise.resolve();
60362
- this._progressPromise = new DeferredPromise$1();
60231
+ this._progressPromise = new ControllablePromise();
60363
60232
  }
60364
60233
  success(vim) {
60365
60234
  this._result = new LoadSuccess(vim);
@@ -61567,7 +61436,6 @@ class Renderer2 {
61567
61436
  }
61568
61437
  }
61569
61438
  }
61570
- const DEFAULT_LOCAL_ULTRA_SERVER_URL = "ws://localhost:8123";
61571
61439
  const INVALID_HANDLE = 4294967295;
61572
61440
  class Viewer2 {
61573
61441
  /**
@@ -61740,8 +61608,8 @@ class Viewer2 {
61740
61608
  * @param url - The server URL to connect to. Defaults to 'ws://localhost:8123'.
61741
61609
  * @returns A promise that resolves when the connection is established.
61742
61610
  */
61743
- async connect(url = DEFAULT_LOCAL_ULTRA_SERVER_URL) {
61744
- await this._socketClient.connect(url);
61611
+ async connect(settings2) {
61612
+ return this._socketClient.connect(settings2);
61745
61613
  }
61746
61614
  /**
61747
61615
  * Disconnects from the current VIM Ultra server.
@@ -61804,7 +61672,6 @@ const index$2 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.definePrope
61804
61672
  __proto__: null,
61805
61673
  Box3: Box32,
61806
61674
  ColorHandle,
61807
- DEFAULT_LOCAL_ULTRA_SERVER_URL,
61808
61675
  INVALID_HANDLE,
61809
61676
  Matrix44: Matrix4,
61810
61677
  RGB,
@@ -67000,12 +66867,13 @@ function anyUiSettingButton(settings2) {
67000
66867
  return isTrue(settings2.ui.projectInspector) || isTrue(settings2.ui.settings) || isTrue(settings2.ui.help) || isTrue(settings2.ui.maximise);
67001
66868
  }
67002
66869
  const defaultSettings = {
67003
- peformance: {
67004
- useFastMaterial: false
66870
+ materials: {
66871
+ useFastMaterial: false,
66872
+ useGhostMaterial: true,
66873
+ smallGhostThreshold: 10
67005
66874
  },
67006
66875
  isolation: {
67007
- enable: true,
67008
- useIsolationMaterial: true
66876
+ enable: true
67009
66877
  },
67010
66878
  capacity: {
67011
66879
  canFollowUrl: true,
@@ -67085,7 +66953,7 @@ function AxesPanel(props) {
67085
66953
  }, []);
67086
66954
  const onIsolationBtn = () => {
67087
66955
  props.settings.update(
67088
- (s) => s.isolation.useIsolationMaterial = !s.isolation.useIsolationMaterial
66956
+ (s) => s.materials.useGhostMaterial = !s.materials.useGhostMaterial
67089
66957
  );
67090
66958
  };
67091
66959
  const onHomeBtn = () => {
@@ -67095,11 +66963,11 @@ function AxesPanel(props) {
67095
66963
  const btnIsolation = /* @__PURE__ */ jsxRuntimeExports.jsx(
67096
66964
  "button",
67097
66965
  {
67098
- "data-tip": props.settings.value.isolation.useIsolationMaterial ? "Disable Ghosting" : "Enable Ghosting",
66966
+ "data-tip": props.settings.value.materials.useGhostMaterial ? "Disable Ghosting" : "Enable Ghosting",
67099
66967
  onClick: onIsolationBtn,
67100
66968
  className: "vim-isolation-btn " + btnStyle2,
67101
66969
  type: "button",
67102
- children: props.settings.value.isolation.useIsolationMaterial ? /* @__PURE__ */ jsxRuntimeExports.jsx(ghost, { height: 20, width: 20, fill: "currentColor" }) : /* @__PURE__ */ jsxRuntimeExports.jsx(ghostDead, { height: 20, width: 20, fill: "currentColor" })
66970
+ children: props.settings.value.materials.useGhostMaterial ? /* @__PURE__ */ jsxRuntimeExports.jsx(ghost, { height: 20, width: 20, fill: "currentColor" }) : /* @__PURE__ */ jsxRuntimeExports.jsx(ghostDead, { height: 20, width: 20, fill: "currentColor" })
67103
66971
  }
67104
66972
  );
67105
66973
  const btnHome = /* @__PURE__ */ jsxRuntimeExports.jsxs(
@@ -67629,7 +67497,7 @@ function ControlBar(props) {
67629
67497
  id: elementIds.buttonToggleIsolation,
67630
67498
  enabled: () => isTrue(props.settings.ui.toggleIsolation),
67631
67499
  tip: "Toggle Isolation",
67632
- action: () => props.isolation.toggleIsolation("controlBar"),
67500
+ action: () => props.isolation.toggle("controlBar"),
67633
67501
  icon: toggleIsolation,
67634
67502
  style: buttonDefaultStyle
67635
67503
  }
@@ -71650,7 +71518,7 @@ function VimContextMenu(props) {
71650
71518
  };
71651
71519
  const [clipping, setClipping] = useState(isClipping());
71652
71520
  const [, setVersion] = useState(0);
71653
- const hidden2 = props.isolation.any();
71521
+ const hidden2 = props.isolation.isActive();
71654
71522
  useEffect(() => {
71655
71523
  const subState = viewer.gizmos.section.onStateChanged.subscribe(() => {
71656
71524
  setSection({
@@ -74033,31 +73901,17 @@ function MenuSettings(props) {
74033
73901
  ),
74034
73902
  settingsSubtitle("Materials"),
74035
73903
  settingsToggle(
74036
- "Use Isolation Material",
74037
- (settings2) => settings2.isolation.useIsolationMaterial,
73904
+ "Use Ghost Material",
73905
+ (settings2) => settings2.materials.useGhostMaterial,
74038
73906
  (settings2, value) => {
74039
- settings2.isolation.useIsolationMaterial = value;
74040
- if (settings2.peformance.useFastMaterial && value) {
74041
- settings2.peformance.useFastMaterial = false;
74042
- }
73907
+ settings2.materials.useGhostMaterial = value;
74043
73908
  }
74044
73909
  ),
74045
73910
  settingsToggle(
74046
73911
  "Use Performance Material",
74047
- (settings2) => settings2.peformance.useFastMaterial,
73912
+ (settings2) => settings2.materials.useFastMaterial,
74048
73913
  (settings2, value) => {
74049
- settings2.peformance.useFastMaterial = value;
74050
- if (settings2.isolation.useIsolationMaterial && value) {
74051
- settings2.isolation.useIsolationMaterial = false;
74052
- }
74053
- }
74054
- ),
74055
- settingsSubtitle("Scene"),
74056
- settingsToggle(
74057
- "Show Ground Plane",
74058
- (_) => props.viewer.environment.groundPlane.visible,
74059
- (_, value) => {
74060
- props.viewer.environment.groundPlane.visible = value;
73914
+ settings2.materials.useFastMaterial = value;
74061
73915
  }
74062
73916
  ),
74063
73917
  settingsSubtitle("Panels"),
@@ -74331,7 +74185,6 @@ class ComponentInputs {
74331
74185
  __publicField(this, "_default");
74332
74186
  __publicField(this, "_isolation");
74333
74187
  __publicField(this, "_sideState");
74334
- __publicField(this, "_help");
74335
74188
  __publicField(this, "_getSelection", () => {
74336
74189
  return [...this._viewer.selection.objects].filter(
74337
74190
  (o) => o.type === "Object3D"
@@ -74361,7 +74214,7 @@ class ComponentInputs {
74361
74214
  return true;
74362
74215
  }
74363
74216
  case KEYS.KEY_I: {
74364
- this._isolation.toggleIsolation("keyboard");
74217
+ this._isolation.toggle("keyboard");
74365
74218
  return true;
74366
74219
  }
74367
74220
  case KEYS.KEY_ESCAPE: {
@@ -74369,7 +74222,7 @@ class ComponentInputs {
74369
74222
  this._viewer.selection.clear();
74370
74223
  return true;
74371
74224
  }
74372
- if (this._isolation.any()) {
74225
+ if (this._isolation.isActive()) {
74373
74226
  this._isolation.clear("keyboard");
74374
74227
  return true;
74375
74228
  }
@@ -74451,7 +74304,6 @@ function useSettings(viewer, value) {
74451
74304
  var _a2;
74452
74305
  const next = { ...settings2 };
74453
74306
  updater(next);
74454
- validateSettings(next);
74455
74307
  saveSettingsToLocal(next);
74456
74308
  setSettings(next);
74457
74309
  (_a2 = onUpdate.current) == null ? void 0 : _a2.call(onUpdate, next);
@@ -74471,11 +74323,6 @@ function useSettings(viewer, value) {
74471
74323
  [settings2]
74472
74324
  );
74473
74325
  }
74474
- function validateSettings(settings2) {
74475
- if (settings2.peformance.useFastMaterial && settings2.isolation.useIsolationMaterial) {
74476
- settings2.peformance.useFastMaterial = false;
74477
- }
74478
- }
74479
74326
  function applySettings(viewer, settings2) {
74480
74327
  const performance2 = document.getElementsByClassName("vim-performance-div")[0];
74481
74328
  if (performance2) {
@@ -74485,240 +74332,192 @@ function applySettings(viewer, settings2) {
74485
74332
  performance2.classList.add("vc-hidden");
74486
74333
  }
74487
74334
  }
74488
- viewer.vims.forEach((v) => {
74489
- if (settings2.peformance.useFastMaterial && v.scene.material === void 0) {
74490
- v.scene.material = viewer.materials.simple;
74491
- }
74492
- if (!settings2.peformance.useFastMaterial && v.scene.material === viewer.materials.simple) {
74493
- v.scene.material = void 0;
74494
- }
74495
- });
74335
+ viewer.renderer.smallGhostThreshold = settings2.materials.smallGhostThreshold;
74496
74336
  }
74497
74337
  class Isolation {
74338
+ /**
74339
+ * Constructs an IsolationManager.
74340
+ *
74341
+ * @param viewer - The VIM Viewer responsible for managing the 3D scene and objects.
74342
+ * @param camera - A component that handles camera control and framing.
74343
+ * @param settings - The settings that control isolation and material usage.
74344
+ */
74498
74345
  constructor(viewer, camera2, settings2) {
74499
74346
  __publicField(this, "_viewer");
74500
74347
  __publicField(this, "_settings");
74501
- __publicField(this, "_isolation");
74502
- __publicField(this, "_lastIsolation");
74348
+ __publicField(this, "_isolation", []);
74503
74349
  __publicField(this, "_camera");
74504
- __publicField(this, "_references", /* @__PURE__ */ new Map());
74505
74350
  __publicField(this, "_onChanged", new distExports.SimpleEventDispatcher());
74506
74351
  this._viewer = viewer;
74507
74352
  this._camera = camera2;
74508
74353
  this.applySettings(settings2);
74509
74354
  }
74510
- /** Signal dispatched when the isolation set changes. */
74355
+ /**
74356
+ * An event that is dispatched whenever the isolation set changes.
74357
+ *
74358
+ * @remarks
74359
+ * This can be used by other parts of the application to react to isolation
74360
+ * updates (for example, updating UI or triggering additional viewport actions).
74361
+ *
74362
+ * @returns {ISimpleEvent<string>} Event interface for subscribing to isolation changes.
74363
+ */
74511
74364
  get onChanged() {
74512
74365
  return this._onChanged.asEvent();
74513
74366
  }
74514
74367
  /**
74515
- * Applies relevant settings to isolation.
74516
- * @param settings The settings to be applied to isolation.
74368
+ * Applies relevant settings to the isolation behavior.
74369
+ *
74370
+ * @param settings - The new settings to apply.
74371
+ *
74372
+ * @remarks
74373
+ * This updates the internal reference to settings and immediately sets
74374
+ * the material based on whether isolation is currently active.
74517
74375
  */
74518
74376
  applySettings(settings2) {
74519
- var _a2;
74520
74377
  this._settings = settings2;
74521
74378
  if (!this._settings.isolation.enable) return;
74522
- const set3 = new Set((_a2 = this._isolation) == null ? void 0 : _a2.map((o) => o.vim));
74523
- this._viewer.vims.forEach((v) => {
74524
- v.scene.material = this.getMaterial(this._settings, set3.has(v));
74525
- });
74379
+ this._viewer.renderer.modelMaterial = this.getMaterial(this._settings, this.isActive());
74526
74380
  }
74527
74381
  /**
74528
- * Sets the reference objects for a given VIM.
74529
- * @param vim The VIM for which reference objects are being set.
74530
- * @param reference An array of reference objects or the string 'always' to indicate permanent reference.
74382
+ * Checks if isolation is currently active (i.e., any objects are isolated).
74383
+ *
74384
+ * @returns True if isolation is active; otherwise, false.
74531
74385
  */
74532
- setReference(vim, reference) {
74533
- const value = reference === "always" ? reference : new Set(reference);
74534
- this._references.set(vim, value);
74386
+ isActive() {
74387
+ return this._isolation.length > 0;
74535
74388
  }
74536
74389
  /**
74537
- * Retrieves the reference objects set for a given VIM.
74538
- * @param vim The VIM for which reference objects are being retrieved.
74539
- * @returns The reference objects set for the specified VIM.
74540
- */
74541
- getReference(vim) {
74542
- return this._references.get(vim);
74543
- }
74544
- /**
74545
- * Clears all reference objects set for VIMs.
74546
- */
74547
- clearReferences() {
74548
- this._references.clear();
74549
- }
74550
- /**
74551
- * Returns true if there are currently objects isolated.
74552
- * @returns True if there are currently objects isolated; otherwise, false.
74553
- */
74554
- any() {
74555
- return this._isolation !== void 0;
74556
- }
74557
- /**
74558
- * Returns the current array of isolated objects.
74559
- * @returns The array of objects currently isolated, or undefined if no objects are isolated.
74390
+ * Retrieves the current array of isolated objects.
74391
+ *
74392
+ * @returns An array of isolated objects, or undefined if isolation is not active.
74560
74393
  */
74561
74394
  current() {
74562
74395
  return this._isolation;
74563
74396
  }
74564
74397
  /**
74565
- * Isolates the objects in the given array and shows the rest as ghost.
74566
- * @param objects An array of objects to isolate.
74567
- * @param source The source of isolation.
74568
- * @returns True if isolation occurs; otherwise, false.
74398
+ * Sets the specified objects as isolated, hiding or ghosting the rest.
74399
+ *
74400
+ * @param objects - The objects to isolate.
74401
+ * @param source - A label or identifier indicating the source of this action (e.g., "user").
74569
74402
  */
74570
74403
  isolate(objects, source) {
74571
74404
  if (!this._settings.isolation.enable) return;
74572
- if (this._isolation) {
74573
- this._lastIsolation = this._isolation;
74574
- }
74575
- const isolated = this._isolate(this._viewer, this._settings, objects);
74576
- this._isolation = isolated ? objects : void 0;
74405
+ this._isolation = objects ?? [];
74406
+ this._apply(source);
74577
74407
  this._camera.frameVisibleObjects();
74578
- this._onChanged.dispatch(source);
74579
- return isolated;
74580
74408
  }
74581
74409
  /**
74582
- * Toggles current isolation based on selection.
74583
- * @param source The source of isolation.
74410
+ * Toggles isolation by using the current selection.
74411
+ *
74412
+ * @param source - A label or identifier for the isolation action.
74413
+ *
74414
+ * @remarks
74415
+ * This method replaces the current isolation set with whatever objects are
74416
+ * currently selected. If selection is empty, it effectively clears isolation.
74584
74417
  */
74585
- toggleIsolation(source) {
74418
+ toggle(source) {
74586
74419
  if (!this._settings.isolation.enable) return;
74587
- const selection = [...this._viewer.selection.objects].filter((o) => o.type === "Object3D");
74588
- if (this._isolation) {
74589
- this._lastIsolation = this._isolation;
74590
- }
74591
- if (this._isolation) {
74592
- if (selection.length === 0 || ArrayEquals(this._isolation, selection)) {
74593
- this._showAll();
74594
- this._isolation = void 0;
74595
- } else {
74596
- const isolated = this._isolate(this._viewer, this._settings, selection);
74597
- this._isolation = isolated ? selection : void 0;
74598
- this._camera.frameVisibleObjects();
74599
- this._viewer.selection.clear();
74600
- }
74601
- } else {
74602
- if (selection.length > 0) {
74603
- const isolated = this._isolate(this._viewer, this._settings, selection);
74604
- this._isolation = isolated ? selection : void 0;
74605
- this._camera.frameVisibleObjects();
74606
- this._viewer.selection.clear();
74607
- } else if (this._lastIsolation) {
74608
- const isolated = this._isolate(
74609
- this._viewer,
74610
- this._settings,
74611
- this._lastIsolation
74612
- );
74613
- this._isolation = isolated ? [...this._lastIsolation] : void 0;
74614
- }
74615
- }
74616
- this._onChanged.dispatch(source);
74420
+ this._isolation = [...this._viewer.selection.objects].filter((o) => o.type === "Object3D");
74421
+ this._apply(source);
74422
+ this._camera.frameVisibleObjects();
74423
+ this._viewer.selection.clear();
74617
74424
  }
74618
74425
  /**
74619
- * Removes the given objects from the isolation set.
74620
- * @param objects An array of objects to be removed from isolation.
74621
- * @param source The source of the removal operation.
74426
+ * Hides the specified objects from the isolation set.
74427
+ *
74428
+ * @param objects - The objects to hide.
74429
+ * @param source - A label or identifier for the isolation action.
74430
+ *
74431
+ * @remarks
74432
+ * If there is no active isolation set (i.e., all objects are visible),
74433
+ * the method first treats all objects in the scene as isolated,
74434
+ * and then removes the specified objects. This ensures the specified
74435
+ * objects become hidden.
74622
74436
  */
74623
74437
  hide(objects, source) {
74624
74438
  if (!this._settings.isolation.enable) return;
74625
- const selection = new Set(objects);
74626
- const initial = this._isolation ?? this._viewer.vims[0].getObjects();
74627
- const result = [];
74628
- for (const obj of initial) {
74629
- if (!selection.has(obj)) result.push(obj);
74630
- }
74631
- const isolated = this._isolate(this._viewer, this._settings, result);
74632
- this._isolation = isolated ? result : void 0;
74633
- this._onChanged.dispatch(source);
74439
+ this._isolation = this._isolation.length === 0 ? this.getAllObjects() : this._isolation;
74440
+ this._isolation = this._isolation.filter((o) => !objects.includes(o));
74441
+ this._apply(source);
74634
74442
  objects.forEach((o) => this._viewer.selection.remove(o));
74635
74443
  }
74636
74444
  /**
74637
- * Adds the given objects to the isolation set.
74638
- * @param objects An array of objects to be added to isolation.
74639
- * @param source The source of the addition operation.
74445
+ * Adds the specified objects to the current isolation set (making them visible).
74446
+ *
74447
+ * @param objects - The objects to show.
74448
+ * @param source - A label or identifier for the isolation action.
74640
74449
  */
74641
74450
  show(objects, source) {
74642
74451
  if (!this._settings.isolation.enable) return;
74643
- const isolation = this._isolation ?? [];
74644
- objects.forEach((o) => isolation.push(o));
74645
- const result = [...new Set(isolation)];
74646
- const isolated = this._isolate(this._viewer, this._settings, result);
74647
- this._isolation = isolated ? result : void 0;
74648
- this._onChanged.dispatch(source);
74452
+ objects.forEach((o) => this._isolation.push(o));
74453
+ this._apply(source);
74649
74454
  }
74650
74455
  /**
74651
- * Clears the current isolation.
74652
- * @param source The source of the isolation clearing operation.
74456
+ * Clears the current isolation set, making all objects visible.
74457
+ *
74458
+ * @param source - A label or identifier for the isolation action.
74653
74459
  */
74654
74460
  clear(source) {
74655
74461
  if (!this._settings.isolation.enable) return;
74656
- this._showAll();
74657
- this._lastIsolation = this._isolation;
74658
- this._isolation = void 0;
74659
- this._onChanged.dispatch(source);
74462
+ this._isolation.length = 0;
74463
+ this._apply(source);
74660
74464
  }
74661
74465
  /**
74662
- * Show all objects and quit isolation mode.
74466
+ * Constructs the correct material (or array of materials) based on the given settings.
74467
+ *
74468
+ * @param settings - The current component settings, including isolation rules.
74469
+ * @param isolate - Whether or not isolation is active.
74470
+ * @returns The material(s) to assign to the renderer, or undefined if default materials should be used.
74471
+ *
74472
+ * @remarks
74473
+ * - If isolation is active and `useGhostMaterial` is true, an array containing
74474
+ * the simple and ghost materials is returned.
74475
+ * - If fast materials are enabled, the simple material is returned.
74476
+ * - Otherwise, defaults to undefined, allowing the system to pick a standard material.
74663
74477
  */
74664
- _showAll() {
74665
- this._viewer.vims.forEach((v) => {
74666
- for (const obj of v.getObjects()) {
74667
- obj.visible = true;
74668
- }
74669
- v.scene.material = this.getMaterial(this._settings, false);
74670
- });
74671
- }
74672
74478
  getMaterial(settings2, isolate) {
74673
- if (settings2.peformance.useFastMaterial) {
74674
- return this._viewer.materials.simple;
74675
- }
74676
- if (!settings2.isolation.useIsolationMaterial) {
74677
- return void 0;
74479
+ if (isolate && settings2.materials.useGhostMaterial) {
74480
+ return [this._viewer.materials.simple, this._viewer.materials.ghost];
74678
74481
  }
74679
- if (!isolate) {
74680
- return void 0;
74482
+ if (settings2.materials.useFastMaterial) {
74483
+ return this._viewer.materials.simple;
74681
74484
  }
74682
- return this._viewer.materials.isolation;
74485
+ return void 0;
74683
74486
  }
74684
- _isolate(viewer, settings2, objects) {
74685
- let useIsolation = false;
74686
- if (!objects) {
74687
- this._showAll();
74688
- } else {
74689
- const set3 = new Set(objects);
74690
- let all = true;
74691
- viewer.vims.forEach((vim) => {
74692
- for (const obj of vim.getObjects()) {
74693
- if (obj.hasMesh) {
74694
- obj.visible = set3.has(obj);
74695
- all = all && obj.visible;
74696
- }
74697
- }
74698
- const reference = this._references.get(vim);
74699
- if (reference === void 0) {
74700
- useIsolation = !all;
74701
- } else if (reference === "always") {
74702
- useIsolation = true;
74703
- } else {
74704
- useIsolation = !setsEqual(reference, set3);
74487
+ /**
74488
+ * Applies the current isolation state: sets visibility for objects, updates materials,
74489
+ * and dispatches the changed event.
74490
+ *
74491
+ * @param source - A label or identifier for the isolation action.
74492
+ */
74493
+ _apply(source) {
74494
+ let all = true;
74495
+ let any = false;
74496
+ const set3 = this._isolation.length > 0 ? new Set(this._isolation) : void 0;
74497
+ this._viewer.vims.forEach((vim) => {
74498
+ for (const obj of vim.getObjects()) {
74499
+ if (obj.hasMesh) {
74500
+ obj.visible = (set3 == null ? void 0 : set3.has(obj)) ?? true;
74501
+ all = all && obj.visible;
74502
+ any = any || obj.visible;
74705
74503
  }
74706
- vim.scene.material = this.getMaterial(this._settings, useIsolation);
74707
- });
74708
- }
74709
- return useIsolation;
74710
- }
74711
- }
74712
- function setsEqual(set1, set22) {
74713
- if (set1.size !== set22.size) {
74714
- return false;
74504
+ }
74505
+ });
74506
+ this._viewer.renderer.modelMaterial = this.getMaterial(this._settings, any && !all);
74507
+ this._onChanged.dispatch(source);
74715
74508
  }
74716
- for (const item of set1) {
74717
- if (!set22.has(item)) {
74718
- return false;
74719
- }
74509
+ /**
74510
+ * Gathers all objects from all loaded VIM instances.
74511
+ *
74512
+ * @returns An array of all objects within the loaded VIM scenes.
74513
+ */
74514
+ getAllObjects() {
74515
+ let objects = [];
74516
+ this._viewer.vims.forEach((vim) => {
74517
+ objects = objects.concat(vim.getObjects());
74518
+ });
74519
+ return objects;
74720
74520
  }
74721
- return true;
74722
74521
  }
74723
74522
  class ComponentCamera {
74724
74523
  constructor(viewer) {
@@ -74985,7 +74784,7 @@ const bimInfoData = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineP
74985
74784
  __proto__: null,
74986
74785
  useBimInfo
74987
74786
  }, Symbol.toStringTag, { value: "Module" }));
74988
- class DeferredPromise3 extends Promise {
74787
+ class DeferredPromise2 extends Promise {
74989
74788
  constructor(executor = () => {
74990
74789
  }) {
74991
74790
  var _a2;
@@ -75016,9 +74815,9 @@ class LoadRequest2 {
75016
74815
  __publicField(this, "_callbacks");
75017
74816
  __publicField(this, "_request");
75018
74817
  __publicField(this, "_progress", { loaded: 0, total: 0, all: /* @__PURE__ */ new Map() });
75019
- __publicField(this, "_progressPromise", new DeferredPromise3());
74818
+ __publicField(this, "_progressPromise", new DeferredPromise2());
75020
74819
  __publicField(this, "_isDone", false);
75021
- __publicField(this, "_completionPromise", new DeferredPromise3());
74820
+ __publicField(this, "_completionPromise", new DeferredPromise2());
75022
74821
  this.source = source;
75023
74822
  this._callbacks = callbacks;
75024
74823
  this.startRequest(source, settings2);
@@ -75039,7 +74838,7 @@ class LoadRequest2 {
75039
74838
  this._callbacks.onProgress(progress);
75040
74839
  this._progress = progress;
75041
74840
  this._progressPromise.resolve();
75042
- this._progressPromise = new DeferredPromise3();
74841
+ this._progressPromise = new DeferredPromise2();
75043
74842
  }
75044
74843
  onSuccess() {
75045
74844
  this._callbacks.onDone();
@@ -75399,7 +75198,7 @@ function setComponentBehind(value) {
75399
75198
  }
75400
75199
  }
75401
75200
  function createWebglComponent(container, componentSettings = {}, viewerSettings = {}) {
75402
- const promise2 = new DeferredPromise3();
75201
+ const promise2 = new DeferredPromise2();
75403
75202
  const cmpContainer = container instanceof HTMLElement ? createContainer(container) : container ?? createContainer();
75404
75203
  const viewer = new Viewer$1(viewerSettings);
75405
75204
  viewer.viewport.reparent(cmpContainer.gfx);
@@ -75862,7 +75661,7 @@ function getRequestErrorMessage(source, error) {
75862
75661
  }
75863
75662
  }
75864
75663
  function createUltraComponent(container) {
75865
- const promise2 = new DeferredPromise3();
75664
+ const promise2 = new DeferredPromise2();
75866
75665
  const cmpContainer = container instanceof HTMLElement ? createContainer(container) : container ?? createContainer();
75867
75666
  const viewer = Viewer2.createWithCanvas(cmpContainer.gfx);
75868
75667
  const reactRoot = clientExports.createRoot(cmpContainer.ui);
@@ -75904,7 +75703,7 @@ function updateModal(modal, state) {
75904
75703
  }
75905
75704
  if (state.status === "connecting") {
75906
75705
  if (modal.current === void 0 || modal.current.type === "loading") {
75907
- modal.loading({ message: "Connecting to VIM Ultra server..." });
75706
+ modal.loading({ message: "Initializing..." });
75908
75707
  }
75909
75708
  }
75910
75709
  if (state.status === "error") {