@cesium/engine 7.0.0 → 9.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 +1 -5
- package/Build/Workers/{chunk-7XEAYGZK.js → chunk-24YTYWNB.js} +10 -10
- package/Build/Workers/{chunk-IQBYFRVW.js → chunk-2632RVPI.js} +7 -7
- package/Build/Workers/chunk-2KACWKS4.js +501 -0
- package/Build/Workers/{chunk-QZAD5O7I.js → chunk-2XPLH3JY.js} +7 -7
- package/Build/Workers/{chunk-JY5YEZFA.js → chunk-2ZBL3MVO.js} +8 -8
- package/Build/Workers/{chunk-ZK5JOS3D.js → chunk-3NCVAGDA.js} +14 -14
- package/Build/Workers/{chunk-AR5DNBJ4.js → chunk-5R6VWLMH.js} +6 -6
- package/Build/Workers/{chunk-PTQQUQC3.js → chunk-5TIV3L26.js} +13 -13
- package/Build/Workers/{chunk-BZP4T2JJ.js → chunk-6WF3KIF5.js} +10 -10
- package/Build/Workers/{chunk-5WQ523AW.js → chunk-73FKKY52.js} +5 -5
- package/Build/Workers/{chunk-F6SE42BK.js → chunk-7COR472O.js} +15 -472
- package/Build/Workers/{chunk-72SANQJV.js → chunk-ADOVHYWO.js} +9 -5
- package/Build/Workers/{chunk-5YLJ77FF.js → chunk-BCU2LH5T.js} +12 -11
- package/Build/Workers/{chunk-4EBHOMFX.js → chunk-C3XBUYBO.js} +17 -17
- package/Build/Workers/{chunk-IX2JCCNM.js → chunk-C6OI26DR.js} +1 -1
- package/Build/Workers/{chunk-2HJWSU7B.js → chunk-CO35JNNE.js} +4 -4
- package/Build/Workers/{chunk-OVLG3FRS.js → chunk-DGDUKCJJ.js} +6 -6
- package/Build/Workers/{chunk-DTAIXKTO.js → chunk-DPUSFA7S.js} +6 -6
- package/Build/Workers/{chunk-R5X4OQT4.js → chunk-E6WXPSJS.js} +7 -7
- package/Build/Workers/{chunk-VK3EJHWI.js → chunk-EOXYZ34O.js} +2 -2
- package/Build/Workers/{chunk-RAEV7K66.js → chunk-EPKE7GE3.js} +5 -5
- package/Build/Workers/{chunk-GV56Q4LU.js → chunk-GFA4SMXV.js} +11 -11
- package/Build/Workers/{chunk-NKPBIX7F.js → chunk-GXUXEOE2.js} +1 -1
- package/Build/Workers/{chunk-NY3K4IM3.js → chunk-HBQPB6IH.js} +12 -12
- package/Build/Workers/{chunk-6HZQPRUS.js → chunk-I37B3MZ2.js} +1 -1
- package/Build/Workers/{chunk-VRGFV2UO.js → chunk-L4BW3RUA.js} +10 -10
- package/Build/Workers/{chunk-6VJVYK2V.js → chunk-LAQP3SCC.js} +2 -2
- package/Build/Workers/{chunk-PNBGBETF.js → chunk-LQJ5FFFR.js} +10 -10
- package/Build/Workers/{chunk-UAEW6HKG.js → chunk-M2AYBTNH.js} +13 -13
- package/Build/Workers/{chunk-YUCVWAY6.js → chunk-MWV7IZK4.js} +7 -7
- package/Build/Workers/{chunk-JXDC723O.js → chunk-N4KXMWQU.js} +2 -2
- package/Build/Workers/{chunk-XWXM2O2R.js → chunk-NP2GYYE5.js} +6 -6
- package/Build/Workers/{chunk-GEJTYLCO.js → chunk-NZWNZA6S.js} +5 -5
- package/Build/Workers/{chunk-LZGHD6NY.js → chunk-P2YAAMT2.js} +15 -15
- package/Build/Workers/{chunk-S6SKF6DT.js → chunk-P4XKB3QZ.js} +5 -5
- package/Build/Workers/{chunk-U2VCRRQW.js → chunk-PXB7T27O.js} +6 -6
- package/Build/Workers/{chunk-RV7ZYPFT.js → chunk-QCQUZGXI.js} +4 -4
- package/Build/Workers/{chunk-JJ4VBOQ3.js → chunk-QKBGRKKG.js} +4 -4
- package/Build/Workers/{chunk-ODW7WYM4.js → chunk-RMOEYCZW.js} +2 -2
- package/Build/Workers/{chunk-ZUA2UUNV.js → chunk-RSJXEO2A.js} +2 -2
- package/Build/Workers/{chunk-UDO6BFSF.js → chunk-RV7ZOSS6.js} +13 -13
- package/Build/Workers/{chunk-LZ7JIV3K.js → chunk-SE4PXOEA.js} +17 -17
- package/Build/Workers/{chunk-S4MAZ3SS.js → chunk-SS4ESNE3.js} +2 -2
- package/Build/Workers/{chunk-AIPU2VSX.js → chunk-TJBU6GML.js} +6 -6
- package/Build/Workers/{chunk-5M3U6ZMA.js → chunk-TZORKRNK.js} +1 -1
- package/Build/Workers/{chunk-MY3VNFGQ.js → chunk-VR5RBW52.js} +7 -7
- package/Build/Workers/{chunk-FP6GYBFX.js → chunk-WHUSTDIB.js} +10 -10
- package/Build/Workers/{chunk-5HDYHG3F.js → chunk-X2F6BEPY.js} +13 -13
- package/Build/Workers/{chunk-WZU2YLWG.js → chunk-X6XOMPWL.js} +3 -3
- package/Build/Workers/{chunk-UGK3FCDY.js → chunk-YDVSBWEO.js} +1 -1
- package/Build/Workers/{chunk-46UD5ABS.js → chunk-YV4H2Y7M.js} +4 -4
- package/Build/Workers/{chunk-WBQCVXR3.js → chunk-Z7FQLK6N.js} +4 -4
- package/Build/Workers/{chunk-L2ZN645J.js → chunk-ZNVSKMQ2.js} +6 -6
- package/Build/Workers/{chunk-JCNXK6EL.js → chunk-ZYPTP7GS.js} +11 -11
- 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 +33 -32
- 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/Check.d.ts +127 -0
- package/Source/Core/Check.js +0 -1
- package/Source/Core/Ellipsoid.js +6 -0
- package/Source/Core/Geometry.js +1 -1
- 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 +1 -1
- package/Source/Core/Transforms.js +3 -0
- package/Source/Core/VerticalExaggeration.js +2 -1
- 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/Billboard.js +32 -0
- package/Source/Scene/BillboardCollection.js +1 -1
- package/Source/Scene/BingMapsImageryProvider.js +4 -0
- package/Source/Scene/Camera.js +46 -4
- package/Source/Scene/Cesium3DTilesVoxelProvider.js +2 -9
- package/Source/Scene/Cesium3DTileset.js +10 -7
- package/Source/Scene/Cesium3DTilesetBaseTraversal.js +2 -4
- package/Source/Scene/FrameState.js +5 -0
- package/Source/Scene/Globe.js +0 -67
- 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/Label.js +33 -0
- package/Source/Scene/LabelCollection.js +2 -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 -5
- 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 +67 -6
- package/Source/Scene/VoxelCell.js +273 -0
- package/Source/Scene/VoxelCylinderShape.js +117 -163
- package/Source/Scene/VoxelEllipsoidShape.js +255 -304
- package/Source/Scene/VoxelPrimitive.js +109 -15
- package/Source/Scene/VoxelRenderResources.js +12 -3
- package/Source/Scene/VoxelShape.js +7 -4
- 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 +3 -0
- package/Source/Shaders/Voxels/IntersectBox.glsl +21 -47
- package/Source/Shaders/Voxels/IntersectBox.js +21 -47
- package/Source/Shaders/Voxels/IntersectClippingPlanes.glsl +1 -1
- package/Source/Shaders/Voxels/IntersectClippingPlanes.js +1 -1
- package/Source/Shaders/Voxels/IntersectCylinder.glsl +76 -203
- package/Source/Shaders/Voxels/IntersectCylinder.js +76 -203
- package/Source/Shaders/Voxels/IntersectEllipsoid.glsl +220 -229
- package/Source/Shaders/Voxels/IntersectEllipsoid.js +220 -229
- package/Source/Shaders/Voxels/IntersectLongitude.glsl +102 -0
- package/Source/Shaders/Voxels/IntersectLongitude.js +104 -0
- package/Source/Shaders/Voxels/IntersectionUtils.glsl +33 -11
- package/Source/Shaders/Voxels/IntersectionUtils.js +33 -11
- package/Source/Shaders/Voxels/Megatexture.glsl +1 -2
- package/Source/Shaders/Voxels/Megatexture.js +1 -2
- package/Source/Shaders/Voxels/Octree.glsl +14 -9
- package/Source/Shaders/Voxels/Octree.js +14 -9
- package/Source/Shaders/Voxels/VoxelFS.glsl +128 -40
- package/Source/Shaders/Voxels/VoxelFS.js +128 -40
- package/Source/Shaders/Voxels/VoxelUtils.glsl +31 -0
- package/Source/Shaders/Voxels/VoxelUtils.js +33 -0
- package/Source/Shaders/Voxels/convertUvToBox.glsl +24 -3
- package/Source/Shaders/Voxels/convertUvToBox.js +24 -4
- package/Source/Shaders/Voxels/convertUvToCylinder.glsl +64 -40
- package/Source/Shaders/Voxels/convertUvToCylinder.js +64 -40
- package/Source/Shaders/Voxels/convertUvToEllipsoid.glsl +100 -91
- package/Source/Shaders/Voxels/convertUvToEllipsoid.js +100 -91
- package/Source/ThirdParty/Workers/z-worker-pako.js +1 -1
- package/Source/Workers/createGeometry.js +40 -11
- package/Source/Workers/decodeI3S.js +720 -94
- package/index.d.ts +542 -40
- package/index.js +75 -66
- package/package.json +2 -2
|
@@ -1,23 +1,20 @@
|
|
|
1
1
|
//This file is automatically rebuilt by the Cesium build process.
|
|
2
|
-
export default "// See IntersectionUtils.glsl for the definitions of Ray, Intersections,\n\
|
|
3
|
-
//
|
|
2
|
+
export default "// See IntersectionUtils.glsl for the definitions of Ray, NO_HIT, INF_HIT, Intersections,\n\
|
|
3
|
+
// RayShapeIntersection, setSurfaceIntersection, setShapeIntersection\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\
|
|
15
15
|
#define ELLIPSOID_HAS_RENDER_BOUNDS_LATITUDE_MIN_UNDER_HALF\n\
|
|
16
16
|
#define ELLIPSOID_HAS_RENDER_BOUNDS_LATITUDE_MIN_EQUAL_HALF\n\
|
|
17
17
|
#define ELLIPSOID_HAS_RENDER_BOUNDS_LATITUDE_MIN_OVER_HALF\n\
|
|
18
|
-
#define ELLIPSOID_HAS_RENDER_BOUNDS_HEIGHT_MAX\n\
|
|
19
|
-
#define ELLIPSOID_HAS_RENDER_BOUNDS_HEIGHT_MIN\n\
|
|
20
|
-
#define ELLIPSOID_HAS_RENDER_BOUNDS_HEIGHT_FLAT\n\
|
|
21
18
|
#define ELLIPSOID_INTERSECTION_INDEX_LONGITUDE\n\
|
|
22
19
|
#define ELLIPSOID_INTERSECTION_INDEX_LATITUDE_MAX\n\
|
|
23
20
|
#define ELLIPSOID_INTERSECTION_INDEX_LATITUDE_MIN\n\
|
|
@@ -28,205 +25,225 @@ export default "// See IntersectionUtils.glsl for the definitions of Ray, Inters
|
|
|
28
25
|
#if defined(ELLIPSOID_HAS_RENDER_BOUNDS_LONGITUDE)\n\
|
|
29
26
|
uniform vec2 u_ellipsoidRenderLongitudeMinMax;\n\
|
|
30
27
|
#endif\n\
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
#if defined(ELLIPSOID_HAS_RENDER_BOUNDS_HEIGHT_MAX)\n\
|
|
35
|
-
uniform float u_ellipsoidInverseOuterScaleUv;\n\
|
|
36
|
-
#endif\n\
|
|
37
|
-
#if defined(ELLIPSOID_HAS_RENDER_BOUNDS_HEIGHT_MIN)\n\
|
|
38
|
-
uniform float u_ellipsoidInverseInnerScaleUv;\n\
|
|
39
|
-
#endif\n\
|
|
40
|
-
\n\
|
|
41
|
-
vec2 intersectZPlane(Ray ray)\n\
|
|
42
|
-
{\n\
|
|
43
|
-
float o = ray.pos.z;\n\
|
|
44
|
-
float d = ray.dir.z;\n\
|
|
45
|
-
float t = -o / d;\n\
|
|
46
|
-
float s = sign(o);\n\
|
|
47
|
-
\n\
|
|
48
|
-
if (t >= 0.0 != s >= 0.0) return vec2(t, +INF_HIT);\n\
|
|
49
|
-
else return vec2(-INF_HIT, t);\n\
|
|
50
|
-
}\n\
|
|
51
|
-
\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\
|
|
28
|
+
uniform float u_eccentricitySquared;\n\
|
|
29
|
+
uniform vec2 u_ellipsoidRenderLatitudeSinMinMax;\n\
|
|
30
|
+
uniform vec2 u_clipMinMaxHeight;\n\
|
|
57
31
|
\n\
|
|
58
|
-
|
|
59
|
-
float
|
|
60
|
-
float t = -a / b;\n\
|
|
32
|
+
RayShapeIntersection intersectZPlane(in Ray ray, in float z) {\n\
|
|
33
|
+
float t = -ray.pos.z / ray.dir.z;\n\
|
|
61
34
|
\n\
|
|
62
|
-
|
|
63
|
-
bool
|
|
64
|
-
if (outside) return vec4(-INF_HIT, +INF_HIT, NO_HIT, NO_HIT);\n\
|
|
35
|
+
bool startsOutside = sign(ray.pos.z) == sign(z);\n\
|
|
36
|
+
bool entry = (t >= 0.0) != startsOutside;\n\
|
|
65
37
|
\n\
|
|
66
|
-
|
|
67
|
-
|
|
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\
|
|
38
|
+
vec4 intersect = vec4(0.0, 0.0, z, t);\n\
|
|
39
|
+
vec4 farSide = vec4(normalize(ray.dir), INF_HIT);\n\
|
|
79
40
|
\n\
|
|
80
|
-
if (
|
|
81
|
-
|
|
41
|
+
if (entry) {\n\
|
|
42
|
+
return RayShapeIntersection(intersect, farSide);\n\
|
|
43
|
+
} else {\n\
|
|
44
|
+
return RayShapeIntersection(-1.0 * farSide, intersect);\n\
|
|
45
|
+
}\n\
|
|
82
46
|
}\n\
|
|
83
47
|
\n\
|
|
84
|
-
|
|
48
|
+
RayShapeIntersection intersectHeight(in Ray ray, in float relativeHeight, in bool convex)\n\
|
|
85
49
|
{\n\
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
float
|
|
93
|
-
float
|
|
94
|
-
float
|
|
50
|
+
// Scale the ray by the ellipsoid axes to make it a unit sphere\n\
|
|
51
|
+
// Note: approximating ellipsoid + height as an ellipsoid\n\
|
|
52
|
+
vec3 radiiCorrection = u_ellipsoidRadiiUv / (u_ellipsoidRadiiUv + relativeHeight);\n\
|
|
53
|
+
vec3 position = ray.pos * radiiCorrection;\n\
|
|
54
|
+
vec3 direction = ray.dir * radiiCorrection;\n\
|
|
55
|
+
\n\
|
|
56
|
+
float a = dot(direction, direction); // ~ 1.0 (or maybe 4.0 if ray is scaled)\n\
|
|
57
|
+
float b = dot(direction, position); // roughly inside [-1.0, 1.0] when zoomed in\n\
|
|
58
|
+
float c = dot(position, position) - 1.0; // ~ 0.0 when zoomed in.\n\
|
|
59
|
+
float determinant = b * b - a * c; // ~ b * b when zoomed in\n\
|
|
60
|
+
\n\
|
|
61
|
+
if (determinant < 0.0) {\n\
|
|
62
|
+
vec4 miss = vec4(normalize(direction), NO_HIT);\n\
|
|
63
|
+
return RayShapeIntersection(miss, miss);\n\
|
|
64
|
+
}\n\
|
|
95
65
|
\n\
|
|
96
|
-
|
|
97
|
-
float t2 = -a2 / b2;\n\
|
|
98
|
-
float s1 = sign(a1);\n\
|
|
99
|
-
float s2 = sign(a2);\n\
|
|
66
|
+
determinant = sqrt(determinant);\n\
|
|
100
67
|
\n\
|
|
68
|
+
// Compute larger root using standard formula\n\
|
|
69
|
+
float signB = b < 0.0 ? -1.0 : 1.0;\n\
|
|
70
|
+
// The other root may suffer from subtractive cancellation in the standard formula.\n\
|
|
71
|
+
// Compute it from the first root instead.\n\
|
|
72
|
+
float t1 = (-b - signB * determinant) / a;\n\
|
|
73
|
+
float t2 = c / (a * t1);\n\
|
|
101
74
|
float tmin = min(t1, t2);\n\
|
|
102
75
|
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
76
|
\n\
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
return vec4(
|
|
77
|
+
float directionScale = convex ? 1.0 : -1.0;\n\
|
|
78
|
+
vec3 d1 = directionScale * normalize(position + tmin * direction);\n\
|
|
79
|
+
vec3 d2 = directionScale * normalize(position + tmax * direction);\n\
|
|
80
|
+
\n\
|
|
81
|
+
return RayShapeIntersection(vec4(d1, tmin), vec4(d2, tmax));\n\
|
|
122
82
|
}\n\
|
|
123
83
|
\n\
|
|
124
|
-
|
|
84
|
+
/**\n\
|
|
85
|
+
* Given a circular cone around the z-axis, with apex at the origin,\n\
|
|
86
|
+
* find the parametric distance(s) along a ray where that ray intersects\n\
|
|
87
|
+
* the cone.\n\
|
|
88
|
+
* The cone opening angle is described by the squared cosine of\n\
|
|
89
|
+
* its half-angle (the angle between the Z-axis and the surface)\n\
|
|
90
|
+
*/\n\
|
|
91
|
+
vec2 intersectDoubleEndedCone(in Ray ray, in float cosSqrHalfAngle)\n\
|
|
125
92
|
{\n\
|
|
126
93
|
vec3 o = ray.pos;\n\
|
|
127
94
|
vec3 d = ray.dir;\n\
|
|
95
|
+
float sinSqrHalfAngle = 1.0 - cosSqrHalfAngle;\n\
|
|
128
96
|
\n\
|
|
129
|
-
float
|
|
130
|
-
float
|
|
131
|
-
float
|
|
132
|
-
\n\
|
|
133
|
-
if (det < 0.0) {\n\
|
|
134
|
-
return vec2(NO_HIT);\n\
|
|
135
|
-
}\n\
|
|
136
|
-
\n\
|
|
137
|
-
det = sqrt(det);\n\
|
|
138
|
-
float t1 = -b - det;\n\
|
|
139
|
-
float t2 = -b + det;\n\
|
|
140
|
-
float tmin = min(t1, t2);\n\
|
|
141
|
-
float tmax = max(t1, t2);\n\
|
|
142
|
-
\n\
|
|
143
|
-
return vec2(tmin, tmax);\n\
|
|
144
|
-
}\n\
|
|
97
|
+
float aSin = d.z * d.z * sinSqrHalfAngle;\n\
|
|
98
|
+
float aCos = -dot(d.xy, d.xy) * cosSqrHalfAngle;\n\
|
|
99
|
+
float a = aSin + aCos;\n\
|
|
145
100
|
\n\
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
vec3 d = ray.dir;\n\
|
|
101
|
+
float bSin = d.z * o.z * sinSqrHalfAngle;\n\
|
|
102
|
+
float bCos = -dot(o.xy, d.xy) * cosSqrHalfAngle;\n\
|
|
103
|
+
float b = bSin + bCos;\n\
|
|
150
104
|
\n\
|
|
151
|
-
float
|
|
152
|
-
float
|
|
153
|
-
float c =
|
|
154
|
-
|
|
105
|
+
float cSin = o.z * o.z * sinSqrHalfAngle;\n\
|
|
106
|
+
float cCos = -dot(o.xy, o.xy) * cosSqrHalfAngle;\n\
|
|
107
|
+
float c = cSin + cCos;\n\
|
|
108
|
+
// determinant = b * b - a * c. But bSin * bSin = aSin * cSin.\n\
|
|
109
|
+
// Avoid subtractive cancellation by expanding to eliminate these terms\n\
|
|
110
|
+
float determinant = 2.0 * bSin * bCos + bCos * bCos - aSin * cCos - aCos * cSin - aCos * cCos;\n\
|
|
155
111
|
\n\
|
|
156
|
-
if (
|
|
112
|
+
if (determinant < 0.0) {\n\
|
|
157
113
|
return vec2(NO_HIT);\n\
|
|
114
|
+
} else if (a == 0.0) {\n\
|
|
115
|
+
// Ray is parallel to cone surface\n\
|
|
116
|
+
return (b == 0.0)\n\
|
|
117
|
+
? vec2(NO_HIT) // Ray is on cone surface\n\
|
|
118
|
+
: vec2(-0.5 * c / b, NO_HIT);\n\
|
|
158
119
|
}\n\
|
|
159
120
|
\n\
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
121
|
+
determinant = sqrt(determinant);\n\
|
|
122
|
+
\n\
|
|
123
|
+
// Compute larger root using standard formula\n\
|
|
124
|
+
float signB = b < 0.0 ? -1.0 : 1.0;\n\
|
|
125
|
+
float t1 = (-b - signB * determinant) / a;\n\
|
|
126
|
+
// The other root may suffer from subtractive cancellation in the standard formula.\n\
|
|
127
|
+
// Compute it from the first root instead.\n\
|
|
128
|
+
float t2 = c / (a * t1);\n\
|
|
163
129
|
float tmin = min(t1, t2);\n\
|
|
164
130
|
float tmax = max(t1, t2);\n\
|
|
165
|
-
\n\
|
|
166
131
|
return vec2(tmin, tmax);\n\
|
|
167
132
|
}\n\
|
|
168
133
|
\n\
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
float
|
|
177
|
-
|
|
178
|
-
if
|
|
179
|
-
|
|
180
|
-
|
|
134
|
+
/**\n\
|
|
135
|
+
* Given a point on a conical surface, find the surface normal at that point.\n\
|
|
136
|
+
*/\n\
|
|
137
|
+
vec3 getConeNormal(in vec3 p, in bool convex) {\n\
|
|
138
|
+
// Start with radial component pointing toward z-axis\n\
|
|
139
|
+
vec2 radial = -abs(p.z) * normalize(p.xy);\n\
|
|
140
|
+
// Z component points toward opening of cone\n\
|
|
141
|
+
float zSign = (p.z < 0.0) ? -1.0 : 1.0;\n\
|
|
142
|
+
float z = length(p.xy) * zSign;\n\
|
|
143
|
+
// Flip normal if shape is convex\n\
|
|
144
|
+
float flip = (convex) ? -1.0 : 1.0;\n\
|
|
145
|
+
return normalize(vec3(radial, z) * flip);\n\
|
|
146
|
+
}\n\
|
|
181
147
|
\n\
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
148
|
+
/**\n\
|
|
149
|
+
* Compute the shift between the ellipsoid origin and the apex of a cone of latitude\n\
|
|
150
|
+
*/\n\
|
|
151
|
+
float getLatitudeConeShift(in float sinLatitude) {\n\
|
|
152
|
+
// Find prime vertical radius of curvature: \n\
|
|
153
|
+
// the distance along the ellipsoid normal to the intersection with the z-axis\n\
|
|
154
|
+
float x2 = u_eccentricitySquared * sinLatitude * sinLatitude;\n\
|
|
155
|
+
float primeVerticalRadius = inversesqrt(1.0 - x2);\n\
|
|
156
|
+
\n\
|
|
157
|
+
// Compute a shift from the origin to the intersection of the cone with the z-axis\n\
|
|
158
|
+
return primeVerticalRadius * u_eccentricitySquared * sinLatitude;\n\
|
|
188
159
|
}\n\
|
|
189
160
|
\n\
|
|
190
|
-
|
|
161
|
+
void intersectFlippedCone(in Ray ray, in float cosHalfAngle, out RayShapeIntersection intersections[2]) {\n\
|
|
162
|
+
// Undo the scaling from ellipsoid to sphere\n\
|
|
163
|
+
ray.pos = ray.pos * u_ellipsoidRadiiUv;\n\
|
|
164
|
+
ray.dir = ray.dir * u_ellipsoidRadiiUv;\n\
|
|
165
|
+
// Shift the ray to account for the latitude cone not being centered at the Earth center\n\
|
|
166
|
+
ray.pos.z += getLatitudeConeShift(cosHalfAngle);\n\
|
|
167
|
+
\n\
|
|
168
|
+
float cosSqrHalfAngle = cosHalfAngle * cosHalfAngle;\n\
|
|
191
169
|
vec2 intersect = intersectDoubleEndedCone(ray, cosSqrHalfAngle);\n\
|
|
170
|
+
\n\
|
|
171
|
+
vec4 miss = vec4(normalize(ray.dir), NO_HIT);\n\
|
|
172
|
+
vec4 farSide = vec4(normalize(ray.dir), INF_HIT);\n\
|
|
173
|
+
\n\
|
|
174
|
+
// Initialize output with no intersections\n\
|
|
175
|
+
intersections[0].entry = -1.0 * farSide;\n\
|
|
176
|
+
intersections[0].exit = farSide;\n\
|
|
177
|
+
intersections[1].entry = miss;\n\
|
|
178
|
+
intersections[1].exit = miss;\n\
|
|
192
179
|
\n\
|
|
193
180
|
if (intersect.x == NO_HIT) {\n\
|
|
194
|
-
return
|
|
181
|
+
return;\n\
|
|
195
182
|
}\n\
|
|
196
183
|
\n\
|
|
197
|
-
|
|
198
|
-
vec3 d = ray.dir;\n\
|
|
184
|
+
// Find the points of intersection\n\
|
|
199
185
|
float tmin = intersect.x;\n\
|
|
200
186
|
float tmax = intersect.y;\n\
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
\n\
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
187
|
+
vec3 p0 = ray.pos + tmin * ray.dir;\n\
|
|
188
|
+
vec3 p1 = ray.pos + tmax * ray.dir;\n\
|
|
189
|
+
\n\
|
|
190
|
+
vec4 intersect0 = vec4(getConeNormal(p0, true), tmin);\n\
|
|
191
|
+
vec4 intersect1 = vec4(getConeNormal(p1, true), tmax);\n\
|
|
192
|
+
\n\
|
|
193
|
+
bool p0InShadowCone = sign(p0.z) != sign(cosHalfAngle);\n\
|
|
194
|
+
bool p1InShadowCone = sign(p1.z) != sign(cosHalfAngle);\n\
|
|
195
|
+
\n\
|
|
196
|
+
if (p0InShadowCone && p1InShadowCone) {\n\
|
|
197
|
+
// no valid intersections\n\
|
|
198
|
+
} else if (p0InShadowCone) {\n\
|
|
199
|
+
intersections[0].exit = intersect1;\n\
|
|
200
|
+
} else if (p1InShadowCone) {\n\
|
|
201
|
+
intersections[0].entry = intersect0;\n\
|
|
202
|
+
} else {\n\
|
|
203
|
+
intersections[0].exit = intersect0;\n\
|
|
204
|
+
intersections[1].entry = intersect1;\n\
|
|
205
|
+
intersections[1].exit = farSide;\n\
|
|
206
|
+
}\n\
|
|
210
207
|
}\n\
|
|
211
208
|
\n\
|
|
212
|
-
|
|
209
|
+
RayShapeIntersection intersectRegularCone(in Ray ray, in float cosHalfAngle, in bool convex) {\n\
|
|
210
|
+
// Undo the scaling from ellipsoid to sphere\n\
|
|
211
|
+
ray.pos = ray.pos * u_ellipsoidRadiiUv;\n\
|
|
212
|
+
ray.dir = ray.dir * u_ellipsoidRadiiUv;\n\
|
|
213
|
+
// Shift the ray to account for the latitude cone not being centered at the Earth center\n\
|
|
214
|
+
ray.pos.z += getLatitudeConeShift(cosHalfAngle);\n\
|
|
215
|
+
\n\
|
|
216
|
+
float cosSqrHalfAngle = cosHalfAngle * cosHalfAngle;\n\
|
|
213
217
|
vec2 intersect = intersectDoubleEndedCone(ray, cosSqrHalfAngle);\n\
|
|
218
|
+
\n\
|
|
219
|
+
vec4 miss = vec4(normalize(ray.dir), NO_HIT);\n\
|
|
220
|
+
vec4 farSide = vec4(normalize(ray.dir), INF_HIT);\n\
|
|
214
221
|
\n\
|
|
215
222
|
if (intersect.x == NO_HIT) {\n\
|
|
216
|
-
return
|
|
223
|
+
return RayShapeIntersection(miss, miss);\n\
|
|
217
224
|
}\n\
|
|
218
225
|
\n\
|
|
219
|
-
|
|
220
|
-
vec3 d = ray.dir;\n\
|
|
226
|
+
// Find the points of intersection\n\
|
|
221
227
|
float tmin = intersect.x;\n\
|
|
222
228
|
float tmax = intersect.y;\n\
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
\n\
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
229
|
+
vec3 p0 = ray.pos + tmin * ray.dir;\n\
|
|
230
|
+
vec3 p1 = ray.pos + tmax * ray.dir;\n\
|
|
231
|
+
\n\
|
|
232
|
+
vec4 intersect0 = vec4(getConeNormal(p0, convex), tmin);\n\
|
|
233
|
+
vec4 intersect1 = vec4(getConeNormal(p1, convex), tmax);\n\
|
|
234
|
+
\n\
|
|
235
|
+
bool p0InShadowCone = sign(p0.z) != sign(cosHalfAngle);\n\
|
|
236
|
+
bool p1InShadowCone = sign(p1.z) != sign(cosHalfAngle);\n\
|
|
237
|
+
\n\
|
|
238
|
+
if (p0InShadowCone && p1InShadowCone) {\n\
|
|
239
|
+
return RayShapeIntersection(miss, miss);\n\
|
|
240
|
+
} else if (p0InShadowCone) {\n\
|
|
241
|
+
return RayShapeIntersection(intersect1, farSide);\n\
|
|
242
|
+
} else if (p1InShadowCone) {\n\
|
|
243
|
+
return RayShapeIntersection(-1.0 * farSide, intersect0);\n\
|
|
244
|
+
} else {\n\
|
|
245
|
+
return RayShapeIntersection(intersect0, intersect1);\n\
|
|
246
|
+
}\n\
|
|
230
247
|
}\n\
|
|
231
248
|
\n\
|
|
232
249
|
void intersectShape(in Ray ray, inout Intersections ix) {\n\
|
|
@@ -234,26 +251,26 @@ void intersectShape(in Ray ray, inout Intersections ix) {\n\
|
|
|
234
251
|
// Direction is scaled as well to be in sync with position.\n\
|
|
235
252
|
ray.pos = ray.pos * 2.0 - 1.0;\n\
|
|
236
253
|
ray.dir *= 2.0;\n\
|
|
237
|
-
\n\
|
|
238
|
-
#if defined(ELLIPSOID_HAS_RENDER_BOUNDS_HEIGHT_MAX)\n\
|
|
239
|
-
Ray outerRay = Ray(ray.pos * u_ellipsoidInverseOuterScaleUv, ray.dir * u_ellipsoidInverseOuterScaleUv);\n\
|
|
240
|
-
#else\n\
|
|
241
|
-
Ray outerRay = ray;\n\
|
|
242
|
-
#endif\n\
|
|
243
254
|
\n\
|
|
244
255
|
// Outer ellipsoid\n\
|
|
245
|
-
|
|
246
|
-
|
|
256
|
+
RayShapeIntersection outerIntersect = intersectHeight(ray, u_clipMinMaxHeight.y, true);\n\
|
|
257
|
+
setShapeIntersection(ix, ELLIPSOID_INTERSECTION_INDEX_HEIGHT_MAX, outerIntersect);\n\
|
|
247
258
|
\n\
|
|
248
259
|
// Exit early if the outer ellipsoid was missed.\n\
|
|
249
|
-
if (outerIntersect.
|
|
260
|
+
if (outerIntersect.entry.w == NO_HIT) {\n\
|
|
250
261
|
return;\n\
|
|
251
262
|
}\n\
|
|
252
263
|
\n\
|
|
253
264
|
// Inner ellipsoid\n\
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
265
|
+
RayShapeIntersection innerIntersect = intersectHeight(ray, u_clipMinMaxHeight.x, false);\n\
|
|
266
|
+
\n\
|
|
267
|
+
if (innerIntersect.entry.w == NO_HIT) {\n\
|
|
268
|
+
setShapeIntersection(ix, ELLIPSOID_INTERSECTION_INDEX_HEIGHT_MIN, innerIntersect);\n\
|
|
269
|
+
} else {\n\
|
|
270
|
+
// When the ellipsoid is large and thin it's possible for floating point math\n\
|
|
271
|
+
// to cause the ray to intersect the inner ellipsoid before the outer ellipsoid. \n\
|
|
272
|
+
// To prevent this from happening, clamp innerIntersect to outerIntersect and\n\
|
|
273
|
+
// sandwich the inner ellipsoid intersection inside the outer ellipsoid intersection.\n\
|
|
257
274
|
\n\
|
|
258
275
|
// Without this special case,\n\
|
|
259
276
|
// [outerMin, outerMax, innerMin, innerMax] will bubble sort to\n\
|
|
@@ -268,82 +285,56 @@ void intersectShape(in Ray ray, inout Intersections ix) {\n\
|
|
|
268
285
|
\n\
|
|
269
286
|
// Note: If initializeIntersections() changes its sorting function\n\
|
|
270
287
|
// from bubble sort to something else, this code may need to change.\n\
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
\n\
|
|
279
|
-
if (innerIntersect == vec2(NO_HIT)) {\n\
|
|
280
|
-
setIntersectionPair(ix, ELLIPSOID_INTERSECTION_INDEX_HEIGHT_MIN, innerIntersect);\n\
|
|
281
|
-
} else {\n\
|
|
282
|
-
// When the ellipsoid is very large and thin it's possible for floating\n\
|
|
283
|
-
// point math to cause the ray to intersect the inner ellipsoid before\n\
|
|
284
|
-
// the outer ellipsoid. To prevent this from happening, clamp innerIntersect\n\
|
|
285
|
-
// to outerIntersect and sandwhich the intersections like described above.\n\
|
|
286
|
-
//\n\
|
|
287
|
-
// In theory a similar fix is needed for cylinders, however it's more\n\
|
|
288
|
-
// complicated to implement because the inner shape is allowed to be\n\
|
|
289
|
-
// intersected first.\n\
|
|
290
|
-
innerIntersect.x = max(innerIntersect.x, outerIntersect.x);\n\
|
|
291
|
-
innerIntersect.y = min(innerIntersect.y, outerIntersect.y);\n\
|
|
292
|
-
setIntersection(ix, 0, outerIntersect.x, true, true); // positive, enter\n\
|
|
293
|
-
setIntersection(ix, 1, innerIntersect.x, false, true); // negative, enter\n\
|
|
294
|
-
setIntersection(ix, 2, innerIntersect.y, false, false); // negative, exit\n\
|
|
295
|
-
setIntersection(ix, 3, outerIntersect.y, true, false); // positive, exit\n\
|
|
296
|
-
}\n\
|
|
297
|
-
#endif\n\
|
|
298
|
-
\n\
|
|
299
|
-
// Flip the ray because the intersection function expects a cone growing towards +Z.\n\
|
|
300
|
-
#if defined(ELLIPSOID_HAS_RENDER_BOUNDS_LATITUDE_MIN_UNDER_HALF) || defined(ELLIPSOID_HAS_RENDER_BOUNDS_LATITUDE_MIN_EQUAL_HALF) || defined(ELLIPSOID_HAS_RENDER_BOUNDS_LATITUDE_MAX_UNDER_HALF)\n\
|
|
301
|
-
Ray flippedRay = outerRay;\n\
|
|
302
|
-
flippedRay.dir.z *= -1.0;\n\
|
|
303
|
-
flippedRay.pos.z *= -1.0;\n\
|
|
304
|
-
#endif\n\
|
|
288
|
+
innerIntersect.entry.w = max(innerIntersect.entry.w, outerIntersect.entry.w);\n\
|
|
289
|
+
innerIntersect.exit.w = min(innerIntersect.exit.w, outerIntersect.exit.w);\n\
|
|
290
|
+
setSurfaceIntersection(ix, 0, outerIntersect.entry, true, true); // positive, enter\n\
|
|
291
|
+
setSurfaceIntersection(ix, 1, innerIntersect.entry, false, true); // negative, enter\n\
|
|
292
|
+
setSurfaceIntersection(ix, 2, innerIntersect.exit, false, false); // negative, exit\n\
|
|
293
|
+
setSurfaceIntersection(ix, 3, outerIntersect.exit, true, false); // positive, exit\n\
|
|
294
|
+
}\n\
|
|
305
295
|
\n\
|
|
306
296
|
// Bottom cone\n\
|
|
307
297
|
#if defined(ELLIPSOID_HAS_RENDER_BOUNDS_LATITUDE_MIN_UNDER_HALF)\n\
|
|
308
|
-
|
|
309
|
-
|
|
298
|
+
RayShapeIntersection bottomConeIntersection = intersectRegularCone(ray, u_ellipsoidRenderLatitudeSinMinMax.x, false);\n\
|
|
299
|
+
setShapeIntersection(ix, ELLIPSOID_INTERSECTION_INDEX_LATITUDE_MIN, bottomConeIntersection);\n\
|
|
310
300
|
#elif defined(ELLIPSOID_HAS_RENDER_BOUNDS_LATITUDE_MIN_EQUAL_HALF)\n\
|
|
311
|
-
|
|
312
|
-
|
|
301
|
+
RayShapeIntersection bottomConeIntersection = intersectZPlane(ray, -1.0);\n\
|
|
302
|
+
setShapeIntersection(ix, ELLIPSOID_INTERSECTION_INDEX_LATITUDE_MIN, bottomConeIntersection);\n\
|
|
313
303
|
#elif defined(ELLIPSOID_HAS_RENDER_BOUNDS_LATITUDE_MIN_OVER_HALF)\n\
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
304
|
+
RayShapeIntersection bottomConeIntersections[2];\n\
|
|
305
|
+
intersectFlippedCone(ray, u_ellipsoidRenderLatitudeSinMinMax.x, bottomConeIntersections);\n\
|
|
306
|
+
setShapeIntersection(ix, ELLIPSOID_INTERSECTION_INDEX_LATITUDE_MIN + 0, bottomConeIntersections[0]);\n\
|
|
307
|
+
setShapeIntersection(ix, ELLIPSOID_INTERSECTION_INDEX_LATITUDE_MIN + 1, bottomConeIntersections[1]);\n\
|
|
317
308
|
#endif\n\
|
|
318
309
|
\n\
|
|
319
310
|
// Top cone\n\
|
|
320
311
|
#if defined(ELLIPSOID_HAS_RENDER_BOUNDS_LATITUDE_MAX_UNDER_HALF)\n\
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
312
|
+
RayShapeIntersection topConeIntersections[2];\n\
|
|
313
|
+
intersectFlippedCone(ray, u_ellipsoidRenderLatitudeSinMinMax.y, topConeIntersections);\n\
|
|
314
|
+
setShapeIntersection(ix, ELLIPSOID_INTERSECTION_INDEX_LATITUDE_MAX + 0, topConeIntersections[0]);\n\
|
|
315
|
+
setShapeIntersection(ix, ELLIPSOID_INTERSECTION_INDEX_LATITUDE_MAX + 1, topConeIntersections[1]);\n\
|
|
324
316
|
#elif defined(ELLIPSOID_HAS_RENDER_BOUNDS_LATITUDE_MAX_EQUAL_HALF)\n\
|
|
325
|
-
|
|
326
|
-
|
|
317
|
+
RayShapeIntersection topConeIntersection = intersectZPlane(ray, 1.0);\n\
|
|
318
|
+
setShapeIntersection(ix, ELLIPSOID_INTERSECTION_INDEX_LATITUDE_MAX, topConeIntersection);\n\
|
|
327
319
|
#elif defined(ELLIPSOID_HAS_RENDER_BOUNDS_LATITUDE_MAX_OVER_HALF)\n\
|
|
328
|
-
|
|
329
|
-
|
|
320
|
+
RayShapeIntersection topConeIntersection = intersectRegularCone(ray, u_ellipsoidRenderLatitudeSinMinMax.y, false);\n\
|
|
321
|
+
setShapeIntersection(ix, ELLIPSOID_INTERSECTION_INDEX_LATITUDE_MAX, topConeIntersection);\n\
|
|
330
322
|
#endif\n\
|
|
331
323
|
\n\
|
|
332
324
|
// Wedge\n\
|
|
333
325
|
#if defined(ELLIPSOID_HAS_RENDER_BOUNDS_LONGITUDE_RANGE_EQUAL_ZERO)\n\
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
326
|
+
RayShapeIntersection wedgeIntersects[2];\n\
|
|
327
|
+
intersectHalfPlane(ray, u_ellipsoidRenderLongitudeMinMax.x, wedgeIntersects);\n\
|
|
328
|
+
setShapeIntersection(ix, ELLIPSOID_INTERSECTION_INDEX_LONGITUDE + 0, wedgeIntersects[0]);\n\
|
|
329
|
+
setShapeIntersection(ix, ELLIPSOID_INTERSECTION_INDEX_LONGITUDE + 1, wedgeIntersects[1]);\n\
|
|
337
330
|
#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\
|
|
331
|
+
RayShapeIntersection wedgeIntersect = intersectRegularWedge(ray, u_ellipsoidRenderLongitudeMinMax);\n\
|
|
332
|
+
setShapeIntersection(ix, ELLIPSOID_INTERSECTION_INDEX_LONGITUDE, wedgeIntersect);\n\
|
|
343
333
|
#elif defined(ELLIPSOID_HAS_RENDER_BOUNDS_LONGITUDE_RANGE_OVER_HALF)\n\
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
334
|
+
RayShapeIntersection wedgeIntersects[2];\n\
|
|
335
|
+
intersectFlippedWedge(ray, u_ellipsoidRenderLongitudeMinMax, wedgeIntersects);\n\
|
|
336
|
+
setShapeIntersection(ix, ELLIPSOID_INTERSECTION_INDEX_LONGITUDE + 0, wedgeIntersects[0]);\n\
|
|
337
|
+
setShapeIntersection(ix, ELLIPSOID_INTERSECTION_INDEX_LONGITUDE + 1, wedgeIntersects[1]);\n\
|
|
347
338
|
#endif\n\
|
|
348
339
|
}\n\
|
|
349
340
|
";
|