@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
@@ -8,19 +8,16 @@ import {math} from '../math/math.js';
8
8
  import {createRTCViewMat} from '../math/rtcCoords.js';
9
9
  import {Component} from '../Component.js';
10
10
  import {RenderState} from '../webgl/RenderState.js';
11
- import {createProgramVariablesState} from '../webgl/WebGLRenderer.js';
12
- import {DrawShaderSource} from "./draw/DrawShaderSource.js";
13
- import {LambertShaderSource} from "./draw/LambertShaderSource.js";
14
- import {EmphasisShaderSource} from "./emphasis/EmphasisShaderSource.js";
15
- import {PickMeshShaderSource} from "./pick/PickMeshShaderSource.js";
16
- import {PickTriangleShaderSource} from "./pick/PickTriangleShaderSource.js";
17
- import {OcclusionShaderSource} from "./occlusion/OcclusionShaderSource.js";
18
- import {ShadowShaderSource} from "./shadow/ShadowShaderSource.js";
11
+ import {DrawRenderer} from "./draw/DrawRenderer.js";
12
+ import {EmphasisFillRenderer} from "./emphasis/EmphasisFillRenderer.js";
13
+ import {EmphasisEdgesRenderer} from "./emphasis/EmphasisEdgesRenderer.js";
14
+ import {PickMeshRenderer} from "./pick/PickMeshRenderer.js";
15
+ import {PickTriangleRenderer} from "./pick/PickTriangleRenderer.js";
16
+ import {OcclusionRenderer} from "./occlusion/OcclusionRenderer.js";
17
+ import {ShadowRenderer} from "./shadow/ShadowRenderer.js";
19
18
 
20
19
  import {geometryCompressionUtils} from '../math/geometryCompressionUtils.js';
21
20
  import {RenderFlags} from "../webgl/RenderFlags.js";
22
- import {stats} from '../stats.js';
23
- import {Map} from "../utils/Map.js";
24
21
 
25
22
  const obb = math.OBB3();
26
23
  const angleAxis = math.vec4();
@@ -35,9 +32,6 @@ const vecb = math.vec3(3);
35
32
 
36
33
  const identityMat = math.identityMat4();
37
34
 
38
- const ids = new Map({});
39
- const renderersCache = { };
40
-
41
35
  /**
42
36
  * @desc An {@link Entity} that is a drawable element, with a {@link Geometry} and a {@link Material}, that can be
43
37
  * connected into a scene graph using {@link Node}s.
@@ -182,7 +176,7 @@ const renderersCache = { };
182
176
  * @implements {Entity}
183
177
  * @implements {Drawable}
184
178
  */
