@cesium/engine 6.2.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/ThirdParty/Workers/z-worker-pako.js +568 -407
- package/Build/Workers/{chunk-RH4N2ONY.js → chunk-23UFSGND.js} +7 -7
- package/Build/Workers/{chunk-HPP4JLNH.js → chunk-2A75IWRS.js} +7 -7
- package/Build/Workers/{chunk-5IRLXUTA.js → chunk-2FRVPMCS.js} +10 -10
- package/Build/Workers/{chunk-ZQRZBHYI.js → chunk-2FWRMUTY.js} +4 -4
- package/Build/Workers/{chunk-Z2SIPUKB.js → chunk-2UPKWTMJ.js} +6 -6
- package/Build/Workers/{chunk-434ZTTFX.js → chunk-34FXV7D7.js} +2 -2
- package/Build/Workers/{chunk-MW3CJYLX.js → chunk-3VAZEH7M.js} +2 -2
- package/Build/Workers/{chunk-HUPNRBWW.js → chunk-4DO5W5XZ.js} +6 -6
- package/Build/Workers/{chunk-PIXK6KHB.js → chunk-4H7PY4U5.js} +2 -2
- package/Build/Workers/{chunk-BP467WX3.js → chunk-5QULIR53.js} +4 -4
- package/Build/Workers/{chunk-R3HUGXBH.js → chunk-7TC63SJW.js} +8 -8
- package/Build/Workers/{chunk-SQVTYRZY.js → chunk-7ZFGPDJA.js} +4 -4
- package/Build/Workers/{chunk-TIXXVKUY.js → chunk-A5DWLWCY.js} +10 -10
- package/Build/Workers/{chunk-CWJQGBWT.js → chunk-BBWDMCVU.js} +1 -1
- package/Build/Workers/{chunk-4KP73B43.js → chunk-BG4UCVXN.js} +3 -3
- package/Build/Workers/{chunk-Y4OJ4B23.js → chunk-BIKA3NRA.js} +5 -5
- package/Build/Workers/{chunk-DR5XZ6K5.js → chunk-BROJAZRZ.js} +13 -13
- package/Build/Workers/{chunk-FWGNCYP6.js → chunk-DDUQAJ4P.js} +7 -7
- package/Build/Workers/{chunk-QRBRVGZC.js → chunk-EERJKOAF.js} +4 -4
- package/Build/Workers/{chunk-52VSIKEA.js → chunk-EG6PTBY2.js} +15 -15
- package/Build/Workers/{chunk-O43GWBSF.js → chunk-EHWHNOEX.js} +1 -1
- package/Build/Workers/{chunk-MN34FIF5.js → chunk-F3YA3Y2Z.js} +1 -1
- package/Build/Workers/{chunk-GF5TNNKP.js → chunk-F4HFJMGM.js} +6 -6
- package/Build/Workers/{chunk-HOT2SNXP.js → chunk-FJKNFAKQ.js} +133 -553
- package/Build/Workers/{chunk-TMPVBFJQ.js → chunk-FNIRWHJB.js} +10 -10
- package/Build/Workers/{chunk-DMCSY5BU.js → chunk-FZRIVR7Y.js} +5 -5
- package/Build/Workers/{chunk-Z4JUBRHP.js → chunk-G43QFN4Q.js} +6 -6
- package/Build/Workers/{chunk-HPH5HSFE.js → chunk-GATZHF3K.js} +2 -2
- package/Build/Workers/{chunk-CSIZ3BGT.js → chunk-GRC2ZTAF.js} +14 -14
- package/Build/Workers/{chunk-NE4JNU6H.js → chunk-HU6N6EXB.js} +10 -10
- package/Build/Workers/{chunk-GVL5I7TC.js → chunk-I46ZRR5W.js} +17 -17
- package/Build/Workers/{chunk-5GDBZTHX.js → chunk-JURN7NPV.js} +17 -17
- package/Build/Workers/{chunk-H5DUXHCV.js → chunk-KKCR2YOP.js} +11 -11
- package/Build/Workers/{chunk-LX6XV4DK.js → chunk-LPR3YNP2.js} +5 -5
- package/Build/Workers/{chunk-HFKSAB5K.js → chunk-M7ERACJJ.js} +13 -13
- package/Build/Workers/{chunk-BUZDZBUH.js → chunk-MDWEGWPA.js} +10 -10
- package/Build/Workers/{chunk-LGJUI2CE.js → chunk-OGXZVPPM.js} +9 -5
- package/Build/Workers/{chunk-PZ2WJWUG.js → chunk-PGSJK77E.js} +6 -6
- package/Build/Workers/{chunk-ARPTYYKS.js → chunk-PPH7OFP3.js} +5 -5
- package/Build/Workers/{chunk-R4OZKBXH.js → chunk-SH5USDPI.js} +6 -6
- package/Build/Workers/{chunk-SV7DDPAC.js → chunk-SOWMRMWA.js} +1 -1
- package/Build/Workers/{chunk-RIDPF7PO.js → chunk-STW2DGFI.js} +2 -2
- package/Build/Workers/{chunk-CDGHUKQ4.js → chunk-T3XIFPYR.js} +13 -13
- package/Build/Workers/chunk-TTUZP4BO.js +501 -0
- package/Build/Workers/{chunk-QTZQZY2C.js → chunk-UEXTBDBE.js} +34 -10
- package/Build/Workers/{chunk-XUTVA4K5.js → chunk-VOXYEYJT.js} +11 -11
- package/Build/Workers/{chunk-AXFRNOVC.js → chunk-X4356LRH.js} +12 -12
- package/Build/Workers/{chunk-5HLGKKG3.js → chunk-XGI5BXZY.js} +2 -2
- package/Build/Workers/{chunk-SNN7WOC2.js → chunk-Y2ME2IJV.js} +13 -13
- package/Build/Workers/{chunk-LGL4P5KL.js → chunk-Y5UQJLYE.js} +6 -6
- package/Build/Workers/{chunk-3PW6ZBN4.js → chunk-YJEBABKH.js} +7 -7
- package/Build/Workers/{chunk-YBKFS53K.js → chunk-YWTJ2B4B.js} +1 -1
- package/Build/Workers/{chunk-5SK36PU4.js → chunk-Z3TIFFGF.js} +7 -7
- package/Build/Workers/{chunk-JGG36SQV.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 -29
- package/Build/Workers/createCorridorOutlineGeometry.js +28 -28
- 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 -166
- package/Build/Workers/createPolygonOutlineGeometry.js +30 -29
- package/Build/Workers/createPolylineGeometry.js +25 -24
- package/Build/Workers/createPolylineVolumeGeometry.js +32 -33
- package/Build/Workers/createPolylineVolumeOutlineGeometry.js +27 -27
- 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/LICENSE.md +1 -1
- package/Source/Assets/approximateTerrainHeights.json +1 -1
- package/Source/Core/Ellipsoid.js +6 -0
- package/Source/Core/GregorianDate.js +85 -0
- package/Source/Core/HeadingPitchRange.js +2 -2
- package/Source/Core/IntersectionTests.js +6 -3
- package/Source/Core/Ion.js +1 -1
- package/Source/Core/PixelFormat.js +5 -0
- package/Source/Core/PolygonGeometry.js +0 -169
- package/Source/Core/Resource.js +30 -69
- package/Source/Core/Transforms.js +30 -18
- package/Source/Core/createWorldBathymetryAsync.js +45 -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/EllipsoidGeometryUpdater.js +3 -4
- package/Source/DataSources/Entity.js +28 -7
- package/Source/DataSources/EntityCollection.js +1 -2
- package/Source/DataSources/GeometryUpdater.js +1 -2
- package/Source/DataSources/GeometryUpdaterSet.js +114 -0
- package/Source/DataSources/GeometryVisualizer.js +19 -83
- package/Source/DataSources/GroundGeometryUpdater.js +6 -3
- package/Source/DataSources/ModelVisualizer.js +19 -98
- package/Source/DataSources/PolygonGeometryUpdater.js +14 -2
- package/Source/DataSources/PolylineGeometryUpdater.js +9 -8
- package/Source/DataSources/TerrainOffsetProperty.js +15 -23
- package/Source/Renderer/AutomaticUniforms.js +121 -1
- package/Source/Renderer/Context.js +10 -0
- package/Source/Renderer/ContextLimits.js +2 -0
- package/Source/Renderer/UniformState.js +127 -0
- package/Source/Renderer/demodernizeShader.js +4 -1
- package/Source/Scene/ArcGisMapService.js +1 -1
- package/Source/Scene/Atmosphere.js +127 -0
- package/Source/Scene/Axis.js +12 -7
- package/Source/Scene/Billboard.js +29 -26
- package/Source/Scene/BillboardCollection.js +3 -3
- package/Source/Scene/Camera.js +47 -5
- package/Source/Scene/Cesium3DTile.js +1 -0
- package/Source/Scene/Cesium3DTileContent.js +14 -0
- package/Source/Scene/Cesium3DTileset.js +364 -45
- package/Source/Scene/Cesium3DTilesetBaseTraversal.js +2 -4
- package/Source/Scene/Cesium3DTilesetTraversal.js +4 -0
- package/Source/Scene/Composite3DTileContent.js +42 -0
- package/Source/Scene/DynamicAtmosphereLightingType.js +56 -0
- package/Source/Scene/Empty3DTileContent.js +4 -0
- package/Source/Scene/Fog.js +1 -0
- package/Source/Scene/FrameState.js +14 -1
- package/Source/Scene/Geometry3DTileContent.js +4 -0
- package/Source/Scene/Globe.js +3 -2
- package/Source/Scene/GlobeSurfaceTileProvider.js +3 -1
- package/Source/Scene/GlobeTranslucencyState.js +1 -1
- package/Source/Scene/GltfLoader.js +15 -5
- package/Source/Scene/GltfPipeline/updateVersion.js +69 -68
- package/Source/Scene/HeightReference.js +59 -2
- 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/Implicit3DTileContent.js +4 -0
- package/Source/Scene/KeyframeNode.js +1 -1
- package/Source/Scene/LabelCollection.js +2 -2
- package/Source/Scene/Model/AtmospherePipelineStage.js +59 -0
- package/Source/Scene/Model/B3dmLoader.js +4 -0
- package/Source/Scene/Model/FeatureIdPipelineStage.js +25 -2
- package/Source/Scene/Model/I3dmLoader.js +4 -0
- package/Source/Scene/Model/InstancingPipelineStage.js +24 -6
- package/Source/Scene/Model/MetadataPipelineStage.js +31 -3
- package/Source/Scene/Model/Model.js +82 -32
- package/Source/Scene/Model/Model3DTileContent.js +31 -0
- package/Source/Scene/Model/ModelAnimationChannel.js +16 -15
- package/Source/Scene/Model/ModelSceneGraph.js +6 -0
- package/Source/Scene/Model/pickModel.js +426 -0
- package/Source/Scene/Multiple3DTileContent.js +42 -0
- package/Source/Scene/PickFramebuffer.js +37 -2
- package/Source/Scene/Picking.js +113 -39
- package/Source/Scene/Primitive.js +6 -2
- package/Source/Scene/QuadtreePrimitive.js +1 -1
- package/Source/Scene/Scene.js +312 -46
- package/Source/Scene/ScreenSpaceCameraController.js +23 -13
- package/Source/Scene/SensorVolumePortionToDisplay.js +69 -0
- package/Source/Scene/SkyAtmosphere.js +5 -6
- package/Source/Scene/SpatialNode.js +12 -19
- package/Source/Scene/StructuralMetadata.js +1 -1
- package/Source/Scene/Terrain.js +49 -0
- package/Source/Scene/TileBoundingS2Cell.js +2 -2
- package/Source/Scene/Tileset3DTileContent.js +4 -0
- package/Source/Scene/Vector3DTileContent.js +4 -0
- 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/AtmosphereCommon.glsl +3 -11
- package/Source/Shaders/AtmosphereCommon.js +3 -11
- package/Source/Shaders/Builtin/CzmBuiltins.js +12 -0
- package/Source/Shaders/Builtin/Functions/applyHSBShift.glsl +32 -0
- package/Source/Shaders/Builtin/Functions/applyHSBShift.js +34 -0
- package/Source/Shaders/Builtin/Functions/approximateTanh.glsl +10 -0
- package/Source/Shaders/Builtin/Functions/approximateTanh.js +12 -0
- package/Source/Shaders/Builtin/Functions/computeAtmosphereColor.glsl +44 -0
- package/Source/Shaders/Builtin/Functions/computeAtmosphereColor.js +46 -0
- package/Source/Shaders/Builtin/Functions/computeGroundAtmosphereScattering.glsl +30 -0
- package/Source/Shaders/Builtin/Functions/computeGroundAtmosphereScattering.js +32 -0
- package/Source/Shaders/Builtin/Functions/computeScattering.glsl +150 -0
- package/Source/Shaders/Builtin/Functions/computeScattering.js +152 -0
- package/Source/Shaders/Builtin/Functions/getDynamicAtmosphereLightDirection.glsl +22 -0
- package/Source/Shaders/Builtin/Functions/getDynamicAtmosphereLightDirection.js +24 -0
- package/Source/Shaders/Builtin/Functions/translateRelativeToEye.glsl +5 -0
- package/Source/Shaders/Builtin/Functions/translateRelativeToEye.js +5 -0
- package/Source/Shaders/GlobeFS.glsl +16 -25
- package/Source/Shaders/GlobeFS.js +16 -25
- package/Source/Shaders/GlobeVS.glsl +1 -1
- package/Source/Shaders/GlobeVS.js +1 -1
- package/Source/Shaders/Model/AtmosphereStageFS.glsl +111 -0
- package/Source/Shaders/Model/AtmosphereStageFS.js +113 -0
- package/Source/Shaders/Model/AtmosphereStageVS.glsl +12 -0
- package/Source/Shaders/Model/AtmosphereStageVS.js +14 -0
- package/Source/Shaders/Model/GeometryStageFS.glsl +1 -1
- package/Source/Shaders/Model/GeometryStageFS.js +1 -1
- package/Source/Shaders/Model/GeometryStageVS.glsl +4 -4
- package/Source/Shaders/Model/GeometryStageVS.js +4 -4
- package/Source/Shaders/Model/ModelColorStageFS.glsl +1 -1
- package/Source/Shaders/Model/ModelColorStageFS.js +2 -1
- package/Source/Shaders/Model/ModelFS.glsl +4 -0
- package/Source/Shaders/Model/ModelFS.js +4 -0
- package/Source/Shaders/Model/ModelVS.glsl +9 -4
- package/Source/Shaders/Model/ModelVS.js +9 -4
- package/Source/Shaders/SkyAtmosphereCommon.glsl +3 -13
- package/Source/Shaders/SkyAtmosphereCommon.js +3 -13
- package/Source/Shaders/SkyAtmosphereFS.glsl +5 -10
- package/Source/Shaders/SkyAtmosphereFS.js +5 -10
- package/Source/Shaders/SkyAtmosphereVS.glsl +3 -2
- package/Source/Shaders/SkyAtmosphereVS.js +3 -2
- 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/ThirdParty/Workers/z-worker-pako.js +1 -1
- package/Source/ThirdParty/draco_decoder.wasm +0 -0
- package/Source/Workers/createGeometry.js +40 -11
- package/Source/Workers/decodeI3S.js +720 -94
- package/index.d.ts +574 -71
- package/index.js +217 -196
- package/package.json +3 -3
- package/Build/Workers/chunk-ATB2I7OS.js +0 -55
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
//This file is automatically rebuilt by the Cesium build process.
|
|
2
2
|
export default "// See IntersectionUtils.glsl for the definitions of Ray, Intersections,\n\
|
|
3
3
|
// setIntersection, setIntersectionPair, INF_HIT, NO_HIT\n\
|
|
4
|
+
// See IntersectLongitude.glsl for the definitions of intersectHalfPlane,\n\
|
|
5
|
+
// intersectFlippedWedge, intersectRegularWedge\n\
|
|
4
6
|
\n\
|
|
5
7
|
/* Ellipsoid defines (set in Scene/VoxelEllipsoidShape.js)\n\
|
|
6
8
|
#define ELLIPSOID_HAS_RENDER_BOUNDS_LONGITUDE\n\
|
|
7
9
|
#define ELLIPSOID_HAS_RENDER_BOUNDS_LONGITUDE_RANGE_EQUAL_ZERO\n\
|
|
8
10
|
#define ELLIPSOID_HAS_RENDER_BOUNDS_LONGITUDE_RANGE_UNDER_HALF\n\
|
|
9
|
-
#define ELLIPSOID_HAS_RENDER_BOUNDS_LONGITUDE_RANGE_EQUAL_HALF\n\
|
|
10
11
|
#define ELLIPSOID_HAS_RENDER_BOUNDS_LONGITUDE_RANGE_OVER_HALF\n\
|
|
11
|
-
#define ELLIPSOID_HAS_RENDER_BOUNDS_LATITUDE\n\
|
|
12
12
|
#define ELLIPSOID_HAS_RENDER_BOUNDS_LATITUDE_MAX_UNDER_HALF\n\
|
|
13
13
|
#define ELLIPSOID_HAS_RENDER_BOUNDS_LATITUDE_MAX_EQUAL_HALF\n\
|
|
14
14
|
#define ELLIPSOID_HAS_RENDER_BOUNDS_LATITUDE_MAX_OVER_HALF\n\
|
|
@@ -17,7 +17,6 @@ export default "// See IntersectionUtils.glsl for the definitions of Ray, Inters
|
|
|
17
17
|
#define ELLIPSOID_HAS_RENDER_BOUNDS_LATITUDE_MIN_OVER_HALF\n\
|
|
18
18
|
#define ELLIPSOID_HAS_RENDER_BOUNDS_HEIGHT_MAX\n\
|
|
19
19
|
#define ELLIPSOID_HAS_RENDER_BOUNDS_HEIGHT_MIN\n\
|
|
20
|
-
#define ELLIPSOID_HAS_RENDER_BOUNDS_HEIGHT_FLAT\n\
|
|
21
20
|
#define ELLIPSOID_INTERSECTION_INDEX_LONGITUDE\n\
|
|
22
21
|
#define ELLIPSOID_INTERSECTION_INDEX_LATITUDE_MAX\n\
|
|
23
22
|
#define ELLIPSOID_INTERSECTION_INDEX_LATITUDE_MIN\n\
|
|
@@ -49,78 +48,6 @@ vec2 intersectZPlane(Ray ray)\n\
|
|
|
49
48
|
else return vec2(-INF_HIT, t);\n\
|
|
50
49
|
}\n\
|
|
51
50
|
\n\
|
|
52
|
-
vec4 intersectHalfPlane(Ray ray, float angle) {\n\
|
|
53
|
-
vec2 o = ray.pos.xy;\n\
|
|
54
|
-
vec2 d = ray.dir.xy;\n\
|
|
55
|
-
vec2 planeDirection = vec2(cos(angle), sin(angle));\n\
|
|
56
|
-
vec2 planeNormal = vec2(planeDirection.y, -planeDirection.x);\n\
|
|
57
|
-
\n\
|
|
58
|
-
float a = dot(o, planeNormal);\n\
|
|
59
|
-
float b = dot(d, planeNormal);\n\
|
|
60
|
-
float t = -a / b;\n\
|
|
61
|
-
\n\
|
|
62
|
-
vec2 p = o + t * d;\n\
|
|
63
|
-
bool outside = dot(p, planeDirection) < 0.0;\n\
|
|
64
|
-
if (outside) return vec4(-INF_HIT, +INF_HIT, NO_HIT, NO_HIT);\n\
|
|
65
|
-
\n\
|
|
66
|
-
return vec4(-INF_HIT, t, t, +INF_HIT);\n\
|
|
67
|
-
}\n\
|
|
68
|
-
\n\
|
|
69
|
-
vec2 intersectHalfSpace(Ray ray, float angle)\n\
|
|
70
|
-
{\n\
|
|
71
|
-
vec2 o = ray.pos.xy;\n\
|
|
72
|
-
vec2 d = ray.dir.xy;\n\
|
|
73
|
-
vec2 n = vec2(sin(angle), -cos(angle));\n\
|
|
74
|
-
\n\
|
|
75
|
-
float a = dot(o, n);\n\
|
|
76
|
-
float b = dot(d, n);\n\
|
|
77
|
-
float t = -a / b;\n\
|
|
78
|
-
float s = sign(a);\n\
|
|
79
|
-
\n\
|
|
80
|
-
if (t >= 0.0 != s >= 0.0) return vec2(t, +INF_HIT);\n\
|
|
81
|
-
else return vec2(-INF_HIT, t);\n\
|
|
82
|
-
}\n\
|
|
83
|
-
\n\
|
|
84
|
-
vec2 intersectRegularWedge(Ray ray, float minAngle, float maxAngle)\n\
|
|
85
|
-
{\n\
|
|
86
|
-
vec2 o = ray.pos.xy;\n\
|
|
87
|
-
vec2 d = ray.dir.xy;\n\
|
|
88
|
-
vec2 n1 = vec2(sin(minAngle), -cos(minAngle));\n\
|
|
89
|
-
vec2 n2 = vec2(-sin(maxAngle), cos(maxAngle));\n\
|
|
90
|
-
\n\
|
|
91
|
-
float a1 = dot(o, n1);\n\
|
|
92
|
-
float a2 = dot(o, n2);\n\
|
|
93
|
-
float b1 = dot(d, n1);\n\
|
|
94
|
-
float b2 = dot(d, n2);\n\
|
|
95
|
-
\n\
|
|
96
|
-
float t1 = -a1 / b1;\n\
|
|
97
|
-
float t2 = -a2 / b2;\n\
|
|
98
|
-
float s1 = sign(a1);\n\
|
|
99
|
-
float s2 = sign(a2);\n\
|
|
100
|
-
\n\
|
|
101
|
-
float tmin = min(t1, t2);\n\
|
|
102
|
-
float tmax = max(t1, t2);\n\
|
|
103
|
-
float smin = tmin == t1 ? s1 : s2;\n\
|
|
104
|
-
float smax = tmin == t1 ? s2 : s1;\n\
|
|
105
|
-
\n\
|
|
106
|
-
bool e = tmin >= 0.0;\n\
|
|
107
|
-
bool f = tmax >= 0.0;\n\
|
|
108
|
-
bool g = smin >= 0.0;\n\
|
|
109
|
-
bool h = smax >= 0.0;\n\
|
|
110
|
-
\n\
|
|
111
|
-
if (e != g && f == h) return vec2(tmin, tmax);\n\
|
|
112
|
-
else if (e == g && f == h) return vec2(-INF_HIT, tmin);\n\
|
|
113
|
-
else if (e != g && f != h) return vec2(tmax, +INF_HIT);\n\
|
|
114
|
-
else return vec2(NO_HIT);\n\
|
|
115
|
-
}\n\
|
|
116
|
-
\n\
|
|
117
|
-
vec4 intersectFlippedWedge(Ray ray, float minAngle, float maxAngle)\n\
|
|
118
|
-
{\n\
|
|
119
|
-
vec2 planeIntersectMin = intersectHalfSpace(ray, minAngle);\n\
|
|
120
|
-
vec2 planeIntersectMax = intersectHalfSpace(ray, maxAngle + czm_pi);\n\
|
|
121
|
-
return vec4(planeIntersectMin, planeIntersectMax);\n\
|
|
122
|
-
}\n\
|
|
123
|
-
\n\
|
|
124
51
|
vec2 intersectUnitSphere(Ray ray)\n\
|
|
125
52
|
{\n\
|
|
126
53
|
vec3 o = ray.pos;\n\
|
|
@@ -251,39 +178,32 @@ void intersectShape(in Ray ray, inout Intersections ix) {\n\
|
|
|
251
178
|
}\n\
|
|
252
179
|
\n\
|
|
253
180
|
// Inner ellipsoid\n\
|
|
254
|
-
#if defined(
|
|
255
|
-
// When the ellipsoid is perfectly thin it's necessary to sandwich the\n\
|
|
256
|
-
// inner ellipsoid intersection inside the outer ellipsoid intersection.\n\
|
|
257
|
-
\n\
|
|
258
|
-
// Without this special case,\n\
|
|
259
|
-
// [outerMin, outerMax, innerMin, innerMax] will bubble sort to\n\
|
|
260
|
-
// [outerMin, innerMin, outerMax, innerMax] which will cause the back\n\
|
|
261
|
-
// side of the ellipsoid to be invisible because it will think the ray\n\
|
|
262
|
-
// is still inside the inner (negative) ellipsoid after exiting the\n\
|
|
263
|
-
// outer (positive) ellipsoid.\n\
|
|
264
|
-
\n\
|
|
265
|
-
// With this special case,\n\
|
|
266
|
-
// [outerMin, innerMin, innerMax, outerMax] will bubble sort to\n\
|
|
267
|
-
// [outerMin, innerMin, innerMax, outerMax] which will work correctly.\n\
|
|
268
|
-
\n\
|
|
269
|
-
// Note: If initializeIntersections() changes its sorting function\n\
|
|
270
|
-
// from bubble sort to something else, this code may need to change.\n\
|
|
271
|
-
setIntersection(ix, 0, outerIntersect.x, true, true); // positive, enter\n\
|
|
272
|
-
setIntersection(ix, 1, outerIntersect.x, false, true); // negative, enter\n\
|
|
273
|
-
setIntersection(ix, 2, outerIntersect.y, false, false); // negative, exit\n\
|
|
274
|
-
setIntersection(ix, 3, outerIntersect.y, true, false); // positive, exit\n\
|
|
275
|
-
#elif defined(ELLIPSOID_HAS_RENDER_BOUNDS_HEIGHT_MIN)\n\
|
|
181
|
+
#if defined(ELLIPSOID_HAS_RENDER_BOUNDS_HEIGHT_MIN)\n\
|
|
276
182
|
Ray innerRay = Ray(ray.pos * u_ellipsoidInverseInnerScaleUv, ray.dir * u_ellipsoidInverseInnerScaleUv);\n\
|
|
277
183
|
vec2 innerIntersect = intersectUnitSphereUnnormalizedDirection(innerRay);\n\
|
|
278
184
|
\n\
|
|
279
185
|
if (innerIntersect == vec2(NO_HIT)) {\n\
|
|
280
186
|
setIntersectionPair(ix, ELLIPSOID_INTERSECTION_INDEX_HEIGHT_MIN, innerIntersect);\n\
|
|
281
187
|
} else {\n\
|
|
282
|
-
// When the ellipsoid is
|
|
283
|
-
//
|
|
284
|
-
//
|
|
285
|
-
//
|
|
286
|
-
|
|
188
|
+
// When the ellipsoid is large and thin it's possible for floating point math\n\
|
|
189
|
+
// to cause the ray to intersect the inner ellipsoid before the outer ellipsoid.\n\
|
|
190
|
+
// To prevent this from happening, clamp innerIntersect to outerIntersect and\n\
|
|
191
|
+
// sandwich the inner ellipsoid intersection inside the outer ellipsoid intersection.\n\
|
|
192
|
+
\n\
|
|
193
|
+
// Without this special case,\n\
|
|
194
|
+
// [outerMin, outerMax, innerMin, innerMax] will bubble sort to\n\
|
|
195
|
+
// [outerMin, innerMin, outerMax, innerMax] which will cause the back\n\
|
|
196
|
+
// side of the ellipsoid to be invisible because it will think the ray\n\
|
|
197
|
+
// is still inside the inner (negative) ellipsoid after exiting the\n\
|
|
198
|
+
// outer (positive) ellipsoid.\n\
|
|
199
|
+
\n\
|
|
200
|
+
// With this special case,\n\
|
|
201
|
+
// [outerMin, innerMin, innerMax, outerMax] will bubble sort to\n\
|
|
202
|
+
// [outerMin, innerMin, innerMax, outerMax] which will work correctly.\n\
|
|
203
|
+
\n\
|
|
204
|
+
// Note: If initializeIntersections() changes its sorting function\n\
|
|
205
|
+
// from bubble sort to something else, this code may need to change.\n\
|
|
206
|
+
\n\
|
|
287
207
|
// In theory a similar fix is needed for cylinders, however it's more\n\
|
|
288
208
|
// complicated to implement because the inner shape is allowed to be\n\
|
|
289
209
|
// intersected first.\n\
|
|
@@ -331,19 +251,18 @@ void intersectShape(in Ray ray, inout Intersections ix) {\n\
|
|
|
331
251
|
\n\
|
|
332
252
|
// Wedge\n\
|
|
333
253
|
#if defined(ELLIPSOID_HAS_RENDER_BOUNDS_LONGITUDE_RANGE_EQUAL_ZERO)\n\
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
254
|
+
RayShapeIntersection wedgeIntersects[2];\n\
|
|
255
|
+
intersectHalfPlane(ray, u_ellipsoidRenderLongitudeMinMax.x, wedgeIntersects);\n\
|
|
256
|
+
setShapeIntersection(ix, ELLIPSOID_INTERSECTION_INDEX_LONGITUDE + 0, wedgeIntersects[0]);\n\
|
|
257
|
+
setShapeIntersection(ix, ELLIPSOID_INTERSECTION_INDEX_LONGITUDE + 1, wedgeIntersects[1]);\n\
|
|
337
258
|
#elif defined(ELLIPSOID_HAS_RENDER_BOUNDS_LONGITUDE_RANGE_UNDER_HALF)\n\
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
#elif defined(ELLIPSOID_HAS_RENDER_BOUNDS_LONGITUDE_RANGE_EQUAL_HALF)\n\
|
|
341
|
-
vec2 wedgeIntersect = intersectHalfSpace(ray, u_ellipsoidRenderLongitudeMinMax.x);\n\
|
|
342
|
-
setIntersectionPair(ix, ELLIPSOID_INTERSECTION_INDEX_LONGITUDE, wedgeIntersect);\n\
|
|
259
|
+
RayShapeIntersection wedgeIntersect = intersectRegularWedge(ray, u_ellipsoidRenderLongitudeMinMax);\n\
|
|
260
|
+
setShapeIntersection(ix, ELLIPSOID_INTERSECTION_INDEX_LONGITUDE, wedgeIntersect);\n\
|
|
343
261
|
#elif defined(ELLIPSOID_HAS_RENDER_BOUNDS_LONGITUDE_RANGE_OVER_HALF)\n\
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
262
|
+
RayShapeIntersection wedgeIntersects[2];\n\
|
|
263
|
+
intersectFlippedWedge(ray, u_ellipsoidRenderLongitudeMinMax, wedgeIntersects);\n\
|
|
264
|
+
setShapeIntersection(ix, ELLIPSOID_INTERSECTION_INDEX_LONGITUDE + 0, wedgeIntersects[0]);\n\
|
|
265
|
+
setShapeIntersection(ix, ELLIPSOID_INTERSECTION_INDEX_LONGITUDE + 1, wedgeIntersects[1]);\n\
|
|
347
266
|
#endif\n\
|
|
348
267
|
}\n\
|
|
349
268
|
";
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
// See IntersectionUtils.glsl for the definitions of Ray, NO_HIT, INF_HIT,
|
|
2
|
+
// RayShapeIntersection
|
|
3
|
+
|
|
4
|
+
vec4 intersectLongitude(in Ray ray, in float angle, in bool positiveNormal) {
|
|
5
|
+
float normalSign = positiveNormal ? 1.0 : -1.0;
|
|
6
|
+
vec2 planeNormal = vec2(-sin(angle), cos(angle)) * normalSign;
|
|
7
|
+
|
|
8
|
+
vec2 position = ray.pos.xy;
|
|
9
|
+
vec2 direction = ray.dir.xy;
|
|
10
|
+
float approachRate = dot(direction, planeNormal);
|
|
11
|
+
float distance = -dot(position, planeNormal);
|
|
12
|
+
|
|
13
|
+
float t = (approachRate == 0.0)
|
|
14
|
+
? NO_HIT
|
|
15
|
+
: distance / approachRate;
|
|
16
|
+
|
|
17
|
+
return vec4(planeNormal, 0.0, t);
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
RayShapeIntersection intersectHalfSpace(in Ray ray, in float angle, in bool positiveNormal)
|
|
21
|
+
{
|
|
22
|
+
vec4 intersection = intersectLongitude(ray, angle, positiveNormal);
|
|
23
|
+
vec4 farSide = vec4(normalize(ray.dir), INF_HIT);
|
|
24
|
+
|
|
25
|
+
bool hitFront = (intersection.w > 0.0) == (dot(ray.pos.xy, intersection.xy) > 0.0);
|
|
26
|
+
if (!hitFront) {
|
|
27
|
+
return RayShapeIntersection(intersection, farSide);
|
|
28
|
+
} else {
|
|
29
|
+
return RayShapeIntersection(-1.0 * farSide, intersection);
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
void intersectFlippedWedge(in Ray ray, in vec2 minMaxAngle, out RayShapeIntersection intersections[2])
|
|
34
|
+
{
|
|
35
|
+
intersections[0] = intersectHalfSpace(ray, minMaxAngle.x, false);
|
|
36
|
+
intersections[1] = intersectHalfSpace(ray, minMaxAngle.y, true);
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
bool hitPositiveHalfPlane(in Ray ray, in vec4 intersection, in bool positiveNormal) {
|
|
40
|
+
float normalSign = positiveNormal ? 1.0 : -1.0;
|
|
41
|
+
vec2 planeDirection = vec2(intersection.y, -intersection.x) * normalSign;
|
|
42
|
+
vec2 hit = ray.pos.xy + intersection.w * ray.dir.xy;
|
|
43
|
+
return dot(hit, planeDirection) > 0.0;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
void intersectHalfPlane(in Ray ray, in float angle, out RayShapeIntersection intersections[2]) {
|
|
47
|
+
vec4 intersection = intersectLongitude(ray, angle, true);
|
|
48
|
+
vec4 farSide = vec4(normalize(ray.dir), INF_HIT);
|
|
49
|
+
|
|
50
|
+
if (hitPositiveHalfPlane(ray, intersection, true)) {
|
|
51
|
+
intersections[0].entry = -1.0 * farSide;
|
|
52
|
+
intersections[0].exit = vec4(-1.0 * intersection.xy, 0.0, intersection.w);
|
|
53
|
+
intersections[1].entry = intersection;
|
|
54
|
+
intersections[1].exit = farSide;
|
|
55
|
+
} else {
|
|
56
|
+
vec4 miss = vec4(normalize(ray.dir), NO_HIT);
|
|
57
|
+
intersections[0].entry = -1.0 * farSide;
|
|
58
|
+
intersections[0].exit = farSide;
|
|
59
|
+
intersections[1].entry = miss;
|
|
60
|
+
intersections[1].exit = miss;
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
RayShapeIntersection intersectRegularWedge(in Ray ray, in vec2 minMaxAngle)
|
|
65
|
+
{
|
|
66
|
+
// Note: works for maxAngle > minAngle + pi, where the "regular wedge"
|
|
67
|
+
// is actually a negative volume.
|
|
68
|
+
// Compute intersections with the two planes.
|
|
69
|
+
// Normals will point toward the "outside" (negative space)
|
|
70
|
+
vec4 intersect1 = intersectLongitude(ray, minMaxAngle.x, false);
|
|
71
|
+
vec4 intersect2 = intersectLongitude(ray, minMaxAngle.y, true);
|
|
72
|
+
|
|
73
|
+
// Choose intersection with smallest T as the "first", the other as "last"
|
|
74
|
+
// Note: first or last could be in the "shadow" wedge, beyond the tip
|
|
75
|
+
bool inOrder = intersect1.w <= intersect2.w;
|
|
76
|
+
vec4 first = inOrder ? intersect1 : intersect2;
|
|
77
|
+
vec4 last = inOrder ? intersect2 : intersect1;
|
|
78
|
+
|
|
79
|
+
bool firstIsAhead = first.w >= 0.0;
|
|
80
|
+
bool startedInsideFirst = dot(ray.pos.xy, first.xy) < 0.0;
|
|
81
|
+
bool exitFromInside = firstIsAhead == startedInsideFirst;
|
|
82
|
+
bool lastIsAhead = last.w > 0.0;
|
|
83
|
+
bool startedOutsideLast = dot(ray.pos.xy, last.xy) >= 0.0;
|
|
84
|
+
bool enterFromOutside = lastIsAhead == startedOutsideLast;
|
|
85
|
+
|
|
86
|
+
vec4 farSide = vec4(normalize(ray.dir), INF_HIT);
|
|
87
|
+
vec4 miss = vec4(normalize(ray.dir), NO_HIT);
|
|
88
|
+
|
|
89
|
+
if (exitFromInside && enterFromOutside) {
|
|
90
|
+
// Ray crosses both faces of negative wedge, exiting then entering the positive shape
|
|
91
|
+
return RayShapeIntersection(first, last);
|
|
92
|
+
} else if (!exitFromInside && enterFromOutside) {
|
|
93
|
+
// Ray starts inside wedge. last is in shadow wedge, and first is actually the entry
|
|
94
|
+
return RayShapeIntersection(-1.0 * farSide, first);
|
|
95
|
+
} else if (exitFromInside && !enterFromOutside) {
|
|
96
|
+
// First intersection was in the shadow wedge, so last is actually the exit
|
|
97
|
+
return RayShapeIntersection(last, farSide);
|
|
98
|
+
} else { // !exitFromInside && !enterFromOutside
|
|
99
|
+
// Both intersections were in the shadow wedge
|
|
100
|
+
return RayShapeIntersection(miss, miss);
|
|
101
|
+
}
|
|
102
|
+
}
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
//This file is automatically rebuilt by the Cesium build process.
|
|
2
|
+
export default "// See IntersectionUtils.glsl for the definitions of Ray, NO_HIT, INF_HIT,\n\
|
|
3
|
+
// RayShapeIntersection\n\
|
|
4
|
+
\n\
|
|
5
|
+
vec4 intersectLongitude(in Ray ray, in float angle, in bool positiveNormal) {\n\
|
|
6
|
+
float normalSign = positiveNormal ? 1.0 : -1.0;\n\
|
|
7
|
+
vec2 planeNormal = vec2(-sin(angle), cos(angle)) * normalSign;\n\
|
|
8
|
+
\n\
|
|
9
|
+
vec2 position = ray.pos.xy;\n\
|
|
10
|
+
vec2 direction = ray.dir.xy;\n\
|
|
11
|
+
float approachRate = dot(direction, planeNormal);\n\
|
|
12
|
+
float distance = -dot(position, planeNormal);\n\
|
|
13
|
+
\n\
|
|
14
|
+
float t = (approachRate == 0.0)\n\
|
|
15
|
+
? NO_HIT\n\
|
|
16
|
+
: distance / approachRate;\n\
|
|
17
|
+
\n\
|
|
18
|
+
return vec4(planeNormal, 0.0, t);\n\
|
|
19
|
+
}\n\
|
|
20
|
+
\n\
|
|
21
|
+
RayShapeIntersection intersectHalfSpace(in Ray ray, in float angle, in bool positiveNormal)\n\
|
|
22
|
+
{\n\
|
|
23
|
+
vec4 intersection = intersectLongitude(ray, angle, positiveNormal);\n\
|
|
24
|
+
vec4 farSide = vec4(normalize(ray.dir), INF_HIT);\n\
|
|
25
|
+
\n\
|
|
26
|
+
bool hitFront = (intersection.w > 0.0) == (dot(ray.pos.xy, intersection.xy) > 0.0);\n\
|
|
27
|
+
if (!hitFront) {\n\
|
|
28
|
+
return RayShapeIntersection(intersection, farSide);\n\
|
|
29
|
+
} else {\n\
|
|
30
|
+
return RayShapeIntersection(-1.0 * farSide, intersection);\n\
|
|
31
|
+
}\n\
|
|
32
|
+
}\n\
|
|
33
|
+
\n\
|
|
34
|
+
void intersectFlippedWedge(in Ray ray, in vec2 minMaxAngle, out RayShapeIntersection intersections[2])\n\
|
|
35
|
+
{\n\
|
|
36
|
+
intersections[0] = intersectHalfSpace(ray, minMaxAngle.x, false);\n\
|
|
37
|
+
intersections[1] = intersectHalfSpace(ray, minMaxAngle.y, true);\n\
|
|
38
|
+
}\n\
|
|
39
|
+
\n\
|
|
40
|
+
bool hitPositiveHalfPlane(in Ray ray, in vec4 intersection, in bool positiveNormal) {\n\
|
|
41
|
+
float normalSign = positiveNormal ? 1.0 : -1.0;\n\
|
|
42
|
+
vec2 planeDirection = vec2(intersection.y, -intersection.x) * normalSign;\n\
|
|
43
|
+
vec2 hit = ray.pos.xy + intersection.w * ray.dir.xy;\n\
|
|
44
|
+
return dot(hit, planeDirection) > 0.0;\n\
|
|
45
|
+
}\n\
|
|
46
|
+
\n\
|
|
47
|
+
void intersectHalfPlane(in Ray ray, in float angle, out RayShapeIntersection intersections[2]) {\n\
|
|
48
|
+
vec4 intersection = intersectLongitude(ray, angle, true);\n\
|
|
49
|
+
vec4 farSide = vec4(normalize(ray.dir), INF_HIT);\n\
|
|
50
|
+
\n\
|
|
51
|
+
if (hitPositiveHalfPlane(ray, intersection, true)) {\n\
|
|
52
|
+
intersections[0].entry = -1.0 * farSide;\n\
|
|
53
|
+
intersections[0].exit = vec4(-1.0 * intersection.xy, 0.0, intersection.w);\n\
|
|
54
|
+
intersections[1].entry = intersection;\n\
|
|
55
|
+
intersections[1].exit = farSide;\n\
|
|
56
|
+
} else {\n\
|
|
57
|
+
vec4 miss = vec4(normalize(ray.dir), NO_HIT);\n\
|
|
58
|
+
intersections[0].entry = -1.0 * farSide;\n\
|
|
59
|
+
intersections[0].exit = farSide;\n\
|
|
60
|
+
intersections[1].entry = miss;\n\
|
|
61
|
+
intersections[1].exit = miss;\n\
|
|
62
|
+
}\n\
|
|
63
|
+
}\n\
|
|
64
|
+
\n\
|
|
65
|
+
RayShapeIntersection intersectRegularWedge(in Ray ray, in vec2 minMaxAngle)\n\
|
|
66
|
+
{\n\
|
|
67
|
+
// Note: works for maxAngle > minAngle + pi, where the \"regular wedge\"\n\
|
|
68
|
+
// is actually a negative volume.\n\
|
|
69
|
+
// Compute intersections with the two planes.\n\
|
|
70
|
+
// Normals will point toward the \"outside\" (negative space)\n\
|
|
71
|
+
vec4 intersect1 = intersectLongitude(ray, minMaxAngle.x, false);\n\
|
|
72
|
+
vec4 intersect2 = intersectLongitude(ray, minMaxAngle.y, true);\n\
|
|
73
|
+
\n\
|
|
74
|
+
// Choose intersection with smallest T as the \"first\", the other as \"last\"\n\
|
|
75
|
+
// Note: first or last could be in the \"shadow\" wedge, beyond the tip\n\
|
|
76
|
+
bool inOrder = intersect1.w <= intersect2.w;\n\
|
|
77
|
+
vec4 first = inOrder ? intersect1 : intersect2;\n\
|
|
78
|
+
vec4 last = inOrder ? intersect2 : intersect1;\n\
|
|
79
|
+
\n\
|
|
80
|
+
bool firstIsAhead = first.w >= 0.0;\n\
|
|
81
|
+
bool startedInsideFirst = dot(ray.pos.xy, first.xy) < 0.0;\n\
|
|
82
|
+
bool exitFromInside = firstIsAhead == startedInsideFirst;\n\
|
|
83
|
+
bool lastIsAhead = last.w > 0.0;\n\
|
|
84
|
+
bool startedOutsideLast = dot(ray.pos.xy, last.xy) >= 0.0;\n\
|
|
85
|
+
bool enterFromOutside = lastIsAhead == startedOutsideLast;\n\
|
|
86
|
+
\n\
|
|
87
|
+
vec4 farSide = vec4(normalize(ray.dir), INF_HIT);\n\
|
|
88
|
+
vec4 miss = vec4(normalize(ray.dir), NO_HIT);\n\
|
|
89
|
+
\n\
|
|
90
|
+
if (exitFromInside && enterFromOutside) {\n\
|
|
91
|
+
// Ray crosses both faces of negative wedge, exiting then entering the positive shape\n\
|
|
92
|
+
return RayShapeIntersection(first, last);\n\
|
|
93
|
+
} else if (!exitFromInside && enterFromOutside) {\n\
|
|
94
|
+
// Ray starts inside wedge. last is in shadow wedge, and first is actually the entry\n\
|
|
95
|
+
return RayShapeIntersection(-1.0 * farSide, first);\n\
|
|
96
|
+
} else if (exitFromInside && !enterFromOutside) {\n\
|
|
97
|
+
// First intersection was in the shadow wedge, so last is actually the exit\n\
|
|
98
|
+
return RayShapeIntersection(last, farSide);\n\
|
|
99
|
+
} else { // !exitFromInside && !enterFromOutside\n\
|
|
100
|
+
// Both intersections were in the shadow wedge\n\
|
|
101
|
+
return RayShapeIntersection(miss, miss);\n\
|
|
102
|
+
}\n\
|
|
103
|
+
}\n\
|
|
104
|
+
";
|
|
@@ -9,7 +9,11 @@
|
|
|
9
9
|
// See Megatexture.glsl for the definition of accumulatePropertiesFromMegatexture
|
|
10
10
|
|
|
11
11
|
#define STEP_COUNT_MAX 1000 // Harcoded value because GLSL doesn't like variable length loops
|
|
12
|
-
#
|
|
12
|
+
#if defined(PICKING_VOXEL)
|
|
13
|
+
#define ALPHA_ACCUM_MAX 0.1
|
|
14
|
+
#else
|
|
15
|
+
#define ALPHA_ACCUM_MAX 0.98 // Must be > 0.0 and <= 1.0
|
|
16
|
+
#endif
|
|
13
17
|
|
|
14
18
|
uniform mat3 u_transformDirectionViewToLocal;
|
|
15
19
|
uniform vec3 u_cameraPositionUv;
|
|
@@ -42,6 +46,30 @@ vec4 getStepSize(in SampleData sampleData, in Ray viewRay, in RayShapeIntersecti
|
|
|
42
46
|
#endif
|
|
43
47
|
}
|
|
44
48
|
|
|
49
|
+
vec2 packIntToVec2(int value) {
|
|
50
|
+
float shifted = float(value) / 255.0;
|
|
51
|
+
float lowBits = fract(shifted);
|
|
52
|
+
float highBits = floor(shifted) / 255.0;
|
|
53
|
+
return vec2(highBits, lowBits);
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
vec2 packFloatToVec2(float value) {
|
|
57
|
+
float lowBits = fract(value);
|
|
58
|
+
float highBits = floor(value) / 255.0;
|
|
59
|
+
return vec2(highBits, lowBits);
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
int getSampleIndex(in vec3 tileUv) {
|
|
63
|
+
ivec3 voxelDimensions = u_dimensions;
|
|
64
|
+
vec3 tileCoordinate = clamp(tileUv, 0.0, 1.0) * vec3(voxelDimensions);
|
|
65
|
+
ivec3 tileIndex = ivec3(floor(tileCoordinate));
|
|
66
|
+
#if defined(PADDING)
|
|
67
|
+
voxelDimensions += u_paddingBefore + u_paddingAfter;
|
|
68
|
+
tileIndex += u_paddingBefore;
|
|
69
|
+
#endif
|
|
70
|
+
return tileIndex.x + voxelDimensions.x * (tileIndex.y + voxelDimensions.y * tileIndex.z);
|
|
71
|
+
}
|
|
72
|
+
|
|
45
73
|
void main()
|
|
46
74
|
{
|
|
47
75
|
vec4 fragCoord = gl_FragCoord;
|
|
@@ -102,6 +130,8 @@ void main()
|
|
|
102
130
|
fragmentInput.voxel.viewDirWorld = viewDirWorld;
|
|
103
131
|
fragmentInput.voxel.surfaceNormal = step.xyz;
|
|
104
132
|
fragmentInput.voxel.travelDistance = step.w;
|
|
133
|
+
fragmentInput.voxel.tileIndex = sampleDatas[0].megatextureIndex;
|
|
134
|
+
fragmentInput.voxel.sampleIndex = getSampleIndex(sampleDatas[0].tileUv);
|
|
105
135
|
|
|
106
136
|
// Run the custom shader
|
|
107
137
|
czm_modelMaterial materialOutput;
|
|
@@ -164,6 +194,14 @@ void main()
|
|
|
164
194
|
discard;
|
|
165
195
|
}
|
|
166
196
|
out_FragColor = u_pickColor;
|
|
197
|
+
#elif defined(PICKING_VOXEL)
|
|
198
|
+
// If alpha is 0.0 there is nothing to pick
|
|
199
|
+
if (colorAccum.a == 0.0) {
|
|
200
|
+
discard;
|
|
201
|
+
}
|
|
202
|
+
vec2 megatextureId = packIntToVec2(sampleDatas[0].megatextureIndex);
|
|
203
|
+
vec2 sampleIndex = packIntToVec2(getSampleIndex(sampleDatas[0].tileUv));
|
|
204
|
+
out_FragColor = vec4(megatextureId, sampleIndex);
|
|
167
205
|
#else
|
|
168
206
|
out_FragColor = colorAccum;
|
|
169
207
|
#endif
|
|
@@ -10,7 +10,11 @@ export default "// See Intersection.glsl for the definition of intersectScene\n\
|
|
|
10
10
|
// See Megatexture.glsl for the definition of accumulatePropertiesFromMegatexture\n\
|
|
11
11
|
\n\
|
|
12
12
|
#define STEP_COUNT_MAX 1000 // Harcoded value because GLSL doesn't like variable length loops\n\
|
|
13
|
-
#
|
|
13
|
+
#if defined(PICKING_VOXEL)\n\
|
|
14
|
+
#define ALPHA_ACCUM_MAX 0.1\n\
|
|
15
|
+
#else\n\
|
|
16
|
+
#define ALPHA_ACCUM_MAX 0.98 // Must be > 0.0 and <= 1.0\n\
|
|
17
|
+
#endif\n\
|
|
14
18
|
\n\
|
|
15
19
|
uniform mat3 u_transformDirectionViewToLocal;\n\
|
|
16
20
|
uniform vec3 u_cameraPositionUv;\n\
|
|
@@ -43,6 +47,30 @@ vec4 getStepSize(in SampleData sampleData, in Ray viewRay, in RayShapeIntersecti
|
|
|
43
47
|
#endif\n\
|
|
44
48
|
}\n\
|
|
45
49
|
\n\
|
|
50
|
+
vec2 packIntToVec2(int value) {\n\
|
|
51
|
+
float shifted = float(value) / 255.0;\n\
|
|
52
|
+
float lowBits = fract(shifted);\n\
|
|
53
|
+
float highBits = floor(shifted) / 255.0;\n\
|
|
54
|
+
return vec2(highBits, lowBits);\n\
|
|
55
|
+
}\n\
|
|
56
|
+
\n\
|
|
57
|
+
vec2 packFloatToVec2(float value) {\n\
|
|
58
|
+
float lowBits = fract(value);\n\
|
|
59
|
+
float highBits = floor(value) / 255.0;\n\
|
|
60
|
+
return vec2(highBits, lowBits);\n\
|
|
61
|
+
}\n\
|
|
62
|
+
\n\
|
|
63
|
+
int getSampleIndex(in vec3 tileUv) {\n\
|
|
64
|
+
ivec3 voxelDimensions = u_dimensions;\n\
|
|
65
|
+
vec3 tileCoordinate = clamp(tileUv, 0.0, 1.0) * vec3(voxelDimensions);\n\
|
|
66
|
+
ivec3 tileIndex = ivec3(floor(tileCoordinate));\n\
|
|
67
|
+
#if defined(PADDING)\n\
|
|
68
|
+
voxelDimensions += u_paddingBefore + u_paddingAfter;\n\
|
|
69
|
+
tileIndex += u_paddingBefore;\n\
|
|
70
|
+
#endif\n\
|
|
71
|
+
return tileIndex.x + voxelDimensions.x * (tileIndex.y + voxelDimensions.y * tileIndex.z);\n\
|
|
72
|
+
}\n\
|
|
73
|
+
\n\
|
|
46
74
|
void main()\n\
|
|
47
75
|
{\n\
|
|
48
76
|
vec4 fragCoord = gl_FragCoord;\n\
|
|
@@ -103,6 +131,8 @@ void main()\n\
|
|
|
103
131
|
fragmentInput.voxel.viewDirWorld = viewDirWorld;\n\
|
|
104
132
|
fragmentInput.voxel.surfaceNormal = step.xyz;\n\
|
|
105
133
|
fragmentInput.voxel.travelDistance = step.w;\n\
|
|
134
|
+
fragmentInput.voxel.tileIndex = sampleDatas[0].megatextureIndex;\n\
|
|
135
|
+
fragmentInput.voxel.sampleIndex = getSampleIndex(sampleDatas[0].tileUv);\n\
|
|
106
136
|
\n\
|
|
107
137
|
// Run the custom shader\n\
|
|
108
138
|
czm_modelMaterial materialOutput;\n\
|
|
@@ -165,6 +195,14 @@ void main()\n\
|
|
|
165
195
|
discard;\n\
|
|
166
196
|
}\n\
|
|
167
197
|
out_FragColor = u_pickColor;\n\
|
|
198
|
+
#elif defined(PICKING_VOXEL)\n\
|
|
199
|
+
// If alpha is 0.0 there is nothing to pick\n\
|
|
200
|
+
if (colorAccum.a == 0.0) {\n\
|
|
201
|
+
discard;\n\
|
|
202
|
+
}\n\
|
|
203
|
+
vec2 megatextureId = packIntToVec2(sampleDatas[0].megatextureIndex);\n\
|
|
204
|
+
vec2 sampleIndex = packIntToVec2(getSampleIndex(sampleDatas[0].tileUv));\n\
|
|
205
|
+
out_FragColor = vec4(megatextureId, sampleIndex);\n\
|
|
168
206
|
#else\n\
|
|
169
207
|
out_FragColor = colorAccum;\n\
|
|
170
208
|
#endif\n\
|
|
@@ -1,10 +1,7 @@
|
|
|
1
1
|
/* Cylinder defines (set in Scene/VoxelCylinderShape.js)
|
|
2
2
|
#define CYLINDER_HAS_SHAPE_BOUNDS_RADIUS
|
|
3
|
-
#define CYLINDER_HAS_SHAPE_BOUNDS_RADIUS_FLAT
|
|
4
3
|
#define CYLINDER_HAS_SHAPE_BOUNDS_HEIGHT
|
|
5
|
-
#define CYLINDER_HAS_SHAPE_BOUNDS_HEIGHT_FLAT
|
|
6
4
|
#define CYLINDER_HAS_SHAPE_BOUNDS_ANGLE
|
|
7
|
-
#define CYLINDER_HAS_SHAPE_BOUNDS_ANGLE_RANGE_EQUAL_ZERO
|
|
8
5
|
#define CYLINDER_HAS_SHAPE_BOUNDS_ANGLE_MIN_DISCONTINUITY
|
|
9
6
|
#define CYLINDER_HAS_SHAPE_BOUNDS_ANGLE_MAX_DISCONTINUITY
|
|
10
7
|
#define CYLINDER_HAS_SHAPE_BOUNDS_ANGLE_MIN_MAX_REVERSED
|
|
@@ -29,46 +26,31 @@
|
|
|
29
26
|
vec3 convertUvToShapeUvSpace(in vec3 positionUv) {
|
|
30
27
|
vec3 positionLocal = positionUv * 2.0 - 1.0; // [-1,+1]
|
|
31
28
|
|
|
32
|
-
//
|
|
33
|
-
#if defined(
|
|
34
|
-
|
|
35
|
-
#else
|
|
36
|
-
float radius = length(positionLocal.xy); // [0,1]
|
|
37
|
-
#if defined(CYLINDER_HAS_SHAPE_BOUNDS_RADIUS)
|
|
38
|
-
radius = radius * u_cylinderUvToShapeUvRadius.x + u_cylinderUvToShapeUvRadius.y; // x = scale, y = offset
|
|
39
|
-
#endif
|
|
29
|
+
float radius = length(positionLocal.xy); // [0,1]
|
|
30
|
+
#if defined(CYLINDER_HAS_SHAPE_BOUNDS_RADIUS)
|
|
31
|
+
radius = radius * u_cylinderUvToShapeUvRadius.x + u_cylinderUvToShapeUvRadius.y; // x = scale, y = offset
|
|
40
32
|
#endif
|
|
41
33
|
|
|
42
|
-
//
|
|
43
|
-
#if defined(
|
|
44
|
-
|
|
45
|
-
#else
|
|
46
|
-
float height = positionUv.z; // [0,1]
|
|
47
|
-
#if defined(CYLINDER_HAS_SHAPE_BOUNDS_HEIGHT)
|
|
48
|
-
height = height * u_cylinderUvToShapeUvHeight.x + u_cylinderUvToShapeUvHeight.y; // x = scale, y = offset
|
|
49
|
-
#endif
|
|
34
|
+
float height = positionUv.z; // [0,1]
|
|
35
|
+
#if defined(CYLINDER_HAS_SHAPE_BOUNDS_HEIGHT)
|
|
36
|
+
height = height * u_cylinderUvToShapeUvHeight.x + u_cylinderUvToShapeUvHeight.y; // x = scale, y = offset
|
|
50
37
|
#endif
|
|
51
38
|
|
|
52
|
-
//
|
|
53
|
-
#if defined(
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
#
|
|
58
|
-
#if defined(CYLINDER_HAS_SHAPE_BOUNDS_ANGLE_MIN_MAX_REVERSED)
|
|
59
|
-
// Comparing against u_cylinderShapeUvAngleMinMax has precision problems. u_cylinderShapeUvAngleRangeZeroMid is more conservative.
|
|
60
|
-
angle += float(angle < u_cylinderShapeUvAngleRangeZeroMid);
|
|
61
|
-
#endif
|
|
62
|
-
|
|
63
|
-
// Avoid flickering from reading voxels from both sides of the -pi/+pi discontinuity.
|
|
64
|
-
#if defined(CYLINDER_HAS_SHAPE_BOUNDS_ANGLE_MIN_DISCONTINUITY)
|
|
65
|
-
angle = angle > u_cylinderShapeUvAngleRangeZeroMid ? u_cylinderShapeUvAngleMinMax.x : angle;
|
|
66
|
-
#elif defined(CYLINDER_HAS_SHAPE_BOUNDS_ANGLE_MAX_DISCONTINUITY)
|
|
67
|
-
angle = angle < u_cylinderShapeUvAngleRangeZeroMid ? u_cylinderShapeUvAngleMinMax.y : angle;
|
|
68
|
-
#endif
|
|
39
|
+
float angle = (atan(positionLocal.y, positionLocal.x) + czm_pi) / czm_twoPi; // [0,1]
|
|
40
|
+
#if defined(CYLINDER_HAS_SHAPE_BOUNDS_ANGLE)
|
|
41
|
+
#if defined(CYLINDER_HAS_SHAPE_BOUNDS_ANGLE_MIN_MAX_REVERSED)
|
|
42
|
+
// Comparing against u_cylinderShapeUvAngleMinMax has precision problems. u_cylinderShapeUvAngleRangeZeroMid is more conservative.
|
|
43
|
+
angle += float(angle < u_cylinderShapeUvAngleRangeZeroMid);
|
|
44
|
+
#endif
|
|
69
45
|
|
|
70
|
-
|
|
46
|
+
// Avoid flickering from reading voxels from both sides of the -pi/+pi discontinuity.
|
|
47
|
+
#if defined(CYLINDER_HAS_SHAPE_BOUNDS_ANGLE_MIN_DISCONTINUITY)
|
|
48
|
+
angle = angle > u_cylinderShapeUvAngleRangeZeroMid ? u_cylinderShapeUvAngleMinMax.x : angle;
|
|
49
|
+
#elif defined(CYLINDER_HAS_SHAPE_BOUNDS_ANGLE_MAX_DISCONTINUITY)
|
|
50
|
+
angle = angle < u_cylinderShapeUvAngleRangeZeroMid ? u_cylinderShapeUvAngleMinMax.y : angle;
|
|
71
51
|
#endif
|
|
52
|
+
|
|
53
|
+
angle = angle * u_cylinderUvToShapeUvAngle.x + u_cylinderUvToShapeUvAngle.y; // x = scale, y = offset
|
|
72
54
|
#endif
|
|
73
55
|
|
|
74
56
|
return vec3(radius, height, angle);
|