@openglobus/og 0.12.1 → 0.13.0

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 (230) hide show
  1. package/README.md +0 -2
  2. package/dist/@openglobus/og.css +1 -0
  3. package/dist/@openglobus/og.esm.js +21 -0
  4. package/dist/@openglobus/og.esm.js.map +1 -0
  5. package/dist/@openglobus/og.umd.js +21 -0
  6. package/dist/@openglobus/og.umd.js.map +1 -0
  7. package/package.json +8 -8
  8. package/src/og/Extent.js +3 -3
  9. package/src/og/Globe.js +277 -275
  10. package/src/og/ImageCanvas.js +3 -3
  11. package/src/og/LonLat.js +9 -9
  12. package/src/og/QueueArray.js +2 -2
  13. package/src/og/Rectangle.js +5 -5
  14. package/src/og/bv/Box.js +1 -1
  15. package/src/og/bv/Sphere.js +2 -2
  16. package/src/og/camera/Camera.js +1 -1
  17. package/src/og/camera/PlanetCamera.js +649 -646
  18. package/src/og/control/LayerSwitcher.js +1 -1
  19. package/src/og/control/MouseNavigation.js +22 -13
  20. package/src/og/control/MouseWheelZoomControl.js +2 -2
  21. package/src/og/control/ScaleControl.js +1 -1
  22. package/src/og/control/TouchNavigation.js +319 -319
  23. package/src/og/control/ZoomControl.js +132 -132
  24. package/src/og/control/visibleExtent/Segment.js +12 -12
  25. package/src/og/ellipsoid/Ellipsoid.js +577 -567
  26. package/src/og/entity/BillboardHandler.js +878 -1051
  27. package/src/og/entity/Entity.js +1 -1
  28. package/src/og/entity/EntityCollection.js +847 -857
  29. package/src/og/entity/GeoObjectHandler.js +37 -18
  30. package/src/og/entity/LabelHandler.js +888 -1040
  31. package/src/og/entity/LabelWorker.js +0 -6
  32. package/src/og/entity/PointCloud.js +495 -495
  33. package/src/og/entity/Polyline.js +2218 -2222
  34. package/src/og/entity/RayHandler.js +1 -1
  35. package/src/og/layer/CanvasTiles.js +6 -3
  36. package/src/og/layer/GeoImage.js +1 -1
  37. package/src/og/layer/KML.js +24 -17
  38. package/src/og/layer/Layer.js +806 -751
  39. package/src/og/layer/Vector.js +997 -1010
  40. package/src/og/layer/XYZ.js +359 -357
  41. package/src/og/math/Line2.js +4 -4
  42. package/src/og/math/Quat.js +2 -2
  43. package/src/og/math/Ray.js +2 -2
  44. package/src/og/math/Vec2.js +524 -524
  45. package/src/og/math/Vec3.js +900 -900
  46. package/src/og/math/Vec4.js +261 -261
  47. package/src/og/math.js +397 -398
  48. package/src/og/quadTree/EntityCollectionNode.js +389 -387
  49. package/src/og/renderer/Renderer.js +14 -20
  50. package/src/og/renderer/RendererEvents.js +1034 -1045
  51. package/src/og/scene/Planet.js +26 -23
  52. package/src/og/scene/RenderNode.js +347 -354
  53. package/src/og/segment/Segment.js +3 -1
  54. package/src/og/segment/SegmentLonLat.js +1 -4
  55. package/src/og/shaders/billboard.js +220 -204
  56. package/src/og/shaders/drawnode.js +603 -603
  57. package/src/og/shaders/geoObject.js +15 -6
  58. package/src/og/shaders/label.js +596 -456
  59. package/src/og/shaders/polyline.js +365 -361
  60. package/src/og/terrain/MapboxTerrain.js +1 -1
  61. package/src/og/utils/FontAtlas.js +209 -200
  62. package/src/og/utils/GeoImageCreator.js +4 -5
  63. package/src/og/utils/TextureAtlas.js +4 -4
  64. package/src/og/utils/VectorTileCreator.js +414 -414
  65. package/src/og/utils/shared.js +1 -1
  66. package/src/og/webgl/Handler.js +28 -60
  67. package/src/og/webgl/Multisample.js +260 -260
  68. package/src/og/webgl/Program.js +411 -396
  69. package/types/Clock.d.ts +94 -0
  70. package/types/Deferred.d.ts +6 -0
  71. package/types/Events.d.ts +77 -0
  72. package/types/Extent.d.ts +166 -0
  73. package/types/Globe.d.ts +85 -0
  74. package/types/ImageCanvas.d.ts +123 -0
  75. package/types/Lock.d.ts +12 -0
  76. package/types/LonLat.d.ts +108 -0
  77. package/types/Popup.d.ts +42 -0
  78. package/types/QueueArray.d.ts +19 -0
  79. package/types/Rectangle.d.ts +80 -0
  80. package/types/Stack.d.ts +19 -0
  81. package/types/ajax.d.ts +24 -0
  82. package/types/arial.d.ts +48 -0
  83. package/types/astro/astro.d.ts +38 -0
  84. package/types/astro/earth.d.ts +7 -0
  85. package/types/astro/jd.d.ts +254 -0
  86. package/types/bv/Box.d.ts +30 -0
  87. package/types/bv/Sphere.d.ts +38 -0
  88. package/types/bv/index.d.ts +3 -0
  89. package/types/camera/Camera.d.ts +312 -0
  90. package/types/camera/Frustum.d.ts +133 -0
  91. package/types/camera/PlanetCamera.d.ts +219 -0
  92. package/types/camera/index.d.ts +3 -0
  93. package/types/cons.d.ts +40 -0
  94. package/types/control/CompassButton.d.ts +17 -0
  95. package/types/control/Control.d.ts +104 -0
  96. package/types/control/DebugInfo.d.ts +15 -0
  97. package/types/control/EarthCoordinates.d.ts +47 -0
  98. package/types/control/EarthNavigation.d.ts +43 -0
  99. package/types/control/GeoImageDragControl.d.ts +6 -0
  100. package/types/control/KeyboardNavigation.d.ts +21 -0
  101. package/types/control/LayerSwitcher.d.ts +21 -0
  102. package/types/control/Lighting.d.ts +16 -0
  103. package/types/control/MouseNavigation.d.ts +48 -0
  104. package/types/control/MouseWheelZoomControl.d.ts +45 -0
  105. package/types/control/ScaleControl.d.ts +22 -0
  106. package/types/control/ShowFps.d.ts +11 -0
  107. package/types/control/SimpleNavigation.d.ts +25 -0
  108. package/types/control/Sun.d.ts +50 -0
  109. package/types/control/ToggleWireframe.d.ts +12 -0
  110. package/types/control/TouchNavigation.d.ts +48 -0
  111. package/types/control/ZoomControl.d.ts +27 -0
  112. package/types/control/index.d.ts +18 -0
  113. package/types/ellipsoid/Ellipsoid.d.ts +153 -0
  114. package/types/ellipsoid/index.d.ts +3 -0
  115. package/types/ellipsoid/wgs84.d.ts +6 -0
  116. package/types/entity/BaseBillboard.d.ts +215 -0
  117. package/types/entity/Billboard.d.ts +94 -0
  118. package/types/entity/BillboardHandler.d.ts +75 -0
  119. package/types/entity/Entity.d.ts +348 -0
  120. package/types/entity/EntityCollection.d.ts +309 -0
  121. package/types/entity/GeoObject.d.ts +111 -0
  122. package/types/entity/GeoObjectHandler.d.ts +81 -0
  123. package/types/entity/Geometry.d.ts +74 -0
  124. package/types/entity/GeometryHandler.d.ts +76 -0
  125. package/types/entity/Label.d.ts +189 -0
  126. package/types/entity/LabelHandler.d.ts +29 -0
  127. package/types/entity/LabelWorker.d.ts +11 -0
  128. package/types/entity/PointCloud.d.ts +174 -0
  129. package/types/entity/PointCloudHandler.d.ts +38 -0
  130. package/types/entity/Polyline.d.ts +306 -0
  131. package/types/entity/PolylineHandler.d.ts +18 -0
  132. package/types/entity/Ray.d.ts +124 -0
  133. package/types/entity/RayHandler.d.ts +67 -0
  134. package/types/entity/ShapeHandler.d.ts +22 -0
  135. package/types/entity/Strip.d.ts +119 -0
  136. package/types/entity/StripHandler.d.ts +38 -0
  137. package/types/entity/index.d.ts +8 -0
  138. package/types/index.core.d.ts +65 -0
  139. package/types/index.d.ts +45 -0
  140. package/types/index.webgl.d.ts +7 -0
  141. package/types/input/KeyboardHandler.d.ts +10 -0
  142. package/types/input/MouseHandler.d.ts +5 -0
  143. package/types/input/TouchHandler.d.ts +5 -0
  144. package/types/input/input.d.ts +34 -0
  145. package/types/layer/BaseGeoImage.d.ts +94 -0
  146. package/types/layer/CanvasTiles.d.ts +67 -0
  147. package/types/layer/GeoImage.d.ts +52 -0
  148. package/types/layer/GeoTexture2d.d.ts +8 -0
  149. package/types/layer/GeoVideo.d.ts +55 -0
  150. package/types/layer/KML.d.ts +68 -0
  151. package/types/layer/Layer.d.ts +315 -0
  152. package/types/layer/Material.d.ts +45 -0
  153. package/types/layer/Vector.d.ts +201 -0
  154. package/types/layer/WMS.d.ts +61 -0
  155. package/types/layer/XYZ.d.ts +119 -0
  156. package/types/layer/index.d.ts +10 -0
  157. package/types/light/LightSource.d.ts +178 -0
  158. package/types/math/Line2.d.ts +11 -0
  159. package/types/math/Line3.d.ts +10 -0
  160. package/types/math/Mat3.d.ts +65 -0
  161. package/types/math/Mat4.d.ts +176 -0
  162. package/types/math/Plane.d.ts +18 -0
  163. package/types/math/Quat.d.ts +379 -0
  164. package/types/math/Ray.d.ts +82 -0
  165. package/types/math/Vec2.d.ts +309 -0
  166. package/types/math/Vec3.d.ts +467 -0
  167. package/types/math/Vec4.d.ts +162 -0
  168. package/types/math/coder.d.ts +43 -0
  169. package/types/math/index.d.ts +11 -0
  170. package/types/math.d.ts +261 -0
  171. package/types/mercator.d.ts +92 -0
  172. package/types/proj/EPSG3857.d.ts +6 -0
  173. package/types/proj/EPSG4326.d.ts +6 -0
  174. package/types/proj/Proj.d.ts +42 -0
  175. package/types/quadTree/EntityCollectionNode.d.ts +34 -0
  176. package/types/quadTree/Node.d.ts +60 -0
  177. package/types/quadTree/quadTree.d.ts +40 -0
  178. package/types/renderer/Renderer.d.ts +290 -0
  179. package/types/renderer/RendererEvents.d.ts +237 -0
  180. package/types/res/images.d.ts +3 -0
  181. package/types/scene/Axes.d.ts +11 -0
  182. package/types/scene/BaseNode.d.ts +60 -0
  183. package/types/scene/Planet.d.ts +576 -0
  184. package/types/scene/RenderNode.d.ts +142 -0
  185. package/types/scene/SkyBox.d.ts +10 -0
  186. package/types/scene/index.d.ts +4 -0
  187. package/types/segment/Segment.d.ts +275 -0
  188. package/types/segment/SegmentLonLat.d.ts +17 -0
  189. package/types/segment/Slice.d.ts +10 -0
  190. package/types/segment/segmentHelper.d.ts +13 -0
  191. package/types/shaders/billboard.d.ts +3 -0
  192. package/types/shaders/depth.d.ts +2 -0
  193. package/types/shaders/drawnode.d.ts +7 -0
  194. package/types/shaders/geoObject.d.ts +3 -0
  195. package/types/shaders/label.d.ts +4 -0
  196. package/types/shaders/pointCloud.d.ts +2 -0
  197. package/types/shaders/polyline.d.ts +3 -0
  198. package/types/shaders/ray.d.ts +2 -0
  199. package/types/shaders/screenFrame.d.ts +2 -0
  200. package/types/shaders/shape.d.ts +4 -0
  201. package/types/shaders/skybox.d.ts +2 -0
  202. package/types/shaders/toneMapping.d.ts +2 -0
  203. package/types/shapes/BaseShape.d.ts +250 -0
  204. package/types/shapes/Sphere.d.ts +41 -0
  205. package/types/terrain/BilTerrain.d.ts +7 -0
  206. package/types/terrain/EmptyTerrain.d.ts +73 -0
  207. package/types/terrain/Geoid.d.ts +26 -0
  208. package/types/terrain/GlobusTerrain.d.ts +116 -0
  209. package/types/terrain/MapboxTerrain.d.ts +7 -0
  210. package/types/terrain/index.d.ts +5 -0
  211. package/types/utils/FontAtlas.d.ts +16 -0
  212. package/types/utils/GeoImageCreator.d.ts +30 -0
  213. package/types/utils/ImagesCacheManager.d.ts +10 -0
  214. package/types/utils/Loader.d.ts +25 -0
  215. package/types/utils/NormalMapCreator.d.ts +39 -0
  216. package/types/utils/PlainSegmentWorker.d.ts +10 -0
  217. package/types/utils/TerrainWorker.d.ts +9 -0
  218. package/types/utils/TextureAtlas.d.ts +111 -0
  219. package/types/utils/VectorTileCreator.d.ts +16 -0
  220. package/types/utils/colorTable.d.ts +143 -0
  221. package/types/utils/earcut.d.ts +6 -0
  222. package/types/utils/shared.d.ts +231 -0
  223. package/types/webgl/Framebuffer.d.ts +135 -0
  224. package/types/webgl/Handler.d.ts +392 -0
  225. package/types/webgl/Multisample.d.ts +89 -0
  226. package/types/webgl/Program.d.ts +163 -0
  227. package/types/webgl/ProgramController.d.ts +89 -0
  228. package/types/webgl/callbacks.d.ts +1 -0
  229. package/types/webgl/index.d.ts +6 -0
  230. package/types/webgl/types.d.ts +2 -0
