@xeokit/xeokit-sdk 2.6.28 → 2.6.30

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 (58) hide show
  1. package/README.md +1 -0
  2. package/dist/xeokit-sdk.cjs.js +1425 -649
  3. package/dist/xeokit-sdk.es.js +1420 -650
  4. package/dist/xeokit-sdk.es5.js +629 -552
  5. package/dist/xeokit-sdk.min.cjs.js +5 -5
  6. package/dist/xeokit-sdk.min.es.js +5 -5
  7. package/dist/xeokit-sdk.min.es5.js +4 -4
  8. package/package.json +1 -1
  9. package/src/extras/PointerCircle/PointerCircle.js +1 -1
  10. package/src/plugins/AngleMeasurementsPlugin/AngleMeasurementsMouseControl.js +22 -41
  11. package/src/plugins/AngleMeasurementsPlugin/AngleMeasurementsTouchControl.js +3 -18
  12. package/src/plugins/DistanceMeasurementsPlugin/DistanceMeasurementsMouseControl.js +20 -41
  13. package/src/plugins/DistanceMeasurementsPlugin/DistanceMeasurementsTouchControl.js +4 -20
  14. package/src/plugins/DistanceMeasurementsPlugin/index.js +1 -1
  15. package/src/plugins/GLTFLoaderPlugin/GLTFLoaderPlugin.js +2 -110
  16. package/src/plugins/GLTFLoaderPlugin/GLTFSceneModelLoader.js +252 -222
  17. package/src/plugins/StoreyViewsPlugin/StoreyViewsPlugin.js +31 -1
  18. package/src/plugins/XKTLoaderPlugin/XKTLoaderPlugin.js +20 -8
  19. package/src/plugins/ZonesPlugin/ZonesPlugin.js +1939 -0
  20. package/src/plugins/ZonesPlugin/index.js +1 -1875
  21. package/src/viewer/Viewer.js +2 -2
  22. package/src/viewer/metadata/MetaScene.js +0 -2
  23. package/src/viewer/scene/math/MeshSurfaceArea.js +90 -0
  24. package/src/viewer/scene/math/MeshVolume.js +102 -0
  25. package/src/viewer/scene/math/index.js +3 -0
  26. package/src/viewer/scene/math/isTriangleMeshSolid.js +162 -0
  27. package/src/viewer/scene/math/math.js +8 -0
  28. package/src/viewer/scene/model/SceneModel.js +73 -34
  29. package/src/viewer/scene/model/SceneModelEntity.js +46 -1
  30. package/src/viewer/scene/model/SceneModelMesh.js +74 -1
  31. package/src/viewer/scene/model/SceneModelTextureSet.js +5 -0
  32. package/src/viewer/scene/model/dtx/lines/DTXLinesLayer.js +7 -1
  33. package/src/viewer/scene/model/dtx/triangles/DTXTrianglesLayer.js +77 -1
  34. package/src/viewer/scene/model/dtx/triangles/renderers/DTXTrianglesSnapInitRenderer.js +8 -0
  35. package/src/viewer/scene/model/dtx/triangles/renderers/DTXTrianglesSnapRenderer.js +8 -0
  36. package/src/viewer/scene/model/vbo/VBORenderer.js +10 -1
  37. package/src/viewer/scene/model/vbo/batching/lines/VBOBatchingLinesLayer.js +6 -1
  38. package/src/viewer/scene/model/vbo/batching/lines/renderers/VBOBatchingLinesSnapRenderer.js +1 -1
  39. package/src/viewer/scene/model/vbo/batching/points/VBOBatchingPointsLayer.js +6 -1
  40. package/src/viewer/scene/model/vbo/batching/triangles/VBOBatchingTrianglesLayer.js +59 -18
  41. package/src/viewer/scene/model/vbo/batching/triangles/renderers/Renderers.js +40 -12
  42. package/src/viewer/scene/model/vbo/batching/triangles/renderers/TrianglesBatchingRenderer.js +2 -3
  43. package/src/viewer/scene/model/vbo/batching/triangles/renderers/TrianglesColorTextureRenderer.js +25 -7
  44. package/src/viewer/scene/model/vbo/batching/triangles/renderers/TrianglesSnapRenderer.js +1 -1
  45. package/src/viewer/scene/model/vbo/instancing/lines/VBOInstancingLinesLayer.js +6 -1
  46. package/src/viewer/scene/model/vbo/instancing/lines/renderers/VBOInstancingLinesSnapRenderer.js +1 -1
  47. package/src/viewer/scene/model/vbo/instancing/points/VBOInstancingPointsLayer.js +6 -1
  48. package/src/viewer/scene/model/vbo/instancing/triangles/VBOInstancingTrianglesLayer.js +48 -14
  49. package/src/viewer/scene/model/vbo/instancing/triangles/renderers/Renderers.js +74 -47
  50. package/src/viewer/scene/model/vbo/instancing/triangles/renderers/TrianglesColorTextureRenderer.js +29 -14
  51. package/src/viewer/scene/model/vbo/instancing/triangles/renderers/TrianglesInstancingRenderer.js +5 -4
  52. package/src/viewer/scene/model/vbo/instancing/triangles/renderers/TrianglesSnapRenderer.js +1 -1
  53. package/src/viewer/scene/scene/Scene.js +16 -5
  54. package/src/viewer/scene/webgl/occlusion/OcclusionLayer.js +1 -1
  55. package/src/viewer/scene/webgl/occlusion/OcclusionTester.js +1 -5
  56. package/types/plugins/DistanceMeasurementsPlugin/DistanceMeasurement.d.ts +7 -0
  57. package/types/plugins/DistanceMeasurementsPlugin/DistanceMeasurementsPlugin.d.ts +26 -1
  58. package/types/plugins/DistanceMeasurementsPlugin/index.d.ts +3 -1
