@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
@@ -50,6 +50,14 @@ class Renderers {
50
50
  this._colorTextureRendererWithSAO.destroy();
51
51
  this._colorTextureRendererWithSAO = null;
52
52
  }
53
+ if (this._colorTextureRendererAlphaCutoff && (!this._colorTextureRendererAlphaCutoff.getValid())) {
54
+ this._colorTextureRendererAlphaCutoff.destroy();
55
+ this._colorTextureRendererAlphaCutoff = null;
56
+ }
57
+ if (this._colorTextureRendererWithSAOAlphaCutoff && (!this._colorTextureRendererWithSAOAlphaCutoff.getValid())) {
58
+ this._colorTextureRendererWithSAOAlphaCutoff.destroy();
59
+ this._colorTextureRendererWithSAOAlphaCutoff = null;
60
+ }
53
61
  if (this._pbrRenderer && (!this._pbrRenderer.getValid())) {
54
62
  this._pbrRenderer.destroy();
55
63
  this._pbrRenderer = null;
@@ -177,6 +185,20 @@ class Renderers {
177
185
  return this._colorTextureRendererWithSAO;
178
186
  }
179
187
 
188
+ get colorTextureRendererAlphaCutoff() {
189
+ if (!this._colorTextureRendererAlphaCutoff) {
190
+ this._colorTextureRendererAlphaCutoff = new TrianglesColorTextureRenderer(this._scene, false, { useAlphaCutoff: true });
191
+ }
192
+ return this._colorTextureRendererAlphaCutoff;
193
+ }
194
+
195
+ get colorTextureRendererWithSAOAlphaCutoff() {
196
+ if (!this._colorTextureRendererWithSAOAlphaCutoff) {
197
+ this._colorTextureRendererWithSAOAlphaCutoff = new TrianglesColorTextureRenderer(this._scene, true, { useAlphaCutoff: true });
198
+ }
199
+ return this._colorTextureRendererWithSAOAlphaCutoff;
200
+ }
201
+
180
202
  get pbrRenderer() {
181
203
  if (!this._pbrRenderer) {
182
204
  this._pbrRenderer = new TrianglesPBRRenderer(this._scene, false);
@@ -301,6 +323,12 @@ class Renderers {
301
323
  if (this._colorTextureRendererWithSAO) {
302
324
  this._colorTextureRendererWithSAO.destroy();
303
325
  }
326
+ if (this._colorTextureRendererAlphaCutoff) {
327
+ this._colorTextureRendererAlphaCutoff.destroy();
328
+ }
329
+ if (this._colorTextureRendererWithSAOAlphaCutoff) {
330
+ this._colorTextureRendererWithSAOAlphaCutoff.destroy();
331
+ }
304
332
  if (this._pbrRenderer) {
305
333
  this._pbrRenderer.destroy();
306
334
  }
@@ -349,27 +377,27 @@ class Renderers {
349
377
  }
350
378
  }
351
379
 
352
- const cachdRenderers = {};
380
+ const cachedRenderers = {};
353
381
 
354
382
  /**
355
383
  * @private
356
384
  */
357
385
  export function getRenderers(scene) {
358
386
  const sceneId = scene.id;
359
- let batchingRenderers = cachdRenderers[sceneId];
360
- if (!batchingRenderers) {
361
- batchingRenderers = new Renderers(scene);
362
- cachdRenderers[sceneId] = batchingRenderers;
363
- batchingRenderers._compile();
364
- batchingRenderers.eagerCreateRenders();
387
+ let renderers = cachedRenderers[sceneId];
388
+ if (!renderers) {
389
+ renderers = new Renderers(scene);
390
+ cachedRenderers[sceneId] = renderers;
391
+ renderers._compile();
392
+ renderers.eagerCreateRenders();
365
393
  scene.on("compile", () => {
366
- batchingRenderers._compile();
367
- batchingRenderers.eagerCreateRenders();
394
+ renderers._compile();
395
+ renderers.eagerCreateRenders();
368
396
  });
369
397
  scene.on("destroyed", () => {
370
- delete cachdRenderers[sceneId];
371
- batchingRenderers._destroy();
398
+ delete cachedRenderers[sceneId];
399
+ renderers._destroy();
372
400
  });
373
401
  }
374
- return batchingRenderers;
402
+ return renderers;
375
403
  }
@@ -5,8 +5,8 @@ import {VBORenderer} from "./../../../VBORenderer.js";
5
5
  */
6
6
  export class TrianglesBatchingRenderer extends VBORenderer {
7
7
 
8
- constructor(scene, withSAO, {edges = false} = {}) {
9
- super(scene, withSAO, {instancing: false, edges});
8
+ constructor(scene, withSAO, {edges = false, useAlphaCutoff = false} = {}) {
9
+ super(scene, withSAO, {instancing: false, edges, useAlphaCutoff});
10
10
  }
11
11
 
12
12
  _draw(drawCfg) {
@@ -23,7 +23,6 @@ export class TrianglesBatchingRenderer extends VBORenderer {
23
23
  } else {
24
24
  const count = frameCtx.pickElementsCount || state.indicesBuf.numItems;
25
25
  const offset = frameCtx.pickElementsOffset ? frameCtx.pickElementsOffset * state.indicesBuf.itemByteSize : 0;
26
-
27
26
  gl.drawElements(gl.TRIANGLES, count, state.indicesBuf.itemType, offset);
28
27
 
29
28
  if (incrementDrawState) {
@@ -1,9 +1,9 @@
1
1
  import {TrianglesBatchingRenderer} from "./TrianglesBatchingRenderer.js";
2
2
 
3
-
4
3
  /**
5
4
  * @private
6
5
  */
6
+
7
7
  export class TrianglesColorTextureRenderer extends TrianglesBatchingRenderer {
8
8
  _getHash() {
9
9
  const scene = this._scene;
@@ -11,11 +11,10 @@ export class TrianglesColorTextureRenderer extends TrianglesBatchingRenderer {
11
11
  }
12
12
 
13
13
  drawLayer(frameCtx, layer, renderPass) {
14
- super.drawLayer(frameCtx, layer, renderPass, {incrementDrawState: true});
14
+ super.drawLayer(frameCtx, layer, renderPass, { incrementDrawState: true });
15
15
  }
16
16
 
17
17
  _buildVertexShader() {
18
-
19
18
  const scene = this._scene;
20
19
  const sectionPlanesState = scene._sectionPlanesState;
21
20
  const clipping = sectionPlanesState.getNumAllocatedSectionPlanes() > 0;
@@ -36,7 +35,7 @@ export class TrianglesColorTextureRenderer extends TrianglesBatchingRenderer {
36
35
 
37
36
  this._addMatricesUniformBlockLines(src);
38
37
 
39
- src.push("uniform mat3 uvDecodeMatrix;")
38
+ src.push("uniform mat3 uvDecodeMatrix;");
40
39
 
41
40
  if (scene.logarithmicDepthBufferEnabled) {
42
41
  src.push("uniform float logDepthBufFC;");
@@ -70,6 +69,7 @@ export class TrianglesColorTextureRenderer extends TrianglesBatchingRenderer {
70
69
  if (scene.entityOffsetsEnabled) {
71
70
  src.push("worldPosition.xyz = worldPosition.xyz + offset;");
72
71
  }
72
+
73
73
  src.push("vec4 viewPosition = viewMatrix * worldPosition; ");
74
74
  src.push("vViewPosition = viewPosition;");
75
75
  src.push("vColor = vec4(float(color.r) / 255.0, float(color.g) / 255.0, float(color.b) / 255.0, float(color.a) / 255.0);");
@@ -80,10 +80,12 @@ export class TrianglesColorTextureRenderer extends TrianglesBatchingRenderer {
80
80
  src.push("vFragDepth = 1.0 + clipPos.w;");
81
81
  src.push("isPerspective = float (isPerspectiveMatrix(projMatrix));");
82
82
  }
83
+
83
84
  if (clipping) {
84
85
  src.push("vWorldPosition = worldPosition;");
85
86
  src.push("vFlags = flags;");
86
87
  }
88
+
87
89
  src.push("gl_Position = clipPos;");
88
90
  src.push("}");
89
91
  src.push("}");
@@ -96,6 +98,7 @@ export class TrianglesColorTextureRenderer extends TrianglesBatchingRenderer {
96
98
  const lightsState = scene._lightsState;
97
99
  const sectionPlanesState = scene._sectionPlanesState;
98
100
  const clipping = sectionPlanesState.getNumAllocatedSectionPlanes() > 0;
101
+ const useAlphaCutoff = this._useAlphaCutoff;
99
102
  const src = [];
100
103
  src.push("#version 300 es");
101
104
  src.push("// Triangles batching color texture fragment shader");
@@ -154,6 +157,7 @@ export class TrianglesColorTextureRenderer extends TrianglesBatchingRenderer {
154
157
  src.push("uniform vec4 sliceColor;");
155
158
  }
156
159
  this._addMatricesUniformBlockLines(src);
160
+
157
161
  src.push("uniform vec4 lightAmbient;");
158
162
  for (let i = 0, len = lightsState.lights.length; i < len; i++) {
159
163
  const light = lightsState.lights[i];
@@ -173,6 +177,10 @@ export class TrianglesColorTextureRenderer extends TrianglesBatchingRenderer {
173
177
  }
174
178
  }
175
179
 
180
+ if (useAlphaCutoff) {
181
+ src.push("uniform float materialAlphaCutoff;");
182
+ }
183
+
176
184
  src.push("in vec4 vViewPosition;");
177
185
  src.push("in vec4 vColor;");
178
186
  src.push("in vec2 vUV;");
@@ -240,11 +248,21 @@ export class TrianglesColorTextureRenderer extends TrianglesBatchingRenderer {
240
248
  }
241
249
 
242
250
  src.push("vec4 color = vec4((lightAmbient.rgb * lightAmbient.a * newColor.rgb) + (reflectedColor * newColor.rgb), newColor.a);");
251
+
252
+ src.push("vec4 sampleColor = texture(uColorMap, vUV);");
253
+
254
+ if (useAlphaCutoff) {
255
+ src.push("if (sampleColor.a < materialAlphaCutoff) {");
256
+ src.push(" discard;");
257
+ src.push("}");
258
+ }
259
+
243
260
  if (gammaOutput) {
244
- src.push("vec4 colorTexel = color * sRGBToLinear(texture(uColorMap, vUV));");
245
- } else {
246
- src.push("vec4 colorTexel = color * texture(uColorMap, vUV);");
261
+ src.push("sampleColor = sRGBToLinear(sampleColor);");
247
262
  }
263
+
264
+ src.push("vec4 colorTexel = color * sampleColor;");
265
+
248
266
  src.push("float opacity = color.a;");
249
267
 
250
268
  if (this._withSAO) {
@@ -214,7 +214,7 @@ export class TrianglesSnapRenderer extends VBORenderer{
214
214
 
215
215
  src.push(`int pickFlag = int(flags) >> 12 & 0xF;`);
216
216
  src.push(`if (pickFlag != renderPass) {`);
217
- src.push(" gl_Position = vec4(0.0, 0.0, 0.0, 0.0);"); // Cull vertex
217
+ src.push(" gl_Position = vec4(2.0, 0.0, 0.0, 0.0);"); // Cull vertex
218
218
  src.push(" } else {");
219
219
  src.push(" vec4 worldPosition = worldMatrix * (positionsDecodeMatrix * vec4(position, 1.0)); ");
220
220
  if (scene.entityOffsetsEnabled) {
@@ -28,7 +28,7 @@ class VBOInstancingLinesLayer {
28
28
  */
29
29
  constructor(cfg) {
30
30
 
31
- console.info("VBOInstancingLinesLayer");
31
+ // console.info("VBOInstancingLinesLayer");
32
32
 
33
33
  /**
34
34
  * Owner model
@@ -108,6 +108,11 @@ class VBOInstancingLinesLayer {
108
108
  }
109
109
 
110
110
  this._finalized = false;
111
+
112
+ /**
113
+ * The type of primitives in this layer.
114
+ */
115
+ this.primitive = cfg.primitive;
111
116
  }
112
117
 
113
118
  get aabb() {
@@ -221,7 +221,7 @@ export class VBOInstancingLinesSnapRenderer extends VBORenderer {
221
221
  // renderPass = PICK
222
222
  src.push(`int pickFlag = int(flags) >> 12 & 0xF;`);
223
223
  src.push(`if (pickFlag != renderPass) {`);
224
- src.push(" gl_Position = vec4(0.0, 0.0, 0.0, 0.0);"); // Cull vertex
224
+ src.push(" gl_Position = vec4(2.0, 0.0, 0.0, 0.0);"); // Cull vertex
225
225
  src.push("} else {");
226
226
  src.push(" vec4 worldPosition = positionsDecodeMatrix * vec4(position, 1.0); ");
227
227
  src.push(" worldPosition = worldMatrix * vec4(dot(worldPosition, modelMatrixCol0), dot(worldPosition, modelMatrixCol1), dot(worldPosition, modelMatrixCol2), 1.0);");
@@ -27,7 +27,7 @@ export class VBOInstancingPointsLayer {
27
27
  */
28
28
  constructor(cfg) {
29
29
 
30
- console.info("VBOInstancingPointsLayer");
30
+ // console.info("VBOInstancingPointsLayer");
31
31
 
32
32
  /**
33
33
  * Owner model
@@ -101,6 +101,11 @@ export class VBOInstancingPointsLayer {
101
101
  this.aabbDirty = true;
102
102
 
103
103
  this._finalized = false;
104
+
105
+ /**
106
+ * The type of primitives in this layer.
107
+ */
108
+ this.primitive = cfg.geometry.primitive;
104
109
  }
105
110
 
106
111
  get aabb() {
@@ -36,7 +36,7 @@ export class VBOInstancingTrianglesLayer {
36
36
  */
37
37
  constructor(cfg) {
38
38
 
39
- console.info("Creating VBOInstancingTrianglesLayer");
39
+ // console.info("Creating VBOInstancingTrianglesLayer");
40
40
 
41
41
  /**
42
42
  * Owner model
@@ -139,6 +139,11 @@ export class VBOInstancingTrianglesLayer {
139
139
  * @type {number|*}
140
140
  */
141
141
  this.numIndices = cfg.geometry.numIndices;
142
+
143
+ /**
144
+ * The type of primitives in this layer.
145
+ */
146
+ this.primitive = cfg.geometry.primitive;
142
147
  }
143
148
 
144
149
  get aabb() {
@@ -252,7 +257,7 @@ export class VBOInstancingTrianglesLayer {
252
257
 
253
258
  const portion = {};
254
259
 
255
- if (this.model.scene.pickSurfacePrecisionEnabled) {
260
+ if (this.model.scene.readableGeometryEnabled) {
256
261
  portion.matrix = meshMatrix.slice();
257
262
  portion.inverseMatrix = null; // Lazy-computed in precisionRayPickSurface
258
263
  portion.normalMatrix = null; // Lazy-computed in precisionRayPickSurface
@@ -690,7 +695,7 @@ export class VBOInstancingTrianglesLayer {
690
695
  }
691
696
 
692
697
  getEachVertex(portionId, callback) {
693
- if (!this.model.scene.pickSurfacePrecisionEnabled) {
698
+ if (!this.model.scene.readableGeometryEnabled) {
694
699
  return false;
695
700
  }
696
701
  const state = this._state;
@@ -702,13 +707,12 @@ export class VBOInstancingTrianglesLayer {
702
707
  }
703
708
  const positions = geometry.quantizedPositions;
704
709
  const origin = state.origin;
705
- const offset = portion.offset;
706
- const offsetX = origin[0] + offset[0];
707
- const offsetY = origin[1] + offset[1];
708
- const offsetZ = origin[2] + offset[2];
710
+ const offsetX = origin[0] ;
711
+ const offsetY = origin[1] ;
712
+ const offsetZ = origin[2] ;
709
713
  const worldPos = tempVec4a;
710
714
  const portionMatrix = portion.matrix;
711
- const sceneModelPatrix = this.model.sceneModelMatrix;
715
+ const sceneModelMatrix = this.model.matrix;
712
716
  const positionsDecodeMatrix = state.positionsDecodeMatrix;
713
717
  for (let i = 0, len = positions.length; i < len; i += 3) {
714
718
  worldPos[0] = positions[i];
@@ -716,7 +720,7 @@ export class VBOInstancingTrianglesLayer {
716
720
  worldPos[2] = positions[i + 2];
717
721
  math.decompressPosition(worldPos, positionsDecodeMatrix);
718
722
  math.transformPoint3(portionMatrix, worldPos);
719
- math.transformPoint3(sceneModelPatrix, worldPos);
723
+ math.transformPoint3(sceneModelMatrix, worldPos);
720
724
  worldPos[0] += offsetX;
721
725
  worldPos[1] += offsetY;
722
726
  worldPos[2] += offsetZ;
@@ -724,6 +728,23 @@ export class VBOInstancingTrianglesLayer {
724
728
  }
725
729
  }
726
730
 
731
+ getEachIndex(portionId, callback) {
732
+ if (!this.model.scene.readableGeometryEnabled) {
733
+ return false;
734
+ }
735
+ const state = this._state;
736
+ const geometry = state.geometry;
737
+ const portion = this._portions[portionId];
738
+ if (!portion) {
739
+ this.model.error("portion not found: " + portionId);
740
+ return;
741
+ }
742
+ const indices = geometry.indices;
743
+ for (let i = 0, len = indices.length; i < len; i++) {
744
+ callback(indices[i]);
745
+ }
746
+ }
747
+
727
748
  setMatrix(portionId, matrix) {
728
749
  if (!this._finalized) {
729
750
  throw "Not finalized";
@@ -764,14 +785,21 @@ export class VBOInstancingTrianglesLayer {
764
785
  return;
765
786
  }
766
787
  this._updateBackfaceCull(renderFlags, frameCtx);
788
+ const useAlphaCutoff = this._state.textureSet && (typeof(this._state.textureSet.alphaCutoff) === "number");
767
789
  if (frameCtx.withSAO && this.model.saoEnabled) {
768
790
  if (frameCtx.pbrEnabled && this.model.pbrEnabled && this._state.pbrSupported) {
769
791
  if (this._renderers.pbrRendererWithSAO) {
770
792
  this._renderers.pbrRendererWithSAO.drawLayer(frameCtx, this, RENDER_PASSES.COLOR_OPAQUE);
771
793
  }
772
794
  } else if (frameCtx.colorTextureEnabled && this.model.colorTextureEnabled && this._state.colorTextureSupported) {
773
- if (this._renderers.colorTextureRendererWithSAO) {
774
- this._renderers.colorTextureRendererWithSAO.drawLayer(frameCtx, this, RENDER_PASSES.COLOR_OPAQUE);
795
+ if (useAlphaCutoff) {
796
+ if (this._renderers.colorTextureRendererWithSAOAlphaCutoff) {
797
+ this._renderers.colorTextureRendererWithSAOAlphaCutoff.drawLayer(frameCtx, this, RENDER_PASSES.COLOR_OPAQUE);
798
+ }
799
+ } else {
800
+ if (this._renderers.colorTextureRendererWithSAO) {
801
+ this._renderers.colorTextureRendererWithSAO.drawLayer(frameCtx, this, RENDER_PASSES.COLOR_OPAQUE);
802
+ }
775
803
  }
776
804
  } else if (this._state.normalsBuf) {
777
805
  if (this._renderers.colorRendererWithSAO) {
@@ -787,8 +815,14 @@ export class VBOInstancingTrianglesLayer {
787
815
  this._renderers.pbrRenderer.drawLayer(frameCtx, this, RENDER_PASSES.COLOR_OPAQUE);
788
816
  }
789
817
  } else if (frameCtx.colorTextureEnabled && this.model.colorTextureEnabled && this._state.colorTextureSupported) {
790
- if (this._renderers.colorTextureRenderer) {
791
- this._renderers.colorTextureRenderer.drawLayer(frameCtx, this, RENDER_PASSES.COLOR_OPAQUE);
818
+ if (useAlphaCutoff) {
819
+ if (this._renderers.colorTextureRendererAlphaCutoff) {
820
+ this._renderers.colorTextureRendererAlphaCutoff.drawLayer(frameCtx, this, RENDER_PASSES.COLOR_OPAQUE);
821
+ }
822
+ } else {
823
+ if (this._renderers.colorTextureRenderer) {
824
+ this._renderers.colorTextureRenderer.drawLayer(frameCtx, this, RENDER_PASSES.COLOR_OPAQUE);
825
+ }
792
826
  }
793
827
  } else if (this._state.normalsBuf) {
794
828
  if (this._renderers.colorRenderer) {
@@ -1030,7 +1064,7 @@ export class VBOInstancingTrianglesLayer {
1030
1064
 
1031
1065
  precisionRayPickSurface(portionId, worldRayOrigin, worldRayDir, worldSurfacePos, worldNormal) {
1032
1066
 
1033
- if (!this.model.scene.pickSurfacePrecisionEnabled) {
1067
+ if (!this.model.scene.readableGeometryEnabled) {
1034
1068
  return false;
1035
1069
  }
1036
1070
 
@@ -42,14 +42,6 @@ class Renderers {
42
42
  this._flatColorRendererWithSAO.destroy();
43
43
  this._flatColorRendererWithSAO = null;
44
44
  }
45
- if (this._pbrRenderer && (!this._pbrRenderer.getValid())) {
46
- this._pbrRenderer.destroy();
47
- this._pbrRenderer = null;
48
- }
49
- if (this._pbrRendererWithSAO && (!this._pbrRendererWithSAO.getValid())) {
50
- this._pbrRendererWithSAO.destroy();
51
- this._pbrRendererWithSAO = null;
52
- }
53
45
  if (this._colorTextureRenderer && (!this._colorTextureRenderer.getValid())) {
54
46
  this._colorTextureRenderer.destroy();
55
47
  this._colorTextureRenderer = null;
@@ -58,6 +50,22 @@ class Renderers {
58
50
  this._colorTextureRendererWithSAO.destroy();
59
51
  this._colorTextureRendererWithSAO = null;
60
52
  }
53
+ if (this._colorTextureRendererAlphaCutoff && (!this._colorTextureRendererAlphaCutoff.getValid())) {
54
+ this._colorTextureRendererAlphaCutoff.destroy();
55
+ this._colorTextureRendererAlphaCutoff = null;
56
+ }
57
+ if (this._colorTextureRendererWithSAOAlphaCutoff && (!this._colorTextureRendererWithSAOAlphaCutoff.getValid())) {
58
+ this._colorTextureRendererWithSAOAlphaCutoff.destroy();
59
+ this._colorTextureRendererWithSAOAlphaCutoff = null;
60
+ }
61
+ if (this._pbrRenderer && (!this._pbrRenderer.getValid())) {
62
+ this._pbrRenderer.destroy();
63
+ this._pbrRenderer = null;
64
+ }
65
+ if (this._pbrRendererWithSAO && (!this._pbrRendererWithSAO.getValid())) {
66
+ this._pbrRendererWithSAO.destroy();
67
+ this._pbrRendererWithSAO = null;
68
+ }
61
69
  if (this._depthRenderer && (!this._depthRenderer.getValid())) {
62
70
  this._depthRenderer.destroy();
63
71
  this._depthRenderer = null;
@@ -90,7 +98,7 @@ class Renderers {
90
98
  this._pickNormalsRenderer.destroy();
91
99
  this._pickNormalsRenderer = null;
92
100
  }
93
- if (this._pickNormalsFlatRenderer && (!this._pickNormalsFlatRenderer.getValid())) {
101
+ if (this._pickNormalsFlatRenderer && this._pickNormalsFlatRenderer.getValid() === false) {
94
102
  this._pickNormalsFlatRenderer.destroy();
95
103
  this._pickNormalsFlatRenderer = null;
96
104
  }
@@ -163,20 +171,6 @@ class Renderers {
163
171
  return this._flatColorRendererWithSAO;
164
172
  }
165
173
 
166
- get pbrRenderer() {
167
- if (!this._pbrRenderer) {
168
- this._pbrRenderer = new TrianglesPBRRenderer(this._scene, false);
169
- }
170
- return this._pbrRenderer;
171
- }
172
-
173
- get pbrRendererWithSAO() {
174
- if (!this._pbrRendererWithSAO) {
175
- this._pbrRendererWithSAO = new TrianglesPBRRenderer(this._scene, true);
176
- }
177
- return this._pbrRendererWithSAO;
178
- }
179
-
180
174
  get colorTextureRenderer() {
181
175
  if (!this._colorTextureRenderer) {
182
176
  this._colorTextureRenderer = new TrianglesColorTextureRenderer(this._scene, false);
@@ -191,6 +185,34 @@ class Renderers {
191
185
  return this._colorTextureRendererWithSAO;
192
186
  }
193
187
 
188
+ get colorTextureRendererAlphaCutoff() {
189
+ if (!this._colorTextureRendererAlphaCutoff) {
190
+ this._colorTextureRendererAlphaCutoff = new TrianglesColorTextureRenderer(this._scene, false, { useAlphaCutoff: true });
191
+ }
192
+ return this._colorTextureRendererAlphaCutoff;
193
+ }
194
+
195
+ get colorTextureRendererWithSAOAlphaCutoff() {
196
+ if (!this._colorTextureRendererWithSAOAlphaCutoff) {
197
+ this._colorTextureRendererWithSAOAlphaCutoff = new TrianglesColorTextureRenderer(this._scene, true, { useAlphaCutoff: true });
198
+ }
199
+ return this._colorTextureRendererWithSAOAlphaCutoff;
200
+ }
201
+
202
+ get pbrRenderer() {
203
+ if (!this._pbrRenderer) {
204
+ this._pbrRenderer = new TrianglesPBRRenderer(this._scene, false);
205
+ }
206
+ return this._pbrRenderer;
207
+ }
208
+
209
+ get pbrRendererWithSAO() {
210
+ if (!this._pbrRendererWithSAO) {
211
+ this._pbrRendererWithSAO = new TrianglesPBRRenderer(this._scene, true);
212
+ }
213
+ return this._pbrRendererWithSAO;
214
+ }
215
+
194
216
  get silhouetteRenderer() {
195
217
  if (!this._silhouetteRenderer) {
196
218
  this._silhouetteRenderer = new TrianglesSilhouetteRenderer(this._scene);
@@ -268,13 +290,6 @@ class Renderers {
268
290
  return this._shadowRenderer;
269
291
  }
270
292
 
271
- get snapInitRenderer() {
272
- if (!this._snapInitRenderer) {
273
- this._snapInitRenderer = new TrianglesSnapInitRenderer(this._scene, false);
274
- }
275
- return this._snapInitRenderer;
276
- }
277
-
278
293
  get snapRenderer() {
279
294
  if (!this._snapRenderer) {
280
295
  this._snapRenderer = new TrianglesSnapRenderer(this._scene);
@@ -282,6 +297,13 @@ class Renderers {
282
297
  return this._snapRenderer;
283
298
  }
284
299
 
300
+ get snapInitRenderer() {
301
+ if (!this._snapInitRenderer) {
302
+ this._snapInitRenderer = new TrianglesSnapInitRenderer(this._scene);
303
+ }
304
+ return this._snapInitRenderer;
305
+ }
306
+
285
307
  _destroy() {
286
308
  if (this._colorRenderer) {
287
309
  this._colorRenderer.destroy();
@@ -295,18 +317,24 @@ class Renderers {
295
317
  if (this._flatColorRendererWithSAO) {
296
318
  this._flatColorRendererWithSAO.destroy();
297
319
  }
298
- if (this._pbrRenderer) {
299
- this._pbrRenderer.destroy();
300
- }
301
- if (this._pbrRendererWithSAO) {
302
- this._pbrRendererWithSAO.destroy();
303
- }
304
320
  if (this._colorTextureRenderer) {
305
321
  this._colorTextureRenderer.destroy();
306
322
  }
307
323
  if (this._colorTextureRendererWithSAO) {
308
324
  this._colorTextureRendererWithSAO.destroy();
309
325
  }
326
+ if (this._colorTextureRendererAlphaCutoff) {
327
+ this._colorTextureRendererAlphaCutoff.destroy();
328
+ }
329
+ if (this._colorTextureRendererWithSAOAlphaCutoff) {
330
+ this._colorTextureRendererWithSAOAlphaCutoff.destroy();
331
+ }
332
+ if (this._pbrRenderer) {
333
+ this._pbrRenderer.destroy();
334
+ }
335
+ if (this._pbrRendererWithSAO) {
336
+ this._pbrRendererWithSAO.destroy();
337
+ }
310
338
  if (this._depthRenderer) {
311
339
  this._depthRenderer.destroy();
312
340
  }
@@ -356,21 +384,20 @@ const cachedRenderers = {};
356
384
  */
357
385
  export function getRenderers(scene) {
358
386
  const sceneId = scene.id;
359
- let instancingRenderers = cachedRenderers[sceneId];
360
- if (!instancingRenderers) {
361
- instancingRenderers = new Renderers(scene);
362
- cachedRenderers[sceneId] = instancingRenderers;
363
- instancingRenderers._compile();
364
- instancingRenderers.eagerCreateRenders();
387
+ let renderers = cachedRenderers[sceneId];
388
+ if (!renderers) {
389
+ renderers = new Renderers(scene);
390
+ cachedRenderers[sceneId] = renderers;
391
+ renderers._compile();
392
+ renderers.eagerCreateRenders();
365
393
  scene.on("compile", () => {
366
- instancingRenderers._compile();
367
- instancingRenderers.eagerCreateRenders();
394
+ renderers._compile();
395
+ renderers.eagerCreateRenders();
368
396
  });
369
397
  scene.on("destroyed", () => {
370
398
  delete cachedRenderers[sceneId];
371
- instancingRenderers._destroy();
399
+ renderers._destroy();
372
400
  });
373
401
  }
374
- return instancingRenderers;
402
+ return renderers;
375
403
  }
376
-