@xeokit/xeokit-sdk 2.6.87-renderers-refactor-v4 → 2.6.88

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 (188) hide show
  1. package/README.md +3 -3
  2. package/dist/xeokit-sdk.cjs.js +44699 -17047
  3. package/dist/xeokit-sdk.es.js +44698 -17048
  4. package/dist/xeokit-sdk.es5.js +3588 -1489
  5. package/dist/xeokit-sdk.min.cjs.js +8 -8
  6. package/dist/xeokit-sdk.min.es.js +8 -8
  7. package/dist/xeokit-sdk.min.es5.js +7 -7
  8. package/package.json +1 -2
  9. package/src/plugins/CxConverterIFCLoaderPlugin/CxConverterIFCLoaderPlugin.js +13 -2
  10. package/src/plugins/DotBIMLoaderPlugin/DotBIMLoaderPlugin.js +2 -2
  11. package/src/plugins/NavCubePlugin/NavCubePlugin.js +63 -22
  12. package/src/plugins/SectionPlanesPlugin/SectionPlanesPlugin.js +3 -1
  13. package/src/viewer/Viewer.js +103 -55
  14. package/src/viewer/scene/canvas/Canvas.js +43 -3
  15. package/src/viewer/scene/geometry/ReadableGeometry.js +25 -0
  16. package/src/viewer/scene/lights/CubeTexture.js +13 -0
  17. package/src/viewer/scene/lights/DirLight.js +1 -2
  18. package/src/viewer/scene/lights/PointLight.js +1 -2
  19. package/src/viewer/scene/materials/Texture.js +9 -0
  20. package/src/viewer/scene/math/rtcCoords.js +38 -1
  21. package/src/viewer/scene/mesh/Mesh.js +212 -454
  22. package/src/viewer/scene/mesh/draw/DrawRenderer.js +998 -0
  23. package/src/viewer/scene/mesh/draw/DrawShaderSource.js +1504 -305
  24. package/src/viewer/scene/mesh/emphasis/EmphasisEdgesRenderer.js +259 -0
  25. package/src/viewer/scene/mesh/emphasis/EmphasisEdgesShaderSource.js +160 -0
  26. package/src/viewer/scene/mesh/emphasis/EmphasisFillRenderer.js +286 -0
  27. package/src/viewer/scene/mesh/emphasis/EmphasisFillShaderSource.js +263 -0
  28. package/src/viewer/scene/mesh/occlusion/OcclusionRenderer.js +221 -0
  29. package/src/viewer/scene/mesh/occlusion/OcclusionShaderSource.js +158 -9
  30. package/src/viewer/scene/mesh/pick/PickMeshRenderer.js +223 -0
  31. package/src/viewer/scene/mesh/pick/PickMeshShaderSource.js +151 -21
  32. package/src/viewer/scene/mesh/pick/PickTriangleRenderer.js +200 -0
  33. package/src/viewer/scene/mesh/pick/PickTriangleShaderSource.js +124 -12
  34. package/src/viewer/scene/mesh/shadow/ShadowRenderer.js +214 -0
  35. package/src/viewer/scene/mesh/shadow/ShadowShaderSource.js +97 -22
  36. package/src/viewer/scene/model/RENDER_PASSES.js +34 -0
  37. package/src/viewer/scene/model/SceneModel.js +852 -248
  38. package/src/viewer/scene/model/SceneModelEntity.js +4 -4
  39. package/src/viewer/scene/model/SceneModelMesh.js +3 -3
  40. package/src/viewer/scene/model/dtx/BindableDataTexture.js +31 -0
  41. package/src/viewer/scene/model/dtx/lines/DTXLinesBuffer.js +27 -0
  42. package/src/viewer/scene/model/dtx/lines/DTXLinesLayer.js +897 -0
  43. package/src/viewer/scene/model/dtx/lines/DTXLinesState.js +46 -0
  44. package/src/viewer/scene/model/dtx/lines/DTXLinesTextureFactory.js +411 -0
  45. package/src/viewer/scene/model/dtx/lines/dataTextureRamStats.js +49 -0
  46. package/src/viewer/scene/model/dtx/lines/rebucketPositions.js +208 -0
  47. package/src/viewer/scene/model/dtx/lines/renderers/DTXLinesColorRenderer.js +389 -0
  48. package/src/viewer/scene/model/dtx/lines/renderers/DTXLinesRenderers.js +65 -0
  49. package/src/viewer/scene/model/dtx/triangles/DTXTrianglesLayer.js +1399 -0
  50. package/src/viewer/scene/model/dtx/triangles/lib/DTXTrianglesBuffer.js +46 -0
  51. package/src/viewer/scene/model/dtx/triangles/lib/DTXTrianglesState.js +250 -0
  52. package/src/viewer/scene/model/dtx/triangles/lib/DTXTrianglesTextureFactory.js +518 -0
  53. package/src/viewer/scene/model/dtx/triangles/lib/dataTextureRamStats.js +54 -0
  54. package/src/viewer/scene/model/dtx/triangles/renderers/DTXTrianglesColorRenderer.js +639 -0
  55. package/src/viewer/scene/model/dtx/triangles/renderers/DTXTrianglesDepthRenderer.js +464 -0
  56. package/src/viewer/scene/model/dtx/triangles/renderers/DTXTrianglesEdgesColorRenderer.js +423 -0
  57. package/src/viewer/scene/model/dtx/triangles/renderers/DTXTrianglesEdgesRenderer.js +431 -0
  58. package/src/viewer/scene/model/dtx/triangles/renderers/DTXTrianglesNormalsRenderer.js +345 -0
  59. package/src/viewer/scene/model/dtx/triangles/renderers/DTXTrianglesOcclusionRenderer.js +436 -0
  60. package/src/viewer/scene/model/dtx/triangles/renderers/DTXTrianglesPickDepthRenderer.js +466 -0
  61. package/src/viewer/scene/model/dtx/triangles/renderers/DTXTrianglesPickMeshRenderer.js +437 -0
  62. package/src/viewer/scene/model/dtx/triangles/renderers/DTXTrianglesPickNormalsFlatRenderer.js +460 -0
  63. package/src/viewer/scene/model/dtx/triangles/renderers/DTXTrianglesPickNormalsRenderer.js +437 -0
  64. package/src/viewer/scene/model/dtx/triangles/renderers/DTXTrianglesRenderers.js +307 -0
  65. package/src/viewer/scene/model/dtx/triangles/renderers/DTXTrianglesSilhouetteRenderer.js +472 -0
  66. package/src/viewer/scene/model/dtx/triangles/renderers/DTXTrianglesSnapInitRenderer.js +474 -0
  67. package/src/viewer/scene/model/dtx/triangles/renderers/DTXTrianglesSnapRenderer.js +435 -0
  68. package/src/viewer/scene/model/vbo/ScratchMemory.js +63 -0
  69. package/src/viewer/scene/model/vbo/VBORenderer.js +664 -0
  70. package/src/viewer/scene/model/vbo/batching/lines/VBOBatchingLinesLayer.js +704 -0
  71. package/src/viewer/scene/model/vbo/batching/lines/lib/VBOBatchingLinesBuffer.js +19 -0
  72. package/src/viewer/scene/model/vbo/batching/lines/renderers/VBOBatchingLineSnapInitRenderer.js +318 -0
  73. package/src/viewer/scene/model/vbo/batching/lines/renderers/VBOBatchingLinesColorRenderer.js +114 -0
  74. package/src/viewer/scene/model/vbo/batching/lines/renderers/VBOBatchingLinesRenderers.js +99 -0
  75. package/src/viewer/scene/model/vbo/batching/lines/renderers/VBOBatchingLinesSilhouetteRenderer.js +124 -0
  76. package/src/viewer/scene/model/vbo/batching/lines/renderers/VBOBatchingLinesSnapInitRenderer.js +313 -0
  77. package/src/viewer/scene/model/vbo/batching/lines/renderers/VBOBatchingLinesSnapRenderer.js +311 -0
  78. package/src/viewer/scene/model/vbo/batching/lines/renderers/VBOSceneModelLineBatchingRenderer.js +24 -0
  79. package/src/viewer/scene/model/vbo/batching/points/VBOBatchingPointsLayer.js +688 -0
  80. package/src/viewer/scene/model/vbo/batching/points/VBOBatchingPointsRenderer.js +24 -0
  81. package/src/viewer/scene/model/vbo/batching/points/renderers/VBOBatchingPointsColorRenderer.js +168 -0
  82. package/src/viewer/scene/model/vbo/batching/points/renderers/VBOBatchingPointsOcclusionRenderer.js +136 -0
  83. package/src/viewer/scene/model/vbo/batching/points/renderers/VBOBatchingPointsPickDepthRenderer.js +156 -0
  84. package/src/viewer/scene/model/vbo/batching/points/renderers/VBOBatchingPointsPickMeshRenderer.js +148 -0
  85. package/src/viewer/scene/model/vbo/batching/points/renderers/VBOBatchingPointsRenderers.js +144 -0
  86. package/src/viewer/scene/model/vbo/batching/points/renderers/VBOBatchingPointsShadowRenderer.js +107 -0
  87. package/src/viewer/scene/model/vbo/batching/points/renderers/VBOBatchingPointsSilhouetteRenderer.js +146 -0
  88. package/src/viewer/scene/model/vbo/batching/points/renderers/VBOBatchingPointsSnapInitRenderer.js +315 -0
  89. package/src/viewer/scene/model/vbo/batching/points/renderers/VBOBatchingPointsSnapRenderer.js +305 -0
  90. package/src/viewer/scene/model/vbo/batching/triangles/VBOBatchingTrianglesBuffer.js +24 -0
  91. package/src/viewer/scene/model/vbo/batching/triangles/VBOBatchingTrianglesLayer.js +1346 -0
  92. package/src/viewer/scene/model/vbo/batching/triangles/renderers/EdgesColorRenderer.js +131 -0
  93. package/src/viewer/scene/model/vbo/batching/triangles/renderers/EdgesEmphasisRenderer.js +135 -0
  94. package/src/viewer/scene/model/vbo/batching/triangles/renderers/EdgesRenderer.js +12 -0
  95. package/src/viewer/scene/model/vbo/batching/triangles/renderers/Renderers.js +403 -0
  96. package/src/viewer/scene/model/vbo/batching/triangles/renderers/TrianglesBatchingRenderer.js +35 -0
  97. package/src/viewer/scene/model/vbo/batching/triangles/renderers/TrianglesColorRenderer.js +252 -0
  98. package/src/viewer/scene/model/vbo/batching/triangles/renderers/TrianglesColorTextureRenderer.js +294 -0
  99. package/src/viewer/scene/model/vbo/batching/triangles/renderers/TrianglesDepthRenderer.js +115 -0
  100. package/src/viewer/scene/model/vbo/batching/triangles/renderers/TrianglesFlatColorRenderer.js +246 -0
  101. package/src/viewer/scene/model/vbo/batching/triangles/renderers/TrianglesNormalsRenderer.js +139 -0
  102. package/src/viewer/scene/model/vbo/batching/triangles/renderers/TrianglesOcclusionRenderer.js +125 -0
  103. package/src/viewer/scene/model/vbo/batching/triangles/renderers/TrianglesPBRRenderer.js +561 -0
  104. package/src/viewer/scene/model/vbo/batching/triangles/renderers/TrianglesPickDepthRenderer.js +144 -0
  105. package/src/viewer/scene/model/vbo/batching/triangles/renderers/TrianglesPickMeshRenderer.js +130 -0
  106. package/src/viewer/scene/model/vbo/batching/triangles/renderers/TrianglesPickNormalsFlatRenderer.js +121 -0
  107. package/src/viewer/scene/model/vbo/batching/triangles/renderers/TrianglesPickNormalsRenderer.js +131 -0
  108. package/src/viewer/scene/model/vbo/batching/triangles/renderers/TrianglesShadowRenderer.js +107 -0
  109. package/src/viewer/scene/model/vbo/batching/triangles/renderers/TrianglesSilhouetteRenderer.js +144 -0
  110. package/src/viewer/scene/model/vbo/batching/triangles/renderers/TrianglesSnapInitRenderer.js +313 -0
  111. package/src/viewer/scene/model/vbo/batching/triangles/renderers/TrianglesSnapRenderer.js +312 -0
  112. package/src/viewer/scene/model/vbo/float16.js +760 -0
  113. package/src/viewer/scene/model/vbo/instancing/lines/VBOInstancingLinesLayer.js +711 -0
  114. package/src/viewer/scene/model/vbo/instancing/lines/renderers/VBOInstancingLinesColorRenderer.js +148 -0
  115. package/src/viewer/scene/model/vbo/instancing/lines/renderers/VBOInstancingLinesRenderer.js +26 -0
  116. package/src/viewer/scene/model/vbo/instancing/lines/renderers/VBOInstancingLinesRenderers.js +139 -0
  117. package/src/viewer/scene/model/vbo/instancing/lines/renderers/VBOInstancingLinesSilhouetteRenderer.js +127 -0
  118. package/src/viewer/scene/model/vbo/instancing/lines/renderers/VBOInstancingLinesSnapInitRenderer.js +308 -0
  119. package/src/viewer/scene/model/vbo/instancing/lines/renderers/VBOInstancingLinesSnapRenderer.js +299 -0
  120. package/src/viewer/scene/model/vbo/instancing/points/VBOInstancingPointsLayer.js +733 -0
  121. package/src/viewer/scene/model/vbo/instancing/points/renderers/VBOInstancingPointsColorRenderer.js +174 -0
  122. package/src/viewer/scene/model/vbo/instancing/points/renderers/VBOInstancingPointsDepthRenderer.js +156 -0
  123. package/src/viewer/scene/model/vbo/instancing/points/renderers/VBOInstancingPointsOcclusionRenderer.js +149 -0
  124. package/src/viewer/scene/model/vbo/instancing/points/renderers/VBOInstancingPointsPickDepthRenderer.js +170 -0
  125. package/src/viewer/scene/model/vbo/instancing/points/renderers/VBOInstancingPointsPickMeshRenderer.js +152 -0
  126. package/src/viewer/scene/model/vbo/instancing/points/renderers/VBOInstancingPointsRenderer.js +26 -0
  127. package/src/viewer/scene/model/vbo/instancing/points/renderers/VBOInstancingPointsRenderers.js +174 -0
  128. package/src/viewer/scene/model/vbo/instancing/points/renderers/VBOInstancingPointsShadowRenderer.js +119 -0
  129. package/src/viewer/scene/model/vbo/instancing/points/renderers/VBOInstancingPointsSilhouetteRenderer.js +154 -0
  130. package/src/viewer/scene/model/vbo/instancing/points/renderers/VBOInstancingPointsSnapInitRenderer.js +307 -0
  131. package/src/viewer/scene/model/vbo/instancing/points/renderers/VBOInstancingPointsSnapRenderer.js +293 -0
  132. package/src/viewer/scene/model/vbo/instancing/points/renderers/VBOInstancingTrianglesRenderer.js +150 -0
  133. package/src/viewer/scene/model/vbo/instancing/triangles/VBOInstancingTrianglesLayer.js +1289 -0
  134. package/src/viewer/scene/model/vbo/instancing/triangles/renderers/EdgesColorRenderer.js +135 -0
  135. package/src/viewer/scene/model/vbo/instancing/triangles/renderers/EdgesEmphasisRenderer.js +137 -0
  136. package/src/viewer/scene/model/vbo/instancing/triangles/renderers/EdgesRenderer.js +12 -0
  137. package/src/viewer/scene/model/vbo/instancing/triangles/renderers/Renderers.js +403 -0
  138. package/src/viewer/scene/model/vbo/instancing/triangles/renderers/TrianglesColorRenderer.js +267 -0
  139. package/src/viewer/scene/model/vbo/instancing/triangles/renderers/TrianglesColorTextureRenderer.js +299 -0
  140. package/src/viewer/scene/model/vbo/instancing/triangles/renderers/TrianglesDepthRenderer.js +126 -0
  141. package/src/viewer/scene/model/vbo/instancing/triangles/renderers/TrianglesFlatColorRenderer.js +255 -0
  142. package/src/viewer/scene/model/vbo/instancing/triangles/renderers/TrianglesFlatNormalsRenderer.js +130 -0
  143. package/src/viewer/scene/model/vbo/instancing/triangles/renderers/TrianglesInstancingRenderer.js +32 -0
  144. package/src/viewer/scene/model/vbo/instancing/triangles/renderers/TrianglesNormalsRenderer.js +138 -0
  145. package/src/viewer/scene/model/vbo/instancing/triangles/renderers/TrianglesOcclusionRenderer.js +128 -0
  146. package/src/viewer/scene/model/vbo/instancing/triangles/renderers/TrianglesPBRRenderer.js +561 -0
  147. package/src/viewer/scene/model/vbo/instancing/triangles/renderers/TrianglesPickDepthRenderer.js +149 -0
  148. package/src/viewer/scene/model/vbo/instancing/triangles/renderers/TrianglesPickMeshRenderer.js +136 -0
  149. package/src/viewer/scene/model/vbo/instancing/triangles/renderers/TrianglesPickNormalsFlatRenderer.js +130 -0
  150. package/src/viewer/scene/model/vbo/instancing/triangles/renderers/TrianglesPickNormalsRenderer.js +145 -0
  151. package/src/viewer/scene/model/vbo/instancing/triangles/renderers/TrianglesShadowRenderer.js +113 -0
  152. package/src/viewer/scene/model/vbo/instancing/triangles/renderers/TrianglesSilhouetteRenderer.js +148 -0
  153. package/src/viewer/scene/model/vbo/instancing/triangles/renderers/TrianglesSnapInitRenderer.js +319 -0
  154. package/src/viewer/scene/model/vbo/instancing/triangles/renderers/TrianglesSnapRenderer.js +310 -0
  155. package/src/viewer/scene/scene/Scene.js +38 -21
  156. package/src/viewer/scene/webgl/ArrayBuf.js +20 -5
  157. package/src/viewer/scene/webgl/Attribute.js +23 -0
  158. package/src/viewer/scene/webgl/FrameContext.js +86 -14
  159. package/src/viewer/scene/webgl/Program.js +181 -0
  160. package/src/viewer/scene/webgl/RenderBuffer.js +262 -62
  161. package/src/viewer/scene/webgl/RenderBufferManager.js +34 -0
  162. package/src/viewer/scene/webgl/Renderer.js +843 -880
  163. package/src/viewer/scene/webgl/Sampler.js +18 -0
  164. package/src/viewer/scene/webgl/Shader.js +49 -0
  165. package/src/viewer/scene/webgl/occlusion/OcclusionLayer.js +132 -60
  166. package/src/viewer/scene/webgl/occlusion/OcclusionTester.js +328 -167
  167. package/src/viewer/scene/webgl/sao/SAODepthLimitedBlurRenderer.js +324 -0
  168. package/src/viewer/scene/webgl/sao/SAOOcclusionRenderer.js +384 -0
  169. package/types/plugins/lib/ui/index.d.ts +7 -4
  170. package/src/viewer/scene/mesh/draw/LambertShaderSource.js +0 -35
  171. package/src/viewer/scene/mesh/emphasis/EmphasisShaderSource.js +0 -34
  172. package/src/viewer/scene/model/layer/DTXLayer.js +0 -940
  173. package/src/viewer/scene/model/layer/Layer.js +0 -788
  174. package/src/viewer/scene/model/layer/VBOLayer.js +0 -1019
  175. package/src/viewer/scene/model/layer/programs/ColorProgram.js +0 -35
  176. package/src/viewer/scene/model/layer/programs/ColorTextureProgram.js +0 -46
  177. package/src/viewer/scene/model/layer/programs/DepthProgram.js +0 -11
  178. package/src/viewer/scene/model/layer/programs/EdgesProgram.js +0 -12
  179. package/src/viewer/scene/model/layer/programs/FlatColorProgram.js +0 -24
  180. package/src/viewer/scene/model/layer/programs/OcclusionProgram.js +0 -12
  181. package/src/viewer/scene/model/layer/programs/PBRProgram.js +0 -180
  182. package/src/viewer/scene/model/layer/programs/PickDepthProgram.js +0 -30
  183. package/src/viewer/scene/model/layer/programs/PickMeshProgram.js +0 -12
  184. package/src/viewer/scene/model/layer/programs/PickNormalsProgram.js +0 -18
  185. package/src/viewer/scene/model/layer/programs/ShadowProgram.js +0 -23
  186. package/src/viewer/scene/model/layer/programs/SilhouetteProgram.js +0 -15
  187. package/src/viewer/scene/model/layer/programs/SnapProgram.js +0 -28
  188. package/src/viewer/scene/webgl/WebGLRenderer.js +0 -612
