@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,688 @@
1
+ import {ENTITY_FLAGS} from '../../../ENTITY_FLAGS.js';
2
+ import {RENDER_PASSES} from '../../../RENDER_PASSES.js';
3
+
4
+ import {math} from "../../../../math/math.js";
5
+ import {RenderState} from "../../../../webgl/RenderState.js";
6
+ import {ArrayBuf} from "../../../../webgl/ArrayBuf.js";
7
+ import {getRenderers} from "./renderers/VBOBatchingPointsRenderers.js";
8
+ import {quantizePositions} from "../../../compression.js";
9
+
10
+ /**
11
+ * @private
12
+ */
13
+ export class VBOBatchingPointsLayer {
14
+
15
+ /**
16
+ * @param model
17
+ * @param cfg
18
+ * @param cfg.layerIndex
19
+ * @param cfg.positionsDecodeMatrix
20
+ * @param cfg.maxGeometryBatchSize
21
+ * @param cfg.origin
22
+ * @param cfg.scratchMemory
23
+ */
24
+ constructor(cfg) {
25
+
26
+ // console.info("Creating VBOBatchingPointsLayer");
27
+
28
+ /**
29
+ * Owner model
30
+ * @type {VBOSceneModel}
31
+ */
32
+ this.model = cfg.model;
33
+
34
+ /**
35
+ * State sorting key.
36
+ * @type {string}
37
+ */
38
+ this.sortId = "PointsBatchingLayer";
39
+
40
+ /**
41
+ * Index of this PointsBatchingLayer in {@link VBOSceneModel#_layerList}.
42
+ * @type {Number}
43
+ */
44
+ this.layerIndex = cfg.layerIndex;
45
+
46
+ this._renderers = getRenderers(cfg.model.scene);
47
+
48
+ const maxGeometryBatchSize = cfg.maxGeometryBatchSize || 5000000;
49
+
50
+ const attribute = function() {
51
+ const portions = [ ];
52
+
53
+ return {
54
+ append: function(data, times = 1, denormalizeScale = 1.0) {
55
+ portions.push({ data: data, times: times, denormalizeScale: denormalizeScale });
56
+ },
57
+ compileBuffer: function(type) {
58
+ let len = 0;
59
+ portions.forEach(p => { len += p.times * p.data.length; });
60
+ const buf = new type(len);
61
+
62
+ let begin = 0;
63
+ portions.forEach(p => {
64
+ const data = p.data;
65
+ const dScale = p.denormalizeScale;
66
+ const subBuf = buf.subarray(begin);
67
+
68
+ if (dScale === 1.0) {
69
+ subBuf.set(data, 0);
70
+ } else {
71
+ for (let i = 0; i < data.length; ++i) {
72
+ subBuf[i] = data[i] * dScale;
73
+ }
74
+ }
75
+
76
+ let soFar = data.length;
77
+ const allDataLen = p.times * data.length;
78
+ while (soFar < allDataLen) {
79
+ const toCopy = Math.min(soFar, allDataLen - soFar);
80
+ subBuf.set(subBuf.subarray(0, toCopy), soFar);
81
+ soFar += toCopy;
82
+ }
83
+
84
+ begin += soFar;
85
+ });
86
+
87
+ return buf;
88
+ }
89
+ };
90
+ };
91
+
92
+ this._buffer = {
93
+ maxVerts: maxGeometryBatchSize,
94
+ positions: attribute(),
95
+ colors: attribute(),
96
+ pickColors: attribute(),
97
+ vertsIndex: 0
98
+ };
99
+
100
+ this._scratchMemory = cfg.scratchMemory;
101
+
102
+ this._state = new RenderState({
103
+ positionsBuf: null,
104
+ offsetsBuf: null,
105
+ colorsBuf: null,
106
+ flagsBuf: null,
107
+ positionsDecodeMatrix: math.mat4(),
108
+ origin: null
109
+ });
110
+
111
+ // These counts are used to avoid unnecessary render passes
112
+ this._numPortions = 0;
113
+ this._numVisibleLayerPortions = 0;
114
+ this._numTransparentLayerPortions = 0;
115
+ this._numXRayedLayerPortions = 0;
116
+ this._numSelectedLayerPortions = 0;
117
+ this._numHighlightedLayerPortions = 0;
118
+ this._numClippableLayerPortions = 0;
119
+ this._numPickableLayerPortions = 0;
120
+ this._numCulledLayerPortions = 0;
121
+
122
+ this._modelAABB = math.collapseAABB3(); // Model-space AABB
123
+ this._portions = [];
124
+ this._meshes = [];
125
+
126
+ this._aabb = math.collapseAABB3();
127
+ this.aabbDirty = true;
128
+
129
+ this._finalized = false;
130
+
131
+ if (cfg.positionsDecodeMatrix) {
132
+ this._state.positionsDecodeMatrix.set(cfg.positionsDecodeMatrix);
133
+ this._preCompressedPositionsExpected = true;
134
+ } else {
135
+ this._preCompressedPositionsExpected = false;
136
+ }
137
+
138
+ if (cfg.origin) {
139
+ this._state.origin = math.vec3(cfg.origin);
140
+ }
141
+ }
142
+
143
+ get aabb() {
144
+ if (this.aabbDirty) {
145
+ math.collapseAABB3(this._aabb);
146
+ for (let i = 0, len = this._meshes.length; i < len; i++) {
147
+ math.expandAABB3(this._aabb, this._meshes[i].aabb);
148
+ }
149
+ this.aabbDirty = false;
150
+ }
151
+ return this._aabb;
152
+ }
153
+
154
+ /**
155
+ * Tests if there is room for another portion in this PointsBatchingLayer.
156
+ *
157
+ * @param lenPositions Number of positions we'd like to create in the portion.
158
+ * @returns {Boolean} True if OK to create another portion.
159
+ */
160
+ canCreatePortion(lenPositions) {
161
+ if (this._finalized) {
162
+ throw "Already finalized";
163
+ }
164
+ return (this._buffer.vertsIndex + (lenPositions / 3)) <= this._buffer.maxVerts;
165
+ }
166
+
167
+ /**
168
+ * Creates a new portion within this PointsBatchingLayer, returns the new portion ID.
169
+ *
170
+ * Gives the portion the specified geometry, color and matrix.
171
+ *
172
+ * @param mesh The SceneModelMesh that owns the portion
173
+ * @param cfg.positions Flat float Local-space positions array.
174
+ * @param cfg.positionsCompressed Flat quantized positions array - decompressed with PointsBatchingLayer positionsDecodeMatrix
175
+ * @param [cfg.colorsCompressed] Quantized RGB colors [0..255,0..255,0..255,0..255]
176
+ * @param [cfg.colors] Flat float colors array.
177
+ * @param cfg.color Float RGB color [0..1,0..1,0..1]
178
+ * @param [cfg.meshMatrix] Flat float 4x4 matrix
179
+ * @param cfg.aabb Flat float AABB World-space AABB
180
+ * @param cfg.pickColor Quantized pick color
181
+ * @returns {number} Portion ID
182
+ */
183
+ createPortion(mesh, cfg) {
184
+
185
+ if (this._finalized) {
186
+ throw "Already finalized";
187
+ }
188
+
189
+ const buffer = this._buffer;
190
+
191
+ const positions = this._preCompressedPositionsExpected ? cfg.positionsCompressed : cfg.positions;
192
+ if (! positions) {
193
+ throw ((this._preCompressedPositionsExpected ? "positionsCompressed" : "positions") + " expected");
194
+ }
195
+
196
+ buffer.positions.append(positions);
197
+
198
+ const numVerts = positions.length / 3;
199
+
200
+ const color = cfg.color;
201
+ const colorsCompressed = cfg.colorsCompressed;
202
+ const colors = cfg.colors;
203
+ const pickColor = cfg.pickColor;
204
+
205
+ if (colorsCompressed) {
206
+ buffer.colors.append(colorsCompressed);
207
+ } else if (colors) {
208
+ buffer.colors.append(colors, 1, 255.0);
209
+ } else if (color) {
210
+ // Color is pre-quantized by VBOSceneModel
211
+ buffer.colors.append([ color[0], color[1], color[2], 1.0 ], numVerts);
212
+ }
213
+
214
+ buffer.pickColors.append(pickColor.slice(0, 4), numVerts);
215
+
216
+ math.expandAABB3(this._modelAABB, cfg.aabb);
217
+
218
+ const portionId = this._portions.length / 2;
219
+
220
+ this._portions.push(this._buffer.vertsIndex);
221
+ this._portions.push(numVerts);
222
+ this._buffer.vertsIndex += numVerts;
223
+
224
+ this._numPortions++;
225
+ this.model.numPortions++;
226
+ this._meshes.push(mesh);
227
+ return portionId;
228
+ }
229
+
230
+ /**
231
+ * Builds batch VBOs from appended geometries.
232
+ * No more portions can then be created.
233
+ */
234
+ finalize() {
235
+
236
+ if (this._finalized) {
237
+ return;
238
+ }
239
+
240
+ const state = this._state;
241
+ const gl = this.model.scene.canvas.gl;
242
+ const buffer = this._buffer;
243
+ const maybeCreateGlBuffer = (srcData, size, usage) => (srcData.length > 0) ? new ArrayBuf(gl, gl.ARRAY_BUFFER, srcData, srcData.length, size, usage) : null;
244
+
245
+ const positions = (this._preCompressedPositionsExpected
246
+ ? buffer.positions.compileBuffer(Uint16Array)
247
+ : (quantizePositions(buffer.positions.compileBuffer(Float32Array), this._modelAABB, state.positionsDecodeMatrix)));
248
+ state.positionsBuf = maybeCreateGlBuffer(positions, 3, gl.STATIC_DRAW);
249
+
250
+ state.flagsBuf = maybeCreateGlBuffer(new Float32Array(this._buffer.vertsIndex), 1, gl.DYNAMIC_DRAW); // Because we build flags arrays here, get their length from the positions array
251
+
252
+ state.colorsBuf = maybeCreateGlBuffer(buffer.colors.compileBuffer(Uint8Array), 4, gl.STATIC_DRAW);
253
+
254
+ state.pickColorsBuf = maybeCreateGlBuffer(buffer.pickColors.compileBuffer(Uint8Array), 4, gl.STATIC_DRAW);
255
+
256
+ state.offsetsBuf = this.model.scene.entityOffsetsEnabled ? maybeCreateGlBuffer(new Float32Array(this._buffer.vertsIndex * 3), 3, gl.DYNAMIC_DRAW) : null;
257
+
258
+ this._buffer = null;
259
+ this._finalized = true;
260
+ }
261
+
262
+ initFlags(portionId, flags, meshTransparent) {
263
+ if (flags & ENTITY_FLAGS.VISIBLE) {
264
+ this._numVisibleLayerPortions++;
265
+ this.model.numVisibleLayerPortions++;
266
+ }
267
+ if (flags & ENTITY_FLAGS.HIGHLIGHTED) {
268
+ this._numHighlightedLayerPortions++;
269
+ this.model.numHighlightedLayerPortions++;
270
+ }
271
+ if (flags & ENTITY_FLAGS.XRAYED) {
272
+ this._numXRayedLayerPortions++;
273
+ this.model.numXRayedLayerPortions++;
274
+ }
275
+ if (flags & ENTITY_FLAGS.SELECTED) {
276
+ this._numSelectedLayerPortions++;
277
+ this.model.numSelectedLayerPortions++;
278
+ }
279
+ if (flags & ENTITY_FLAGS.CLIPPABLE) {
280
+ this._numClippableLayerPortions++;
281
+ this.model.numClippableLayerPortions++;
282
+ }
283
+ if (flags & ENTITY_FLAGS.PICKABLE) {
284
+ this._numPickableLayerPortions++;
285
+ this.model.numPickableLayerPortions++;
286
+ }
287
+ if (flags & ENTITY_FLAGS.CULLED) {
288
+ this._numCulledLayerPortions++;
289
+ this.model.numCulledLayerPortions++;
290
+ }
291
+ if (meshTransparent) {
292
+ this._numTransparentLayerPortions++;
293
+ this.model.numTransparentLayerPortions++;
294
+ }
295
+ this._setFlags(portionId, flags, meshTransparent);
296
+ }
297
+
298
+ setVisible(portionId, flags, transparent) {
299
+ if (!this._finalized) {
300
+ throw "Not finalized";
301
+ }
302
+ if (flags & ENTITY_FLAGS.VISIBLE) {
303
+ this._numVisibleLayerPortions++;
304
+ this.model.numVisibleLayerPortions++;
305
+ } else {
306
+ this._numVisibleLayerPortions--;
307
+ this.model.numVisibleLayerPortions--;
308
+ }
309
+ this._setFlags(portionId, flags, transparent);
310
+ }
311
+
312
+ setHighlighted(portionId, flags, transparent) {
313
+ if (!this._finalized) {
314
+ throw "Not finalized";
315
+ }
316
+ if (flags & ENTITY_FLAGS.HIGHLIGHTED) {
317
+ this._numHighlightedLayerPortions++;
318
+ this.model.numHighlightedLayerPortions++;
319
+ } else {
320
+ this._numHighlightedLayerPortions--;
321
+ this.model.numHighlightedLayerPortions--;
322
+ }
323
+ this._setFlags(portionId, flags, transparent);
324
+ }
325
+
326
+ setXRayed(portionId, flags, transparent) {
327
+ if (!this._finalized) {
328
+ throw "Not finalized";
329
+ }
330
+ if (flags & ENTITY_FLAGS.XRAYED) {
331
+ this._numXRayedLayerPortions++;
332
+ this.model.numXRayedLayerPortions++;
333
+ } else {
334
+ this._numXRayedLayerPortions--;
335
+ this.model.numXRayedLayerPortions--;
336
+ }
337
+ this._setFlags(portionId, flags, transparent);
338
+ }
339
+
340
+ setSelected(portionId, flags, transparent) {
341
+ if (!this._finalized) {
342
+ throw "Not finalized";
343
+ }
344
+ if (flags & ENTITY_FLAGS.SELECTED) {
345
+ this._numSelectedLayerPortions++;
346
+ this.model.numSelectedLayerPortions++;
347
+ } else {
348
+ this._numSelectedLayerPortions--;
349
+ this.model.numSelectedLayerPortions--;
350
+ }
351
+ this._setFlags(portionId, flags, transparent);
352
+ }
353
+
354
+ setEdges(portionId, flags, transparent) {
355
+ if (!this._finalized) {
356
+ throw "Not finalized";
357
+ }
358
+ // Not applicable to point clouds
359
+ }
360
+
361
+ setClippable(portionId, flags) {
362
+ if (!this._finalized) {
363
+ throw "Not finalized";
364
+ }
365
+ if (flags & ENTITY_FLAGS.CLIPPABLE) {
366
+ this._numClippableLayerPortions++;
367
+ this.model.numClippableLayerPortions++;
368
+ } else {
369
+ this._numClippableLayerPortions--;
370
+ this.model.numClippableLayerPortions--;
371
+ }
372
+ this._setFlags(portionId, flags);
373
+ }
374
+
375
+ setCulled(portionId, flags, transparent) {
376
+ if (!this._finalized) {
377
+ throw "Not finalized";
378
+ }
379
+ if (flags & ENTITY_FLAGS.CULLED) {
380
+ this._numCulledLayerPortions++;
381
+ this.model.numCulledLayerPortions++;
382
+ } else {
383
+ this._numCulledLayerPortions--;
384
+ this.model.numCulledLayerPortions--;
385
+ }
386
+ this._setFlags(portionId, flags, transparent);
387
+ }
388
+
389
+ setCollidable(portionId, flags) {
390
+ if (!this._finalized) {
391
+ throw "Not finalized";
392
+ }
393
+ }
394
+
395
+ setPickable(portionId, flags, transparent) {
396
+ if (!this._finalized) {
397
+ throw "Not finalized";
398
+ }
399
+ if (flags & ENTITY_FLAGS.PICKABLE) {
400
+ this._numPickableLayerPortions++;
401
+ this.model.numPickableLayerPortions++;
402
+ } else {
403
+ this._numPickableLayerPortions--;
404
+ this.model.numPickableLayerPortions--;
405
+ }
406
+ this._setFlags(portionId, flags, transparent);
407
+ }
408
+
409
+ setColor(portionId, color) {
410
+ if (!this._finalized) {
411
+ throw "Not finalized";
412
+ }
413
+ const portionsIdx = portionId * 2;
414
+ const vertexBase = this._portions[portionsIdx];
415
+ const numVerts = this._portions[portionsIdx + 1];
416
+ const firstColor = vertexBase * 4;
417
+ const lenColor = numVerts * 4;
418
+ const tempArray = this._scratchMemory.getUInt8Array(lenColor);
419
+ const r = color[0];
420
+ const g = color[1];
421
+ const b = color[2];
422
+ for (let i = 0; i < lenColor; i += 4) {
423
+ tempArray[i + 0] = r;
424
+ tempArray[i + 1] = g;
425
+ tempArray[i + 2] = b;
426
+ }
427
+ this._state.colorsBuf.setData(tempArray, firstColor, lenColor);
428
+ }
429
+
430
+ setTransparent(portionId, flags, transparent) {
431
+ if (transparent) {
432
+ this._numTransparentLayerPortions++;
433
+ this.model.numTransparentLayerPortions++;
434
+ } else {
435
+ this._numTransparentLayerPortions--;
436
+ this.model.numTransparentLayerPortions--;
437
+ }
438
+ this._setFlags(portionId, flags, transparent);
439
+ }
440
+
441
+ /**
442
+ * flags are 4bits values encoded on a 32bit base. color flag on the first 4 bits, silhouette flag on the next 4 bits and so on for edge, pick and clippable.
443
+ */
444
+ _setFlags(portionId, flags, transparent) {
445
+
446
+ if (!this._finalized) {
447
+ throw "Not finalized";
448
+ }
449
+
450
+ const portionsIdx = portionId * 2;
451
+ const vertexBase = this._portions[portionsIdx];
452
+ const numVerts = this._portions[portionsIdx + 1];
453
+ const firstFlag = vertexBase;
454
+ const lenFlags = numVerts;
455
+ const tempArray = this._scratchMemory.getFloat32Array(lenFlags);
456
+
457
+ const visible = !!(flags & ENTITY_FLAGS.VISIBLE);
458
+ const xrayed = !!(flags & ENTITY_FLAGS.XRAYED);
459
+ const highlighted = !!(flags & ENTITY_FLAGS.HIGHLIGHTED);
460
+ const selected = !!(flags & ENTITY_FLAGS.SELECTED);
461
+ const pickable = !!(flags & ENTITY_FLAGS.PICKABLE);
462
+ const culled = !!(flags & ENTITY_FLAGS.CULLED);
463
+
464
+ let colorFlag;
465
+ if (!visible || culled || xrayed
466
+ || (highlighted && !this.model.scene.highlightMaterial.glowThrough)
467
+ || (selected && !this.model.scene.selectedMaterial.glowThrough)) {
468
+ colorFlag = RENDER_PASSES.NOT_RENDERED;
469
+ } else {
470
+ if (transparent) {
471
+ colorFlag = RENDER_PASSES.COLOR_TRANSPARENT;
472
+ } else {
473
+ colorFlag = RENDER_PASSES.COLOR_OPAQUE;
474
+ }
475
+ }
476
+
477
+ let silhouetteFlag;
478
+ if (!visible || culled) {
479
+ silhouetteFlag = RENDER_PASSES.NOT_RENDERED;
480
+ } else if (selected) {
481
+ silhouetteFlag = RENDER_PASSES.SILHOUETTE_SELECTED;
482
+ } else if (highlighted) {
483
+ silhouetteFlag = RENDER_PASSES.SILHOUETTE_HIGHLIGHTED;
484
+ } else if (xrayed) {
485
+ silhouetteFlag = RENDER_PASSES.SILHOUETTE_XRAYED;
486
+ } else {
487
+ silhouetteFlag = RENDER_PASSES.NOT_RENDERED;
488
+ }
489
+
490
+ let pickFlag = (visible && !culled && pickable) ? RENDER_PASSES.PICK : RENDER_PASSES.NOT_RENDERED;
491
+
492
+ const clippableFlag = !!(flags & ENTITY_FLAGS.CLIPPABLE) ? 1 : 0;
493
+
494
+ for (let i = 0; i < lenFlags; i++) {
495
+ let vertFlag = 0;
496
+ vertFlag |= colorFlag;
497
+ vertFlag |= silhouetteFlag << 4;
498
+ // no edges
499
+ vertFlag |= pickFlag << 12;
500
+ vertFlag |= clippableFlag << 16;
501
+
502
+ tempArray[i] = vertFlag;
503
+ }
504
+
505
+ this._state.flagsBuf.setData(tempArray, firstFlag);
506
+ }
507
+
508
+ setOffset(portionId, offset) {
509
+ if (!this._finalized) {
510
+ throw "Not finalized";
511
+ }
512
+ if (!this.model.scene.entityOffsetsEnabled) {
513
+ this.model.error("Entity#offset not enabled for this Viewer"); // See Viewer entityOffsetsEnabled
514
+ return;
515
+ }
516
+ const portionsIdx = portionId * 2;
517
+ const vertexBase = this._portions[portionsIdx];
518
+ const numVerts = this._portions[portionsIdx + 1];
519
+ const firstOffset = vertexBase * 3;
520
+ const lenOffsets = numVerts * 3;
521
+ const tempArray = this._scratchMemory.getFloat32Array(lenOffsets);
522
+ const x = offset[0];
523
+ const y = offset[1];
524
+ const z = offset[2];
525
+ for (let i = 0; i < lenOffsets; i += 3) {
526
+ tempArray[i + 0] = x;
527
+ tempArray[i + 1] = y;
528
+ tempArray[i + 2] = z;
529
+ }
530
+ this._state.offsetsBuf.setData(tempArray, firstOffset, lenOffsets);
531
+ }
532
+
533
+ //-- NORMAL RENDERING ----------------------------------------------------------------------------------------------
534
+
535
+ drawColorOpaque(renderFlags, frameCtx) {
536
+ if (this._numCulledLayerPortions === this._numPortions || this._numVisibleLayerPortions === 0 || this._numTransparentLayerPortions === this._numPortions || this._numXRayedLayerPortions === this._numPortions) {
537
+ return;
538
+ }
539
+ if (this._renderers.colorRenderer) {
540
+ this._renderers.colorRenderer.drawLayer(frameCtx, this, RENDER_PASSES.COLOR_OPAQUE);
541
+ }
542
+ }
543
+
544
+ drawColorTransparent(renderFlags, frameCtx) {
545
+ if (this._numCulledLayerPortions === this._numPortions || this._numVisibleLayerPortions === 0 || this._numTransparentLayerPortions === 0 || this._numXRayedLayerPortions === this._numPortions) {
546
+ return;
547
+ }
548
+ if (this._renderers.colorRenderer) {
549
+ this._renderers.colorRenderer.drawLayer(frameCtx, this, RENDER_PASSES.COLOR_TRANSPARENT);
550
+ }
551
+ }
552
+
553
+ // -- RENDERING SAO POST EFFECT TARGETS ----------------------------------------------------------------------------
554
+
555
+ drawDepth(renderFlags, frameCtx) {
556
+ }
557
+
558
+ drawNormals(renderFlags, frameCtx) {
559
+ }
560
+
561
+ // -- EMPHASIS RENDERING -------------------------------------------------------------------------------------------
562
+
563
+ drawSilhouetteXRayed(renderFlags, frameCtx) {
564
+ if (this._numCulledLayerPortions === this._numPortions || this._numVisibleLayerPortions === 0 || this._numXRayedLayerPortions === 0) {
565
+ return;
566
+ }
567
+ if (this._renderers.silhouetteRenderer) {
568
+ this._renderers.silhouetteRenderer.drawLayer(frameCtx, this, RENDER_PASSES.SILHOUETTE_XRAYED);
569
+ }
570
+ }
571
+
572
+ drawSilhouetteHighlighted(renderFlags, frameCtx) {
573
+ if (this._numCulledLayerPortions === this._numPortions || this._numVisibleLayerPortions === 0 || this._numHighlightedLayerPortions === 0) {
574
+ return;
575
+ }
576
+ if (this._renderers.silhouetteRenderer) {
577
+ this._renderers.silhouetteRenderer.drawLayer(frameCtx, this, RENDER_PASSES.SILHOUETTE_HIGHLIGHTED);
578
+ }
579
+ }
580
+
581
+ drawSilhouetteSelected(renderFlags, frameCtx) {
582
+ if (this._numCulledLayerPortions === this._numPortions || this._numVisibleLayerPortions === 0 || this._numSelectedLayerPortions === 0) {
583
+ return;
584
+ }
585
+ if (this._renderers.silhouetteRenderer) {
586
+ this._renderers.silhouetteRenderer.drawLayer(frameCtx, this, RENDER_PASSES.SILHOUETTE_SELECTED);
587
+ }
588
+ }
589
+
590
+ //-- EDGES RENDERING -----------------------------------------------------------------------------------------------
591
+
592
+ drawEdgesColorOpaque(renderFlags, frameCtx) {
593
+ }
594
+
595
+ drawEdgesColorTransparent(renderFlags, frameCtx) {
596
+ }
597
+
598
+ drawEdgesHighlighted(renderFlags, frameCtx) {
599
+ }
600
+
601
+ drawEdgesSelected(renderFlags, frameCtx) {
602
+ }
603
+
604
+ drawEdgesXRayed(renderFlags, frameCtx) {
605
+ }
606
+
607
+ //---- PICKING ----------------------------------------------------------------------------------------------------
608
+
609
+ drawPickMesh(renderFlags, frameCtx) {
610
+ if (this._numCulledLayerPortions === this._numPortions || this._numVisibleLayerPortions === 0) {
611
+ return;
612
+ }
613
+ if (this._renderers.pickMeshRenderer) {
614
+ this._renderers.pickMeshRenderer.drawLayer(frameCtx, this, RENDER_PASSES.PICK);
615
+ }
616
+ }
617
+
618
+ drawPickDepths(renderFlags, frameCtx) {
619
+ if (this._numCulledLayerPortions === this._numPortions || this._numVisibleLayerPortions === 0) {
620
+ return;
621
+ }
622
+ if (this._renderers.pickDepthRenderer) {
623
+ this._renderers.pickDepthRenderer.drawLayer(frameCtx, this, RENDER_PASSES.PICK);
624
+ }
625
+ }
626
+
627
+ drawPickNormals(renderFlags, frameCtx) {
628
+ }
629
+
630
+ drawSnapInit(renderFlags, frameCtx) {
631
+ if (this._numCulledLayerPortions === this._numPortions || this._numVisibleLayerPortions === 0) {
632
+ return;
633
+ }
634
+ if (this._renderers.snapInitRenderer) {
635
+ this._renderers.snapInitRenderer.drawLayer(frameCtx, this, RENDER_PASSES.PICK);
636
+ }
637
+ }
638
+
639
+ drawSnap(renderFlags, frameCtx) {
640
+ if (this._numCulledLayerPortions === this._numPortions || this._numVisibleLayerPortions === 0) {
641
+ return;
642
+ }
643
+ if (this._renderers.snapRenderer) {
644
+ this._renderers.snapRenderer.drawLayer(frameCtx, this, RENDER_PASSES.PICK);
645
+ }
646
+ }
647
+
648
+ //---- OCCLUSION TESTING -------------------------------------------------------------------------------------------
649
+
650
+ drawOcclusion(renderFlags, frameCtx) {
651
+ if (this._numCulledLayerPortions === this._numPortions || this._numVisibleLayerPortions === 0) {
652
+ return;
653
+ }
654
+ if (this._renderers.occlusionRenderer) {
655
+ this._renderers.occlusionRenderer.drawLayer(frameCtx, this, RENDER_PASSES.COLOR_OPAQUE);
656
+ }
657
+ }
658
+
659
+ //---- SHADOWS -----------------------------------------------------------------------------------------------------
660
+
661
+ drawShadow(renderFlags, frameCtx) {
662
+ }
663
+
664
+ destroy() {
665
+ const state = this._state;
666
+ if (state.positionsBuf) {
667
+ state.positionsBuf.destroy();
668
+ state.positionsBuf = null;
669
+ }
670
+ if (state.offsetsBuf) {
671
+ state.offsetsBuf.destroy();
672
+ state.offsetsBuf = null;
673
+ }
674
+ if (state.colorsBuf) {
675
+ state.colorsBuf.destroy();
676
+ state.colorsBuf = null;
677
+ }
678
+ if (state.flagsBuf) {
679
+ state.flagsBuf.destroy();
680
+ state.flagsBuf = null;
681
+ }
682
+ if (state.pickColorsBuf) {
683
+ state.pickColorsBuf.destroy();
684
+ state.pickColorsBuf = null;
685
+ }
686
+ state.destroy();
687
+ }
688
+ }
@@ -0,0 +1,24 @@
1
+ import {VBORenderer} from "../../VBORenderer.js";
2
+
3
+ /**
4
+ * @private
5
+ */
6
+
7
+
8
+ export class VBOBatchingPointsRenderer extends VBORenderer {
9
+ _draw(drawCfg) {
10
+ const {gl} = this._scene.canvas;
11
+
12
+ const {
13
+ state,
14
+ frameCtx,
15
+ incrementDrawState,
16
+ } = drawCfg;
17
+
18
+ gl.drawArrays(gl.POINTS, 0, state.positionsBuf.numItems);
19
+
20
+ if (incrementDrawState) {
21
+ frameCtx.drawArrays++;
22
+ }
23
+ }
24
+ }