@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
|
@@ -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
|
+
";
|
|
@@ -4,22 +4,44 @@
|
|
|
4
4
|
|
|
5
5
|
#define NO_HIT (-czm_infinity)
|
|
6
6
|
#define INF_HIT (czm_infinity * 0.5)
|
|
7
|
-
#define RAY_SHIFT (0.000003163)
|
|
8
|
-
#define RAY_SCALE (1.003163)
|
|
9
|
-
|
|
10
|
-
struct Ray {
|
|
11
|
-
vec3 pos;
|
|
12
|
-
vec3 dir;
|
|
13
|
-
#if defined(SHAPE_BOX)
|
|
14
|
-
vec3 dInv;
|
|
15
|
-
#endif
|
|
16
|
-
};
|
|
17
7
|
|
|
18
8
|
struct RayShapeIntersection {
|
|
19
9
|
vec4 entry;
|
|
20
10
|
vec4 exit;
|
|
21
11
|
};
|
|
22
12
|
|
|
13
|
+
vec4 intersectionMin(in vec4 intersect0, in vec4 intersect1)
|
|
14
|
+
{
|
|
15
|
+
if (intersect0.w == NO_HIT) {
|
|
16
|
+
return intersect1;
|
|
17
|
+
} else if (intersect1.w == NO_HIT) {
|
|
18
|
+
return intersect0;
|
|
19
|
+
}
|
|
20
|
+
return (intersect0.w <= intersect1.w) ? intersect0 : intersect1;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
vec4 intersectionMax(in vec4 intersect0, in vec4 intersect1)
|
|
24
|
+
{
|
|
25
|
+
return (intersect0.w >= intersect1.w) ? intersect0 : intersect1;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
RayShapeIntersection intersectIntersections(in Ray ray, in RayShapeIntersection intersect0, in RayShapeIntersection intersect1)
|
|
29
|
+
{
|
|
30
|
+
bool missed = (intersect0.entry.w == NO_HIT) ||
|
|
31
|
+
(intersect1.entry.w == NO_HIT) ||
|
|
32
|
+
(intersect0.exit.w < intersect1.entry.w) ||
|
|
33
|
+
(intersect0.entry.w > intersect1.exit.w);
|
|
34
|
+
if (missed) {
|
|
35
|
+
vec4 miss = vec4(normalize(ray.dir), NO_HIT);
|
|
36
|
+
return RayShapeIntersection(miss, miss);
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
vec4 entry = intersectionMax(intersect0.entry, intersect1.entry);
|
|
40
|
+
vec4 exit = intersectionMin(intersect0.exit, intersect1.exit);
|
|
41
|
+
|
|
42
|
+
return RayShapeIntersection(entry, exit);
|
|
43
|
+
}
|
|
44
|
+
|
|
23
45
|
struct Intersections {
|
|
24
46
|
// Don't access these member variables directly - call the functions instead.
|
|
25
47
|
|
|
@@ -57,7 +79,7 @@ vec4 encodeIntersectionType(vec4 intersection, int index, bool entry)
|
|
|
57
79
|
// Use defines instead of real functions because WebGL1 cannot access array with non-constant index.
|
|
58
80
|
#define setIntersection(/*inout Intersections*/ ix, /*int*/ index, /*float*/ t, /*bool*/ positive, /*bool*/ enter) (ix).intersections[(index)] = vec4(0.0, float(!positive) * 2.0 + float(!enter) + 1.0, 0.0, (t))
|
|
59
81
|
#define setIntersectionPair(/*inout Intersections*/ ix, /*int*/ index, /*vec2*/ entryExit) (ix).intersections[(index) * 2 + 0] = vec4(0.0, float((index) > 0) * 2.0 + 1.0, 0.0, (entryExit).x); (ix).intersections[(index) * 2 + 1] = vec4(0.0, float((index) > 0) * 2.0 + 2.0, 0.0, (entryExit).y)
|
|
60
|
-
#define setSurfaceIntersection(/*inout Intersections*/ ix, /*int*/ index, /*vec4*/ intersection) (ix).intersections[(index)] = intersection
|
|
82
|
+
#define setSurfaceIntersection(/*inout Intersections*/ ix, /*int*/ index, /*vec4*/ intersection, /*bool*/ positive, /*bool*/ enter) (ix).intersections[(index)] = encodeIntersectionType((intersection), int(!positive), (enter))
|
|
61
83
|
#define setShapeIntersection(/*inout Intersections*/ ix, /*int*/ index, /*RayShapeIntersection*/ intersection) (ix).intersections[(index) * 2 + 0] = encodeIntersectionType((intersection).entry, (index), true); (ix).intersections[(index) * 2 + 1] = encodeIntersectionType((intersection).exit, (index), false)
|
|
62
84
|
|
|
63
85
|
#if (INTERSECTION_COUNT > 1)
|
|
@@ -5,22 +5,44 @@ export default "/* Intersection defines\n\
|
|
|
5
5
|
\n\
|
|
6
6
|
#define NO_HIT (-czm_infinity)\n\
|
|
7
7
|
#define INF_HIT (czm_infinity * 0.5)\n\
|
|
8
|
-
#define RAY_SHIFT (0.000003163)\n\
|
|
9
|
-
#define RAY_SCALE (1.003163)\n\
|
|
10
|
-
\n\
|
|
11
|
-
struct Ray {\n\
|
|
12
|
-
vec3 pos;\n\
|
|
13
|
-
vec3 dir;\n\
|
|
14
|
-
#if defined(SHAPE_BOX)\n\
|
|
15
|
-
vec3 dInv;\n\
|
|
16
|
-
#endif\n\
|
|
17
|
-
};\n\
|
|
18
8
|
\n\
|
|
19
9
|
struct RayShapeIntersection {\n\
|
|
20
10
|
vec4 entry;\n\
|
|
21
11
|
vec4 exit;\n\
|
|
22
12
|
};\n\
|
|
23
13
|
\n\
|
|
14
|
+
vec4 intersectionMin(in vec4 intersect0, in vec4 intersect1)\n\
|
|
15
|
+
{\n\
|
|
16
|
+
if (intersect0.w == NO_HIT) {\n\
|
|
17
|
+
return intersect1;\n\
|
|
18
|
+
} else if (intersect1.w == NO_HIT) {\n\
|
|
19
|
+
return intersect0;\n\
|
|
20
|
+
}\n\
|
|
21
|
+
return (intersect0.w <= intersect1.w) ? intersect0 : intersect1;\n\
|
|
22
|
+
}\n\
|
|
23
|
+
\n\
|
|
24
|
+
vec4 intersectionMax(in vec4 intersect0, in vec4 intersect1)\n\
|
|
25
|
+
{\n\
|
|
26
|
+
return (intersect0.w >= intersect1.w) ? intersect0 : intersect1;\n\
|
|
27
|
+
}\n\
|
|
28
|
+
\n\
|
|
29
|
+
RayShapeIntersection intersectIntersections(in Ray ray, in RayShapeIntersection intersect0, in RayShapeIntersection intersect1)\n\
|
|
30
|
+
{\n\
|
|
31
|
+
bool missed = (intersect0.entry.w == NO_HIT) ||\n\
|
|
32
|
+
(intersect1.entry.w == NO_HIT) ||\n\
|
|
33
|
+
(intersect0.exit.w < intersect1.entry.w) ||\n\
|
|
34
|
+
(intersect0.entry.w > intersect1.exit.w);\n\
|
|
35
|
+
if (missed) {\n\
|
|
36
|
+
vec4 miss = vec4(normalize(ray.dir), NO_HIT);\n\
|
|
37
|
+
return RayShapeIntersection(miss, miss);\n\
|
|
38
|
+
}\n\
|
|
39
|
+
\n\
|
|
40
|
+
vec4 entry = intersectionMax(intersect0.entry, intersect1.entry);\n\
|
|
41
|
+
vec4 exit = intersectionMin(intersect0.exit, intersect1.exit);\n\
|
|
42
|
+
\n\
|
|
43
|
+
return RayShapeIntersection(entry, exit);\n\
|
|
44
|
+
}\n\
|
|
45
|
+
\n\
|
|
24
46
|
struct Intersections {\n\
|
|
25
47
|
// Don't access these member variables directly - call the functions instead.\n\
|
|
26
48
|
\n\
|
|
@@ -58,7 +80,7 @@ vec4 encodeIntersectionType(vec4 intersection, int index, bool entry)\n\
|
|
|
58
80
|
// Use defines instead of real functions because WebGL1 cannot access array with non-constant index.\n\
|
|
59
81
|
#define setIntersection(/*inout Intersections*/ ix, /*int*/ index, /*float*/ t, /*bool*/ positive, /*bool*/ enter) (ix).intersections[(index)] = vec4(0.0, float(!positive) * 2.0 + float(!enter) + 1.0, 0.0, (t))\n\
|
|
60
82
|
#define setIntersectionPair(/*inout Intersections*/ ix, /*int*/ index, /*vec2*/ entryExit) (ix).intersections[(index) * 2 + 0] = vec4(0.0, float((index) > 0) * 2.0 + 1.0, 0.0, (entryExit).x); (ix).intersections[(index) * 2 + 1] = vec4(0.0, float((index) > 0) * 2.0 + 2.0, 0.0, (entryExit).y)\n\
|
|
61
|
-
#define setSurfaceIntersection(/*inout Intersections*/ ix, /*int*/ index, /*vec4*/ intersection) (ix).intersections[(index)] = intersection
|
|
83
|
+
#define setSurfaceIntersection(/*inout Intersections*/ ix, /*int*/ index, /*vec4*/ intersection, /*bool*/ positive, /*bool*/ enter) (ix).intersections[(index)] = encodeIntersectionType((intersection), int(!positive), (enter))\n\
|
|
62
84
|
#define setShapeIntersection(/*inout Intersections*/ ix, /*int*/ index, /*RayShapeIntersection*/ intersection) (ix).intersections[(index) * 2 + 0] = encodeIntersectionType((intersection).entry, (index), true); (ix).intersections[(index) * 2 + 1] = encodeIntersectionType((intersection).exit, (index), false)\n\
|
|
63
85
|
\n\
|
|
64
86
|
#if (INTERSECTION_COUNT > 1)\n\
|
|
@@ -71,9 +71,8 @@ vec2 index1DTo2DTexcoord(int index, ivec2 dimensions, vec2 uvScale)
|
|
|
71
71
|
*/
|
|
72
72
|
|
|
73
73
|
Properties getPropertiesFromMegatexture(in SampleData sampleData) {
|
|
74
|
-
vec3 tileUv = clamp(sampleData.tileUv, vec3(0.0), vec3(1.0)); // TODO is the clamp necessary?
|
|
75
74
|
int tileIndex = sampleData.megatextureIndex;
|
|
76
|
-
vec3 voxelCoord = tileUv * vec3(u_dimensions);
|
|
75
|
+
vec3 voxelCoord = sampleData.tileUv * vec3(u_dimensions);
|
|
77
76
|
ivec3 voxelDimensions = u_dimensions;
|
|
78
77
|
|
|
79
78
|
#if defined(PADDING)
|
|
@@ -72,9 +72,8 @@ vec2 index1DTo2DTexcoord(int index, ivec2 dimensions, vec2 uvScale)\n\
|
|
|
72
72
|
*/\n\
|
|
73
73
|
\n\
|
|
74
74
|
Properties getPropertiesFromMegatexture(in SampleData sampleData) {\n\
|
|
75
|
-
vec3 tileUv = clamp(sampleData.tileUv, vec3(0.0), vec3(1.0)); // TODO is the clamp necessary?\n\
|
|
76
75
|
int tileIndex = sampleData.megatextureIndex;\n\
|
|
77
|
-
vec3 voxelCoord = tileUv * vec3(u_dimensions);\n\
|
|
76
|
+
vec3 voxelCoord = sampleData.tileUv * vec3(u_dimensions);\n\
|
|
78
77
|
ivec3 voxelDimensions = u_dimensions;\n\
|
|
79
78
|
\n\
|
|
80
79
|
#if defined(PADDING)\n\
|
|
@@ -79,10 +79,15 @@ int getOctreeParentIndex(in int octreeIndex) {
|
|
|
79
79
|
*/
|
|
80
80
|
vec3 getTileUv(in vec3 shapePosition, in ivec4 octreeCoords) {
|
|
81
81
|
// PERFORMANCE_IDEA: use bit-shifting (only in WebGL2)
|
|
82
|
-
float dimAtLevel =
|
|
82
|
+
float dimAtLevel = exp2(float(octreeCoords.w));
|
|
83
83
|
return shapePosition * dimAtLevel - vec3(octreeCoords.xyz);
|
|
84
84
|
}
|
|
85
85
|
|
|
86
|
+
vec3 getClampedTileUv(in vec3 shapePosition, in ivec4 octreeCoords) {
|
|
87
|
+
vec3 tileUv = getTileUv(shapePosition, octreeCoords);
|
|
88
|
+
return clamp(tileUv, vec3(0.0), vec3(1.0));
|
|
89
|
+
}
|
|
90
|
+
|
|
86
91
|
void getOctreeLeafSampleData(in OctreeNodeData data, in ivec4 octreeCoords, out SampleData sampleData) {
|
|
87
92
|
sampleData.megatextureIndex = data.data;
|
|
88
93
|
sampleData.tileCoords = (data.flag == OCTREE_FLAG_PACKED_LEAF_FROM_PARENT)
|
|
@@ -121,7 +126,7 @@ void getOctreeLeafSampleDatas(in OctreeNodeData data, in ivec4 octreeCoords, out
|
|
|
121
126
|
#endif
|
|
122
127
|
|
|
123
128
|
OctreeNodeData traverseOctreeDownwards(in vec3 shapePosition, inout TraversalData traversalData) {
|
|
124
|
-
float sizeAtLevel = 1.0
|
|
129
|
+
float sizeAtLevel = exp2(-1.0 * float(traversalData.octreeCoords.w));
|
|
125
130
|
vec3 start = vec3(traversalData.octreeCoords.xyz) * sizeAtLevel;
|
|
126
131
|
vec3 end = start + vec3(sizeAtLevel);
|
|
127
132
|
OctreeNodeData childData;
|
|
@@ -167,11 +172,11 @@ void traverseOctreeFromBeginning(in vec3 shapePosition, out TraversalData traver
|
|
|
167
172
|
|
|
168
173
|
#if (SAMPLE_COUNT == 1)
|
|
169
174
|
getOctreeLeafSampleData(nodeData, traversalData.octreeCoords, sampleDatas[0]);
|
|
170
|
-
sampleDatas[0].tileUv =
|
|
175
|
+
sampleDatas[0].tileUv = getClampedTileUv(shapePosition, sampleDatas[0].tileCoords);
|
|
171
176
|
#else
|
|
172
177
|
getOctreeLeafSampleDatas(nodeData, traversalData.octreeCoords, sampleDatas);
|
|
173
|
-
sampleDatas[0].tileUv =
|
|
174
|
-
sampleDatas[1].tileUv =
|
|
178
|
+
sampleDatas[0].tileUv = getClampedTileUv(shapePosition, sampleDatas[0].tileCoords);
|
|
179
|
+
sampleDatas[1].tileUv = getClampedTileUv(shapePosition, sampleDatas[1].tileCoords);
|
|
175
180
|
#endif
|
|
176
181
|
}
|
|
177
182
|
|
|
@@ -189,7 +194,7 @@ bool insideTile(in vec3 shapePosition, in ivec4 octreeCoords) {
|
|
|
189
194
|
void traverseOctreeFromExisting(in vec3 shapePosition, inout TraversalData traversalData, inout SampleData sampleDatas[SAMPLE_COUNT]) {
|
|
190
195
|
if (insideTile(shapePosition, traversalData.octreeCoords)) {
|
|
191
196
|
for (int i = 0; i < SAMPLE_COUNT; i++) {
|
|
192
|
-
sampleDatas[0].tileUv =
|
|
197
|
+
sampleDatas[0].tileUv = getClampedTileUv(shapePosition, sampleDatas[0].tileCoords);
|
|
193
198
|
}
|
|
194
199
|
return;
|
|
195
200
|
}
|
|
@@ -211,10 +216,10 @@ void traverseOctreeFromExisting(in vec3 shapePosition, inout TraversalData trave
|
|
|
211
216
|
|
|
212
217
|
#if (SAMPLE_COUNT == 1)
|
|
213
218
|
getOctreeLeafSampleData(nodeData, traversalData.octreeCoords, sampleDatas[0]);
|
|
214
|
-
sampleDatas[0].tileUv =
|
|
219
|
+
sampleDatas[0].tileUv = getClampedTileUv(shapePosition, sampleDatas[0].tileCoords);
|
|
215
220
|
#else
|
|
216
221
|
getOctreeLeafSampleDatas(nodeData, traversalData.octreeCoords, sampleDatas);
|
|
217
|
-
sampleDatas[0].tileUv =
|
|
218
|
-
sampleDatas[1].tileUv =
|
|
222
|
+
sampleDatas[0].tileUv = getClampedTileUv(shapePosition, sampleDatas[0].tileCoords);
|
|
223
|
+
sampleDatas[1].tileUv = getClampedTileUv(shapePosition, sampleDatas[1].tileCoords);
|
|
219
224
|
#endif
|
|
220
225
|
}
|
|
@@ -80,10 +80,15 @@ int getOctreeParentIndex(in int octreeIndex) {\n\
|
|
|
80
80
|
*/\n\
|
|
81
81
|
vec3 getTileUv(in vec3 shapePosition, in ivec4 octreeCoords) {\n\
|
|
82
82
|
// PERFORMANCE_IDEA: use bit-shifting (only in WebGL2)\n\
|
|
83
|
-
float dimAtLevel =
|
|
83
|
+
float dimAtLevel = exp2(float(octreeCoords.w));\n\
|
|
84
84
|
return shapePosition * dimAtLevel - vec3(octreeCoords.xyz);\n\
|
|
85
85
|
}\n\
|
|
86
86
|
\n\
|
|
87
|
+
vec3 getClampedTileUv(in vec3 shapePosition, in ivec4 octreeCoords) {\n\
|
|
88
|
+
vec3 tileUv = getTileUv(shapePosition, octreeCoords);\n\
|
|
89
|
+
return clamp(tileUv, vec3(0.0), vec3(1.0));\n\
|
|
90
|
+
}\n\
|
|
91
|
+
\n\
|
|
87
92
|
void getOctreeLeafSampleData(in OctreeNodeData data, in ivec4 octreeCoords, out SampleData sampleData) {\n\
|
|
88
93
|
sampleData.megatextureIndex = data.data;\n\
|
|
89
94
|
sampleData.tileCoords = (data.flag == OCTREE_FLAG_PACKED_LEAF_FROM_PARENT)\n\
|
|
@@ -122,7 +127,7 @@ void getOctreeLeafSampleDatas(in OctreeNodeData data, in ivec4 octreeCoords, out
|
|
|
122
127
|
#endif\n\
|
|
123
128
|
\n\
|
|
124
129
|
OctreeNodeData traverseOctreeDownwards(in vec3 shapePosition, inout TraversalData traversalData) {\n\
|
|
125
|
-
float sizeAtLevel = 1.0
|
|
130
|
+
float sizeAtLevel = exp2(-1.0 * float(traversalData.octreeCoords.w));\n\
|
|
126
131
|
vec3 start = vec3(traversalData.octreeCoords.xyz) * sizeAtLevel;\n\
|
|
127
132
|
vec3 end = start + vec3(sizeAtLevel);\n\
|
|
128
133
|
OctreeNodeData childData;\n\
|
|
@@ -168,11 +173,11 @@ void traverseOctreeFromBeginning(in vec3 shapePosition, out TraversalData traver
|
|
|
168
173
|
\n\
|
|
169
174
|
#if (SAMPLE_COUNT == 1)\n\
|
|
170
175
|
getOctreeLeafSampleData(nodeData, traversalData.octreeCoords, sampleDatas[0]);\n\
|
|
171
|
-
sampleDatas[0].tileUv =
|
|
176
|
+
sampleDatas[0].tileUv = getClampedTileUv(shapePosition, sampleDatas[0].tileCoords);\n\
|
|
172
177
|
#else\n\
|
|
173
178
|
getOctreeLeafSampleDatas(nodeData, traversalData.octreeCoords, sampleDatas);\n\
|
|
174
|
-
sampleDatas[0].tileUv =
|
|
175
|
-
sampleDatas[1].tileUv =
|
|
179
|
+
sampleDatas[0].tileUv = getClampedTileUv(shapePosition, sampleDatas[0].tileCoords);\n\
|
|
180
|
+
sampleDatas[1].tileUv = getClampedTileUv(shapePosition, sampleDatas[1].tileCoords);\n\
|
|
176
181
|
#endif\n\
|
|
177
182
|
}\n\
|
|
178
183
|
\n\
|
|
@@ -190,7 +195,7 @@ bool insideTile(in vec3 shapePosition, in ivec4 octreeCoords) {\n\
|
|
|
190
195
|
void traverseOctreeFromExisting(in vec3 shapePosition, inout TraversalData traversalData, inout SampleData sampleDatas[SAMPLE_COUNT]) {\n\
|
|
191
196
|
if (insideTile(shapePosition, traversalData.octreeCoords)) {\n\
|
|
192
197
|
for (int i = 0; i < SAMPLE_COUNT; i++) {\n\
|
|
193
|
-
sampleDatas[0].tileUv =
|
|
198
|
+
sampleDatas[0].tileUv = getClampedTileUv(shapePosition, sampleDatas[0].tileCoords);\n\
|
|
194
199
|
}\n\
|
|
195
200
|
return;\n\
|
|
196
201
|
}\n\
|
|
@@ -212,11 +217,11 @@ void traverseOctreeFromExisting(in vec3 shapePosition, inout TraversalData trave
|
|
|
212
217
|
\n\
|
|
213
218
|
#if (SAMPLE_COUNT == 1)\n\
|
|
214
219
|
getOctreeLeafSampleData(nodeData, traversalData.octreeCoords, sampleDatas[0]);\n\
|
|
215
|
-
sampleDatas[0].tileUv =
|
|
220
|
+
sampleDatas[0].tileUv = getClampedTileUv(shapePosition, sampleDatas[0].tileCoords);\n\
|
|
216
221
|
#else\n\
|
|
217
222
|
getOctreeLeafSampleDatas(nodeData, traversalData.octreeCoords, sampleDatas);\n\
|
|
218
|
-
sampleDatas[0].tileUv =
|
|
219
|
-
sampleDatas[1].tileUv =
|
|
223
|
+
sampleDatas[0].tileUv = getClampedTileUv(shapePosition, sampleDatas[0].tileCoords);\n\
|
|
224
|
+
sampleDatas[1].tileUv = getClampedTileUv(shapePosition, sampleDatas[1].tileCoords);\n\
|
|
220
225
|
#endif\n\
|
|
221
226
|
}\n\
|
|
222
227
|
";
|