@@ -1,788 +0,0 @@
1
- import {createRTCViewMat, math} from "../../math/index.js";
2
- import {ENTITY_FLAGS} from "../ENTITY_FLAGS.js";
3
- import {createLightSetup, createProgramVariablesState, setupTexture} from '../../webgl/WebGLRenderer.js';
4
- import {LinearEncoding} from "../../constants/constants.js";
5
-
6
- import { ColorProgram } from "./programs/ColorProgram.js";
7
- import { ColorTextureProgram } from "./programs/ColorTextureProgram.js";
8
- import { DepthProgram } from "./programs/DepthProgram.js";
9
- import { EdgesProgram } from "./programs/EdgesProgram.js";
10
- import { FlatColorProgram } from "./programs/FlatColorProgram.js";
11
- import { OcclusionProgram } from "./programs/OcclusionProgram.js";
12
- import { PBRProgram } from "./programs/PBRProgram.js";
13
- import { PickDepthProgram } from "./programs/PickDepthProgram.js";
14
- import { PickMeshProgram } from "./programs/PickMeshProgram.js";
15
- import { PickNormalsProgram } from "./programs/PickNormalsProgram.js";
16
- import { ShadowProgram } from "./programs/ShadowProgram.js";
17
- import { SilhouetteProgram } from "./programs/SilhouetteProgram.js";
18
- import { SnapProgram } from "./programs/SnapProgram.js";
19
-
20
- const tempVec2 = math.vec2();
21
- const tempVec3 = math.vec3();
22
- const tempVec4 = math.vec4();
23
- const tempMat4 = math.mat4();
24
- const vec3zero = math.vec3([0,0,0]);
25
-
26
- const RENDER_PASSES = {
27
- // Skipped - suppress rendering
28
- NOT_RENDERED: 0,
29
-
30
- // Normal rendering - mutually exclusive modes
31
- COLOR_OPAQUE: 1,
32
- COLOR_TRANSPARENT: 2,
33
-
34
- // Emphasis silhouette rendering - mutually exclusive modes
35
- SILHOUETTE_HIGHLIGHTED: 3,
36
- SILHOUETTE_SELECTED: 4,
37
- SILHOUETTE_XRAYED: 5,
38
-
39
- // Edges rendering - mutually exclusive modes
40
- EDGES_COLOR_OPAQUE: 6,
41
- EDGES_COLOR_TRANSPARENT: 7,
42
- EDGES_HIGHLIGHTED: 8,
43
- EDGES_SELECTED: 9,
44
- EDGES_XRAYED: 10,
45
-
46
- // Picking
47
- PICK: 11
48
- };
49
-
50
- const safeInvVec3 = v => [ math.safeInv(v[0]), math.safeInv(v[1]), math.safeInv(v[2]) ];
51
-
52
- export const isPerspectiveMatrix = (m) => `(${m}[2][3] == - 1.0)`;
53
-
54
- export const getColSilhEdgePickFlags = (flags, transparent, hasEdges, scene, dst) => {
55
- const visible = !!(flags & ENTITY_FLAGS.VISIBLE);
56
- const xrayed = !!(flags & ENTITY_FLAGS.XRAYED);
57
- const highlighted = !!(flags & ENTITY_FLAGS.HIGHLIGHTED);
58
- const selected = !!(flags & ENTITY_FLAGS.SELECTED);
59
- const edges = !!(flags & ENTITY_FLAGS.EDGES);
60
- const pickable = !!(flags & ENTITY_FLAGS.PICKABLE);
61
- const culled = !!(flags & ENTITY_FLAGS.CULLED);
62
-
63
- let colorFlag;
64
- if (!visible || culled || xrayed
65
- || (highlighted && !scene.highlightMaterial.glowThrough)
66
- || (selected && !scene.selectedMaterial.glowThrough)) {
67
- colorFlag = RENDER_PASSES.NOT_RENDERED;
68
- } else {
69
- if (transparent) {
70
- colorFlag = RENDER_PASSES.COLOR_TRANSPARENT;
71
- } else {
72
- colorFlag = RENDER_PASSES.COLOR_OPAQUE;
73
- }
74
- }
75
-
76
- let silhouetteFlag;
77
- if (!visible || culled) {
78
- silhouetteFlag = RENDER_PASSES.NOT_RENDERED;
79
- } else if (selected) {
80
- silhouetteFlag = RENDER_PASSES.SILHOUETTE_SELECTED;
81
- } else if (highlighted) {
82
- silhouetteFlag = RENDER_PASSES.SILHOUETTE_HIGHLIGHTED;
83
- } else if (xrayed) {
84
- silhouetteFlag = RENDER_PASSES.SILHOUETTE_XRAYED;
85
- } else {
86
- silhouetteFlag = RENDER_PASSES.NOT_RENDERED;
87
- }
88
-
89
- let edgeFlag = 0;
90
- if ((!hasEdges) || (!visible) || culled) {
91
- edgeFlag = RENDER_PASSES.NOT_RENDERED;
92
- } else if (selected) {
93
- edgeFlag = RENDER_PASSES.EDGES_SELECTED;
94
- } else if (highlighted) {
95
- edgeFlag = RENDER_PASSES.EDGES_HIGHLIGHTED;
96
- } else if (xrayed) {
97
- edgeFlag = RENDER_PASSES.EDGES_XRAYED;
98
- } else if (edges) {
99
- if (transparent) {
100
- edgeFlag = RENDER_PASSES.EDGES_COLOR_TRANSPARENT;
101
- } else {
102
- edgeFlag = RENDER_PASSES.EDGES_COLOR_OPAQUE;
103
- }
104
- } else {
105
- edgeFlag = RENDER_PASSES.NOT_RENDERED;
106
- }
107
-
108
- const pickFlag = (visible && !culled && pickable) ? RENDER_PASSES.PICK : RENDER_PASSES.NOT_RENDERED;
109
-
110
- dst[0] = colorFlag;
111
- dst[1] = silhouetteFlag;
112
- dst[2] = edgeFlag;
113
- dst[3] = pickFlag;
114
- };
115
-
116
- export const getRenderers = (function() {
117
- const cachedRenderers = { };
118
-
119
- return function(scene, layerType, primitive, saoEnabled, pbrSupported, colorTextureSupported, surfaceHasNormals, makeRenderingAttributes) {
120
- const primKey = ((primitive === "points") || (primitive === "lines")) ? primitive : "triangles";
121
- const cacheKey = [ layerType, primKey, !!saoEnabled, !!pbrSupported, !!colorTextureSupported, !!surfaceHasNormals ].join(":");
122
- if (! (cacheKey in cachedRenderers)) {
123
- cachedRenderers[cacheKey] = { };
124
- }
125
- const cache = cachedRenderers[cacheKey];
126
- const sceneId = scene.id;
127
- if (! (sceneId in cache)) {
128
- const gl = scene.canvas.gl;
129
- const wrapRenderer = function(createProgramSetup, subGeometry, isEager) {
130
- const instantiate = function() {
131
- const programVariablesState = createProgramVariablesState();
132
- const programVariables = programVariablesState.programVariables;
133
- const renderingAttributes = makeRenderingAttributes(programVariables, subGeometry);
134
- return createProgramSetup(
135
- programVariables,
136
- renderingAttributes.geometryParameters,
137
- function(programSetup, usePickClipPos) {
138
- const pointsMaterial = scene.pointsMaterial;
139
- const setupPoints = (primitive === "points") && (! subGeometry);
140
-
141
- const getHash = () => [ scene._sectionPlanesState.getHash() ].concat(setupPoints ? [ pointsMaterial.hash ] : [ ]).concat(programSetup.getHash ? programSetup.getHash() : [ ]).join(";");
142
- const hash = getHash();
143
- const getValid = () => hash === getHash();
144
-
145
- const geometryParameters = renderingAttributes.geometryParameters;
146
- const incrementDrawState = programSetup.incrementDrawState;
147
- const isShadowProgram = programSetup.isShadowProgram;
148
- const attributes = geometryParameters.attributes;
149
- const worldPositionAttribute = attributes.position.world;
150
- const clipPos = "clipPos";
151
-
152
- const [ program, errors ] = programVariablesState.buildProgram(
153
- gl,
154
- layerType + " " + primitive + " " + programSetup.programName,
155
- {
156
- appendFragmentOutputs: programSetup.appendFragmentOutputs,
157
- cleanerEdges: programSetup.cleanerEdges,
158
- clipPos: clipPos,
159
- clippableTest: (function() {
160
- const vClippable = programVariables.createVarying("float", "vClippable", () => `${attributes.clippable} ? 1.0 : 0.0`, "flat");
161
- return () => `${vClippable} > 0.0`;
162
- })(),
163
- clippingCaps: programSetup.clippingCaps,
164
- crossSections: scene.crossSections,
165
- discardPoints: setupPoints && pointsMaterial.roundPoints,
166
- getGammaFactor: scene.gammaOutput && (() => scene.gammaFactor),
167
- getLogDepth: programSetup.getLogDepth,
168
- getPointSize: (function() {
169
- const addends = [ ];
170
- if (setupPoints) {
171
- const pointSize = programVariables.createUniform("float", "pointSize", (set) => set(pointsMaterial.pointSize));
172
- if (pointsMaterial.perspectivePoints) {
173
- const nearPlaneHeight = programVariables.createUniform("float", "nearPlaneHeight", (set, state) => set(state.legacyFrameCtx.nearPlaneHeight));
174
- const minVal = `${Math.floor(pointsMaterial.minPerspectivePointSize)}.0`;
175
- const maxVal = `${Math.floor(pointsMaterial.maxPerspectivePointSize)}.0`;
176
- addends.push(`clamp((${nearPlaneHeight} * ${pointSize}) / gl_Position.w, ${minVal}, ${maxVal})`);
177
- } else {
178
- addends.push(pointSize);
179
- }
180
- } else if (subGeometry && subGeometry.vertices) {
181
- addends.push("1.0");
182
- }
183
- programSetup.incPointSizeBy10 && (primitive === "points") && addends.push("10.0");
184
- return (addends.length > 0) && (() => addends.join(" + "));
185
- })(),
186
- getVertexData: () => {
187
- const colorA = attributes.color;
188
- const flag = attributes.flags[programSetup.renderPassFlag];
189
- const renderPass = programVariables.createUniform("int", "renderPass", (set, state) => set(state.renderPass));
190
- const flagTest = (isShadowProgram
191
- ? `(${flag} <= 0) || (${colorA}.a < 1.0)`
192
- : `${flag} != ${renderPass}`);
193
-
194
- const afterFlagsColorLines = [
195
- `if (${flagTest}) {`,
196
- " gl_Position = vec4(0.0, 0.0, 0.0, 0.0);", // Cull vertex
197
- " return;",
198
- "}"
199
- ].concat(
200
- ((! renderingAttributes.dontCullOnAlphaZero) && (! programSetup.dontCullOnAlphaZero))
201
- ? [
202
- `if (${colorA}.a == 0.0) {`,
203
- " gl_Position = vec4(0.0, 0.0, 0.0, 1.0);", // Cull vertex
204
- " return;",
205
- "}"
206
- ]
207
- : [ ]
208
- ).concat(
209
- (programSetup.filterIntensityRange && (primitive === "points") && pointsMaterial.filterIntensity)
210
- ? (function () {
211
- const intensityRange = programVariables.createUniform("vec2", "intensityRange", (set) => {
212
- tempVec2[0] = pointsMaterial.minIntensity;
213
- tempVec2[1] = pointsMaterial.maxIntensity;
214
- set(tempVec2);
215
- });
216
- return [
217
- `if ((${colorA}.a < ${intensityRange}[0]) || (${colorA}.a > ${intensityRange}[1])) {`,
218
- " gl_Position = vec4(0.0, 0.0, 0.0, 0.0);", // Cull vertex
219
- " return;",
220
- "}"
221
- ];
222
- })()
223
- : [ ]);
224
-
225
- const vertexData = [ ];
226
- renderingAttributes.ensureColorAndFlagAvailable && renderingAttributes.ensureColorAndFlagAvailable(vertexData);
227
- afterFlagsColorLines.forEach(line => vertexData.push(line));
228
- renderingAttributes.appendVertexData(vertexData);
229
- const viewPosition = geometryParameters.attributes.position.view;
230
- vertexData.push(`vec4 ${viewPosition} = ${geometryParameters.viewMatrix} * ${worldPositionAttribute};`);
231
- vertexData.push(`vec4 ${clipPos} = ${geometryParameters.projMatrix} * ${viewPosition};`);
232
- return vertexData;
233
- },
234
- projMatrix: geometryParameters.projMatrix,
235
- sectionPlanesState: scene._sectionPlanesState,
236
- testPerspectiveForGl_FragDepth: ((primitive !== "points") && (primitive !== "lines")) || subGeometry,
237
- usePickClipPos: usePickClipPos,
238
- worldPositionAttribute: worldPositionAttribute
239
- });
240
-
241
- if (errors) {
242
- console.error(errors);
243
- return {
244
- getValid: getValid,
245
- destroy: () => { },
246
- drawLayer: (frameCtx, layer, renderPass) => { }
247
- };
248
- } else {
249
- return {
250
- getValid: getValid,
251
- destroy: () => program.destroy(),
252
- drawLayer: (frameCtx, layer, renderPass) => {
253
- if (frameCtx.lastProgramId !== program.id) {
254
- frameCtx.lastProgramId = program.id;
255
- program.bind();
256
- }
257
-
258
- const origin = layer.origin;
259
- const model = layer.model;
260
- const viewParams = frameCtx.viewParams;
261
- const rtcOrigin = tempVec3;
262
- math.transformPoint3(model.matrix, origin, rtcOrigin);
263
-
264
- const viewMatrix = viewParams.viewMatrix;
265
- const projMatrix = viewParams.projMatrix;
266
-
267
- if (frameCtx.snapPickOrigin) {
268
- frameCtx.snapPickOrigin[0] = rtcOrigin[0];
269
- frameCtx.snapPickOrigin[1] = rtcOrigin[1];
270
- frameCtx.snapPickOrigin[2] = rtcOrigin[2];
271
- }
272
-
273
- const state = {
274
- legacyFrameCtx: frameCtx,
275
- layerTextureSet: layer.layerTextureSet,
276
- mesh: {
277
- layerIndex: layer.layerIndex,
278
- origin: rtcOrigin,
279
- renderFlags: { sectionPlanesActivePerLayer: model.renderFlags.sectionPlanesActivePerLayer },
280
- },
281
- renderPass: renderPass,
282
- view: {
283
- eye: viewParams.eye,
284
- far: viewParams.far,
285
- projMatrix: projMatrix,
286
- viewMatrix: math.compareVec3(rtcOrigin, vec3zero) ? viewMatrix : createRTCViewMat(viewMatrix, rtcOrigin, tempMat4),
287
- viewNormalMatrix: viewParams.viewNormalMatrix
288
- }
289
- };
290
-
291
- program.inputSetters.setUniforms(frameCtx, state);
292
-
293
- layer.drawCalls[subGeometry ? (subGeometry.vertices ? "drawVertices" : "drawEdges") : "drawSurface"](
294
- program.inputSetters.attributesHash,
295
- renderingAttributes.layerTypeInputs,
296
- {
297
- projMatrix: projMatrix,
298
- viewMatrix: math.compareVec3(rtcOrigin, vec3zero) ? viewMatrix : createRTCViewMat(viewMatrix, rtcOrigin, tempMat4),
299
- viewNormalMatrix: viewParams.viewNormalMatrix,
300
- eye: viewParams.eye
301
- });
302
-
303
- if (incrementDrawState) {
304
- frameCtx.drawElements++;
305
- }
306
- }
307
- };
308
- }
309
- });
310
- };
311
- let renderer = isEager && instantiate();
312
- return {
313
- drawLayer: (frameCtx, layer, renderPass) => {
314
- if (! renderer) {
315
- renderer = instantiate();
316
- }
317
- renderer.drawLayer(frameCtx, layer, renderPass);
318
- },
319
- revalidate: force => {
320
- if (renderer && (force || (! renderer.getValid()))) {
321
- renderer.destroy();
322
- renderer = isEager && instantiate();
323
- }
324
- }
325
- };
326
- };
327
-
328
- // Pre-initialize certain renderers that would otherwise be lazy-initialised on user interaction,
329
- // such as picking or emphasis, so that there is no delay when user first begins interacting with the viewer.
330
- const eager = (createProgramSetup, subGeometry) => wrapRenderer(createProgramSetup, subGeometry, true);
331
- const lazy = (createProgramSetup, subGeometry) => wrapRenderer(createProgramSetup, subGeometry, false);
332
-
333
- const makeColorProgram = (vars, geo, lights, sao) => ColorProgram(vars, geo, scene.logarithmicDepthBufferEnabled, lights, sao, primitive);
334
-
335
- const makePickDepthProgram = (vars, geo, c) => c(PickDepthProgram(vars, geo, scene.logarithmicDepthBufferEnabled), true);
336
- const makePickMeshProgram = (vars, geo, c) => c(PickMeshProgram(vars, geo, scene.logarithmicDepthBufferEnabled), true);
337
- const makePickNormalsProgram = (vars, geo, c, isFlat) => c(PickNormalsProgram(vars, geo, scene.logarithmicDepthBufferEnabled, isFlat), true);
338
-
339
- const makeSnapProgram = (vars, geo, c, isSnapInit, isPoints) => c(SnapProgram(vars, geo, isSnapInit, isPoints), true);
340
-
341
- if (primitive === "points") {
342
- cache[sceneId] = {
343
- colorRenderers: { "sao-": { "vertex": lazy((vars, geo, c) => c(makeColorProgram(vars, geo, null, null))) } },
344
- occlusionRenderer: lazy((vars, geo, c) => c(OcclusionProgram(vars, scene.logarithmicDepthBufferEnabled))),
345
- pickDepthRenderer: lazy(makePickDepthProgram),
346
- pickMeshRenderer: lazy(makePickMeshProgram),
347
- // VBOBatchingPointsShadowRenderer has been implemented by 14e973df6268369b00baef60e468939e062ac320,
348
- // but never used (and probably not maintained), as opposed to VBOInstancingPointsShadowRenderer in the same commit
349
- // drawShadow has been nop in VBO point layers
350
- // shadowRenderer: instancing && lazy((vars, geo, c) => c(ShadowProgram(scene.logarithmicDepthBufferEnabled))),
351
- silhouetteRenderer: lazy((vars, geo, c) => c(SilhouetteProgram(vars, geo, scene.logarithmicDepthBufferEnabled, true))),
352
- snapInitRenderer: lazy((vars, geo, c) => makeSnapProgram(vars, geo, c, true, true)),
353
- snapVertexRenderer: lazy((vars, geo, c) => makeSnapProgram(vars, geo, c, false, true), { vertices: true })
354
- };
355
- } else if (primitive === "lines") {
356
- cache[sceneId] = {
357
- colorRenderers: { "sao-": { "vertex": lazy((vars, geo, c) => c(makeColorProgram(vars, geo, null, null))) } },
358
- silhouetteRenderer: lazy((vars, geo, c) => c(SilhouetteProgram(vars, geo, scene.logarithmicDepthBufferEnabled, true))),
359
- snapInitRenderer: lazy((vars, geo, c) => makeSnapProgram(vars, geo, c, true, false)),
360
- snapEdgeRenderer: lazy((vars, geo, c) => makeSnapProgram(vars, geo, c, false, false), { vertices: false }),
361
- snapVertexRenderer: lazy((vars, geo, c) => makeSnapProgram(vars, geo, c, false, false), { vertices: true })
362
- };
363
- } else {
364
- cache[sceneId] = {
365
- colorRenderers: (function() {
366
- // WARNING: Changing `useMaps' to `true' for DTX might have unexpected consequences while binding textures, as the DTX texture binding mechanism doesn't rely on `frameCtx.textureUnit` the way VBO does (see setSAORenderState);
367
- const createLights = vars => createLightSetup(vars, scene._lightsState);
368
- const createSAO = vars => {
369
- const uSAOParams = vars.createUniform("vec4", "uSAOParams", (set, state) => set(state.legacyFrameCtx.saoParams));
370
- const uOcclusionTexture = setupTexture(vars, "sampler2D", "uOcclusionTexture", LinearEncoding, (set, state) => set(state.legacyFrameCtx.occlusionTexture));
371
- return {
372
- getAmbient: (gl_FragCoord) => {
373
- // Doing SAO blend in the main solid fill draw shader just so that edge lines can be drawn over the top
374
- // Would be more efficient to defer this, then render lines later, using same depth buffer for Z-reject
375
- const uv = `${gl_FragCoord}.xy / ${uSAOParams}.xy`; // / viewportWH
376
- const blendCutoff = `${uSAOParams}.z`;
377
- const blendFactor = `${uSAOParams}.w`;
378
- const unPackFactors = "(255. / 256.) / vec4(256. * 256. * 256., 256. * 256., 256., 1.)";
379
- return `(smoothstep(${blendCutoff}, 1.0, dot(${uOcclusionTexture(uv)}, ${unPackFactors})) * ${blendFactor})`;
380
- }
381
- };
382
- };
383
- const saoRenderers = function(useSao) {
384
- const makeColorTextureProgram = (vars, geo, useAlphaCutoff) => ColorTextureProgram(vars, geo, scene, createLights(vars), useSao && createSAO(vars), useAlphaCutoff, scene.gammaOutput); // If gammaOutput set, then it expects that all textures and colors need to be outputted in premultiplied gamma. Default is false.
385
- return {
386
- "PBR": pbrSupported && lazy((vars, geo, c) => c(PBRProgram(vars, geo, scene, createLights(vars), useSao && createSAO(vars)))),
387
- "texture": colorTextureSupported && {
388
- "alphaCutoff-": lazy((vars, geo, c) => c(makeColorTextureProgram(vars, geo, false))),
389
- "alphaCutoff+": lazy((vars, geo, c) => c(makeColorTextureProgram(vars, geo, true)))
390
- },
391
- "vertex": (surfaceHasNormals
392
- ? lazy((vars, geo, c) => c(makeColorProgram(vars, geo, createLights(vars), useSao && createSAO(vars))))
393
- : lazy((vars, geo, c) => c(FlatColorProgram(vars, geo, scene.logarithmicDepthBufferEnabled, createLights(vars), useSao && createSAO(vars)))))
394
- };
395
- };
396
- return {
397
- "sao-": saoRenderers(false),
398
- "sao+": saoEnabled && saoRenderers(true)
399
- };
400
- })(),
401
- depthRenderer: lazy((vars, geo, c) => c(DepthProgram(vars, geo, scene.logarithmicDepthBufferEnabled))),
402
- edgesRenderers: {
403
- uniform: lazy((vars, geo, c) => c(EdgesProgram(vars, geo, scene.logarithmicDepthBufferEnabled, true)), { vertices: false }),
404
- vertex: lazy((vars, geo, c) => c(EdgesProgram(vars, geo, scene.logarithmicDepthBufferEnabled, false)), { vertices: false })
405
- },
406
- occlusionRenderer: lazy((vars, geo, c) => c(OcclusionProgram(vars, scene.logarithmicDepthBufferEnabled))),
407
- pickDepthRenderer: eager(makePickDepthProgram),
408
- pickMeshRenderer: eager(makePickMeshProgram),
409
- pickNormalsFlatRenderer: eager((vars, geo, c) => makePickNormalsProgram(vars, geo, c, true)),
410
- pickNormalsRenderer: eager((vars, geo, c) => makePickNormalsProgram(vars, geo, c, false)),
411
- shadowRenderer: lazy((vars, geo, c) => c(ShadowProgram(vars, scene))),
412
- silhouetteRenderer: eager((vars, geo, c) => c(SilhouetteProgram(vars, geo, scene.logarithmicDepthBufferEnabled, false))),
413
- snapInitRenderer: eager((vars, geo, c) => makeSnapProgram(vars, geo, c, true, false)),
414
- snapEdgeRenderer: eager((vars, geo, c) => makeSnapProgram(vars, geo, c, false, false), { vertices: false }),
415
- snapVertexRenderer: eager((vars, geo, c) => makeSnapProgram(vars, geo, c, false, false), { vertices: true })
416
- };
417
- }
418
-
419
- const revalidateAll = force => {
420
- (function rec(obj) {
421
- if (obj.revalidate) {
422
- obj.revalidate(force);
423
- } else {
424
- Object.values(obj).forEach(v => v && rec(v));
425
- }
426
- })(cache[sceneId]);
427
- };
428
- const compile = () => revalidateAll(false);
429
- compile();
430
- scene.on("compile", compile);
431
- scene.on("destroyed", () => {
432
- delete cache[sceneId];
433
- });
434
- }
435
- return cache[sceneId];
436
- };
437
- })();
438
-
439
- export class Layer {
440
-
441
- constructor(model, primitive, origin) {
442
-
443
- this.model = model;
444
- this.primitive = primitive;
445
- this.origin = origin;
446
-
447
- this._meshes = [];
448
- // The axis-aligned World-space boundary of this Layer's positions.
449
- this._aabb = math.collapseAABB3();
450
- this._aabbDirty = true;
451
- }
452
-
453
- finalize() {
454
- if (! this._compiledPortions) {
455
- this._compiledPortions = this.compilePortions();
456
- this.solid = this._compiledPortions.solid;
457
- this.sortId = this._compiledPortions.sortId;
458
- this.layerTextureSet = this._compiledPortions.layerTextureSet;
459
- this.drawCalls = this._compiledPortions.drawCalls;
460
- this._renderers = this._compiledPortions.renderers;
461
- this._setFlags = this._compiledPortions.setFlags;
462
-
463
- this.setColor = this._compiledPortions.setColor;
464
- this.setMatrix = this._compiledPortions.setMatrix;
465
- this.setOffset = this._compiledPortions.setOffset;
466
-
467
- this.getEachIndex = this._compiledPortions.getEachIndex;
468
- this.getEachVertex = this._compiledPortions.getEachVertex;
469
- this.readGeometryData = this._compiledPortions.readGeometryData;
470
- this.precisionRayPickSurface = this._compiledPortions.precisionRayPickSurface;
471
-
472
- // These counts are used to avoid unnecessary render passes
473
- this._countsByFlag = { };
474
- const setupFlagCount = (entityFlag, modelCountProperty) => {
475
- const cnt = {
476
- count: 0,
477
- fromFlags: (flags, onlyIncrement) => {
478
- if (flags & entityFlag) {
479
- cnt.count++;
480
- this.model[modelCountProperty]++;
481
- } else if (! onlyIncrement) {
482
- cnt.count--;
483
- this.model[modelCountProperty]--;
484
- }
485
- }
486
- };
487
- this._countsByFlag[entityFlag] = cnt;
488
- };
489
- setupFlagCount(ENTITY_FLAGS.VISIBLE, "numVisibleLayerPortions");
490
- setupFlagCount(ENTITY_FLAGS.CULLED, "numCulledLayerPortions");
491
- setupFlagCount(ENTITY_FLAGS.PICKABLE, "numPickableLayerPortions");
492
- setupFlagCount(ENTITY_FLAGS.CLIPPABLE, "numClippableLayerPortions");
493
- setupFlagCount(ENTITY_FLAGS.XRAYED, "numXRayedLayerPortions");
494
- setupFlagCount(ENTITY_FLAGS.HIGHLIGHTED, "numHighlightedLayerPortions");
495
- setupFlagCount(ENTITY_FLAGS.SELECTED, "numSelectedLayerPortions");
496
- if (this._renderers.edgesRenderers) {
497
- setupFlagCount(ENTITY_FLAGS.EDGES, "numEdgesLayerPortions");
498
- }
499
-
500
- // Optimize initFlags to not require Object.values call each time (adds up a lot)
501
- this._countsByFlagArr = Object.values(this._countsByFlag);
502
- this._numTransparentLayerPortions = 0;
503
- }
504
- }
505
-
506
- aabbChanged() { this._aabbDirty = true; }
507
-
508
- __drawLayer(renderFlags, frameCtx, renderer, pass) {
509
- if ((this._countsByFlag[ENTITY_FLAGS.CULLED].count < this._portions.length) && (this._countsByFlag[ENTITY_FLAGS.VISIBLE].count > 0)) {
510
- const backfacePasses = (this.primitive !== "points") && (this.primitive !== "lines") && [
511
- RENDER_PASSES.COLOR_OPAQUE,
512
- RENDER_PASSES.COLOR_TRANSPARENT,
513
- RENDER_PASSES.PICK,
514
- RENDER_PASSES.SILHOUETTE_HIGHLIGHTED,
515
- RENDER_PASSES.SILHOUETTE_SELECTED,
516
- RENDER_PASSES.SILHOUETTE_XRAYED,
517
- ];
518
- if (backfacePasses && backfacePasses.includes(pass)) {
519
- // _updateBackfaceCull
520
- const backfaces = true; // See XCD-230
521
- if (frameCtx.backfaces !== backfaces) {
522
- const gl = this.model.scene.canvas.gl;
523
- if (backfaces) {
524
- gl.disable(gl.CULL_FACE);
525
- } else {
526
- gl.enable(gl.CULL_FACE);
527
- }
528
- frameCtx.backfaces = backfaces;
529
- }
530
- }
531
- frameCtx.textureUnit = 0; // WIP Maybe only for (! snap)?
532
- renderer.drawLayer(frameCtx, this, pass);
533
- }
534
- }
535
-
536
- __setVec4FromMaterialColorAlpha(color, alpha, dst) {
537
- dst[0] = color[0];
538
- dst[1] = color[1];
539
- dst[2] = color[2];
540
- dst[3] = alpha;
541
- return dst;
542
- }
543
-
544
- // ---------------------- COLOR RENDERING -----------------------------------
545
-
546
- __drawColor(renderFlags, frameCtx, renderOpaque) {
547
- if ((renderOpaque ? (this._numTransparentLayerPortions < this._portions.length) : (this._numTransparentLayerPortions > 0))
548
- &&
549
- (this._countsByFlag[ENTITY_FLAGS.XRAYED].count < this._portions.length)) {
550
- const saoRenderer = (renderOpaque && frameCtx.withSAO && this._renderers.colorRenderers["sao+"]) || this._renderers.colorRenderers["sao-"];
551
- const renderer = ((frameCtx.pbrEnabled && saoRenderer["PBR"])
552
- ? saoRenderer["PBR"]
553
- : ((frameCtx.colorTextureEnabled && saoRenderer["texture"])
554
- ? saoRenderer["texture"][(this.layerTextureSet && (typeof(this.layerTextureSet.alphaCutoff) === "number")) ? "alphaCutoff+" : "alphaCutoff-"]
555
- : saoRenderer["vertex"]));
556
- const pass = renderOpaque ? RENDER_PASSES.COLOR_OPAQUE : RENDER_PASSES.COLOR_TRANSPARENT;
557
- this.__drawLayer(renderFlags, frameCtx, renderer, pass);
558
- }
559
- }
560
-
561
- drawColorOpaque(renderFlags, frameCtx) {
562
- this.__drawColor(renderFlags, frameCtx, true);
563
- }
564
-
565
- drawColorTransparent(renderFlags, frameCtx) {
566
- this.__drawColor(renderFlags, frameCtx, false);
567
- }
568
-
569
- // ---------------------- RENDERING SAO POST EFFECT TARGETS --------------
570
-
571
- drawDepth(renderFlags, frameCtx) {
572
- // Assume whatever post-effect uses depth (eg SAO) does not apply to transparent objects
573
- const renderer = this._renderers.depthRenderer;
574
- if (renderer && (this._numTransparentLayerPortions < this._portions.length) && (this._countsByFlag[ENTITY_FLAGS.XRAYED].count < this._portions.length)) {
575
- this.__drawLayer(renderFlags, frameCtx, renderer, RENDER_PASSES.COLOR_OPAQUE);
576
- }
577
- }
578
-
579
- // ---------------------- SILHOUETTE RENDERING -----------------------------------
580
-
581
- __drawSilhouette(renderFlags, frameCtx, material, renderPass) {
582
- frameCtx.programColor = this.__setVec4FromMaterialColorAlpha(material.fillColor, material.fillAlpha, tempVec4);
583
- this.__drawLayer(renderFlags, frameCtx, this._renderers.silhouetteRenderer, renderPass);
584
- }
585
-
586
- drawSilhouetteXRayed(renderFlags, frameCtx) {
587
- if (this._countsByFlag[ENTITY_FLAGS.XRAYED].count > 0) {
588
- this.__drawSilhouette(renderFlags, frameCtx, this.model.scene.xrayMaterial, RENDER_PASSES.SILHOUETTE_XRAYED);
589
- }
590
- }
591
-
592
- drawSilhouetteHighlighted(renderFlags, frameCtx) {
593
- if (this._countsByFlag[ENTITY_FLAGS.HIGHLIGHTED].count > 0) {
594
- this.__drawSilhouette(renderFlags, frameCtx, this.model.scene.highlightMaterial, RENDER_PASSES.SILHOUETTE_HIGHLIGHTED);
595
- }
596
- }
597
-
598
- drawSilhouetteSelected(renderFlags, frameCtx) {
599
- if (this._countsByFlag[ENTITY_FLAGS.SELECTED].count > 0) {
600
- this.__drawSilhouette(renderFlags, frameCtx, this.model.scene.selectedMaterial, RENDER_PASSES.SILHOUETTE_SELECTED);
601
- }
602
- }
603
-
604
- // ---------------------- EDGES RENDERING -----------------------------------
605
-
606
- __drawVertexEdges(renderFlags, frameCtx, renderPass) {
607
- const renderer = this._renderers.edgesRenderers && this._renderers.edgesRenderers.vertex;
608
- if (renderer && (this._countsByFlag[ENTITY_FLAGS.EDGES].count > 0)) {
609
- this.__drawLayer(renderFlags, frameCtx, renderer, renderPass);
610
- }
611
- }
612
-
613
- drawEdgesColorOpaque(renderFlags, frameCtx) {
614
- if (this._compiledPortions.edgesColorOpaqueAllowed()) {
615
- this.__drawVertexEdges(renderFlags, frameCtx, RENDER_PASSES.EDGES_COLOR_OPAQUE);
616
- }
617
- }
618
-
619
- drawEdgesColorTransparent(renderFlags, frameCtx) {
620
- if (this._numTransparentLayerPortions > 0) {
621
- this.__drawVertexEdges(renderFlags, frameCtx, RENDER_PASSES.EDGES_COLOR_TRANSPARENT);
622
- }
623
- }
624
-
625
- __drawUniformEdges(renderFlags, frameCtx, material, renderPass) {
626
- const renderer = this._renderers.edgesRenderers && this._renderers.edgesRenderers.uniform;
627
- if (renderer) {
628
- frameCtx.programColor = this.__setVec4FromMaterialColorAlpha(material.edgeColor, material.edgeAlpha, tempVec4);
629
- this.__drawLayer(renderFlags, frameCtx, renderer, renderPass);
630
- }
631
- }
632
-
633
- drawEdgesHighlighted(renderFlags, frameCtx) {
634
- if (this._countsByFlag[ENTITY_FLAGS.HIGHLIGHTED].count > 0) {
635
- this.__drawUniformEdges(renderFlags, frameCtx, this.model.scene.highlightMaterial, RENDER_PASSES.EDGES_HIGHLIGHTED);
636
- }
637
- }
638
-
639
- drawEdgesSelected(renderFlags, frameCtx) {
640
- if (this._countsByFlag[ENTITY_FLAGS.SELECTED].count > 0) {
641
- this.__drawUniformEdges(renderFlags, frameCtx, this.model.scene.selectedMaterial, RENDER_PASSES.EDGES_SELECTED);
642
- }
643
- }
644
-
645
- drawEdgesXRayed(renderFlags, frameCtx) {
646
- if (this._countsByFlag[ENTITY_FLAGS.XRAYED].count > 0) {
647
- this.__drawUniformEdges(renderFlags, frameCtx, this.model.scene.xrayMaterial, RENDER_PASSES.EDGES_XRAYED);
648
- }
649
- }
650
-
651
- //---- PICKING ----------------------------------------------------------------------------------------------------
652
-
653
- __drawPick(renderFlags, frameCtx, renderer) {
654
- if (renderer) {
655
- this.__drawLayer(renderFlags, frameCtx, renderer, RENDER_PASSES.PICK);
656
- }
657
- }
658
-
659
- drawPickMesh(renderFlags, frameCtx) {
660
- this.__drawPick(renderFlags, frameCtx, this._renderers.pickMeshRenderer);
661
- }
662
-
663
- drawPickDepths(renderFlags, frameCtx) {
664
- this.__drawPick(renderFlags, frameCtx, this._renderers.pickDepthRenderer);
665
- }
666
-
667
- drawPickNormals(renderFlags, frameCtx) {
668
- const renderer = (false // TODO for VBO: this._state.normalsBuf
669
- ? this._renderers.pickNormalsRenderer
670
- : this._renderers.pickNormalsFlatRenderer);
671
- this.__drawPick(renderFlags, frameCtx, renderer);
672
- }
673
-
674
- drawSnap(renderFlags, frameCtx, isSnapInit) {
675
- frameCtx.snapPickOrigin = [0, 0, 0];
676
-
677
- if (this._aabbDirty) { // Per-layer AABB for best RTC accuracy
678
- math.collapseAABB3(this._aabb);
679
- this._meshes.forEach(m => math.expandAABB3(this._aabb, m.aabb));
680
- this._aabbDirty = false;
681
- }
682
-
683
- const aabb = this._aabb;
684
- frameCtx.snapPickCoordinateScale = math.mulVec3Scalar(
685
- safeInvVec3([ aabb[3] - aabb[0], aabb[4] - aabb[1], aabb[5] - aabb[2] ]),
686
- math.MAX_INT);
687
-
688
- const renderer = isSnapInit ? this._renderers.snapInitRenderer : ((frameCtx.snapMode === "edge") ? this._renderers.snapEdgeRenderer : this._renderers.snapVertexRenderer);
689
- this.__drawPick(renderFlags, frameCtx, renderer);
690
-
691
- frameCtx.snapPickLayerParams.push({
692
- origin: frameCtx.snapPickOrigin.slice(),
693
- coordinateScale: safeInvVec3(frameCtx.snapPickCoordinateScale)
694
- });
695
- }
696
-
697
-
698
- drawOcclusion(renderFlags, frameCtx) {
699
- const renderer = this._renderers.occlusionRenderer;
700
- if (renderer) {
701
- this.__drawLayer(renderFlags, frameCtx, renderer, RENDER_PASSES.COLOR_OPAQUE);
702
- }
703
- }
704
-
705
- drawShadow(renderFlags, frameCtx) {
706
- const renderer = this._renderers.shadowRenderer;
707
- if (renderer) {
708
- this.__drawLayer(renderFlags, frameCtx, renderer, RENDER_PASSES.COLOR_OPAQUE);
709
- }
710
- }
711
-
712
-
713
- initFlags(portionId, flags, transparent) {
714
- this._countsByFlagArr.forEach(cnt => cnt.fromFlags(flags, true));
715
-
716
- if (transparent) {
717
- this._numTransparentLayerPortions++;
718
- this.model.numTransparentLayerPortions++;
719
- }
720
- const deferred = (this.primitive !== "points");
721
- this._setFlags(portionId, flags, transparent, deferred);
722
- this._compiledPortions.setFlags2(portionId, flags, deferred);
723
- }
724
-
725
- flushInitFlags() {
726
- this._compiledPortions.setDeferredFlags();
727
- }
728
-
729
- setVisible(portionId, flags, transparent) {
730
- this._countsByFlag[ENTITY_FLAGS.VISIBLE].fromFlags(flags);
731
- this._setFlags(portionId, flags, transparent);
732
- }
733
-
734
- setCulled(portionId, flags, transparent) {
735
- this._countsByFlag[ENTITY_FLAGS.CULLED].fromFlags(flags);
736
- this._setFlags(portionId, flags, transparent);
737
- }
738
-
739
- setPickable(portionId, flags, transparent) {
740
- this._countsByFlag[ENTITY_FLAGS.PICKABLE].fromFlags(flags);
741
- this._setFlags(portionId, flags, transparent);
742
- }
743
-
744
- setClippable(portionId, flags) {
745
- this._countsByFlag[ENTITY_FLAGS.CLIPPABLE].fromFlags(flags);
746
- this._compiledPortions.setClippableFlags(portionId, flags);
747
- }
748
-
749
- setCollidable(portionId, flags) {
750
- }
751
-
752
- setXRayed(portionId, flags, transparent) {
753
- this._countsByFlag[ENTITY_FLAGS.XRAYED].fromFlags(flags);
754
- this._setFlags(portionId, flags, transparent);
755
- }
756
-
757
- setHighlighted(portionId, flags, transparent) {
758
- this._countsByFlag[ENTITY_FLAGS.HIGHLIGHTED].fromFlags(flags);
759
- this._setFlags(portionId, flags, transparent);
760
- }
761
-
762
- setSelected(portionId, flags, transparent) {
763
- this._countsByFlag[ENTITY_FLAGS.SELECTED].fromFlags(flags);
764
- this._setFlags(portionId, flags, transparent);
765
- }
766
-
767
- setEdges(portionId, flags, transparent) {
768
- if (this._countsByFlag[ENTITY_FLAGS.EDGES]) {
769
- this._countsByFlag[ENTITY_FLAGS.EDGES].fromFlags(flags);
770
- this._setFlags(portionId, flags, transparent);
771
- }
772
- }
773
-
774
- setTransparent(portionId, flags, transparent) {
775
- if (transparent) {
776
- this._numTransparentLayerPortions++;
777
- this.model.numTransparentLayerPortions++;
778
- } else {
779
- this._numTransparentLayerPortions--;
780
- this.model.numTransparentLayerPortions--;
781
- }
782
- this._setFlags(portionId, flags, transparent);
783
- }
784
-
785
- destroy() {
786
- this._compiledPortions && this._compiledPortions.destroy();
787
- }
788
- }