@cesium/engine 1.0.0 → 1.1.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 (196) hide show
  1. package/Build/Workers/{AttributeCompression-4589338a.js → AttributeCompression-b646d393.js} +1 -1
  2. package/Build/Workers/{AxisAlignedBoundingBox-bfb1234f.js → AxisAlignedBoundingBox-a4321399.js} +1 -1
  3. package/Build/Workers/{BoundingRectangle-7ffc2153.js → BoundingRectangle-80d8801f.js} +1 -1
  4. package/Build/Workers/{BoxGeometry-93f344a3.js → BoxGeometry-33c10a4f.js} +1 -1
  5. package/Build/Workers/{Color-0c5aaf47.js → Color-1bf9a6e0.js} +1 -1
  6. package/Build/Workers/{CoplanarPolygonGeometryLibrary-6597982a.js → CoplanarPolygonGeometryLibrary-5c5b981b.js} +1 -1
  7. package/Build/Workers/{CorridorGeometryLibrary-2119580e.js → CorridorGeometryLibrary-7cbae7a0.js} +1 -1
  8. package/Build/Workers/{CylinderGeometry-f9503c6d.js → CylinderGeometry-42740df0.js} +1 -1
  9. package/Build/Workers/{EllipseGeometry-fedf72d5.js → EllipseGeometry-49a3ac21.js} +1 -1
  10. package/Build/Workers/{EllipseGeometryLibrary-4ea68687.js → EllipseGeometryLibrary-b891b2f8.js} +1 -1
  11. package/Build/Workers/{EllipseOutlineGeometry-e2ae6a35.js → EllipseOutlineGeometry-fbd72e07.js} +1 -1
  12. package/Build/Workers/{EllipsoidGeodesic-16de63ea.js → EllipsoidGeodesic-98c62a56.js} +1 -1
  13. package/Build/Workers/{EllipsoidGeometry-95c0330e.js → EllipsoidGeometry-a351dba8.js} +1 -1
  14. package/Build/Workers/{EllipsoidOutlineGeometry-d6d2ceec.js → EllipsoidOutlineGeometry-3e8779bf.js} +1 -1
  15. package/Build/Workers/{EllipsoidRhumbLine-ae5e65e0.js → EllipsoidRhumbLine-19756602.js} +1 -1
  16. package/Build/Workers/{EllipsoidTangentPlane-bfc674bf.js → EllipsoidTangentPlane-cfb50678.js} +1 -1
  17. package/Build/Workers/{EncodedCartesian3-f473ea18.js → EncodedCartesian3-81f70735.js} +1 -1
  18. package/Build/Workers/{FrustumGeometry-3bf2e4eb.js → FrustumGeometry-c5754412.js} +1 -1
  19. package/Build/Workers/{GeometryAttribute-df5f473e.js → GeometryAttribute-0bfd05e8.js} +1 -1
  20. package/Build/Workers/{GeometryInstance-aa75b4cf.js → GeometryInstance-451dc1cd.js} +1 -1
  21. package/Build/Workers/{GeometryPipeline-f0e46c42.js → GeometryPipeline-0166905d.js} +1 -1
  22. package/Build/Workers/{IntersectionTests-9de29d51.js → IntersectionTests-a93d3de9.js} +1 -1
  23. package/Build/Workers/{Matrix2-ce637455.js → Matrix2-13178034.js} +4 -2
  24. package/Build/Workers/{Matrix3-4f4df527.js → Matrix3-315394f6.js} +2 -1
  25. package/Build/Workers/{OrientedBoundingBox-d3ff3d4d.js → OrientedBoundingBox-b450cb61.js} +5 -5
  26. package/Build/Workers/{Plane-b81241c2.js → Plane-900aa728.js} +1 -1
  27. package/Build/Workers/{PolygonGeometryLibrary-6f4937bb.js → PolygonGeometryLibrary-f918ac26.js} +1 -1
  28. package/Build/Workers/PolygonPipeline-f59a8f0a.js +1345 -0
  29. package/Build/Workers/{PolylinePipeline-2e2b015c.js → PolylinePipeline-d8e6bd9b.js} +1 -1
  30. package/Build/Workers/{PolylineVolumeGeometryLibrary-7ee1d449.js → PolylineVolumeGeometryLibrary-125d2edf.js} +1 -1
  31. package/Build/Workers/{PrimitivePipeline-a9b7aae0.js → PrimitivePipeline-0d7b5ed4.js} +1 -1
  32. package/Build/Workers/{RectangleGeometryLibrary-9aa6c8f6.js → RectangleGeometryLibrary-0768db63.js} +1 -1
  33. package/Build/Workers/{TerrainEncoding-b52dcfc5.js → TerrainEncoding-06470d7f.js} +1 -1
  34. package/Build/Workers/{Transforms-2f755df8.js → Transforms-26539bce.js} +97 -83
  35. package/Build/Workers/{WallGeometryLibrary-ab19a93d.js → WallGeometryLibrary-6167b0fc.js} +1 -1
  36. package/Build/Workers/{WebMercatorProjection-9f25de49.js → WebMercatorProjection-13a90d41.js} +1 -1
  37. package/Build/Workers/cesiumWorkerBootstrapper.js +25 -1
  38. package/Build/Workers/combineGeometry.js +1 -1
  39. package/Build/Workers/createBoxGeometry.js +1 -1
  40. package/Build/Workers/createBoxOutlineGeometry.js +1 -1
  41. package/Build/Workers/createCircleGeometry.js +1 -1
  42. package/Build/Workers/createCircleOutlineGeometry.js +1 -1
  43. package/Build/Workers/createCoplanarPolygonGeometry.js +1 -1
  44. package/Build/Workers/createCoplanarPolygonOutlineGeometry.js +1 -1
  45. package/Build/Workers/createCorridorGeometry.js +1 -1
  46. package/Build/Workers/createCorridorOutlineGeometry.js +1 -1
  47. package/Build/Workers/createCylinderGeometry.js +1 -1
  48. package/Build/Workers/createCylinderOutlineGeometry.js +1 -1
  49. package/Build/Workers/createEllipseGeometry.js +1 -1
  50. package/Build/Workers/createEllipseOutlineGeometry.js +1 -1
  51. package/Build/Workers/createEllipsoidGeometry.js +1 -1
  52. package/Build/Workers/createEllipsoidOutlineGeometry.js +1 -1
  53. package/Build/Workers/createFrustumGeometry.js +1 -1
  54. package/Build/Workers/createFrustumOutlineGeometry.js +1 -1
  55. package/Build/Workers/createGeometry.js +1 -1
  56. package/Build/Workers/createGroundPolylineGeometry.js +1 -1
  57. package/Build/Workers/createPlaneGeometry.js +1 -1
  58. package/Build/Workers/createPlaneOutlineGeometry.js +1 -1
  59. package/Build/Workers/createPolygonGeometry.js +1 -1
  60. package/Build/Workers/createPolygonOutlineGeometry.js +1 -1
  61. package/Build/Workers/createPolylineGeometry.js +1 -1
  62. package/Build/Workers/createPolylineVolumeGeometry.js +1 -1
  63. package/Build/Workers/createPolylineVolumeOutlineGeometry.js +1 -1
  64. package/Build/Workers/createRectangleGeometry.js +1 -1
  65. package/Build/Workers/createRectangleOutlineGeometry.js +1 -1
  66. package/Build/Workers/createSimplePolylineGeometry.js +1 -1
  67. package/Build/Workers/createSphereGeometry.js +1 -1
  68. package/Build/Workers/createSphereOutlineGeometry.js +1 -1
  69. package/Build/Workers/createVectorTileClampedPolylines.js +1 -1
  70. package/Build/Workers/createVectorTileGeometries.js +1 -1
  71. package/Build/Workers/createVectorTilePoints.js +1 -1
  72. package/Build/Workers/createVectorTilePolygons.js +1 -1
  73. package/Build/Workers/createVectorTilePolylines.js +1 -1
  74. package/Build/Workers/createVerticesFromGoogleEarthEnterpriseBuffer.js +1 -1
  75. package/Build/Workers/createVerticesFromHeightmap.js +7 -3
  76. package/Build/Workers/createVerticesFromQuantizedTerrainMesh.js +1 -1
  77. package/Build/Workers/createWallGeometry.js +1 -1
  78. package/Build/Workers/createWallOutlineGeometry.js +1 -1
  79. package/Build/Workers/decodeI3S.js +1 -1
  80. package/Build/Workers/package.js +25 -1
  81. package/Build/Workers/transferTypedArrayTest.js +25 -1
  82. package/Build/Workers/upsampleQuantizedTerrainMesh.js +1 -1
  83. package/Source/Core/EarthOrientationParameters.js +67 -63
  84. package/Source/Core/Ion.js +1 -1
  85. package/Source/Core/Matrix2.js +2 -1
  86. package/Source/Core/Matrix3.js +2 -1
  87. package/Source/Core/Matrix4.js +1 -0
  88. package/Source/Core/OrientedBoundingBox.js +4 -4
  89. package/Source/Core/S2Cell.js +3 -3
  90. package/Source/Core/Transforms.js +3 -7
  91. package/Source/DataSources/GpxDataSource.js +4 -6
  92. package/Source/DataSources/KmlDataSource.js +3 -5
  93. package/Source/Renderer/Context.js +27 -9
  94. package/Source/Renderer/Pass.js +3 -2
  95. package/Source/Scene/Cesium3DTileContentType.js +19 -0
  96. package/Source/Scene/Cesium3DTilesVoxelProvider.js +482 -0
  97. package/Source/Scene/Cesium3DTilesetMetadata.js +2 -2
  98. package/Source/Scene/ContentMetadata.js +2 -2
  99. package/Source/Scene/DerivedCommand.js +7 -0
  100. package/Source/Scene/Expression.js +1 -1
  101. package/Source/Scene/Globe.js +10 -0
  102. package/Source/Scene/GlobeSurfaceTileProvider.js +7 -0
  103. package/Source/Scene/GltfImageLoader.js +1 -1
  104. package/Source/Scene/GltfVertexBufferLoader.js +10 -2
  105. package/Source/Scene/GroupMetadata.js +2 -2
  106. package/Source/Scene/ImplicitMetadataView.js +2 -2
  107. package/Source/Scene/ImplicitSubtreeCache.js +127 -0
  108. package/Source/Scene/ImplicitSubtreeMetadata.js +2 -2
  109. package/Source/Scene/ImplicitTileset.js +3 -2
  110. package/Source/Scene/KeyframeNode.js +47 -0
  111. package/Source/Scene/Megatexture.js +490 -0
  112. package/Source/Scene/MetadataClass.js +60 -25
  113. package/Source/Scene/MetadataClassProperty.js +132 -68
  114. package/Source/Scene/MetadataComponentType.js +78 -57
  115. package/Source/Scene/MetadataEnum.js +59 -23
  116. package/Source/Scene/MetadataEnumValue.js +49 -15
  117. package/Source/Scene/MetadataSchema.js +53 -24
  118. package/Source/Scene/MetadataSchemaLoader.js +2 -2
  119. package/Source/Scene/MetadataTableProperty.js +2 -2
  120. package/Source/Scene/MetadataType.js +6 -14
  121. package/Source/Scene/Model/GeoJsonLoader.js +1 -1
  122. package/Source/Scene/Model/Model.js +2 -3
  123. package/Source/Scene/Model/buildDrawCommand.js +19 -11
  124. package/Source/Scene/PointCloud.js +1 -1
  125. package/Source/Scene/PropertyAttribute.js +2 -2
  126. package/Source/Scene/PropertyAttributeProperty.js +2 -2
  127. package/Source/Scene/PropertyTable.js +2 -2
  128. package/Source/Scene/PropertyTexture.js +2 -2
  129. package/Source/Scene/PropertyTextureProperty.js +2 -2
  130. package/Source/Scene/ResourceCache.js +9 -1
  131. package/Source/Scene/ResourceCacheKey.js +9 -1
  132. package/Source/Scene/Scene.js +17 -0
  133. package/Source/Scene/SpatialNode.js +375 -0
  134. package/Source/Scene/StructuralMetadata.js +2 -2
  135. package/Source/Scene/TileMetadata.js +2 -2
  136. package/Source/Scene/TilesetMetadata.js +2 -2
  137. package/Source/Scene/VoxelBoxShape.js +527 -0
  138. package/Source/Scene/VoxelContent.js +169 -0
  139. package/Source/Scene/VoxelCylinderShape.js +937 -0
  140. package/Source/Scene/VoxelEllipsoidShape.js +937 -0
  141. package/Source/Scene/VoxelPrimitive.js +1919 -0
  142. package/Source/Scene/VoxelProvider.js +255 -0
  143. package/Source/Scene/VoxelRenderResources.js +224 -0
  144. package/Source/Scene/VoxelShape.js +152 -0
  145. package/Source/Scene/VoxelShapeType.js +105 -0
  146. package/Source/Scene/VoxelTraversal.js +1144 -0
  147. package/Source/Scene/buildVoxelDrawCommands.js +116 -0
  148. package/Source/Scene/parseBatchTable.js +18 -2
  149. package/Source/Scene/preprocess3DTileContent.js +8 -0
  150. package/Source/Scene/processVoxelProperties.js +455 -0
  151. package/Source/Shaders/BillboardCollectionVS.glsl +1 -1
  152. package/Source/Shaders/BillboardCollectionVS.js +1 -1
  153. package/Source/Shaders/Builtin/Constants/passOverlay.glsl +1 -1
  154. package/Source/Shaders/Builtin/Constants/passOverlay.js +1 -1
  155. package/Source/Shaders/Builtin/Constants/passVoxels.glsl +9 -0
  156. package/Source/Shaders/Builtin/Constants/passVoxels.js +11 -0
  157. package/Source/Shaders/Builtin/CzmBuiltins.js +17 -15
  158. package/Source/Shaders/Builtin/Functions/windowToEyeCoordinates.glsl +55 -43
  159. package/Source/Shaders/Builtin/Functions/windowToEyeCoordinates.js +55 -43
  160. package/Source/Shaders/GlobeFS.glsl +2 -1
  161. package/Source/Shaders/GlobeFS.js +2 -1
  162. package/Source/Shaders/PointPrimitiveCollectionVS.glsl +5 -2
  163. package/Source/Shaders/PointPrimitiveCollectionVS.js +5 -2
  164. package/Source/Shaders/Voxels/IntersectBox.glsl +79 -0
  165. package/Source/Shaders/Voxels/IntersectBox.js +81 -0
  166. package/Source/Shaders/Voxels/IntersectClippingPlanes.glsl +70 -0
  167. package/Source/Shaders/Voxels/IntersectClippingPlanes.js +72 -0
  168. package/Source/Shaders/Voxels/IntersectCylinder.glsl +273 -0
  169. package/Source/Shaders/Voxels/IntersectCylinder.js +275 -0
  170. package/Source/Shaders/Voxels/IntersectDepth.glsl +23 -0
  171. package/Source/Shaders/Voxels/IntersectDepth.js +25 -0
  172. package/Source/Shaders/Voxels/IntersectEllipsoid.glsl +337 -0
  173. package/Source/Shaders/Voxels/IntersectEllipsoid.js +339 -0
  174. package/Source/Shaders/Voxels/Intersection.glsl +54 -0
  175. package/Source/Shaders/Voxels/Intersection.js +56 -0
  176. package/Source/Shaders/Voxels/IntersectionUtils.glsl +151 -0
  177. package/Source/Shaders/Voxels/IntersectionUtils.js +153 -0
  178. package/Source/Shaders/Voxels/Megatexture.glsl +136 -0
  179. package/Source/Shaders/Voxels/Megatexture.js +138 -0
  180. package/Source/Shaders/Voxels/Octree.glsl +221 -0
  181. package/Source/Shaders/Voxels/Octree.js +223 -0
  182. package/Source/Shaders/Voxels/VoxelFS.glsl +150 -0
  183. package/Source/Shaders/Voxels/VoxelFS.js +152 -0
  184. package/Source/Shaders/Voxels/VoxelVS.glsl +11 -0
  185. package/Source/Shaders/Voxels/VoxelVS.js +13 -0
  186. package/Source/Shaders/Voxels/convertUvToBox.glsl +16 -0
  187. package/Source/Shaders/Voxels/convertUvToBox.js +18 -0
  188. package/Source/Shaders/Voxels/convertUvToCylinder.glsl +79 -0
  189. package/Source/Shaders/Voxels/convertUvToCylinder.js +81 -0
  190. package/Source/Shaders/Voxels/convertUvToEllipsoid.glsl +133 -0
  191. package/Source/Shaders/Voxels/convertUvToEllipsoid.js +135 -0
  192. package/Source/ThirdParty/Workers/z-worker-pako.js +0 -0
  193. package/index.d.ts +3124 -2287
  194. package/index.js +1117 -1085
  195. package/package.json +3 -4
  196. package/Build/Workers/PolygonPipeline-774a8aaf.js +0 -1341
