@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.
- package/Build/Workers/{AttributeCompression-4589338a.js → AttributeCompression-b646d393.js} +1 -1
- package/Build/Workers/{AxisAlignedBoundingBox-bfb1234f.js → AxisAlignedBoundingBox-a4321399.js} +1 -1
- package/Build/Workers/{BoundingRectangle-7ffc2153.js → BoundingRectangle-80d8801f.js} +1 -1
- package/Build/Workers/{BoxGeometry-93f344a3.js → BoxGeometry-33c10a4f.js} +1 -1
- package/Build/Workers/{Color-0c5aaf47.js → Color-1bf9a6e0.js} +1 -1
- package/Build/Workers/{CoplanarPolygonGeometryLibrary-6597982a.js → CoplanarPolygonGeometryLibrary-5c5b981b.js} +1 -1
- package/Build/Workers/{CorridorGeometryLibrary-2119580e.js → CorridorGeometryLibrary-7cbae7a0.js} +1 -1
- package/Build/Workers/{CylinderGeometry-f9503c6d.js → CylinderGeometry-42740df0.js} +1 -1
- package/Build/Workers/{EllipseGeometry-fedf72d5.js → EllipseGeometry-49a3ac21.js} +1 -1
- package/Build/Workers/{EllipseGeometryLibrary-4ea68687.js → EllipseGeometryLibrary-b891b2f8.js} +1 -1
- package/Build/Workers/{EllipseOutlineGeometry-e2ae6a35.js → EllipseOutlineGeometry-fbd72e07.js} +1 -1
- package/Build/Workers/{EllipsoidGeodesic-16de63ea.js → EllipsoidGeodesic-98c62a56.js} +1 -1
- package/Build/Workers/{EllipsoidGeometry-95c0330e.js → EllipsoidGeometry-a351dba8.js} +1 -1
- package/Build/Workers/{EllipsoidOutlineGeometry-d6d2ceec.js → EllipsoidOutlineGeometry-3e8779bf.js} +1 -1
- package/Build/Workers/{EllipsoidRhumbLine-ae5e65e0.js → EllipsoidRhumbLine-19756602.js} +1 -1
- package/Build/Workers/{EllipsoidTangentPlane-bfc674bf.js → EllipsoidTangentPlane-cfb50678.js} +1 -1
- package/Build/Workers/{EncodedCartesian3-f473ea18.js → EncodedCartesian3-81f70735.js} +1 -1
- package/Build/Workers/{FrustumGeometry-3bf2e4eb.js → FrustumGeometry-c5754412.js} +1 -1
- package/Build/Workers/{GeometryAttribute-df5f473e.js → GeometryAttribute-0bfd05e8.js} +1 -1
- package/Build/Workers/{GeometryInstance-aa75b4cf.js → GeometryInstance-451dc1cd.js} +1 -1
- package/Build/Workers/{GeometryPipeline-f0e46c42.js → GeometryPipeline-0166905d.js} +1 -1
- package/Build/Workers/{IntersectionTests-9de29d51.js → IntersectionTests-a93d3de9.js} +1 -1
- package/Build/Workers/{Matrix2-ce637455.js → Matrix2-13178034.js} +4 -2
- package/Build/Workers/{Matrix3-4f4df527.js → Matrix3-315394f6.js} +2 -1
- package/Build/Workers/{OrientedBoundingBox-d3ff3d4d.js → OrientedBoundingBox-b450cb61.js} +5 -5
- package/Build/Workers/{Plane-b81241c2.js → Plane-900aa728.js} +1 -1
- package/Build/Workers/{PolygonGeometryLibrary-6f4937bb.js → PolygonGeometryLibrary-f918ac26.js} +1 -1
- package/Build/Workers/PolygonPipeline-f59a8f0a.js +1345 -0
- package/Build/Workers/{PolylinePipeline-2e2b015c.js → PolylinePipeline-d8e6bd9b.js} +1 -1
- package/Build/Workers/{PolylineVolumeGeometryLibrary-7ee1d449.js → PolylineVolumeGeometryLibrary-125d2edf.js} +1 -1
- package/Build/Workers/{PrimitivePipeline-a9b7aae0.js → PrimitivePipeline-0d7b5ed4.js} +1 -1
- package/Build/Workers/{RectangleGeometryLibrary-9aa6c8f6.js → RectangleGeometryLibrary-0768db63.js} +1 -1
- package/Build/Workers/{TerrainEncoding-b52dcfc5.js → TerrainEncoding-06470d7f.js} +1 -1
- package/Build/Workers/{Transforms-2f755df8.js → Transforms-26539bce.js} +97 -83
- package/Build/Workers/{WallGeometryLibrary-ab19a93d.js → WallGeometryLibrary-6167b0fc.js} +1 -1
- package/Build/Workers/{WebMercatorProjection-9f25de49.js → WebMercatorProjection-13a90d41.js} +1 -1
- package/Build/Workers/cesiumWorkerBootstrapper.js +25 -1
- package/Build/Workers/combineGeometry.js +1 -1
- package/Build/Workers/createBoxGeometry.js +1 -1
- package/Build/Workers/createBoxOutlineGeometry.js +1 -1
- package/Build/Workers/createCircleGeometry.js +1 -1
- package/Build/Workers/createCircleOutlineGeometry.js +1 -1
- package/Build/Workers/createCoplanarPolygonGeometry.js +1 -1
- package/Build/Workers/createCoplanarPolygonOutlineGeometry.js +1 -1
- package/Build/Workers/createCorridorGeometry.js +1 -1
- package/Build/Workers/createCorridorOutlineGeometry.js +1 -1
- package/Build/Workers/createCylinderGeometry.js +1 -1
- package/Build/Workers/createCylinderOutlineGeometry.js +1 -1
- package/Build/Workers/createEllipseGeometry.js +1 -1
- package/Build/Workers/createEllipseOutlineGeometry.js +1 -1
- package/Build/Workers/createEllipsoidGeometry.js +1 -1
- package/Build/Workers/createEllipsoidOutlineGeometry.js +1 -1
- package/Build/Workers/createFrustumGeometry.js +1 -1
- package/Build/Workers/createFrustumOutlineGeometry.js +1 -1
- package/Build/Workers/createGeometry.js +1 -1
- package/Build/Workers/createGroundPolylineGeometry.js +1 -1
- package/Build/Workers/createPlaneGeometry.js +1 -1
- package/Build/Workers/createPlaneOutlineGeometry.js +1 -1
- package/Build/Workers/createPolygonGeometry.js +1 -1
- package/Build/Workers/createPolygonOutlineGeometry.js +1 -1
- package/Build/Workers/createPolylineGeometry.js +1 -1
- package/Build/Workers/createPolylineVolumeGeometry.js +1 -1
- package/Build/Workers/createPolylineVolumeOutlineGeometry.js +1 -1
- package/Build/Workers/createRectangleGeometry.js +1 -1
- package/Build/Workers/createRectangleOutlineGeometry.js +1 -1
- package/Build/Workers/createSimplePolylineGeometry.js +1 -1
- package/Build/Workers/createSphereGeometry.js +1 -1
- package/Build/Workers/createSphereOutlineGeometry.js +1 -1
- package/Build/Workers/createVectorTileClampedPolylines.js +1 -1
- package/Build/Workers/createVectorTileGeometries.js +1 -1
- package/Build/Workers/createVectorTilePoints.js +1 -1
- package/Build/Workers/createVectorTilePolygons.js +1 -1
- package/Build/Workers/createVectorTilePolylines.js +1 -1
- package/Build/Workers/createVerticesFromGoogleEarthEnterpriseBuffer.js +1 -1
- package/Build/Workers/createVerticesFromHeightmap.js +7 -3
- package/Build/Workers/createVerticesFromQuantizedTerrainMesh.js +1 -1
- package/Build/Workers/createWallGeometry.js +1 -1
- package/Build/Workers/createWallOutlineGeometry.js +1 -1
- package/Build/Workers/decodeI3S.js +1 -1
- package/Build/Workers/package.js +25 -1
- package/Build/Workers/transferTypedArrayTest.js +25 -1
- package/Build/Workers/upsampleQuantizedTerrainMesh.js +1 -1
- package/Source/Core/EarthOrientationParameters.js +67 -63
- package/Source/Core/Ion.js +1 -1
- package/Source/Core/Matrix2.js +2 -1
- package/Source/Core/Matrix3.js +2 -1
- package/Source/Core/Matrix4.js +1 -0
- package/Source/Core/OrientedBoundingBox.js +4 -4
- package/Source/Core/S2Cell.js +3 -3
- package/Source/Core/Transforms.js +3 -7
- package/Source/DataSources/GpxDataSource.js +4 -6
- package/Source/DataSources/KmlDataSource.js +3 -5
- package/Source/Renderer/Context.js +27 -9
- package/Source/Renderer/Pass.js +3 -2
- package/Source/Scene/Cesium3DTileContentType.js +19 -0
- package/Source/Scene/Cesium3DTilesVoxelProvider.js +482 -0
- package/Source/Scene/Cesium3DTilesetMetadata.js +2 -2
- package/Source/Scene/ContentMetadata.js +2 -2
- package/Source/Scene/DerivedCommand.js +7 -0
- package/Source/Scene/Expression.js +1 -1
- package/Source/Scene/Globe.js +10 -0
- package/Source/Scene/GlobeSurfaceTileProvider.js +7 -0
- package/Source/Scene/GltfImageLoader.js +1 -1
- package/Source/Scene/GltfVertexBufferLoader.js +10 -2
- package/Source/Scene/GroupMetadata.js +2 -2
- package/Source/Scene/ImplicitMetadataView.js +2 -2
- package/Source/Scene/ImplicitSubtreeCache.js +127 -0
- package/Source/Scene/ImplicitSubtreeMetadata.js +2 -2
- package/Source/Scene/ImplicitTileset.js +3 -2
- package/Source/Scene/KeyframeNode.js +47 -0
- package/Source/Scene/Megatexture.js +490 -0
- package/Source/Scene/MetadataClass.js +60 -25
- package/Source/Scene/MetadataClassProperty.js +132 -68
- package/Source/Scene/MetadataComponentType.js +78 -57
- package/Source/Scene/MetadataEnum.js +59 -23
- package/Source/Scene/MetadataEnumValue.js +49 -15
- package/Source/Scene/MetadataSchema.js +53 -24
- package/Source/Scene/MetadataSchemaLoader.js +2 -2
- package/Source/Scene/MetadataTableProperty.js +2 -2
- package/Source/Scene/MetadataType.js +6 -14
- package/Source/Scene/Model/GeoJsonLoader.js +1 -1
- package/Source/Scene/Model/Model.js +2 -3
- package/Source/Scene/Model/buildDrawCommand.js +19 -11
- package/Source/Scene/PointCloud.js +1 -1
- package/Source/Scene/PropertyAttribute.js +2 -2
- package/Source/Scene/PropertyAttributeProperty.js +2 -2
- package/Source/Scene/PropertyTable.js +2 -2
- package/Source/Scene/PropertyTexture.js +2 -2
- package/Source/Scene/PropertyTextureProperty.js +2 -2
- package/Source/Scene/ResourceCache.js +9 -1
- package/Source/Scene/ResourceCacheKey.js +9 -1
- package/Source/Scene/Scene.js +17 -0
- package/Source/Scene/SpatialNode.js +375 -0
- package/Source/Scene/StructuralMetadata.js +2 -2
- package/Source/Scene/TileMetadata.js +2 -2
- package/Source/Scene/TilesetMetadata.js +2 -2
- package/Source/Scene/VoxelBoxShape.js +527 -0
- package/Source/Scene/VoxelContent.js +169 -0
- package/Source/Scene/VoxelCylinderShape.js +937 -0
- package/Source/Scene/VoxelEllipsoidShape.js +937 -0
- package/Source/Scene/VoxelPrimitive.js +1919 -0
- package/Source/Scene/VoxelProvider.js +255 -0
- package/Source/Scene/VoxelRenderResources.js +224 -0
- package/Source/Scene/VoxelShape.js +152 -0
- package/Source/Scene/VoxelShapeType.js +105 -0
- package/Source/Scene/VoxelTraversal.js +1144 -0
- package/Source/Scene/buildVoxelDrawCommands.js +116 -0
- package/Source/Scene/parseBatchTable.js +18 -2
- package/Source/Scene/preprocess3DTileContent.js +8 -0
- package/Source/Scene/processVoxelProperties.js +455 -0
- package/Source/Shaders/BillboardCollectionVS.glsl +1 -1
- package/Source/Shaders/BillboardCollectionVS.js +1 -1
- package/Source/Shaders/Builtin/Constants/passOverlay.glsl +1 -1
- package/Source/Shaders/Builtin/Constants/passOverlay.js +1 -1
- package/Source/Shaders/Builtin/Constants/passVoxels.glsl +9 -0
- package/Source/Shaders/Builtin/Constants/passVoxels.js +11 -0
- package/Source/Shaders/Builtin/CzmBuiltins.js +17 -15
- package/Source/Shaders/Builtin/Functions/windowToEyeCoordinates.glsl +55 -43
- package/Source/Shaders/Builtin/Functions/windowToEyeCoordinates.js +55 -43
- package/Source/Shaders/GlobeFS.glsl +2 -1
- package/Source/Shaders/GlobeFS.js +2 -1
- package/Source/Shaders/PointPrimitiveCollectionVS.glsl +5 -2
- package/Source/Shaders/PointPrimitiveCollectionVS.js +5 -2
- package/Source/Shaders/Voxels/IntersectBox.glsl +79 -0
- package/Source/Shaders/Voxels/IntersectBox.js +81 -0
- package/Source/Shaders/Voxels/IntersectClippingPlanes.glsl +70 -0
- package/Source/Shaders/Voxels/IntersectClippingPlanes.js +72 -0
- package/Source/Shaders/Voxels/IntersectCylinder.glsl +273 -0
- package/Source/Shaders/Voxels/IntersectCylinder.js +275 -0
- package/Source/Shaders/Voxels/IntersectDepth.glsl +23 -0
- package/Source/Shaders/Voxels/IntersectDepth.js +25 -0
- package/Source/Shaders/Voxels/IntersectEllipsoid.glsl +337 -0
- package/Source/Shaders/Voxels/IntersectEllipsoid.js +339 -0
- package/Source/Shaders/Voxels/Intersection.glsl +54 -0
- package/Source/Shaders/Voxels/Intersection.js +56 -0
- package/Source/Shaders/Voxels/IntersectionUtils.glsl +151 -0
- package/Source/Shaders/Voxels/IntersectionUtils.js +153 -0
- package/Source/Shaders/Voxels/Megatexture.glsl +136 -0
- package/Source/Shaders/Voxels/Megatexture.js +138 -0
- package/Source/Shaders/Voxels/Octree.glsl +221 -0
- package/Source/Shaders/Voxels/Octree.js +223 -0
- package/Source/Shaders/Voxels/VoxelFS.glsl +150 -0
- package/Source/Shaders/Voxels/VoxelFS.js +152 -0
- package/Source/Shaders/Voxels/VoxelVS.glsl +11 -0
- package/Source/Shaders/Voxels/VoxelVS.js +13 -0
- package/Source/Shaders/Voxels/convertUvToBox.glsl +16 -0
- package/Source/Shaders/Voxels/convertUvToBox.js +18 -0
- package/Source/Shaders/Voxels/convertUvToCylinder.glsl +79 -0
- package/Source/Shaders/Voxels/convertUvToCylinder.js +81 -0
- package/Source/Shaders/Voxels/convertUvToEllipsoid.glsl +133 -0
- package/Source/Shaders/Voxels/convertUvToEllipsoid.js +135 -0
- package/Source/ThirdParty/Workers/z-worker-pako.js +0 -0
- package/index.d.ts +3124 -2287
- package/index.js +1117 -1085
- package/package.json +3 -4
- 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
|
-
*
|
|
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
|
-
*
|
|
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
|
-
*
|
|
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
|
-
*
|
|
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
|
-
*
|
|
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
|
-
*
|
|
69
|
+
* An object containing extensions.
|
|
70
70
|
*
|
|
71
71
|
* @memberof TilesetMetadata.prototype
|
|
72
72
|
* @type {Object}
|