@cesium/engine 7.0.0 → 8.0.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 (172) hide show
  1. package/Build/Workers/{chunk-MY3VNFGQ.js → chunk-23UFSGND.js} +7 -7
  2. package/Build/Workers/{chunk-IQBYFRVW.js → chunk-2A75IWRS.js} +7 -7
  3. package/Build/Workers/{chunk-VRGFV2UO.js → chunk-2FRVPMCS.js} +10 -10
  4. package/Build/Workers/{chunk-46UD5ABS.js → chunk-2FWRMUTY.js} +4 -4
  5. package/Build/Workers/{chunk-DTAIXKTO.js → chunk-2UPKWTMJ.js} +6 -6
  6. package/Build/Workers/{chunk-6VJVYK2V.js → chunk-34FXV7D7.js} +2 -2
  7. package/Build/Workers/{chunk-ODW7WYM4.js → chunk-3VAZEH7M.js} +2 -2
  8. package/Build/Workers/{chunk-U2VCRRQW.js → chunk-4DO5W5XZ.js} +6 -6
  9. package/Build/Workers/{chunk-VK3EJHWI.js → chunk-4H7PY4U5.js} +2 -2
  10. package/Build/Workers/{chunk-RV7ZYPFT.js → chunk-5QULIR53.js} +4 -4
  11. package/Build/Workers/{chunk-JY5YEZFA.js → chunk-7TC63SJW.js} +8 -8
  12. package/Build/Workers/{chunk-JJ4VBOQ3.js → chunk-7ZFGPDJA.js} +4 -4
  13. package/Build/Workers/{chunk-FP6GYBFX.js → chunk-A5DWLWCY.js} +10 -10
  14. package/Build/Workers/{chunk-5M3U6ZMA.js → chunk-BBWDMCVU.js} +1 -1
  15. package/Build/Workers/{chunk-WZU2YLWG.js → chunk-BG4UCVXN.js} +3 -3
  16. package/Build/Workers/{chunk-5WQ523AW.js → chunk-BIKA3NRA.js} +5 -5
  17. package/Build/Workers/{chunk-PTQQUQC3.js → chunk-BROJAZRZ.js} +13 -13
  18. package/Build/Workers/{chunk-YUCVWAY6.js → chunk-DDUQAJ4P.js} +7 -7
  19. package/Build/Workers/{chunk-2HJWSU7B.js → chunk-EERJKOAF.js} +4 -4
  20. package/Build/Workers/{chunk-LZGHD6NY.js → chunk-EG6PTBY2.js} +15 -15
  21. package/Build/Workers/{chunk-IX2JCCNM.js → chunk-EHWHNOEX.js} +1 -1
  22. package/Build/Workers/{chunk-NKPBIX7F.js → chunk-F3YA3Y2Z.js} +1 -1
  23. package/Build/Workers/{chunk-L2ZN645J.js → chunk-F4HFJMGM.js} +6 -6
  24. package/Build/Workers/{chunk-F6SE42BK.js → chunk-FJKNFAKQ.js} +15 -472
  25. package/Build/Workers/{chunk-PNBGBETF.js → chunk-FNIRWHJB.js} +10 -10
  26. package/Build/Workers/{chunk-RAEV7K66.js → chunk-FZRIVR7Y.js} +5 -5
  27. package/Build/Workers/{chunk-AIPU2VSX.js → chunk-G43QFN4Q.js} +6 -6
  28. package/Build/Workers/{chunk-ZUA2UUNV.js → chunk-GATZHF3K.js} +2 -2
  29. package/Build/Workers/{chunk-ZK5JOS3D.js → chunk-GRC2ZTAF.js} +14 -14
  30. package/Build/Workers/{chunk-5YLJ77FF.js → chunk-HU6N6EXB.js} +10 -10
  31. package/Build/Workers/{chunk-4EBHOMFX.js → chunk-I46ZRR5W.js} +17 -17
  32. package/Build/Workers/{chunk-LZ7JIV3K.js → chunk-JURN7NPV.js} +17 -17
  33. package/Build/Workers/{chunk-JCNXK6EL.js → chunk-KKCR2YOP.js} +11 -11
  34. package/Build/Workers/{chunk-S6SKF6DT.js → chunk-LPR3YNP2.js} +5 -5
  35. package/Build/Workers/{chunk-UDO6BFSF.js → chunk-M7ERACJJ.js} +13 -13
  36. package/Build/Workers/{chunk-BZP4T2JJ.js → chunk-MDWEGWPA.js} +10 -10
  37. package/Build/Workers/{chunk-72SANQJV.js → chunk-OGXZVPPM.js} +9 -5
  38. package/Build/Workers/{chunk-AR5DNBJ4.js → chunk-PGSJK77E.js} +6 -6
  39. package/Build/Workers/{chunk-GEJTYLCO.js → chunk-PPH7OFP3.js} +5 -5
  40. package/Build/Workers/{chunk-OVLG3FRS.js → chunk-SH5USDPI.js} +6 -6
  41. package/Build/Workers/{chunk-6HZQPRUS.js → chunk-SOWMRMWA.js} +1 -1
  42. package/Build/Workers/{chunk-JXDC723O.js → chunk-STW2DGFI.js} +2 -2
  43. package/Build/Workers/{chunk-5HDYHG3F.js → chunk-T3XIFPYR.js} +13 -13
  44. package/Build/Workers/chunk-TTUZP4BO.js +501 -0
  45. package/Build/Workers/{chunk-7XEAYGZK.js → chunk-UEXTBDBE.js} +10 -10
  46. package/Build/Workers/{chunk-GV56Q4LU.js → chunk-VOXYEYJT.js} +11 -11
  47. package/Build/Workers/{chunk-NY3K4IM3.js → chunk-X4356LRH.js} +12 -12
  48. package/Build/Workers/{chunk-S4MAZ3SS.js → chunk-XGI5BXZY.js} +2 -2
  49. package/Build/Workers/{chunk-UAEW6HKG.js → chunk-Y2ME2IJV.js} +13 -13
  50. package/Build/Workers/{chunk-XWXM2O2R.js → chunk-Y5UQJLYE.js} +6 -6
  51. package/Build/Workers/{chunk-QZAD5O7I.js → chunk-YJEBABKH.js} +7 -7
  52. package/Build/Workers/{chunk-UGK3FCDY.js → chunk-YWTJ2B4B.js} +1 -1
  53. package/Build/Workers/{chunk-R5X4OQT4.js → chunk-Z3TIFFGF.js} +7 -7
  54. package/Build/Workers/{chunk-WBQCVXR3.js → chunk-ZT7KWISZ.js} +4 -4
  55. package/Build/Workers/combineGeometry.js +24 -23
  56. package/Build/Workers/createBoxGeometry.js +18 -17
  57. package/Build/Workers/createBoxOutlineGeometry.js +16 -15
  58. package/Build/Workers/createCircleGeometry.js +26 -25
  59. package/Build/Workers/createCircleOutlineGeometry.js +19 -18
  60. package/Build/Workers/createCoplanarPolygonGeometry.js +33 -32
  61. package/Build/Workers/createCoplanarPolygonOutlineGeometry.js +31 -30
  62. package/Build/Workers/createCorridorGeometry.js +29 -28
  63. package/Build/Workers/createCorridorOutlineGeometry.js +28 -27
  64. package/Build/Workers/createCylinderGeometry.js +20 -19
  65. package/Build/Workers/createCylinderOutlineGeometry.js +18 -17
  66. package/Build/Workers/createEllipseGeometry.js +26 -25
  67. package/Build/Workers/createEllipseOutlineGeometry.js +19 -18
  68. package/Build/Workers/createEllipsoidGeometry.js +19 -18
  69. package/Build/Workers/createEllipsoidOutlineGeometry.js +18 -17
  70. package/Build/Workers/createFrustumGeometry.js +18 -17
  71. package/Build/Workers/createFrustumOutlineGeometry.js +18 -17
  72. package/Build/Workers/createGeometry.js +54 -33
  73. package/Build/Workers/createGroundPolylineGeometry.js +22 -21
  74. package/Build/Workers/createPlaneGeometry.js +16 -15
  75. package/Build/Workers/createPlaneOutlineGeometry.js +15 -14
  76. package/Build/Workers/createPolygonGeometry.js +32 -31
  77. package/Build/Workers/createPolygonOutlineGeometry.js +30 -29
  78. package/Build/Workers/createPolylineGeometry.js +25 -24
  79. package/Build/Workers/createPolylineVolumeGeometry.js +31 -30
  80. package/Build/Workers/createPolylineVolumeOutlineGeometry.js +27 -26
  81. package/Build/Workers/createRectangleGeometry.js +27 -26
  82. package/Build/Workers/createRectangleOutlineGeometry.js +20 -19
  83. package/Build/Workers/createSimplePolylineGeometry.js +23 -22
  84. package/Build/Workers/createSphereGeometry.js +19 -18
  85. package/Build/Workers/createSphereOutlineGeometry.js +18 -17
  86. package/Build/Workers/createTaskProcessorWorker.js +3 -3
  87. package/Build/Workers/createVectorTileClampedPolylines.js +14 -14
  88. package/Build/Workers/createVectorTileGeometries.js +24 -23
  89. package/Build/Workers/createVectorTilePoints.js +12 -12
  90. package/Build/Workers/createVectorTilePolygons.js +22 -21
  91. package/Build/Workers/createVectorTilePolylines.js +14 -14
  92. package/Build/Workers/createVerticesFromGoogleEarthEnterpriseBuffer.js +22 -21
  93. package/Build/Workers/createVerticesFromHeightmap.js +22 -21
  94. package/Build/Workers/createVerticesFromQuantizedTerrainMesh.js +19 -18
  95. package/Build/Workers/createWallGeometry.js +24 -23
  96. package/Build/Workers/createWallOutlineGeometry.js +23 -22
  97. package/Build/Workers/decodeDraco.js +11 -11
  98. package/Build/Workers/decodeGoogleEarthEnterprisePacket.js +5 -5
  99. package/Build/Workers/decodeI3S.js +601 -92
  100. package/Build/Workers/transcodeKTX2.js +7 -7
  101. package/Build/Workers/transferTypedArrayTest.js +1 -1
  102. package/Build/Workers/upsampleQuantizedTerrainMesh.js +22 -21
  103. package/Source/Core/Ellipsoid.js +6 -0
  104. package/Source/Core/IntersectionTests.js +6 -3
  105. package/Source/Core/Ion.js +1 -1
  106. package/Source/Core/PixelFormat.js +5 -0
  107. package/Source/Core/Transforms.js +3 -0
  108. package/Source/Core/srgbToLinear.js +32 -0
  109. package/Source/DataSources/CzmlDataSource.js +51 -23
  110. package/Source/DataSources/DataSourceDisplay.js +27 -0
  111. package/Source/DataSources/Entity.js +20 -2
  112. package/Source/DataSources/GeometryUpdaterSet.js +114 -0
  113. package/Source/DataSources/GeometryVisualizer.js +19 -83
  114. package/Source/Renderer/Context.js +10 -0
  115. package/Source/Renderer/ContextLimits.js +2 -0
  116. package/Source/Renderer/demodernizeShader.js +4 -1
  117. package/Source/Scene/ArcGisMapService.js +1 -1
  118. package/Source/Scene/Axis.js +12 -7
  119. package/Source/Scene/Camera.js +46 -4
  120. package/Source/Scene/Cesium3DTileset.js +44 -6
  121. package/Source/Scene/Cesium3DTilesetBaseTraversal.js +2 -4
  122. package/Source/Scene/FrameState.js +5 -0
  123. package/Source/Scene/GlobeTranslucencyState.js +1 -1
  124. package/Source/Scene/GltfPipeline/updateVersion.js +69 -68
  125. package/Source/Scene/I3SDataProvider.js +270 -53
  126. package/Source/Scene/I3SDecoder.js +8 -1
  127. package/Source/Scene/I3SFeature.js +2 -5
  128. package/Source/Scene/I3SField.js +136 -31
  129. package/Source/Scene/I3SGeometry.js +70 -2
  130. package/Source/Scene/I3SLayer.js +55 -10
  131. package/Source/Scene/I3SNode.js +175 -18
  132. package/Source/Scene/I3SStatistics.js +94 -0
  133. package/Source/Scene/I3SSublayer.js +176 -0
  134. package/Source/Scene/I3SSymbology.js +337 -0
  135. package/Source/Scene/KeyframeNode.js +1 -1
  136. package/Source/Scene/Model/pickModel.js +25 -7
  137. package/Source/Scene/PickFramebuffer.js +37 -2
  138. package/Source/Scene/Picking.js +113 -39
  139. package/Source/Scene/Primitive.js +6 -2
  140. package/Source/Scene/Scene.js +126 -42
  141. package/Source/Scene/ScreenSpaceCameraController.js +21 -7
  142. package/Source/Scene/SensorVolumePortionToDisplay.js +69 -0
  143. package/Source/Scene/SpatialNode.js +12 -19
  144. package/Source/Scene/StructuralMetadata.js +1 -1
  145. package/Source/Scene/VoxelBoxShape.js +76 -0
  146. package/Source/Scene/VoxelCell.js +273 -0
  147. package/Source/Scene/VoxelCylinderShape.js +114 -43
  148. package/Source/Scene/VoxelEllipsoidShape.js +158 -116
  149. package/Source/Scene/VoxelPrimitive.js +3 -1
  150. package/Source/Scene/VoxelRenderResources.js +3 -0
  151. package/Source/Scene/VoxelShape.js +13 -0
  152. package/Source/Scene/VoxelTraversal.js +76 -54
  153. package/Source/Scene/buildVoxelDrawCommands.js +23 -0
  154. package/Source/Scene/createGooglePhotorealistic3DTileset.js +1 -0
  155. package/Source/Scene/processVoxelProperties.js +2 -0
  156. package/Source/Shaders/Voxels/IntersectCylinder.glsl +14 -111
  157. package/Source/Shaders/Voxels/IntersectCylinder.js +14 -111
  158. package/Source/Shaders/Voxels/IntersectEllipsoid.glsl +32 -113
  159. package/Source/Shaders/Voxels/IntersectEllipsoid.js +32 -113
  160. package/Source/Shaders/Voxels/IntersectLongitude.glsl +102 -0
  161. package/Source/Shaders/Voxels/IntersectLongitude.js +104 -0
  162. package/Source/Shaders/Voxels/VoxelFS.glsl +39 -1
  163. package/Source/Shaders/Voxels/VoxelFS.js +39 -1
  164. package/Source/Shaders/Voxels/convertUvToCylinder.glsl +19 -37
  165. package/Source/Shaders/Voxels/convertUvToCylinder.js +19 -37
  166. package/Source/Shaders/Voxels/convertUvToEllipsoid.glsl +24 -44
  167. package/Source/Shaders/Voxels/convertUvToEllipsoid.js +24 -44
  168. package/Source/Workers/createGeometry.js +40 -11
  169. package/Source/Workers/decodeI3S.js +720 -94
  170. package/index.d.ts +296 -11
  171. package/index.js +102 -94
  172. package/package.json +1 -1
