@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
@@ -0,0 +1,897 @@
1
+ import {ENTITY_FLAGS} from '../../ENTITY_FLAGS.js';
2
+ import {RENDER_PASSES} from '../../RENDER_PASSES.js';
3
+ import {math} from "../../../math/math.js";
4
+ import {RenderState} from "../../../webgl/RenderState.js";
5
+ import {getRenderers} from "./renderers/DTXLinesRenderers.js";
6
+ import {DTXLinesBuffer} from "./DTXLinesBuffer.js";
7
+ import {DTXLinesState} from "./DTXLinesState.js"
8
+ import {DTXLinesTextureFactory} from "./DTXLinesTextureFactory.js";
9
+ import {dataTextureRamStats} from "./dataTextureRamStats.js";
10
+ import {Configs} from "../../../../Configs.js";
11
+
12
+ const configs = new Configs();
13
+
14
+ const MAX_NUMBER_OF_OBJECTS_IN_LAYER = (1 << 16);
15
+ const MAX_DATA_TEXTURE_HEIGHT = configs.maxDataTextureHeight;
16
+ const INDICES_EDGE_INDICES_ALIGNEMENT_SIZE = 8;
17
+ const MAX_OBJECT_UPDATES_IN_FRAME_WITHOUT_BATCHED_UPDATE = 10;
18
+
19
+ const tempMat4a = new Float32Array(16);
20
+ const tempUint8Array4 = new Uint8Array(4);
21
+ const tempFloat32Array3 = new Float32Array(3);
22
+
23
+ let numLayers = 0;
24
+
25
+ const DEFAULT_MATRIX = math.identityMat4();
26
+
27
+ /**
28
+ * @private
29
+ */
30
+ export class DTXLinesLayer {
31
+
32
+ constructor(model, cfg) {
33
+
34
+ // console.info("Creating DTXLinesLayer");
35
+
36
+ dataTextureRamStats.numberOfLayers++;
37
+
38
+ this._layerNumber = numLayers++;
39
+ this.sortId = `TriDTX-${this._layerNumber}`; // State sorting key.
40
+ this.layerIndex = cfg.layerIndex; // Index of this DTXLinesLayer in {@link SceneModel#_layerList}.
41
+ this._renderers = getRenderers(model.scene);
42
+ this.model = model;
43
+ this._buffer = new DTXLinesBuffer();
44
+ this._dataTextureState = new DTXLinesState();
45
+ this._dataTextureGenerator = new DTXLinesTextureFactory();
46
+
47
+ this._state = new RenderState({
48
+ origin: math.vec3(cfg.origin),
49
+ textureState: this._dataTextureState,
50
+ numIndices8Bits: 0,
51
+ numIndices16Bits: 0,
52
+ numIndices32Bits: 0,
53
+ numVertices: 0,
54
+ });
55
+
56
+ this._numPortions = 0; // These counts are used to avoid unnecessary render passes
57
+ this._numVisibleLayerPortions = 0;
58
+ this._numTransparentLayerPortions = 0;
59
+ this._numXRayedLayerPortions = 0;
60
+ this._numSelectedLayerPortions = 0;
61
+ this._numHighlightedLayerPortions = 0;
62
+ this._numClippableLayerPortions = 0;
63
+ this._numPickableLayerPortions = 0;
64
+ this._numCulledLayerPortions = 0;
65
+
66
+ this._subPortions = [];
67
+ this._portionToSubPortionsMap = [];
68
+ this._bucketGeometries = {};
69
+ this._meshes = [];
70
+ this._aabb = math.collapseAABB3();
71
+ this.aabbDirty = true;
72
+ this._numUpdatesInFrame = 0;
73
+
74
+ /**
75
+ * The type of primitives in this layer.
76
+ */
77
+ this.primitive = cfg.primitive;
78
+
79
+ this._finalized = false;
80
+ }
81
+
82
+ get aabb() {
83
+ if (this.aabbDirty) {
84
+ math.collapseAABB3(this._aabb);
85
+ for (let i = 0, len = this._meshes.length; i < len; i++) {
86
+ math.expandAABB3(this._aabb, this._meshes[i].aabb);
87
+ }
88
+ this.aabbDirty = false;
89
+ }
90
+ return this._aabb;
91
+ }
92
+
93
+ canCreatePortion(portionCfg) {
94
+ if (this._finalized) {
95
+ throw "Already finalized";
96
+ }
97
+ const numNewPortions = portionCfg.buckets.length;
98
+ if ((this._numPortions + numNewPortions) > MAX_NUMBER_OF_OBJECTS_IN_LAYER) {
99
+ dataTextureRamStats.cannotCreatePortion.because10BitsObjectId++;
100
+ }
101
+ let retVal = (this._numPortions + numNewPortions) <= MAX_NUMBER_OF_OBJECTS_IN_LAYER;
102
+ const bucketIndex = 0; // TODO: Is this a bug?
103
+ const bucketGeometryId = portionCfg.geometryId !== undefined && portionCfg.geometryId !== null
104
+ ? `${portionCfg.geometryId}#${bucketIndex}`
105
+ : `${portionCfg.id}#${bucketIndex}`;
106
+ const alreadyHasPortionGeometry = this._bucketGeometries[bucketGeometryId];
107
+ if (!alreadyHasPortionGeometry) {
108
+ const maxIndicesOfAnyBits = Math.max(this._state.numIndices8Bits, this._state.numIndices16Bits, this._state.numIndices32Bits,);
109
+ let numVertices = 0;
110
+ let numIndices = 0;
111
+ portionCfg.buckets.forEach(bucket => {
112
+ numVertices += bucket.positionsCompressed.length / 3;
113
+ numIndices += bucket.indices.length / 2;
114
+ });
115
+ if ((this._state.numVertices + numVertices) > MAX_DATA_TEXTURE_HEIGHT * 4096 ||
116
+ (maxIndicesOfAnyBits + numIndices) > MAX_DATA_TEXTURE_HEIGHT * 4096) {
117
+ dataTextureRamStats.cannotCreatePortion.becauseTextureSize++;
118
+ }
119
+ retVal &&=
120
+ (this._state.numVertices + numVertices) <= MAX_DATA_TEXTURE_HEIGHT * 4096 &&
121
+ (maxIndicesOfAnyBits + numIndices) <= MAX_DATA_TEXTURE_HEIGHT * 4096;
122
+ }
123
+ return retVal;
124
+ }
125
+
126
+ createPortion(mesh, portionCfg) {
127
+ if (this._finalized) {
128
+ throw "Already finalized";
129
+ }
130
+ const subPortionIds = [];
131
+ // const portionAABB = portionCfg.worldAABB;
132
+ portionCfg.buckets.forEach((bucket, bucketIndex) => {
133
+ const bucketGeometryId = portionCfg.geometryId !== undefined && portionCfg.geometryId !== null
134
+ ? `${portionCfg.geometryId}#${bucketIndex}`
135
+ : `${portionCfg.id}#${bucketIndex}`;
136
+ let bucketGeometry = this._bucketGeometries[bucketGeometryId];
137
+ if (!bucketGeometry) {
138
+ bucketGeometry = this._createBucketGeometry(portionCfg, bucket);
139
+ this._bucketGeometries[bucketGeometryId] = bucketGeometry;
140
+ }
141
+ // const subPortionAABB = math.collapseAABB3(tempAABB3b);
142
+ const subPortionId = this._createSubPortion(portionCfg, bucketGeometry, bucket);
143
+ //math.expandAABB3(portionAABB, subPortionAABB);
144
+ subPortionIds.push(subPortionId);
145
+ });
146
+ const portionId = this._portionToSubPortionsMap.length;
147
+ this._portionToSubPortionsMap.push(subPortionIds);
148
+ this.model.numPortions++;
149
+ this._meshes.push(mesh);
150
+ return portionId;
151
+ }
152
+
153
+ _createBucketGeometry(portionCfg, bucket) {
154
+ if (bucket.indices) {
155
+ const alignedIndicesLen = Math.ceil((bucket.indices.length / 2) / INDICES_EDGE_INDICES_ALIGNEMENT_SIZE) * INDICES_EDGE_INDICES_ALIGNEMENT_SIZE * 2;
156
+ dataTextureRamStats.overheadSizeAlignementIndices += 2 * (alignedIndicesLen - bucket.indices.length);
157
+ const alignedIndices = new Uint32Array(alignedIndicesLen);
158
+ alignedIndices.fill(0);
159
+ alignedIndices.set(bucket.indices);
160
+ bucket.indices = alignedIndices;
161
+ }
162
+ const positionsCompressed = bucket.positionsCompressed;
163
+ const indices = bucket.indices;
164
+ const buffer = this._buffer;
165
+ buffer.positionsCompressed.push(positionsCompressed)
166
+ const vertexBase = buffer.lenPositionsCompressed / 3;
167
+ const numVertices = positionsCompressed.length / 3;
168
+ buffer.lenPositionsCompressed += positionsCompressed.length;
169
+ let indicesBase;
170
+ let numLines = 0;
171
+ if (indices) {
172
+ numLines = indices.length / 2;
173
+ let indicesBuffer;
174
+ if (numVertices <= (1 << 8)) {
175
+ indicesBuffer = buffer.indices8Bits;
176
+ indicesBase = buffer.lenIndices8Bits / 2;
177
+ buffer.lenIndices8Bits += indices.length;
178
+ } else if (numVertices <= (1 << 16)) {
179
+ indicesBuffer = buffer.indices16Bits;
180
+ indicesBase = buffer.lenIndices16Bits / 2;
181
+ buffer.lenIndices16Bits += indices.length;
182
+ } else {
183
+ indicesBuffer = buffer.indices32Bits;
184
+ indicesBase = buffer.lenIndices32Bits / 2;
185
+ buffer.lenIndices32Bits += indices.length;
186
+ }
187
+ indicesBuffer.push(indices);
188
+ }
189
+ this._state.numVertices += numVertices;
190
+ dataTextureRamStats.numberOfGeometries++;
191
+ const bucketGeometry = {
192
+ vertexBase,
193
+ numVertices,
194
+ numLines,
195
+ indicesBase
196
+ };
197
+ return bucketGeometry;
198
+ }
199
+
200
+ _createSubPortion(portionCfg, bucketGeometry) {
201
+ const color = portionCfg.color;
202
+ const colors = portionCfg.colors;
203
+ const opacity = portionCfg.opacity;
204
+ const meshMatrix = portionCfg.meshMatrix;
205
+ const pickColor = portionCfg.pickColor;
206
+ const buffer = this._buffer;
207
+ const state = this._state;
208
+ buffer.perObjectPositionsDecodeMatrices.push(portionCfg.positionsDecodeMatrix);
209
+ buffer.perObjectInstancePositioningMatrices.push(meshMatrix || DEFAULT_MATRIX);
210
+ buffer.perObjectSolid.push(!!portionCfg.solid);
211
+ if (colors) {
212
+ buffer.perObjectColors.push([colors[0] * 255, colors[1] * 255, colors[2] * 255, 255]);
213
+ } else if (color) { // Color is pre-quantized by SceneModel
214
+ buffer.perObjectColors.push([color[0], color[1], color[2], opacity]);
215
+ }
216
+ buffer.perObjectPickColors.push(pickColor);
217
+ buffer.perObjectVertexBases.push(bucketGeometry.vertexBase);
218
+ {
219
+ let currentNumIndices;
220
+ if (bucketGeometry.numVertices <= (1 << 8)) {
221
+ currentNumIndices = state.numIndices8Bits;
222
+ } else if (bucketGeometry.numVertices <= (1 << 16)) {
223
+ currentNumIndices = state.numIndices16Bits;
224
+ } else {
225
+ currentNumIndices = state.numIndices32Bits;
226
+ }
227
+ buffer.perObjectIndexBaseOffsets.push(currentNumIndices / 2 - bucketGeometry.indicesBase);
228
+ }
229
+ const subPortionId = this._subPortions.length;
230
+ if (bucketGeometry.numLines > 0) {
231
+ let numIndices = bucketGeometry.numLines * 2;
232
+ let indicesPortionIdBuffer;
233
+ if (bucketGeometry.numVertices <= (1 << 8)) {
234
+ indicesPortionIdBuffer = buffer.perLineNumberPortionId8Bits;
235
+ state.numIndices8Bits += numIndices;
236
+ dataTextureRamStats.totalLines8Bits += bucketGeometry.numLines;
237
+ } else if (bucketGeometry.numVertices <= (1 << 16)) {
238
+ indicesPortionIdBuffer = buffer.perLineNumberPortionId16Bits;
239
+ state.numIndices16Bits += numIndices;
240
+ dataTextureRamStats.totalLines16Bits += bucketGeometry.numLines;
241
+ } else {
242
+ indicesPortionIdBuffer = buffer.perLineNumberPortionId32Bits;
243
+ state.numIndices32Bits += numIndices;
244
+ dataTextureRamStats.totalLines32Bits += bucketGeometry.numLines;
245
+ }
246
+ dataTextureRamStats.totalLines += bucketGeometry.numLines;
247
+ for (let i = 0; i < bucketGeometry.numLines; i += INDICES_EDGE_INDICES_ALIGNEMENT_SIZE) {
248
+ indicesPortionIdBuffer.push(subPortionId);
249
+ }
250
+ }
251
+ this._subPortions.push({
252
+ // vertsBase: vertsIndex,
253
+ numVertices: bucketGeometry.numLines
254
+ });
255
+ this._numPortions++;
256
+ dataTextureRamStats.numberOfPortions++;
257
+ return subPortionId;
258
+ }
259
+
260
+ /**
261
+ * Builds data textures from the appended geometries and loads them into the GPU.
262
+ *
263
+ * No more portions can then be created.
264
+ */
265
+ finalize() {
266
+ if (this._finalized) {
267
+ return;
268
+ }
269
+ const state = this._state;
270
+ const textureState = this._dataTextureState;
271
+ const gl = this.model.scene.canvas.gl;
272
+ const buffer = this._buffer;
273
+ state.gl = gl;
274
+ textureState.texturePerObjectColorsAndFlags = this._dataTextureGenerator.generateTextureForColorsAndFlags(
275
+ gl,
276
+ buffer.perObjectColors,
277
+ buffer.perObjectPickColors,
278
+ buffer.perObjectVertexBases,
279
+ buffer.perObjectIndexBaseOffsets,
280
+ buffer.perObjectSolid);
281
+ textureState.texturePerObjectInstanceMatrices = this._dataTextureGenerator.generateTextureForInstancingMatrices(gl, buffer.perObjectInstancePositioningMatrices);
282
+ textureState.texturePerObjectPositionsDecodeMatrix = this._dataTextureGenerator.generateTextureForPositionsDecodeMatrices(gl, buffer.perObjectPositionsDecodeMatrices);
283
+ textureState.texturePerVertexIdCoordinates = this._dataTextureGenerator.generateTextureForPositions(gl, buffer.positionsCompressed, buffer.lenPositionsCompressed);
284
+ textureState.texturePerLineIdPortionIds8Bits = this._dataTextureGenerator.generateTextureForPackedPortionIds(gl, buffer.perLineNumberPortionId8Bits);
285
+ textureState.texturePerLineIdPortionIds16Bits = this._dataTextureGenerator.generateTextureForPackedPortionIds(gl, buffer.perLineNumberPortionId16Bits);
286
+ textureState.texturePerLineIdPortionIds32Bits = this._dataTextureGenerator.generateTextureForPackedPortionIds(gl, buffer.perLineNumberPortionId32Bits);
287
+ if (buffer.lenIndices8Bits > 0) {
288
+ textureState.texturePerLineIdIndices8Bits = this._dataTextureGenerator.generateTextureFor8BitIndices(gl, buffer.indices8Bits, buffer.lenIndices8Bits);
289
+ }
290
+ if (buffer.lenIndices16Bits > 0) {
291
+ textureState.texturePerLineIdIndices16Bits = this._dataTextureGenerator.generateTextureFor16BitIndices(gl, buffer.indices16Bits, buffer.lenIndices16Bits);
292
+ }
293
+ if (buffer.lenIndices32Bits > 0) {
294
+ textureState.texturePerLineIdIndices32Bits = this._dataTextureGenerator.generateTextureFor32BitIndices(gl, buffer.indices32Bits, buffer.lenIndices32Bits);
295
+ }
296
+ textureState.finalize();
297
+ // Free up memory
298
+ this._buffer = null;
299
+ this._bucketGeometries = {};
300
+ this._finalized = true;
301
+ this._deferredSetFlagsDirty = false; //
302
+ this._onSceneRendering = this.model.scene.on("rendering", () => {
303
+ if (this._deferredSetFlagsDirty) {
304
+ this._uploadDeferredFlags();
305
+ }
306
+ this._numUpdatesInFrame = 0;
307
+ });
308
+ }
309
+
310
+ initFlags(portionId, flags, meshTransparent) {
311
+ if (flags & ENTITY_FLAGS.VISIBLE) {
312
+ this._numVisibleLayerPortions++;
313
+ this.model.numVisibleLayerPortions++;
314
+ }
315
+ if (flags & ENTITY_FLAGS.HIGHLIGHTED) {
316
+ this._numHighlightedLayerPortions++;
317
+ this.model.numHighlightedLayerPortions++;
318
+ }
319
+ if (flags & ENTITY_FLAGS.XRAYED) {
320
+ this._numXRayedLayerPortions++;
321
+ this.model.numXRayedLayerPortions++;
322
+ }
323
+ if (flags & ENTITY_FLAGS.SELECTED) {
324
+ this._numSelectedLayerPortions++;
325
+ this.model.numSelectedLayerPortions++;
326
+ }
327
+ if (flags & ENTITY_FLAGS.CLIPPABLE) {
328
+ this._numClippableLayerPortions++;
329
+ this.model.numClippableLayerPortions++;
330
+ }
331
+ if (flags & ENTITY_FLAGS.PICKABLE) {
332
+ this._numPickableLayerPortions++;
333
+ this.model.numPickableLayerPortions++;
334
+ }
335
+ if (flags & ENTITY_FLAGS.CULLED) {
336
+ this._numCulledLayerPortions++;
337
+ this.model.numCulledLayerPortions++;
338
+ }
339
+ if (meshTransparent) {
340
+ this._numTransparentLayerPortions++;
341
+ this.model.numTransparentLayerPortions++;
342
+ }
343
+ const deferred = true;
344
+ this._setFlags(portionId, flags, meshTransparent, deferred);
345
+ this._setFlags2(portionId, flags, deferred);
346
+ }
347
+
348
+ flushInitFlags() {
349
+ this._setDeferredFlags();
350
+ this._setDeferredFlags2();
351
+ }
352
+
353
+ setVisible(portionId, flags, transparent) {
354
+ if (!this._finalized) {
355
+ throw "Not finalized";
356
+ }
357
+ if (flags & ENTITY_FLAGS.VISIBLE) {
358
+ this._numVisibleLayerPortions++;
359
+ this.model.numVisibleLayerPortions++;
360
+ } else {
361
+ this._numVisibleLayerPortions--;
362
+ this.model.numVisibleLayerPortions--;
363
+ }
364
+ this._setFlags(portionId, flags, transparent);
365
+ }
366
+
367
+ setHighlighted(portionId, flags, transparent) {
368
+ if (!this._finalized) {
369
+ throw "Not finalized";
370
+ }
371
+ if (flags & ENTITY_FLAGS.HIGHLIGHTED) {
372
+ this._numHighlightedLayerPortions++;
373
+ this.model.numHighlightedLayerPortions++;
374
+ } else {
375
+ this._numHighlightedLayerPortions--;
376
+ this.model.numHighlightedLayerPortions--;
377
+ }
378
+ this._setFlags(portionId, flags, transparent);
379
+ }
380
+
381
+ setXRayed(portionId, flags, transparent) {
382
+ if (!this._finalized) {
383
+ throw "Not finalized";
384
+ }
385
+ if (flags & ENTITY_FLAGS.XRAYED) {
386
+ this._numXRayedLayerPortions++;
387
+ this.model.numXRayedLayerPortions++;
388
+ } else {
389
+ this._numXRayedLayerPortions--;
390
+ this.model.numXRayedLayerPortions--;
391
+ }
392
+ this._setFlags(portionId, flags, transparent);
393
+ }
394
+
395
+ setSelected(portionId, flags, transparent) {
396
+ if (!this._finalized) {
397
+ throw "Not finalized";
398
+ }
399
+ if (flags & ENTITY_FLAGS.SELECTED) {
400
+ this._numSelectedLayerPortions++;
401
+ this.model.numSelectedLayerPortions++;
402
+ } else {
403
+ this._numSelectedLayerPortions--;
404
+ this.model.numSelectedLayerPortions--;
405
+ }
406
+ this._setFlags(portionId, flags, transparent);
407
+ }
408
+
409
+ setEdges(portionId, flags, transparent) {
410
+ }
411
+
412
+ setClippable(portionId, flags) {
413
+ if (!this._finalized) {
414
+ throw "Not finalized";
415
+ }
416
+ if (flags & ENTITY_FLAGS.CLIPPABLE) {
417
+ this._numClippableLayerPortions++;
418
+ this.model.numClippableLayerPortions++;
419
+ } else {
420
+ this._numClippableLayerPortions--;
421
+ this.model.numClippableLayerPortions--;
422
+ }
423
+ this._setFlags2(portionId, flags);
424
+ }
425
+
426
+ /**
427
+ * This will _start_ a "set-flags transaction".
428
+ *
429
+ * After invoking this method, calling setFlags/setFlags2 will not update
430
+ * the colors+flags texture but only store the new flags/flag2 in the
431
+ * colors+flags texture data array.
432
+ *
433
+ * After invoking this method, and when all desired setFlags/setFlags2 have
434
+ * been called on needed portions of the layer, invoke `_uploadDeferredFlags`
435
+ * to actually upload the data array into the texture.
436
+ *
437
+ * In massive "set-flags" scenarios like VFC or LOD mechanisms, the combination of
438
+ * `_beginDeferredFlags` + `_uploadDeferredFlags`brings a speed-up of
439
+ * up to 80x when e.g. objects are massively (un)culled 🚀.
440
+ */
441
+ _beginDeferredFlags() {
442
+ this._deferredSetFlagsActive = true;
443
+ }
444
+
445
+ /**
446
+ * This will _commit_ a "set-flags transaction".
447
+ *
448
+ * Invoking this method will update the colors+flags texture data with new
449
+ * flags/flags2 set since the previous invocation of `_beginDeferredFlags`.
450
+ */
451
+ _uploadDeferredFlags() {
452
+ this._deferredSetFlagsActive = false;
453
+ if (!this._deferredSetFlagsDirty) {
454
+ return;
455
+ }
456
+ this._deferredSetFlagsDirty = false;
457
+ const gl = this.model.scene.canvas.gl;
458
+ const textureState = this._dataTextureState;
459
+ gl.bindTexture(gl.TEXTURE_2D, textureState.texturePerObjectColorsAndFlags._texture);
460
+ gl.texSubImage2D(
461
+ gl.TEXTURE_2D,
462
+ 0, // level
463
+ 0, // xoffset
464
+ 0, // yoffset
465
+ textureState.texturePerObjectColorsAndFlags._textureWidth, // width
466
+ textureState.texturePerObjectColorsAndFlags._textureHeight, // width
467
+ gl.RGBA_INTEGER,
468
+ gl.UNSIGNED_BYTE,
469
+ textureState.texturePerObjectColorsAndFlags._textureData
470
+ );
471
+ }
472
+
473
+ setCulled(portionId, flags, transparent) {
474
+ if (!this._finalized) {
475
+ throw "Not finalized";
476
+ }
477
+ if (flags & ENTITY_FLAGS.CULLED) {
478
+ this._numCulledLayerPortions += this._portionToSubPortionsMap[portionId].length;
479
+ this.model.numCulledLayerPortions++;
480
+ } else {
481
+ this._numCulledLayerPortions -= this._portionToSubPortionsMap[portionId].length;
482
+ this.model.numCulledLayerPortions--;
483
+ }
484
+ this._setFlags(portionId, flags, transparent);
485
+ }
486
+
487
+ setCollidable(portionId, flags) {
488
+ if (!this._finalized) {
489
+ throw "Not finalized";
490
+ }
491
+ }
492
+
493
+ setPickable(portionId, flags, transparent) {
494
+ if (!this._finalized) {
495
+ throw "Not finalized";
496
+ }
497
+ if (flags & ENTITY_FLAGS.PICKABLE) {
498
+ this._numPickableLayerPortions++;
499
+ this.model.numPickableLayerPortions++;
500
+ } else {
501
+ this._numPickableLayerPortions--;
502
+ this.model.numPickableLayerPortions--;
503
+ }
504
+ this._setFlags(portionId, flags, transparent);
505
+ }
506
+
507
+ setColor(portionId, color) {
508
+ const subPortionIds = this._portionToSubPortionsMap[portionId];
509
+ for (let i = 0, len = subPortionIds.length; i < len; i++) {
510
+ this._subPortionSetColor(subPortionIds[i], color);
511
+ }
512
+ }
513
+
514
+ _subPortionSetColor(subPortionId, color) {
515
+ if (!this._finalized) {
516
+ throw "Not finalized";
517
+ }
518
+ // Color
519
+ const textureState = this._dataTextureState;
520
+ const gl = this.model.scene.canvas.gl;
521
+ tempUint8Array4 [0] = color[0];
522
+ tempUint8Array4 [1] = color[1];
523
+ tempUint8Array4 [2] = color[2];
524
+ tempUint8Array4 [3] = color[3];
525
+ // object colors
526
+ textureState.texturePerObjectColorsAndFlags._textureData.set(tempUint8Array4, subPortionId * 32);
527
+ if (this._deferredSetFlagsActive) {
528
+ this._deferredSetFlagsDirty = true;
529
+ return;
530
+ }
531
+ if (++this._numUpdatesInFrame >= MAX_OBJECT_UPDATES_IN_FRAME_WITHOUT_BATCHED_UPDATE) {
532
+ this._beginDeferredFlags(); // Subsequent flags updates now deferred
533
+ }
534
+ gl.bindTexture(gl.TEXTURE_2D, textureState.texturePerObjectColorsAndFlags._texture);
535
+ gl.texSubImage2D(
536
+ gl.TEXTURE_2D,
537
+ 0, // level
538
+ (subPortionId % 512) * 8, // xoffset
539
+ Math.floor(subPortionId / 512), // yoffset
540
+ 1, // width
541
+ 1, //height
542
+ gl.RGBA_INTEGER,
543
+ gl.UNSIGNED_BYTE,
544
+ tempUint8Array4
545
+ );
546
+ // gl.bindTexture (gl.TEXTURE_2D, null);
547
+ }
548
+
549
+ setTransparent(portionId, flags, transparent) {
550
+ if (transparent) {
551
+ this._numTransparentLayerPortions++;
552
+ this.model.numTransparentLayerPortions++;
553
+ } else {
554
+ this._numTransparentLayerPortions--;
555
+ this.model.numTransparentLayerPortions--;
556
+ }
557
+ this._setFlags(portionId, flags, transparent);
558
+ }
559
+
560
+ _setFlags(portionId, flags, transparent, deferred = false) {
561
+ const subPortionIds = this._portionToSubPortionsMap[portionId];
562
+ for (let i = 0, len = subPortionIds.length; i < len; i++) {
563
+ this._subPortionSetFlags(subPortionIds[i], flags, transparent, deferred);
564
+ }
565
+ }
566
+
567
+ _subPortionSetFlags(subPortionId, flags, transparent, deferred = false) {
568
+ if (!this._finalized) {
569
+ throw "Not finalized";
570
+ }
571
+
572
+ const visible = !!(flags & ENTITY_FLAGS.VISIBLE);
573
+ const xrayed = !!(flags & ENTITY_FLAGS.XRAYED);
574
+ const highlighted = !!(flags & ENTITY_FLAGS.HIGHLIGHTED);
575
+ const selected = !!(flags & ENTITY_FLAGS.SELECTED);
576
+ const pickable = !!(flags & ENTITY_FLAGS.PICKABLE);
577
+ const culled = !!(flags & ENTITY_FLAGS.CULLED);
578
+
579
+ // Color
580
+
581
+ let f0;
582
+ if (!visible || culled || xrayed) { // Highlight & select are layered on top of color - not mutually exclusive
583
+ f0 = RENDER_PASSES.NOT_RENDERED;
584
+ } else {
585
+ if (transparent) {
586
+ f0 = RENDER_PASSES.COLOR_TRANSPARENT;
587
+ } else {
588
+ f0 = RENDER_PASSES.COLOR_OPAQUE;
589
+ }
590
+ }
591
+
592
+ // Silhouette
593
+
594
+ let f1;
595
+ if (!visible || culled) {
596
+ f1 = RENDER_PASSES.NOT_RENDERED;
597
+ } else if (selected) {
598
+ f1 = RENDER_PASSES.SILHOUETTE_SELECTED;
599
+ } else if (highlighted) {
600
+ f1 = RENDER_PASSES.SILHOUETTE_HIGHLIGHTED;
601
+ } else if (xrayed) {
602
+ f1 = RENDER_PASSES.SILHOUETTE_XRAYED;
603
+ } else {
604
+ f1 = RENDER_PASSES.NOT_RENDERED;
605
+ }
606
+
607
+ // // Edges
608
+ //
609
+ // let f2 = 0;
610
+ // if (!visible || culled) {
611
+ // f2 = RENDER_PASSES.NOT_RENDERED;
612
+ // } else if (selected) {
613
+ // f2 = RENDER_PASSES.EDGES_SELECTED;
614
+ // } else if (highlighted) {
615
+ // f2 = RENDER_PASSES.EDGES_HIGHLIGHTED;
616
+ // } else if (xrayed) {
617
+ // f2 = RENDER_PASSES.EDGES_XRAYED;
618
+ // } else if (edges) {
619
+ // if (transparent) {
620
+ // f2 = RENDER_PASSES.EDGES_COLOR_TRANSPARENT;
621
+ // } else {
622
+ // f2 = RENDER_PASSES.EDGES_COLOR_OPAQUE;
623
+ // }
624
+ // } else {
625
+ // f2 = RENDER_PASSES.NOT_RENDERED;
626
+ // }
627
+
628
+ // Pick
629
+
630
+ let f3 = (visible && (!culled) && pickable) ? RENDER_PASSES.PICK : RENDER_PASSES.NOT_RENDERED;
631
+ const textureState = this._dataTextureState;
632
+ const gl = this.model.scene.canvas.gl;
633
+ tempUint8Array4 [0] = f0;
634
+ tempUint8Array4 [1] = f1;
635
+ // tempUint8Array4 [2] = f2;
636
+ tempUint8Array4 [3] = f3;
637
+ // object flags
638
+ textureState.texturePerObjectColorsAndFlags._textureData.set(tempUint8Array4, subPortionId * 32 + 8);
639
+ if (this._deferredSetFlagsActive || deferred) {
640
+ this._deferredSetFlagsDirty = true;
641
+ return;
642
+ }
643
+ if (++this._numUpdatesInFrame >= MAX_OBJECT_UPDATES_IN_FRAME_WITHOUT_BATCHED_UPDATE) {
644
+ this._beginDeferredFlags(); // Subsequent flags updates now deferred
645
+ }
646
+ gl.bindTexture(gl.TEXTURE_2D, textureState.texturePerObjectColorsAndFlags._texture);
647
+ gl.texSubImage2D(
648
+ gl.TEXTURE_2D,
649
+ 0, // level
650
+ (subPortionId % 512) * 8 + 2, // xoffset
651
+ Math.floor(subPortionId / 512), // yoffset
652
+ 1, // width
653
+ 1, //height
654
+ gl.RGBA_INTEGER,
655
+ gl.UNSIGNED_BYTE,
656
+ tempUint8Array4
657
+ );
658
+ // gl.bindTexture (gl.TEXTURE_2D, null);
659
+ }
660
+
661
+ _setDeferredFlags() {
662
+ }
663
+
664
+ _setFlags2(portionId, flags, deferred = false) {
665
+ const subPortionIds = this._portionToSubPortionsMap[portionId];
666
+ for (let i = 0, len = subPortionIds.length; i < len; i++) {
667
+ this._subPortionSetFlags2(subPortionIds[i], flags, deferred);
668
+ }
669
+ }
670
+
671
+ _subPortionSetFlags2(subPortionId, flags, deferred = false) {
672
+ if (!this._finalized) {
673
+ throw "Not finalized";
674
+ }
675
+ const clippable = !!(flags & ENTITY_FLAGS.CLIPPABLE) ? 255 : 0;
676
+ const textureState = this._dataTextureState;
677
+ const gl = this.model.scene.canvas.gl;
678
+ tempUint8Array4 [0] = clippable;
679
+ tempUint8Array4 [1] = 0;
680
+ tempUint8Array4 [2] = 1;
681
+ tempUint8Array4 [3] = 2;
682
+ // object flags2
683
+ textureState.texturePerObjectColorsAndFlags._textureData.set(tempUint8Array4, subPortionId * 32 + 12);
684
+ if (this._deferredSetFlagsActive || deferred) {
685
+ // console.log("_subPortionSetFlags2 set flags defer");
686
+ this._deferredSetFlagsDirty = true;
687
+ return;
688
+ }
689
+ if (++this._numUpdatesInFrame >= MAX_OBJECT_UPDATES_IN_FRAME_WITHOUT_BATCHED_UPDATE) {
690
+ this._beginDeferredFlags(); // Subsequent flags updates now deferred
691
+ }
692
+ gl.bindTexture(gl.TEXTURE_2D, textureState.texturePerObjectColorsAndFlags._texture);
693
+ gl.texSubImage2D(
694
+ gl.TEXTURE_2D,
695
+ 0, // level
696
+ (subPortionId % 512) * 8 + 3, // xoffset
697
+ Math.floor(subPortionId / 512), // yoffset
698
+ 1, // width
699
+ 1, //height
700
+ gl.RGBA_INTEGER,
701
+ gl.UNSIGNED_BYTE,
702
+ tempUint8Array4
703
+ );
704
+ // gl.bindTexture (gl.TEXTURE_2D, null);
705
+ }
706
+
707
+ _setDeferredFlags2() {
708
+ }
709
+
710
+ setOffset(portionId, offset) {
711
+ const subPortionIds = this._portionToSubPortionsMap[portionId];
712
+ for (let i = 0, len = subPortionIds.length; i < len; i++) {
713
+ this._subPortionSetOffset(subPortionIds[i], offset);
714
+ }
715
+ }
716
+
717
+ _subPortionSetOffset(subPortionId, offset) {
718
+ if (!this._finalized) {
719
+ throw "Not finalized";
720
+ }
721
+ // if (!this.model.scene.entityOffsetsEnabled) {
722
+ // this.model.error("Entity#offset not enabled for this Viewer"); // See Viewer entityOffsetsEnabled
723
+ // return;
724
+ // }
725
+ const textureState = this._dataTextureState;
726
+ const gl = this.model.scene.canvas.gl;
727
+ tempFloat32Array3 [0] = offset[0];
728
+ tempFloat32Array3 [1] = offset[1];
729
+ tempFloat32Array3 [2] = offset[2];
730
+ // object offset
731
+ textureState.texturePerObjectOffsets._textureData.set(tempFloat32Array3, subPortionId * 3);
732
+ if (this._deferredSetFlagsActive) {
733
+ this._deferredSetFlagsDirty = true;
734
+ return;
735
+ }
736
+ if (++this._numUpdatesInFrame >= MAX_OBJECT_UPDATES_IN_FRAME_WITHOUT_BATCHED_UPDATE) {
737
+ this._beginDeferredFlags(); // Subsequent flags updates now deferred
738
+ }
739
+ gl.bindTexture(gl.TEXTURE_2D, textureState.texturePerObjectOffsets._texture);
740
+ gl.texSubImage2D(
741
+ gl.TEXTURE_2D,
742
+ 0, // level
743
+ 0, // x offset
744
+ subPortionId, // yoffset
745
+ 1, // width
746
+ 1, // height
747
+ gl.RGB,
748
+ gl.FLOAT,
749
+ tempFloat32Array3
750
+ );
751
+ // gl.bindTexture (gl.TEXTURE_2D, null);
752
+ }
753
+
754
+ setMatrix(portionId, matrix) {
755
+ const subPortionIds = this._portionToSubPortionsMap[portionId];
756
+ for (let i = 0, len = subPortionIds.length; i < len; i++) {
757
+ this._subPortionSetMatrix(subPortionIds[i], matrix);
758
+ }
759
+ }
760
+
761
+ _subPortionSetMatrix(subPortionId, matrix) {
762
+ if (!this._finalized) {
763
+ throw "Not finalized";
764
+ }
765
+ // if (!this.model.scene.entityMatrixsEnabled) {
766
+ // this.model.error("Entity#matrix not enabled for this Viewer"); // See Viewer entityMatrixsEnabled
767
+ // return;
768
+ // }
769
+ const textureState = this._dataTextureState;
770
+ const gl = this.model.scene.canvas.gl;
771
+ tempMat4a.set(matrix);
772
+ textureState.texturePerObjectInstanceMatrices._textureData.set(tempMat4a, subPortionId * 16);
773
+ if (this._deferredSetFlagsActive) {
774
+ this._deferredSetFlagsDirty = true;
775
+ return;
776
+ }
777
+ if (++this._numUpdatesInFrame >= MAX_OBJECT_UPDATES_IN_FRAME_WITHOUT_BATCHED_UPDATE) {
778
+ this._beginDeferredFlags(); // Subsequent flags updates now deferred
779
+ }
780
+ gl.bindTexture(gl.TEXTURE_2D, textureState.texturePerObjectInstanceMatrices._texture);
781
+ gl.texSubImage2D(
782
+ gl.TEXTURE_2D,
783
+ 0, // level
784
+ (subPortionId % 512) * 4, // xoffset
785
+ Math.floor(subPortionId / 512), // yoffset
786
+ // 1,
787
+ 4, // width
788
+ 1, // height
789
+ gl.RGBA,
790
+ gl.FLOAT,
791
+ tempMat4a
792
+ );
793
+ // gl.bindTexture (gl.TEXTURE_2D, null);
794
+ }
795
+
796
+ // ---------------------- COLOR RENDERING -----------------------------------
797
+
798
+ drawColorOpaque(renderFlags, frameCtx) {
799
+ if (this._numCulledLayerPortions === this._numPortions || this._numVisibleLayerPortions === 0 || this._numTransparentLayerPortions === this._numPortions || this._numXRayedLayerPortions === this._numPortions) {
800
+ return;
801
+ }
802
+ if (this._renderers.colorRenderer) {
803
+ this._renderers.colorRenderer.drawLayer(frameCtx, this, RENDER_PASSES.COLOR_OPAQUE);
804
+ }
805
+ }
806
+
807
+ drawColorTransparent(renderFlags, frameCtx) {
808
+ if (this._numCulledLayerPortions === this._numPortions || this._numVisibleLayerPortions === 0 || this._numTransparentLayerPortions === 0 || this._numXRayedLayerPortions === this._numPortions) {
809
+ return;
810
+ }
811
+ if (this._renderers.colorRenderer) {
812
+ this._renderers.colorRenderer.drawLayer(frameCtx, this, RENDER_PASSES.COLOR_TRANSPARENT);
813
+ }
814
+ }
815
+
816
+ drawDepth(renderFlags, frameCtx) {
817
+ }
818
+
819
+ drawNormals(renderFlags, frameCtx) {
820
+ }
821
+
822
+ drawSilhouetteXRayed(renderFlags, frameCtx) {
823
+ // if (this._numCulledLayerPortions === this._numPortions || this._numVisibleLayerPortions === 0 || this._numXRayedLayerPortions === 0) {
824
+ // return;
825
+ // }
826
+ // if (this._renderers.silhouetteRenderer) {
827
+ // this._renderers.silhouetteRenderer.drawLayer(frameCtx, this, RENDER_PASSES.SILHOUETTE_XRAYED);
828
+ // }
829
+ }
830
+
831
+ drawSilhouetteHighlighted(renderFlags, frameCtx) {
832
+ // if (this._numCulledLayerPortions === this._numPortions || this._numVisibleLayerPortions === 0 || this._numHighlightedLayerPortions === 0) {
833
+ // return;
834
+ // }
835
+ // if (this._renderers.silhouetteRenderer) {
836
+ // this._renderers.silhouetteRenderer.drawLayer(frameCtx, this, RENDER_PASSES.SILHOUETTE_HIGHLIGHTED);
837
+ // }
838
+ }
839
+
840
+ drawSilhouetteSelected(renderFlags, frameCtx) {
841
+ // if (this._numCulledLayerPortions === this._numPortions || this._numVisibleLayerPortions === 0 || this._numSelectedLayerPortions === 0) {
842
+ // return;
843
+ // }
844
+ // if (this._renderers.silhouetteRenderer) {
845
+ // this._renderers.silhouetteRenderer.drawLayer(frameCtx, this, RENDER_PASSES.SILHOUETTE_SELECTED);
846
+ // }
847
+ }
848
+
849
+ drawEdgesColorOpaque(renderFlags, frameCtx) {
850
+ }
851
+
852
+ drawEdgesColorTransparent(renderFlags, frameCtx) {
853
+ }
854
+
855
+ drawEdgesHighlighted(renderFlags, frameCtx) {
856
+ }
857
+
858
+ drawEdgesSelected(renderFlags, frameCtx) {
859
+ }
860
+
861
+ drawEdgesXRayed(renderFlags, frameCtx) {
862
+ }
863
+
864
+ drawOcclusion(renderFlags, frameCtx) {
865
+ }
866
+
867
+ drawShadow(renderFlags, frameCtx) {
868
+ }
869
+
870
+ setPickMatrices(pickViewMatrix, pickProjMatrix) {
871
+ }
872
+
873
+ drawPickMesh(renderFlags, frameCtx) {
874
+ }
875
+
876
+ drawPickDepths(renderFlags, frameCtx) {
877
+ }
878
+
879
+ drawSnapInit(renderFlags, frameCtx) {
880
+ }
881
+
882
+ drawSnap(renderFlags, frameCtx) {
883
+ }
884
+
885
+ drawPickNormals(renderFlags, frameCtx) {
886
+ }
887
+
888
+ destroy() {
889
+ if (this._destroyed) {
890
+ return;
891
+ }
892
+ const state = this._state;
893
+ this.model.scene.off(this._onSceneRendering);
894
+ state.destroy();
895
+ this._destroyed = true;
896
+ }
897
+ }