@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.
- package/Build/Workers/{chunk-MY3VNFGQ.js → chunk-23UFSGND.js} +7 -7
- package/Build/Workers/{chunk-IQBYFRVW.js → chunk-2A75IWRS.js} +7 -7
- package/Build/Workers/{chunk-VRGFV2UO.js → chunk-2FRVPMCS.js} +10 -10
- package/Build/Workers/{chunk-46UD5ABS.js → chunk-2FWRMUTY.js} +4 -4
- package/Build/Workers/{chunk-DTAIXKTO.js → chunk-2UPKWTMJ.js} +6 -6
- package/Build/Workers/{chunk-6VJVYK2V.js → chunk-34FXV7D7.js} +2 -2
- package/Build/Workers/{chunk-ODW7WYM4.js → chunk-3VAZEH7M.js} +2 -2
- package/Build/Workers/{chunk-U2VCRRQW.js → chunk-4DO5W5XZ.js} +6 -6
- package/Build/Workers/{chunk-VK3EJHWI.js → chunk-4H7PY4U5.js} +2 -2
- package/Build/Workers/{chunk-RV7ZYPFT.js → chunk-5QULIR53.js} +4 -4
- package/Build/Workers/{chunk-JY5YEZFA.js → chunk-7TC63SJW.js} +8 -8
- package/Build/Workers/{chunk-JJ4VBOQ3.js → chunk-7ZFGPDJA.js} +4 -4
- package/Build/Workers/{chunk-FP6GYBFX.js → chunk-A5DWLWCY.js} +10 -10
- package/Build/Workers/{chunk-5M3U6ZMA.js → chunk-BBWDMCVU.js} +1 -1
- package/Build/Workers/{chunk-WZU2YLWG.js → chunk-BG4UCVXN.js} +3 -3
- package/Build/Workers/{chunk-5WQ523AW.js → chunk-BIKA3NRA.js} +5 -5
- package/Build/Workers/{chunk-PTQQUQC3.js → chunk-BROJAZRZ.js} +13 -13
- package/Build/Workers/{chunk-YUCVWAY6.js → chunk-DDUQAJ4P.js} +7 -7
- package/Build/Workers/{chunk-2HJWSU7B.js → chunk-EERJKOAF.js} +4 -4
- package/Build/Workers/{chunk-LZGHD6NY.js → chunk-EG6PTBY2.js} +15 -15
- package/Build/Workers/{chunk-IX2JCCNM.js → chunk-EHWHNOEX.js} +1 -1
- package/Build/Workers/{chunk-NKPBIX7F.js → chunk-F3YA3Y2Z.js} +1 -1
- package/Build/Workers/{chunk-L2ZN645J.js → chunk-F4HFJMGM.js} +6 -6
- package/Build/Workers/{chunk-F6SE42BK.js → chunk-FJKNFAKQ.js} +15 -472
- package/Build/Workers/{chunk-PNBGBETF.js → chunk-FNIRWHJB.js} +10 -10
- package/Build/Workers/{chunk-RAEV7K66.js → chunk-FZRIVR7Y.js} +5 -5
- package/Build/Workers/{chunk-AIPU2VSX.js → chunk-G43QFN4Q.js} +6 -6
- package/Build/Workers/{chunk-ZUA2UUNV.js → chunk-GATZHF3K.js} +2 -2
- package/Build/Workers/{chunk-ZK5JOS3D.js → chunk-GRC2ZTAF.js} +14 -14
- package/Build/Workers/{chunk-5YLJ77FF.js → chunk-HU6N6EXB.js} +10 -10
- package/Build/Workers/{chunk-4EBHOMFX.js → chunk-I46ZRR5W.js} +17 -17
- package/Build/Workers/{chunk-LZ7JIV3K.js → chunk-JURN7NPV.js} +17 -17
- package/Build/Workers/{chunk-JCNXK6EL.js → chunk-KKCR2YOP.js} +11 -11
- package/Build/Workers/{chunk-S6SKF6DT.js → chunk-LPR3YNP2.js} +5 -5
- package/Build/Workers/{chunk-UDO6BFSF.js → chunk-M7ERACJJ.js} +13 -13
- package/Build/Workers/{chunk-BZP4T2JJ.js → chunk-MDWEGWPA.js} +10 -10
- package/Build/Workers/{chunk-72SANQJV.js → chunk-OGXZVPPM.js} +9 -5
- package/Build/Workers/{chunk-AR5DNBJ4.js → chunk-PGSJK77E.js} +6 -6
- package/Build/Workers/{chunk-GEJTYLCO.js → chunk-PPH7OFP3.js} +5 -5
- package/Build/Workers/{chunk-OVLG3FRS.js → chunk-SH5USDPI.js} +6 -6
- package/Build/Workers/{chunk-6HZQPRUS.js → chunk-SOWMRMWA.js} +1 -1
- package/Build/Workers/{chunk-JXDC723O.js → chunk-STW2DGFI.js} +2 -2
- package/Build/Workers/{chunk-5HDYHG3F.js → chunk-T3XIFPYR.js} +13 -13
- package/Build/Workers/chunk-TTUZP4BO.js +501 -0
- package/Build/Workers/{chunk-7XEAYGZK.js → chunk-UEXTBDBE.js} +10 -10
- package/Build/Workers/{chunk-GV56Q4LU.js → chunk-VOXYEYJT.js} +11 -11
- package/Build/Workers/{chunk-NY3K4IM3.js → chunk-X4356LRH.js} +12 -12
- package/Build/Workers/{chunk-S4MAZ3SS.js → chunk-XGI5BXZY.js} +2 -2
- package/Build/Workers/{chunk-UAEW6HKG.js → chunk-Y2ME2IJV.js} +13 -13
- package/Build/Workers/{chunk-XWXM2O2R.js → chunk-Y5UQJLYE.js} +6 -6
- package/Build/Workers/{chunk-QZAD5O7I.js → chunk-YJEBABKH.js} +7 -7
- package/Build/Workers/{chunk-UGK3FCDY.js → chunk-YWTJ2B4B.js} +1 -1
- package/Build/Workers/{chunk-R5X4OQT4.js → chunk-Z3TIFFGF.js} +7 -7
- package/Build/Workers/{chunk-WBQCVXR3.js → chunk-ZT7KWISZ.js} +4 -4
- package/Build/Workers/combineGeometry.js +24 -23
- package/Build/Workers/createBoxGeometry.js +18 -17
- package/Build/Workers/createBoxOutlineGeometry.js +16 -15
- package/Build/Workers/createCircleGeometry.js +26 -25
- package/Build/Workers/createCircleOutlineGeometry.js +19 -18
- package/Build/Workers/createCoplanarPolygonGeometry.js +33 -32
- package/Build/Workers/createCoplanarPolygonOutlineGeometry.js +31 -30
- package/Build/Workers/createCorridorGeometry.js +29 -28
- package/Build/Workers/createCorridorOutlineGeometry.js +28 -27
- package/Build/Workers/createCylinderGeometry.js +20 -19
- package/Build/Workers/createCylinderOutlineGeometry.js +18 -17
- package/Build/Workers/createEllipseGeometry.js +26 -25
- package/Build/Workers/createEllipseOutlineGeometry.js +19 -18
- package/Build/Workers/createEllipsoidGeometry.js +19 -18
- package/Build/Workers/createEllipsoidOutlineGeometry.js +18 -17
- package/Build/Workers/createFrustumGeometry.js +18 -17
- package/Build/Workers/createFrustumOutlineGeometry.js +18 -17
- package/Build/Workers/createGeometry.js +54 -33
- package/Build/Workers/createGroundPolylineGeometry.js +22 -21
- package/Build/Workers/createPlaneGeometry.js +16 -15
- package/Build/Workers/createPlaneOutlineGeometry.js +15 -14
- package/Build/Workers/createPolygonGeometry.js +32 -31
- package/Build/Workers/createPolygonOutlineGeometry.js +30 -29
- package/Build/Workers/createPolylineGeometry.js +25 -24
- package/Build/Workers/createPolylineVolumeGeometry.js +31 -30
- package/Build/Workers/createPolylineVolumeOutlineGeometry.js +27 -26
- package/Build/Workers/createRectangleGeometry.js +27 -26
- package/Build/Workers/createRectangleOutlineGeometry.js +20 -19
- package/Build/Workers/createSimplePolylineGeometry.js +23 -22
- package/Build/Workers/createSphereGeometry.js +19 -18
- package/Build/Workers/createSphereOutlineGeometry.js +18 -17
- package/Build/Workers/createTaskProcessorWorker.js +3 -3
- package/Build/Workers/createVectorTileClampedPolylines.js +14 -14
- package/Build/Workers/createVectorTileGeometries.js +24 -23
- package/Build/Workers/createVectorTilePoints.js +12 -12
- package/Build/Workers/createVectorTilePolygons.js +22 -21
- package/Build/Workers/createVectorTilePolylines.js +14 -14
- package/Build/Workers/createVerticesFromGoogleEarthEnterpriseBuffer.js +22 -21
- package/Build/Workers/createVerticesFromHeightmap.js +22 -21
- package/Build/Workers/createVerticesFromQuantizedTerrainMesh.js +19 -18
- package/Build/Workers/createWallGeometry.js +24 -23
- package/Build/Workers/createWallOutlineGeometry.js +23 -22
- package/Build/Workers/decodeDraco.js +11 -11
- package/Build/Workers/decodeGoogleEarthEnterprisePacket.js +5 -5
- package/Build/Workers/decodeI3S.js +601 -92
- package/Build/Workers/transcodeKTX2.js +7 -7
- package/Build/Workers/transferTypedArrayTest.js +1 -1
- package/Build/Workers/upsampleQuantizedTerrainMesh.js +22 -21
- package/Source/Core/Ellipsoid.js +6 -0
- package/Source/Core/IntersectionTests.js +6 -3
- package/Source/Core/Ion.js +1 -1
- package/Source/Core/PixelFormat.js +5 -0
- package/Source/Core/Transforms.js +3 -0
- package/Source/Core/srgbToLinear.js +32 -0
- package/Source/DataSources/CzmlDataSource.js +51 -23
- package/Source/DataSources/DataSourceDisplay.js +27 -0
- package/Source/DataSources/Entity.js +20 -2
- package/Source/DataSources/GeometryUpdaterSet.js +114 -0
- package/Source/DataSources/GeometryVisualizer.js +19 -83
- package/Source/Renderer/Context.js +10 -0
- package/Source/Renderer/ContextLimits.js +2 -0
- package/Source/Renderer/demodernizeShader.js +4 -1
- package/Source/Scene/ArcGisMapService.js +1 -1
- package/Source/Scene/Axis.js +12 -7
- package/Source/Scene/Camera.js +46 -4
- package/Source/Scene/Cesium3DTileset.js +44 -6
- package/Source/Scene/Cesium3DTilesetBaseTraversal.js +2 -4
- package/Source/Scene/FrameState.js +5 -0
- package/Source/Scene/GlobeTranslucencyState.js +1 -1
- package/Source/Scene/GltfPipeline/updateVersion.js +69 -68
- package/Source/Scene/I3SDataProvider.js +270 -53
- package/Source/Scene/I3SDecoder.js +8 -1
- package/Source/Scene/I3SFeature.js +2 -5
- package/Source/Scene/I3SField.js +136 -31
- package/Source/Scene/I3SGeometry.js +70 -2
- package/Source/Scene/I3SLayer.js +55 -10
- package/Source/Scene/I3SNode.js +175 -18
- package/Source/Scene/I3SStatistics.js +94 -0
- package/Source/Scene/I3SSublayer.js +176 -0
- package/Source/Scene/I3SSymbology.js +337 -0
- package/Source/Scene/KeyframeNode.js +1 -1
- package/Source/Scene/Model/pickModel.js +25 -7
- package/Source/Scene/PickFramebuffer.js +37 -2
- package/Source/Scene/Picking.js +113 -39
- package/Source/Scene/Primitive.js +6 -2
- package/Source/Scene/Scene.js +126 -42
- package/Source/Scene/ScreenSpaceCameraController.js +21 -7
- package/Source/Scene/SensorVolumePortionToDisplay.js +69 -0
- package/Source/Scene/SpatialNode.js +12 -19
- package/Source/Scene/StructuralMetadata.js +1 -1
- package/Source/Scene/VoxelBoxShape.js +76 -0
- package/Source/Scene/VoxelCell.js +273 -0
- package/Source/Scene/VoxelCylinderShape.js +114 -43
- package/Source/Scene/VoxelEllipsoidShape.js +158 -116
- package/Source/Scene/VoxelPrimitive.js +3 -1
- package/Source/Scene/VoxelRenderResources.js +3 -0
- package/Source/Scene/VoxelShape.js +13 -0
- package/Source/Scene/VoxelTraversal.js +76 -54
- package/Source/Scene/buildVoxelDrawCommands.js +23 -0
- package/Source/Scene/createGooglePhotorealistic3DTileset.js +1 -0
- package/Source/Scene/processVoxelProperties.js +2 -0
- package/Source/Shaders/Voxels/IntersectCylinder.glsl +14 -111
- package/Source/Shaders/Voxels/IntersectCylinder.js +14 -111
- package/Source/Shaders/Voxels/IntersectEllipsoid.glsl +32 -113
- package/Source/Shaders/Voxels/IntersectEllipsoid.js +32 -113
- package/Source/Shaders/Voxels/IntersectLongitude.glsl +102 -0
- package/Source/Shaders/Voxels/IntersectLongitude.js +104 -0
- package/Source/Shaders/Voxels/VoxelFS.glsl +39 -1
- package/Source/Shaders/Voxels/VoxelFS.js +39 -1
- package/Source/Shaders/Voxels/convertUvToCylinder.glsl +19 -37
- package/Source/Shaders/Voxels/convertUvToCylinder.js +19 -37
- package/Source/Shaders/Voxels/convertUvToEllipsoid.glsl +24 -44
- package/Source/Shaders/Voxels/convertUvToEllipsoid.js +24 -44
- package/Source/Workers/createGeometry.js +40 -11
- package/Source/Workers/decodeI3S.js +720 -94
- package/index.d.ts +296 -11
- package/index.js +102 -94
- package/package.json +1 -1
|
@@ -8,6 +8,7 @@ import VoxelVS from "../Shaders/Voxels/VoxelVS.js";
|
|
|
8
8
|
import IntersectionUtils from "../Shaders/Voxels/IntersectionUtils.js";
|
|
9
9
|
import IntersectDepth from "../Shaders/Voxels/IntersectDepth.js";
|
|
10
10
|
import IntersectClippingPlanes from "../Shaders/Voxels/IntersectClippingPlanes.js";
|
|
11
|
+
import IntersectLongitude from "../Shaders/Voxels/IntersectLongitude.js";
|
|
11
12
|
import IntersectBox from "../Shaders/Voxels/IntersectBox.js";
|
|
12
13
|
import IntersectCylinder from "../Shaders/Voxels/IntersectCylinder.js";
|
|
13
14
|
import IntersectEllipsoid from "../Shaders/Voxels/IntersectEllipsoid.js";
|
|
@@ -131,12 +132,14 @@ function VoxelRenderResources(primitive) {
|
|
|
131
132
|
]);
|
|
132
133
|
} else if (shapeType === "CYLINDER") {
|
|
133
134
|
shaderBuilder.addFragmentLines([
|
|
135
|
+
IntersectLongitude,
|
|
134
136
|
IntersectCylinder,
|
|
135
137
|
Intersection,
|
|
136
138
|
convertUvToCylinder,
|
|
137
139
|
]);
|
|
138
140
|
} else if (shapeType === "ELLIPSOID") {
|
|
139
141
|
shaderBuilder.addFragmentLines([
|
|
142
|
+
IntersectLongitude,
|
|
140
143
|
IntersectEllipsoid,
|
|
141
144
|
Intersection,
|
|
142
145
|
convertUvToEllipsoid,
|
|
@@ -117,6 +117,19 @@ VoxelShape.prototype.update = DeveloperError.throwInstantiationError;
|
|
|
117
117
|
VoxelShape.prototype.computeOrientedBoundingBoxForTile =
|
|
118
118
|
DeveloperError.throwInstantiationError;
|
|
119
119
|
|
|
120
|
+
/**
|
|
121
|
+
* Computes an oriented bounding box for a specified sample within a specified tile.
|
|
122
|
+
* The update function must be called before calling this function.
|
|
123
|
+
*
|
|
124
|
+
* @param {SpatialNode} spatialNode The spatial node containing the sample
|
|
125
|
+
* @param {Cartesian3} tileDimensions The size of the tile in number of samples, before padding
|
|
126
|
+
* @param {Cartesian3} tileUv The sample coordinate within the tile
|
|
127
|
+
* @param {OrientedBoundingBox} result The oriented bounding box that will be set to enclose the specified sample
|
|
128
|
+
* @returns {OrientedBoundingBox} The oriented bounding box.
|
|
129
|
+
*/
|
|
130
|
+
VoxelShape.prototype.computeOrientedBoundingBoxForSample =
|
|
131
|
+
DeveloperError.throwInstantiationError;
|
|
132
|
+
|
|
120
133
|
/**
|
|
121
134
|
* Computes an approximate step size for raymarching the root tile of a voxel grid.
|
|
122
135
|
* The update function must be called before calling this function.
|
|
@@ -49,16 +49,14 @@ function VoxelTraversal(
|
|
|
49
49
|
*/
|
|
50
50
|
this._primitive = primitive;
|
|
51
51
|
|
|
52
|
-
const length = types.length;
|
|
53
|
-
|
|
54
52
|
/**
|
|
55
53
|
* @type {Megatexture[]}
|
|
56
54
|
* @readonly
|
|
57
55
|
*/
|
|
58
|
-
this.megatextures = new Array(length);
|
|
56
|
+
this.megatextures = new Array(types.length);
|
|
59
57
|
|
|
60
58
|
// TODO make sure to split the maximumTextureMemoryByteLength across all the megatextures
|
|
61
|
-
for (let i = 0; i < length; i++) {
|
|
59
|
+
for (let i = 0; i < types.length; i++) {
|
|
62
60
|
const type = types[i];
|
|
63
61
|
const componentCount = MetadataType.getComponentCount(type);
|
|
64
62
|
const componentType = componentTypes[i];
|
|
@@ -218,6 +216,18 @@ function VoxelTraversal(
|
|
|
218
216
|
this.leafNodeTexelSizeUv = new Cartesian2();
|
|
219
217
|
}
|
|
220
218
|
|
|
219
|
+
/**
|
|
220
|
+
* Finds a keyframe node in the traversal
|
|
221
|
+
*
|
|
222
|
+
* @param {number} megatextureIndex
|
|
223
|
+
* @returns {KeyframeNode}
|
|
224
|
+
*/
|
|
225
|
+
VoxelTraversal.prototype.findKeyframeNode = function (megatextureIndex) {
|
|
226
|
+
return this._keyframeNodesInMegatexture.find(function (keyframeNode) {
|
|
227
|
+
return keyframeNode.megatextureIndex === megatextureIndex;
|
|
228
|
+
});
|
|
229
|
+
};
|
|
230
|
+
|
|
221
231
|
function binaryTreeWeightingRecursive(arr, start, end, depth) {
|
|
222
232
|
if (start > end) {
|
|
223
233
|
return;
|
|
@@ -382,10 +392,7 @@ VoxelTraversal.prototype.destroy = function () {
|
|
|
382
392
|
* @private
|
|
383
393
|
*/
|
|
384
394
|
function recomputeBoundingVolumesRecursive(that, node) {
|
|
385
|
-
|
|
386
|
-
const shape = primitive._shape;
|
|
387
|
-
const dimensions = primitive._provider.dimensions;
|
|
388
|
-
node.computeBoundingVolumes(shape, dimensions);
|
|
395
|
+
node.computeBoundingVolumes(that._primitive._shape);
|
|
389
396
|
if (defined(node.children)) {
|
|
390
397
|
for (let i = 0; i < 8; i++) {
|
|
391
398
|
const child = node.children[i];
|
|
@@ -410,12 +417,11 @@ function requestData(that, keyframeNode) {
|
|
|
410
417
|
return;
|
|
411
418
|
}
|
|
412
419
|
|
|
413
|
-
const
|
|
414
|
-
const provider = primitive._provider;
|
|
420
|
+
const provider = that._primitive._provider;
|
|
415
421
|
|
|
416
422
|
function postRequestSuccess(result) {
|
|
417
423
|
that._simultaneousRequestCount--;
|
|
418
|
-
const length =
|
|
424
|
+
const length = provider.types.length;
|
|
419
425
|
|
|
420
426
|
if (!defined(result)) {
|
|
421
427
|
keyframeNode.state = KeyframeNode.LoadState.UNAVAILABLE;
|
|
@@ -434,7 +440,7 @@ function requestData(that, keyframeNode) {
|
|
|
434
440
|
const data = result[i];
|
|
435
441
|
const expectedLength = tileVoxelCount * channelCount;
|
|
436
442
|
if (data.length === expectedLength) {
|
|
437
|
-
keyframeNode.
|
|
443
|
+
keyframeNode.metadata[i] = data;
|
|
438
444
|
// State is received only when all metadata requests have been received
|
|
439
445
|
keyframeNode.state = KeyframeNode.LoadState.RECEIVED;
|
|
440
446
|
} else {
|
|
@@ -492,42 +498,22 @@ function loadAndUnload(that, frameState) {
|
|
|
492
498
|
const frameNumber = that._frameNumber;
|
|
493
499
|
const primitive = that._primitive;
|
|
494
500
|
const shape = primitive._shape;
|
|
495
|
-
const { dimensions } = primitive;
|
|
496
501
|
const targetScreenSpaceError = primitive.screenSpaceError;
|
|
497
502
|
const priorityQueue = that._priorityQueue;
|
|
498
|
-
const keyframeLocation = that._keyframeLocation;
|
|
499
503
|
const keyframeCount = that._keyframeCount;
|
|
500
|
-
|
|
504
|
+
|
|
505
|
+
const previousKeyframe = CesiumMath.clamp(
|
|
506
|
+
Math.floor(that._keyframeLocation),
|
|
507
|
+
0,
|
|
508
|
+
keyframeCount - 2
|
|
509
|
+
);
|
|
510
|
+
const nextKeyframe = previousKeyframe + 1;
|
|
501
511
|
|
|
502
512
|
const { camera, context, pixelRatio } = frameState;
|
|
503
513
|
const { positionWC, frustum } = camera;
|
|
504
514
|
const screenHeight = context.drawingBufferHeight / pixelRatio;
|
|
505
515
|
const screenSpaceErrorMultiplier = screenHeight / frustum.sseDenominator;
|
|
506
516
|
|
|
507
|
-
function keyframePriority(previousKeyframe, keyframe, nextKeyframe) {
|
|
508
|
-
const keyframeDifference = Math.min(
|
|
509
|
-
Math.abs(keyframe - previousKeyframe),
|
|
510
|
-
Math.abs(keyframe - nextKeyframe)
|
|
511
|
-
);
|
|
512
|
-
const maxKeyframeDifference = Math.max(
|
|
513
|
-
previousKeyframe,
|
|
514
|
-
keyframeCount - nextKeyframe - 1,
|
|
515
|
-
1
|
|
516
|
-
);
|
|
517
|
-
const keyframeFactor = Math.pow(
|
|
518
|
-
1.0 - keyframeDifference / maxKeyframeDifference,
|
|
519
|
-
4.0
|
|
520
|
-
);
|
|
521
|
-
const binaryTreeFactor = Math.exp(
|
|
522
|
-
-that._binaryTreeKeyframeWeighting[keyframe]
|
|
523
|
-
);
|
|
524
|
-
return CesiumMath.lerp(
|
|
525
|
-
binaryTreeFactor,
|
|
526
|
-
keyframeFactor,
|
|
527
|
-
0.15 + 0.85 * keyframeFactor
|
|
528
|
-
);
|
|
529
|
-
}
|
|
530
|
-
|
|
531
517
|
/**
|
|
532
518
|
* @ignore
|
|
533
519
|
* @param {SpatialNode} spatialNode
|
|
@@ -545,13 +531,6 @@ function loadAndUnload(that, frameState) {
|
|
|
545
531
|
}
|
|
546
532
|
spatialNode.visitedFrameNumber = frameNumber;
|
|
547
533
|
|
|
548
|
-
const previousKeyframe = CesiumMath.clamp(
|
|
549
|
-
Math.floor(keyframeLocation),
|
|
550
|
-
0,
|
|
551
|
-
keyframeCount - 2
|
|
552
|
-
);
|
|
553
|
-
const nextKeyframe = previousKeyframe + 1;
|
|
554
|
-
|
|
555
534
|
// Create keyframe nodes at the playhead.
|
|
556
535
|
// If they already exist, nothing will be created.
|
|
557
536
|
if (keyframeCount === 1) {
|
|
@@ -561,16 +540,21 @@ function loadAndUnload(that, frameState) {
|
|
|
561
540
|
spatialNode.createKeyframeNode(k);
|
|
562
541
|
}
|
|
563
542
|
}
|
|
564
|
-
const
|
|
543
|
+
const { screenSpaceError, keyframeNodes } = spatialNode;
|
|
544
|
+
const ssePriority = mapInfiniteRangeToZeroOne(screenSpaceError);
|
|
565
545
|
|
|
566
546
|
let hasLoadedKeyframe = false;
|
|
567
|
-
const keyframeNodes = spatialNode.keyframeNodes;
|
|
568
547
|
for (let i = 0; i < keyframeNodes.length; i++) {
|
|
569
548
|
const keyframeNode = keyframeNodes[i];
|
|
570
549
|
|
|
571
550
|
keyframeNode.priority =
|
|
572
551
|
10.0 * ssePriority +
|
|
573
|
-
keyframePriority(
|
|
552
|
+
keyframePriority(
|
|
553
|
+
previousKeyframe,
|
|
554
|
+
keyframeNode.keyframe,
|
|
555
|
+
nextKeyframe,
|
|
556
|
+
that
|
|
557
|
+
);
|
|
574
558
|
|
|
575
559
|
if (
|
|
576
560
|
keyframeNode.state !== KeyframeNode.LoadState.UNAVAILABLE &&
|
|
@@ -584,16 +568,14 @@ function loadAndUnload(that, frameState) {
|
|
|
584
568
|
}
|
|
585
569
|
}
|
|
586
570
|
|
|
587
|
-
|
|
588
|
-
spatialNode.screenSpaceError < targetScreenSpaceError;
|
|
589
|
-
if (meetsScreenSpaceError || !hasLoadedKeyframe) {
|
|
571
|
+
if (screenSpaceError < targetScreenSpaceError || !hasLoadedKeyframe) {
|
|
590
572
|
// Free up memory
|
|
591
573
|
spatialNode.children = undefined;
|
|
592
574
|
return;
|
|
593
575
|
}
|
|
594
576
|
|
|
595
577
|
if (!defined(spatialNode.children)) {
|
|
596
|
-
spatialNode.constructChildNodes(shape
|
|
578
|
+
spatialNode.constructChildNodes(shape);
|
|
597
579
|
}
|
|
598
580
|
for (let childIndex = 0; childIndex < 8; childIndex++) {
|
|
599
581
|
const child = spatialNode.children[childIndex];
|
|
@@ -601,9 +583,11 @@ function loadAndUnload(that, frameState) {
|
|
|
601
583
|
}
|
|
602
584
|
}
|
|
603
585
|
|
|
586
|
+
// Add all the nodes to the queue, to sort them by priority.
|
|
604
587
|
priorityQueue.reset();
|
|
605
|
-
addToQueueRecursive(rootNode, CullingVolume.MASK_INDETERMINATE);
|
|
588
|
+
addToQueueRecursive(that.rootNode, CullingVolume.MASK_INDETERMINATE);
|
|
606
589
|
|
|
590
|
+
// Move the nodes from the queue to array of high priority nodes.
|
|
607
591
|
const highPriorityKeyframeNodes = that._highPriorityKeyframeNodes;
|
|
608
592
|
let highPriorityKeyframeNodeCount = 0;
|
|
609
593
|
let highPriorityKeyframeNode;
|
|
@@ -616,6 +600,8 @@ function loadAndUnload(that, frameState) {
|
|
|
616
600
|
highPriorityKeyframeNodeCount++;
|
|
617
601
|
}
|
|
618
602
|
|
|
603
|
+
// Sort the list of keyframe nodes in the megatexture by priority, so
|
|
604
|
+
// we can remove the lowest priority nodes if we need space.
|
|
619
605
|
const keyframeNodesInMegatexture = that._keyframeNodesInMegatexture;
|
|
620
606
|
// TODO: some of the megatexture state should be stored once, not duplicate for each megatexture
|
|
621
607
|
const megatexture = that.megatextures[0];
|
|
@@ -628,6 +614,8 @@ function loadAndUnload(that, frameState) {
|
|
|
628
614
|
return b.highPriorityFrameNumber - a.highPriorityFrameNumber;
|
|
629
615
|
});
|
|
630
616
|
|
|
617
|
+
// Add the high priority nodes to the megatexture,
|
|
618
|
+
// removing existing lower-priority nodes if necessary.
|
|
631
619
|
let destroyedCount = 0;
|
|
632
620
|
let addedCount = 0;
|
|
633
621
|
|
|
@@ -675,6 +663,40 @@ function loadAndUnload(that, frameState) {
|
|
|
675
663
|
}
|
|
676
664
|
}
|
|
677
665
|
|
|
666
|
+
/**
|
|
667
|
+
* Compute a priority for a keyframe node.
|
|
668
|
+
*
|
|
669
|
+
* @private
|
|
670
|
+
* @param {number} previousKeyframe
|
|
671
|
+
* @param {number} keyframe
|
|
672
|
+
* @param {number} nextKeyframe
|
|
673
|
+
* @param {VoxelTraversal} traversal
|
|
674
|
+
* @returns {number} The computed priority
|
|
675
|
+
*/
|
|
676
|
+
function keyframePriority(previousKeyframe, keyframe, nextKeyframe, traversal) {
|
|
677
|
+
const keyframeDifference = Math.min(
|
|
678
|
+
Math.abs(keyframe - previousKeyframe),
|
|
679
|
+
Math.abs(keyframe - nextKeyframe)
|
|
680
|
+
);
|
|
681
|
+
const maxKeyframeDifference = Math.max(
|
|
682
|
+
previousKeyframe,
|
|
683
|
+
traversal._keyframeCount - nextKeyframe - 1,
|
|
684
|
+
1
|
|
685
|
+
);
|
|
686
|
+
const keyframeFactor = Math.pow(
|
|
687
|
+
1.0 - keyframeDifference / maxKeyframeDifference,
|
|
688
|
+
4.0
|
|
689
|
+
);
|
|
690
|
+
const binaryTreeFactor = Math.exp(
|
|
691
|
+
-traversal._binaryTreeKeyframeWeighting[keyframe]
|
|
692
|
+
);
|
|
693
|
+
return CesiumMath.lerp(
|
|
694
|
+
binaryTreeFactor,
|
|
695
|
+
keyframeFactor,
|
|
696
|
+
0.15 + 0.85 * keyframeFactor
|
|
697
|
+
);
|
|
698
|
+
}
|
|
699
|
+
|
|
678
700
|
/**
|
|
679
701
|
* @function
|
|
680
702
|
*
|
|
@@ -58,8 +58,17 @@ function buildVoxelDrawCommands(primitive, context) {
|
|
|
58
58
|
// Compile shaders
|
|
59
59
|
const shaderBuilderPick = shaderBuilder.clone();
|
|
60
60
|
shaderBuilderPick.addDefine("PICKING", undefined, ShaderDestination.FRAGMENT);
|
|
61
|
+
const shaderBuilderPickVoxel = shaderBuilder.clone();
|
|
62
|
+
shaderBuilderPickVoxel.addDefine(
|
|
63
|
+
"PICKING_VOXEL",
|
|
64
|
+
undefined,
|
|
65
|
+
ShaderDestination.FRAGMENT
|
|
66
|
+
);
|
|
61
67
|
const shaderProgram = shaderBuilder.buildShaderProgram(context);
|
|
62
68
|
const shaderProgramPick = shaderBuilderPick.buildShaderProgram(context);
|
|
69
|
+
const shaderProgramPickVoxel = shaderBuilderPickVoxel.buildShaderProgram(
|
|
70
|
+
context
|
|
71
|
+
);
|
|
63
72
|
const renderState = RenderState.fromCache({
|
|
64
73
|
cull: {
|
|
65
74
|
enabled: true,
|
|
@@ -98,6 +107,14 @@ function buildVoxelDrawCommands(primitive, context) {
|
|
|
98
107
|
drawCommandPick.shaderProgram = shaderProgramPick;
|
|
99
108
|
drawCommandPick.pickOnly = true;
|
|
100
109
|
|
|
110
|
+
// Create the pick voxels draw command
|
|
111
|
+
const drawCommandPickVoxel = DrawCommand.shallowClone(
|
|
112
|
+
drawCommand,
|
|
113
|
+
new DrawCommand()
|
|
114
|
+
);
|
|
115
|
+
drawCommandPickVoxel.shaderProgram = shaderProgramPickVoxel;
|
|
116
|
+
drawCommandPickVoxel.pickOnly = true;
|
|
117
|
+
|
|
101
118
|
// Delete the old shader programs
|
|
102
119
|
if (defined(primitive._drawCommand)) {
|
|
103
120
|
const command = primitive._drawCommand;
|
|
@@ -109,9 +126,15 @@ function buildVoxelDrawCommands(primitive, context) {
|
|
|
109
126
|
command.shaderProgram =
|
|
110
127
|
command.shaderProgram && command.shaderProgram.destroy();
|
|
111
128
|
}
|
|
129
|
+
if (defined(primitive._drawCommandPickVoxel)) {
|
|
130
|
+
const command = primitive._drawCommandPickVoxel;
|
|
131
|
+
command.shaderProgram =
|
|
132
|
+
command.shaderProgram && command.shaderProgram.destroy();
|
|
133
|
+
}
|
|
112
134
|
|
|
113
135
|
primitive._drawCommand = drawCommand;
|
|
114
136
|
primitive._drawCommandPick = drawCommandPick;
|
|
137
|
+
primitive._drawCommandPickVoxel = drawCommandPickVoxel;
|
|
115
138
|
}
|
|
116
139
|
|
|
117
140
|
export default buildVoxelDrawCommands;
|
|
@@ -46,6 +46,7 @@ async function createGooglePhotorealistic3DTileset(key, options) {
|
|
|
46
46
|
options.maximumCacheOverflowBytes,
|
|
47
47
|
1024 * 1024 * 1024
|
|
48
48
|
);
|
|
49
|
+
options.enableCollision = defaultValue(options.enableCollision, true);
|
|
49
50
|
|
|
50
51
|
key = defaultValue(key, GoogleMaps.defaultApiKey);
|
|
51
52
|
if (!defined(key)) {
|
|
@@ -153,6 +153,8 @@ function processVoxelProperties(renderResources, primitive) {
|
|
|
153
153
|
shaderBuilder.addStructField(voxelStructId, "vec3", "viewDirWorld");
|
|
154
154
|
shaderBuilder.addStructField(voxelStructId, "vec3", "surfaceNormal");
|
|
155
155
|
shaderBuilder.addStructField(voxelStructId, "float", "travelDistance");
|
|
156
|
+
shaderBuilder.addStructField(voxelStructId, "int", "tileIndex");
|
|
157
|
+
shaderBuilder.addStructField(voxelStructId, "int", "sampleIndex");
|
|
156
158
|
|
|
157
159
|
// FragmentInput struct
|
|
158
160
|
const fragmentInputStructId = "FragmentInput";
|
|
@@ -1,5 +1,7 @@
|
|
|
1
|
-
// See IntersectionUtils.glsl for the definitions of Ray,
|
|
2
|
-
// setIntersectionPair
|
|
1
|
+
// See IntersectionUtils.glsl for the definitions of Ray, NO_HIT,
|
|
2
|
+
// setIntersection, setIntersectionPair, setShapeIntersection
|
|
3
|
+
// See IntersectLongitude.glsl for the definitions of intersectHalfPlane,
|
|
4
|
+
// intersectFlippedWedge, intersectRegularWedge
|
|
3
5
|
|
|
4
6
|
/* Cylinder defines (set in Scene/VoxelCylinderShape.js)
|
|
5
7
|
#define CYLINDER_HAS_RENDER_BOUNDS_RADIUS_MIN
|
|
@@ -10,19 +12,8 @@
|
|
|
10
12
|
#define CYLINDER_HAS_RENDER_BOUNDS_ANGLE
|
|
11
13
|
#define CYLINDER_HAS_RENDER_BOUNDS_ANGLE_RANGE_UNDER_HALF
|
|
12
14
|
#define CYLINDER_HAS_RENDER_BOUNDS_ANGLE_RANGE_OVER_HALF
|
|
13
|
-
#define CYLINDER_HAS_RENDER_BOUNDS_ANGLE_RANGE_EQUAL_HALF
|
|
14
15
|
#define CYLINDER_HAS_RENDER_BOUNDS_ANGLE_RANGE_EQUAL_ZERO
|
|
15
16
|
|
|
16
|
-
#define CYLINDER_HAS_SHAPE_BOUNDS_RADIUS
|
|
17
|
-
#define CYLINDER_HAS_SHAPE_BOUNDS_RADIUS_FLAT
|
|
18
|
-
#define CYLINDER_HAS_SHAPE_BOUNDS_HEIGHT
|
|
19
|
-
#define CYLINDER_HAS_SHAPE_BOUNDS_HEIGHT_FLAT
|
|
20
|
-
#define CYLINDER_HAS_SHAPE_BOUNDS_ANGLE
|
|
21
|
-
#define CYLINDER_HAS_SHAPE_BOUNDS_ANGLE_RANGE_EQUAL_ZERO
|
|
22
|
-
#define CYLINDER_HAS_SHAPE_BOUNDS_ANGLE_MIN_DISCONTINUITY
|
|
23
|
-
#define CYLINDER_HAS_SHAPE_BOUNDS_ANGLE_MAX_DISCONTINUITY
|
|
24
|
-
#define CYLINDER_HAS_SHAPE_BOUNDS_ANGLE_MIN_MAX_REVERSED
|
|
25
|
-
|
|
26
17
|
#define CYLINDER_INTERSECTION_INDEX_RADIUS_MAX
|
|
27
18
|
#define CYLINDER_INTERSECTION_INDEX_RADIUS_MIN
|
|
28
19
|
#define CYLINDER_INTERSECTION_INDEX_ANGLE
|
|
@@ -40,93 +31,6 @@
|
|
|
40
31
|
uniform vec2 u_cylinderRenderAngleMinMax;
|
|
41
32
|
#endif
|
|
42
33
|
|
|
43
|
-
vec4 intersectHalfPlane(Ray ray, float angle) {
|
|
44
|
-
vec2 o = ray.pos.xy;
|
|
45
|
-
vec2 d = ray.dir.xy;
|
|
46
|
-
vec2 planeDirection = vec2(cos(angle), sin(angle));
|
|
47
|
-
vec2 planeNormal = vec2(planeDirection.y, -planeDirection.x);
|
|
48
|
-
|
|
49
|
-
float a = dot(o, planeNormal);
|
|
50
|
-
float b = dot(d, planeNormal);
|
|
51
|
-
float t = -a / b;
|
|
52
|
-
|
|
53
|
-
vec2 p = o + t * d;
|
|
54
|
-
bool outside = dot(p, planeDirection) < 0.0;
|
|
55
|
-
if (outside) return vec4(-INF_HIT, +INF_HIT, NO_HIT, NO_HIT);
|
|
56
|
-
|
|
57
|
-
return vec4(-INF_HIT, t, t, +INF_HIT);
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
#define POSITIVE_HIT vec2(t, +INF_HIT);
|
|
61
|
-
#define NEGATIVE_HIT vec2(-INF_HIT, t);
|
|
62
|
-
|
|
63
|
-
vec2 intersectHalfSpace(Ray ray, float angle)
|
|
64
|
-
{
|
|
65
|
-
vec2 o = ray.pos.xy;
|
|
66
|
-
vec2 d = ray.dir.xy;
|
|
67
|
-
vec2 n = vec2(sin(angle), -cos(angle));
|
|
68
|
-
|
|
69
|
-
float a = dot(o, n);
|
|
70
|
-
float b = dot(d, n);
|
|
71
|
-
float t = -a / b;
|
|
72
|
-
float s = sign(a);
|
|
73
|
-
|
|
74
|
-
// Half space cuts right through the camera, pick the side to intersect
|
|
75
|
-
if (a == 0.0) {
|
|
76
|
-
if (b >= 0.0) {
|
|
77
|
-
return POSITIVE_HIT;
|
|
78
|
-
} else {
|
|
79
|
-
return NEGATIVE_HIT;
|
|
80
|
-
}
|
|
81
|
-
}
|
|
82
|
-
|
|
83
|
-
if (t >= 0.0 != s >= 0.0) {
|
|
84
|
-
return POSITIVE_HIT;
|
|
85
|
-
} else {
|
|
86
|
-
return NEGATIVE_HIT;
|
|
87
|
-
}
|
|
88
|
-
}
|
|
89
|
-
|
|
90
|
-
vec2 intersectRegularWedge(Ray ray, float minAngle, float maxAngle)
|
|
91
|
-
{
|
|
92
|
-
vec2 o = ray.pos.xy;
|
|
93
|
-
vec2 d = ray.dir.xy;
|
|
94
|
-
vec2 n1 = vec2(sin(minAngle), -cos(minAngle));
|
|
95
|
-
vec2 n2 = vec2(-sin(maxAngle), cos(maxAngle));
|
|
96
|
-
|
|
97
|
-
float a1 = dot(o, n1);
|
|
98
|
-
float a2 = dot(o, n2);
|
|
99
|
-
float b1 = dot(d, n1);
|
|
100
|
-
float b2 = dot(d, n2);
|
|
101
|
-
|
|
102
|
-
float t1 = -a1 / b1;
|
|
103
|
-
float t2 = -a2 / b2;
|
|
104
|
-
float s1 = sign(a1);
|
|
105
|
-
float s2 = sign(a2);
|
|
106
|
-
|
|
107
|
-
float tmin = min(t1, t2);
|
|
108
|
-
float tmax = max(t1, t2);
|
|
109
|
-
float smin = tmin == t1 ? s1 : s2;
|
|
110
|
-
float smax = tmin == t1 ? s2 : s1;
|
|
111
|
-
|
|
112
|
-
bool e = tmin >= 0.0;
|
|
113
|
-
bool f = tmax >= 0.0;
|
|
114
|
-
bool g = smin >= 0.0;
|
|
115
|
-
bool h = smax >= 0.0;
|
|
116
|
-
|
|
117
|
-
if (e != g && f == h) return vec2(tmin, tmax);
|
|
118
|
-
else if (e == g && f == h) return vec2(-INF_HIT, tmin);
|
|
119
|
-
else if (e != g && f != h) return vec2(tmax, +INF_HIT);
|
|
120
|
-
else return vec2(NO_HIT);
|
|
121
|
-
}
|
|
122
|
-
|
|
123
|
-
vec4 intersectFlippedWedge(Ray ray, float minAngle, float maxAngle)
|
|
124
|
-
{
|
|
125
|
-
vec2 planeIntersectMin = intersectHalfSpace(ray, minAngle);
|
|
126
|
-
vec2 planeIntersectMax = intersectHalfSpace(ray, maxAngle + czm_pi);
|
|
127
|
-
return vec4(planeIntersectMin, planeIntersectMax);
|
|
128
|
-
}
|
|
129
|
-
|
|
130
34
|
vec2 intersectUnitCylinder(Ray ray)
|
|
131
35
|
{
|
|
132
36
|
vec3 o = ray.pos;
|
|
@@ -256,18 +160,17 @@ void intersectShape(Ray ray, inout Intersections ix)
|
|
|
256
160
|
#endif
|
|
257
161
|
|
|
258
162
|
#if defined(CYLINDER_HAS_RENDER_BOUNDS_ANGLE_RANGE_UNDER_HALF)
|
|
259
|
-
|
|
260
|
-
|
|
163
|
+
RayShapeIntersection wedgeIntersect = intersectRegularWedge(ray, u_cylinderRenderAngleMinMax);
|
|
164
|
+
setShapeIntersection(ix, CYLINDER_INTERSECTION_INDEX_ANGLE, wedgeIntersect);
|
|
261
165
|
#elif defined(CYLINDER_HAS_RENDER_BOUNDS_ANGLE_RANGE_OVER_HALF)
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
vec2 wedgeIntersect = intersectHalfSpace(ray, u_cylinderRenderAngleMinMax.x);
|
|
267
|
-
setIntersectionPair(ix, CYLINDER_INTERSECTION_INDEX_ANGLE, wedgeIntersect);
|
|
166
|
+
RayShapeIntersection wedgeIntersects[2];
|
|
167
|
+
intersectFlippedWedge(ray, u_cylinderRenderAngleMinMax, wedgeIntersects);
|
|
168
|
+
setShapeIntersection(ix, CYLINDER_INTERSECTION_INDEX_ANGLE + 0, wedgeIntersects[0]);
|
|
169
|
+
setShapeIntersection(ix, CYLINDER_INTERSECTION_INDEX_ANGLE + 1, wedgeIntersects[1]);
|
|
268
170
|
#elif defined(CYLINDER_HAS_RENDER_BOUNDS_ANGLE_RANGE_EQUAL_ZERO)
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
171
|
+
RayShapeIntersection wedgeIntersects[2];
|
|
172
|
+
intersectHalfPlane(ray, u_cylinderRenderAngleMinMax.x, wedgeIntersects);
|
|
173
|
+
setShapeIntersection(ix, CYLINDER_INTERSECTION_INDEX_ANGLE + 0, wedgeIntersects[0]);
|
|
174
|
+
setShapeIntersection(ix, CYLINDER_INTERSECTION_INDEX_ANGLE + 1, wedgeIntersects[1]);
|
|
272
175
|
#endif
|
|
273
176
|
}
|
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
//This file is automatically rebuilt by the Cesium build process.
|
|
2
|
-
export default "// See IntersectionUtils.glsl for the definitions of Ray,
|
|
3
|
-
// setIntersectionPair\n\
|
|
2
|
+
export default "// See IntersectionUtils.glsl for the definitions of Ray, NO_HIT,\n\
|
|
3
|
+
// setIntersection, setIntersectionPair, setShapeIntersection\n\
|
|
4
|
+
// See IntersectLongitude.glsl for the definitions of intersectHalfPlane,\n\
|
|
5
|
+
// intersectFlippedWedge, intersectRegularWedge\n\
|
|
4
6
|
\n\
|
|
5
7
|
/* Cylinder defines (set in Scene/VoxelCylinderShape.js)\n\
|
|
6
8
|
#define CYLINDER_HAS_RENDER_BOUNDS_RADIUS_MIN\n\
|
|
@@ -11,19 +13,8 @@ export default "// See IntersectionUtils.glsl for the definitions of Ray, setInt
|
|
|
11
13
|
#define CYLINDER_HAS_RENDER_BOUNDS_ANGLE\n\
|
|
12
14
|
#define CYLINDER_HAS_RENDER_BOUNDS_ANGLE_RANGE_UNDER_HALF\n\
|
|
13
15
|
#define CYLINDER_HAS_RENDER_BOUNDS_ANGLE_RANGE_OVER_HALF\n\
|
|
14
|
-
#define CYLINDER_HAS_RENDER_BOUNDS_ANGLE_RANGE_EQUAL_HALF\n\
|
|
15
16
|
#define CYLINDER_HAS_RENDER_BOUNDS_ANGLE_RANGE_EQUAL_ZERO\n\
|
|
16
17
|
\n\
|
|
17
|
-
#define CYLINDER_HAS_SHAPE_BOUNDS_RADIUS\n\
|
|
18
|
-
#define CYLINDER_HAS_SHAPE_BOUNDS_RADIUS_FLAT\n\
|
|
19
|
-
#define CYLINDER_HAS_SHAPE_BOUNDS_HEIGHT\n\
|
|
20
|
-
#define CYLINDER_HAS_SHAPE_BOUNDS_HEIGHT_FLAT\n\
|
|
21
|
-
#define CYLINDER_HAS_SHAPE_BOUNDS_ANGLE\n\
|
|
22
|
-
#define CYLINDER_HAS_SHAPE_BOUNDS_ANGLE_RANGE_EQUAL_ZERO\n\
|
|
23
|
-
#define CYLINDER_HAS_SHAPE_BOUNDS_ANGLE_MIN_DISCONTINUITY\n\
|
|
24
|
-
#define CYLINDER_HAS_SHAPE_BOUNDS_ANGLE_MAX_DISCONTINUITY\n\
|
|
25
|
-
#define CYLINDER_HAS_SHAPE_BOUNDS_ANGLE_MIN_MAX_REVERSED\n\
|
|
26
|
-
\n\
|
|
27
18
|
#define CYLINDER_INTERSECTION_INDEX_RADIUS_MAX\n\
|
|
28
19
|
#define CYLINDER_INTERSECTION_INDEX_RADIUS_MIN\n\
|
|
29
20
|
#define CYLINDER_INTERSECTION_INDEX_ANGLE\n\
|
|
@@ -41,93 +32,6 @@ export default "// See IntersectionUtils.glsl for the definitions of Ray, setInt
|
|
|
41
32
|
uniform vec2 u_cylinderRenderAngleMinMax;\n\
|
|
42
33
|
#endif\n\
|
|
43
34
|
\n\
|
|
44
|
-
vec4 intersectHalfPlane(Ray ray, float angle) {\n\
|
|
45
|
-
vec2 o = ray.pos.xy;\n\
|
|
46
|
-
vec2 d = ray.dir.xy;\n\
|
|
47
|
-
vec2 planeDirection = vec2(cos(angle), sin(angle));\n\
|
|
48
|
-
vec2 planeNormal = vec2(planeDirection.y, -planeDirection.x);\n\
|
|
49
|
-
\n\
|
|
50
|
-
float a = dot(o, planeNormal);\n\
|
|
51
|
-
float b = dot(d, planeNormal);\n\
|
|
52
|
-
float t = -a / b;\n\
|
|
53
|
-
\n\
|
|
54
|
-
vec2 p = o + t * d;\n\
|
|
55
|
-
bool outside = dot(p, planeDirection) < 0.0;\n\
|
|
56
|
-
if (outside) return vec4(-INF_HIT, +INF_HIT, NO_HIT, NO_HIT);\n\
|
|
57
|
-
\n\
|
|
58
|
-
return vec4(-INF_HIT, t, t, +INF_HIT);\n\
|
|
59
|
-
}\n\
|
|
60
|
-
\n\
|
|
61
|
-
#define POSITIVE_HIT vec2(t, +INF_HIT);\n\
|
|
62
|
-
#define NEGATIVE_HIT vec2(-INF_HIT, t);\n\
|
|
63
|
-
\n\
|
|
64
|
-
vec2 intersectHalfSpace(Ray ray, float angle)\n\
|
|
65
|
-
{\n\
|
|
66
|
-
vec2 o = ray.pos.xy;\n\
|
|
67
|
-
vec2 d = ray.dir.xy;\n\
|
|
68
|
-
vec2 n = vec2(sin(angle), -cos(angle));\n\
|
|
69
|
-
\n\
|
|
70
|
-
float a = dot(o, n);\n\
|
|
71
|
-
float b = dot(d, n);\n\
|
|
72
|
-
float t = -a / b;\n\
|
|
73
|
-
float s = sign(a);\n\
|
|
74
|
-
\n\
|
|
75
|
-
// Half space cuts right through the camera, pick the side to intersect\n\
|
|
76
|
-
if (a == 0.0) {\n\
|
|
77
|
-
if (b >= 0.0) {\n\
|
|
78
|
-
return POSITIVE_HIT;\n\
|
|
79
|
-
} else {\n\
|
|
80
|
-
return NEGATIVE_HIT;\n\
|
|
81
|
-
}\n\
|
|
82
|
-
}\n\
|
|
83
|
-
\n\
|
|
84
|
-
if (t >= 0.0 != s >= 0.0) {\n\
|
|
85
|
-
return POSITIVE_HIT;\n\
|
|
86
|
-
} else {\n\
|
|
87
|
-
return NEGATIVE_HIT;\n\
|
|
88
|
-
}\n\
|
|
89
|
-
}\n\
|
|
90
|
-
\n\
|
|
91
|
-
vec2 intersectRegularWedge(Ray ray, float minAngle, float maxAngle)\n\
|
|
92
|
-
{\n\
|
|
93
|
-
vec2 o = ray.pos.xy;\n\
|
|
94
|
-
vec2 d = ray.dir.xy;\n\
|
|
95
|
-
vec2 n1 = vec2(sin(minAngle), -cos(minAngle));\n\
|
|
96
|
-
vec2 n2 = vec2(-sin(maxAngle), cos(maxAngle));\n\
|
|
97
|
-
\n\
|
|
98
|
-
float a1 = dot(o, n1);\n\
|
|
99
|
-
float a2 = dot(o, n2);\n\
|
|
100
|
-
float b1 = dot(d, n1);\n\
|
|
101
|
-
float b2 = dot(d, n2);\n\
|
|
102
|
-
\n\
|
|
103
|
-
float t1 = -a1 / b1;\n\
|
|
104
|
-
float t2 = -a2 / b2;\n\
|
|
105
|
-
float s1 = sign(a1);\n\
|
|
106
|
-
float s2 = sign(a2);\n\
|
|
107
|
-
\n\
|
|
108
|
-
float tmin = min(t1, t2);\n\
|
|
109
|
-
float tmax = max(t1, t2);\n\
|
|
110
|
-
float smin = tmin == t1 ? s1 : s2;\n\
|
|
111
|
-
float smax = tmin == t1 ? s2 : s1;\n\
|
|
112
|
-
\n\
|
|
113
|
-
bool e = tmin >= 0.0;\n\
|
|
114
|
-
bool f = tmax >= 0.0;\n\
|
|
115
|
-
bool g = smin >= 0.0;\n\
|
|
116
|
-
bool h = smax >= 0.0;\n\
|
|
117
|
-
\n\
|
|
118
|
-
if (e != g && f == h) return vec2(tmin, tmax);\n\
|
|
119
|
-
else if (e == g && f == h) return vec2(-INF_HIT, tmin);\n\
|
|
120
|
-
else if (e != g && f != h) return vec2(tmax, +INF_HIT);\n\
|
|
121
|
-
else return vec2(NO_HIT);\n\
|
|
122
|
-
}\n\
|
|
123
|
-
\n\
|
|
124
|
-
vec4 intersectFlippedWedge(Ray ray, float minAngle, float maxAngle)\n\
|
|
125
|
-
{\n\
|
|
126
|
-
vec2 planeIntersectMin = intersectHalfSpace(ray, minAngle);\n\
|
|
127
|
-
vec2 planeIntersectMax = intersectHalfSpace(ray, maxAngle + czm_pi);\n\
|
|
128
|
-
return vec4(planeIntersectMin, planeIntersectMax);\n\
|
|
129
|
-
}\n\
|
|
130
|
-
\n\
|
|
131
35
|
vec2 intersectUnitCylinder(Ray ray)\n\
|
|
132
36
|
{\n\
|
|
133
37
|
vec3 o = ray.pos;\n\
|
|
@@ -257,19 +161,18 @@ void intersectShape(Ray ray, inout Intersections ix)\n\
|
|
|
257
161
|
#endif\n\
|
|
258
162
|
\n\
|
|
259
163
|
#if defined(CYLINDER_HAS_RENDER_BOUNDS_ANGLE_RANGE_UNDER_HALF)\n\
|
|
260
|
-
|
|
261
|
-
|
|
164
|
+
RayShapeIntersection wedgeIntersect = intersectRegularWedge(ray, u_cylinderRenderAngleMinMax);\n\
|
|
165
|
+
setShapeIntersection(ix, CYLINDER_INTERSECTION_INDEX_ANGLE, wedgeIntersect);\n\
|
|
262
166
|
#elif defined(CYLINDER_HAS_RENDER_BOUNDS_ANGLE_RANGE_OVER_HALF)\n\
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
vec2 wedgeIntersect = intersectHalfSpace(ray, u_cylinderRenderAngleMinMax.x);\n\
|
|
268
|
-
setIntersectionPair(ix, CYLINDER_INTERSECTION_INDEX_ANGLE, wedgeIntersect);\n\
|
|
167
|
+
RayShapeIntersection wedgeIntersects[2];\n\
|
|
168
|
+
intersectFlippedWedge(ray, u_cylinderRenderAngleMinMax, wedgeIntersects);\n\
|
|
169
|
+
setShapeIntersection(ix, CYLINDER_INTERSECTION_INDEX_ANGLE + 0, wedgeIntersects[0]);\n\
|
|
170
|
+
setShapeIntersection(ix, CYLINDER_INTERSECTION_INDEX_ANGLE + 1, wedgeIntersects[1]);\n\
|
|
269
171
|
#elif defined(CYLINDER_HAS_RENDER_BOUNDS_ANGLE_RANGE_EQUAL_ZERO)\n\
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
172
|
+
RayShapeIntersection wedgeIntersects[2];\n\
|
|
173
|
+
intersectHalfPlane(ray, u_cylinderRenderAngleMinMax.x, wedgeIntersects);\n\
|
|
174
|
+
setShapeIntersection(ix, CYLINDER_INTERSECTION_INDEX_ANGLE + 0, wedgeIntersects[0]);\n\
|
|
175
|
+
setShapeIntersection(ix, CYLINDER_INTERSECTION_INDEX_ANGLE + 1, wedgeIntersects[1]);\n\
|
|
273
176
|
#endif\n\
|
|
274
177
|
}\n\
|
|
275
178
|
";
|