@xeokit/xeokit-sdk 2.6.85-renderers-refactor-v2 → 2.6.86

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 (184) hide show
  1. package/dist/xeokit-sdk.cjs.js +44618 -13007
  2. package/dist/xeokit-sdk.es.js +44617 -13008
  3. package/dist/xeokit-sdk.es5.js +3488 -1387
  4. package/dist/xeokit-sdk.min.cjs.js +8 -8
  5. package/dist/xeokit-sdk.min.es.js +8 -8
  6. package/dist/xeokit-sdk.min.es5.js +7 -7
  7. package/package.json +1 -1
  8. package/src/plugins/lib/html/MenuEvent.js +2 -2
  9. package/src/viewer/Viewer.js +103 -55
  10. package/src/viewer/scene/canvas/Canvas.js +43 -3
  11. package/src/viewer/scene/geometry/ReadableGeometry.js +25 -0
  12. package/src/viewer/scene/lights/CubeTexture.js +13 -0
  13. package/src/viewer/scene/lights/DirLight.js +1 -2
  14. package/src/viewer/scene/lights/PointLight.js +1 -2
  15. package/src/viewer/scene/materials/Texture.js +9 -0
  16. package/src/viewer/scene/math/rtcCoords.js +38 -1
  17. package/src/viewer/scene/mesh/Mesh.js +212 -454
  18. package/src/viewer/scene/mesh/draw/DrawRenderer.js +998 -0
  19. package/src/viewer/scene/mesh/draw/DrawShaderSource.js +1504 -305
  20. package/src/viewer/scene/mesh/emphasis/EmphasisEdgesRenderer.js +259 -0
  21. package/src/viewer/scene/mesh/emphasis/EmphasisEdgesShaderSource.js +160 -0
  22. package/src/viewer/scene/mesh/emphasis/EmphasisFillRenderer.js +286 -0
  23. package/src/viewer/scene/mesh/emphasis/EmphasisFillShaderSource.js +263 -0
  24. package/src/viewer/scene/mesh/occlusion/OcclusionRenderer.js +221 -0
  25. package/src/viewer/scene/mesh/occlusion/OcclusionShaderSource.js +158 -9
  26. package/src/viewer/scene/mesh/pick/PickMeshRenderer.js +223 -0
  27. package/src/viewer/scene/mesh/pick/PickMeshShaderSource.js +151 -21
  28. package/src/viewer/scene/mesh/pick/PickTriangleRenderer.js +200 -0
  29. package/src/viewer/scene/mesh/pick/PickTriangleShaderSource.js +124 -12
  30. package/src/viewer/scene/mesh/shadow/ShadowRenderer.js +214 -0
  31. package/src/viewer/scene/mesh/shadow/ShadowShaderSource.js +97 -22
  32. package/src/viewer/scene/model/RENDER_PASSES.js +34 -0
  33. package/src/viewer/scene/model/SceneModel.js +861 -245
  34. package/src/viewer/scene/model/SceneModelEntity.js +4 -4
  35. package/src/viewer/scene/model/SceneModelMesh.js +3 -3
  36. package/src/viewer/scene/model/dtx/BindableDataTexture.js +31 -0
  37. package/src/viewer/scene/model/dtx/lines/DTXLinesBuffer.js +27 -0
  38. package/src/viewer/scene/model/dtx/lines/DTXLinesLayer.js +897 -0
  39. package/src/viewer/scene/model/dtx/lines/DTXLinesState.js +46 -0
  40. package/src/viewer/scene/model/dtx/lines/DTXLinesTextureFactory.js +411 -0
  41. package/src/viewer/scene/model/dtx/lines/dataTextureRamStats.js +49 -0
  42. package/src/viewer/scene/model/dtx/lines/rebucketPositions.js +208 -0
  43. package/src/viewer/scene/model/dtx/lines/renderers/DTXLinesColorRenderer.js +389 -0
  44. package/src/viewer/scene/model/dtx/lines/renderers/DTXLinesRenderers.js +65 -0
  45. package/src/viewer/scene/model/dtx/triangles/DTXTrianglesLayer.js +1399 -0
  46. package/src/viewer/scene/model/dtx/triangles/lib/DTXTrianglesBuffer.js +46 -0
  47. package/src/viewer/scene/model/dtx/triangles/lib/DTXTrianglesState.js +250 -0
  48. package/src/viewer/scene/model/dtx/triangles/lib/DTXTrianglesTextureFactory.js +518 -0
  49. package/src/viewer/scene/model/dtx/triangles/lib/dataTextureRamStats.js +54 -0
  50. package/src/viewer/scene/model/dtx/triangles/renderers/DTXTrianglesColorRenderer.js +639 -0
  51. package/src/viewer/scene/model/dtx/triangles/renderers/DTXTrianglesDepthRenderer.js +464 -0
  52. package/src/viewer/scene/model/dtx/triangles/renderers/DTXTrianglesEdgesColorRenderer.js +423 -0
  53. package/src/viewer/scene/model/dtx/triangles/renderers/DTXTrianglesEdgesRenderer.js +431 -0
  54. package/src/viewer/scene/model/dtx/triangles/renderers/DTXTrianglesNormalsRenderer.js +345 -0
  55. package/src/viewer/scene/model/dtx/triangles/renderers/DTXTrianglesOcclusionRenderer.js +436 -0
  56. package/src/viewer/scene/model/dtx/triangles/renderers/DTXTrianglesPickDepthRenderer.js +466 -0
  57. package/src/viewer/scene/model/dtx/triangles/renderers/DTXTrianglesPickMeshRenderer.js +437 -0
  58. package/src/viewer/scene/model/dtx/triangles/renderers/DTXTrianglesPickNormalsFlatRenderer.js +460 -0
  59. package/src/viewer/scene/model/dtx/triangles/renderers/DTXTrianglesPickNormalsRenderer.js +437 -0
  60. package/src/viewer/scene/model/dtx/triangles/renderers/DTXTrianglesRenderers.js +307 -0
  61. package/src/viewer/scene/model/dtx/triangles/renderers/DTXTrianglesSilhouetteRenderer.js +472 -0
  62. package/src/viewer/scene/model/dtx/triangles/renderers/DTXTrianglesSnapInitRenderer.js +474 -0
  63. package/src/viewer/scene/model/dtx/triangles/renderers/DTXTrianglesSnapRenderer.js +435 -0
  64. package/src/viewer/scene/model/vbo/ScratchMemory.js +63 -0
  65. package/src/viewer/scene/model/vbo/VBORenderer.js +664 -0
  66. package/src/viewer/scene/model/vbo/batching/lines/VBOBatchingLinesLayer.js +704 -0
  67. package/src/viewer/scene/model/vbo/batching/lines/lib/VBOBatchingLinesBuffer.js +19 -0
  68. package/src/viewer/scene/model/vbo/batching/lines/renderers/VBOBatchingLineSnapInitRenderer.js +318 -0
  69. package/src/viewer/scene/model/vbo/batching/lines/renderers/VBOBatchingLinesColorRenderer.js +114 -0
  70. package/src/viewer/scene/model/vbo/batching/lines/renderers/VBOBatchingLinesRenderers.js +99 -0
  71. package/src/viewer/scene/model/vbo/batching/lines/renderers/VBOBatchingLinesSilhouetteRenderer.js +124 -0
  72. package/src/viewer/scene/model/vbo/batching/lines/renderers/VBOBatchingLinesSnapInitRenderer.js +313 -0
  73. package/src/viewer/scene/model/vbo/batching/lines/renderers/VBOBatchingLinesSnapRenderer.js +311 -0
  74. package/src/viewer/scene/model/vbo/batching/lines/renderers/VBOSceneModelLineBatchingRenderer.js +24 -0
  75. package/src/viewer/scene/model/vbo/batching/points/VBOBatchingPointsLayer.js +688 -0
  76. package/src/viewer/scene/model/vbo/batching/points/VBOBatchingPointsRenderer.js +24 -0
  77. package/src/viewer/scene/model/vbo/batching/points/renderers/VBOBatchingPointsColorRenderer.js +168 -0
  78. package/src/viewer/scene/model/vbo/batching/points/renderers/VBOBatchingPointsOcclusionRenderer.js +136 -0
  79. package/src/viewer/scene/model/vbo/batching/points/renderers/VBOBatchingPointsPickDepthRenderer.js +156 -0
  80. package/src/viewer/scene/model/vbo/batching/points/renderers/VBOBatchingPointsPickMeshRenderer.js +148 -0
  81. package/src/viewer/scene/model/vbo/batching/points/renderers/VBOBatchingPointsRenderers.js +144 -0
  82. package/src/viewer/scene/model/vbo/batching/points/renderers/VBOBatchingPointsShadowRenderer.js +107 -0
  83. package/src/viewer/scene/model/vbo/batching/points/renderers/VBOBatchingPointsSilhouetteRenderer.js +146 -0
  84. package/src/viewer/scene/model/vbo/batching/points/renderers/VBOBatchingPointsSnapInitRenderer.js +315 -0
  85. package/src/viewer/scene/model/vbo/batching/points/renderers/VBOBatchingPointsSnapRenderer.js +305 -0
  86. package/src/viewer/scene/model/vbo/batching/triangles/VBOBatchingTrianglesBuffer.js +24 -0
  87. package/src/viewer/scene/model/vbo/batching/triangles/VBOBatchingTrianglesLayer.js +1346 -0
  88. package/src/viewer/scene/model/vbo/batching/triangles/renderers/EdgesColorRenderer.js +131 -0
  89. package/src/viewer/scene/model/vbo/batching/triangles/renderers/EdgesEmphasisRenderer.js +135 -0
  90. package/src/viewer/scene/model/vbo/batching/triangles/renderers/EdgesRenderer.js +12 -0
  91. package/src/viewer/scene/model/vbo/batching/triangles/renderers/Renderers.js +403 -0
  92. package/src/viewer/scene/model/vbo/batching/triangles/renderers/TrianglesBatchingRenderer.js +35 -0
  93. package/src/viewer/scene/model/vbo/batching/triangles/renderers/TrianglesColorRenderer.js +252 -0
  94. package/src/viewer/scene/model/vbo/batching/triangles/renderers/TrianglesColorTextureRenderer.js +294 -0
  95. package/src/viewer/scene/model/vbo/batching/triangles/renderers/TrianglesDepthRenderer.js +115 -0
  96. package/src/viewer/scene/model/vbo/batching/triangles/renderers/TrianglesFlatColorRenderer.js +246 -0
  97. package/src/viewer/scene/model/vbo/batching/triangles/renderers/TrianglesNormalsRenderer.js +139 -0
  98. package/src/viewer/scene/model/vbo/batching/triangles/renderers/TrianglesOcclusionRenderer.js +125 -0
  99. package/src/viewer/scene/model/vbo/batching/triangles/renderers/TrianglesPBRRenderer.js +561 -0
  100. package/src/viewer/scene/model/vbo/batching/triangles/renderers/TrianglesPickDepthRenderer.js +144 -0
  101. package/src/viewer/scene/model/vbo/batching/triangles/renderers/TrianglesPickMeshRenderer.js +130 -0
  102. package/src/viewer/scene/model/vbo/batching/triangles/renderers/TrianglesPickNormalsFlatRenderer.js +121 -0
  103. package/src/viewer/scene/model/vbo/batching/triangles/renderers/TrianglesPickNormalsRenderer.js +131 -0
  104. package/src/viewer/scene/model/vbo/batching/triangles/renderers/TrianglesShadowRenderer.js +107 -0
  105. package/src/viewer/scene/model/vbo/batching/triangles/renderers/TrianglesSilhouetteRenderer.js +144 -0
  106. package/src/viewer/scene/model/vbo/batching/triangles/renderers/TrianglesSnapInitRenderer.js +313 -0
  107. package/src/viewer/scene/model/vbo/batching/triangles/renderers/TrianglesSnapRenderer.js +312 -0
  108. package/src/viewer/scene/model/vbo/float16.js +760 -0
  109. package/src/viewer/scene/model/vbo/instancing/lines/VBOInstancingLinesLayer.js +711 -0
  110. package/src/viewer/scene/model/vbo/instancing/lines/renderers/VBOInstancingLinesColorRenderer.js +148 -0
  111. package/src/viewer/scene/model/vbo/instancing/lines/renderers/VBOInstancingLinesRenderer.js +26 -0
  112. package/src/viewer/scene/model/vbo/instancing/lines/renderers/VBOInstancingLinesRenderers.js +139 -0
  113. package/src/viewer/scene/model/vbo/instancing/lines/renderers/VBOInstancingLinesSilhouetteRenderer.js +127 -0
  114. package/src/viewer/scene/model/vbo/instancing/lines/renderers/VBOInstancingLinesSnapInitRenderer.js +308 -0
  115. package/src/viewer/scene/model/vbo/instancing/lines/renderers/VBOInstancingLinesSnapRenderer.js +299 -0
  116. package/src/viewer/scene/model/vbo/instancing/points/VBOInstancingPointsLayer.js +733 -0
  117. package/src/viewer/scene/model/vbo/instancing/points/renderers/VBOInstancingPointsColorRenderer.js +174 -0
  118. package/src/viewer/scene/model/vbo/instancing/points/renderers/VBOInstancingPointsDepthRenderer.js +156 -0
  119. package/src/viewer/scene/model/vbo/instancing/points/renderers/VBOInstancingPointsOcclusionRenderer.js +149 -0
  120. package/src/viewer/scene/model/vbo/instancing/points/renderers/VBOInstancingPointsPickDepthRenderer.js +170 -0
  121. package/src/viewer/scene/model/vbo/instancing/points/renderers/VBOInstancingPointsPickMeshRenderer.js +152 -0
  122. package/src/viewer/scene/model/vbo/instancing/points/renderers/VBOInstancingPointsRenderer.js +26 -0
  123. package/src/viewer/scene/model/vbo/instancing/points/renderers/VBOInstancingPointsRenderers.js +174 -0
  124. package/src/viewer/scene/model/vbo/instancing/points/renderers/VBOInstancingPointsShadowRenderer.js +119 -0
  125. package/src/viewer/scene/model/vbo/instancing/points/renderers/VBOInstancingPointsSilhouetteRenderer.js +154 -0
  126. package/src/viewer/scene/model/vbo/instancing/points/renderers/VBOInstancingPointsSnapInitRenderer.js +307 -0
  127. package/src/viewer/scene/model/vbo/instancing/points/renderers/VBOInstancingPointsSnapRenderer.js +293 -0
  128. package/src/viewer/scene/model/vbo/instancing/points/renderers/VBOInstancingTrianglesRenderer.js +150 -0
  129. package/src/viewer/scene/model/vbo/instancing/triangles/VBOInstancingTrianglesLayer.js +1289 -0
  130. package/src/viewer/scene/model/vbo/instancing/triangles/renderers/EdgesColorRenderer.js +135 -0
  131. package/src/viewer/scene/model/vbo/instancing/triangles/renderers/EdgesEmphasisRenderer.js +137 -0
  132. package/src/viewer/scene/model/vbo/instancing/triangles/renderers/EdgesRenderer.js +12 -0
  133. package/src/viewer/scene/model/vbo/instancing/triangles/renderers/Renderers.js +403 -0
  134. package/src/viewer/scene/model/vbo/instancing/triangles/renderers/TrianglesColorRenderer.js +267 -0
  135. package/src/viewer/scene/model/vbo/instancing/triangles/renderers/TrianglesColorTextureRenderer.js +299 -0
  136. package/src/viewer/scene/model/vbo/instancing/triangles/renderers/TrianglesDepthRenderer.js +126 -0
  137. package/src/viewer/scene/model/vbo/instancing/triangles/renderers/TrianglesFlatColorRenderer.js +255 -0
  138. package/src/viewer/scene/model/vbo/instancing/triangles/renderers/TrianglesFlatNormalsRenderer.js +130 -0
  139. package/src/viewer/scene/model/vbo/instancing/triangles/renderers/TrianglesInstancingRenderer.js +32 -0
  140. package/src/viewer/scene/model/vbo/instancing/triangles/renderers/TrianglesNormalsRenderer.js +138 -0
  141. package/src/viewer/scene/model/vbo/instancing/triangles/renderers/TrianglesOcclusionRenderer.js +128 -0
  142. package/src/viewer/scene/model/vbo/instancing/triangles/renderers/TrianglesPBRRenderer.js +561 -0
  143. package/src/viewer/scene/model/vbo/instancing/triangles/renderers/TrianglesPickDepthRenderer.js +149 -0
  144. package/src/viewer/scene/model/vbo/instancing/triangles/renderers/TrianglesPickMeshRenderer.js +136 -0
  145. package/src/viewer/scene/model/vbo/instancing/triangles/renderers/TrianglesPickNormalsFlatRenderer.js +130 -0
  146. package/src/viewer/scene/model/vbo/instancing/triangles/renderers/TrianglesPickNormalsRenderer.js +145 -0
  147. package/src/viewer/scene/model/vbo/instancing/triangles/renderers/TrianglesShadowRenderer.js +113 -0
  148. package/src/viewer/scene/model/vbo/instancing/triangles/renderers/TrianglesSilhouetteRenderer.js +148 -0
  149. package/src/viewer/scene/model/vbo/instancing/triangles/renderers/TrianglesSnapInitRenderer.js +319 -0
  150. package/src/viewer/scene/model/vbo/instancing/triangles/renderers/TrianglesSnapRenderer.js +310 -0
  151. package/src/viewer/scene/scene/Scene.js +38 -21
  152. package/src/viewer/scene/webgl/ArrayBuf.js +20 -5
  153. package/src/viewer/scene/webgl/Attribute.js +23 -0
  154. package/src/viewer/scene/webgl/FrameContext.js +86 -14
  155. package/src/viewer/scene/webgl/Program.js +181 -0
  156. package/src/viewer/scene/webgl/RenderBuffer.js +262 -62
  157. package/src/viewer/scene/webgl/RenderBufferManager.js +34 -0
  158. package/src/viewer/scene/webgl/Renderer.js +843 -880
  159. package/src/viewer/scene/webgl/Sampler.js +18 -0
  160. package/src/viewer/scene/webgl/Shader.js +49 -0
  161. package/src/viewer/scene/webgl/occlusion/OcclusionLayer.js +132 -60
  162. package/src/viewer/scene/webgl/occlusion/OcclusionTester.js +328 -167
  163. package/src/viewer/scene/webgl/sao/SAODepthLimitedBlurRenderer.js +324 -0
  164. package/src/viewer/scene/webgl/sao/SAOOcclusionRenderer.js +384 -0
  165. package/src/viewer/utils/os.js +9 -0
  166. package/src/viewer/scene/mesh/draw/LambertShaderSource.js +0 -35
  167. package/src/viewer/scene/mesh/emphasis/EmphasisShaderSource.js +0 -34
  168. package/src/viewer/scene/model/layer/DTXLayer.js +0 -940
  169. package/src/viewer/scene/model/layer/Layer.js +0 -786
  170. package/src/viewer/scene/model/layer/VBOLayer.js +0 -1019
  171. package/src/viewer/scene/model/layer/programs/ColorProgram.js +0 -35
  172. package/src/viewer/scene/model/layer/programs/ColorTextureProgram.js +0 -46
  173. package/src/viewer/scene/model/layer/programs/DepthProgram.js +0 -11
  174. package/src/viewer/scene/model/layer/programs/EdgesProgram.js +0 -12
  175. package/src/viewer/scene/model/layer/programs/FlatColorProgram.js +0 -24
  176. package/src/viewer/scene/model/layer/programs/OcclusionProgram.js +0 -12
  177. package/src/viewer/scene/model/layer/programs/PBRProgram.js +0 -180
  178. package/src/viewer/scene/model/layer/programs/PickDepthProgram.js +0 -30
  179. package/src/viewer/scene/model/layer/programs/PickMeshProgram.js +0 -12
  180. package/src/viewer/scene/model/layer/programs/PickNormalsProgram.js +0 -18
  181. package/src/viewer/scene/model/layer/programs/ShadowProgram.js +0 -23
  182. package/src/viewer/scene/model/layer/programs/SilhouetteProgram.js +0 -15
  183. package/src/viewer/scene/model/layer/programs/SnapProgram.js +0 -28
  184. package/src/viewer/scene/webgl/WebGLRenderer.js +0 -612