@@ -1,387 +1,389 @@
1
- /**
2
- * @module og/quadTree/EntityCollectionNode
3
- */
4
-
5
- 'use strict';
6
-
7
- import { Sphere } from '../bv/Sphere.js';
8
- import { EntityCollection } from '../entity/EntityCollection.js';
9
- import { Extent } from '../Extent.js';
10
- import { LonLat } from '../LonLat.js';
11
- import { Vec3 } from '../math/Vec3.js';
12
- import * as mercator from '../mercator.js';
13
- import * as quadTree from './quadTree.js';
14
-
15
- class EntityCollectionNode {
16
-
17
- constructor(layer, partId, parent, id, extent, planet, zoom) {
18
- this.layer = layer;
19
- this.parentNode = parent;
20
- this.childrenNodes = [];
21
- this.partId = partId;
22
- this.nodeId = partId + id;
23
- this.state = null;
24
- this.extent = extent;
25
- this.count = 0;
26
- this.deferredEntities = [];
27
- this.entityCollection = null;
28
- this.zoom = zoom;
29
- this._inTheQueue = false;
30
-
31
- this.bsphere = new Sphere();
32
-
33
- planet && this._setExtentBounds();
34
- }
35
-
36
- insertEntity(entity, rightNow) {
37
- this.buildTree([entity], rightNow);
38
- }
39
-
40
- _addEntitiesToCollection(entities, rightNow) {
41
- if (entities.length) {
42
- var l = this.layer,
43
- p = l._planet;
44
-
45
- var ec = this.entityCollection;
46
-
47
- if (!ec) {
48
- ec = new EntityCollection({
49
- pickingEnabled: l._pickingEnabled,
50
- labelMaxLetters: l._labelMaxLetters
51
- });
52
- ec._layer = this.layer;
53
- ec.addTo(p, true);
54
- ec._quadNode = this;
55
- l._bindEventsDefault(ec);
56
- this.entityCollection = ec;
57
- }
58
-
59
- if (rightNow || !l.async) {
60
- this.entityCollection.addEntities(entities);
61
- } else {
62
- this.deferredEntities.push.apply(this.deferredEntities, entities);
63
- }
64
- }
65
- }
66
-
67
- _setExtentBounds() {
68
- if (!this.nodeId) {
69
- this.bsphere.radius = this.layer._planet.ellipsoid._a;
70
- this.bsphere.center = new Vec3();
71
- } else {
72
- this.bsphere.setFromExtent(this.layer._planet.ellipsoid, this.extent.inverseMercator());
73
- }
74
- }
75
-
76
- __setLonLat__(entity) {
77
-
78
- if (entity._lonlat.isZero() && !entity._cartesian.isZero()) {
79
- entity._lonlat = this.layer._planet.ellipsoid.cartesianToLonLat(entity._cartesian);
80
- }
81
-
82
- if (Math.abs(entity._lonlat.lat) < mercator.MAX_LAT) {
83
- entity._lonlatMerc = entity._lonlat.forwardMercator();
84
- } else {
85
- entity._lonlatMerc = null;
86
- }
87
- return entity._lonlatMerc;
88
- }
89
-
90
- buildTree(entities, rightNow) {
91
-
92
- this.count += entities.length;
93
-
94
- if (entities.length > this.layer._nodeCapacity || this.zoom > this.layer.minZoom) {
95
- var cn = this.childrenNodes;
96
- if (!cn.length) {
97
- this.createChildrenNodes();
98
- }
99
-
100
- var en_nw = [],
101
- en_ne = [],
102
- en_sw = [],
103
- en_se = [];
104
-
105
- var i = entities.length;
106
- while (i--) {
107
- var ei = entities[i];
108
- if (cn[quadTree.NW].isInside(ei)) {
109
- ei._nodePtr = cn[quadTree.NW];
110
- en_nw.push(ei);
111
- } else if (cn[quadTree.NE].isInside(ei)) {
112
- ei._nodePtr = cn[quadTree.NE];
113
- en_ne.push(ei);
114
- } else if (cn[quadTree.SW].isInside(ei)) {
115
- ei._nodePtr = cn[quadTree.SW];
116
- en_sw.push(ei);
117
- } else if (cn[quadTree.SE].isInside(ei)) {
118
- ei._nodePtr = cn[quadTree.SE];
119
- en_se.push(ei);
120
- }
121
- }
122
-
123
- en_nw.length && cn[quadTree.NW].buildTree(en_nw, rightNow);
124
- en_ne.length && cn[quadTree.NE].buildTree(en_ne, rightNow);
125
- en_sw.length && cn[quadTree.SW].buildTree(en_sw, rightNow);
126
- en_se.length && cn[quadTree.SE].buildTree(en_se, rightNow);
127
-
128
- } else {
129
- this._addEntitiesToCollection(entities, rightNow);
130
- }
131
- }
132
-
133
- isInside(entity) {
134
- return this.extent.isInside(entity._lonlatMerc);
135
- }
136
-
137
- createChildrenNodes() {
138
- var l = this.layer;
139
- var ext = this.extent;
140
- var size_x = ext.getWidth() * 0.5;
141
- var size_y = ext.getHeight() * 0.5;
142
- var ne = ext.northEast,
143
- sw = ext.southWest;
144
- var id = this.nodeId * 4 + 1;
145
- var c = new LonLat(sw.lon + size_x, sw.lat + size_y);
146
- var nd = this.childrenNodes;
147
- var p = this.layer._planet;
148
- var z = this.zoom + 1;
149
-
150
- nd[quadTree.NW] = new EntityCollectionNode(l, quadTree.NW, this, id,
151
- new Extent(new LonLat(sw.lon, sw.lat + size_y), new LonLat(sw.lon + size_x, ne.lat)), p, z);
152
-
153
- nd[quadTree.NE] = new EntityCollectionNode(l, quadTree.NE, this, id,
154
- new Extent(c, new LonLat(ne.lon, ne.lat)), p, z);
155
-
156
- nd[quadTree.SW] = new EntityCollectionNode(l, quadTree.SW, this, id,
157
- new Extent(new LonLat(sw.lon, sw.lat), c), p, z);
158
-
159
- nd[quadTree.SE] = new EntityCollectionNode(l, quadTree.SE, this, id,
160
- new Extent(new LonLat(sw.lon + size_x, sw.lat), new LonLat(ne.lon, sw.lat + size_y)), p, z);
161
- }
162
-
163
- collectRenderCollectionsPASS1(visibleNodes, outArr) {
164
- var n = visibleNodes[this.nodeId];
165
- if (n) {
166
- var cn = this.childrenNodes;
167
- if (this.entityCollection) {
168
- this.renderCollection(outArr, visibleNodes);
169
- } else if (cn.length) {
170
- if (n.state === quadTree.RENDERING) {
171
- this.layer._secondPASS.push(this);
172
- } else {
173
- cn[quadTree.NW].collectRenderCollectionsPASS1(visibleNodes, outArr);
174
- cn[quadTree.NE].collectRenderCollectionsPASS1(visibleNodes, outArr);
175
- cn[quadTree.SW].collectRenderCollectionsPASS1(visibleNodes, outArr);
176
- cn[quadTree.SE].collectRenderCollectionsPASS1(visibleNodes, outArr);
177
- }
178
- }
179
- }
180
- }
181
-
182
- collectRenderCollectionsPASS2(visibleNodes, outArr, renderingNodeId) {
183
- var p = this.layer._planet;
184
- var cam = p.renderer.activeCamera;
185
-
186
- var altVis = (cam.eye.distance(this.bsphere.center) - this.bsphere.radius <
187
- quadTree.VISIBLE_DISTANCE * Math.sqrt(cam._lonLat.height)) || cam._lonLat.height > 10000;
188
-
189
- if (this.count > 0 && altVis &&
190
- p.renderer.activeCamera.frustum.containsSphere(this.bsphere) > 0) {
191
-
192
- var cn = this.childrenNodes;
193
-
194
- if (this.entityCollection) {
195
- this.renderCollection(outArr, visibleNodes, renderingNodeId);
196
- } else if (cn.length) {
197
- cn[quadTree.NW].collectRenderCollectionsPASS2(visibleNodes, outArr, renderingNodeId);
198
- cn[quadTree.NE].collectRenderCollectionsPASS2(visibleNodes, outArr, renderingNodeId);
199
- cn[quadTree.SW].collectRenderCollectionsPASS2(visibleNodes, outArr, renderingNodeId);
200
- cn[quadTree.SE].collectRenderCollectionsPASS2(visibleNodes, outArr, renderingNodeId);
201
- }
202
-
203
- }
204
- }
205
-
206
- applyCollection() {
207
- this.entityCollection.addEntities(this.deferredEntities);
208
- this.deferredEntities.length = 0;
209
- this.deferredEntities = [];
210
- this._inTheQueue = false;
211
- }
212
-
213
- traverseTree(callback) {
214
-
215
- var cn = this.childrenNodes;
216
-
217
- if (this.entityCollection) {
218
- callback(this);
219
- } else if (cn.length) {
220
- cn[quadTree.NW].traverseTree(callback);
221
- cn[quadTree.NE].traverseTree(callback);
222
- cn[quadTree.SW].traverseTree(callback);
223
- cn[quadTree.SE].traverseTree(callback);
224
- }
225
- }
226
-
227
- renderCollection(outArr, visibleNodes, renderingNodeId) {
228
-
229
- var l = this.layer;
230
-
231
- l._renderingNodes[this.nodeId] = true;
232
-
233
- if (this.deferredEntities.length && !this._inTheQueue) {
234
- if (l.async) {
235
- l._queueDeferredNode(this);
236
- } else {
237
- this.applyCollection();
238
- }
239
- }
240
-
241
- var ec = this.entityCollection;
242
-
243
- ec._fadingOpacity = l._fadingOpacity;
244
- ec.scaleByDistance = l.scaleByDistance;
245
- ec.pickingScale = l.pickingScale;
246
-
247
- ec.polygonOffsetFactor = l.polygonOffsetFactor;
248
- ec.polygonOffsetUnits = l.polygonOffsetUnits;
249
-
250
- outArr.push(ec);
251
-
252
- if (l.clampToGround || l.relativeToGround) {
253
- var e = ec._entities;
254
- var i = e.length;
255
-
256
- if (visibleNodes[this.nodeId] && visibleNodes[this.nodeId].state === quadTree.RENDERING) {
257
- while (i--) {
258
- let ei = e[i];
259
- this.alignEntityToTheGround(ei, visibleNodes[this.nodeId].segment);
260
- }
261
- } else if (renderingNodeId) {
262
- while (i--) {
263
- let ei = e[i];
264
- this.alignEntityToTheGround(ei, visibleNodes[renderingNodeId].segment);
265
- }
266
- } else {
267
- var n = l._planet._renderedNodes;
268
- while (i--) {
269
- let ei = e[i];
270
- let j = n.length;
271
- while (j--) {
272
- if (n[j].segment.isEntityInside(ei)) {
273
- this.alignEntityToTheGround(ei, n[j].segment);
274
- break;
275
- }
276
- }
277
- }
278
- }
279
- }
280
- }
281
-
282
- alignEntityToTheGround(entity, segment) {
283
- var res = new Vec3();
284
- segment.getEntityTerrainPoint(entity, res);
285
- entity._setCartesian3vSilent(res.addA(res.normal().scale((Number(this.layer.relativeToGround) && entity._altitude) || 0.0)));
286
- }
287
-
288
- isVisible() {
289
- if (this.layer._renderingNodes[this.nodeId]) {
290
- return true;
291
- }
292
- return false;
293
- }
294
-
295
- }
296
-
297
- class EntityCollectionNodeWGS84 extends EntityCollectionNode {
298
-
299
- constructor(layer, partId, parent, id, extent, planet, zoom) {
300
- super(layer, partId, parent, id, extent, planet, zoom);
301
- this.isNorth = false;
302
- }
303
-
304
- createChildrenNodes() {
305
- var l = this.layer;
306
- var ext = this.extent;
307
- var size_x = ext.getWidth() * 0.5;
308
- var size_y = ext.getHeight() * 0.5;
309
- var ne = ext.northEast,
310
- sw = ext.southWest;
311
- var id = this.nodeId * 4 + 1;
312
- var c = new LonLat(sw.lon + size_x, sw.lat + size_y);
313
- var nd = this.childrenNodes;
314
- var p = this.layer._planet;
315
- var z = this.zoom + 1;
316
-
317
- nd[quadTree.NW] = new EntityCollectionNodeWGS84(l, quadTree.NW, this, id,
318
- new Extent(new LonLat(sw.lon, sw.lat + size_y), new LonLat(sw.lon + size_x, ne.lat)), p, z);
319
-
320
- nd[quadTree.NE] = new EntityCollectionNodeWGS84(l, quadTree.NE, this, id,
321
- new Extent(c, new LonLat(ne.lon, ne.lat)), p, z);
322
-
323
- nd[quadTree.SW] = new EntityCollectionNodeWGS84(l, quadTree.SW, this, id,
324
- new Extent(new LonLat(sw.lon, sw.lat), c), p, z);
325
-
326
- nd[quadTree.SE] = new EntityCollectionNodeWGS84(l, quadTree.SE, this, id,
327
- new Extent(new LonLat(sw.lon + size_x, sw.lat), new LonLat(ne.lon, sw.lat + size_y)), p, z);
328
- }
329
-
330
- _setExtentBounds() {
331
- if (this.extent.northEast.lat > 0) {
332
- this.isNorth = true;
333
- }
334
- this.bsphere.setFromExtent(this.layer._planet.ellipsoid, this.extent);
335
- }
336
-
337
- __setLonLat__(entity) {
338
- if (entity._lonlat.isZero()) {
339
- entity._lonlat = this.layer._planet.ellipsoid.cartesianToLonLat(entity._cartesian);
340
- }
341
- return entity._lonlat;
342
- }
343
-
344
- isVisible() {
345
- if (this.isNorth && this.layer._renderingNodesNorth[this.nodeId]) {
346
- return true;
347
- } else if (this.layer._renderingNodesSouth[this.nodeId]) {
348
- return true;
349
- }
350
- return false;
351
- }
352
-
353
- isInside(entity) {
354
- return this.extent.isInside(entity._lonlat);
355
- }
356
-
357
- /**
358
- *
359
- * @param {*} outArr
360
- * @param {*} visibleNodes
361
- * @param {*} renderingNode
362
- */
363
- renderCollection(outArr, visibleNodes, renderingNode) {
364
-
365
- if (this.isNorth) {
366
- this.layer._renderingNodesNorth[this.nodeId] = true;
367
- } else {
368
- this.layer._renderingNodesSouth[this.nodeId] = true;
369
- }
370
-
371
- if (this.deferredEntities.length && !this._inTheQueue) {
372
- if (this.layer.async) {
373
- this.layer._queueDeferredNode(this);
374
- } else {
375
- this.applyCollection();
376
- }
377
- }
378
-
379
- this.entityCollection._fadingOpacity = this.layer._fadingOpacity;
380
- this.entityCollection.scaleByDistance = this.layer.scaleByDistance;
381
- this.entityCollection.pickingScale = this.layer.pickingScale;
382
-
383
- outArr.push(this.entityCollection);
384
- }
385
- }
386
-
387
- export { EntityCollectionNode, EntityCollectionNodeWGS84 };
1
+ /**
2
+ * @module og/quadTree/EntityCollectionNode
3
+ */
4
+
5
+ 'use strict';
6
+
7
+ import { Sphere } from '../bv/Sphere.js';
8
+ import { EntityCollection } from '../entity/EntityCollection.js';
9
+ import { Extent } from '../Extent.js';
10
+ import { LonLat } from '../LonLat.js';
11
+ import { Vec3 } from '../math/Vec3.js';
12
+ import * as mercator from '../mercator.js';
13
+ import * as quadTree from './quadTree.js';
14
+
15
+ class EntityCollectionNode {
16
+
17
+ constructor(layer, partId, parent, id, extent, planet, zoom) {
18
+ this.layer = layer;
19
+ this.parentNode = parent;
20
+ this.childrenNodes = [];
21
+ this.partId = partId;
22
+ this.nodeId = partId + id;
23
+ this.state = null;
24
+ this.extent = extent;
25
+ this.count = 0;
26
+ this.deferredEntities = [];
27
+ this.entityCollection = null;
28
+ this.zoom = zoom;
29
+ this._inTheQueue = false;
30
+
31
+ this.bsphere = new Sphere();
32
+
33
+ planet && this._setExtentBounds();
34
+ }
35
+
36
+ insertEntity(entity, rightNow) {
37
+ this.buildTree([entity], rightNow);
38
+ }
39
+
40
+ _addEntitiesToCollection(entities, rightNow) {
41
+ if (entities.length) {
42
+ var l = this.layer,
43
+ p = l._planet;
44
+
45
+ var ec = this.entityCollection;
46
+
47
+ if (!ec) {
48
+ ec = new EntityCollection({
49
+ pickingEnabled: l._pickingEnabled,
50
+ labelMaxLetters: l._labelMaxLetters
51
+ });
52
+ ec._layer = this.layer;
53
+ ec.addTo(p, true);
54
+ ec._quadNode = this;
55
+ l._bindEventsDefault(ec);
56
+ this.entityCollection = ec;
57
+ }
58
+
59
+ if (rightNow || !l.async) {
60
+ this.entityCollection.addEntities(entities);
61
+ } else {
62
+ this.deferredEntities.push.apply(this.deferredEntities, entities);
63
+ }
64
+ }
65
+ }
66
+
67
+ _setExtentBounds() {
68
+ if (!this.nodeId) {
69
+ this.bsphere.radius = this.layer._planet.ellipsoid._a;
70
+ this.bsphere.center = new Vec3();
71
+ } else {
72
+ this.bsphere.setFromExtent(this.layer._planet.ellipsoid, this.extent.inverseMercator());
73
+ }
74
+ }
75
+
76
+ __setLonLat__(entity) {
77
+
78
+ if (entity._lonlat.isZero() && !entity._cartesian.isZero()) {
79
+ entity._lonlat = this.layer._planet.ellipsoid.cartesianToLonLat(entity._cartesian);
80
+ }
81
+
82
+ if (Math.abs(entity._lonlat.lat) < mercator.MAX_LAT) {
83
+ entity._lonlatMerc = entity._lonlat.forwardMercator();
84
+ } else {
85
+ entity._lonlatMerc = null;
86
+ }
87
+ return entity._lonlatMerc;
88
+ }
89
+
90
+ buildTree(entities, rightNow) {
91
+
92
+ this.count += entities.length;
93
+
94
+ if (entities.length > this.layer._nodeCapacity) {
95
+ var cn = this.childrenNodes;
96
+ if (!cn.length) {
97
+ this.createChildrenNodes();
98
+ }
99
+
100
+ var en_nw = [],
101
+ en_ne = [],
102
+ en_sw = [],
103
+ en_se = [];
104
+
105
+ var i = entities.length;
106
+ while (i--) {
107
+ var ei = entities[i];
108
+ if (cn[quadTree.NW].isInside(ei)) {
109
+ ei._nodePtr = cn[quadTree.NW];
110
+ en_nw.push(ei);
111
+ } else if (cn[quadTree.NE].isInside(ei)) {
112
+ ei._nodePtr = cn[quadTree.NE];
113
+ en_ne.push(ei);
114
+ } else if (cn[quadTree.SW].isInside(ei)) {
115
+ ei._nodePtr = cn[quadTree.SW];
116
+ en_sw.push(ei);
117
+ } else if (cn[quadTree.SE].isInside(ei)) {
118
+ ei._nodePtr = cn[quadTree.SE];
119
+ en_se.push(ei);
120
+ }
121
+ }
122
+
123
+ en_nw.length && cn[quadTree.NW].buildTree(en_nw, rightNow);
124
+ en_ne.length && cn[quadTree.NE].buildTree(en_ne, rightNow);
125
+ en_sw.length && cn[quadTree.SW].buildTree(en_sw, rightNow);
126
+ en_se.length && cn[quadTree.SE].buildTree(en_se, rightNow);
127
+
128
+ } else {
129
+ this._addEntitiesToCollection(entities, rightNow);
130
+ }
131
+ }
132
+
133
+ isInside(entity) {
134
+ if (entity._lonlatMerc) {
135
+ return this.extent.isInside(entity._lonlatMerc);
136
+ } else {
137
+ return false;
138
+ }
139
+ }
140
+
141
+ createChildrenNodes() {
142
+ var l = this.layer;
143
+ var ext = this.extent;
144
+ var size_x = ext.getWidth() * 0.5;
145
+ var size_y = ext.getHeight() * 0.5;
146
+ var ne = ext.northEast,
147
+ sw = ext.southWest;
148
+ var id = this.nodeId * 4 + 1;
149
+ var c = new LonLat(sw.lon + size_x, sw.lat + size_y);
150
+ var nd = this.childrenNodes;
151
+ var p = this.layer._planet;
152
+ var z = this.zoom + 1;
153
+
154
+ nd[quadTree.NW] = new EntityCollectionNode(l, quadTree.NW, this, id,
155
+ new Extent(new LonLat(sw.lon, sw.lat + size_y), new LonLat(sw.lon + size_x, ne.lat)), p, z);
156
+
157
+ nd[quadTree.NE] = new EntityCollectionNode(l, quadTree.NE, this, id,
158
+ new Extent(c, new LonLat(ne.lon, ne.lat)), p, z);
159
+
160
+ nd[quadTree.SW] = new EntityCollectionNode(l, quadTree.SW, this, id,
161
+ new Extent(new LonLat(sw.lon, sw.lat), c), p, z);
162
+
163
+ nd[quadTree.SE] = new EntityCollectionNode(l, quadTree.SE, this, id,
164
+ new Extent(new LonLat(sw.lon + size_x, sw.lat), new LonLat(ne.lon, sw.lat + size_y)), p, z);
165
+ }
166
+
167
+ collectRenderCollectionsPASS1(visibleNodes, outArr) {
168
+ var n = visibleNodes[this.nodeId];
169
+ if (n) {
170
+ var cn = this.childrenNodes;
171
+ if (this.entityCollection) {
172
+ this.renderCollection(outArr, visibleNodes);
173
+ } else if (cn.length) {
174
+ if (n.state === quadTree.RENDERING) {
175
+ this.layer._secondPASS.push(this);
176
+ } else {
177
+ cn[quadTree.NW].collectRenderCollectionsPASS1(visibleNodes, outArr);
178
+ cn[quadTree.NE].collectRenderCollectionsPASS1(visibleNodes, outArr);
179
+ cn[quadTree.SW].collectRenderCollectionsPASS1(visibleNodes, outArr);
180
+ cn[quadTree.SE].collectRenderCollectionsPASS1(visibleNodes, outArr);
181
+ }
182
+ }
183
+ }
184
+ }
185
+
186
+ collectRenderCollectionsPASS2(visibleNodes, outArr, renderingNodeId) {
187
+ var p = this.layer._planet;
188
+ var cam = p.renderer.activeCamera;
189
+
190
+ var altVis = (cam.eye.distance(this.bsphere.center) - this.bsphere.radius <
191
+ quadTree.VISIBLE_DISTANCE * Math.sqrt(cam._lonLat.height)) || cam._lonLat.height > 10000;
192
+
193
+ if (this.count > 0 && altVis &&
194
+ p.renderer.activeCamera.frustum.containsSphere(this.bsphere) > 0) {
195
+
196
+ var cn = this.childrenNodes;
197
+
198
+ if (this.entityCollection) {
199
+ this.renderCollection(outArr, visibleNodes, renderingNodeId);
200
+ } else if (cn.length) {
201
+ cn[quadTree.NW].collectRenderCollectionsPASS2(visibleNodes, outArr, renderingNodeId);
202
+ cn[quadTree.NE].collectRenderCollectionsPASS2(visibleNodes, outArr, renderingNodeId);
203
+ cn[quadTree.SW].collectRenderCollectionsPASS2(visibleNodes, outArr, renderingNodeId);
204
+ cn[quadTree.SE].collectRenderCollectionsPASS2(visibleNodes, outArr, renderingNodeId);
205
+ }
206
+
207
+ }
208
+ }
209
+
210
+ applyCollection() {
211
+ this.entityCollection.addEntities(this.deferredEntities);
212
+ this.deferredEntities.length = 0;
213
+ this.deferredEntities = [];
214
+ this._inTheQueue = false;
215
+ }
216
+
217
+ traverseTree(callback) {
218
+
219
+ var cn = this.childrenNodes;
220
+
221
+ if (this.entityCollection) {
222
+ callback(this);
223
+ } else if (cn.length) {
224
+ cn[quadTree.NW].traverseTree(callback);
225
+ cn[quadTree.NE].traverseTree(callback);
226
+ cn[quadTree.SW].traverseTree(callback);
227
+ cn[quadTree.SE].traverseTree(callback);
228
+ }
229
+ }
230
+
231
+ renderCollection(outArr, visibleNodes, renderingNodeId) {
232
+
233
+ var l = this.layer;
234
+
235
+ l._renderingNodes[this.nodeId] = true;
236
+
237
+ if (this.deferredEntities.length && !this._inTheQueue) {
238
+ if (l.async) {
239
+ l._queueDeferredNode(this);
240
+ } else {
241
+ this.applyCollection();
242
+ }
243
+ }
244
+
245
+ var ec = this.entityCollection;
246
+
247
+ ec._fadingOpacity = l._fadingOpacity;
248
+ ec.scaleByDistance = l.scaleByDistance;
249
+ ec.pickingScale = l.pickingScale;
250
+ ec.polygonOffsetUnits = l.polygonOffsetUnits;
251
+
252
+ outArr.push(ec);
253
+
254
+ if (l.clampToGround || l.relativeToGround) {
255
+ var e = ec._entities;
256
+ var i = e.length;
257
+
258
+ if (visibleNodes[this.nodeId] && visibleNodes[this.nodeId].state === quadTree.RENDERING) {
259
+ while (i--) {
260
+ let ei = e[i];
261
+ this.alignEntityToTheGround(ei, visibleNodes[this.nodeId].segment);
262
+ }
263
+ } else if (renderingNodeId) {
264
+ while (i--) {
265
+ let ei = e[i];
266
+ this.alignEntityToTheGround(ei, visibleNodes[renderingNodeId].segment);
267
+ }
268
+ } else {
269
+ var n = l._planet._renderedNodes;
270
+ while (i--) {
271
+ let ei = e[i];
272
+ let j = n.length;
273
+ while (j--) {
274
+ if (n[j].segment.isEntityInside(ei)) {
275
+ this.alignEntityToTheGround(ei, n[j].segment);
276
+ break;
277
+ }
278
+ }
279
+ }
280
+ }
281
+ }
282
+ }
283
+
284
+ alignEntityToTheGround(entity, segment) {
285
+ var res = new Vec3();
286
+ segment.getEntityTerrainPoint(entity, res);
287
+ entity._setCartesian3vSilent(res.addA(res.normal().scale((Number(this.layer.relativeToGround) && entity._altitude) || 0.0)));
288
+ }
289
+
290
+ isVisible() {
291
+ if (this.layer._renderingNodes[this.nodeId]) {
292
+ return true;
293
+ }
294
+ return false;
295
+ }
296
+
297
+ }
298
+
299
+ class EntityCollectionNodeWGS84 extends EntityCollectionNode {
300
+
301
+ constructor(layer, partId, parent, id, extent, planet, zoom) {
302
+ super(layer, partId, parent, id, extent, planet, zoom);
303
+ this.isNorth = false;
304
+ }
305
+
306
+ createChildrenNodes() {
307
+ var l = this.layer;
308
+ var ext = this.extent;
309
+ var size_x = ext.getWidth() * 0.5;
310
+ var size_y = ext.getHeight() * 0.5;
311
+ var ne = ext.northEast,
312
+ sw = ext.southWest;
313
+ var id = this.nodeId * 4 + 1;
314
+ var c = new LonLat(sw.lon + size_x, sw.lat + size_y);
315
+ var nd = this.childrenNodes;
316
+ var p = this.layer._planet;
317
+ var z = this.zoom + 1;
318
+
319
+ nd[quadTree.NW] = new EntityCollectionNodeWGS84(l, quadTree.NW, this, id,
320
+ new Extent(new LonLat(sw.lon, sw.lat + size_y), new LonLat(sw.lon + size_x, ne.lat)), p, z);
321
+
322
+ nd[quadTree.NE] = new EntityCollectionNodeWGS84(l, quadTree.NE, this, id,
323
+ new Extent(c, new LonLat(ne.lon, ne.lat)), p, z);
324
+
325
+ nd[quadTree.SW] = new EntityCollectionNodeWGS84(l, quadTree.SW, this, id,
326
+ new Extent(new LonLat(sw.lon, sw.lat), c), p, z);
327
+
328
+ nd[quadTree.SE] = new EntityCollectionNodeWGS84(l, quadTree.SE, this, id,
329
+ new Extent(new LonLat(sw.lon + size_x, sw.lat), new LonLat(ne.lon, sw.lat + size_y)), p, z);
330
+ }
331
+
332
+ _setExtentBounds() {
333
+ if (this.extent.northEast.lat > 0) {
334
+ this.isNorth = true;
335
+ }
336
+ this.bsphere.setFromExtent(this.layer._planet.ellipsoid, this.extent);
337
+ }
338
+
339
+ __setLonLat__(entity) {
340
+ if (entity._lonlat.isZero()) {
341
+ entity._lonlat = this.layer._planet.ellipsoid.cartesianToLonLat(entity._cartesian);
342
+ }
343
+ return entity._lonlat;
344
+ }
345
+
346
+ isVisible() {
347
+ if (this.isNorth && this.layer._renderingNodesNorth[this.nodeId]) {
348
+ return true;
349
+ } else if (this.layer._renderingNodesSouth[this.nodeId]) {
350
+ return true;
351
+ }
352
+ return false;
353
+ }
354
+
355
+ isInside(entity) {
356
+ return this.extent.isInside(entity._lonlat);
357
+ }
358
+
359
+ /**
360
+ *
361
+ * @param {*} outArr
362
+ * @param {*} visibleNodes
363
+ * @param {*} renderingNode
364
+ */
365
+ renderCollection(outArr, visibleNodes, renderingNode) {
366
+
367
+ if (this.isNorth) {
368
+ this.layer._renderingNodesNorth[this.nodeId] = true;
369
+ } else {
370
+ this.layer._renderingNodesSouth[this.nodeId] = true;
371
+ }
372
+
373
+ if (this.deferredEntities.length && !this._inTheQueue) {
374
+ if (this.layer.async) {
375
+ this.layer._queueDeferredNode(this);
376
+ } else {
377
+ this.applyCollection();
378
+ }
379
+ }
380
+
381
+ this.entityCollection._fadingOpacity = this.layer._fadingOpacity;
382
+ this.entityCollection.scaleByDistance = this.layer.scaleByDistance;
383
+ this.entityCollection.pickingScale = this.layer.pickingScale;
384
+
385
+ outArr.push(this.entityCollection);
386
+ }
387
+ }
388
+
389
+ export { EntityCollectionNode, EntityCollectionNodeWGS84 };