@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,786 +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
- this._numTransparentLayerPortions = 0;
501
- }
502
- }
503
-
504
- aabbChanged() { this._aabbDirty = true; }
505
-
506
- __drawLayer(renderFlags, frameCtx, renderer, pass) {
507
- if ((this._countsByFlag[ENTITY_FLAGS.CULLED].count < this._portions.length) && (this._countsByFlag[ENTITY_FLAGS.VISIBLE].count > 0)) {
508
- const backfacePasses = (this.primitive !== "points") && (this.primitive !== "lines") && [
509
- RENDER_PASSES.COLOR_OPAQUE,
510
- RENDER_PASSES.COLOR_TRANSPARENT,
511
- RENDER_PASSES.PICK,
512
- RENDER_PASSES.SILHOUETTE_HIGHLIGHTED,
513
- RENDER_PASSES.SILHOUETTE_SELECTED,
514
- RENDER_PASSES.SILHOUETTE_XRAYED,
515
- ];
516
- if (backfacePasses && backfacePasses.includes(pass)) {
517
- // _updateBackfaceCull
518
- const backfaces = true; // See XCD-230
519
- if (frameCtx.backfaces !== backfaces) {
520
- const gl = this.model.scene.canvas.gl;
521
- if (backfaces) {
522
- gl.disable(gl.CULL_FACE);
523
- } else {
524
- gl.enable(gl.CULL_FACE);
525
- }
526
- frameCtx.backfaces = backfaces;
527
- }
528
- }
529
- frameCtx.textureUnit = 0; // WIP Maybe only for (! snap)?
530
- renderer.drawLayer(frameCtx, this, pass);
531
- }
532
- }
533
-
534
- __setVec4FromMaterialColorAlpha(color, alpha, dst) {
535
- dst[0] = color[0];
536
- dst[1] = color[1];
537
- dst[2] = color[2];
538
- dst[3] = alpha;
539
- return dst;
540
- }
541
-
542
- // ---------------------- COLOR RENDERING -----------------------------------
543
-
544
- __drawColor(renderFlags, frameCtx, renderOpaque) {
545
- if ((renderOpaque ? (this._numTransparentLayerPortions < this._portions.length) : (this._numTransparentLayerPortions > 0))
546
- &&
547
- (this._countsByFlag[ENTITY_FLAGS.XRAYED].count < this._portions.length)) {
548
- const saoRenderer = (renderOpaque && frameCtx.withSAO && this._renderers.colorRenderers["sao+"]) || this._renderers.colorRenderers["sao-"];
549
- const renderer = ((frameCtx.pbrEnabled && saoRenderer["PBR"])
550
- ? saoRenderer["PBR"]
551
- : ((frameCtx.colorTextureEnabled && saoRenderer["texture"])
552
- ? saoRenderer["texture"][(this.layerTextureSet && (typeof(this.layerTextureSet.alphaCutoff) === "number")) ? "alphaCutoff+" : "alphaCutoff-"]
553
- : saoRenderer["vertex"]));
554
- const pass = renderOpaque ? RENDER_PASSES.COLOR_OPAQUE : RENDER_PASSES.COLOR_TRANSPARENT;
555
- this.__drawLayer(renderFlags, frameCtx, renderer, pass);
556
- }
557
- }
558
-
559
- drawColorOpaque(renderFlags, frameCtx) {
560
- this.__drawColor(renderFlags, frameCtx, true);
561
- }
562
-
563
- drawColorTransparent(renderFlags, frameCtx) {
564
- this.__drawColor(renderFlags, frameCtx, false);
565
- }
566
-
567
- // ---------------------- RENDERING SAO POST EFFECT TARGETS --------------
568
-
569
- drawDepth(renderFlags, frameCtx) {
570
- // Assume whatever post-effect uses depth (eg SAO) does not apply to transparent objects
571
- const renderer = this._renderers.depthRenderer;
572
- if (renderer && (this._numTransparentLayerPortions < this._portions.length) && (this._countsByFlag[ENTITY_FLAGS.XRAYED].count < this._portions.length)) {
573
- this.__drawLayer(renderFlags, frameCtx, renderer, RENDER_PASSES.COLOR_OPAQUE);
574
- }
575
- }
576
-
577
- // ---------------------- SILHOUETTE RENDERING -----------------------------------
578
-
579
- __drawSilhouette(renderFlags, frameCtx, material, renderPass) {
580
- frameCtx.programColor = this.__setVec4FromMaterialColorAlpha(material.fillColor, material.fillAlpha, tempVec4);
581
- this.__drawLayer(renderFlags, frameCtx, this._renderers.silhouetteRenderer, renderPass);
582
- }
583
-
584
- drawSilhouetteXRayed(renderFlags, frameCtx) {
585
- if (this._countsByFlag[ENTITY_FLAGS.XRAYED].count > 0) {
586
- this.__drawSilhouette(renderFlags, frameCtx, this.model.scene.xrayMaterial, RENDER_PASSES.SILHOUETTE_XRAYED);
587
- }
588
- }
589
-
590
- drawSilhouetteHighlighted(renderFlags, frameCtx) {
591
- if (this._countsByFlag[ENTITY_FLAGS.HIGHLIGHTED].count > 0) {
592
- this.__drawSilhouette(renderFlags, frameCtx, this.model.scene.highlightMaterial, RENDER_PASSES.SILHOUETTE_HIGHLIGHTED);
593
- }
594
- }
595
-
596
- drawSilhouetteSelected(renderFlags, frameCtx) {
597
- if (this._countsByFlag[ENTITY_FLAGS.SELECTED].count > 0) {
598
- this.__drawSilhouette(renderFlags, frameCtx, this.model.scene.selectedMaterial, RENDER_PASSES.SILHOUETTE_SELECTED);
599
- }
600
- }
601
-
602
- // ---------------------- EDGES RENDERING -----------------------------------
603
-
604
- __drawVertexEdges(renderFlags, frameCtx, renderPass) {
605
- const renderer = this._renderers.edgesRenderers && this._renderers.edgesRenderers.vertex;
606
- if (renderer && (this._countsByFlag[ENTITY_FLAGS.EDGES].count > 0)) {
607
- this.__drawLayer(renderFlags, frameCtx, renderer, renderPass);
608
- }
609
- }
610
-
611
- drawEdgesColorOpaque(renderFlags, frameCtx) {
612
- if (this._compiledPortions.edgesColorOpaqueAllowed()) {
613
- this.__drawVertexEdges(renderFlags, frameCtx, RENDER_PASSES.EDGES_COLOR_OPAQUE);
614
- }
615
- }
616
-
617
- drawEdgesColorTransparent(renderFlags, frameCtx) {
618
- if (this._numTransparentLayerPortions > 0) {
619
- this.__drawVertexEdges(renderFlags, frameCtx, RENDER_PASSES.EDGES_COLOR_TRANSPARENT);
620
- }
621
- }
622
-
623
- __drawUniformEdges(renderFlags, frameCtx, material, renderPass) {
624
- const renderer = this._renderers.edgesRenderers && this._renderers.edgesRenderers.uniform;
625
- if (renderer) {
626
- frameCtx.programColor = this.__setVec4FromMaterialColorAlpha(material.edgeColor, material.edgeAlpha, tempVec4);
627
- this.__drawLayer(renderFlags, frameCtx, renderer, renderPass);
628
- }
629
- }
630
-
631
- drawEdgesHighlighted(renderFlags, frameCtx) {
632
- if (this._countsByFlag[ENTITY_FLAGS.HIGHLIGHTED].count > 0) {
633
- this.__drawUniformEdges(renderFlags, frameCtx, this.model.scene.highlightMaterial, RENDER_PASSES.EDGES_HIGHLIGHTED);
634
- }
635
- }
636
-
637
- drawEdgesSelected(renderFlags, frameCtx) {
638
- if (this._countsByFlag[ENTITY_FLAGS.SELECTED].count > 0) {
639
- this.__drawUniformEdges(renderFlags, frameCtx, this.model.scene.selectedMaterial, RENDER_PASSES.EDGES_SELECTED);
640
- }
641
- }
642
-
643
- drawEdgesXRayed(renderFlags, frameCtx) {
644
- if (this._countsByFlag[ENTITY_FLAGS.XRAYED].count > 0) {
645
- this.__drawUniformEdges(renderFlags, frameCtx, this.model.scene.xrayMaterial, RENDER_PASSES.EDGES_XRAYED);
646
- }
647
- }
648
-
649
- //---- PICKING ----------------------------------------------------------------------------------------------------
650
-
651
- __drawPick(renderFlags, frameCtx, renderer) {
652
- if (renderer) {
653
- this.__drawLayer(renderFlags, frameCtx, renderer, RENDER_PASSES.PICK);
654
- }
655
- }
656
-
657
- drawPickMesh(renderFlags, frameCtx) {
658
- this.__drawPick(renderFlags, frameCtx, this._renderers.pickMeshRenderer);
659
- }
660
-
661
- drawPickDepths(renderFlags, frameCtx) {
662
- this.__drawPick(renderFlags, frameCtx, this._renderers.pickDepthRenderer);
663
- }
664
-
665
- drawPickNormals(renderFlags, frameCtx) {
666
- const renderer = (false // TODO for VBO: this._state.normalsBuf
667
- ? this._renderers.pickNormalsRenderer
668
- : this._renderers.pickNormalsFlatRenderer);
669
- this.__drawPick(renderFlags, frameCtx, renderer);
670
- }
671
-
672
- drawSnap(renderFlags, frameCtx, isSnapInit) {
673
- frameCtx.snapPickOrigin = [0, 0, 0];
674
-
675
- if (this._aabbDirty) { // Per-layer AABB for best RTC accuracy
676
- math.collapseAABB3(this._aabb);
677
- this._meshes.forEach(m => math.expandAABB3(this._aabb, m.aabb));
678
- this._aabbDirty = false;
679
- }
680
-
681
- const aabb = this._aabb;
682
- frameCtx.snapPickCoordinateScale = math.mulVec3Scalar(
683
- safeInvVec3([ aabb[3] - aabb[0], aabb[4] - aabb[1], aabb[5] - aabb[2] ]),
684
- math.MAX_INT);
685
-
686
- const renderer = isSnapInit ? this._renderers.snapInitRenderer : ((frameCtx.snapMode === "edge") ? this._renderers.snapEdgeRenderer : this._renderers.snapVertexRenderer);
687
- this.__drawPick(renderFlags, frameCtx, renderer);
688
-
689
- frameCtx.snapPickLayerParams.push({
690
- origin: frameCtx.snapPickOrigin.slice(),
691
- coordinateScale: safeInvVec3(frameCtx.snapPickCoordinateScale)
692
- });
693
- }
694
-
695
-
696
- drawOcclusion(renderFlags, frameCtx) {
697
- const renderer = this._renderers.occlusionRenderer;
698
- if (renderer) {
699
- this.__drawLayer(renderFlags, frameCtx, renderer, RENDER_PASSES.COLOR_OPAQUE);
700
- }
701
- }
702
-
703
- drawShadow(renderFlags, frameCtx) {
704
- const renderer = this._renderers.shadowRenderer;
705
- if (renderer) {
706
- this.__drawLayer(renderFlags, frameCtx, renderer, RENDER_PASSES.COLOR_OPAQUE);
707
- }
708
- }
709
-
710
-
711
- initFlags(portionId, flags, transparent) {
712
- Object.values(this._countsByFlag).forEach(cnt => cnt.fromFlags(flags, true));
713
-
714
- if (transparent) {
715
- this._numTransparentLayerPortions++;
716
- this.model.numTransparentLayerPortions++;
717
- }
718
- const deferred = (this.primitive !== "points");
719
- this._setFlags(portionId, flags, transparent, deferred);
720
- this._compiledPortions.setFlags2(portionId, flags, deferred);
721
- }
722
-
723
- flushInitFlags() {
724
- this._compiledPortions.setDeferredFlags();
725
- }
726
-
727
- setVisible(portionId, flags, transparent) {
728
- this._countsByFlag[ENTITY_FLAGS.VISIBLE].fromFlags(flags);
729
- this._setFlags(portionId, flags, transparent);
730
- }
731
-
732
- setCulled(portionId, flags, transparent) {
733
- this._countsByFlag[ENTITY_FLAGS.CULLED].fromFlags(flags);
734
- this._setFlags(portionId, flags, transparent);
735
- }
736
-
737
- setPickable(portionId, flags, transparent) {
738
- this._countsByFlag[ENTITY_FLAGS.PICKABLE].fromFlags(flags);
739
- this._setFlags(portionId, flags, transparent);
740
- }
741
-
742
- setClippable(portionId, flags) {
743
- this._countsByFlag[ENTITY_FLAGS.CLIPPABLE].fromFlags(flags);
744
- this._compiledPortions.setClippableFlags(portionId, flags);
745
- }
746
-
747
- setCollidable(portionId, flags) {
748
- }
749
-
750
- setXRayed(portionId, flags, transparent) {
751
- this._countsByFlag[ENTITY_FLAGS.XRAYED].fromFlags(flags);
752
- this._setFlags(portionId, flags, transparent);
753
- }
754
-
755
- setHighlighted(portionId, flags, transparent) {
756
- this._countsByFlag[ENTITY_FLAGS.HIGHLIGHTED].fromFlags(flags);
757
- this._setFlags(portionId, flags, transparent);
758
- }
759
-
760
- setSelected(portionId, flags, transparent) {
761
- this._countsByFlag[ENTITY_FLAGS.SELECTED].fromFlags(flags);
762
- this._setFlags(portionId, flags, transparent);
763
- }
764
-
765
- setEdges(portionId, flags, transparent) {
766
- if (this._countsByFlag[ENTITY_FLAGS.EDGES]) {
767
- this._countsByFlag[ENTITY_FLAGS.EDGES].fromFlags(flags);
768
- this._setFlags(portionId, flags, transparent);
769
- }
770
- }
771
-
772
- setTransparent(portionId, flags, transparent) {
773
- if (transparent) {
774
- this._numTransparentLayerPortions++;
775
- this.model.numTransparentLayerPortions++;
776
- } else {
777
- this._numTransparentLayerPortions--;
778
- this.model.numTransparentLayerPortions--;
779
- }
780
- this._setFlags(portionId, flags, transparent);
781
- }
782
-
783
- destroy() {
784
- this._compiledPortions && this._compiledPortions.destroy();
785
- }
786
- }