@@ -0,0 +1,310 @@
1
+ import {VBORenderer} from "./../../../VBORenderer.js";
2
+ import {createRTCViewMat} from "../../../../../math/rtcCoords.js";
3
+ import {math} from "../../../../../math/math.js";
4
+
5
+ const tempVec3a = math.vec3();
6
+ const tempVec3b = math.vec3();
7
+ const tempVec3c = math.vec3();
8
+ const tempVec3d = math.vec3();
9
+ const tempMat4a = math.mat4();
10
+
11
+ const SNAPPING_LOG_DEPTH_BUF_ENABLED = true; // Improves occlusion accuracy at distance
12
+
13
+ /**
14
+ * @private
15
+ */
16
+ export class TrianglesSnapRenderer extends VBORenderer {
17
+
18
+ constructor(scene) {
19
+ super(scene, false, { instancing: true });
20
+ }
21
+
22
+ drawLayer(frameCtx, instancingLayer, renderPass) {
23
+
24
+ if (!this._program) {
25
+ this._allocate(instancingLayer);
26
+ if (this.errors) {
27
+ return;
28
+ }
29
+ }
30
+
31
+ if (frameCtx.lastProgramId !== this._program.id) {
32
+ frameCtx.lastProgramId = this._program.id;
33
+ this._bindProgram();
34
+ }
35
+
36
+ const model = instancingLayer.model;
37
+ const scene = model.scene;
38
+ const camera = scene.camera;
39
+ const gl = scene.canvas.gl;
40
+ const state = instancingLayer._state;
41
+ const origin = instancingLayer._state.origin;
42
+ const {position, rotationMatrix} = model;
43
+ const aabb = instancingLayer.aabb; // Per-layer AABB for best RTC accuracy
44
+ const viewMatrix = frameCtx.pickViewMatrix || camera.viewMatrix;
45
+
46
+ if (this._vaoCache.has(instancingLayer)) {
47
+ gl.bindVertexArray(this._vaoCache.get(instancingLayer));
48
+ } else {
49
+ this._vaoCache.set(instancingLayer, this._makeVAO(state))
50
+ }
51
+
52
+ const coordinateScaler = tempVec3a;
53
+ coordinateScaler[0] = math.safeInv(aabb[3] - aabb[0]) * math.MAX_INT;
54
+ coordinateScaler[1] = math.safeInv(aabb[4] - aabb[1]) * math.MAX_INT;
55
+ coordinateScaler[2] = math.safeInv(aabb[5] - aabb[2]) * math.MAX_INT;
56
+
57
+ frameCtx.snapPickCoordinateScale[0] = math.safeInv(coordinateScaler[0]);
58
+ frameCtx.snapPickCoordinateScale[1] = math.safeInv(coordinateScaler[1]);
59
+ frameCtx.snapPickCoordinateScale[2] = math.safeInv(coordinateScaler[2]);
60
+
61
+ let rtcViewMatrix;
62
+ let rtcCameraEye;
63
+
64
+ if (origin || position[0] !== 0 || position[1] !== 0 || position[2] !== 0) {
65
+ const rtcOrigin = tempVec3b;
66
+ if (origin) {
67
+ const rotatedOrigin = math.transformPoint3(rotationMatrix, origin, tempVec3c);
68
+ rtcOrigin[0] = rotatedOrigin[0];
69
+ rtcOrigin[1] = rotatedOrigin[1];
70
+ rtcOrigin[2] = rotatedOrigin[2];
71
+ } else {
72
+ rtcOrigin[0] = 0;
73
+ rtcOrigin[1] = 0;
74
+ rtcOrigin[2] = 0;
75
+ }
76
+ rtcOrigin[0] += position[0];
77
+ rtcOrigin[1] += position[1];
78
+ rtcOrigin[2] += position[2];
79
+ rtcViewMatrix = createRTCViewMat(viewMatrix, rtcOrigin, tempMat4a);
80
+ rtcCameraEye = tempVec3d;
81
+ rtcCameraEye[0] = camera.eye[0] - rtcOrigin[0];
82
+ rtcCameraEye[1] = camera.eye[1] - rtcOrigin[1];
83
+ rtcCameraEye[2] = camera.eye[2] - rtcOrigin[2];
84
+ frameCtx.snapPickOrigin[0] = rtcOrigin[0];
85
+ frameCtx.snapPickOrigin[1] = rtcOrigin[1];
86
+ frameCtx.snapPickOrigin[2] = rtcOrigin[2];
87
+ } else {
88
+ rtcViewMatrix = viewMatrix;
89
+ rtcCameraEye = camera.eye;
90
+ frameCtx.snapPickOrigin[0] = 0;
91
+ frameCtx.snapPickOrigin[1] = 0;
92
+ frameCtx.snapPickOrigin[2] = 0;
93
+ }
94
+
95
+ gl.uniform3fv(this._uCameraEyeRtc, rtcCameraEye);
96
+ gl.uniform2fv(this.uVectorA, frameCtx.snapVectorA);
97
+ gl.uniform2fv(this.uInverseVectorAB, frameCtx.snapInvVectorAB);
98
+ gl.uniform1i(this._uLayerNumber, frameCtx.snapPickLayerNumber);
99
+ gl.uniform3fv(this._uCoordinateScaler, coordinateScaler);
100
+ gl.uniform1i(this._uRenderPass, renderPass);
101
+ gl.uniform1i(this._uPickInvisible, frameCtx.pickInvisible);
102
+
103
+ let offset = 0;
104
+ const mat4Size = 4 * 4;
105
+
106
+ this._matricesUniformBlockBufferData.set(rotationMatrix, 0);
107
+ this._matricesUniformBlockBufferData.set(rtcViewMatrix, offset += mat4Size);
108
+ this._matricesUniformBlockBufferData.set(camera.projMatrix, offset += mat4Size);
109
+ this._matricesUniformBlockBufferData.set(state.positionsDecodeMatrix, offset += mat4Size);
110
+
111
+ gl.bindBuffer(gl.UNIFORM_BUFFER, this._matricesUniformBlockBuffer);
112
+ gl.bufferData(gl.UNIFORM_BUFFER, this._matricesUniformBlockBufferData, gl.DYNAMIC_DRAW);
113
+
114
+ gl.bindBufferBase(
115
+ gl.UNIFORM_BUFFER,
116
+ this._matricesUniformBlockBufferBindingPoint,
117
+ this._matricesUniformBlockBuffer);
118
+
119
+ if (SNAPPING_LOG_DEPTH_BUF_ENABLED) {
120
+ const logDepthBufFC = 2.0 / (Math.log(frameCtx.pickZFar + 1.0) / Math.LN2); // TODO: Far from pick project matrix
121
+ gl.uniform1f(this._uLogDepthBufFC, logDepthBufFC);
122
+ }
123
+
124
+ this.setSectionPlanesStateUniforms(instancingLayer);
125
+
126
+ if (frameCtx.snapMode === "edge" ) {
127
+ if (state.edgeIndicesBuf) {
128
+ state.edgeIndicesBuf.bind();
129
+ gl.drawElementsInstanced(gl.LINES, state.edgeIndicesBuf.numItems, state.edgeIndicesBuf.itemType, 0, state.numInstances);
130
+ state.edgeIndicesBuf.unbind(); // needed?
131
+ }
132
+ } else {
133
+ gl.drawArraysInstanced(gl.POINTS, 0, state.positionsBuf.numItems, state.numInstances);
134
+ }
135
+
136
+ gl.bindVertexArray(null);
137
+ }
138
+
139
+ _allocate() {
140
+ super._allocate();
141
+
142
+ const program = this._program;
143
+
144
+ if (SNAPPING_LOG_DEPTH_BUF_ENABLED) {
145
+ this._uLogDepthBufFC = program.getLocation("logDepthBufFC");
146
+ }
147
+ this._uCameraEyeRtc = program.getLocation("uCameraEyeRtc");
148
+ this.uVectorA = program.getLocation("snapVectorA");
149
+ this.uInverseVectorAB = program.getLocation("snapInvVectorAB");
150
+ this._uLayerNumber = program.getLocation("layerNumber");
151
+ this._uCoordinateScaler = program.getLocation("coordinateScaler");
152
+ }
153
+
154
+ _bindProgram() {
155
+ this._program.bind();
156
+
157
+ }
158
+
159
+ _buildVertexShader() {
160
+ const scene = this._scene;
161
+ const sectionPlanesState = scene._sectionPlanesState;
162
+ const clipping = sectionPlanesState.getNumAllocatedSectionPlanes() > 0;
163
+ const src = [];
164
+ src.push ('#version 300 es');
165
+ src.push("// SnapInstancingDepthRenderer vertex shader");
166
+ src.push("#ifdef GL_FRAGMENT_PRECISION_HIGH");
167
+ src.push("precision highp float;");
168
+ src.push("precision highp int;");
169
+ src.push("precision highp usampler2D;");
170
+ src.push("precision highp isampler2D;");
171
+ src.push("precision highp sampler2D;");
172
+ src.push("#else");
173
+ src.push("precision mediump float;");
174
+ src.push("precision mediump int;");
175
+ src.push("precision mediump usampler2D;");
176
+ src.push("precision mediump isampler2D;");
177
+ src.push("precision mediump sampler2D;");
178
+ src.push("#endif");
179
+ src.push("uniform int renderPass;");
180
+ src.push("in vec3 position;");
181
+ if (scene.entityOffsetsEnabled) {
182
+ src.push("in vec3 offset;");
183
+ }
184
+ src.push("in float flags;");
185
+ src.push("in vec4 modelMatrixCol0;"); // Modeling matrix
186
+ src.push("in vec4 modelMatrixCol1;");
187
+ src.push("in vec4 modelMatrixCol2;");
188
+ src.push("uniform bool pickInvisible;");
189
+
190
+ this._addMatricesUniformBlockLines(src);
191
+
192
+ src.push("uniform vec3 uCameraEyeRtc;");
193
+ src.push("uniform vec2 snapVectorA;");
194
+ src.push("uniform vec2 snapInvVectorAB;");
195
+ if (SNAPPING_LOG_DEPTH_BUF_ENABLED) {
196
+ src.push("uniform float logDepthBufFC;");
197
+ src.push("out float vFragDepth;");
198
+ src.push("bool isPerspectiveMatrix(mat4 m) {");
199
+ src.push(" return (m[2][3] == - 1.0);");
200
+ src.push("}");
201
+ src.push("out float isPerspective;");
202
+ }
203
+ src.push("vec2 remapClipPos(vec2 clipPos) {");
204
+ src.push(" float x = (clipPos.x - snapVectorA.x) * snapInvVectorAB.x;");
205
+ src.push(" float y = (clipPos.y - snapVectorA.y) * snapInvVectorAB.y;");
206
+ src.push(" return vec2(x, y);")
207
+ src.push("}");
208
+ if (clipping) {
209
+ src.push("out vec4 vWorldPosition;");
210
+ src.push("out float vFlags;");
211
+ }
212
+ src.push("out highp vec3 relativeToOriginPosition;");
213
+ src.push("void main(void) {");
214
+ // pickFlag = NOT_RENDERED | PICK
215
+ // renderPass = PICK
216
+ src.push(`int pickFlag = int(flags) >> 12 & 0xF;`);
217
+ src.push(`if (pickFlag != renderPass) {`);
218
+ src.push(" gl_Position = vec4(2.0, 0.0, 0.0, 0.0);"); // Cull vertex
219
+ src.push("} else {");
220
+ src.push(" vec4 worldPosition = positionsDecodeMatrix * vec4(position, 1.0); ");
221
+ src.push(" worldPosition = worldMatrix * vec4(dot(worldPosition, modelMatrixCol0), dot(worldPosition, modelMatrixCol1), dot(worldPosition, modelMatrixCol2), 1.0);");
222
+ if (scene.entityOffsetsEnabled) {
223
+ src.push(" worldPosition.xyz = worldPosition.xyz + offset;");
224
+ }
225
+ src.push("relativeToOriginPosition = worldPosition.xyz;")
226
+ src.push(" vec4 viewPosition = viewMatrix * worldPosition; ");
227
+ if (clipping) {
228
+ src.push(" vWorldPosition = worldPosition;");
229
+ src.push(" vFlags = flags;");
230
+ }
231
+ src.push("vec4 clipPos = projMatrix * viewPosition;");
232
+ src.push("float tmp = clipPos.w;")
233
+ src.push("clipPos.xyzw /= tmp;")
234
+ src.push("clipPos.xy = remapClipPos(clipPos.xy);");
235
+ src.push("clipPos.xyzw *= tmp;")
236
+ if (SNAPPING_LOG_DEPTH_BUF_ENABLED) {
237
+ src.push("vFragDepth = 1.0 + clipPos.w;");
238
+ src.push("isPerspective = float (isPerspectiveMatrix(projMatrix));");
239
+ }
240
+ src.push("gl_Position = clipPos;");
241
+ src.push("gl_PointSize = 1.0;"); // Windows needs this?
242
+ src.push("}");
243
+ src.push("}");
244
+ return src;
245
+ }
246
+
247
+ _buildFragmentShader() {
248
+ const scene = this._scene;
249
+ const sectionPlanesState = scene._sectionPlanesState;
250
+ const clipping = sectionPlanesState.getNumAllocatedSectionPlanes() > 0;
251
+ const src = [];
252
+ src.push ('#version 300 es');
253
+ src.push("// SnapInstancingDepthRenderer fragment shader");
254
+ src.push("#ifdef GL_FRAGMENT_PRECISION_HIGH");
255
+ src.push("precision highp float;");
256
+ src.push("precision highp int;");
257
+ src.push("#else");
258
+ src.push("precision mediump float;");
259
+ src.push("precision mediump int;");
260
+ src.push("#endif");
261
+ if (SNAPPING_LOG_DEPTH_BUF_ENABLED) {
262
+ src.push("in float isPerspective;");
263
+ src.push("uniform float logDepthBufFC;");
264
+ src.push("in float vFragDepth;");
265
+ }
266
+ src.push("uniform int layerNumber;");
267
+ src.push("uniform vec3 coordinateScaler;");
268
+ if (clipping) {
269
+ src.push("in vec4 vWorldPosition;");
270
+ src.push("in float vFlags;");
271
+ for (let i = 0; i < sectionPlanesState.getNumAllocatedSectionPlanes(); i++) {
272
+ src.push("uniform bool sectionPlaneActive" + i + ";");
273
+ src.push("uniform vec3 sectionPlanePos" + i + ";");
274
+ src.push("uniform vec3 sectionPlaneDir" + i + ";");
275
+ }
276
+ }
277
+ src.push("in highp vec3 relativeToOriginPosition;");
278
+ src.push("out highp ivec4 outCoords;");
279
+ src.push("void main(void) {");
280
+ if (clipping) {
281
+ src.push(" bool clippable = (int(vFlags) >> 16 & 0xF) == 1;");
282
+ src.push(" if (clippable) {");
283
+ src.push(" float dist = 0.0;");
284
+ for (let i = 0; i < sectionPlanesState.getNumAllocatedSectionPlanes(); i++) {
285
+ src.push("if (sectionPlaneActive" + i + ") {");
286
+ src.push(" dist += clamp(dot(-sectionPlaneDir" + i + ".xyz, vWorldPosition.xyz - sectionPlanePos" + i + ".xyz), 0.0, 1000.0);");
287
+ src.push("}");
288
+ }
289
+ src.push("if (dist > 0.0) { discard; }");
290
+ src.push("}");
291
+ }
292
+ if (SNAPPING_LOG_DEPTH_BUF_ENABLED) {
293
+ src.push(" gl_FragDepth = isPerspective == 0.0 ? gl_FragCoord.z : log2( vFragDepth ) * logDepthBufFC * 0.5;");
294
+ }
295
+ src.push("outCoords = ivec4(relativeToOriginPosition.xyz*coordinateScaler.xyz, layerNumber);")
296
+ src.push("}");
297
+ return src;
298
+ }
299
+
300
+ webglContextRestored() {
301
+ this._program = null;
302
+ }
303
+
304
+ destroy() {
305
+ if (this._program) {
306
+ this._program.destroy();
307
+ }
308
+ this._program = null;
309
+ }
310
+ }
@@ -619,10 +619,6 @@ class Scene extends Component {
619
619
  premultipliedAlpha: cfg.premultipliedAlpha
620
620
  });