@@ -0,0 +1,375 @@
1
+ import binarySearch from "../Core/binarySearch.js";
2
+ import Cartesian3 from "../Core/Cartesian3.js";
3
+ import CesiumMath from "../Core/Math.js";
4
+ import defined from "../Core/defined.js";
5
+ import DeveloperError from "../Core/DeveloperError.js";
6
+ import KeyframeNode from "./KeyframeNode.js";
7
+ import Matrix3 from "../Core/Matrix3.js";
8
+ import OrientedBoundingBox from "../Core/OrientedBoundingBox.js";
9
+
10
+ /**
11
+ * @alias SpatialNode
12
+ * @constructor
13
+ *
14
+ * @param {Number} level
15
+ * @param {Number} x
16
+ * @param {Number} y
17
+ * @param {Number} z
18
+ * @param {SpatialNode} parent
19
+ * @param {VoxelShapeType} shape
20
+ * @param {Cartesian3} voxelDimensions
21
+ *
22
+ * @private
23
+ */
24
+ function SpatialNode(level, x, y, z, parent, shape, voxelDimensions) {
25
+ /**
26
+ * @ignore
27
+ * @type {SpatialNode[]}
28
+ */
29
+ this.children = undefined;
30
+ this.parent = parent;
31
+
32
+ this.level = level;
33
+ this.x = x;
34
+ this.y = y;
35
+ this.z = z;
36
+
37
+ /**
38
+ * @ignore
39
+ * @type {KeyframeNode[]}
40
+ */
41
+ this.keyframeNodes = [];
42
+ /**
43
+ * @ignore
44
+ * @type {KeyframeNode[]}
45
+ */
46
+ this.renderableKeyframeNodes = [];
47
+
48
+ this.renderableKeyframeNodeLerp = 0.0;
49
+ /**
50
+ * @ignore
51
+ * @type {KeyframeNode}
52
+ */
53
+ this.renderableKeyframeNodePrevious = undefined;
54
+ /**
55
+ * @ignore
56
+ * @type {KeyframeNode}
57
+ */
58
+ this.renderableKeyframeNodeNext = undefined;
59
+
60
+ this.orientedBoundingBox = new OrientedBoundingBox();
61
+ this.approximateVoxelSize = 0.0;
62
+ this.screenSpaceError = 0.0;
63
+ this.visitedFrameNumber = -1;
64
+
65
+ this.computeBoundingVolumes(shape, voxelDimensions);
66
+ }
67
+
68
+ /**
69
+ * @param {SpatialNode} a
70
+ * @param {SpatialNode} b
71
+ * @returns {Boolean}
72
+ */
73
+ SpatialNode.spatialComparator = function (a, b) {
74
+ // The higher of the two screen space errors is prioritized
75
+ return b.screenSpaceError - a.screenSpaceError;
76
+ };
77
+
78
+ const scratchObbHalfScale = new Cartesian3();
79
+
80
+ /**
81
+ * @param {VoxelShape} shape
82
+ * @param {Cartesian3} voxelDimensions
83
+ */
84
+ SpatialNode.prototype.computeBoundingVolumes = function (
85
+ shape,
86
+ voxelDimensions
87
+ ) {
88
+ this.orientedBoundingBox = shape.computeOrientedBoundingBoxForTile(
89
+ this.level,
90
+ this.x,
91
+ this.y,
92
+ this.z,
93
+ this.orientedBoundingBox
94
+ );
95
+
96
+ const halfScale = Matrix3.getScale(
97
+ this.orientedBoundingBox.halfAxes,
98
+ scratchObbHalfScale
99
+ );
100
+ const maximumScale = 2.0 * Cartesian3.maximumComponent(halfScale);
101
+ this.approximateVoxelSize =
102
+ maximumScale / Cartesian3.minimumComponent(voxelDimensions);
103
+ };
104
+
105
+ /**
106
+ * @param {FrameState} frameState
107
+ * @param {Number} visibilityPlaneMask
108
+ * @returns {Number} A plane mask as described in {@link CullingVolume#computeVisibilityWithPlaneMask}.
109
+ */
110
+ SpatialNode.prototype.visibility = function (frameState, visibilityPlaneMask) {
111
+ const obb = this.orientedBoundingBox;
112
+ const cullingVolume = frameState.cullingVolume;
113
+ return cullingVolume.computeVisibilityWithPlaneMask(obb, visibilityPlaneMask);
114
+ };
115
+
116
+ /**
117
+ * @param {Cartesian3} cameraPosition
118
+ * @param {Number} screenSpaceErrorMultiplier
119
+ */
120
+ SpatialNode.prototype.computeScreenSpaceError = function (
121
+ cameraPosition,
122
+ screenSpaceErrorMultiplier
123
+ ) {
124
+ const obb = this.orientedBoundingBox;
125
+
126
+ let distance = Math.sqrt(obb.distanceSquaredTo(cameraPosition));
127
+ // Avoid divide-by-zero when viewer is inside the tile.
128
+ distance = Math.max(distance, CesiumMath.EPSILON7);
129
+ const approximateVoxelSize = this.approximateVoxelSize;
130
+ const error = screenSpaceErrorMultiplier * (approximateVoxelSize / distance);
131
+ this.screenSpaceError = error;
132
+ };
133
+
134
+ // This object imitates a KeyframeNode. Only used for binary search function.
135
+ const scratchBinarySearchKeyframeNode = {
136
+ keyframe: 0,
137
+ };
138
+
139
+ /**
140
+ * Find the index of a given key frame position within an array of KeyframeNodes,
141
+ * or the complement (~) of the index where it would be in the sorted array.
142
+ * @param {Number} keyframe
143
+ * @param {KeyframeNode[]} keyframeNodes
144
+ * @returns {Number}
145
+ * @private
146
+ */
147
+ function findKeyframeIndex(keyframe, keyframeNodes) {
148
+ scratchBinarySearchKeyframeNode.keyframe = keyframe;
149
+ return binarySearch(
150
+ keyframeNodes,
151
+ scratchBinarySearchKeyframeNode,
152
+ KeyframeNode.searchComparator
153
+ );
154
+ }
155
+
156
+ /**
157
+ * Computes the most suitable keyframes for rendering, balancing between temporal and visual quality.
158
+ *
159
+ * @param {Number} keyframeLocation
160
+ */
161
+ SpatialNode.prototype.computeSurroundingRenderableKeyframeNodes = function (
162
+ keyframeLocation
163
+ ) {
164
+ let spatialNode = this;
165
+ const startLevel = spatialNode.level;
166
+
167
+ const targetKeyframePrev = Math.floor(keyframeLocation);
168
+ const targetKeyframeNext = Math.ceil(keyframeLocation);
169
+
170
+ let bestKeyframeNodePrev;
171
+ let bestKeyframeNodeNext;
172
+ let minimumDistancePrev = +Number.MAX_VALUE;
173
+ let minimumDistanceNext = +Number.MAX_VALUE;
174
+
175
+ while (defined(spatialNode)) {
176
+ const renderableKeyframeNodes = spatialNode.renderableKeyframeNodes;
177
+
178
+ if (renderableKeyframeNodes.length >= 1) {
179
+ let keyframeNodeIndexPrev = findKeyframeIndex(
180
+ targetKeyframePrev,
181
+ renderableKeyframeNodes
182
+ );
183
+ if (keyframeNodeIndexPrev < 0) {
184
+ keyframeNodeIndexPrev = CesiumMath.clamp(
185
+ ~keyframeNodeIndexPrev - 1,
186
+ 0,
187
+ renderableKeyframeNodes.length - 1
188
+ );
189
+ }
190
+ const keyframeNodePrev = renderableKeyframeNodes[keyframeNodeIndexPrev];
191
+ const keyframePrev = keyframeNodePrev.keyframe;
192
+
193
+ let keyframeNodeNext;
194
+ if (
195
+ targetKeyframeNext === targetKeyframePrev ||
196
+ targetKeyframePrev < keyframePrev
197
+ ) {
198
+ keyframeNodeNext = keyframeNodePrev;
199
+ } else {
200
+ const keyframeNodeIndexNext = Math.min(
201
+ keyframeNodeIndexPrev + 1,
202
+ renderableKeyframeNodes.length - 1
203
+ );
204
+ keyframeNodeNext = renderableKeyframeNodes[keyframeNodeIndexNext];
205
+ }
206
+ const keyframeNext = keyframeNodeNext.keyframe;
207
+
208
+ const keyframeDistancePrev = targetKeyframePrev - keyframePrev;
209
+ const keyframeDistanceNext = keyframeNext - targetKeyframeNext;
210
+ const levelDistance = startLevel - spatialNode.level;
211
+
212
+ // Balance temporal and visual quality
213
+ const levelWeight = Math.exp(levelDistance * 4.0);
214
+ const normalKeyframeWeight = 1.0;
215
+ const reverseKeyframeWeight = 200.0; // Keyframes on the opposite of the desired direction are deprioritized.
216
+ const distancePrev =
217
+ levelDistance * levelWeight +
218
+ (keyframeDistancePrev >= 0
219
+ ? keyframeDistancePrev * normalKeyframeWeight
220
+ : -keyframeDistancePrev * reverseKeyframeWeight);
221
+ const distanceNext =
222
+ levelDistance * levelWeight +
223
+ (keyframeDistanceNext >= 0
224
+ ? keyframeDistanceNext * normalKeyframeWeight
225
+ : -keyframeDistanceNext * reverseKeyframeWeight);
226
+
227
+ if (distancePrev < minimumDistancePrev) {
228
+ minimumDistancePrev = distancePrev;
229
+ bestKeyframeNodePrev = keyframeNodePrev;
230
+ }
231
+ if (distanceNext < minimumDistanceNext) {
232
+ minimumDistanceNext = distanceNext;
233
+ bestKeyframeNodeNext = keyframeNodeNext;
234
+ }
235
+ if (keyframeDistancePrev === 0 && keyframeDistanceNext === 0) {
236
+ // Nothing higher up will be better, so break early.
237
+ break;
238
+ }
239
+ }
240
+
241
+ spatialNode = spatialNode.parent;
242
+ }
243
+
244
+ this.renderableKeyframeNodePrevious = bestKeyframeNodePrev;
245
+ this.renderableKeyframeNodeNext = bestKeyframeNodeNext;
246
+ if (defined(bestKeyframeNodePrev) && defined(bestKeyframeNodeNext)) {
247
+ const bestKeyframePrev = bestKeyframeNodePrev.keyframe;
248
+ const bestKeyframeNext = bestKeyframeNodeNext.keyframe;
249
+ this.renderableKeyframeNodeLerp =
250
+ bestKeyframePrev === bestKeyframeNext
251
+ ? 0.0
252
+ : CesiumMath.clamp(
253
+ (keyframeLocation - bestKeyframePrev) /
254
+ (bestKeyframeNext - bestKeyframePrev),
255
+ 0.0,
256
+ 1.0
257
+ );
258
+ }
259
+ };
260
+
261
+ /**
262
+ * @param {Number} frameNumber
263
+ * @returns {Boolean}
264
+ */
265
+ SpatialNode.prototype.isVisited = function (frameNumber) {
266
+ return this.visitedFrameNumber === frameNumber;
267
+ };
268
+
269
+ /**
270
+ * @param {Number} keyframe
271
+ */
272
+ SpatialNode.prototype.createKeyframeNode = function (keyframe) {
273
+ let index = findKeyframeIndex(keyframe, this.keyframeNodes);
274
+ if (index < 0) {
275
+ index = ~index; // convert to insertion index
276
+ const keyframeNode = new KeyframeNode(this, keyframe);
277
+ this.keyframeNodes.splice(index, 0, keyframeNode);
278
+ }
279
+ };
280
+
281
+ /**
282
+ * @param {KeyframeNode} keyframeNode
283
+ * @param {Megatexture[]} megatextures
284
+ */
285
+ SpatialNode.prototype.destroyKeyframeNode = function (
286
+ keyframeNode,
287
+ megatextures
288
+ ) {
289
+ const keyframe = keyframeNode.keyframe;
290
+ const keyframeIndex = findKeyframeIndex(keyframe, this.keyframeNodes);
291
+ if (keyframeIndex < 0) {
292
+ throw new DeveloperError("Keyframe node does not exist.");
293
+ }
294
+
295
+ this.keyframeNodes.splice(keyframeIndex, 1);
296
+
297
+ if (keyframeNode.megatextureIndex !== -1) {
298
+ for (let i = 0; i < megatextures.length; i++) {
299
+ megatextures[i].remove(keyframeNode.megatextureIndex);
300
+ }
301
+
302
+ const renderableKeyframeNodeIndex = findKeyframeIndex(
303
+ keyframe,
304
+ this.renderableKeyframeNodes
305
+ );
306
+ if (renderableKeyframeNodeIndex < 0) {
307
+ throw new DeveloperError("Renderable keyframe node does not exist.");
308
+ }
309
+
310
+ this.renderableKeyframeNodes.splice(renderableKeyframeNodeIndex, 1);
311
+ }
312
+
313
+ keyframeNode.spatialNode = undefined;
314
+ keyframeNode.state = KeyframeNode.LoadState.UNLOADED;
315
+ keyframeNode.metadatas = {};
316
+ keyframeNode.megatextureIndex = -1;
317
+ keyframeNode.priority = -Number.MAX_VALUE;
318
+ keyframeNode.highPriorityFrameNumber = -1;
319
+ };
320
+
321
+ /**
322
+ * @param {KeyframeNode} keyframeNode
323
+ * @param {Megatexture[]} megatextures
324
+ */
325
+ SpatialNode.prototype.addKeyframeNodeToMegatextures = function (
326
+ keyframeNode,
327
+ megatextures
328
+ ) {
329
+ if (
330
+ keyframeNode.state !== KeyframeNode.LoadState.RECEIVED ||
331
+ keyframeNode.megatextureIndex !== -1 ||
332
+ keyframeNode.metadatas.length !== megatextures.length
333
+ ) {
334
+ throw new DeveloperError("Keyframe node cannot be added to megatexture");
335
+ }
336
+
337
+ for (let i = 0; i < megatextures.length; i++) {
338
+ const megatexture = megatextures[i];
339
+ keyframeNode.megatextureIndex = megatexture.add(keyframeNode.metadatas[i]);
340
+ keyframeNode.metadatas[i] = undefined; // data is in megatexture so no need to hold onto it
341
+ }
342
+
343
+ keyframeNode.state = KeyframeNode.LoadState.LOADED;
344
+
345
+ const renderableKeyframeNodes = this.renderableKeyframeNodes;
346
+ let renderableKeyframeNodeIndex = findKeyframeIndex(
347
+ keyframeNode.keyframe,
348
+ renderableKeyframeNodes
349
+ );
350
+ if (renderableKeyframeNodeIndex >= 0) {
351
+ throw new DeveloperError("Keyframe already renderable");
352
+ }
353
+ renderableKeyframeNodeIndex = ~renderableKeyframeNodeIndex;
354
+ renderableKeyframeNodes.splice(renderableKeyframeNodeIndex, 0, keyframeNode);
355
+ };
356
+
357
+ /**
358
+ * @param {Number} frameNumber
359
+ * @returns Boolean
360
+ */
361
+ SpatialNode.prototype.isRenderable = function (frameNumber) {
362
+ const previousNode = this.renderableKeyframeNodePrevious;
363
+ const nextNode = this.renderableKeyframeNodeNext;
364
+ const level = this.level;
365
+
366
+ return (
367
+ defined(previousNode) &&
368
+ defined(nextNode) &&
369
+ (previousNode.spatialNode.level === level ||
370
+ nextNode.spatialNode.level === level) &&
371
+ this.visitedFrameNumber === frameNumber
372
+ );
373
+ };
374
+
375
+ export default SpatialNode;
@@ -76,7 +76,7 @@ Object.defineProperties(StructuralMetadata.prototype, {
76
76
  },
77
77
 
78
78
  /**
79
- * Extras in the JSON object.
79
+ * Extra user-defined properties.
80
80
  *
81
81
  * @memberof StructuralMetadata.prototype
82
82
  * @type {*}
@@ -90,7 +90,7 @@ Object.defineProperties(StructuralMetadata.prototype, {
90
90
  },
91
91
 
92
92
  /**
93
- * Extensions in the JSON object.
93
+ * An object containing extensions.
94
94
  *
95
95
  * @memberof StructuralMetadata.prototype
96
96
  * @type {Object}
@@ -50,7 +50,7 @@ Object.defineProperties(TileMetadata.prototype, {
50
50
  },
51
51
 
52
52
  /**
53
- * Extras in the JSON object.
53
+ * Extra user-defined properties.
54
54
  *
55
55
  * @memberof TileMetadata.prototype
56
56
  * @type {Object}
@@ -64,7 +64,7 @@ Object.defineProperties(TileMetadata.prototype, {
64
64
  },
65
65
 
66
66
  /**
67
- * Extensions in the JSON object.
67
+ * An object containing extensions.
68
68
  *
69
69
  * @memberof TileMetadata.prototype
70
70
  * @type {Object}
@@ -52,7 +52,7 @@ Object.defineProperties(TilesetMetadata.prototype, {
52
52
  },
53
53
 
54
54
  /**
55
- * Extras in the JSON object.
55
+ * Extra user-defined properties.
56
56
  *
57
57
  * @memberof TilesetMetadata.prototype
58
58
  * @type {*}
@@ -66,7 +66,7 @@ Object.defineProperties(TilesetMetadata.prototype, {
66
66
  },
67
67
 
68
68
  /**
69
- * Extensions in the JSON object.
69
+ * An object containing extensions.
70
70
  *
71
71
  * @memberof TilesetMetadata.prototype
72
72
  * @type {Object}