185
- export class Mesh extends Component {
179
+ class Mesh extends Component {
186
180
 
187
181
  /**
188
182
  * @constructor
@@ -263,120 +257,23 @@ export class Mesh extends Component {
263
257
  colorize: null,
264
258
  pickID: this.scene._renderer.getPickID(this),
265
259
  drawHash: "",
266
- pickOcclusionHash: "",
260
+ pickHash: "",
267
261
  offset: math.vec3(),
268
262
  origin: null,
269
263
  originHash: null,
270
264
  isUI: cfg.isUI
271
265
  });
272
266
 
273
- const material = cfg.material ? this._checkComponent2(["PhongMaterial", "MetallicMaterial", "SpecularMaterial", "LambertMaterial"], cfg.material) : this.scene.material;
274
-
275
- const mesh = this;
276
-
277
- const wrapRenderer = (getProgramSetup) => {
278
- let instance = null;
279
- const ensureInstance = () => {
280
- if (! instance) {
281
- const programVariablesState = createProgramVariablesState();
282
- const createAttribute = programVariablesState.programVariables.createAttribute;
283
- const geometryState = mesh._geometry._state;
284
- const attributes = {
285
- position: createAttribute("vec3", "position"),
286
- color: geometryState.colorsBuf && createAttribute("vec4", "color"),
287
- pickColor: createAttribute("vec4", "pickColor"),
288
- uv: geometryState.uvBuf && createAttribute("vec2", "uv"),
289
- normal: (geometryState.autoVertexNormals || geometryState.normalsBuf) && [ "triangles", "triangle-strip", "triangle-fan" ].includes(geometryState.primitiveName) && createAttribute("vec3", "normal")
290
- };
291
-
292
- const lazyShaderVariable = function(name) {
293
- const variable = {
294
- toString: () => {
295
- variable.needed = true;
296
- return name;
297
- }
298
- };
299
- return variable;
300
- };
301
- const worldNormal = attributes.normal && lazyShaderVariable("worldNormal");
302
- const viewNormal = worldNormal && lazyShaderVariable("viewNormal");
303
- const decodedUv = attributes.uv && lazyShaderVariable("decodedUv");
304
-
305
- const programSetup = getProgramSetup(
306
- programVariablesState.programVariables,
307
- {
308
- attributes: {
309
- position: {
310
- world: "worldPosition",
311
- view: "viewPosition"
312
- },
313
- color: attributes.color,
314
- pickColor: attributes.pickColor,
315
- uv: decodedUv,
316
- normal: attributes.normal && {
317
- world: worldNormal,
318
- view: viewNormal
319
- }
320
- },
321
- viewMatrix: "viewMatrix2"
322
- });
323
- const hash = [
324
- programSetup.programName,
325
- mesh.scene.canvas.canvas.id,
326
- mesh.scene._sectionPlanesState.getHash(),
327
- mesh._geometry._state.hash
328
- ].concat(programSetup.getHash()).join(";");
329
- if (! (hash in renderersCache)) {
330
- const renderer = instantiateMeshRenderer(mesh, attributes, { decodedUv: decodedUv, worldNormal: worldNormal, viewNormal: viewNormal }, programSetup, programVariablesState);
331
- if (renderer.errors) {
332
- console.log(renderer.errors.join("\n"));
333
- return;
334
- }
335
- const id = ids.addItem({});
336
- renderersCache[hash] = {
337
- drawMesh: renderer.drawMesh,
338
- id: id,
339
- useCount: 0,
340
- delete: () => {
341
- ids.removeItem(id);
342
- renderer.destroy();
343
- delete renderersCache[hash];
344
- stats.memory.programs--;
345
- }
346
- };
347
- stats.memory.programs++;
348
- }
349
- instance = renderersCache[hash];
350
- instance.useCount++;
351
- }
352
- };
353
- return {
354
- get: ensureInstance,
355
- getId: () => instance.id,
356
- put: () => { if (instance) { if (--instance.useCount === 0) { instance.delete(); } instance = null; } },
357
- drawMesh: (frameCtx, mesh, material) => {
358
- ensureInstance();
359
- instance && instance.drawMesh(frameCtx, mesh, material);
360
- }
361
- };
362
- };
363
-
364
- const scene = mesh.scene;
365
- const emphasisShaderSourceMaker = isFill => (vars, geo) => EmphasisShaderSource(mesh._state.hash, vars, geo, scene, isFill);
366
- this._renderers = {
367
- _drawRenderer: wrapRenderer((vars, geo) => ((material.type === "LambertMaterial")
368
- ? LambertShaderSource(mesh._state.drawHash, vars, geo, material, scene)
369
- : DrawShaderSource (mesh._state.drawHash, vars, geo, material, scene))),
370
- _shadowRenderer: wrapRenderer((vars) => ShadowShaderSource(mesh._state.hash, vars)),
371
- _emphasisEdgesRenderer: wrapRenderer(emphasisShaderSourceMaker(false)),
372
- _emphasisFillRenderer: wrapRenderer(emphasisShaderSourceMaker(true)),
373
- _pickMeshRenderer: wrapRenderer((vars) => PickMeshShaderSource(mesh._state.hash, vars)),
374
- _pickTriangleRenderer: wrapRenderer((vars, geo) => PickTriangleShaderSource(mesh._state.hash, vars, geo)),
375
- _occlusionRenderer: wrapRenderer((vars) => OcclusionShaderSource(mesh._state.pickOcclusionHash, vars))
376
- };
267
+ this._drawRenderer = null;
268
+ this._shadowRenderer = null;
269
+ this._emphasisFillRenderer = null;
270
+ this._emphasisEdgesRenderer = null;
271
+ this._pickMeshRenderer = null;
272
+ this._pickTriangleRenderer = null;
273
+ this._occlusionRenderer = null;
377
274
 
378
275
  this._geometry = cfg.geometry ? this._checkComponent2(["ReadableGeometry", "VBOGeometry"], cfg.geometry) : this.scene.geometry;
379
- this._material = material;
276
+ this._material = cfg.material ? this._checkComponent2(["PhongMaterial", "MetallicMaterial", "SpecularMaterial", "LambertMaterial"], cfg.material) : this.scene.material;
380
277
  this._xrayMaterial = cfg.xrayMaterial ? this._checkComponent("EmphasisMaterial", cfg.xrayMaterial) : this.scene.xrayMaterial;
381
278
  this._highlightMaterial = cfg.highlightMaterial ? this._checkComponent("EmphasisMaterial", cfg.highlightMaterial) : this.scene.highlightMaterial;
382
279
  this._selectedMaterial = cfg.selectedMaterial ? this._checkComponent("EmphasisMaterial", cfg.selectedMaterial) : this.scene.selectedMaterial;
@@ -1401,49 +1298,27 @@ export class Mesh extends Component {
1401
1298
  * @private
1402
1299
  */
1403
1300
  compile() {
1404
- const scene = this.scene;
1405
- const state = this._state;
1406
- const hash = [
1407
- scene.canvas.canvas.id,
1408
- scene._sectionPlanesState.getHash()
1409
- ];
1410
- if (state.stationary) {
1411
- hash.push("/s");
1412
- }
1413
- if (state.billboard === "none") {
1414
- hash.push("/n");
1415
- } else if (state.billboard === "spherical") {
1416
- hash.push("/s");
1417
- } else if (state.billboard === "cylindrical") {
1418
- hash.push("/c");
1419
- }
1420
- hash.push(";");
1421
-
1422
- const drawHash = hash.concat([
1423
- scene.gammaOutput ? "go" : "",
1424
- scene._lightsState.getHash(),
1425
- state.receivesShadow ? "/rs" : ""
1426
- ]).join("");
1301
+ const drawHash = this._makeDrawHash();
1427
1302
  if (this._state.drawHash !== drawHash) {
1428
1303
  this._state.drawHash = drawHash;
1429
- this._renderers._drawRenderer.put();
1430
- this._renderers._shadowRenderer.put();
1431
- this._renderers._emphasisFillRenderer.put();
1432
- this._renderers._emphasisEdgesRenderer.put();
1433
- this._renderers._drawRenderer.get();
1434
- // this._renderers._shadowRenderer.get();
1435
- this._renderers._emphasisFillRenderer.get();
1436
- this._renderers._emphasisEdgesRenderer.get();
1437
- }
1438
- const pickOcclusionHash = hash.join("");
1439
- if (this._state.pickOcclusionHash !== pickOcclusionHash) {
1440
- this._state.pickOcclusionHash = pickOcclusionHash;
1441
- this._renderers._pickMeshRenderer.put();
1442
- this._renderers._pickTriangleRenderer.put();
1443
- this._renderers._pickMeshRenderer.get();
1444
- if (this._state.occluder) {
1445
- this._renderers._occlusionRenderer.put();
1446
- this._renderers._occlusionRenderer.get();
1304
+ this._putDrawRenderers();
1305
+ this._drawRenderer = DrawRenderer.get(this);
1306
+ // this._shadowRenderer = ShadowRenderer.get(this);
1307
+ this._emphasisFillRenderer = EmphasisFillRenderer.get(this);
1308
+ this._emphasisEdgesRenderer = EmphasisEdgesRenderer.get(this);
1309
+ }
1310
+ const pickHash = this._makePickHash();
1311
+ if (this._state.pickHash !== pickHash) {
1312
+ this._state.pickHash = pickHash;
1313
+ this._putPickRenderers();
1314
+ this._pickMeshRenderer = PickMeshRenderer.get(this);
1315
+ }
1316
+ if (this._state.occluder) {
1317
+ const occlusionHash = this._makeOcclusionHash();
1318
+ if (this._state.occlusionHash !== occlusionHash) {
1319
+ this._state.occlusionHash = occlusionHash;
1320
+ this._putOcclusionRenderer();
1321
+ this._occlusionRenderer = OcclusionRenderer.get(this);
1447
1322
  }
1448
1323
  }
1449
1324
  }
@@ -1500,6 +1375,98 @@ export class Mesh extends Component {
1500
1375
  this._aabbDirty = false;
1501
1376
  }
1502
1377
 
1378
+ _webglContextRestored() {
1379
+ if (this._drawRenderer) {
1380
+ this._drawRenderer.webglContextRestored();
1381
+ }
1382
+ if (this._shadowRenderer) {
1383
+ this._shadowRenderer.webglContextRestored();
1384
+ }
1385
+ if (this._emphasisFillRenderer) {
1386
+ this._emphasisFillRenderer.webglContextRestored();
1387
+ }
1388
+ if (this._emphasisEdgesRenderer) {
1389
+ this._emphasisEdgesRenderer.webglContextRestored();
1390
+ }
1391
+ if (this._pickMeshRenderer) {
1392
+ this._pickMeshRenderer.webglContextRestored();
1393
+ }
1394
+ if (this._pickTriangleRenderer) {
1395
+ this._pickMeshRenderer.webglContextRestored();
1396
+ }
1397
+ if (this._occlusionRenderer) {
1398
+ this._occlusionRenderer.webglContextRestored();
1399
+ }
1400
+ }
1401
+
1402
+ _makeDrawHash() {
1403
+ const scene = this.scene;
1404
+ const hash = [
1405
+ scene.canvas.canvas.id,
1406
+ (scene.gammaInput ? "gi;" : ";") + (scene.gammaOutput ? "go" : ""),
1407
+ scene._lightsState.getHash(),
1408
+ scene._sectionPlanesState.getHash()
1409
+ ];
1410
+ const state = this._state;
1411
+ if (state.stationary) {
1412
+ hash.push("/s");
1413
+ }
1414
+ if (state.billboard === "none") {
1415
+ hash.push("/n");
1416
+ } else if (state.billboard === "spherical") {
1417
+ hash.push("/s");
1418
+ } else if (state.billboard === "cylindrical") {
1419
+ hash.push("/c");
1420
+ }
1421
+ if (state.receivesShadow) {
1422
+ hash.push("/rs");
1423
+ }
1424
+ hash.push(";");
1425
+ return hash.join("");
1426
+ }
1427
+
1428
+ _makePickHash() {
1429
+ const scene = this.scene;
1430
+ const hash = [
1431
+ scene.canvas.canvas.id,
1432
+ scene._sectionPlanesState.getHash()
1433
+ ];
1434
+ const state = this._state;
1435
+ if (state.stationary) {
1436
+ hash.push("/s");
1437
+ }
1438
+ if (state.billboard === "none") {
1439
+ hash.push("/n");
1440
+ } else if (state.billboard === "spherical") {
1441
+ hash.push("/s");
1442
+ } else if (state.billboard === "cylindrical") {
1443
+ hash.push("/c");
1444
+ }
1445
+ hash.push(";");
1446
+ return hash.join("");
1447
+ }
1448
+
1449
+ _makeOcclusionHash() {
1450
+ const scene = this.scene;
1451
+ const hash = [
1452
+ scene.canvas.canvas.id,
1453
+ scene._sectionPlanesState.getHash()
1454
+ ];
1455
+ const state = this._state;
1456
+ if (state.stationary) {
1457
+ hash.push("/s");
1458
+ }
1459
+ if (state.billboard === "none") {
1460
+ hash.push("/n");
1461
+ } else if (state.billboard === "spherical") {
1462
+ hash.push("/s");
1463
+ } else if (state.billboard === "cylindrical") {
1464
+ hash.push("/c");
1465
+ }
1466
+ hash.push(";");
1467
+ return hash.join("");
1468
+ }
1469
+
1503
1470
  _buildAABB(worldMatrix, aabb) {
1504
1471
 
1505
1472
  math.transformOBB3(worldMatrix, this._geometry.obb, obb);
@@ -1636,6 +1603,43 @@ export class Mesh extends Component {
1636
1603
  return this.translate(zAxis, distance);
1637
1604
  }
1638
1605
 
1606
+ _putDrawRenderers() {
1607
+ if (this._drawRenderer) {
1608
+ this._drawRenderer.put();
1609
+ this._drawRenderer = null;
1610
+ }
1611
+ if (this._shadowRenderer) {
1612
+ this._shadowRenderer.put();
1613
+ this._shadowRenderer = null;
1614
+ }
1615
+ if (this._emphasisFillRenderer) {
1616
+ this._emphasisFillRenderer.put();
1617
+ this._emphasisFillRenderer = null;
1618
+ }
1619
+ if (this._emphasisEdgesRenderer) {
1620
+ this._emphasisEdgesRenderer.put();
1621
+ this._emphasisEdgesRenderer = null;
1622
+ }
1623
+ }
1624
+
1625
+ _putPickRenderers() {
1626
+ if (this._pickMeshRenderer) {
1627
+ this._pickMeshRenderer.put();
1628
+ this._pickMeshRenderer = null;
1629
+ }
1630
+ if (this._pickTriangleRenderer) {
1631
+ this._pickTriangleRenderer.put();
1632
+ this._pickTriangleRenderer = null;
1633
+ }
1634
+ }
1635
+
1636
+ _putOcclusionRenderer() {
1637
+ if (this._occlusionRenderer) {
1638
+ this._occlusionRenderer.put();
1639
+ this._occlusionRenderer = null;
1640
+ }
1641
+ }
1642
+
1639
1643
  /**
1640
1644
  * Comparison function used by the renderer to determine the order in which xeokit should render the Mesh, relative to to other Meshes.
1641
1645
  *
@@ -1649,7 +1653,7 @@ export class Mesh extends Component {
1649
1653
  */
1650
1654
  stateSortCompare(mesh1, mesh2) {
1651
1655
  return (mesh1._state.layer - mesh2._state.layer)
1652
- || (mesh1._renderers._drawRenderer.getId() - mesh2._renderers._drawRenderer.getId()) // Program state
1656
+ || (mesh1._drawRenderer.id - mesh2._drawRenderer.id) // Program state
1653
1657
  || (mesh1._material._state.id - mesh2._material._state.id) // Material state
1654
1658
  || (mesh1._geometry._state.id - mesh2._geometry._state.id); // Geometry state
1655
1659
  }
@@ -1787,12 +1791,16 @@ export class Mesh extends Component {
1787
1791
 
1788
1792
  /** @private */
1789
1793
  drawColorOpaque(frameCtx) {
1790
- this._renderers._drawRenderer.drawMesh(frameCtx, this, this._material);
1794
+ if (this._drawRenderer || (this._drawRenderer = DrawRenderer.get(this))) {
1795
+ this._drawRenderer.drawMesh(frameCtx, this);
1796
+ }
1791
1797
  }
1792
1798
 
1793
1799
  /** @private */
1794
1800
  drawColorTransparent(frameCtx) {
1795
- this._renderers._drawRenderer.drawMesh(frameCtx, this, this._material);
1801
+ if (this._drawRenderer || (this._drawRenderer = DrawRenderer.get(this))) {
1802
+ this._drawRenderer.drawMesh(frameCtx, this);
1803
+ }
1796
1804
  }
1797
1805
 
1798
1806
  // ---------------------- RENDERING SAO POST EFFECT TARGETS --------------
@@ -1803,65 +1811,87 @@ export class Mesh extends Component {
1803
1811
 
1804
1812
  /** @private */
1805
1813
  drawSilhouetteXRayed(frameCtx) {
1806
- this._renderers._emphasisFillRenderer.drawMesh(frameCtx, this, this._xrayMaterial);
1814
+ if (this._emphasisFillRenderer || (this._emphasisFillRenderer = EmphasisFillRenderer.get(this))) {
1815
+ this._emphasisFillRenderer.drawMesh(frameCtx, this, 0); // 0 == xray
1816
+ }
1807
1817
  }
1808
1818
 
1809
1819
  /** @private */
1810
1820
  drawSilhouetteHighlighted(frameCtx) {
1811
- this._renderers._emphasisFillRenderer.drawMesh(frameCtx, this, this._highlightMaterial);
1821
+ if (this._emphasisFillRenderer || (this._emphasisFillRenderer = EmphasisFillRenderer.get(this))) {
1822
+ this._emphasisFillRenderer.drawMesh(frameCtx, this, 1); // 1 == highlight
1823
+ }
1812
1824
  }
1813
1825
 
1814
1826
  /** @private */
1815
1827
  drawSilhouetteSelected(frameCtx) {
1816
- this._renderers._emphasisFillRenderer.drawMesh(frameCtx, this, this._selectedMaterial);
1828
+ if (this._emphasisFillRenderer || (this._emphasisFillRenderer = EmphasisFillRenderer.get(this))) {
1829
+ this._emphasisFillRenderer.drawMesh(frameCtx, this, 2); // 2 == selected
1830
+ }
1817
1831
  }
1818
1832
 
1819
1833
  // ---------------------- EDGES RENDERING -----------------------------------
1820
1834
 
1821
1835
  /** @private */
1822
1836
  drawEdgesColorOpaque(frameCtx) {
1823
- this._renderers._emphasisEdgesRenderer.drawMesh(frameCtx, this, this._edgeMaterial);
1837
+ if (this._emphasisEdgesRenderer || (this._emphasisEdgesRenderer = EmphasisEdgesRenderer.get(this))) {
1838
+ this._emphasisEdgesRenderer.drawMesh(frameCtx, this, 3); // 3 == edges
1839
+ }
1824
1840
  }
1825
1841
 
1826
1842
  /** @private */
1827
1843
  drawEdgesColorTransparent(frameCtx) {
1828
- this._renderers._emphasisEdgesRenderer.drawMesh(frameCtx, this, this._edgeMaterial);
1844
+ if (this._emphasisEdgesRenderer || (this._emphasisEdgesRenderer = EmphasisEdgesRenderer.get(this))) {
1845
+ this._emphasisEdgesRenderer.drawMesh(frameCtx, this, 3); // 3 == edges
1846
+ }
1829
1847
  }
1830
1848
 
1831
1849
  /** @private */
1832
1850
  drawEdgesXRayed(frameCtx) {
1833
- this._renderers._emphasisEdgesRenderer.drawMesh(frameCtx, this, this._xrayMaterial);
1851
+ if (this._emphasisEdgesRenderer || (this._emphasisEdgesRenderer = EmphasisEdgesRenderer.get(this))) {
1852
+ this._emphasisEdgesRenderer.drawMesh(frameCtx, this, 0); // 0 == xray
1853
+ }
1834
1854
  }
1835
1855
 
1836
1856
  /** @private */
1837
1857
  drawEdgesHighlighted(frameCtx) {
1838
- this._renderers._emphasisEdgesRenderer.drawMesh(frameCtx, this, this._highlightMaterial);
1858
+ if (this._emphasisEdgesRenderer || (this._emphasisEdgesRenderer = EmphasisEdgesRenderer.get(this))) {
1859
+ this._emphasisEdgesRenderer.drawMesh(frameCtx, this, 1); // 1 == highlight
1860
+ }
1839
1861
  }
1840
1862
 
1841
1863
  /** @private */
1842
1864
  drawEdgesSelected(frameCtx) {
1843
- this._renderers._emphasisEdgesRenderer.drawMesh(frameCtx, this, this._selectedMaterial);
1865
+ if (this._emphasisEdgesRenderer || (this._emphasisEdgesRenderer = EmphasisEdgesRenderer.get(this))) {
1866
+ this._emphasisEdgesRenderer.drawMesh(frameCtx, this, 2); // 2 == selected
1867
+ }
1844
1868
  }
1845
1869
 
1846
1870
  // ---------------------- OCCLUSION CULL RENDERING -----------------------------------
1847
1871
 
1848
1872
  /** @private */
1849
1873
  drawOcclusion(frameCtx) {
1850
- this._renderers._occlusionRenderer.drawMesh(frameCtx, this, this._material);
1874
+ if (this._state.occluder && this._occlusionRenderer || (this._occlusionRenderer = OcclusionRenderer.get(this))) {
1875
+ this._occlusionRenderer.drawMesh(frameCtx, this);
1876
+ }
1851
1877
  }
1852
1878
 
1853
1879
  // ---------------------- SHADOW BUFFER RENDERING -----------------------------------
1854
1880
 
1855
1881
  /** @private */
1856
1882
  drawShadow(frameCtx) {
1857
- this._renderers._shadowRenderer.drawMesh(frameCtx, this, this._material);
1883
+ if (this._shadowRenderer || (this._shadowRenderer = ShadowRenderer.get(this))) {
1884
+ this._shadowRenderer.drawMesh(frameCtx, this);
1885
+ }
1858
1886
  }
1859
1887
 
1860
1888
  // ---------------------- PICKING RENDERING ----------------------------------
1861
1889
 
1862
1890
  /** @private */
1863
1891
  drawPickMesh(frameCtx) {
1864
- this._renderers._pickMeshRenderer.drawMesh(frameCtx, this, this._material);
1892
+ if (this._pickMeshRenderer || (this._pickMeshRenderer = PickMeshRenderer.get(this))) {
1893
+ this._pickMeshRenderer.drawMesh(frameCtx, this);
1894
+ }
1865
1895
  }
1866
1896
 
1867
1897
  /** @private
@@ -1872,7 +1902,9 @@ export class Mesh extends Component {
1872
1902
 
1873
1903
  /** @private */
1874
1904
  drawPickTriangles(frameCtx) {
1875
- this._renderers._pickTriangleRenderer.drawMesh(frameCtx, this, this._material);
1905
+ if (this._pickTriangleRenderer || (this._pickTriangleRenderer = PickTriangleRenderer.get(this))) {
1906
+ this._pickTriangleRenderer.drawMesh(frameCtx, this);
1907
+ }
1876
1908
  }
1877
1909
 
1878
1910
  /** @private */
@@ -1902,8 +1934,9 @@ export class Mesh extends Component {
1902
1934
  */
1903
1935
  destroy() {
1904
1936
  super.destroy(); // xeokit.Object
1905
- Object.values(this._renderers).forEach(r => r.put());
1906
-
1937
+ this._putDrawRenderers();
1938
+ this._putPickRenderers();
1939
+ this._putOcclusionRenderer();
1907
1940
  this.scene._renderer.putPickID(this._state.pickID); // TODO: somehow puch this down into xeokit framework?
1908
1941
  if (this._isObject) {
1909
1942
  this.scene._deregisterObject(this);
@@ -2181,279 +2214,4 @@ const pickTriangleSurface = (function () {
2181
2214
  }
2182
2215
  })();
2183
2216
 
2184
- const instantiateMeshRenderer = (mesh, attributes, auxVariables, programSetup, programVariablesState) => {
2185
- const programVariables = programVariablesState.programVariables;
2186
- const decodedUv = auxVariables.decodedUv;
2187
- const worldNormal = auxVariables.worldNormal;
2188
- const viewNormal = auxVariables.viewNormal;
2189
- const scene = mesh.scene;
2190
- const gl = scene.canvas.gl;
2191
- const meshStateBackground = mesh._state.background;
2192
- const geometryState = mesh._geometry._state;
2193
- const quantizedGeometry = geometryState.compressGeometry;
2194
- const isPoints = geometryState.primitiveName === "points";
2195
-
2196
- const pointSize = programVariables.createUniform("float", "pointSize");
2197
- const modelMatrix = programVariables.createUniform("mat4", "modelMatrix");
2198
- const modelNormalMatrix = programVariables.createUniform("mat4", "modelNormalMatrix");
2199
- const offset = programVariables.createUniform("vec3", "offset");
2200
- const scale = programVariables.createUniform("vec3", "scale");
2201
- const positionsDecodeMatrix = programVariables.createUniform("mat4", "positionsDecodeMatrix");
2202
- const uvDecodeMatrix = programVariables.createUniform("mat3", "uvDecodeMatrix");
2203
- const viewMatrix = programVariables.createUniform("mat4", "viewMatrix");
2204
- const viewNormalMatrix = programVariables.createUniform("mat4", "viewNormalMatrix");
2205
- const projMatrix = programVariables.createUniform("mat4", "projMatrix");
2206
-
2207
- const billboard = mesh.billboard;
2208
- const isBillboard = (! programSetup.dontBillboardAnything) && ((billboard === "spherical") || (billboard === "cylindrical"));
2209
- const stationary = mesh.stationary;
2210
- const defineBillboard = isBillboard && ((name, src) => [
2211
- `mat4 ${name}(in mat4 matIn) {`,
2212
- " mat4 mat = matIn;",
2213
- ` mat[0].xyz = vec3(${scale}[0], 0.0, 0.0);`,
2214
- ...((billboard === "spherical") ? [ ` mat[1].xyz = vec3(0.0, ${scale}[1], 0.0);` ] : [ ]),
2215
- " mat[2].xyz = vec3(0.0, 0.0, 1.0);",
2216
- " return mat;",
2217
- "}",
2218
- ].forEach(l => src.push(l)));
2219
-
2220
- const billboardIfApplicable = (function() {
2221
- const billboardVert = defineBillboard && programVariables.createVertexDefinition("billboard", defineBillboard);
2222
- return v => billboardVert ? `${billboardVert}(${v})` : v;
2223
- })();
2224
-
2225
- const billboardIfApplicableFrag = (function() {
2226
- const billboardFrag = defineBillboard && programVariables.createFragmentDefinition("billboard", defineBillboard);
2227
- return v => billboardFrag ? `${billboardFrag}(${v})` : v;
2228
- })();
2229
-
2230
- const fragmentOutputsSetup = [ ];
2231
- if (programSetup.dontBillboardAnything) {
2232
- fragmentOutputsSetup.push(`mat4 viewMatrix2 = ${viewMatrix};`);
2233
- } else {
2234
- fragmentOutputsSetup.push(`mat4 viewMatrix1 = ${viewMatrix};`);
2235
- if (stationary) {
2236
- fragmentOutputsSetup.push("viewMatrix1[3].xyz = vec3(0.0, 0.0, 0.0);");
2237
- } else if (meshStateBackground) {
2238
- fragmentOutputsSetup.push("viewMatrix1[3] = vec4(0.0, 0.0, 0.0, 1.0);");
2239
- }
2240
- fragmentOutputsSetup.push(`mat4 viewMatrix2 = ${billboardIfApplicableFrag("viewMatrix1")};`);
2241
- }
2242
-
2243
- const clipPos = "clipPos";
2244
- const getVertexData = function() {
2245
- const viewNormalDefinition = viewNormal && viewNormal.needed && `vec3 ${viewNormal} = normalize((${billboardIfApplicable(viewNormalMatrix)} * vec4(${worldNormal}, 0.0)).xyz);`;
2246
- const src = [ ];
2247
- src.push(`vec4 localPosition = vec4(${attributes.position}, 1.0);`);
2248
- if (quantizedGeometry) {
2249
- src.push(`localPosition = ${positionsDecodeMatrix} * localPosition;`);
2250
- }
2251
- src.push(`vec4 worldPosition = ${billboardIfApplicable(modelMatrix)} * localPosition;`);
2252
- src.push(`worldPosition.xyz = worldPosition.xyz + ${offset};`);
2253
- if (programSetup.dontBillboardAnything) {
2254
- src.push(`vec4 viewPosition = ${viewMatrix} * worldPosition;`);
2255
- } else {
2256
- src.push(`mat4 viewMatrix1 = ${viewMatrix};`);
2257
- if (stationary) {
2258
- src.push("viewMatrix1[3].xyz = vec3(0.0, 0.0, 0.0);");
2259
- } else if (meshStateBackground) {
2260
- src.push("viewMatrix1[3] = vec4(0.0, 0.0, 0.0, 1.0);");
2261
- }
2262
- src.push(`mat4 viewMatrix2 = ${billboardIfApplicable("viewMatrix1")};`);
2263
- src.push(`vec4 viewPosition = ${(isBillboard
2264
- ? `${billboardIfApplicable(`viewMatrix1 * ${modelMatrix}`)} * localPosition`
2265
- : "viewMatrix2 * worldPosition")};`);
2266
- }
2267
- decodedUv && decodedUv.needed && src.push(`vec2 ${decodedUv} = ${quantizedGeometry ? `(${uvDecodeMatrix} * vec3(${attributes.uv}, 1.0)).xy` : attributes.uv};`);
2268
- if (worldNormal && worldNormal.needed) {
2269
- const localNormal = quantizedGeometry ? `${programVariables.commonLibrary.octDecode}(${attributes.normal}.xy)` : attributes.normal;
2270
- src.push(`vec3 ${worldNormal} = (${billboardIfApplicable(modelNormalMatrix)} * vec4(${localNormal}, 0.0)).xyz;`);
2271
- }
2272
- viewNormalDefinition && src.push(viewNormalDefinition);
2273
- src.push(`vec4 ${clipPos} = ${projMatrix} * viewPosition;`);
2274
- return src;
2275
- };
2276
-
2277
- const clippable = programVariables.createUniform("bool", "clippable");
2278
-
2279
- const [ program, errors ] = programVariablesState.buildProgram(
2280
- gl,
2281
- programSetup.programName,
2282
- {
2283
- appendFragmentOutputs: (src, getGammaOutputExpression, gl_FragCoord, sliceColorOr) => {
2284
- fragmentOutputsSetup.forEach(line => src.push(line));
2285
- programSetup.appendFragmentOutputs(src, getGammaOutputExpression, gl_FragCoord, sliceColorOr);
2286
- },
2287
- clippableTest: () => clippable,
2288
- clippingCaps: programSetup.clippingCaps,
2289
- clipPos: meshStateBackground ? `${clipPos}.xyww` : clipPos,
2290
- crossSections: scene.crossSections,
2291
- discardPoints: isPoints && programSetup.discardPoints,
2292
- getGammaFactor: scene.gammaOutput && (() => scene.gammaFactor),
2293
- getLogDepth: (! programSetup.dontGetLogDepth) && scene.logarithmicDepthBufferEnabled && (vFragDepth => vFragDepth),
2294
- getPointSize: programSetup.setupPointSize && isPoints && (() => pointSize),
2295
- getVertexData: getVertexData,
2296
- projMatrix: projMatrix,
2297
- sectionPlanesState: scene._sectionPlanesState,
2298
- testPerspectiveForGl_FragDepth: true,
2299
- usePickClipPos: programSetup.isPick,
2300
- worldPositionAttribute: "worldPosition"
2301
- });
2302
-
2303
- if (errors) {
2304
- return { errors: errors };
2305
- } else {
2306
- const inputSetters = program.inputSetters;
2307
-
2308
- let lastMaterialId = null;
2309
- let lastGeometryId = null;
2310
-
2311
- return {
2312
- destroy: () => program.destroy(),
2313
- drawMesh: (frameCtx, mesh, material) => {
2314
- if (programSetup.skipIfTransparent && (material.alpha < 1.0)) {
2315
- return;
2316
- }
2317
-
2318
- const materialState = material._state;
2319
- const meshState = mesh._state;
2320
- const geometry = mesh._geometry;
2321
- const geometryState = geometry._state;
2322
- const viewParams = frameCtx.viewParams;
2323
- const actsAsBackground = programSetup.canActAsBackground && meshStateBackground;
2324
-
2325
- if (frameCtx.lastProgramId !== program.id) {
2326
- frameCtx.lastProgramId = program.id;
2327
- program.bind();
2328
- frameCtx.useProgram++;
2329
- lastMaterialId = null;
2330
- lastGeometryId = null;
2331
- if (actsAsBackground) {
2332
- gl.depthFunc(gl.LEQUAL);
2333
- }
2334
- }
2335
-
2336
- if (materialState.id !== lastMaterialId) {
2337
- if (frameCtx.backfaces !== materialState.backfaces) {
2338
- if (materialState.backfaces) {
2339
- gl.disable(gl.CULL_FACE);
2340
- } else {
2341
- gl.enable(gl.CULL_FACE);
2342
- }
2343
- frameCtx.backfaces = materialState.backfaces;
2344
- }
2345
-
2346
- if ((! programSetup.dontSetFrontFace) && (frameCtx.frontface !== materialState.frontface)) {
2347
- gl.frontFace(materialState.frontface ? gl.CCW : gl.CW);
2348
- frameCtx.frontface = materialState.frontface;
2349
- }
2350
-
2351
- if (programSetup.drawEdges && (frameCtx.lineWidth !== materialState.edgeWidth)) {
2352
- gl.lineWidth(materialState.edgeWidth);
2353
- frameCtx.lineWidth = materialState.edgeWidth;
2354
- }
2355
-
2356
- if (programSetup.setsLineWidth && (frameCtx.lineWidth !== materialState.lineWidth)) {
2357
- gl.lineWidth(materialState.lineWidth);
2358
- frameCtx.lineWidth = materialState.lineWidth;
2359
- }
2360
-
2361
- lastMaterialId = materialState.id;
2362
- }
2363
-
2364
- const setUniforms = (projMat, viewMat) => {
2365
- const setUni = (u, v) => (u.setInputValue && u.setInputValue(v));
2366
- setUni(pointSize, material.pointSize);
2367
- setUni(modelMatrix, mesh.worldMatrix);
2368
- setUni(modelNormalMatrix, mesh.worldNormalMatrix);
2369
- setUni(offset, mesh.offset);
2370
- setUni(scale, mesh.scale);
2371
- setUni(positionsDecodeMatrix, geometryState.positionsDecodeMatrix);
2372
- setUni(uvDecodeMatrix, geometryState.uvDecodeMatrix);
2373
- setUni(viewMatrix, viewMat);
2374
- setUni(viewNormalMatrix, viewParams.viewNormalMatrix);
2375
- setUni(projMatrix, projMat);
2376
- setUni(clippable, mesh.clippable);
2377
-
2378
- inputSetters.setUniforms(frameCtx, {
2379
- material: material,
2380
- meshColorize: mesh.colorize,
2381
- meshPickID: mesh._state.pickID,
2382
- mesh: {
2383
- origin: mesh.origin,
2384
- renderFlags: { sectionPlanesActivePerLayer: mesh.renderFlags.sectionPlanesActivePerLayer }
2385
- },
2386
- view: { far: viewParams.far }
2387
- });
2388
- };
2389
-
2390
- const origin = (! programSetup.useShadowView) && mesh.origin;
2391
- setUniforms(viewParams.projMatrix, origin ? frameCtx.getRTCViewMatrix(meshState.originHash, origin) : viewParams.viewMatrix);
2392
-
2393
- const setAttributes = (triangleGeometry) => {
2394
- const setAttr = (a, b) => {
2395
- if (a && a.setInputValue && b) {
2396
- a.setInputValue(b);
2397
- frameCtx.bindArray++;
2398
- }
2399
- };
2400
- setAttr(attributes.position, (triangleGeometry || geometryState).positionsBuf);
2401
- setAttr(attributes.color, geometryState.colorsBuf);
2402
- setAttr(attributes.pickColor, triangleGeometry && triangleGeometry.pickColorsBuf);
2403
- setAttr(attributes.uv, geometryState.uvBuf);
2404
- setAttr(attributes.normal, geometryState.normalsBuf);
2405
- };
2406
-
2407
- if (programSetup.trianglePick) {
2408
- const positionsBuf = geometry._getPickTrianglePositions();
2409
- if (geometryState.id !== lastGeometryId) {
2410
- setAttributes({ positionsBuf: positionsBuf, pickColorsBuf: geometry._getPickTriangleColors() });
2411
- lastGeometryId = geometryState.id;
2412
- }
2413
-
2414
- gl.drawArrays(geometryState.primitive, 0, positionsBuf.numItems / 3);
2415
- } else if (programSetup.drawEdges) {
2416
- const indicesBuf = ((geometryState.primitive === gl.TRIANGLES)
2417
- ? geometry._getEdgeIndices()
2418
- : ((geometryState.primitive === gl.LINES) && geometryState.indicesBuf));
2419
-
2420
- if (indicesBuf) {
2421
- if (geometryState.id !== lastGeometryId) {
2422
- setAttributes();
2423
-
2424
- indicesBuf.bind();
2425
- frameCtx.bindArray++;
2426
- lastGeometryId = geometryState.id;
2427
- }
2428
-
2429
- gl.drawElements(gl.LINES, indicesBuf.numItems, indicesBuf.itemType, 0);
2430
-
2431
- frameCtx.drawElements++;
2432
- }
2433
- } else {
2434
- if (geometryState.id !== lastGeometryId) {
2435
- setAttributes();
2436
-
2437
- if (geometryState.indicesBuf) {
2438
- geometryState.indicesBuf.bind();
2439
- frameCtx.bindArray++;
2440
- }
2441
- lastGeometryId = geometryState.id;
2442
- }
2443
-
2444
- if (geometryState.indicesBuf) {
2445
- gl.drawElements(geometryState.primitive, geometryState.indicesBuf.numItems, geometryState.indicesBuf.itemType, 0);
2446
- frameCtx.drawElements++;
2447
- } else if (geometryState.positionsBuf) {
2448
- gl.drawArrays(gl.TRIANGLES, 0, geometryState.positionsBuf.numItems);
2449
- frameCtx.drawArrays++;
2450
- }
2451
- }
2452
-
2453
- if (actsAsBackground) {
2454
- gl.depthFunc(gl.LESS);
2455
- }
2456
- }
2457
- };
2458
- }
2459
- };
2217
+ export {Mesh};