@@ -4,7 +4,6 @@ import {TrianglesInstancingRenderer} from "./TrianglesInstancingRenderer.js";
4
4
  * @private
5
5
  */
6
6
 
7
-
8
7
  export class TrianglesColorTextureRenderer extends TrianglesInstancingRenderer {
9
8
  _getHash() {
10
9
  const scene = this._scene;
@@ -40,7 +39,7 @@ export class TrianglesColorTextureRenderer extends TrianglesInstancingRenderer {
40
39
 
41
40
  this._addMatricesUniformBlockLines(src);
42
41
 
43
- src.push("uniform mat3 uvDecodeMatrix;")
42
+ src.push("uniform mat3 uvDecodeMatrix;");
44
43
 
45
44
  if (scene.logarithmicDepthBufferEnabled) {
46
45
  src.push("uniform float logDepthBufFC;");
@@ -73,7 +72,7 @@ export class TrianglesColorTextureRenderer extends TrianglesInstancingRenderer {
73
72
  src.push("vec4 worldPosition = positionsDecodeMatrix * vec4(position, 1.0); ");
74
73
  src.push("worldPosition = worldMatrix * vec4(dot(worldPosition, modelMatrixCol0), dot(worldPosition, modelMatrixCol1), dot(worldPosition, modelMatrixCol2), 1.0);");
75
74
  if (scene.entityOffsetsEnabled) {
76
- src.push(" worldPosition.xyz = worldPosition.xyz + offset;");
75
+ src.push("worldPosition.xyz = worldPosition.xyz + offset;");
77
76
  }
78
77
 
79
78
  src.push("vec4 viewPosition = viewMatrix * worldPosition; ");
@@ -101,11 +100,10 @@ export class TrianglesColorTextureRenderer extends TrianglesInstancingRenderer {
101
100
  _buildFragmentShader() {
102
101
  const scene = this._scene;
103
102
  const gammaOutput = scene.gammaOutput; // If set, then it expects that all textures and colors need to be outputted in premultiplied gamma. Default is false.
104
- const sectionPlanesState = scene._sectionPlanesState;
105
103
  const lightsState = scene._lightsState;
106
- let i;
107
- let len;
104
+ const sectionPlanesState = scene._sectionPlanesState;
108
105
  const clipping = sectionPlanesState.getNumAllocatedSectionPlanes() > 0;
106
+ const useAlphaCutoff = this._useAlphaCutoff;
109
107
  const src = [];
110
108
  src.push("#version 300 es");
111
109
  src.push("// Instancing geometry drawing fragment shader");
@@ -117,6 +115,7 @@ export class TrianglesColorTextureRenderer extends TrianglesInstancingRenderer {
117
115
  src.push("precision mediump float;");
118
116
  src.push("precision mediump int;");
119
117
  src.push("#endif");
118
+
120
119
  if (scene.logarithmicDepthBufferEnabled) {
121
120
  src.push("in float isPerspective;");
122
121
  src.push("uniform float logDepthBufFC;");
@@ -165,7 +164,7 @@ export class TrianglesColorTextureRenderer extends TrianglesInstancingRenderer {
165
164
  this._addMatricesUniformBlockLines(src);
166
165
 
167
166
  src.push("uniform vec4 lightAmbient;");
168
- for (i = 0, len = lightsState.lights.length; i < len; i++) {
167
+ for (let i = 0, len = lightsState.lights.length; i < len; i++) {
169
168
  const light = lightsState.lights[i];
170
169
  if (light.type === "ambient") {
171
170
  continue;
@@ -183,6 +182,10 @@ export class TrianglesColorTextureRenderer extends TrianglesInstancingRenderer {
183
182
  }
184
183
  }
185
184
 
185
+ if (useAlphaCutoff) {
186
+ src.push("uniform float materialAlphaCutoff;");
187
+ }
188
+
186
189
  src.push("in vec4 vViewPosition;");
187
190
  src.push("in vec4 vColor;");
188
191
  src.push("in vec2 vUV;");
@@ -218,7 +221,7 @@ export class TrianglesColorTextureRenderer extends TrianglesInstancingRenderer {
218
221
  src.push("vec3 yTangent = dFdy( vViewPosition.xyz );");
219
222
  src.push("vec3 viewNormal = normalize( cross( xTangent, yTangent ) );");
220
223
 
221
- for (i = 0, len = lightsState.lights.length; i < len; i++) {
224
+ for (let i = 0, len = lightsState.lights.length; i < len; i++) {
222
225
  const light = lightsState.lights[i];
223
226
  if (light.type === "ambient") {
224
227
  continue;
@@ -244,16 +247,27 @@ export class TrianglesColorTextureRenderer extends TrianglesInstancingRenderer {
244
247
  } else {
245
248
  continue;
246
249
  }
250
+
247
251
  src.push("lambertian = max(dot(-viewNormal, viewLightDir), 0.0);");
248
252
  src.push("reflectedColor += lambertian * (lightColor" + i + ".rgb * lightColor" + i + ".a);");
249
253
  }
250
254
 
251
255
  src.push("vec4 color = vec4((lightAmbient.rgb * lightAmbient.a * newColor.rgb) + (reflectedColor * newColor.rgb), newColor.a);");
256
+
257
+ src.push("vec4 sampleColor = texture(uColorMap, vUV);");
258
+
259
+ if (useAlphaCutoff) {
260
+ src.push("if (sampleColor.a < materialAlphaCutoff) {");
261
+ src.push(" discard;");
262
+ src.push("}");
263
+ }
264
+
252
265
  if (gammaOutput) {
253
- src.push("vec4 colorTexel = color * sRGBToLinear(texture(uColorMap, vUV));");
254
- } else {
255
- src.push("vec4 colorTexel = color * texture(uColorMap, vUV);");
266
+ src.push("sampleColor = sRGBToLinear(sampleColor);");
256
267
  }
268
+
269
+ src.push("vec4 colorTexel = color * sampleColor;");
270
+
257
271
  src.push("float opacity = color.a;");
258
272
 
259
273
  if (this._withSAO) {
@@ -265,9 +279,10 @@ export class TrianglesColorTextureRenderer extends TrianglesInstancingRenderer {
265
279
  src.push(" float blendFactor = uSAOParams[3];");
266
280
  src.push(" vec2 uv = vec2(gl_FragCoord.x / viewportWidth, gl_FragCoord.y / viewportHeight);");
267
281
  src.push(" float ambient = smoothstep(blendCutoff, 1.0, unpackRGBToFloat(texture(uOcclusionTexture, uv))) * blendFactor;");
268
- src.push(" outColor = vec4(newColor.rgb * colorTexel.rgb * ambient, opacity);");
282
+
283
+ src.push(" outColor = vec4(colorTexel.rgb * ambient, opacity);");
269
284
  } else {
270
- src.push(" outColor = vec4(newColor.rgb * colorTexel.rgb, opacity);");
285
+ src.push(" outColor = vec4(colorTexel.rgb, opacity);");
271
286
  }
272
287
 
273
288
  if (gammaOutput) {
@@ -275,7 +290,7 @@ export class TrianglesColorTextureRenderer extends TrianglesInstancingRenderer {
275
290
  }
276
291
 
277
292
  if (scene.logarithmicDepthBufferEnabled) {
278
- src.push(" gl_FragDepth = isPerspective == 0.0 ? gl_FragCoord.z : log2( vFragDepth ) * logDepthBufFC * 0.5;");
293
+ src.push("gl_FragDepth = isPerspective == 0.0 ? gl_FragCoord.z : log2( vFragDepth ) * logDepthBufFC * 0.5;");
279
294
  }
280
295
 
281
296
  src.push("}");
@@ -4,8 +4,8 @@ import {VBORenderer} from "./../../../VBORenderer.js";
4
4
  * @private
5
5
  */
6
6
  export class TrianglesInstancingRenderer extends VBORenderer {
7
- constructor(scene, withSAO, {edges = false} = {}) {
8
- super(scene, withSAO, {instancing: true, edges});
7
+ constructor(scene, withSAO, {edges = false, useAlphaCutoff = false} = {}) {
8
+ super(scene, withSAO, {instancing: true, edges, useAlphaCutoff});
9
9
  }
10
10
 
11
11
  _draw(drawCfg) {
@@ -14,16 +14,17 @@ export class TrianglesInstancingRenderer extends VBORenderer {
14
14
  const {
15
15
  state,
16
16
  frameCtx,
17
- incrementDrawState,
17
+ incrementDrawState
18
18
  } = drawCfg;
19
19
 
20
20
  if (this._edges) {
21
21
  gl.drawElementsInstanced(gl.LINES, state.edgeIndicesBuf.numItems, state.edgeIndicesBuf.itemType, 0, state.numInstances);
22
22
  } else {
23
23
  gl.drawElementsInstanced(gl.TRIANGLES, state.indicesBuf.numItems, state.indicesBuf.itemType, 0, state.numInstances);
24
+
24
25
  if (incrementDrawState) {
25
26
  frameCtx.drawElements++;
26
27
  }
27
28
  }
28
29
  }
29
- }
30
+ }
@@ -230,7 +230,7 @@ export class TrianglesSnapRenderer extends VBORenderer {
230
230
  // renderPass = PICK
231
231
  src.push(`int pickFlag = int(flags) >> 12 & 0xF;`);
232
232
  src.push(`if (pickFlag != renderPass) {`);
233
- src.push(" gl_Position = vec4(0.0, 0.0, 0.0, 0.0);"); // Cull vertex
233
+ src.push(" gl_Position = vec4(2.0, 0.0, 0.0, 0.0);"); // Cull vertex
234
234
  src.push("} else {");
235
235
  src.push(" vec4 worldPosition = positionsDecodeMatrix * vec4(position, 1.0); ");
236
236
  src.push(" worldPosition = worldMatrix * vec4(dot(worldPosition, modelMatrixCol0), dot(worldPosition, modelMatrixCol1), dot(worldPosition, modelMatrixCol2), 1.0);");
@@ -368,6 +368,8 @@ class Scene extends Component {
368
368
 
369
369
  this._aabbDirty = true;
370
370
 
371
+ this._readableGeometry = !!cfg.readableGeometryEnabled;
372
+
371
373
  /**
372
374
  * The {@link Viewer} this Scene belongs to.
373
375
  * @type {Viewer}
@@ -1292,18 +1294,27 @@ class Scene extends Component {
1292
1294
  }
1293
1295
 
1294
1296
  /**
1295
- * Whether precision surface picking is enabled.
1297
+ * Whether geometry is readable.
1296
1298
  *
1297
1299
  * This is set via the {@link Viewer} constructor and is ````false```` by default.
1298
1300
  *
1299
- * The ````pickSurfacePrecision```` option for ````Scene#pick```` only works if this is set ````true````.
1301
+ * The ````readableGeometryEnabled```` option for ````Scene#pick```` only works if this is set ````true````.
1300
1302
  *
1301
1303
  * Note that when ````true````, this configuration will increase the amount of browser memory used by the Viewer.
1302
1304
  *
1303
- * @returns {Boolean} True if precision picking is enabled.
1305
+ * @returns {Boolean} True if geometry is readable.
1306
+ */
1307
+ get readableGeometryEnabled() {
1308
+ return this._readableGeometry;
1309
+ }
1310
+
1311
+ /**
1312
+ * Whether precision surface picking is enabled.
1313
+ * @deprecated
1314
+ * @returns {*|boolean}
1304
1315
  */
1305
1316
  get pickSurfacePrecisionEnabled() {
1306
- return false; // Removed
1317
+ return this._readableGeometry;
1307
1318
  }
1308
1319
 
1309
1320
  /**
@@ -2284,7 +2295,7 @@ class Scene extends Component {
2284
2295
  *
2285
2296
  * @param {*} params Picking parameters.
2286
2297
  * @param {Boolean} [params.pickSurface=false] Whether to find the picked position on the surface of the Entity.
2287
- * @param {Boolean} [params.pickSurfacePrecision=false] When picking an Entity surface position, indicates whether or not we want full-precision {@link PickResult#worldPos}. Only works when {@link Scene#pickSurfacePrecisionEnabled} is ````true````. If pick succeeds, the returned {@link PickResult} will have {@link PickResult#precision} set ````true````, to indicate that it contains full-precision surface pick results.
2298
+ * @param {Boolean} [params.pickSurfacePrecision=false] When picking an Entity surface position, indicates whether or not we want full-precision {@link PickResult#worldPos}. Only works when {@link Scene#readableGeometryEnabled} is ````true````. If pick succeeds, the returned {@link PickResult} will have {@link PickResult#precision} set ````true````, to indicate that it contains full-precision surface pick results.
2288
2299
  * @param {Boolean} [params.pickSurfaceNormal=false] Whether to find the picked normal on the surface of the Entity. Only works if ````pickSurface```` is given.
2289
2300
  * @param {Number[]} [params.canvasPos] Canvas-space coordinates. When ray-picking, this will override the **origin** and ** direction** parameters and will cause the ray to be fired through the canvas at this position, directly along the negative View-space Z-axis.
2290
2301
  * @param {Number[]} [params.origin] World-space ray origin when ray-picking. Ignored when canvasPos given.
@@ -99,7 +99,7 @@ class OcclusionLayer {
99
99
  for (let i = 0; i < this.numMarkers; i++) {
100
100
  if (this.markerList[i]) {
101
101
  const marker = this.markerList[i];
102
- const worldPos = marker.worldPos;
102
+ const worldPos = marker.rtcPos;
103
103
  this.positions[j++] = worldPos[0];
104
104
  this.positions[j++] = worldPos[1];
105
105
  this.positions[j++] = worldPos[2];
@@ -2,7 +2,6 @@ import {math} from '../../math/math.js';
2
2
  import {Program} from "./../Program.js";
3
3
  import {OcclusionLayer} from "./OcclusionLayer.js";
4
4
  import {createRTCViewMat, getPlaneRTCPos} from "../../math/rtcCoords.js";
5
- import {WEBGL_INFO} from "../../webglInfo.js";
6
5
 
7
6
  const TEST_MODE = false;
8
7
  const MARKER_COLOR = math.vec3([1.0, 0.0, 0.0]);
@@ -333,10 +332,7 @@ class OcclusionTester {
333
332
  continue;
334
333
  }
335
334
 
336
- // The `origin` has been changed from `occlusionLayer.origin` to `[ 0, 0, 0 ]`
337
- // because OcclusionLayer markers' transformation is being applied through the
338
- // OcclusionLayer::positions array. See XEOK-33
339
- const origin = [ 0, 0, 0 ];
335
+ const origin = occlusionLayer.origin;
340
336
 
341
337
  gl.uniformMatrix4fv(this._uViewMatrix, false, createRTCViewMat(camera.viewMatrix, origin));
342
338
 
@@ -231,4 +231,11 @@ export declare class DistanceMeasurement extends Component {
231
231
  * @type {Boolean}
232
232
  */
233
233
  get labelsOnWires() : boolean;
234
+
235
+ /**
236
+ * Sets the higlihted state on a measurement
237
+ *
238
+ * @type {String}
239
+ */
240
+ setHighlighted(highlighted: boolean): void;
234
241
  }
@@ -91,6 +91,31 @@ export declare type DistanceMeasurementMouseLeaveEvent = {
91
91
  event: MouseEvent;
92
92
  }
93
93
 
94
+ /**
95
+ * Event fire by {@link DistanceMeasurementsPlugin} when context menu is shown on {@link DistanceMeasurement}.
96
+ */
97
+ export declare type DistanceMeasurementMouseContextMenuEvent = {
98
+ /**
99
+ * The plugin.
100
+ */
101
+ plugin: DistanceMeasurementsPlugin;
102
+
103
+ /**
104
+ * The measurement.
105
+ */
106
+ distanceMeasurement: DistanceMeasurement;
107
+
108
+ /**
109
+ * The measurement.
110
+ */
111
+ measurement: DistanceMeasurement;
112
+
113
+ /**
114
+ * The original mouse event.
115
+ */
116
+ event: MouseEvent;
117
+ }
118
+
94
119
  /**
95
120
  * {@link Viewer} plugin for measuring point-to-point distances.
96
121
  */
@@ -206,7 +231,7 @@ export declare class DistanceMeasurementsPlugin extends Plugin {
206
231
  * @param {String} event The contextMenu event
207
232
  * @param {Function} callback Callback fired on the event
208
233
  */
209
- on(event: "contextMenu", callback: (measurement: DistanceMeasurement)=> void): string;
234
+ on(event: "contextMenu", callback: (event: DistanceMeasurementMouseContextMenuEvent)=> void): string;
210
235
 
211
236
  /**
212
237
  * Fires when a measurement is created.
@@ -1,3 +1,5 @@
1
- export * from "./DistanceMeasurementsPlugin";
1
+ export * from "./DistanceMeasurement";
2
2
  export * from "./DistanceMeasurementsControl";
3
3
  export * from "./DistanceMeasurementsMouseControl";
4
+ export * from "./DistanceMeasurementsPlugin";
5
+