@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
@@ -1,9 +1,10 @@
1
1
  import {math} from '../../math/math.js';
2
- import {createProgramVariablesState} from "../WebGLRenderer.js";
2
+ import {Program} from "./../Program.js";
3
3
  import {OcclusionLayer} from "./OcclusionLayer.js";
4
- import {createRTCViewMat} from "../../math/rtcCoords.js";
4
+ import {createRTCViewMat, getPlaneRTCPos} from "../../math/rtcCoords.js";
5
5
 
6
- const MARKER_COLOR = math.vec3([ 255, 0, 0 ]);
6
+ const TEST_MODE = false;
7
+ const MARKER_COLOR = math.vec3([1.0, 0.0, 0.0]);
7
8
  const POINT_SIZE = 20;
8
9
 
9
10
  const tempVec3a = math.vec3();
@@ -12,46 +13,39 @@ const tempVec3a = math.vec3();
12
13
  * Manages occlusion testing. Private member of a Renderer.
13
14
  * @private
14
15
  */
15
- export class OcclusionTester {
16
+ class OcclusionTester {
16
17
 
17
- constructor(scene) {
18
+ constructor(scene, renderBufferManager) {
18
19
 
19
20
  this._scene = scene;
20
21
 
22
+ this._renderBufferManager = renderBufferManager;
23
+
21
24
  this._occlusionLayers = {};
22
25
  this._occlusionLayersList = [];
23
26
  this._occlusionLayersListDirty = false;
24
27
 
25
- this._drawable = null;
28
+ this._shaderSource = null;
29
+ this._program = null;
30
+
31
+ this._shaderSourceHash = null;
32
+
33
+ this._shaderSourceDirty = true; // Need to build shader source code ?
34
+ this._programDirty = false; // Need to build shader program ?
26
35
 
27
36
  this._markersToOcclusionLayersMap = {};
28
37
 
29
- const camera = scene.camera;
30
- const markOcclusionTestListDirty = () => { this._occlusionTestListDirty = true; };
31
- this._onCameraViewMatrix = camera.on("viewMatrix", markOcclusionTestListDirty);
32
- this._onCameraProjMatrix = camera.on("projMatrix", markOcclusionTestListDirty);
33
- this._onCanvasBoundary = scene.canvas.on("boundary", markOcclusionTestListDirty);
34
- }
38
+ this._onCameraViewMatrix = scene.camera.on("viewMatrix", () => {
39
+ this._occlusionTestListDirty = true;
40
+ });
35
41
 
36
- _addMarker(marker, originHash) {
37
- if (! this._occlusionLayers[originHash]) {
38
- this._occlusionLayers[originHash] = new OcclusionLayer(marker.origin);
39
- this._occlusionLayersListDirty = true;
40
- }
41
- const occlusionLayer = this._occlusionLayers[originHash];
42
- occlusionLayer.addMarker(marker);
43
- this._markersToOcclusionLayersMap[marker.id] = occlusionLayer;
44
- }
42
+ this._onCameraProjMatrix = scene.camera.on("projMatrix", () => {
43
+ this._occlusionTestListDirty = true;
44
+ });
45
45
 
46
- _removeMarker(occlusionLayer, marker) {
47
- if (occlusionLayer.numMarkers === 1) {
48
- occlusionLayer.destroy();
49
- delete this._occlusionLayers[occlusionLayer.originHash];
50
- this._occlusionLayersListDirty = true;
51
- } else {
52
- occlusionLayer.removeMarker(marker);
53
- }
54
- delete this._markersToOcclusionLayersMap[marker.id];
46
+ this._onCanvasBoundary = scene.canvas.on("boundary", () => {
47
+ this._occlusionTestListDirty = true;
48
+ });
55
49
  }
56
50
 
57
51
  /**
@@ -60,7 +54,14 @@ export class OcclusionTester {
60
54
  */
61
55
  addMarker(marker) {
62
56
  const originHash = marker.origin.join();
63
- this._addMarker(marker, originHash);
57
+ let occlusionLayer = this._occlusionLayers[originHash];
58
+ if (!occlusionLayer) {
59
+ occlusionLayer = new OcclusionLayer(this._scene, marker.origin);
60
+ this._occlusionLayers[occlusionLayer.originHash] = occlusionLayer;
61
+ this._occlusionLayersListDirty = true;
62
+ }
63
+ occlusionLayer.addMarker(marker);
64
+ this._markersToOcclusionLayersMap[marker.id] = occlusionLayer;
64
65
  this._occlusionTestListDirty = true;
65
66
  }
66
67
 
@@ -70,14 +71,28 @@ export class OcclusionTester {
70
71
  */
71
72
  markerWorldPosUpdated(marker) {
72
73
  const occlusionLayer = this._markersToOcclusionLayersMap[marker.id];
73
- if (occlusionLayer) {
74
- const originHash = marker.origin.join();
75
- if (originHash !== occlusionLayer.originHash) {
76
- this._removeMarker(occlusionLayer, marker);
77
- this._addMarker(marker, originHash);
74
+ if (!occlusionLayer) {
75
+ return;
76
+ }
77
+ const originHash = marker.origin.join();
78
+ if (originHash !== occlusionLayer.originHash) {
79
+ if (occlusionLayer.numMarkers === 1) {
80
+ occlusionLayer.destroy();
81
+ delete this._occlusionLayers[occlusionLayer.originHash];
82
+ this._occlusionLayersListDirty = true;
78
83
  } else {
79
- occlusionLayer.markerWorldPosUpdated(marker);
84
+ occlusionLayer.removeMarker(marker);
85
+ }
86
+ let newOcclusionLayer = this._occlusionLayers[originHash];
87
+ if (!newOcclusionLayer) {
88
+ newOcclusionLayer = new OcclusionLayer(this._scene, marker.origin);
89
+ this._occlusionLayers[originHash] = newOcclusionLayer;
90
+ this._occlusionLayersListDirty = true;
80
91
  }
92
+ newOcclusionLayer.addMarker(marker);
93
+ this._markersToOcclusionLayersMap[marker.id] = newOcclusionLayer;
94
+ } else {
95
+ occlusionLayer.markerWorldPosUpdated(marker);
81
96
  }
82
97
  }
83
98
 
@@ -87,10 +102,18 @@ export class OcclusionTester {
87
102
  */
88
103
  removeMarker(marker) {
89
104
  const originHash = marker.origin.join();
90
- const occlusionLayer = this._occlusionLayers[originHash];
91
- if (occlusionLayer) {
92
- this._removeMarker(occlusionLayer, marker);
105
+ let occlusionLayer = this._occlusionLayers[originHash];
106
+ if (!occlusionLayer) {
107
+ return;
108
+ }
109
+ if (occlusionLayer.numMarkers === 1) {
110
+ occlusionLayer.destroy();
111
+ delete this._occlusionLayers[occlusionLayer.originHash];
112
+ this._occlusionLayersListDirty = true;
113
+ } else {
114
+ occlusionLayer.removeMarker(marker);
93
115
  }
116
+ delete this._markersToOcclusionLayersMap[marker.id];
94
117
  }
95
118
 
96
119
  /**
@@ -103,125 +126,32 @@ export class OcclusionTester {
103
126
  }
104
127
 
105
128
  /**
106
- * Draws {@link Marker}s to the render buffer.
129
+ * Binds the render buffer. After calling this, the caller then renders object silhouettes to the render buffer,
130
+ * then calls drawMarkers() and doOcclusionTest().
107
131
  */
108
- drawMarkers() {
132
+ bindRenderBuf() {
109
133
 
110
- const scene = this._scene;
111
- const canvas = scene.canvas;
112
- const gl = canvas.gl;
113
- const sectionPlanesState = scene._sectionPlanesState;
114
- const shaderSourceHash = [canvas.canvas.id, sectionPlanesState.getHash()].join(";");
134
+ const shaderSourceHash = [this._scene.canvas.canvas.id, this._scene._sectionPlanesState.getHash()].join(";");
115
135
 
116
- if ((! this._drawable) || (shaderSourceHash !== this._drawable.shaderSourceHash)) {
117
- if (this._drawable) {
118
- this._drawable.destroy();
119
- }
136
+ if (shaderSourceHash !== this._shaderSourceHash) {
137
+ this._shaderSourceHash = shaderSourceHash;
138
+ this._shaderSourceDirty = true;
139
+ }
120
140
 
121
- const programVariablesState = createProgramVariablesState();
122
-
123
- const programVariables = programVariablesState.programVariables;
124
- const viewMatrix = programVariables.createUniform("mat4", "viewMatrix");
125
- const projMatrix = programVariables.createUniform("mat4", "projMatrix");
126
- const position = programVariables.createAttribute("vec3", "position");
127
- const outColor = programVariables.createOutput("vec4", "outColor");
128
- const clipPos = "clipPos";
129
-
130
- const [program, errors] = programVariablesState.buildProgram(
131
- gl,
132
- "OcclusionTester",
133
- {
134
- sectionPlanesState: sectionPlanesState,
135
- getLogDepth: scene.logarithmicDepthBufferEnabled && (vFragDepth => vFragDepth),
136
- clippableTest: () => "true",
137
- getVertexData: () => {
138
- const src = [ ];
139
- src.push(`vec4 worldPosition = vec4(${position}, 1.0);`);
140
- src.push(`vec4 ${clipPos} = ${projMatrix} * ${viewMatrix} * worldPosition;`);
141
- if ((! scene.logarithmicDepthBufferEnabled) && (scene.markerZOffset < 0.000)) {
142
- src.push(`${clipPos}.z += ${scene.markerZOffset};`);
143
- }
144
- return src;
145
- },
146
- worldPositionAttribute: "worldPosition",
147
- getPointSize: () => "20.0",
148
- clipPos: clipPos,
149
- appendFragmentOutputs: (src) => src.push(`${outColor} = vec4(1.0, 0.0, 0.0, 1.0);`)
150
- });
151
-
152
- if (errors) {
153
- console.error(errors.join("\n"));
154
- throw errors.join("\n");
155
- } else {
156
- this._occlusionTestListDirty = true;
157
- this._drawable = {
158
- shaderSourceHash: shaderSourceHash,
159
- destroy: () => program.destroy(),
160
- drawCall: () => {
161
- const camera = scene.camera;
162
- const project = camera.project;
163
-
164
- program.bind();
165
-
166
- projMatrix.setInputValue(project.matrix);
167
-
168
- const boundary = canvas.boundary;
169
- const canvasWidth = boundary[2];
170
- const canvasHeight = boundary[3];
171
- const near = camera.perspective.near; // Assume near enough to ortho near
172
- const markerInView = marker => {
173
- const viewPos = marker.viewPos;
174
- const canvasPos = marker.canvasPos;
175
- const canvasX = canvasPos[0];
176
- const canvasY = canvasPos[1];
177
- return (viewPos[2] <= -near) && (canvasX >= -10) && (canvasY >= -10) && (canvasX <= canvasWidth + 10) && (canvasY <= canvasHeight + 10);
178
- };
179
-
180
- this._occlusionLayersList.forEach(occlusionLayer => {
181
- occlusionLayer.update(gl, markerInView);
182
-
183
- const culled = sectionPlanesState.sectionPlanes.some((sectionPlane, i) => {
184
- const intersect = sectionPlane.active ? math.planeAABB3Intersect(sectionPlane.dir, sectionPlane.dist, occlusionLayer.aabb) : 1;
185
- const outside = (intersect === -1);
186
- occlusionLayer.sectionPlanesActive[i] = (intersect === 0); // if outside, then sectionPlanesActive won't be even tested
187
- return outside;
188
- });
189
-
190
- if (! culled) {
191
- const origin = occlusionLayer.origin;
192
-
193
- viewMatrix.setInputValue(createRTCViewMat(camera.viewMatrix, origin));
194
-
195
- program.inputSetters.setUniforms(
196
- null,
197
- {
198
- view: { far: project.far },
199
- mesh: {
200
- origin: origin,
201
- renderFlags: { sectionPlanesActivePerLayer: occlusionLayer.sectionPlanesActive }
202
- }
203
- });
204
-
205
- position.setInputValue(occlusionLayer.positionsBuf);
206
-
207
- const indicesBuf = occlusionLayer.indicesBuf;
208
- indicesBuf.bind();
209
- gl.drawElements(gl.POINTS, indicesBuf.numItems, indicesBuf.itemType, 0);
210
- }
211
- });
212
- }
213
- };
214
- }
141
+ if (this._shaderSourceDirty) {
142
+ this._buildShaderSource();
143
+ this._shaderSourceDirty = false;
144
+ this._programDirty = true;
145
+ }
146
+
147
+ if (this._programDirty) {
148
+ this._buildProgram();
149
+ this._programDirty = false;
150
+ this._occlusionTestListDirty = true;
215
151
  }
216
152
 
217
153
  if (this._occlusionLayersListDirty) {
218
- let numOcclusionLayers = 0;
219
- for (let originHash in this._occlusionLayers) {
220
- if (this._occlusionLayers.hasOwnProperty(originHash)) {
221
- this._occlusionLayersList[numOcclusionLayers++] = this._occlusionLayers[originHash];
222
- }
223
- }
224
- this._occlusionLayersList.length = numOcclusionLayers;
154
+ this._buildOcclusionLayersList();
225
155
  this._occlusionLayersListDirty = false;
226
156
  }
227
157
 
@@ -233,33 +163,264 @@ export class OcclusionTester {
233
163
  this._occlusionTestListDirty = false;
234
164
  }
235
165
 
236
- this._drawable.drawCall();
166
+ if (!TEST_MODE) {
167
+ this._readPixelBuf = this._renderBufferManager.getRenderBuffer("occlusionReadPix");
168
+ this._readPixelBuf.bind();
169
+ this._readPixelBuf.clear();
170
+ }
171
+ }
172
+
173
+ _buildOcclusionLayersList() {
174
+ let numOcclusionLayers = 0;
175
+ for (let originHash in this._occlusionLayers) {
176
+ if (this._occlusionLayers.hasOwnProperty(originHash)) {
177
+ this._occlusionLayersList[numOcclusionLayers++] = this._occlusionLayers[originHash];
178
+ }
179
+ }
180
+ this._occlusionLayersList.length = numOcclusionLayers;
181
+ }
182
+
183
+ _buildShaderSource() {
184
+ this._shaderSource = {
185
+ vertex: this._buildVertexShaderSource(),
186
+ fragment: this._buildFragmentShaderSource()
187
+ };
188
+ }
189
+
190
+ _buildVertexShaderSource() {
191
+ const scene = this._scene;
192
+ const clipping = scene._sectionPlanesState.sectionPlanes.length > 0;
193
+ const src = [];
194
+ src.push("#version 300 es");
195
+ src.push("// OcclusionTester vertex shader");
196
+
197
+ src.push("in vec3 position;");
198
+ src.push("uniform mat4 modelMatrix;");
199
+ src.push("uniform mat4 viewMatrix;");
200
+ src.push("uniform mat4 projMatrix;");
201
+ if (scene.logarithmicDepthBufferEnabled) {
202
+ src.push("uniform float logDepthBufFC;");
203
+ src.push("out float vFragDepth;");
204
+ }
205
+ if (clipping) {
206
+ src.push("out vec4 vWorldPosition;");
207
+ }
208
+ src.push("void main(void) {");
209
+ src.push("vec4 worldPosition = vec4(position, 1.0); ");
210
+ src.push(" vec4 viewPosition = viewMatrix * worldPosition;");
211
+ if (clipping) {
212
+ src.push(" vWorldPosition = worldPosition;");
213
+ }
214
+ src.push(" vec4 clipPos = projMatrix * viewPosition;");
215
+ src.push(" gl_PointSize = " + POINT_SIZE + ".0;");
216
+ if (scene.logarithmicDepthBufferEnabled) {
217
+ src.push("vFragDepth = 1.0 + clipPos.w;");
218
+ } else {
219
+ if (scene.markerZOffset < 0.000) {
220
+ src.push("clipPos.z += " + scene.markerZOffset + ";");
221
+ }
222
+ }
223
+ src.push(" gl_Position = clipPos;");
224
+ src.push("}");
225
+ return src;
226
+ }
227
+
228
+ _buildFragmentShaderSource() {
229
+ const scene = this._scene;
230
+ const sectionPlanesState = scene._sectionPlanesState;
231
+ const clipping = sectionPlanesState.sectionPlanes.length > 0;
232
+ const src = [];
233
+ src.push("#version 300 es");
234
+ src.push("// OcclusionTester fragment shader");
235
+
236
+ src.push("#ifdef GL_FRAGMENT_PRECISION_HIGH");
237
+ src.push("precision highp float;");
238
+ src.push("precision highp int;");
239
+ src.push("#else");
240
+ src.push("precision mediump float;");
241
+ src.push("precision mediump int;");
242
+ src.push("#endif");
243
+ if (scene.logarithmicDepthBufferEnabled) {
244
+ src.push("uniform float logDepthBufFC;");
245
+ src.push("in float vFragDepth;");
246
+ }
247
+ if (clipping) {
248
+ src.push("in vec4 vWorldPosition;");
249
+ for (let i = 0; i < sectionPlanesState.sectionPlanes.length; i++) {
250
+ src.push("uniform bool sectionPlaneActive" + i + ";");
251
+ src.push("uniform vec3 sectionPlanePos" + i + ";");
252
+ src.push("uniform vec3 sectionPlaneDir" + i + ";");
253
+ }
254
+ }
255
+ src.push("out vec4 outColor;");
256
+ src.push("void main(void) {");
257
+ if (clipping) {
258
+ src.push(" float dist = 0.0;");
259
+ for (var i = 0; i < sectionPlanesState.sectionPlanes.length; i++) {
260
+ src.push("if (sectionPlaneActive" + i + ") {");
261
+ src.push(" dist += clamp(dot(-sectionPlaneDir" + i + ".xyz, vWorldPosition.xyz - sectionPlanePos" + i + ".xyz), 0.0, 1000.0);");
262
+ src.push("}");
263
+ }
264
+ src.push(" if (dist > 0.0) { discard; }");
265
+ }
266
+ if (scene.logarithmicDepthBufferEnabled) {
267
+ src.push("gl_FragDepth = log2( vFragDepth ) * logDepthBufFC * 0.5;");
268
+ }
269
+ src.push(" outColor = vec4(1.0, 0.0, 0.0, 1.0); ");
270
+ src.push("}");
271
+ return src;
272
+ }
273
+
274
+ _buildProgram() {
275
+ if (this._program) {
276
+ this._program.destroy();
277
+ }
278
+ const scene = this._scene;
279
+ const gl = scene.canvas.gl;
280
+ const sectionPlanesState = scene._sectionPlanesState;
281
+ this._program = new Program(gl, this._shaderSource);
282
+ if (this._program.errors) {
283
+ this.errors = this._program.errors;
284
+ return;
285
+ }
286
+ const program = this._program;
287
+ this._uViewMatrix = program.getLocation("viewMatrix");
288
+ this._uProjMatrix = program.getLocation("projMatrix");
289
+ this._uSectionPlanes = [];
290
+ const sectionPlanes = sectionPlanesState.sectionPlanes;
291
+ for (let i = 0, len = sectionPlanes.length; i < len; i++) {
292
+ this._uSectionPlanes.push({
293
+ active: program.getLocation("sectionPlaneActive" + i),
294
+ pos: program.getLocation("sectionPlanePos" + i),
295
+ dir: program.getLocation("sectionPlaneDir" + i)
296
+ });
297
+ }
298
+ this._aPosition = program.getAttribute("position");
299
+ if (scene.logarithmicDepthBufferEnabled) {
300
+ this._uLogDepthBufFC = program.getLocation("logDepthBufFC");
301
+ }
302
+ }
303
+
304
+ /**
305
+ * Draws {@link Marker}s to the render buffer.
306
+ */
307
+ drawMarkers() {
308
+
309
+ const scene = this._scene;
310
+ const gl = scene.canvas.gl;
311
+ const program = this._program;
312
+ const sectionPlanesState = scene._sectionPlanesState;
313
+ const camera = scene.camera;
314
+ const project = scene.camera.project;
315
+
316
+ program.bind();
317
+
318
+ gl.uniformMatrix4fv(this._uProjMatrix, false, camera._project._state.matrix);
319
+
320
+ if (scene.logarithmicDepthBufferEnabled) {
321
+ const logDepthBufFC = 2.0 / (Math.log(project.far + 1.0) / Math.LN2);
322
+ gl.uniform1f(this._uLogDepthBufFC, logDepthBufFC);
323
+ }
324
+
325
+ for (let i = 0, len = this._occlusionLayersList.length; i < len; i++) {
326
+
327
+ const occlusionLayer = this._occlusionLayersList[i];
328
+
329
+ occlusionLayer.update();
330
+
331
+ if (occlusionLayer.culledBySectionPlanes) {
332
+ continue;
333
+ }
334
+
335
+ const origin = occlusionLayer.origin;
336
+
337
+ gl.uniformMatrix4fv(this._uViewMatrix, false, createRTCViewMat(camera.viewMatrix, origin));
338
+
339
+ const numSectionPlanes = sectionPlanesState.sectionPlanes.length;
340
+ if (numSectionPlanes > 0) {
341
+ const sectionPlanes = sectionPlanesState.sectionPlanes;
342
+ for (let sectionPlaneIndex = 0; sectionPlaneIndex < numSectionPlanes; sectionPlaneIndex++) {
343
+ const sectionPlaneUniforms = this._uSectionPlanes[sectionPlaneIndex];
344
+ if (sectionPlaneUniforms) {
345
+ const active = occlusionLayer.sectionPlanesActive[sectionPlaneIndex];
346
+ gl.uniform1i(sectionPlaneUniforms.active, active ? 1 : 0);
347
+ if (active) {
348
+ const sectionPlane = sectionPlanes[sectionPlaneIndex];
349
+ gl.uniform3fv(sectionPlaneUniforms.pos, getPlaneRTCPos(sectionPlane.dist, sectionPlane.dir, origin, tempVec3a));
350
+ gl.uniform3fv(sectionPlaneUniforms.dir, sectionPlane.dir);
351
+ }
352
+ }
353
+ }
354
+ }
355
+
356
+ this._aPosition.bindArrayBuffer(occlusionLayer.positionsBuf);
357
+
358
+ const indicesBuf = occlusionLayer.indicesBuf;
359
+ indicesBuf.bind();
360
+ gl.drawElements(gl.POINTS, indicesBuf.numItems, indicesBuf.itemType, 0);
361
+ }
237
362
  }
238
363
 
239
364
  /**
240
365
  * Sets visibilities of {@link Marker}s according to whether or not they are obscured by anything in the render buffer.
241
366
  */
242
- doOcclusionTest(readColorPixel) {
243
- this._occlusionLayersList.forEach(occlusionLayer => {
244
- for (let i = 0; i < occlusionLayer.lenOcclusionTestList; i++) {
245
- const j = i * 2;
246
- const color = readColorPixel(occlusionLayer.pixels[j], occlusionLayer.pixels[j + 1]);
247
- occlusionLayer.occlusionTestList[i]._setVisible(math.compareVec3(MARKER_COLOR, color));
367
+ doOcclusionTest() {
368
+
369
+ if (!TEST_MODE) {
370
+
371
+ const resolutionScale = this._scene.canvas.resolutionScale;
372
+
373
+ const markerR = MARKER_COLOR[0] * 255;
374
+ const markerG = MARKER_COLOR[1] * 255;
375
+ const markerB = MARKER_COLOR[2] * 255;
376
+
377
+ for (let i = 0, len = this._occlusionLayersList.length; i < len; i++) {
378
+
379
+ const occlusionLayer = this._occlusionLayersList[i];
380
+
381
+ for (let i = 0; i < occlusionLayer.lenOcclusionTestList; i++) {
382
+
383
+ const marker = occlusionLayer.occlusionTestList[i];
384
+ const j = i * 2;
385
+ const color = this._readPixelBuf.read(Math.round(occlusionLayer.pixels[j] * resolutionScale), Math.round(occlusionLayer.pixels[j + 1] * resolutionScale));
386
+ const visible = (color[0] === markerR) && (color[1] === markerG) && (color[2] === markerB);
387
+
388
+ marker._setVisible(visible);
389
+ }
248
390
  }
249
- });
391
+ }
392
+ }
393
+
394
+ /**
395
+ * Unbinds render buffer.
396
+ */
397
+ unbindRenderBuf() {
398
+ if (!TEST_MODE) {
399
+ this._readPixelBuf.unbind();
400
+ }
250
401
  }
251
402
 
252
403
  /**
253
404
  * Destroys this OcclusionTester.
254
405
  */
255
406
  destroy() {
256
- if (! this.destroyed) {
257
- this._occlusionLayersList.forEach(layer => layer.destroy());
258
- this._drawable && this._drawable.destroy();
259
- this._scene.camera.off(this._onCameraViewMatrix);
260
- this._scene.camera.off(this._onCameraProjMatrix);
261
- this._scene.canvas.off(this._onCanvasBoundary);
262
- this.destroyed = true;
407
+ if (this.destroyed) {
408
+ return;
409
+ }
410
+ for (let i = 0, len = this._occlusionLayersList.length; i < len; i++) {
411
+ const occlusionLayer = this._occlusionLayersList[i];
412
+ occlusionLayer.destroy();
263
413
  }
414
+
415
+ if (this._program) {
416
+ this._program.destroy();
417
+ }
418
+
419
+ this._scene.camera.off(this._onCameraViewMatrix);
420
+ this._scene.camera.off(this._onCameraProjMatrix);
421
+ this._scene.canvas.off(this._onCanvasBoundary);
422
+ this.destroyed = true;
264
423
  }
265
424
  }
425
+
426
+ export {OcclusionTester};