621
621
 
622
- const onContextLost = (event) => this.viewer.destroy();
623
- canvas.addEventListener("webglcontextlost", onContextLost, false);
624
- this._removeWebglcontextlostListener = () => canvas.removeEventListener("webglcontextlost", onContextLost, false);
625
-
626
622
  this.canvas.on("boundary", () => {
627
623
  this.glRedraw();
628
624
  });
@@ -1253,6 +1249,35 @@ class Scene extends Component {
1253
1249
  this._offsetObjectIds = null; // Lazy regenerate
1254
1250
  }
1255
1251
 
1252
+ _webglContextLost() {
1253
+ // this.loading++;
1254
+ this.canvas.spinner.processes++;
1255
+ for (const id in this.components) {
1256
+ if (this.components.hasOwnProperty(id)) {
1257
+ const component = this.components[id];
1258
+ if (component._webglContextLost) {
1259
+ component._webglContextLost();
1260
+ }
1261
+ }
1262
+ }
1263
+ this._renderer.webglContextLost();
1264
+ }
1265
+
1266
+ _webglContextRestored() {
1267
+ const gl = this.canvas.gl;
1268
+ for (const id in this.components) {
1269
+ if (this.components.hasOwnProperty(id)) {
1270
+ const component = this.components[id];
1271
+ if (component._webglContextRestored) {
1272
+ component._webglContextRestored(gl);
1273
+ }
1274
+ }
1275
+ }
1276
+ this._renderer.webglContextRestored(gl);
1277
+ //this.loading--;
1278
+ this.canvas.spinner.processes--;
1279
+ }
1280
+
1256
1281
  /**
1257
1282
  * Returns the capabilities of this Scene.
1258
1283
  *
@@ -1482,7 +1507,12 @@ class Scene extends Component {
1482
1507
 
1483
1508
  renderEvent.sceneId = this.id;
1484
1509
 
1485
- for (let pass = 0; pass < this._passes; pass++) {
1510
+ const passes = this._passes;
1511
+ const clearEachPass = this._clearEachPass;
1512
+ let pass;
1513
+ let clear;
1514
+
1515
+ for (pass = 0; pass < passes; pass++) {
1486
1516
 
1487
1517
  renderEvent.pass = pass;
1488
1518
 
@@ -1495,10 +1525,9 @@ class Scene extends Component {
1495
1525
  */
