@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,22 +1,152 @@
1
- import {math} from "../../math/math.js";
2
- const tmpVec4 = math.vec4();
1
+ /**
2
+ * @author xeolabs / https://github.com/xeolabs
3
+ */
3
4
 
4
- export const PickMeshShaderSource = function(meshHash, programVariables) {
5
- const pickColor = programVariables.createUniform("vec4", "pickColor", (set, state) => {
6
- var pickID = state.meshPickID; // Mesh-indexed color
7
- tmpVec4[0] = pickID & 0xFF;
8
- tmpVec4[1] = pickID >> 8 & 0xFF;
9
- tmpVec4[2] = pickID >> 16 & 0xFF;
10
- tmpVec4[3] = pickID >> 24 & 0xFF;
11
- math.mulVec4Scalar(tmpVec4, 1 / 255, tmpVec4);
12
- set(tmpVec4);
13
- });
14
- const outColor = programVariables.createOutput("vec4", "outColor");
15
- return {
16
- getHash: () => [ meshHash ],
17
- programName: "PickMesh",
18
- isPick: true,
19
- dontBillboardAnything: true,
20
- appendFragmentOutputs: (src) => src.push(`${outColor} = ${pickColor};`)
21
- };
22
- };
5
+ /**
6
+ * @private
7
+ */
8
+ class PickMeshShaderSource {
9
+ constructor(mesh) {
10
+ this.vertex = buildVertex(mesh);
11
+ this.fragment = buildFragment(mesh);
12
+ }
13
+ }
14
+
15
+ function buildVertex(mesh) {
16
+ const scene = mesh.scene;
17
+ const sectionPlanesState = scene._sectionPlanesState;
18
+ const clipping = sectionPlanesState.getNumAllocatedSectionPlanes() > 0;
19
+ const quantizedGeometry = !!mesh._geometry._state.compressGeometry;
20
+ const billboard = mesh._state.billboard;
21
+ const stationary = mesh._state.stationary;
22
+ const src = [];
23
+ src.push('#version 300 es');
24
+ src.push("// Mesh picking vertex shader");
25
+ src.push("in vec3 position;");
26
+ src.push("uniform mat4 modelMatrix;");
27
+ src.push("uniform mat4 viewMatrix;");
28
+ src.push("uniform mat4 projMatrix;");
29
+ src.push("out vec4 vViewPosition;");
30
+ src.push("uniform vec3 offset;");
31
+ src.push("uniform vec3 scale;");
32
+ if (quantizedGeometry) {
33
+ src.push("uniform mat4 positionsDecodeMatrix;");
34
+ }
35
+ if (clipping) {
36
+ src.push("out vec4 vWorldPosition;");
37
+ }
38
+ if (scene.logarithmicDepthBufferEnabled) {
39
+ src.push("uniform float logDepthBufFC;");
40
+ src.push("out float vFragDepth;");
41
+ src.push("bool isPerspectiveMatrix(mat4 m) {");
42
+ src.push(" return (m[2][3] == - 1.0);");
43
+ src.push("}");
44
+ src.push("out float isPerspective;");
45
+ }
46
+ if (billboard === "spherical" || billboard === "cylindrical") {
47
+ src.push("void billboard(inout mat4 mat) {");
48
+ src.push(" mat[0][0] = scale[0];");
49
+ src.push(" mat[0][1] = 0.0;");
50
+ src.push(" mat[0][2] = 0.0;");
51
+ if (billboard === "spherical") {
52
+ src.push(" mat[1][0] = 0.0;");
53
+ src.push(" mat[1][1] = scale[1];");
54
+ src.push(" mat[1][2] = 0.0;");
55
+ }
56
+ src.push(" mat[2][0] = 0.0;");
57
+ src.push(" mat[2][1] = 0.0;");
58
+ src.push(" mat[2][2] =1.0;");
59
+ src.push("}");
60
+ }
61
+
62
+ src.push("uniform vec2 pickClipPos;");
63
+
64
+ src.push("vec4 remapClipPos(vec4 clipPos) {");
65
+ src.push(" clipPos.xy /= clipPos.w;")
66
+ src.push(" clipPos.xy -= pickClipPos;");
67
+ src.push(" clipPos.xy *= clipPos.w;")
68
+ src.push(" return clipPos;")
69
+ src.push("}");
70
+
71
+ src.push("void main(void) {");
72
+ src.push("vec4 localPosition = vec4(position, 1.0); ");
73
+ if (quantizedGeometry) {
74
+ src.push("localPosition = positionsDecodeMatrix * localPosition;");
75
+ }
76
+ src.push("mat4 viewMatrix2 = viewMatrix;");
77
+ src.push("mat4 modelMatrix2 = modelMatrix;");
78
+ if (stationary) {
79
+ src.push("viewMatrix2[3][0] = viewMatrix2[3][1] = viewMatrix2[3][2] = 0.0;")
80
+ }
81
+ if (billboard === "spherical" || billboard === "cylindrical") {
82
+ src.push("mat4 modelViewMatrix = viewMatrix2 * modelMatrix2;");
83
+ src.push("billboard(modelMatrix2);");
84
+ src.push("billboard(viewMatrix2);");
85
+ }
86
+ src.push(" vec4 worldPosition = modelMatrix2 * localPosition;");
87
+ src.push(" worldPosition.xyz = worldPosition.xyz + offset;");
88
+ src.push(" vec4 viewPosition = viewMatrix2 * worldPosition;");
89
+ if (clipping) {
90
+ src.push(" vWorldPosition = worldPosition;");
91
+ }
92
+ src.push("vec4 clipPos = projMatrix * viewPosition;");
93
+ if (scene.logarithmicDepthBufferEnabled) {
94
+ src.push("vFragDepth = 1.0 + clipPos.w;");
95
+ src.push("isPerspective = float (isPerspectiveMatrix(projMatrix));");
96
+ }
97
+ src.push("gl_Position = remapClipPos(clipPos);");
98
+ src.push("}");
99
+ return src;
100
+ }
101
+
102
+ function buildFragment(mesh) {
103
+ const scene = mesh.scene;
104
+ const sectionPlanesState = scene._sectionPlanesState;
105
+ const clipping = sectionPlanesState.getNumAllocatedSectionPlanes() > 0;
106
+ const src = [];
107
+ src.push('#version 300 es');
108
+ src.push("// Mesh picking fragment shader");
109
+ src.push("#ifdef GL_FRAGMENT_PRECISION_HIGH");
110
+ src.push("precision highp float;");
111
+ src.push("precision highp int;");
112
+ src.push("#else");
113
+ src.push("precision mediump float;");
114
+ src.push("precision mediump int;");
115
+ src.push("#endif");
116
+ if (scene.logarithmicDepthBufferEnabled) {
117
+ src.push("in float isPerspective;");
118
+ src.push("uniform float logDepthBufFC;");
119
+ src.push("in float vFragDepth;");
120
+ }
121
+ src.push("uniform vec4 pickColor;");
122
+ if (clipping) {
123
+ src.push("uniform bool clippable;");
124
+ src.push("in vec4 vWorldPosition;");
125
+ for (var i = 0; i < sectionPlanesState.getNumAllocatedSectionPlanes(); i++) {
126
+ src.push("uniform bool sectionPlaneActive" + i + ";");
127
+ src.push("uniform vec3 sectionPlanePos" + i + ";");
128
+ src.push("uniform vec3 sectionPlaneDir" + i + ";");
129
+ }
130
+ }
131
+ src.push("out vec4 outColor;");
132
+ src.push("void main(void) {");
133
+ if (clipping) {
134
+ src.push("if (clippable) {");
135
+ src.push(" float dist = 0.0;");
136
+ for (var i = 0; i < sectionPlanesState.getNumAllocatedSectionPlanes(); i++) {
137
+ src.push("if (sectionPlaneActive" + i + ") {");
138
+ src.push(" dist += clamp(dot(-sectionPlaneDir" + i + ".xyz, vWorldPosition.xyz - sectionPlanePos" + i + ".xyz), 0.0, 1000.0);");
139
+ src.push("}");
140
+ }
141
+ src.push(" if (dist > 0.0) { discard; }");
142
+ src.push("}");
143
+ }
144
+ if (scene.logarithmicDepthBufferEnabled) {
145
+ src.push("gl_FragDepth = isPerspective == 0.0 ? gl_FragCoord.z : log2( vFragDepth ) * logDepthBufFC * 0.5;");
146
+ }
147
+ src.push(" outColor = pickColor; ");
148
+ src.push("}");
149
+ return src;
150
+ }
151
+
152
+ export {PickMeshShaderSource};
@@ -0,0 +1,200 @@
1
+ /**
2
+ * @author xeolabs / https://github.com/xeolabs
3
+ */
4
+
5
+ import {PickTriangleShaderSource} from "./PickTriangleShaderSource.js";
6
+ import {Program} from "../../webgl/Program.js";
7
+ import {stats} from "../../stats.js";
8
+ import {getPlaneRTCPos} from "../../math/rtcCoords.js";
9
+ import {math} from "../../math/math.js";
10
+
11
+ const tempVec3a = math.vec3();
12
+
13
+ /**
14
+ * @private
15
+ */
16
+ const PickTriangleRenderer = function (hash, mesh) {
17
+ this._hash = hash;
18
+ this._scene = mesh.scene;
19
+ this._useCount = 0;
20
+ this._shaderSource = new PickTriangleShaderSource(mesh);
21
+ this._allocate(mesh);
22
+ };
23
+
24
+ const renderers = {};
25
+
26
+ PickTriangleRenderer.get = function (mesh) {
27
+ const hash = [
28
+ mesh.scene.canvas.canvas.id,
29
+ mesh.scene._sectionPlanesState.getHash(),
30
+ mesh._geometry._state.compressGeometry ? "cp" : "",
31
+ mesh._state.hash
32
+ ].join(";");
33
+ let renderer = renderers[hash];
34
+ if (!renderer) {
35
+ renderer = new PickTriangleRenderer(hash, mesh);
36
+ if (renderer.errors) {
37
+ console.log(renderer.errors.join("\n"));
38
+ return null;
39
+ }
40
+ renderers[hash] = renderer;
41
+ stats.memory.programs++;
42
+ }
43
+ renderer._useCount++;
44
+ return renderer;
45
+ };
46
+
47
+ PickTriangleRenderer.prototype.put = function () {
48
+ if (--this._useCount === 0) {
49
+ if (this._program) {
50
+ this._program.destroy();
51
+ }
52
+ delete renderers[this._hash];
53
+ stats.memory.programs--;
54
+ }
55
+ };
56
+
57
+ PickTriangleRenderer.prototype.webglContextRestored = function () {
58
+ this._program = null;
59
+ };
60
+
61
+ PickTriangleRenderer.prototype.drawMesh = function (frameCtx, mesh) {
62
+
63
+ if (!this._program) {
64
+ this._allocate(mesh);
65
+ }
66
+
67
+ const scene = this._scene;
68
+ const gl = scene.canvas.gl;
69
+ const meshState = mesh._state;
70
+ const materialState = mesh._material._state;
71
+ const geometry = mesh._geometry;
72
+ const geometryState = mesh._geometry._state;
73
+ const origin = mesh.origin;
74
+ const backfaces = materialState.backfaces;
75
+ const frontface = materialState.frontface;
76
+ const project = scene.camera.project;
77
+ const positionsBuf = geometry._getPickTrianglePositions();
78
+ const pickColorsBuf = geometry._getPickTriangleColors();
79
+
80
+ this._program.bind();
81
+
82
+ frameCtx.useProgram++;
83
+
84
+ if (scene.logarithmicDepthBufferEnabled ) {
85
+ const logDepthBufFC = 2.0 / (Math.log(project.far + 1.0) / Math.LN2);
86
+ gl.uniform1f(this._uLogDepthBufFC, logDepthBufFC);
87
+ }
88
+
89
+ gl.uniformMatrix4fv(this._uViewMatrix, false, origin ? frameCtx.getRTCPickViewMatrix(meshState.originHash, origin) : frameCtx.pickViewMatrix);
90
+
91
+ if (meshState.clippable) {
92
+ const numAllocatedSectionPlanes = scene._sectionPlanesState.getNumAllocatedSectionPlanes();
93
+ const numSectionPlanes = scene._sectionPlanesState.sectionPlanes.length;
94
+ if (numAllocatedSectionPlanes > 0) {
95
+ const sectionPlanes = scene._sectionPlanesState.sectionPlanes;
96
+ const renderFlags = mesh.renderFlags;
97
+ for (let sectionPlaneIndex = 0; sectionPlaneIndex < numAllocatedSectionPlanes; sectionPlaneIndex++) {
98
+ const sectionPlaneUniforms = this._uSectionPlanes[sectionPlaneIndex];
99
+ if (sectionPlaneUniforms) {
100
+ if (sectionPlaneIndex < numSectionPlanes) {
101
+ const active = renderFlags.sectionPlanesActivePerLayer[sectionPlaneIndex];
102
+ gl.uniform1i(sectionPlaneUniforms.active, active ? 1 : 0);
103
+ if (active) {
104
+ const sectionPlane = sectionPlanes[sectionPlaneIndex];
105
+ if (origin) {
106
+ const rtcSectionPlanePos = getPlaneRTCPos(sectionPlane.dist, sectionPlane.dir, origin, tempVec3a);
107
+ gl.uniform3fv(sectionPlaneUniforms.pos, rtcSectionPlanePos);
108
+ } else {
109
+ gl.uniform3fv(sectionPlaneUniforms.pos, sectionPlane.pos);
110
+ }
111
+ gl.uniform3fv(sectionPlaneUniforms.dir, sectionPlane.dir);
112
+ }
113
+ } else {
114
+ gl.uniform1i(sectionPlaneUniforms.active, 0);
115
+ }
116
+ }
117
+ }
118
+ }
119
+ }
120
+
121
+ gl.uniformMatrix4fv(this._uProjMatrix, false, frameCtx.pickProjMatrix);
122
+
123
+ if (scene.logarithmicDepthBufferEnabled) {
124
+ gl.uniform1f(this._uZFar, scene.camera.project.far);
125
+ }
126
+
127
+ if (frameCtx.backfaces !== backfaces) {
128
+ if (backfaces) {
129
+ gl.disable(gl.CULL_FACE);
130
+ } else {
131
+ gl.enable(gl.CULL_FACE);
132
+ }
133
+ frameCtx.backfaces = backfaces;
134
+ }
135
+ if (frameCtx.frontface !== frontface) {
136
+ if (frontface) {
137
+ gl.frontFace(gl.CCW);
138
+ } else {
139
+ gl.frontFace(gl.CW);
140
+ }
141
+ frameCtx.frontface = frontface;
142
+ }
143
+
144
+ gl.uniformMatrix4fv(this._uModelMatrix, false, mesh.worldMatrix);
145
+ if (this._uClippable) {
146
+ gl.uniform1i(this._uClippable, mesh._state.clippable);
147
+ }
148
+ gl.uniform3fv(this._uOffset, mesh._state.offset);
149
+ if (this._uPositionsDecodeMatrix) {
150
+ gl.uniformMatrix4fv(this._uPositionsDecodeMatrix, false, geometryState.positionsDecodeMatrix);
151
+ this._aPosition.bindArrayBuffer(positionsBuf, geometryState.compressGeometry ? gl.UNSIGNED_SHORT : gl.FLOAT);
152
+ } else {
153
+ this._aPosition.bindArrayBuffer(positionsBuf);
154
+ }
155
+
156
+ gl.uniform2fv(this._uPickClipPos, frameCtx.pickClipPos);
157
+
158
+ pickColorsBuf.bind();
159
+ gl.enableVertexAttribArray(this._aColor.location);
160
+ gl.vertexAttribPointer(this._aColor.location, pickColorsBuf.itemSize, pickColorsBuf.itemType, true, 0, 0); // Normalize
161
+ gl.drawArrays(geometryState.primitive, 0, positionsBuf.numItems / 3);
162
+ };
163
+
164
+ PickTriangleRenderer.prototype._allocate = function (mesh) {
165
+ const scene = mesh.scene;
166
+ const gl = scene.canvas.gl;
167
+ this._program = new Program(gl, this._shaderSource);
168
+ this._useCount = 0;
169
+ if (this._program.errors) {
170
+ this.errors = this._program.errors;
171
+ return;
172
+ }
173
+ const program = this._program;
174
+ this._uPositionsDecodeMatrix = program.getLocation("positionsDecodeMatrix");
175
+ this._uModelMatrix = program.getLocation("modelMatrix");
176
+ this._uViewMatrix = program.getLocation("viewMatrix");
177
+ this._uProjMatrix = program.getLocation("projMatrix");
178
+ this._uSectionPlanes = [];
179
+ const sectionPlanes = scene._sectionPlanesState.sectionPlanes;
180
+ for (let i = 0, len = sectionPlanes.length; i < len; i++) {
181
+ this._uSectionPlanes.push({
182
+ active: program.getLocation("sectionPlaneActive" + i),
183
+ pos: program.getLocation("sectionPlanePos" + i),
184
+ dir: program.getLocation("sectionPlaneDir" + i)
185
+ });
186
+ }
187
+ this._aPosition = program.getAttribute("position");
188
+ this._aColor = program.getAttribute("color");
189
+ this._uPickClipPos = program.getLocation("pickClipPos");
190
+ this._uClippable = program.getLocation("clippable");
191
+ this._uOffset = program.getLocation("offset");
192
+ if (scene.logarithmicDepthBufferEnabled ) {
193
+ this._uLogDepthBufFC = program.getLocation("logDepthBufFC");
194
+ }
195
+ };
196
+
197
+ export {PickTriangleRenderer};
198
+
199
+
200
+
@@ -1,12 +1,124 @@
1
- export const PickTriangleShaderSource = function(meshHash, programVariables, geometry) {
2
- const vColor = programVariables.createVarying("vec4", "vColor", () => geometry.attributes.pickColor);
3
- const outColor = programVariables.createOutput("vec4", "outColor");
4
- return {
5
- getHash: () => [ meshHash ],
6
- programName: "PickTriangle",
7
- isPick: true,
8
- trianglePick: true,
9
- dontBillboardAnything: true,
10
- appendFragmentOutputs: (src) => src.push(`${outColor} = ${vColor};`)
11
- };
12
- };
1
+ /**
2
+ * @private
3
+ */
4
+
5
+ class PickTriangleShaderSource {
6
+ constructor(mesh) {
7
+ this.vertex = buildVertex(mesh);
8
+ this.fragment = buildFragment(mesh);
9
+ }
10
+ }
11
+
12
+ function buildVertex(mesh) {
13
+ const scene = mesh.scene;
14
+ const sectionPlanesState = scene._sectionPlanesState;
15
+ const clipping = sectionPlanesState.getNumAllocatedSectionPlanes() > 0;
16
+ const quantizedGeometry = !!mesh._geometry._state.compressGeometry;
17
+ const src = [];
18
+ src.push('#version 300 es');
19
+ src.push("// Surface picking vertex shader");
20
+ src.push("in vec3 position;");
21
+ src.push("in vec4 color;");
22
+ src.push("uniform mat4 modelMatrix;");
23
+ src.push("uniform mat4 viewMatrix;");
24
+ src.push("uniform mat4 projMatrix;");
25
+ src.push("uniform vec3 offset;");
26
+ if (clipping) {
27
+ src.push("uniform bool clippable;");
28
+ src.push("out vec4 vWorldPosition;");
29
+ }
30
+ if (scene.logarithmicDepthBufferEnabled) {
31
+ src.push("uniform float logDepthBufFC;");
32
+ src.push("out float vFragDepth;");
33
+ src.push("bool isPerspectiveMatrix(mat4 m) {");
34
+ src.push(" return (m[2][3] == - 1.0);");
35
+ src.push("}");
36
+ src.push("out float isPerspective;");
37
+ }
38
+
39
+ src.push("uniform vec2 pickClipPos;");
40
+
41
+ src.push("vec4 remapClipPos(vec4 clipPos) {");
42
+ src.push(" clipPos.xy /= clipPos.w;")
43
+ src.push(" clipPos.xy -= pickClipPos;");
44
+ src.push(" clipPos.xy *= clipPos.w;")
45
+ src.push(" return clipPos;")
46
+ src.push("}");
47
+
48
+ src.push("out vec4 vColor;");
49
+ if (quantizedGeometry) {
50
+ src.push("uniform mat4 positionsDecodeMatrix;");
51
+ }
52
+ src.push("void main(void) {");
53
+ src.push("vec4 localPosition = vec4(position, 1.0); ");
54
+ if (quantizedGeometry) {
55
+ src.push("localPosition = positionsDecodeMatrix * localPosition;");
56
+ }
57
+ src.push(" vec4 worldPosition = modelMatrix * localPosition; ");
58
+ src.push(" worldPosition.xyz = worldPosition.xyz + offset;");
59
+ src.push(" vec4 viewPosition = viewMatrix * worldPosition;");
60
+ if (clipping) {
61
+ src.push(" vWorldPosition = worldPosition;");
62
+ }
63
+ src.push(" vColor = color;");
64
+ src.push("vec4 clipPos = projMatrix * viewPosition;");
65
+ if (scene.logarithmicDepthBufferEnabled) {
66
+ src.push("vFragDepth = 1.0 + clipPos.w;");
67
+ src.push("isPerspective = float (isPerspectiveMatrix(projMatrix));");
68
+ }
69
+ src.push("gl_Position = remapClipPos(clipPos);");
70
+ src.push("}");
71
+ return src;
72
+ }
73
+
74
+ function buildFragment(mesh) {
75
+ const scene = mesh.scene;
76
+ const sectionPlanesState = scene._sectionPlanesState;
77
+ const clipping = sectionPlanesState.getNumAllocatedSectionPlanes() > 0;
78
+ const src = [];
79
+ src.push('#version 300 es');
80
+ src.push("// Surface picking fragment shader");
81
+ src.push("#ifdef GL_FRAGMENT_PRECISION_HIGH");
82
+ src.push("precision highp float;");
83
+ src.push("precision highp int;");
84
+ src.push("#else");
85
+ src.push("precision mediump float;");
86
+ src.push("precision mediump int;");
87
+ src.push("#endif");
88
+ src.push("in vec4 vColor;");
89
+ if (scene.logarithmicDepthBufferEnabled) {
90
+ src.push("in float isPerspective;");
91
+ src.push("uniform float logDepthBufFC;");
92
+ src.push("in float vFragDepth;");
93
+ }
94
+ if (clipping) {
95
+ src.push("uniform bool clippable;");
96
+ src.push("in vec4 vWorldPosition;");
97
+ for (let i = 0; i < sectionPlanesState.getNumAllocatedSectionPlanes(); i++) {
98
+ src.push("uniform bool sectionPlaneActive" + i + ";");
99
+ src.push("uniform vec3 sectionPlanePos" + i + ";");
100
+ src.push("uniform vec3 sectionPlaneDir" + i + ";");
101
+ }
102
+ }
103
+ src.push("out vec4 outColor;");
104
+ src.push("void main(void) {");
105
+ if (clipping) {
106
+ src.push("if (clippable) {");
107
+ src.push(" float dist = 0.0;");
108
+ for (let i = 0; i < sectionPlanesState.getNumAllocatedSectionPlanes(); i++) {
109
+ src.push("if (sectionPlaneActive" + i + ") {");
110
+ src.push(" dist += clamp(dot(-sectionPlaneDir" + i + ".xyz, vWorldPosition.xyz - sectionPlanePos" + i + ".xyz), 0.0, 1000.0);");
111
+ src.push("}");
112
+ }
113
+ src.push(" if (dist > 0.0) { discard; }");
114
+ src.push("}");
115
+ }
116
+ if (scene.logarithmicDepthBufferEnabled) {
117
+ src.push("gl_FragDepth = isPerspective == 0.0 ? gl_FragCoord.z : log2( vFragDepth ) * logDepthBufFC * 0.5;");
118
+ }
119
+ src.push(" outColor = vColor;");
120
+ src.push("}");
121
+ return src;
122
+ }
123
+
124
+ export {PickTriangleShaderSource};