@@ -0,0 +1,176 @@
1
+ import Check from "../Core/Check.js";
2
+ import defaultValue from "../Core/defaultValue.js";
3
+ import defined from "../Core/defined.js";
4
+ import I3SDataProvider from "./I3SDataProvider.js";
5
+ import I3SLayer from "./I3SLayer.js";
6
+ import Resource from "../Core/Resource.js";
7
+
8
+ /**
9
+ * This class implements an I3S sublayer for Building Scene Layer.
10
+ * <p>
11
+ * This object is normally not instantiated directly, use {@link I3SSublayer.fromData}.
12
+ * </p>
13
+ * @alias I3SSublayer
14
+ * @internalConstructor
15
+ */
16
+ function I3SSublayer(dataProvider, parent, sublayerData) {
17
+ this._dataProvider = dataProvider;
18
+ this._parent = parent;
19
+ this._data = sublayerData;
20
+ this._name = sublayerData.name;
21
+ this._modelName = sublayerData.modelName;
22
+ this._visibility = defaultValue(sublayerData.visibility, true);
23
+ this._resource = undefined;
24
+ this._sublayers = [];
25
+ this._i3sLayers = [];
26
+ }
27
+
28
+ Object.defineProperties(I3SSublayer.prototype, {
29
+ /**
30
+ * Gets the resource for the sublayer
31
+ * @memberof I3SSublayer.prototype
32
+ * @type {Resource}
33
+ * @readonly
34
+ */
35
+ resource: {
36
+ get: function () {
37
+ return this._resource;
38
+ },
39
+ },
40
+
41
+ /**
42
+ * Gets the I3S data for this object.
43
+ * @memberof I3SSublayer.prototype
44
+ * @type {object}
45
+ * @readonly
46
+ */
47
+ data: {
48
+ get: function () {
49
+ return this._data;
50
+ },
51
+ },
52
+
53
+ /**
54
+ * Gets the name for the sublayer.
55
+ * @memberof I3SSublayer.prototype
56
+ * @type {string}
57
+ * @readonly
58
+ */
59
+ name: {
60
+ get: function () {
61
+ return this._name;
62
+ },
63
+ },
64
+
65
+ /**
66
+ * Gets the model name for the sublayer.
67
+ * @memberof I3SSublayer.prototype
68
+ * @type {string}
69
+ * @readonly
70
+ */
71
+ modelName: {
72
+ get: function () {
73
+ return this._modelName;
74
+ },
75
+ },
76
+
77
+ /**
78
+ * Gets the collection of child sublayers.
79
+ * @memberof I3SSublayer.prototype
80
+ * @type {I3SSublayer[]}
81
+ * @readonly
82
+ */
83
+ sublayers: {
84
+ get: function () {
85
+ return this._sublayers;
86
+ },
87
+ },
88
+
89
+ /**
90
+ * Gets or sets the sublayer visibility.
91
+ * @memberof I3SSublayer.prototype
92
+ * @type {boolean}
93
+ */
94
+ visibility: {
95
+ get: function () {
96
+ return this._visibility;
97
+ },
98
+ set: function (value) {
99
+ //>>includeStart('debug', pragmas.debug);
100
+ Check.defined("value", value);
101
+ //>>includeEnd('debug');
102
+
103
+ if (this._visibility !== value) {
104
+ this._visibility = value;
105
+ for (let i = 0; i < this._i3sLayers.length; i++) {
106
+ this._i3sLayers[i]._updateVisibility();
107
+ }
108
+ }
109
+ },
110
+ },
111
+
112
+ /**
113
+ * Determines if the sublayer will be shown.
114
+ * @memberof I3SSublayer.prototype
115
+ * @type {boolean}
116
+ * @readonly
117
+ */
118
+ show: {
119
+ get: function () {
120
+ return this._visibility && this._parent.show;
121
+ },
122
+ },
123
+ });
124
+
125
+ /**
126
+ * @private
127
+ */
128
+ I3SSublayer._fromData = async function (
129
+ dataProvider,
130
+ buildingLayerUrl,
131
+ sublayerData,
132
+ parent
133
+ ) {
134
+ const sublayer = new I3SSublayer(dataProvider, parent, sublayerData);
135
+ if (sublayer._data.layerType === "group") {
136
+ const sublayers = sublayer._data.sublayers;
137
+ if (defined(sublayers)) {
138
+ const promises = [];
139
+ for (let i = 0; i < sublayers.length; i++) {
140
+ const promise = I3SSublayer._fromData(
141
+ dataProvider,
142
+ buildingLayerUrl,
143
+ sublayers[i],
144
+ sublayer
145
+ );
146
+ promises.push(promise);
147
+ }
148
+ const childSublayers = await Promise.all(promises);
149
+ for (let i = 0; i < childSublayers.length; i++) {
150
+ const childSublayer = childSublayers[i];
151
+ sublayer._sublayers.push(childSublayer);
152
+ sublayer._i3sLayers.push(...childSublayer._i3sLayers);
153
+ }
154
+ }
155
+ } else if (sublayer._data.layerType === "3DObject") {
156
+ const sublayerUrl = buildingLayerUrl.concat(
157
+ `/sublayers/${sublayer._data.id}`
158
+ );
159
+ const resource = new Resource({ url: sublayerUrl });
160
+ resource.setQueryParameters(dataProvider.resource.queryParameters);
161
+ resource.appendForwardSlash();
162
+ sublayer._resource = resource;
163
+
164
+ const layerData = await I3SDataProvider.loadJson(sublayer._resource);
165
+ const layer = new I3SLayer(dataProvider, layerData, sublayer);
166
+ sublayer._i3sLayers.push(layer);
167
+ } else {
168
+ // Filter other scene layer types out
169
+ console.log(
170
+ `${sublayer._data.layerType} layer ${sublayer._data.name} is skipped as not supported.`
171
+ );
172
+ }
173
+ return sublayer;
174
+ };
175
+
176
+ export default I3SSublayer;
@@ -0,0 +1,337 @@
1
+ import Color from "../Core/Color.js";
2
+ import defaultValue from "../Core/defaultValue.js";
3
+ import defined from "../Core/defined.js";
4
+ import srgbToLinear from "../Core/srgbToLinear.js";
5
+
6
+ /**
7
+ * This class implements an I3S symbology for I3S Layers.
8
+ * <p>
9
+ * Do not construct this directly, instead access symbology through {@link I3SLayer}.
10
+ * </p>
11
+ * @alias I3SSymbology
12
+ * @internalConstructor
13
+ */
14
+ function I3SSymbology(layer) {
15
+ this._layer = layer;
16
+ this._defaultSymbology = undefined;
17
+ this._valueFields = [];
18
+ this._uniqueValueHash = undefined;
19
+ this._classBreaksHash = undefined;
20
+
21
+ this._parseLayerSymbology();
22
+ }
23
+
24
+ Object.defineProperties(I3SSymbology.prototype, {
25
+ /**
26
+ * Gets the default symbology data.
27
+ * @memberof I3SSymbology.prototype
28
+ * @type {object}
29
+ * @readonly
30
+ */
31
+ defaultSymbology: {
32
+ get: function () {
33
+ return this._defaultSymbology;
34
+ },
35
+ },
36
+ });
37
+
38
+ function convertColor(color, transparency) {
39
+ // color is represented as a three or four-element array, values range from 0 through 255.
40
+ // transparency value has to lie between 100 (full transparency) and 0 (full opacity).
41
+ const convertedColor = [];
42
+ for (let i = 0; i < color.length; i++) {
43
+ const floatColor = Color.byteToFloat(color[i]);
44
+ if (i < 3) {
45
+ convertedColor.push(srgbToLinear(floatColor));
46
+ } else {
47
+ convertedColor.push(floatColor);
48
+ }
49
+ }
50
+ if (convertedColor.length === 3) {
51
+ if (defined(transparency)) {
52
+ convertedColor.push(1.0 - transparency / 100.0);
53
+ } else {
54
+ convertedColor.push(1.0);
55
+ }
56
+ }
57
+ return convertedColor;
58
+ }
59
+
60
+ function parseSymbol(symbol, isColorCaptured) {
61
+ const symbology = {
62
+ edges: undefined,
63
+ material: undefined,
64
+ };
65
+ if (defined(symbol) && defined(symbol.symbolLayers)) {
66
+ for (let i = 0; i < symbol.symbolLayers.length; i++) {
67
+ const symbolLayer = symbol.symbolLayers[i];
68
+ if (symbolLayer.type === "Fill") {
69
+ const edges = symbolLayer.edges;
70
+ const outline = symbolLayer.outline;
71
+ if (defined(edges)) {
72
+ symbology.edges = {};
73
+ if (defined(edges.color)) {
74
+ symbology.edges.color = convertColor(
75
+ edges.color,
76
+ edges.transparency
77
+ );
78
+ }
79
+ } else if (defined(outline)) {
80
+ symbology.edges = {};
81
+ if (defined(outline.color)) {
82
+ symbology.edges.color = convertColor(
83
+ outline.color,
84
+ outline.transparency
85
+ );
86
+ }
87
+ }
88
+
89
+ if (!isColorCaptured) {
90
+ const material = symbolLayer.material;
91
+ if (defined(material)) {
92
+ symbology.material = {
93
+ colorMixMode: material.colorMixMode,
94
+ };
95
+ if (defined(material.color)) {
96
+ symbology.material.color = convertColor(
97
+ material.color,
98
+ material.transparency
99
+ );
100
+ }
101
+ }
102
+ }
103
+ break;
104
+ }
105
+ }
106
+ }
107
+ return symbology;
108
+ }
109
+
110
+ function buildUniqueValueHash(renderer, isColorCaptured) {
111
+ if (defined(renderer.uniqueValueGroups)) {
112
+ const valueHash = {};
113
+ for (
114
+ let groupIndex = 0;
115
+ groupIndex < renderer.uniqueValueGroups.length;
116
+ groupIndex++
117
+ ) {
118
+ const classes = renderer.uniqueValueGroups[groupIndex].classes;
119
+ if (defined(classes)) {
120
+ for (let classIndex = 0; classIndex < classes.length; classIndex++) {
121
+ const classSymbology = parseSymbol(
122
+ classes[classIndex].symbol,
123
+ isColorCaptured
124
+ );
125
+ const values = classes[classIndex].values;
126
+ for (let valueIndex = 0; valueIndex < values.length; valueIndex++) {
127
+ const fieldValues = values[valueIndex];
128
+ let hash = valueHash;
129
+ for (
130
+ let fieldIndex = 0;
131
+ fieldIndex < fieldValues.length;
132
+ fieldIndex++
133
+ ) {
134
+ const fieldValue = fieldValues[fieldIndex];
135
+ if (fieldIndex === fieldValues.length - 1) {
136
+ hash[fieldValue] = classSymbology;
137
+ } else {
138
+ if (!defined(hash[fieldValue])) {
139
+ hash[fieldValue] = {};
140
+ }
141
+ hash = hash[fieldValue];
142
+ }
143
+ }
144
+ }
145
+ }
146
+ }
147
+ }
148
+ return valueHash;
149
+ }
150
+ if (defined(renderer.uniqueValueInfos)) {
151
+ const valueHash = {};
152
+ for (
153
+ let infoIndex = 0;
154
+ infoIndex < renderer.uniqueValueInfos.length;
155
+ infoIndex++
156
+ ) {
157
+ const info = renderer.uniqueValueInfos[infoIndex];
158
+ valueHash[info.value] = parseSymbol(info.symbol, isColorCaptured);
159
+ }
160
+ return valueHash;
161
+ }
162
+ return undefined;
163
+ }
164
+
165
+ function buildClassBreaksHash(renderer, isColorCaptured) {
166
+ if (defined(renderer.classBreakInfos)) {
167
+ const classBreakInfos = [...renderer.classBreakInfos];
168
+ classBreakInfos.sort(function (a, b) {
169
+ const aMax = defaultValue(a.classMaxValue, a.classMinValue);
170
+ const bMax = defaultValue(b.classMaxValue, b.classMinValue);
171
+ return aMax - bMax;
172
+ });
173
+ const valueHash = {
174
+ ranges: [],
175
+ symbols: [],
176
+ };
177
+
178
+ if (defined(renderer.minValue)) {
179
+ valueHash.ranges.push(renderer.minValue);
180
+ valueHash.symbols.push(undefined);
181
+ }
182
+ for (let infoIndex = 0; infoIndex < classBreakInfos.length; infoIndex++) {
183
+ const info = classBreakInfos[infoIndex];
184
+ if (defined(info.classMinValue)) {
185
+ if (
186
+ valueHash.ranges.length === 0 ||
187
+ info.classMinValue > valueHash.ranges[valueHash.ranges.length - 1]
188
+ ) {
189
+ valueHash.ranges.push(info.classMinValue);
190
+ valueHash.symbols.push(undefined);
191
+ }
192
+ }
193
+ if (defined(info.classMaxValue)) {
194
+ if (
195
+ valueHash.ranges.length === 0 ||
196
+ info.classMaxValue > valueHash.ranges[valueHash.ranges.length - 1]
197
+ ) {
198
+ valueHash.ranges.push(info.classMaxValue);
199
+ valueHash.symbols.push(parseSymbol(info.symbol, isColorCaptured));
200
+ }
201
+ }
202
+ }
203
+ valueHash.symbols.push(undefined);
204
+
205
+ return valueHash;
206
+ }
207
+ return undefined;
208
+ }
209
+
210
+ /**
211
+ * @private
212
+ */
213
+ I3SSymbology.prototype._parseLayerSymbology = function () {
214
+ const drawingInfo = this._layer.data.drawingInfo;
215
+ if (defined(drawingInfo) && defined(drawingInfo.renderer)) {
216
+ const cachedDrawingInfo = this._layer.data.cachedDrawingInfo;
217
+ const isColorCaptured =
218
+ defined(cachedDrawingInfo) && cachedDrawingInfo.color === true;
219
+ const renderer = drawingInfo.renderer;
220
+ if (renderer.type === "simple") {
221
+ this._defaultSymbology = parseSymbol(renderer.symbol, isColorCaptured);
222
+ } else if (renderer.type === "uniqueValue") {
223
+ this._defaultSymbology = parseSymbol(
224
+ renderer.defaultSymbol,
225
+ isColorCaptured
226
+ );
227
+ this._valueFields.push(renderer.field1);
228
+ if (defined(renderer.field2)) {
229
+ this._valueFields.push(renderer.field2);
230
+ }
231
+ if (defined(renderer.field3)) {
232
+ this._valueFields.push(renderer.field3);
233
+ }
234
+ this._uniqueValueHash = buildUniqueValueHash(renderer, isColorCaptured);
235
+ } else if (renderer.type === "classBreaks") {
236
+ this._defaultSymbology = parseSymbol(
237
+ renderer.defaultSymbol,
238
+ isColorCaptured
239
+ );
240
+ this._valueFields.push(renderer.field);
241
+ this._classBreaksHash = buildClassBreaksHash(renderer, isColorCaptured);
242
+ }
243
+ }
244
+ };
245
+
246
+ function findHashForUniqueValues(hash, values, hashLevel, valueIndex) {
247
+ const levelValues = values[hashLevel];
248
+ if (valueIndex < levelValues.length) {
249
+ const hashValue = levelValues[valueIndex];
250
+ const innerHash = hash[hashValue];
251
+ if (defined(innerHash) && ++hashLevel < values.length) {
252
+ return findHashForUniqueValues(innerHash, values, hashLevel, valueIndex);
253
+ }
254
+ return innerHash;
255
+ }
256
+ return undefined;
257
+ }
258
+
259
+ function bisect(array, value) {
260
+ let low = 0;
261
+ let high = array.length;
262
+ if (low < high) {
263
+ do {
264
+ const mid = (low + high) >>> 1;
265
+ if (array[mid] < value) {
266
+ low = mid + 1;
267
+ } else {
268
+ high = mid;
269
+ }
270
+ } while (low < high);
271
+ }
272
+ return low;
273
+ }
274
+
275
+ function findHashForClassBreaks(hash, values, valueIndex) {
276
+ const value = values[valueIndex];
277
+ const range = bisect(hash.ranges, value);
278
+ return hash.symbols[range];
279
+ }
280
+
281
+ /**
282
+ * @private
283
+ */
284
+ I3SSymbology.prototype._getSymbology = async function (node) {
285
+ const symbology = {
286
+ default: this._defaultSymbology,
287
+ };
288
+
289
+ if (this._valueFields.length > 0) {
290
+ const promises = [];
291
+ for (let i = 0; i < this._valueFields.length; i++) {
292
+ promises.push(node.loadField(this._valueFields[i]));
293
+ }
294
+ await Promise.all(promises);
295
+
296
+ const fieldsValues = [];
297
+ for (let i = 0; i < this._valueFields.length; i++) {
298
+ fieldsValues.push(node.fields[this._valueFields[i]].values);
299
+ }
300
+
301
+ let featureHashFn;
302
+ if (defined(this._uniqueValueHash)) {
303
+ featureHashFn = (featureIndex) =>
304
+ findHashForUniqueValues(
305
+ this._uniqueValueHash,
306
+ fieldsValues,
307
+ 0,
308
+ featureIndex
309
+ );
310
+ } else if (defined(this._classBreaksHash)) {
311
+ featureHashFn = (featureIndex) =>
312
+ findHashForClassBreaks(
313
+ this._classBreaksHash,
314
+ fieldsValues[0],
315
+ featureIndex
316
+ );
317
+ }
318
+
319
+ if (defined(featureHashFn)) {
320
+ const firstFieldValues = fieldsValues[0];
321
+ for (
322
+ let featureIndex = 0;
323
+ featureIndex < firstFieldValues.length;
324
+ featureIndex++
325
+ ) {
326
+ const featureSymbology = featureHashFn(featureIndex);
327
+ if (defined(featureSymbology)) {
328
+ symbology[featureIndex] = featureSymbology;
329
+ }
330
+ }
331
+ }
332
+ }
333
+
334
+ return symbology;
335
+ };
336
+
337
+ export default I3SSymbology;
@@ -20,7 +20,7 @@ function KeyframeNode(spatialNode, keyframe) {
20
20
  this.spatialNode = spatialNode;
21
21
  this.keyframe = keyframe;
22
22
  this.state = LoadState.UNLOADED;
23
- this.metadatas = [];
23
+ this.metadata = [];
24
24
  this.megatextureIndex = -1;
25
25
  this.priority = -Number.MAX_VALUE;
26
26
  this.highPriorityFrameNumber = -1;
@@ -198,6 +198,8 @@ export default function pickModel(
198
198
  primitive,
199
199
  VertexAttributeSemantic.POSITION
200
200
  );
201
+ const byteOffset = positionAttribute.byteOffset;
202
+ const byteStride = positionAttribute.byteStride;
201
203
  const vertexCount = positionAttribute.count;
202
204
 
203
205
  if (!defined(primitive.indices)) {
@@ -234,7 +236,19 @@ export default function pickModel(
234
236
  }
235
237
 
236
238
  const numComponents = AttributeType.getNumberOfComponents(attributeType);
237
- const elementCount = vertexCount * numComponents;
239
+ const bytes = ComponentDatatype.getSizeInBytes(componentDatatype);
240
+ const isInterleaved =
241
+ !defined(vertices) &&
242
+ defined(byteStride) &&
243
+ byteStride !== numComponents * bytes;
244
+
245
+ let elementStride = numComponents;
246
+ let offset = 0;
247
+ if (isInterleaved) {
248
+ elementStride = byteStride / bytes;
249
+ offset = byteOffset / bytes;
250
+ }
251
+ const elementCount = vertexCount * elementStride;
238
252
 
239
253
  if (!defined(vertices)) {
240
254
  const verticesBuffer = positionAttribute.buffer;
@@ -246,7 +260,7 @@ export default function pickModel(
246
260
  );
247
261
  verticesBuffer.getBufferData(
248
262
  vertices,
249
- positionAttribute.byteOffset,
263
+ isInterleaved ? 0 : byteOffset,
250
264
  0,
251
265
  elementCount
252
266
  );
@@ -280,7 +294,8 @@ export default function pickModel(
280
294
  const v0 = getVertexPosition(
281
295
  vertices,
282
296
  i0,
283
- numComponents,
297
+ offset,
298
+ elementStride,
284
299
  quantization,
285
300
  instanceTransform,
286
301
  verticalExaggeration,
@@ -291,7 +306,8 @@ export default function pickModel(
291
306
  const v1 = getVertexPosition(
292
307
  vertices,
293
308
  i1,
294
- numComponents,
309
+ offset,
310
+ elementStride,
295
311
  quantization,
296
312
  instanceTransform,
297
313
  verticalExaggeration,
@@ -302,7 +318,8 @@ export default function pickModel(
302
318
  const v2 = getVertexPosition(
303
319
  vertices,
304
320
  i2,
305
- numComponents,
321
+ offset,
322
+ elementStride,
306
323
  quantization,
307
324
  instanceTransform,
308
325
  verticalExaggeration,
@@ -350,7 +367,8 @@ export default function pickModel(
350
367
  function getVertexPosition(
351
368
  vertices,
352
369
  index,
353
- numComponents,
370
+ offset,
371
+ numElements,
354
372
  quantization,
355
373
  instanceTransform,
356
374
  verticalExaggeration,
@@ -358,7 +376,7 @@ function getVertexPosition(
358
376
  ellipsoid,
359
377
  result
360
378
  ) {
361
- const i = index * numComponents;
379
+ const i = offset + index * numElements;
362
380
  result.x = vertices[i];
363
381
  result.y = vertices[i + 1];
364
382
  result.z = vertices[i + 2];
@@ -27,10 +27,10 @@ function PickFramebuffer(context) {
27
27
  this._width = 0;
28
28
  this._height = 0;
29
29
  }
30
+
30
31
  PickFramebuffer.prototype.begin = function (screenSpaceRectangle, viewport) {
31
32
  const context = this._context;
32
- const width = viewport.width;
33
- const height = viewport.height;
33
+ const { width, height } = viewport;
34
34
 
35
35
  BoundingRectangle.clone(
36
36
  screenSpaceRectangle,
@@ -51,6 +51,12 @@ PickFramebuffer.prototype.begin = function (screenSpaceRectangle, viewport) {
51
51
 
52
52
  const colorScratch = new Color();
53
53
 
54
+ /**
55
+ * Return the picked object rendered within a given rectangle.
56
+ *
57
+ * @param {BoundingRectangle} screenSpaceRectangle
58
+ * @returns {object|undefined} The object rendered in the middle of the rectangle, or undefined if nothing was rendered.
59
+ */
54
60
  PickFramebuffer.prototype.end = function (screenSpaceRectangle) {
55
61
  const width = defaultValue(screenSpaceRectangle.width, 1.0);
56
62
  const height = defaultValue(screenSpaceRectangle.height, 1.0);
@@ -114,6 +120,34 @@ PickFramebuffer.prototype.end = function (screenSpaceRectangle) {
114
120
  return undefined;
115
121
  };
116
122
 
123
+ /**
124
+ * Return voxel tile and sample information as rendered by a pickVoxel pass,
125
+ * within a given rectangle.
126
+ *
127
+ * @param {BoundingRectangle} screenSpaceRectangle
128
+ * @returns {TypedArray}
129
+ */
130
+ PickFramebuffer.prototype.readVoxelInfo = function (screenSpaceRectangle) {
131
+ const width = defaultValue(screenSpaceRectangle.width, 1.0);
132
+ const height = defaultValue(screenSpaceRectangle.height, 1.0);
133
+
134
+ const context = this._context;
135
+ const pixels = context.readPixels({
136
+ x: screenSpaceRectangle.x,
137
+ y: screenSpaceRectangle.y,
138
+ width: width,
139
+ height: height,
140
+ framebuffer: this._fb.framebuffer,
141
+ });
142
+
143
+ // Read the center pixel
144
+ const halfWidth = Math.floor(width * 0.5);
145
+ const halfHeight = Math.floor(height * 0.5);
146
+ const index = 4 * (halfHeight * width + halfWidth);
147
+
148
+ return pixels.slice(index, index + 4);
149
+ };
150
+
117
151
  PickFramebuffer.prototype.isDestroyed = function () {
118
152
  return false;
119
153
  };
@@ -122,4 +156,5 @@ PickFramebuffer.prototype.destroy = function () {
122
156
  this._fb.destroy();
123
157
  return destroyObject(this);
124
158
  };
159
+
125
160
  export default PickFramebuffer;