1496
1526
  this.fire("rendering", renderEvent, true);
1497
1527
 
1498
- if (forceRender) {
1499
- this._renderer.imageDirty();
1500
- }
1501
- this._renderer.render(pass, this._clearEachPass || (pass === 0));
1528
+ clear = clearEachPass || (pass === 0);
1529
+
1530
+ this._renderer.render({pass: pass, clear: clear, force: forceRender});
1502
1531
 
1503
1532
  /**
1504
1533
  * Fired when we have just rendered a frame for a Scene.
@@ -2319,11 +2348,6 @@ class Scene extends Component {
2319
2348
  */
2320
2349
  pick(params, pickResult) {
2321
2350
 
2322
- if (! this.canvas) {
2323
- this.error("Picking not allowed on a destroyed Scene");
2324
- return null;
2325
- }
2326
-
2327
2351
  if (this.canvas.boundary[2] === 0 || this.canvas.boundary[3] === 0) {
2328
2352
  this.error("Picking not allowed while canvas has zero width or height");
2329
2353
  return null;
@@ -2377,10 +2401,6 @@ class Scene extends Component {
2377
2401
  * @deprecated
2378
2402
  */
2379
2403
  snapPick(params) {
2380
- if (! this.canvas) {
2381
- this.error("Picking not allowed on a destroyed Scene");
2382
- return null;
2383
- }
2384
2404
  if (undefined === this._warnSnapPickDeprecated) {
2385
2405
  this._warnSnapPickDeprecated = true;
2386
2406
  this.warn("Scene.snapPick() is deprecated since v2.4.2 - use Scene.pick() instead")
@@ -2809,9 +2829,6 @@ class Scene extends Component {
2809
2829
 
2810
2830
  super.destroy();
2811
2831
 
2812
- this._removeWebglcontextlostListener();
2813
- // this.canvas.gl.getExtension("WEBGL_lose_context").loseContext(); // disabled because of XCD-306 and XEOK-295
2814
-
2815
2832
  for (const id in this.components) {
2816
2833
  if (this.components.hasOwnProperty(id)) {
2817
2834
  this.components[id].destroy();
@@ -10,6 +10,7 @@ class ArrayBuf {
10
10
  this._gl = gl;
11
11
  this.type = type;
12
12
  this.allocated = false;
13
+ this.ConstructorType = data.constructor;
13
14
 
14
15
  switch (data.constructor) {
15
16
 
@@ -94,6 +95,25 @@ class ArrayBuf {
94
95
  }
95
96
  }
96
97
 
98
+ getData(baseIndex = 0, length = (this.numItems) - baseIndex) {
99
+ if (!this.allocated) {
100
+ return [];
101
+ }
102
+
103
+ const array = new (this.ConstructorType)(length * this.itemSize);
104
+
105
+ this._gl.bindBuffer(this.type, this._handle);
106
+ this._gl.getBufferSubData(
107
+ this.type,
108
+ baseIndex * this.itemByteSize * this.itemSize,
109
+ array,
110
+ 0,
111
+ length * this.itemSize
112
+ );
113
+
114
+ return array;
115
+ }
116
+
97
117
  bind() {
98
118
  if (!this.allocated) {
99
119
  return;
@@ -108,11 +128,6 @@ class ArrayBuf {
108
128
  this._gl.bindBuffer(this.type, null);
109
129
  }
110
130
 
111
- bindAtLocation(location) {
112
- this.bind();
113
- this._gl.vertexAttribPointer(location, this.itemSize, this.itemType, this.normalized, 0, 0);
114
- }
115
-
116
131
  destroy() {
117
132
  if (!this.allocated) {
118
133
  return;
@@ -0,0 +1,23 @@
1
+ /**
2
+ * @desc Represents a WebGL vertex attribute buffer (VBO).
3
+ * @private
4
+ * @param gl {WebGLRenderingContext} The WebGL rendering context.
5
+ */
6
+ class Attribute {
7
+
8
+ constructor(gl, location) {
9
+ this._gl = gl;
10
+ this.location = location;
11
+ }
12
+
13
+ bindArrayBuffer(arrayBuf) {
14
+ if (!arrayBuf) {
15
+ return;
16
+ }
17
+ arrayBuf.bind();
18
+ this._gl.enableVertexAttribArray(this.location);
19
+ this._gl.vertexAttribPointer(this.location, arrayBuf.itemSize, arrayBuf.itemType, arrayBuf.normalized, arrayBuf.stride, arrayBuf.offset);
20
+ }
21
+ }
22
+
23
+ export {Attribute};
@@ -11,7 +11,15 @@ import {createRTCViewMat} from "../math/rtcCoords.js";
11
11
  class FrameContext {
12
12
 
13
13
  constructor(scene) {
14
+
15
+ this._scene = scene;
16
+
14
17
  this._matPool = [];
18
+ this._matPoolNextFreeIndex = 0;
19
+
20
+ this._rtcViewMats = {};
21
+ this._rtcPickViewMats = {};
22
+
15
23
  this.reset();
16
24
  }
17
25
 
@@ -23,6 +31,13 @@ class FrameContext {
23
31
 
24
32
  this._matPoolNextFreeIndex = 0;
25
33
  this._rtcViewMats = {};
34
+ this._rtcPickViewMats = {};
35
+
36
+ /**
37
+ * The WebGL rendering context.
38
+ * @type {WebGLRenderingContext}
39
+ */
40
+ this.gl = this._scene.canvas.gl;
26
41
 
27
42
  /**
28
43
  * ID of the last {@link WebGLProgram} that was bound during the current frame.
@@ -142,39 +157,59 @@ class FrameContext {
142
157
  */
143
158
  this.pass = 0;
144
159
 
145
- this.viewParams = { };
160
+ /**
161
+ * The 4x4 viewing transform matrix the renderer is currently using when rendering castsShadows.
162
+ *
163
+ * This sets the viewpoint to look from the point of view of each {@link DirLight}
164
+ * or {@link PointLight} that casts a shadow.
165
+ *
166
+ * @property shadowViewMatrix
167
+ * @type {Number[]}
168
+ */
169
+ this.shadowViewMatrix = null;
170
+
171
+ /**
172
+ * The 4x4 viewing projection matrix the renderer is currently using when rendering shadows.
173
+ *
174
+ * @property shadowProjMatrix
175
+ * @type {Number[]}
176
+ */
177
+ this.shadowProjMatrix = null;
146
178
 
147
179
  /**
148
- * The 4x4 view matrix.
180
+ * The 4x4 viewing transform matrix the renderer is currently using when rendering a ray-pick.
149
181
  *
150
- * @property viewMatrix
182
+ * This sets the viewpoint to look along the ray given to {@link Scene/pick:method"}}Scene#pick(){{/crossLink}}
183
+ * when picking with a ray.
184
+ *
185
+ * @property pickViewMatrix
151
186
  * @type {Number[]}
152
187
  */
153
- this.viewParams.viewMatrix = null;
188
+ this.pickViewMatrix = null;
154
189
 
155
190
  /**
156
- * The 4x4 projection matrix.
191
+ * The 4x4 orthographic projection transform matrix the renderer is currently using when rendering a ray-pick.
157
192
  *
158
- * @property projMatrix
193
+ * @property pickProjMatrix
159
194
  * @type {Number[]}
160
195
  */
161
- this.viewParams.projMatrix = null;
196
+ this.pickProjMatrix = null;
162
197
 
163
198
  /**
164
199
  * Distance to the near clipping plane when rendering depth fragments for GPU-accelerated 3D picking.
165
200
  *
166
- * @property near
201
+ * @property pickZNear
167
202
  * @type {Number|*}
168
203
  */
169
- this.viewParams.near = 0.01;
204
+ this.pickZNear = 0.01;
170
205
 
171
206
  /**
172
207
  * Distance to the far clipping plane when rendering depth fragments for GPU-accelerated 3D picking.
173
208
  *
174
- * @property far
209
+ * @property pickZFar
175
210
  * @type {Number|*}
176
211
  */
177
- this.viewParams.far = 5000;
212
+ this.pickZFar = 5000;
178
213
 
179
214
  /**
180
215
  * Whether or not the renderer is currently picking invisible objects.
@@ -184,6 +219,22 @@ class FrameContext {
184
219
  */
185
220
  this.pickInvisible = false;
186
221
 
222
+ /**
223
+ * Used to draw only requested elements / indices.
224
+ *
225
+ * @property pickElementsCount
226
+ * @type {Number}
227
+ */
228
+ this.pickElementsCount = null;
229
+
230
+ /**
231
+ * Used to draw only requested elements / indices.
232
+ *
233
+ * @property pickElementsOffset
234
+ * @type {Number}
235
+ */
236
+ this.pickElementsOffset = null;
237
+
187
238
  /** The current line width.
188
239
  *
189
240
  * @property lineWidth
@@ -195,9 +246,16 @@ class FrameContext {
195
246
  * Collects info from SceneModel.drawSnapInit and SceneModel.drawSnap,
196
247
  * which is then used in Renderer to determine snap-picking results.
197
248
  *
198
- * @type {[]}
249
+ * @type {{}}
250
+ */
251
+ this.snapPickLayerParams = {};
252
+
253
+ /**
254
+ * Collects info from SceneModel.drawSnapInit and SceneModel.drawSnap,
255
+ * which is then used in Renderer to determine snap-picking results.
256
+ * @type {number}
199
257
  */
200
- this.snapPickLayerParams = [];
258
+ this.snapPickLayerNumber = 0;
201
259
 
202
260
  /**
203
261
  * Collects info from SceneModel.drawSnapInit and SceneModel.drawSnap,
@@ -221,12 +279,26 @@ class FrameContext {
221
279
  let rtcViewMat = this._rtcViewMats[originHash];
222
280
  if (!rtcViewMat) {
223
281
  rtcViewMat = this._getNewMat();
224
- createRTCViewMat(this.viewParams.viewMatrix, origin, rtcViewMat);
282
+ createRTCViewMat(this._scene.camera.viewMatrix, origin, rtcViewMat);
225
283
  this._rtcViewMats[originHash] = rtcViewMat;
226
284
  }
227
285
  return rtcViewMat;
228
286
  }
229
287
 
288
+ /**
289
+ * Get picking View RTC matrix for the given RTC center.
290
+ */
291
+ getRTCPickViewMatrix(originHash, origin) {
292
+ let rtcPickViewMat = this._rtcPickViewMats[originHash];
293
+ if (!rtcPickViewMat) {
294
+ rtcPickViewMat = this._getNewMat();
295
+ const pickViewMat = this.pickViewMatrix || this._scene.camera.viewMatrix;
296
+ createRTCViewMat(pickViewMat, origin, rtcPickViewMat);
297
+ this._rtcPickViewMats[originHash] = rtcPickViewMat;
298
+ }
299
+ return rtcPickViewMat;
300
+ }
301
+
230
302
  _getNewMat() {
231
303
  let mat = this._matPool[this._matPoolNextFreeIndex];
232
304
  if (!mat) {