@xeokit/xeokit-sdk 2.5.2-beta-5 → 2.5.2-beta-8

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.
@@ -12154,8 +12154,13 @@ class AngleMeasurementsMouseControl extends AngleMeasurementsControl {
12154
12154
  mouseHoverCanvasPos.set(canvasPos);
12155
12155
  switch (this._mouseState) {
12156
12156
  case MOUSE_FINDING_ORIGIN:
12157
- this.markerDiv.style.marginLeft = `${canvasPos[0] - 5}px`;
12158
- this.markerDiv.style.marginTop = `${canvasPos[1] - 5}px`;
12157
+ const canvasBoundRect = canvas.getBoundingClientRect();
12158
+ const scrollLeft = window.pageXOffset || document.documentElement.scrollLeft;
12159
+ const scrollTop = window.pageYOffset || document.documentElement.scrollTop;
12160
+ const canvasLeftEdge = canvasBoundRect.left + scrollLeft;
12161
+ const canvasTopEdge = canvasBoundRect.top + scrollTop;
12162
+ this._markerDiv.style.marginLeft = `${canvasLeftEdge + canvasPos[0] - 5}px`;
12163
+ this._markerDiv.style.marginTop = `${canvasTopEdge + canvasPos[1] - 5}px`;
12159
12164
  break;
12160
12165
  case MOUSE_FINDING_CORNER:
12161
12166
  if (this._currentAngleMeasurement) {
@@ -80323,8 +80328,6 @@ class SceneModel extends Component {
80323
80328
  this._vboBatchingLayers = {};
80324
80329
  this._dtxLayers = {};
80325
80330
 
80326
- this._meshList = [];
80327
-
80328
80331
  this.layerList = []; // For GL state efficiency when drawing, InstancingLayers are in first part, BatchingLayers are in second
80329
80332
  this._entityList = [];
80330
80333
 
@@ -80337,6 +80340,7 @@ class SceneModel extends Component {
80337
80340
  this._entities = {};
80338
80341
 
80339
80342
  this._scheduledMeshes = {};
80343
+ this._meshesCfgsBeforeMeshCreation = {};
80340
80344
 
80341
80345
  /** @private **/
80342
80346
  this.renderFlags = new RenderFlags();
@@ -81867,7 +81871,7 @@ class SceneModel extends Component {
81867
81871
  /**
81868
81872
  * Creates a new {@link SceneModelMesh} within this SceneModel.
81869
81873
  *
81870
- * * Stores the new SceneModelMesh in {@link SceneModel#meshes}.
81874
+ * * It prepares and saves data for a SceneModelMesh {@link SceneModel#meshes} creation. SceneModelMesh will be created only once the SceneModelEntity (which references this particular SceneModelMesh) will be created.
81871
81875
  * * The SceneModelMesh can either define its own geometry or share it with other SceneModelMeshes. To define own geometry, provide the
81872
81876
  * various geometry arrays to this method. To share a geometry, provide the ID of a geometry created earlier
81873
81877
  * with {@link SceneModel#createGeometry}.
@@ -81902,18 +81906,18 @@ class SceneModel extends Component {
81902
81906
  * @param {Number} [cfg.opacity=1] Opacity in range ````[0..1]````. Overridden by texture set ````colorTexture````.
81903
81907
  * @param {Number} [cfg.metallic=0] Metallic factor in range ````[0..1]````. Overridden by texture set ````metallicRoughnessTexture````.
81904
81908
  * @param {Number} [cfg.roughness=1] Roughness factor in range ````[0..1]````. Overridden by texture set ````metallicRoughnessTexture````.
81905
- * @returns {SceneModelMesh} The new mesh.
81909
+ * @returns {Boolean} True = successfully mesh was created. False = error during creation of a mesh.
81906
81910
  */
81907
81911
  createMesh(cfg) {
81908
81912
 
81909
81913
  if (cfg.id === undefined || cfg.id === null) {
81910
81914
  this.error("[createMesh] SceneModel.createMesh() config missing: id");
81911
- return;
81915
+ return false;
81912
81916
  }
81913
81917
 
81914
81918
  if (this._scheduledMeshes[cfg.id]) {
81915
81919
  this.error(`[createMesh] SceneModel already has a mesh with this ID: ${cfg.id}`);
81916
- return;
81920
+ return false;
81917
81921
  }
81918
81922
 
81919
81923
  const instancing = (cfg.geometryId !== undefined);
@@ -81928,31 +81932,31 @@ class SceneModel extends Component {
81928
81932
  }
81929
81933
  if (cfg.primitive !== "points" && cfg.primitive !== "lines" && cfg.primitive !== "triangles" && cfg.primitive !== "solid" && cfg.primitive !== "surface") {
81930
81934
  this.error(`Unsupported value for 'primitive': '${primitive}' ('geometryId' is absent) - supported values are 'points', 'lines', 'triangles', 'solid' and 'surface'.`);
81931
- return;
81935
+ return false;
81932
81936
  }
81933
81937
  if (!cfg.positions && !cfg.positionsCompressed && !cfg.buckets) {
81934
81938
  this.error("Param expected: 'positions', 'positionsCompressed' or `buckets` ('geometryId' is absent)");
81935
- return null;
81939
+ return false;
81936
81940
  }
81937
81941
  if (cfg.positions && (cfg.positionsDecodeMatrix || cfg.positionsDecodeBoundary)) {
81938
81942
  this.error("Illegal params: 'positions' not expected with 'positionsDecodeMatrix'/'positionsDecodeBoundary' ('geometryId' is absent)");
81939
- return null;
81943
+ return false;
81940
81944
  }
81941
81945
  if (cfg.positionsCompressed && !cfg.positionsDecodeMatrix && !cfg.positionsDecodeBoundary) {
81942
81946
  this.error("Param expected: 'positionsCompressed' should be accompanied by 'positionsDecodeMatrix'/'positionsDecodeBoundary' ('geometryId' is absent)");
81943
- return null;
81947
+ return false;
81944
81948
  }
81945
81949
  if (cfg.uvCompressed && !cfg.uvDecodeMatrix) {
81946
81950
  this.error("Param expected: 'uvCompressed' should be accompanied by `uvDecodeMatrix` ('geometryId' is absent)");
81947
- return null;
81951
+ return false;
81948
81952
  }
81949
81953
  if (!cfg.buckets && !cfg.indices && cfg.primitive !== "points") {
81950
81954
  this.error(`Param expected: indices (required for '${cfg.primitive}' primitive type)`);
81951
- return null;
81955
+ return false;
81952
81956
  }
81953
81957
  if ((cfg.matrix || cfg.position || cfg.rotation || cfg.scale) && (cfg.positionsCompressed || cfg.positionsDecodeBoundary)) {
81954
81958
  this.error("Unexpected params: 'matrix', 'rotation', 'scale', 'position' not allowed with 'positionsCompressed'");
81955
- return null;
81959
+ return false;
81956
81960
  }
81957
81961
 
81958
81962
  const useDTX = (!!this._dtxEnabled && (cfg.primitive === "triangles"
@@ -82117,7 +82121,7 @@ class SceneModel extends Component {
82117
82121
  cfg.textureSet = this._textureSets[cfg.textureSetId];
82118
82122
  if (!cfg.textureSet) {
82119
82123
  this.error(`[createMesh] Texture set not found: ${cfg.textureSetId} - ensure that you create it first with createTextureSet()`);
82120
- return;
82124
+ return false;
82121
82125
  }
82122
82126
  }
82123
82127
  }
@@ -82128,13 +82132,13 @@ class SceneModel extends Component {
82128
82132
 
82129
82133
  if (cfg.positions || cfg.positionsCompressed || cfg.indices || cfg.edgeIndices || cfg.normals || cfg.normalsCompressed || cfg.uv || cfg.uvCompressed || cfg.positionsDecodeMatrix) {
82130
82134
  this.error(`Mesh geometry parameters not expected when instancing a geometry (not expected: positions, positionsCompressed, indices, edgeIndices, normals, normalsCompressed, uv, uvCompressed, positionsDecodeMatrix)`);
82131
- return;
82135
+ return false;
82132
82136
  }
82133
82137
 
82134
82138
  cfg.geometry = this._geometries[cfg.geometryId];
82135
82139
  if (!cfg.geometry) {
82136
82140
  this.error(`[createMesh] Geometry not found: ${cfg.geometryId} - ensure that you create it first with createGeometry()`);
82137
- return;
82141
+ return false;
82138
82142
  }
82139
82143
 
82140
82144
  cfg.origin = cfg.origin ? math.addVec3(this._origin, cfg.origin, math.vec3()) : this._origin;
@@ -82148,7 +82152,7 @@ class SceneModel extends Component {
82148
82152
 
82149
82153
  if (!cfg.transform) {
82150
82154
  this.error(`[createMesh] Transform not found: ${cfg.transformId} - ensure that you create it first with createTransform()`);
82151
- return;
82155
+ return false;
82152
82156
  }
82153
82157
 
82154
82158
  cfg.aabb = cfg.geometry.aabb;
@@ -82216,7 +82220,7 @@ class SceneModel extends Component {
82216
82220
  cfg.textureSet = this._textureSets[cfg.textureSetId];
82217
82221
  // if (!cfg.textureSet) {
82218
82222
  // this.error(`[createMesh] Texture set not found: ${cfg.textureSetId} - ensure that you create it first with createTextureSet()`);
82219
- // return;
82223
+ // return false;
82220
82224
  // }
82221
82225
  }
82222
82226
  }
@@ -82224,7 +82228,9 @@ class SceneModel extends Component {
82224
82228
 
82225
82229
  cfg.numPrimitives = this._getNumPrimitives(cfg);
82226
82230
 
82227
- return this._createMesh(cfg);
82231
+ this._meshesCfgsBeforeMeshCreation[cfg.id] = cfg;
82232
+
82233
+ return true;
82228
82234
  }
82229
82235
 
82230
82236
  _createMesh(cfg) {
@@ -82256,8 +82262,6 @@ class SceneModel extends Component {
82256
82262
  cfg.meshMatrix = cfg.transform.worldMatrix;
82257
82263
  }
82258
82264
  mesh.portionId = mesh.layer.createPortion(mesh, cfg);
82259
- this._meshes[cfg.id] = mesh;
82260
- this._meshList.push(mesh);
82261
82265
  return mesh;
82262
82266
  }
82263
82267
 
@@ -82616,10 +82620,15 @@ class SceneModel extends Component {
82616
82620
  let meshes = [];
82617
82621
  for (let i = 0, len = cfg.meshIds.length; i < len; i++) {
82618
82622
  const meshId = cfg.meshIds[i];
82619
- const mesh = this._meshes[meshId];
82620
- if (!mesh) {
82621
- this.error(`Mesh with this ID not found: "${meshId}" - ignoring this mesh`);
82622
- continue;
82623
+ let mesh = this._meshes[meshId]; // Trying to get already created mesh
82624
+ if (!mesh) { // Checks if there is already created mesh for this meshId
82625
+ let meshCfg = this._meshesCfgsBeforeMeshCreation[meshId]; // Trying to get already created cfg
82626
+ if (!meshCfg) { // Checks if there is already created cfg for this meshId
82627
+ this.error(`Mesh with this ID not found: "${meshId}" - ignoring this mesh`); // There is no such cfg
82628
+ continue;
82629
+ }
82630
+ mesh = this._createMesh(meshCfg); // There is no such mesh yet, but there is already created cfg, so it creates this mesh
82631
+ this._meshes[cfg.id] = mesh; // Now it will also add this mesh to dictionary of created meshes
82623
82632
  }
82624
82633
  if (mesh.parent) {
82625
82634
  this.error(`Mesh with ID "${meshId}" already belongs to object with ID "${mesh.parent.id}" - ignoring this mesh`);
@@ -85529,8 +85538,15 @@ class DistanceMeasurementsMouseControl extends DistanceMeasurementsControl {
85529
85538
  pointerWorldPos.set(event.worldPos);
85530
85539
  pointerCanvasPos.set(event.canvasPos);
85531
85540
  if (this._mouseState === MOUSE_FIRST_CLICK_EXPECTED) {
85532
- this._markerDiv.style.marginLeft = `${canvasPos[0] - 5}px`;
85533
- this._markerDiv.style.marginTop = `${canvasPos[1] - 5}px`;
85541
+
85542
+ const canvasBoundRect = canvas.getBoundingClientRect();
85543
+ const scrollLeft = window.pageXOffset || document.documentElement.scrollLeft;
85544
+ const scrollTop = window.pageYOffset || document.documentElement.scrollTop;
85545
+ const canvasLeftEdge = canvasBoundRect.left + scrollLeft;
85546
+ const canvasTopEdge = canvasBoundRect.top + scrollTop;
85547
+
85548
+ this._markerDiv.style.marginLeft = `${canvasLeftEdge + canvasPos[0] - 5}px`;
85549
+ this._markerDiv.style.marginTop = `${canvasTopEdge + canvasPos[1] - 5}px`;
85534
85550
  this._markerDiv.style.background = "pink";
85535
85551
  if (event.snappedToVertex || event.snappedToEdge) {
85536
85552
  if (this.pointerLens) {
@@ -12150,8 +12150,13 @@ class AngleMeasurementsMouseControl extends AngleMeasurementsControl {
12150
12150
  mouseHoverCanvasPos.set(canvasPos);
12151
12151
  switch (this._mouseState) {
12152
12152
  case MOUSE_FINDING_ORIGIN:
12153
- this.markerDiv.style.marginLeft = `${canvasPos[0] - 5}px`;
12154
- this.markerDiv.style.marginTop = `${canvasPos[1] - 5}px`;
12153
+ const canvasBoundRect = canvas.getBoundingClientRect();
12154
+ const scrollLeft = window.pageXOffset || document.documentElement.scrollLeft;
12155
+ const scrollTop = window.pageYOffset || document.documentElement.scrollTop;
12156
+ const canvasLeftEdge = canvasBoundRect.left + scrollLeft;
12157
+ const canvasTopEdge = canvasBoundRect.top + scrollTop;
12158
+ this._markerDiv.style.marginLeft = `${canvasLeftEdge + canvasPos[0] - 5}px`;
12159
+ this._markerDiv.style.marginTop = `${canvasTopEdge + canvasPos[1] - 5}px`;
12155
12160
  break;
12156
12161
  case MOUSE_FINDING_CORNER:
12157
12162
  if (this._currentAngleMeasurement) {
@@ -80319,8 +80324,6 @@ class SceneModel extends Component {
80319
80324
  this._vboBatchingLayers = {};
80320
80325
  this._dtxLayers = {};
80321
80326
 
80322
- this._meshList = [];
80323
-
80324
80327
  this.layerList = []; // For GL state efficiency when drawing, InstancingLayers are in first part, BatchingLayers are in second
80325
80328
  this._entityList = [];
80326
80329
 
@@ -80333,6 +80336,7 @@ class SceneModel extends Component {
80333
80336
  this._entities = {};
80334
80337
 
80335
80338
  this._scheduledMeshes = {};
80339
+ this._meshesCfgsBeforeMeshCreation = {};
80336
80340
 
80337
80341
  /** @private **/
80338
80342
  this.renderFlags = new RenderFlags();
@@ -81863,7 +81867,7 @@ class SceneModel extends Component {
81863
81867
  /**
81864
81868
  * Creates a new {@link SceneModelMesh} within this SceneModel.
81865
81869
  *
81866
- * * Stores the new SceneModelMesh in {@link SceneModel#meshes}.
81870
+ * * It prepares and saves data for a SceneModelMesh {@link SceneModel#meshes} creation. SceneModelMesh will be created only once the SceneModelEntity (which references this particular SceneModelMesh) will be created.
81867
81871
  * * The SceneModelMesh can either define its own geometry or share it with other SceneModelMeshes. To define own geometry, provide the
81868
81872
  * various geometry arrays to this method. To share a geometry, provide the ID of a geometry created earlier
81869
81873
  * with {@link SceneModel#createGeometry}.
@@ -81898,18 +81902,18 @@ class SceneModel extends Component {
81898
81902
  * @param {Number} [cfg.opacity=1] Opacity in range ````[0..1]````. Overridden by texture set ````colorTexture````.
81899
81903
  * @param {Number} [cfg.metallic=0] Metallic factor in range ````[0..1]````. Overridden by texture set ````metallicRoughnessTexture````.
81900
81904
  * @param {Number} [cfg.roughness=1] Roughness factor in range ````[0..1]````. Overridden by texture set ````metallicRoughnessTexture````.
81901
- * @returns {SceneModelMesh} The new mesh.
81905
+ * @returns {Boolean} True = successfully mesh was created. False = error during creation of a mesh.
81902
81906
  */
81903
81907
  createMesh(cfg) {
81904
81908
 
81905
81909
  if (cfg.id === undefined || cfg.id === null) {
81906
81910
  this.error("[createMesh] SceneModel.createMesh() config missing: id");
81907
- return;
81911
+ return false;
81908
81912
  }
81909
81913
 
81910
81914
  if (this._scheduledMeshes[cfg.id]) {
81911
81915
  this.error(`[createMesh] SceneModel already has a mesh with this ID: ${cfg.id}`);
81912
- return;
81916
+ return false;
81913
81917
  }
81914
81918
 
81915
81919
  const instancing = (cfg.geometryId !== undefined);
@@ -81924,31 +81928,31 @@ class SceneModel extends Component {
81924
81928
  }
81925
81929
  if (cfg.primitive !== "points" && cfg.primitive !== "lines" && cfg.primitive !== "triangles" && cfg.primitive !== "solid" && cfg.primitive !== "surface") {
81926
81930
  this.error(`Unsupported value for 'primitive': '${primitive}' ('geometryId' is absent) - supported values are 'points', 'lines', 'triangles', 'solid' and 'surface'.`);
81927
- return;
81931
+ return false;
81928
81932
  }
81929
81933
  if (!cfg.positions && !cfg.positionsCompressed && !cfg.buckets) {
81930
81934
  this.error("Param expected: 'positions', 'positionsCompressed' or `buckets` ('geometryId' is absent)");
81931
- return null;
81935
+ return false;
81932
81936
  }
81933
81937
  if (cfg.positions && (cfg.positionsDecodeMatrix || cfg.positionsDecodeBoundary)) {
81934
81938
  this.error("Illegal params: 'positions' not expected with 'positionsDecodeMatrix'/'positionsDecodeBoundary' ('geometryId' is absent)");
81935
- return null;
81939
+ return false;
81936
81940
  }
81937
81941
  if (cfg.positionsCompressed && !cfg.positionsDecodeMatrix && !cfg.positionsDecodeBoundary) {
81938
81942
  this.error("Param expected: 'positionsCompressed' should be accompanied by 'positionsDecodeMatrix'/'positionsDecodeBoundary' ('geometryId' is absent)");
81939
- return null;
81943
+ return false;
81940
81944
  }
81941
81945
  if (cfg.uvCompressed && !cfg.uvDecodeMatrix) {
81942
81946
  this.error("Param expected: 'uvCompressed' should be accompanied by `uvDecodeMatrix` ('geometryId' is absent)");
81943
- return null;
81947
+ return false;
81944
81948
  }
81945
81949
  if (!cfg.buckets && !cfg.indices && cfg.primitive !== "points") {
81946
81950
  this.error(`Param expected: indices (required for '${cfg.primitive}' primitive type)`);
81947
- return null;
81951
+ return false;
81948
81952
  }
81949
81953
  if ((cfg.matrix || cfg.position || cfg.rotation || cfg.scale) && (cfg.positionsCompressed || cfg.positionsDecodeBoundary)) {
81950
81954
  this.error("Unexpected params: 'matrix', 'rotation', 'scale', 'position' not allowed with 'positionsCompressed'");
81951
- return null;
81955
+ return false;
81952
81956
  }
81953
81957
 
81954
81958
  const useDTX = (!!this._dtxEnabled && (cfg.primitive === "triangles"
@@ -82113,7 +82117,7 @@ class SceneModel extends Component {
82113
82117
  cfg.textureSet = this._textureSets[cfg.textureSetId];
82114
82118
  if (!cfg.textureSet) {
82115
82119
  this.error(`[createMesh] Texture set not found: ${cfg.textureSetId} - ensure that you create it first with createTextureSet()`);
82116
- return;
82120
+ return false;
82117
82121
  }
82118
82122
  }
82119
82123
  }
@@ -82124,13 +82128,13 @@ class SceneModel extends Component {
82124
82128
 
82125
82129
  if (cfg.positions || cfg.positionsCompressed || cfg.indices || cfg.edgeIndices || cfg.normals || cfg.normalsCompressed || cfg.uv || cfg.uvCompressed || cfg.positionsDecodeMatrix) {
82126
82130
  this.error(`Mesh geometry parameters not expected when instancing a geometry (not expected: positions, positionsCompressed, indices, edgeIndices, normals, normalsCompressed, uv, uvCompressed, positionsDecodeMatrix)`);
82127
- return;
82131
+ return false;
82128
82132
  }
82129
82133
 
82130
82134
  cfg.geometry = this._geometries[cfg.geometryId];
82131
82135
  if (!cfg.geometry) {
82132
82136
  this.error(`[createMesh] Geometry not found: ${cfg.geometryId} - ensure that you create it first with createGeometry()`);
82133
- return;
82137
+ return false;
82134
82138
  }
82135
82139
 
82136
82140
  cfg.origin = cfg.origin ? math.addVec3(this._origin, cfg.origin, math.vec3()) : this._origin;
@@ -82144,7 +82148,7 @@ class SceneModel extends Component {
82144
82148
 
82145
82149
  if (!cfg.transform) {
82146
82150
  this.error(`[createMesh] Transform not found: ${cfg.transformId} - ensure that you create it first with createTransform()`);
82147
- return;
82151
+ return false;
82148
82152
  }
82149
82153
 
82150
82154
  cfg.aabb = cfg.geometry.aabb;
@@ -82212,7 +82216,7 @@ class SceneModel extends Component {
82212
82216
  cfg.textureSet = this._textureSets[cfg.textureSetId];
82213
82217
  // if (!cfg.textureSet) {
82214
82218
  // this.error(`[createMesh] Texture set not found: ${cfg.textureSetId} - ensure that you create it first with createTextureSet()`);
82215
- // return;
82219
+ // return false;
82216
82220
  // }
82217
82221
  }
82218
82222
  }
@@ -82220,7 +82224,9 @@ class SceneModel extends Component {
82220
82224
 
82221
82225
  cfg.numPrimitives = this._getNumPrimitives(cfg);
82222
82226
 
82223
- return this._createMesh(cfg);
82227
+ this._meshesCfgsBeforeMeshCreation[cfg.id] = cfg;
82228
+
82229
+ return true;
82224
82230
  }
82225
82231
 
82226
82232
  _createMesh(cfg) {
@@ -82252,8 +82258,6 @@ class SceneModel extends Component {
82252
82258
  cfg.meshMatrix = cfg.transform.worldMatrix;
82253
82259
  }
82254
82260
  mesh.portionId = mesh.layer.createPortion(mesh, cfg);
82255
- this._meshes[cfg.id] = mesh;
82256
- this._meshList.push(mesh);
82257
82261
  return mesh;
82258
82262
  }
82259
82263
 
@@ -82612,10 +82616,15 @@ class SceneModel extends Component {
82612
82616
  let meshes = [];
82613
82617
  for (let i = 0, len = cfg.meshIds.length; i < len; i++) {
82614
82618
  const meshId = cfg.meshIds[i];
82615
- const mesh = this._meshes[meshId];
82616
- if (!mesh) {
82617
- this.error(`Mesh with this ID not found: "${meshId}" - ignoring this mesh`);
82618
- continue;
82619
+ let mesh = this._meshes[meshId]; // Trying to get already created mesh
82620
+ if (!mesh) { // Checks if there is already created mesh for this meshId
82621
+ let meshCfg = this._meshesCfgsBeforeMeshCreation[meshId]; // Trying to get already created cfg
82622
+ if (!meshCfg) { // Checks if there is already created cfg for this meshId
82623
+ this.error(`Mesh with this ID not found: "${meshId}" - ignoring this mesh`); // There is no such cfg
82624
+ continue;
82625
+ }
82626
+ mesh = this._createMesh(meshCfg); // There is no such mesh yet, but there is already created cfg, so it creates this mesh
82627
+ this._meshes[cfg.id] = mesh; // Now it will also add this mesh to dictionary of created meshes
82619
82628
  }
82620
82629
  if (mesh.parent) {
82621
82630
  this.error(`Mesh with ID "${meshId}" already belongs to object with ID "${mesh.parent.id}" - ignoring this mesh`);
@@ -85525,8 +85534,15 @@ class DistanceMeasurementsMouseControl extends DistanceMeasurementsControl {
85525
85534
  pointerWorldPos.set(event.worldPos);
85526
85535
  pointerCanvasPos.set(event.canvasPos);
85527
85536
  if (this._mouseState === MOUSE_FIRST_CLICK_EXPECTED) {
85528
- this._markerDiv.style.marginLeft = `${canvasPos[0] - 5}px`;
85529
- this._markerDiv.style.marginTop = `${canvasPos[1] - 5}px`;
85537
+
85538
+ const canvasBoundRect = canvas.getBoundingClientRect();
85539
+ const scrollLeft = window.pageXOffset || document.documentElement.scrollLeft;
85540
+ const scrollTop = window.pageYOffset || document.documentElement.scrollTop;
85541
+ const canvasLeftEdge = canvasBoundRect.left + scrollLeft;
85542
+ const canvasTopEdge = canvasBoundRect.top + scrollTop;
85543
+
85544
+ this._markerDiv.style.marginLeft = `${canvasLeftEdge + canvasPos[0] - 5}px`;
85545
+ this._markerDiv.style.marginTop = `${canvasTopEdge + canvasPos[1] - 5}px`;
85530
85546
  this._markerDiv.style.background = "pink";
85531
85547
  if (event.snappedToVertex || event.snappedToEdge) {
85532
85548
  if (this.pointerLens) {
@@ -2979,7 +2979,7 @@ _this18._initMarkerDiv();_this18._onMouseHoverSurface=null;_this18._onHoverNothi
2979
2979
  */function get(){return this._snapping;}/**
2980
2980
  * Activates this AngleMeasurementsMouseControl, ready to respond to input.
2981
2981
  */,set:function set(snapping){if(snapping!==this._snapping){this._snapping=snapping;this.deactivate();this.activate();}else{this._snapping=snapping;}}},{key:"activate",value:function activate(){var _this19=this;if(this._active){return;}if(!this.markerDiv){this._initMarkerDiv();// if the marker is destroyed after deactivation, we recreate it
2982
- }this.angleMeasurementsPlugin;var scene=this.scene;scene.input;var canvas=scene.canvas.canvas;var clickTolerance=20;var cameraControl=this.angleMeasurementsPlugin.viewer.cameraControl;var pointerLens=this.pointerLens;var mouseHovering=false;var hoveredEntity=null;var lastMouseCanvasX=0;var lastMouseCanvasY=0;var mouseWorldPos=math.vec3();var mouseHoverCanvasPos=math.vec2();this._currentAngleMeasurement=null;this._onMouseHoverSurface=cameraControl.on(this._snapping?"hoverSnapOrSurface":"hoverSurface",function(event){if(event.snappedToVertex||event.snappedToEdge){if(pointerLens){pointerLens.visible=true;pointerLens.canvasPos=event.canvasPos;pointerLens.snappedCanvasPos=event.snappedCanvasPos||event.canvasPos;pointerLens.snapped=true;}_this19.markerDiv.style.background="greenyellow";_this19.markerDiv.style.border="2px solid green";}else{if(pointerLens){pointerLens.visible=true;pointerLens.canvasPos=event.canvasPos;pointerLens.snappedCanvasPos=event.canvasPos;pointerLens.snapped=false;}_this19.markerDiv.style.background="pink";_this19.markerDiv.style.border="2px solid red";}var canvasPos=event.snappedCanvasPos||event.canvasPos;mouseHovering=true;hoveredEntity=event.entity;mouseWorldPos.set(event.worldPos);mouseHoverCanvasPos.set(canvasPos);switch(_this19._mouseState){case MOUSE_FINDING_ORIGIN:_this19.markerDiv.style.marginLeft="".concat(canvasPos[0]-5,"px");_this19.markerDiv.style.marginTop="".concat(canvasPos[1]-5,"px");break;case MOUSE_FINDING_CORNER:if(_this19._currentAngleMeasurement){_this19._currentAngleMeasurement.originWireVisible=true;_this19._currentAngleMeasurement.targetWireVisible=false;_this19._currentAngleMeasurement.cornerVisible=true;_this19._currentAngleMeasurement.angleVisible=false;_this19._currentAngleMeasurement.corner.worldPos=event.worldPos;_this19._currentAngleMeasurement.corner.entity=event.entity;}_this19.markerDiv.style.marginLeft="-10000px";_this19.markerDiv.style.marginTop="-10000px";canvas.style.cursor="pointer";break;case MOUSE_FINDING_TARGET:if(_this19._currentAngleMeasurement){_this19._currentAngleMeasurement.targetWireVisible=true;_this19._currentAngleMeasurement.targetVisible=true;_this19._currentAngleMeasurement.angleVisible=true;_this19._currentAngleMeasurement.target.worldPos=event.worldPos;_this19._currentAngleMeasurement.target.entity=event.entity;}_this19.markerDiv.style.marginLeft="-10000px";_this19.markerDiv.style.marginTop="-10000px";canvas.style.cursor="pointer";break;}});canvas.addEventListener('mousedown',this._onMouseDown=function(e){if(e.which!==1){return;}lastMouseCanvasX=e.clientX;lastMouseCanvasY=e.clientY;});canvas.addEventListener("mouseup",this._onMouseUp=function(e){if(e.which!==1){return;}if(e.clientX>lastMouseCanvasX+clickTolerance||e.clientX<lastMouseCanvasX-clickTolerance||e.clientY>lastMouseCanvasY+clickTolerance||e.clientY<lastMouseCanvasY-clickTolerance){return;}switch(_this19._mouseState){case MOUSE_FINDING_ORIGIN:if(mouseHovering){_this19._currentAngleMeasurement=_this19.angleMeasurementsPlugin.createMeasurement({id:math.createUUID(),origin:{worldPos:mouseWorldPos},corner:{worldPos:mouseWorldPos},target:{worldPos:mouseWorldPos},approximate:true});_this19._currentAngleMeasurement.clickable=false;_this19._currentAngleMeasurement.originVisible=true;_this19._currentAngleMeasurement.originWireVisible=true;_this19._currentAngleMeasurement.cornerVisible=false;_this19._currentAngleMeasurement.targetWireVisible=false;_this19._currentAngleMeasurement.targetVisible=false;_this19._currentAngleMeasurement.angleVisible=false;_this19._currentAngleMeasurement.origin.entity=hoveredEntity;_this19._mouseState=MOUSE_FINDING_CORNER;_this19.angleMeasurementsPlugin.fire("measurementStart",_this19._currentAngleMeasurement);}break;case MOUSE_FINDING_CORNER:if(mouseHovering){_this19._currentAngleMeasurement.targetWireVisible=false;_this19._currentAngleMeasurement.targetVisible=true;_this19._currentAngleMeasurement.angleVisible=true;_this19._currentAngleMeasurement.corner.entity=hoveredEntity;_this19._mouseState=MOUSE_FINDING_TARGET;}else{if(_this19._currentAngleMeasurement){_this19._currentAngleMeasurement.destroy();_this19._currentAngleMeasurement=null;hoveredEntity=null;_this19._mouseState=MOUSE_FINDING_ORIGIN;_this19.angleMeasurementsPlugin.fire("measurementCancel",_this19._currentAngleMeasurement);}}break;case MOUSE_FINDING_TARGET:if(mouseHovering){_this19._currentAngleMeasurement.targetVisible=true;_this19._currentAngleMeasurement.angleVisible=true;_this19._currentAngleMeasurement.target.entity=hoveredEntity;_this19._currentAngleMeasurement.clickable=true;hoveredEntity=null;_this19.angleMeasurementsPlugin.fire("measurementEnd",_this19._currentAngleMeasurement);_this19._currentAngleMeasurement=null;_this19._mouseState=MOUSE_FINDING_ORIGIN;}else{if(_this19._currentAngleMeasurement){_this19._currentAngleMeasurement.destroy();_this19._currentAngleMeasurement=null;hoveredEntity=null;_this19._mouseState=MOUSE_FINDING_ORIGIN;_this19.angleMeasurementsPlugin.fire("measurementCancel",_this19._currentAngleMeasurement);}}break;}});this._onMouseHoverOff=cameraControl.on(this._snapping?"hoverSnapOrSurfaceOff":"hoverOff",function(event){mouseHovering=false;if(pointerLens){pointerLens.visible=true;pointerLens.pointerPos=event.canvasPos;pointerLens.snappedCanvasPos=event.snappedCanvasPos||event.canvasPos;pointerLens.snapped=false;}_this19.markerDiv.style.marginLeft="-100px";_this19.markerDiv.style.marginTop="-100px";if(_this19._currentAngleMeasurement){switch(_this19._mouseState){case MOUSE_FINDING_ORIGIN:_this19._currentAngleMeasurement.originVisible=false;break;case MOUSE_FINDING_CORNER:_this19._currentAngleMeasurement.cornerVisible=false;_this19._currentAngleMeasurement.originWireVisible=false;_this19._currentAngleMeasurement.targetVisible=false;_this19._currentAngleMeasurement.targetWireVisible=false;_this19._currentAngleMeasurement.angleVisible=false;break;case MOUSE_FINDING_TARGET:_this19._currentAngleMeasurement.targetVisible=false;_this19._currentAngleMeasurement.targetWireVisible=false;_this19._currentAngleMeasurement.angleVisible=false;break;}canvas.style.cursor="default";}});this._active=true;}/**
2982
+ }this.angleMeasurementsPlugin;var scene=this.scene;scene.input;var canvas=scene.canvas.canvas;var clickTolerance=20;var cameraControl=this.angleMeasurementsPlugin.viewer.cameraControl;var pointerLens=this.pointerLens;var mouseHovering=false;var hoveredEntity=null;var lastMouseCanvasX=0;var lastMouseCanvasY=0;var mouseWorldPos=math.vec3();var mouseHoverCanvasPos=math.vec2();this._currentAngleMeasurement=null;this._onMouseHoverSurface=cameraControl.on(this._snapping?"hoverSnapOrSurface":"hoverSurface",function(event){if(event.snappedToVertex||event.snappedToEdge){if(pointerLens){pointerLens.visible=true;pointerLens.canvasPos=event.canvasPos;pointerLens.snappedCanvasPos=event.snappedCanvasPos||event.canvasPos;pointerLens.snapped=true;}_this19.markerDiv.style.background="greenyellow";_this19.markerDiv.style.border="2px solid green";}else{if(pointerLens){pointerLens.visible=true;pointerLens.canvasPos=event.canvasPos;pointerLens.snappedCanvasPos=event.canvasPos;pointerLens.snapped=false;}_this19.markerDiv.style.background="pink";_this19.markerDiv.style.border="2px solid red";}var canvasPos=event.snappedCanvasPos||event.canvasPos;mouseHovering=true;hoveredEntity=event.entity;mouseWorldPos.set(event.worldPos);mouseHoverCanvasPos.set(canvasPos);switch(_this19._mouseState){case MOUSE_FINDING_ORIGIN:var canvasBoundRect=canvas.getBoundingClientRect();var scrollLeft=window.pageXOffset||document.documentElement.scrollLeft;var scrollTop=window.pageYOffset||document.documentElement.scrollTop;var canvasLeftEdge=canvasBoundRect.left+scrollLeft;var canvasTopEdge=canvasBoundRect.top+scrollTop;_this19._markerDiv.style.marginLeft="".concat(canvasLeftEdge+canvasPos[0]-5,"px");_this19._markerDiv.style.marginTop="".concat(canvasTopEdge+canvasPos[1]-5,"px");break;case MOUSE_FINDING_CORNER:if(_this19._currentAngleMeasurement){_this19._currentAngleMeasurement.originWireVisible=true;_this19._currentAngleMeasurement.targetWireVisible=false;_this19._currentAngleMeasurement.cornerVisible=true;_this19._currentAngleMeasurement.angleVisible=false;_this19._currentAngleMeasurement.corner.worldPos=event.worldPos;_this19._currentAngleMeasurement.corner.entity=event.entity;}_this19.markerDiv.style.marginLeft="-10000px";_this19.markerDiv.style.marginTop="-10000px";canvas.style.cursor="pointer";break;case MOUSE_FINDING_TARGET:if(_this19._currentAngleMeasurement){_this19._currentAngleMeasurement.targetWireVisible=true;_this19._currentAngleMeasurement.targetVisible=true;_this19._currentAngleMeasurement.angleVisible=true;_this19._currentAngleMeasurement.target.worldPos=event.worldPos;_this19._currentAngleMeasurement.target.entity=event.entity;}_this19.markerDiv.style.marginLeft="-10000px";_this19.markerDiv.style.marginTop="-10000px";canvas.style.cursor="pointer";break;}});canvas.addEventListener('mousedown',this._onMouseDown=function(e){if(e.which!==1){return;}lastMouseCanvasX=e.clientX;lastMouseCanvasY=e.clientY;});canvas.addEventListener("mouseup",this._onMouseUp=function(e){if(e.which!==1){return;}if(e.clientX>lastMouseCanvasX+clickTolerance||e.clientX<lastMouseCanvasX-clickTolerance||e.clientY>lastMouseCanvasY+clickTolerance||e.clientY<lastMouseCanvasY-clickTolerance){return;}switch(_this19._mouseState){case MOUSE_FINDING_ORIGIN:if(mouseHovering){_this19._currentAngleMeasurement=_this19.angleMeasurementsPlugin.createMeasurement({id:math.createUUID(),origin:{worldPos:mouseWorldPos},corner:{worldPos:mouseWorldPos},target:{worldPos:mouseWorldPos},approximate:true});_this19._currentAngleMeasurement.clickable=false;_this19._currentAngleMeasurement.originVisible=true;_this19._currentAngleMeasurement.originWireVisible=true;_this19._currentAngleMeasurement.cornerVisible=false;_this19._currentAngleMeasurement.targetWireVisible=false;_this19._currentAngleMeasurement.targetVisible=false;_this19._currentAngleMeasurement.angleVisible=false;_this19._currentAngleMeasurement.origin.entity=hoveredEntity;_this19._mouseState=MOUSE_FINDING_CORNER;_this19.angleMeasurementsPlugin.fire("measurementStart",_this19._currentAngleMeasurement);}break;case MOUSE_FINDING_CORNER:if(mouseHovering){_this19._currentAngleMeasurement.targetWireVisible=false;_this19._currentAngleMeasurement.targetVisible=true;_this19._currentAngleMeasurement.angleVisible=true;_this19._currentAngleMeasurement.corner.entity=hoveredEntity;_this19._mouseState=MOUSE_FINDING_TARGET;}else{if(_this19._currentAngleMeasurement){_this19._currentAngleMeasurement.destroy();_this19._currentAngleMeasurement=null;hoveredEntity=null;_this19._mouseState=MOUSE_FINDING_ORIGIN;_this19.angleMeasurementsPlugin.fire("measurementCancel",_this19._currentAngleMeasurement);}}break;case MOUSE_FINDING_TARGET:if(mouseHovering){_this19._currentAngleMeasurement.targetVisible=true;_this19._currentAngleMeasurement.angleVisible=true;_this19._currentAngleMeasurement.target.entity=hoveredEntity;_this19._currentAngleMeasurement.clickable=true;hoveredEntity=null;_this19.angleMeasurementsPlugin.fire("measurementEnd",_this19._currentAngleMeasurement);_this19._currentAngleMeasurement=null;_this19._mouseState=MOUSE_FINDING_ORIGIN;}else{if(_this19._currentAngleMeasurement){_this19._currentAngleMeasurement.destroy();_this19._currentAngleMeasurement=null;hoveredEntity=null;_this19._mouseState=MOUSE_FINDING_ORIGIN;_this19.angleMeasurementsPlugin.fire("measurementCancel",_this19._currentAngleMeasurement);}}break;}});this._onMouseHoverOff=cameraControl.on(this._snapping?"hoverSnapOrSurfaceOff":"hoverOff",function(event){mouseHovering=false;if(pointerLens){pointerLens.visible=true;pointerLens.pointerPos=event.canvasPos;pointerLens.snappedCanvasPos=event.snappedCanvasPos||event.canvasPos;pointerLens.snapped=false;}_this19.markerDiv.style.marginLeft="-100px";_this19.markerDiv.style.marginTop="-100px";if(_this19._currentAngleMeasurement){switch(_this19._mouseState){case MOUSE_FINDING_ORIGIN:_this19._currentAngleMeasurement.originVisible=false;break;case MOUSE_FINDING_CORNER:_this19._currentAngleMeasurement.cornerVisible=false;_this19._currentAngleMeasurement.originWireVisible=false;_this19._currentAngleMeasurement.targetVisible=false;_this19._currentAngleMeasurement.targetWireVisible=false;_this19._currentAngleMeasurement.angleVisible=false;break;case MOUSE_FINDING_TARGET:_this19._currentAngleMeasurement.targetVisible=false;_this19._currentAngleMeasurement.targetWireVisible=false;_this19._currentAngleMeasurement.angleVisible=false;break;}canvas.style.cursor="default";}});this._active=true;}/**
2983
2983
  * Deactivates this AngleMeasurementsMouseControl, making it unresponsive to input.
2984
2984
  *
2985
2985
  * Destroys any {@link AngleMeasurement} under construction by this AngleMeasurementsMouseControl.
@@ -17515,9 +17515,9 @@ return this;}/**
17515
17515
  * primitives. Only works while {@link DTX#enabled} is also ````true````.
17516
17516
  */function SceneModel(owner){var _this74;var cfg=arguments.length>1&&arguments[1]!==undefined?arguments[1]:{};_classCallCheck(this,SceneModel);_this74=_super112.call(this,owner,cfg);_this74._dtxEnabled=_this74.scene.dtxEnabled&&cfg.dtxEnabled!==false;_this74._enableVertexWelding=false;// Not needed for most objects, and very expensive, so disabled
17517
17517
  _this74._enableIndexBucketing=false;// Until fixed: https://github.com/xeokit/xeokit-sdk/issues/1204
17518
- _this74._vboBatchingLayerScratchMemory=getScratchMemory();_this74._textureTranscoder=cfg.textureTranscoder||getKTX2TextureTranscoder(_this74.scene.viewer);_this74._maxGeometryBatchSize=cfg.maxGeometryBatchSize;_this74._aabb=math.collapseAABB3();_this74._aabbDirty=true;_this74._quantizationRanges={};_this74._vboInstancingLayers={};_this74._vboBatchingLayers={};_this74._dtxLayers={};_this74._meshList=[];_this74.layerList=[];// For GL state efficiency when drawing, InstancingLayers are in first part, BatchingLayers are in second
17518
+ _this74._vboBatchingLayerScratchMemory=getScratchMemory();_this74._textureTranscoder=cfg.textureTranscoder||getKTX2TextureTranscoder(_this74.scene.viewer);_this74._maxGeometryBatchSize=cfg.maxGeometryBatchSize;_this74._aabb=math.collapseAABB3();_this74._aabbDirty=true;_this74._quantizationRanges={};_this74._vboInstancingLayers={};_this74._vboBatchingLayers={};_this74._dtxLayers={};_this74.layerList=[];// For GL state efficiency when drawing, InstancingLayers are in first part, BatchingLayers are in second
17519
17519
  _this74._entityList=[];_this74._geometries={};_this74._dtxBuckets={};// Geometries with optimizations used for data texture representation
17520
- _this74._textures={};_this74._textureSets={};_this74._transforms={};_this74._meshes={};_this74._entities={};_this74._scheduledMeshes={};/** @private **/_this74.renderFlags=new RenderFlags();/**
17520
+ _this74._textures={};_this74._textureSets={};_this74._transforms={};_this74._meshes={};_this74._entities={};_this74._scheduledMeshes={};_this74._meshesCfgsBeforeMeshCreation={};/** @private **/_this74.renderFlags=new RenderFlags();/**
17521
17521
  * @private
17522
17522
  */_this74.numGeometries=0;// Number of geometries created with createGeometry()
17523
17523
  // These counts are used to avoid unnecessary render passes
@@ -18028,7 +18028,7 @@ if(!this._textureTranscoder){this.error("[createTexture] Can't create texture fr
18028
18028
  */},{key:"createTransform",value:function createTransform(cfg){if(cfg.id===undefined||cfg.id===null){this.error("[createTransform] SceneModel.createTransform() config missing: id");return;}if(this._transforms[cfg.id]){this.error("[createTransform] SceneModel already has a transform with this ID: ".concat(cfg.id));return;}var parentTransform;if(this.parentTransformId){parentTransform=this._transforms[cfg.parentTransformId];if(!parentTransform){this.error("[createTransform] SceneModel.createTransform() config missing: id");return;}}var transform=new SceneModelTransform({id:cfg.id,model:this,parentTransform:parentTransform,matrix:cfg.matrix,position:cfg.position,scale:cfg.scale,rotation:cfg.rotation,quaternion:cfg.quaternion});this._transforms[transform.id]=transform;return transform;}/**
18029
18029
  * Creates a new {@link SceneModelMesh} within this SceneModel.
18030
18030
  *
18031
- * * Stores the new SceneModelMesh in {@link SceneModel#meshes}.
18031
+ * * It prepares and saves data for a SceneModelMesh {@link SceneModel#meshes} creation. SceneModelMesh will be created only once the SceneModelEntity (which references this particular SceneModelMesh) will be created.
18032
18032
  * * The SceneModelMesh can either define its own geometry or share it with other SceneModelMeshes. To define own geometry, provide the
18033
18033
  * various geometry arrays to this method. To share a geometry, provide the ID of a geometry created earlier
18034
18034
  * with {@link SceneModel#createGeometry}.
@@ -18063,9 +18063,9 @@ if(!this._textureTranscoder){this.error("[createTexture] Can't create texture fr
18063
18063
  * @param {Number} [cfg.opacity=1] Opacity in range ````[0..1]````. Overridden by texture set ````colorTexture````.
18064
18064
  * @param {Number} [cfg.metallic=0] Metallic factor in range ````[0..1]````. Overridden by texture set ````metallicRoughnessTexture````.
18065
18065
  * @param {Number} [cfg.roughness=1] Roughness factor in range ````[0..1]````. Overridden by texture set ````metallicRoughnessTexture````.
18066
- * @returns {SceneModelMesh} The new mesh.
18067
- */},{key:"createMesh",value:function createMesh(cfg){if(cfg.id===undefined||cfg.id===null){this.error("[createMesh] SceneModel.createMesh() config missing: id");return;}if(this._scheduledMeshes[cfg.id]){this.error("[createMesh] SceneModel already has a mesh with this ID: ".concat(cfg.id));return;}var instancing=cfg.geometryId!==undefined;var batching=!instancing;if(batching){// Batched geometry
18068
- if(cfg.primitive===undefined||cfg.primitive===null){cfg.primitive="triangles";}if(cfg.primitive!=="points"&&cfg.primitive!=="lines"&&cfg.primitive!=="triangles"&&cfg.primitive!=="solid"&&cfg.primitive!=="surface"){this.error("Unsupported value for 'primitive': '".concat(primitive,"' ('geometryId' is absent) - supported values are 'points', 'lines', 'triangles', 'solid' and 'surface'."));return;}if(!cfg.positions&&!cfg.positionsCompressed&&!cfg.buckets){this.error("Param expected: 'positions', 'positionsCompressed' or `buckets` ('geometryId' is absent)");return null;}if(cfg.positions&&(cfg.positionsDecodeMatrix||cfg.positionsDecodeBoundary)){this.error("Illegal params: 'positions' not expected with 'positionsDecodeMatrix'/'positionsDecodeBoundary' ('geometryId' is absent)");return null;}if(cfg.positionsCompressed&&!cfg.positionsDecodeMatrix&&!cfg.positionsDecodeBoundary){this.error("Param expected: 'positionsCompressed' should be accompanied by 'positionsDecodeMatrix'/'positionsDecodeBoundary' ('geometryId' is absent)");return null;}if(cfg.uvCompressed&&!cfg.uvDecodeMatrix){this.error("Param expected: 'uvCompressed' should be accompanied by `uvDecodeMatrix` ('geometryId' is absent)");return null;}if(!cfg.buckets&&!cfg.indices&&cfg.primitive!=="points"){this.error("Param expected: indices (required for '".concat(cfg.primitive,"' primitive type)"));return null;}if((cfg.matrix||cfg.position||cfg.rotation||cfg.scale)&&(cfg.positionsCompressed||cfg.positionsDecodeBoundary)){this.error("Unexpected params: 'matrix', 'rotation', 'scale', 'position' not allowed with 'positionsCompressed'");return null;}var useDTX=!!this._dtxEnabled&&(cfg.primitive==="triangles"||cfg.primitive==="solid"||cfg.primitive==="surface");cfg.origin=cfg.origin?math.addVec3(this._origin,cfg.origin,math.vec3()):this._origin;// MATRIX - optional for batching
18066
+ * @returns {Boolean} True = successfully mesh was created. False = error during creation of a mesh.
18067
+ */},{key:"createMesh",value:function createMesh(cfg){if(cfg.id===undefined||cfg.id===null){this.error("[createMesh] SceneModel.createMesh() config missing: id");return false;}if(this._scheduledMeshes[cfg.id]){this.error("[createMesh] SceneModel already has a mesh with this ID: ".concat(cfg.id));return false;}var instancing=cfg.geometryId!==undefined;var batching=!instancing;if(batching){// Batched geometry
18068
+ if(cfg.primitive===undefined||cfg.primitive===null){cfg.primitive="triangles";}if(cfg.primitive!=="points"&&cfg.primitive!=="lines"&&cfg.primitive!=="triangles"&&cfg.primitive!=="solid"&&cfg.primitive!=="surface"){this.error("Unsupported value for 'primitive': '".concat(primitive,"' ('geometryId' is absent) - supported values are 'points', 'lines', 'triangles', 'solid' and 'surface'."));return false;}if(!cfg.positions&&!cfg.positionsCompressed&&!cfg.buckets){this.error("Param expected: 'positions', 'positionsCompressed' or `buckets` ('geometryId' is absent)");return false;}if(cfg.positions&&(cfg.positionsDecodeMatrix||cfg.positionsDecodeBoundary)){this.error("Illegal params: 'positions' not expected with 'positionsDecodeMatrix'/'positionsDecodeBoundary' ('geometryId' is absent)");return false;}if(cfg.positionsCompressed&&!cfg.positionsDecodeMatrix&&!cfg.positionsDecodeBoundary){this.error("Param expected: 'positionsCompressed' should be accompanied by 'positionsDecodeMatrix'/'positionsDecodeBoundary' ('geometryId' is absent)");return false;}if(cfg.uvCompressed&&!cfg.uvDecodeMatrix){this.error("Param expected: 'uvCompressed' should be accompanied by `uvDecodeMatrix` ('geometryId' is absent)");return false;}if(!cfg.buckets&&!cfg.indices&&cfg.primitive!=="points"){this.error("Param expected: indices (required for '".concat(cfg.primitive,"' primitive type)"));return false;}if((cfg.matrix||cfg.position||cfg.rotation||cfg.scale)&&(cfg.positionsCompressed||cfg.positionsDecodeBoundary)){this.error("Unexpected params: 'matrix', 'rotation', 'scale', 'position' not allowed with 'positionsCompressed'");return false;}var useDTX=!!this._dtxEnabled&&(cfg.primitive==="triangles"||cfg.primitive==="solid"||cfg.primitive==="surface");cfg.origin=cfg.origin?math.addVec3(this._origin,cfg.origin,math.vec3()):this._origin;// MATRIX - optional for batching
18069
18069
  if(cfg.matrix){cfg.meshMatrix=cfg.matrix;}else if(cfg.scale||cfg.rotation||cfg.position){var _scale3=cfg.scale||DEFAULT_SCALE;var _position=cfg.position||DEFAULT_POSITION;var rotation=cfg.rotation||DEFAULT_ROTATION;math.eulerToQuaternion(rotation,"XYZ",DEFAULT_QUATERNION);cfg.meshMatrix=math.composeMat4(_position,DEFAULT_QUATERNION,_scale3,math.mat4());}if(cfg.positionsDecodeBoundary){cfg.positionsDecodeMatrix=createPositionsDecodeMatrix(cfg.positionsDecodeBoundary,math.mat4());}if(useDTX){// DTX
18070
18070
  cfg.type=DTX;// NPR
18071
18071
  cfg.color=cfg.color?new Uint8Array([Math.floor(cfg.color[0]*255),Math.floor(cfg.color[1]*255),Math.floor(cfg.color[2]*255)]):defaultCompressedColor;cfg.opacity=cfg.opacity!==undefined&&cfg.opacity!==null?Math.floor(cfg.opacity*255):255;// RTC
@@ -18080,9 +18080,9 @@ if(cfg.positions){var _rtcPositions=[];var _rtcNeeded=worldToRTCPositions(cfg.po
18080
18080
  }math.expandAABB3Points3(_aabb5,cfg.positions);cfg.aabb=_aabb5;}else{var _aabb6=math.collapseAABB3();math.expandAABB3Points3(_aabb6,cfg.positionsCompressed);geometryCompressionUtils.decompressAABB(_aabb6,cfg.positionsDecodeMatrix);cfg.aabb=_aabb6;}if(cfg.meshMatrix){math.AABB3ToOBB3(cfg.aabb,tempOBB3);math.transformOBB3(cfg.meshMatrix,tempOBB3);math.OBB3ToAABB3(tempOBB3,cfg.aabb);}// EDGES
18081
18081
  if(!cfg.buckets&&!cfg.edgeIndices&&(cfg.primitive==="triangles"||cfg.primitive==="solid"||cfg.primitive==="surface")){if(cfg.positions){cfg.edgeIndices=buildEdgeIndices(cfg.positions,cfg.indices,null,2.0);}else{cfg.edgeIndices=buildEdgeIndices(cfg.positionsCompressed,cfg.indices,cfg.positionsDecodeMatrix,2.0);}}// TEXTURE
18082
18082
  // cfg.textureSetId = cfg.textureSetId || DEFAULT_TEXTURE_SET_ID;
18083
- if(cfg.textureSetId){cfg.textureSet=this._textureSets[cfg.textureSetId];if(!cfg.textureSet){this.error("[createMesh] Texture set not found: ".concat(cfg.textureSetId," - ensure that you create it first with createTextureSet()"));return;}}}}else{// INSTANCING
18084
- if(cfg.positions||cfg.positionsCompressed||cfg.indices||cfg.edgeIndices||cfg.normals||cfg.normalsCompressed||cfg.uv||cfg.uvCompressed||cfg.positionsDecodeMatrix){this.error("Mesh geometry parameters not expected when instancing a geometry (not expected: positions, positionsCompressed, indices, edgeIndices, normals, normalsCompressed, uv, uvCompressed, positionsDecodeMatrix)");return;}cfg.geometry=this._geometries[cfg.geometryId];if(!cfg.geometry){this.error("[createMesh] Geometry not found: ".concat(cfg.geometryId," - ensure that you create it first with createGeometry()"));return;}cfg.origin=cfg.origin?math.addVec3(this._origin,cfg.origin,math.vec3()):this._origin;cfg.positionsDecodeMatrix=cfg.geometry.positionsDecodeMatrix;if(cfg.transformId){// TRANSFORM
18085
- cfg.transform=this._transforms[cfg.transformId];if(!cfg.transform){this.error("[createMesh] Transform not found: ".concat(cfg.transformId," - ensure that you create it first with createTransform()"));return;}cfg.aabb=cfg.geometry.aabb;}else{// MATRIX
18083
+ if(cfg.textureSetId){cfg.textureSet=this._textureSets[cfg.textureSetId];if(!cfg.textureSet){this.error("[createMesh] Texture set not found: ".concat(cfg.textureSetId," - ensure that you create it first with createTextureSet()"));return false;}}}}else{// INSTANCING
18084
+ if(cfg.positions||cfg.positionsCompressed||cfg.indices||cfg.edgeIndices||cfg.normals||cfg.normalsCompressed||cfg.uv||cfg.uvCompressed||cfg.positionsDecodeMatrix){this.error("Mesh geometry parameters not expected when instancing a geometry (not expected: positions, positionsCompressed, indices, edgeIndices, normals, normalsCompressed, uv, uvCompressed, positionsDecodeMatrix)");return false;}cfg.geometry=this._geometries[cfg.geometryId];if(!cfg.geometry){this.error("[createMesh] Geometry not found: ".concat(cfg.geometryId," - ensure that you create it first with createGeometry()"));return false;}cfg.origin=cfg.origin?math.addVec3(this._origin,cfg.origin,math.vec3()):this._origin;cfg.positionsDecodeMatrix=cfg.geometry.positionsDecodeMatrix;if(cfg.transformId){// TRANSFORM
18085
+ cfg.transform=this._transforms[cfg.transformId];if(!cfg.transform){this.error("[createMesh] Transform not found: ".concat(cfg.transformId," - ensure that you create it first with createTransform()"));return false;}cfg.aabb=cfg.geometry.aabb;}else{// MATRIX
18086
18086
  if(cfg.matrix){cfg.meshMatrix=cfg.matrix.slice();}else{var _scale4=cfg.scale||DEFAULT_SCALE;var _position2=cfg.position||DEFAULT_POSITION;var _rotation=cfg.rotation||DEFAULT_ROTATION;math.eulerToQuaternion(_rotation,"XYZ",DEFAULT_QUATERNION);cfg.meshMatrix=math.composeMat4(_position2,DEFAULT_QUATERNION,_scale4,math.mat4());}math.AABB3ToOBB3(cfg.geometry.aabb,tempOBB3);math.transformOBB3(cfg.meshMatrix,tempOBB3);cfg.aabb=math.OBB3ToAABB3(tempOBB3,math.AABB3());}var _useDTX=!!this._dtxEnabled&&(cfg.geometry.primitive==="triangles"||cfg.geometry.primitive==="solid"||cfg.geometry.primitive==="surface");if(_useDTX){// DTX
18087
18087
  cfg.type=DTX;// NPR
18088
18088
  cfg.color=cfg.color?new Uint8Array([Math.floor(cfg.color[0]*255),Math.floor(cfg.color[1]*255),Math.floor(cfg.color[2]*255)]):defaultCompressedColor;cfg.opacity=cfg.opacity!==undefined&&cfg.opacity!==null?Math.floor(cfg.opacity*255):255;// BUCKETING - lazy generated, reused
@@ -18091,10 +18091,10 @@ cfg.type=VBO_INSTANCED;// PBR
18091
18091
  cfg.color=cfg.color?new Uint8Array([Math.floor(cfg.color[0]*255),Math.floor(cfg.color[1]*255),Math.floor(cfg.color[2]*255)]):defaultCompressedColor;cfg.opacity=cfg.opacity!==undefined&&cfg.opacity!==null?Math.floor(cfg.opacity*255):255;cfg.metallic=cfg.metallic!==undefined&&cfg.metallic!==null?Math.floor(cfg.metallic*255):0;cfg.roughness=cfg.roughness!==undefined&&cfg.roughness!==null?Math.floor(cfg.roughness*255):255;// TEXTURE
18092
18092
  if(cfg.textureSetId){cfg.textureSet=this._textureSets[cfg.textureSetId];// if (!cfg.textureSet) {
18093
18093
  // this.error(`[createMesh] Texture set not found: ${cfg.textureSetId} - ensure that you create it first with createTextureSet()`);
18094
- // return;
18094
+ // return false;
18095
18095
  // }
18096
- }}}cfg.numPrimitives=this._getNumPrimitives(cfg);return this._createMesh(cfg);}},{key:"_createMesh",value:function _createMesh(cfg){var mesh=new SceneModelMesh(this,cfg.id,cfg.color,cfg.opacity,cfg.transform,cfg.textureSet);mesh.pickId=this.scene._renderer.getPickID(mesh);var pickId=mesh.pickId;var a=pickId>>24&0xFF;var b=pickId>>16&0xFF;var g=pickId>>8&0xFF;var r=pickId&0xFF;cfg.pickColor=new Uint8Array([r,g,b,a]);// Quantized pick color
18097
- cfg.solid=cfg.primitive==="solid";mesh.origin=math.vec3(cfg.origin);switch(cfg.type){case DTX:mesh.layer=this._getDTXLayer(cfg);mesh.aabb=cfg.aabb;break;case VBO_BATCHED:mesh.layer=this._getVBOBatchingLayer(cfg);mesh.aabb=cfg.aabb;break;case VBO_INSTANCED:mesh.layer=this._getVBOInstancingLayer(cfg);mesh.aabb=cfg.aabb;break;}if(cfg.transform){cfg.meshMatrix=cfg.transform.worldMatrix;}mesh.portionId=mesh.layer.createPortion(mesh,cfg);this._meshes[cfg.id]=mesh;this._meshList.push(mesh);return mesh;}},{key:"_getNumPrimitives",value:function _getNumPrimitives(cfg){var countIndices=0;var primitive=cfg.geometry?cfg.geometry.primitive:cfg.primitive;switch(primitive){case"triangles":case"solid":case"surface":switch(cfg.type){case DTX:for(var _i414=0,len=cfg.buckets.length;_i414<len;_i414++){countIndices+=cfg.buckets[_i414].indices.length;}break;case VBO_BATCHED:countIndices+=cfg.indices.length;break;case VBO_INSTANCED:countIndices+=cfg.geometry.indices.length;break;}return Math.round(countIndices/3);case"points":switch(cfg.type){case DTX:for(var _i415=0,_len86=cfg.buckets.length;_i415<_len86;_i415++){countIndices+=cfg.buckets[_i415].positionsCompressed.length;}break;case VBO_BATCHED:countIndices+=cfg.positions?cfg.positions.length:cfg.positionsCompressed.length;break;case VBO_INSTANCED:var geometry=cfg.geometry;countIndices+=geometry.positions?geometry.positions.length:geometry.positionsCompressed.length;break;}return Math.round(countIndices);case"lines":case"line-strip":switch(cfg.type){case DTX:for(var _i416=0,_len87=cfg.buckets.length;_i416<_len87;_i416++){countIndices+=cfg.buckets[_i416].indices.length;}break;case VBO_BATCHED:countIndices+=cfg.indices.length;break;case VBO_INSTANCED:countIndices+=cfg.geometry.indices.length;break;}return Math.round(countIndices/2);}return 0;}},{key:"_getDTXLayer",value:function _getDTXLayer(cfg){var origin=cfg.origin;var primitive=cfg.geometry?cfg.geometry.primitive:cfg.primitive;var layerId=".".concat(primitive,".").concat(Math.round(origin[0]),".").concat(Math.round(origin[1]),".").concat(Math.round(origin[2]));var dtxLayer=this._dtxLayers[layerId];if(dtxLayer){if(!dtxLayer.canCreatePortion(cfg)){dtxLayer.finalize();delete this._dtxLayers[layerId];dtxLayer=null;}else{return dtxLayer;}}switch(primitive){case"triangles":case"solid":case"surface":dtxLayer=new DTXTrianglesLayer(this,{layerIndex:0,origin:origin});// layerIndex is set in #finalize()
18096
+ }}}cfg.numPrimitives=this._getNumPrimitives(cfg);this._meshesCfgsBeforeMeshCreation[cfg.id]=cfg;return true;}},{key:"_createMesh",value:function _createMesh(cfg){var mesh=new SceneModelMesh(this,cfg.id,cfg.color,cfg.opacity,cfg.transform,cfg.textureSet);mesh.pickId=this.scene._renderer.getPickID(mesh);var pickId=mesh.pickId;var a=pickId>>24&0xFF;var b=pickId>>16&0xFF;var g=pickId>>8&0xFF;var r=pickId&0xFF;cfg.pickColor=new Uint8Array([r,g,b,a]);// Quantized pick color
18097
+ cfg.solid=cfg.primitive==="solid";mesh.origin=math.vec3(cfg.origin);switch(cfg.type){case DTX:mesh.layer=this._getDTXLayer(cfg);mesh.aabb=cfg.aabb;break;case VBO_BATCHED:mesh.layer=this._getVBOBatchingLayer(cfg);mesh.aabb=cfg.aabb;break;case VBO_INSTANCED:mesh.layer=this._getVBOInstancingLayer(cfg);mesh.aabb=cfg.aabb;break;}if(cfg.transform){cfg.meshMatrix=cfg.transform.worldMatrix;}mesh.portionId=mesh.layer.createPortion(mesh,cfg);return mesh;}},{key:"_getNumPrimitives",value:function _getNumPrimitives(cfg){var countIndices=0;var primitive=cfg.geometry?cfg.geometry.primitive:cfg.primitive;switch(primitive){case"triangles":case"solid":case"surface":switch(cfg.type){case DTX:for(var _i414=0,len=cfg.buckets.length;_i414<len;_i414++){countIndices+=cfg.buckets[_i414].indices.length;}break;case VBO_BATCHED:countIndices+=cfg.indices.length;break;case VBO_INSTANCED:countIndices+=cfg.geometry.indices.length;break;}return Math.round(countIndices/3);case"points":switch(cfg.type){case DTX:for(var _i415=0,_len86=cfg.buckets.length;_i415<_len86;_i415++){countIndices+=cfg.buckets[_i415].positionsCompressed.length;}break;case VBO_BATCHED:countIndices+=cfg.positions?cfg.positions.length:cfg.positionsCompressed.length;break;case VBO_INSTANCED:var geometry=cfg.geometry;countIndices+=geometry.positions?geometry.positions.length:geometry.positionsCompressed.length;break;}return Math.round(countIndices);case"lines":case"line-strip":switch(cfg.type){case DTX:for(var _i416=0,_len87=cfg.buckets.length;_i416<_len87;_i416++){countIndices+=cfg.buckets[_i416].indices.length;}break;case VBO_BATCHED:countIndices+=cfg.indices.length;break;case VBO_INSTANCED:countIndices+=cfg.geometry.indices.length;break;}return Math.round(countIndices/2);}return 0;}},{key:"_getDTXLayer",value:function _getDTXLayer(cfg){var origin=cfg.origin;var primitive=cfg.geometry?cfg.geometry.primitive:cfg.primitive;var layerId=".".concat(primitive,".").concat(Math.round(origin[0]),".").concat(Math.round(origin[1]),".").concat(Math.round(origin[2]));var dtxLayer=this._dtxLayers[layerId];if(dtxLayer){if(!dtxLayer.canCreatePortion(cfg)){dtxLayer.finalize();delete this._dtxLayers[layerId];dtxLayer=null;}else{return dtxLayer;}}switch(primitive){case"triangles":case"solid":case"surface":dtxLayer=new DTXTrianglesLayer(this,{layerIndex:0,origin:origin});// layerIndex is set in #finalize()
18098
18098
  break;case"lines":dtxLayer=new DTXLinesLayer(this,{layerIndex:0,origin:origin});// layerIndex is set in #finalize()
18099
18099
  break;default:return;}this._dtxLayers[layerId]=dtxLayer;this.layerList.push(dtxLayer);return dtxLayer;}},{key:"_getVBOBatchingLayer",value:function _getVBOBatchingLayer(cfg){var model=this;var origin=cfg.origin;var positionsDecodeHash=cfg.positionsDecodeMatrix||cfg.positionsDecodeBoundary?this._createHashStringFromMatrix(cfg.positionsDecodeMatrix||cfg.positionsDecodeBoundary):"-";var textureSetId=cfg.textureSetId||"-";var layerId="".concat(Math.round(origin[0]),".").concat(Math.round(origin[1]),".").concat(Math.round(origin[2]),".").concat(cfg.primitive,".").concat(positionsDecodeHash,".").concat(textureSetId);var vboBatchingLayer=this._vboBatchingLayers[layerId];if(vboBatchingLayer){return vboBatchingLayer;}var textureSet=cfg.textureSet;while(!vboBatchingLayer){switch(cfg.primitive){case"triangles":// console.info(`[SceneModel ${this.id}]: creating TrianglesBatchingLayer`);
18100
18100
  vboBatchingLayer=new VBOBatchingTrianglesLayer({model:model,textureSet:textureSet,layerIndex:0,// This is set in #finalize()
@@ -18155,7 +18155,14 @@ vboInstancingLayer=new VBOInstancingPointsLayer({model:model,textureSet:textureS
18155
18155
  * @param {Boolean} [cfg.selected=false] Indicates if the SceneModelEntity is initially selected. Selected appearance is configured by {@link SceneModel#selectedMaterial}.
18156
18156
  * @param {Boolean} [cfg.edges=false] Indicates if the SceneModelEntity's edges are initially emphasized. Edges appearance is configured by {@link SceneModel#edgeMaterial}.
18157
18157
  * @returns {SceneModelEntity} The new SceneModelEntity.
18158
- */},{key:"createEntity",value:function createEntity(cfg){if(cfg.id===undefined){cfg.id=math.createUUID();}else if(this.scene.components[cfg.id]){this.error("Scene already has a Component with this ID: ".concat(cfg.id," - will assign random ID"));cfg.id=math.createUUID();}if(cfg.meshIds===undefined){this.error("Config missing: meshIds");return;}var flags=0;if(this._visible&&cfg.visible!==false){flags=flags|ENTITY_FLAGS.VISIBLE;}if(this._pickable&&cfg.pickable!==false){flags=flags|ENTITY_FLAGS.PICKABLE;}if(this._culled&&cfg.culled!==false){flags=flags|ENTITY_FLAGS.CULLED;}if(this._clippable&&cfg.clippable!==false){flags=flags|ENTITY_FLAGS.CLIPPABLE;}if(this._collidable&&cfg.collidable!==false){flags=flags|ENTITY_FLAGS.COLLIDABLE;}if(this._edges&&cfg.edges!==false){flags=flags|ENTITY_FLAGS.EDGES;}if(this._xrayed&&cfg.xrayed!==false){flags=flags|ENTITY_FLAGS.XRAYED;}if(this._highlighted&&cfg.highlighted!==false){flags=flags|ENTITY_FLAGS.HIGHLIGHTED;}if(this._selected&&cfg.selected!==false){flags=flags|ENTITY_FLAGS.SELECTED;}cfg.flags=flags;this._createEntity(cfg);}},{key:"_createEntity",value:function _createEntity(cfg){var meshes=[];for(var _i418=0,len=cfg.meshIds.length;_i418<len;_i418++){var meshId=cfg.meshIds[_i418];var _mesh2=this._meshes[meshId];if(!_mesh2){this.error("Mesh with this ID not found: \"".concat(meshId,"\" - ignoring this mesh"));continue;}if(_mesh2.parent){this.error("Mesh with ID \"".concat(meshId,"\" already belongs to object with ID \"").concat(_mesh2.parent.id,"\" - ignoring this mesh"));continue;}meshes.push(_mesh2);}var lodCullable=true;var entity=new SceneModelEntity(this,cfg.isObject,cfg.id,meshes,cfg.flags,lodCullable);// Internally sets SceneModelEntity#parent to this SceneModel
18158
+ */},{key:"createEntity",value:function createEntity(cfg){if(cfg.id===undefined){cfg.id=math.createUUID();}else if(this.scene.components[cfg.id]){this.error("Scene already has a Component with this ID: ".concat(cfg.id," - will assign random ID"));cfg.id=math.createUUID();}if(cfg.meshIds===undefined){this.error("Config missing: meshIds");return;}var flags=0;if(this._visible&&cfg.visible!==false){flags=flags|ENTITY_FLAGS.VISIBLE;}if(this._pickable&&cfg.pickable!==false){flags=flags|ENTITY_FLAGS.PICKABLE;}if(this._culled&&cfg.culled!==false){flags=flags|ENTITY_FLAGS.CULLED;}if(this._clippable&&cfg.clippable!==false){flags=flags|ENTITY_FLAGS.CLIPPABLE;}if(this._collidable&&cfg.collidable!==false){flags=flags|ENTITY_FLAGS.COLLIDABLE;}if(this._edges&&cfg.edges!==false){flags=flags|ENTITY_FLAGS.EDGES;}if(this._xrayed&&cfg.xrayed!==false){flags=flags|ENTITY_FLAGS.XRAYED;}if(this._highlighted&&cfg.highlighted!==false){flags=flags|ENTITY_FLAGS.HIGHLIGHTED;}if(this._selected&&cfg.selected!==false){flags=flags|ENTITY_FLAGS.SELECTED;}cfg.flags=flags;this._createEntity(cfg);}},{key:"_createEntity",value:function _createEntity(cfg){var meshes=[];for(var _i418=0,len=cfg.meshIds.length;_i418<len;_i418++){var meshId=cfg.meshIds[_i418];var _mesh2=this._meshes[meshId];// Trying to get already created mesh
18159
+ if(!_mesh2){// Checks if there is already created mesh for this meshId
18160
+ var meshCfg=this._meshesCfgsBeforeMeshCreation[meshId];// Trying to get already created cfg
18161
+ if(!meshCfg){// Checks if there is already created cfg for this meshId
18162
+ this.error("Mesh with this ID not found: \"".concat(meshId,"\" - ignoring this mesh"));// There is no such cfg
18163
+ continue;}_mesh2=this._createMesh(meshCfg);// There is no such mesh yet, but there is already created cfg, so it creates this mesh
18164
+ this._meshes[cfg.id]=_mesh2;// Now it will also add this mesh to dictionary of created meshes
18165
+ }if(_mesh2.parent){this.error("Mesh with ID \"".concat(meshId,"\" already belongs to object with ID \"").concat(_mesh2.parent.id,"\" - ignoring this mesh"));continue;}meshes.push(_mesh2);}var lodCullable=true;var entity=new SceneModelEntity(this,cfg.isObject,cfg.id,meshes,cfg.flags,lodCullable);// Internally sets SceneModelEntity#parent to this SceneModel
18159
18166
  this._entityList.push(entity);this._entities[cfg.id]=entity;this.numEntities++;}/**
18160
18167
  * Finalizes this SceneModel.
18161
18168
  *
@@ -18940,7 +18947,7 @@ this._originDot.setVisible(this._visible&&this._originVisible);this._targetDot.s
18940
18947
  * @returns {boolean} Whether snap-to-vertex and snap-to-edge are enabled for this DistanceMeasurementsMouseControl.
18941
18948
  */function get(){return this._snapping;}/**
18942
18949
  * Activates this DistanceMeasurementsMouseControl, ready to respond to input.
18943
- */,set:function set(snapping){if(snapping!==this._snapping){this._snapping=snapping;this.deactivate();this.activate();}else{this._snapping=snapping;}}},{key:"activate",value:function activate(){var _this82=this;if(this._active){return;}if(!this._markerDiv){this._initMarkerDiv();}this.fire("activated",true);var distanceMeasurementsPlugin=this.distanceMeasurementsPlugin;var scene=this.scene;var cameraControl=distanceMeasurementsPlugin.viewer.cameraControl;var canvas=scene.canvas.canvas;scene.input;var mouseHovering=false;var pointerWorldPos=math.vec3();var pointerCanvasPos=math.vec2();var pointerDownCanvasX;var pointerDownCanvasY;var clickTolerance=20;var hoveredEntity=null;this._mouseState=MOUSE_FIRST_CLICK_EXPECTED;this._onCameraControlHoverSnapOrSurface=cameraControl.on(this._snapping?"hoverSnapOrSurface":"hoverSurface",function(event){var canvasPos=event.snappedCanvasPos||event.canvasPos;mouseHovering=true;pointerWorldPos.set(event.worldPos);pointerCanvasPos.set(event.canvasPos);if(_this82._mouseState===MOUSE_FIRST_CLICK_EXPECTED){_this82._markerDiv.style.marginLeft="".concat(canvasPos[0]-5,"px");_this82._markerDiv.style.marginTop="".concat(canvasPos[1]-5,"px");_this82._markerDiv.style.background="pink";if(event.snappedToVertex||event.snappedToEdge){if(_this82.pointerLens){_this82.pointerLens.visible=true;_this82.pointerLens.canvasPos=event.canvasPos;_this82.pointerLens.snappedCanvasPos=event.snappedCanvasPos||event.canvasPos;_this82.pointerLens.snapped=true;}_this82._markerDiv.style.background="greenyellow";_this82._markerDiv.style.border="2px solid green";}else{if(_this82.pointerLens){_this82.pointerLens.visible=true;_this82.pointerLens.canvasPos=event.canvasPos;_this82.pointerLens.snappedCanvasPos=event.canvasPos;_this82.pointerLens.snapped=false;}_this82._markerDiv.style.background="pink";_this82._markerDiv.style.border="2px solid red";}hoveredEntity=event.entity;}else{_this82._markerDiv.style.marginLeft="-10000px";_this82._markerDiv.style.marginTop="-10000px";}canvas.style.cursor="pointer";if(_this82._currentDistanceMeasurement){_this82._currentDistanceMeasurement.wireVisible=_this82._currentDistanceMeasurementInitState.wireVisible;_this82._currentDistanceMeasurement.axisVisible=_this82._currentDistanceMeasurementInitState.axisVisible&&_this82.distanceMeasurementsPlugin.defaultAxisVisible;_this82._currentDistanceMeasurement.xAxisVisible=_this82._currentDistanceMeasurementInitState.xAxisVisible&&_this82.distanceMeasurementsPlugin.defaultXAxisVisible;_this82._currentDistanceMeasurement.yAxisVisible=_this82._currentDistanceMeasurementInitState.yAxisVisible&&_this82.distanceMeasurementsPlugin.defaultYAxisVisible;_this82._currentDistanceMeasurement.zAxisVisible=_this82._currentDistanceMeasurementInitState.zAxisVisible&&_this82.distanceMeasurementsPlugin.defaultZAxisVisible;_this82._currentDistanceMeasurement.targetVisible=_this82._currentDistanceMeasurementInitState.targetVisible;_this82._currentDistanceMeasurement.target.worldPos=pointerWorldPos.slice();_this82._markerDiv.style.marginLeft="-10000px";_this82._markerDiv.style.marginTop="-10000px";}});canvas.addEventListener('mousedown',this._onMouseDown=function(e){if(e.which!==1){return;}pointerDownCanvasX=e.clientX;pointerDownCanvasY=e.clientY;});canvas.addEventListener("mouseup",this._onMouseUp=function(e){if(e.which!==1){return;}if(e.clientX>pointerDownCanvasX+clickTolerance||e.clientX<pointerDownCanvasX-clickTolerance||e.clientY>pointerDownCanvasY+clickTolerance||e.clientY<pointerDownCanvasY-clickTolerance){return;}if(_this82._currentDistanceMeasurement){if(mouseHovering){_this82._currentDistanceMeasurement.target.entity=hoveredEntity;hoveredEntity=null;_this82._currentDistanceMeasurement.clickable=true;_this82.distanceMeasurementsPlugin.fire("measurementEnd",_this82._currentDistanceMeasurement);_this82._currentDistanceMeasurement=null;}else{_this82._currentDistanceMeasurement.destroy();_this82.distanceMeasurementsPlugin.fire("measurementCancel",_this82._currentDistanceMeasurement);_this82._currentDistanceMeasurement=null;hoveredEntity=null;}}else{if(mouseHovering){_this82._currentDistanceMeasurement=distanceMeasurementsPlugin.createMeasurement({id:math.createUUID(),origin:{worldPos:pointerWorldPos.slice()},target:{worldPos:pointerWorldPos.slice()},approximate:true});_this82._currentDistanceMeasurementInitState.axisVisible=_this82._currentDistanceMeasurement.axisVisible&&_this82.distanceMeasurementsPlugin.defaultAxisVisible;_this82._currentDistanceMeasurementInitState.xAxisVisible=_this82._currentDistanceMeasurement.xAxisVisible&&_this82.distanceMeasurementsPlugin.defaultXAxisVisible;_this82._currentDistanceMeasurementInitState.yAxisVisible=_this82._currentDistanceMeasurement.yAxisVisible&&_this82.distanceMeasurementsPlugin.defaultYAxisVisible;_this82._currentDistanceMeasurementInitState.zAxisVisible=_this82._currentDistanceMeasurement.zAxisVisible&&_this82.distanceMeasurementsPlugin.defaultZAxisVisible;_this82._currentDistanceMeasurementInitState.wireVisible=_this82._currentDistanceMeasurement.wireVisible;_this82._currentDistanceMeasurementInitState.targetVisible=_this82._currentDistanceMeasurement.targetVisible;_this82._currentDistanceMeasurement.clickable=false;_this82._currentDistanceMeasurement.origin.entity=hoveredEntity;hoveredEntity=null;_this82.fire("measurementStart",_this82._currentDistanceMeasurement);}}});this._onCameraControlHoverSnapOrSurfaceOff=cameraControl.on(this._snapping?"hoverSnapOrSurfaceOff":"hoverOff",function(event){if(_this82.pointerLens){_this82.pointerLens.visible=true;_this82.pointerLens.canvasPos=event.canvasPos;_this82.pointerLens.snappedCanvasPos=event.snappedCanvasPos||event.canvasPos;}mouseHovering=false;_this82._markerDiv.style.marginLeft="-100px";_this82._markerDiv.style.marginTop="-100px";if(_this82._currentDistanceMeasurement){_this82._currentDistanceMeasurement.wireVisible=false;_this82._currentDistanceMeasurement.targetVisible=false;_this82._currentDistanceMeasurement.axisVisible=false;}canvas.style.cursor="default";});this._active=true;}/**
18950
+ */,set:function set(snapping){if(snapping!==this._snapping){this._snapping=snapping;this.deactivate();this.activate();}else{this._snapping=snapping;}}},{key:"activate",value:function activate(){var _this82=this;if(this._active){return;}if(!this._markerDiv){this._initMarkerDiv();}this.fire("activated",true);var distanceMeasurementsPlugin=this.distanceMeasurementsPlugin;var scene=this.scene;var cameraControl=distanceMeasurementsPlugin.viewer.cameraControl;var canvas=scene.canvas.canvas;scene.input;var mouseHovering=false;var pointerWorldPos=math.vec3();var pointerCanvasPos=math.vec2();var pointerDownCanvasX;var pointerDownCanvasY;var clickTolerance=20;var hoveredEntity=null;this._mouseState=MOUSE_FIRST_CLICK_EXPECTED;this._onCameraControlHoverSnapOrSurface=cameraControl.on(this._snapping?"hoverSnapOrSurface":"hoverSurface",function(event){var canvasPos=event.snappedCanvasPos||event.canvasPos;mouseHovering=true;pointerWorldPos.set(event.worldPos);pointerCanvasPos.set(event.canvasPos);if(_this82._mouseState===MOUSE_FIRST_CLICK_EXPECTED){var canvasBoundRect=canvas.getBoundingClientRect();var scrollLeft=window.pageXOffset||document.documentElement.scrollLeft;var scrollTop=window.pageYOffset||document.documentElement.scrollTop;var canvasLeftEdge=canvasBoundRect.left+scrollLeft;var canvasTopEdge=canvasBoundRect.top+scrollTop;_this82._markerDiv.style.marginLeft="".concat(canvasLeftEdge+canvasPos[0]-5,"px");_this82._markerDiv.style.marginTop="".concat(canvasTopEdge+canvasPos[1]-5,"px");_this82._markerDiv.style.background="pink";if(event.snappedToVertex||event.snappedToEdge){if(_this82.pointerLens){_this82.pointerLens.visible=true;_this82.pointerLens.canvasPos=event.canvasPos;_this82.pointerLens.snappedCanvasPos=event.snappedCanvasPos||event.canvasPos;_this82.pointerLens.snapped=true;}_this82._markerDiv.style.background="greenyellow";_this82._markerDiv.style.border="2px solid green";}else{if(_this82.pointerLens){_this82.pointerLens.visible=true;_this82.pointerLens.canvasPos=event.canvasPos;_this82.pointerLens.snappedCanvasPos=event.canvasPos;_this82.pointerLens.snapped=false;}_this82._markerDiv.style.background="pink";_this82._markerDiv.style.border="2px solid red";}hoveredEntity=event.entity;}else{_this82._markerDiv.style.marginLeft="-10000px";_this82._markerDiv.style.marginTop="-10000px";}canvas.style.cursor="pointer";if(_this82._currentDistanceMeasurement){_this82._currentDistanceMeasurement.wireVisible=_this82._currentDistanceMeasurementInitState.wireVisible;_this82._currentDistanceMeasurement.axisVisible=_this82._currentDistanceMeasurementInitState.axisVisible&&_this82.distanceMeasurementsPlugin.defaultAxisVisible;_this82._currentDistanceMeasurement.xAxisVisible=_this82._currentDistanceMeasurementInitState.xAxisVisible&&_this82.distanceMeasurementsPlugin.defaultXAxisVisible;_this82._currentDistanceMeasurement.yAxisVisible=_this82._currentDistanceMeasurementInitState.yAxisVisible&&_this82.distanceMeasurementsPlugin.defaultYAxisVisible;_this82._currentDistanceMeasurement.zAxisVisible=_this82._currentDistanceMeasurementInitState.zAxisVisible&&_this82.distanceMeasurementsPlugin.defaultZAxisVisible;_this82._currentDistanceMeasurement.targetVisible=_this82._currentDistanceMeasurementInitState.targetVisible;_this82._currentDistanceMeasurement.target.worldPos=pointerWorldPos.slice();_this82._markerDiv.style.marginLeft="-10000px";_this82._markerDiv.style.marginTop="-10000px";}});canvas.addEventListener('mousedown',this._onMouseDown=function(e){if(e.which!==1){return;}pointerDownCanvasX=e.clientX;pointerDownCanvasY=e.clientY;});canvas.addEventListener("mouseup",this._onMouseUp=function(e){if(e.which!==1){return;}if(e.clientX>pointerDownCanvasX+clickTolerance||e.clientX<pointerDownCanvasX-clickTolerance||e.clientY>pointerDownCanvasY+clickTolerance||e.clientY<pointerDownCanvasY-clickTolerance){return;}if(_this82._currentDistanceMeasurement){if(mouseHovering){_this82._currentDistanceMeasurement.target.entity=hoveredEntity;hoveredEntity=null;_this82._currentDistanceMeasurement.clickable=true;_this82.distanceMeasurementsPlugin.fire("measurementEnd",_this82._currentDistanceMeasurement);_this82._currentDistanceMeasurement=null;}else{_this82._currentDistanceMeasurement.destroy();_this82.distanceMeasurementsPlugin.fire("measurementCancel",_this82._currentDistanceMeasurement);_this82._currentDistanceMeasurement=null;hoveredEntity=null;}}else{if(mouseHovering){_this82._currentDistanceMeasurement=distanceMeasurementsPlugin.createMeasurement({id:math.createUUID(),origin:{worldPos:pointerWorldPos.slice()},target:{worldPos:pointerWorldPos.slice()},approximate:true});_this82._currentDistanceMeasurementInitState.axisVisible=_this82._currentDistanceMeasurement.axisVisible&&_this82.distanceMeasurementsPlugin.defaultAxisVisible;_this82._currentDistanceMeasurementInitState.xAxisVisible=_this82._currentDistanceMeasurement.xAxisVisible&&_this82.distanceMeasurementsPlugin.defaultXAxisVisible;_this82._currentDistanceMeasurementInitState.yAxisVisible=_this82._currentDistanceMeasurement.yAxisVisible&&_this82.distanceMeasurementsPlugin.defaultYAxisVisible;_this82._currentDistanceMeasurementInitState.zAxisVisible=_this82._currentDistanceMeasurement.zAxisVisible&&_this82.distanceMeasurementsPlugin.defaultZAxisVisible;_this82._currentDistanceMeasurementInitState.wireVisible=_this82._currentDistanceMeasurement.wireVisible;_this82._currentDistanceMeasurementInitState.targetVisible=_this82._currentDistanceMeasurement.targetVisible;_this82._currentDistanceMeasurement.clickable=false;_this82._currentDistanceMeasurement.origin.entity=hoveredEntity;hoveredEntity=null;_this82.fire("measurementStart",_this82._currentDistanceMeasurement);}}});this._onCameraControlHoverSnapOrSurfaceOff=cameraControl.on(this._snapping?"hoverSnapOrSurfaceOff":"hoverOff",function(event){if(_this82.pointerLens){_this82.pointerLens.visible=true;_this82.pointerLens.canvasPos=event.canvasPos;_this82.pointerLens.snappedCanvasPos=event.snappedCanvasPos||event.canvasPos;}mouseHovering=false;_this82._markerDiv.style.marginLeft="-100px";_this82._markerDiv.style.marginTop="-100px";if(_this82._currentDistanceMeasurement){_this82._currentDistanceMeasurement.wireVisible=false;_this82._currentDistanceMeasurement.targetVisible=false;_this82._currentDistanceMeasurement.axisVisible=false;}canvas.style.cursor="default";});this._active=true;}/**
18944
18951
  * Deactivates this DistanceMeasurementsMouseControl, making it unresponsive to input.
18945
18952
  *
18946
18953
  * Destroys any {@link DistanceMeasurement} under construction by this DistanceMeasurementsMouseControl.