@cesium/engine 14.0.0 → 15.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/Build/Workers/{chunk-EWDGNOJE.js → chunk-25TOENEE.js} +7 -7
- package/Build/Workers/{chunk-OMXHEJTK.js → chunk-2AVIUB5H.js} +2 -2
- package/Build/Workers/{chunk-LJBJM6VI.js → chunk-3JZGPJMZ.js} +6 -6
- package/Build/Workers/{chunk-DT5NFR5C.js → chunk-3LHBH4TC.js} +7 -7
- package/Build/Workers/{chunk-3QLSKXKF.js → chunk-3LZF23RY.js} +6 -6
- package/Build/Workers/{chunk-ED6GLQTK.js → chunk-5S2B46UQ.js} +1 -1
- package/Build/Workers/{chunk-B4GSRXE3.js → chunk-67ONR44K.js} +6 -6
- package/Build/Workers/{chunk-LOZ4NKY3.js → chunk-6EDBC234.js} +11 -11
- package/Build/Workers/{chunk-7ZB2RVIQ.js → chunk-6EV4VOET.js} +10 -10
- package/Build/Workers/{chunk-KHWLAQVA.js → chunk-7ITUZTFH.js} +1 -1
- package/Build/Workers/{chunk-JHBPC4LK.js → chunk-ARVZCY6X.js} +7 -7
- package/Build/Workers/{chunk-FFBJDW4A.js → chunk-B2UQN3DH.js} +6 -6
- package/Build/Workers/{chunk-VCNOFQYH.js → chunk-B2Y4ZS6X.js} +9 -9
- package/Build/Workers/{chunk-Q4ZVWJXX.js → chunk-BD2TPFGC.js} +5 -5
- package/Build/Workers/{chunk-K4AH3TDT.js → chunk-CHX2K5AC.js} +10 -10
- package/Build/Workers/{chunk-3LYROPON.js → chunk-CJGVEABL.js} +13 -13
- package/Build/Workers/{chunk-KSYBJA4M.js → chunk-DYJHEP3B.js} +5 -5
- package/Build/Workers/{chunk-CI2HEJFC.js → chunk-E3H7AVMK.js} +13 -13
- package/Build/Workers/{chunk-F4CUH4MR.js → chunk-EZNAJPP5.js} +4 -4
- package/Build/Workers/{chunk-YJX7X577.js → chunk-F7ZI463G.js} +15 -15
- package/Build/Workers/{chunk-HEZHXDYB.js → chunk-FMZ5CX6V.js} +1 -1
- package/Build/Workers/{chunk-G3BVMPWG.js → chunk-FRAWHNSR.js} +2 -2
- package/Build/Workers/{chunk-J7IH4EYI.js → chunk-GGV2XJHE.js} +7 -7
- package/Build/Workers/{chunk-5KWRW7YL.js → chunk-GK4QU6QI.js} +2 -2
- package/Build/Workers/{chunk-77XPS7ZA.js → chunk-HYPB7FAV.js} +10 -10
- package/Build/Workers/{chunk-MVM4JV5U.js → chunk-I4HO2ED2.js} +9 -9
- package/Build/Workers/{chunk-FX4R4MTH.js → chunk-IGINOLDX.js} +6 -6
- package/Build/Workers/{chunk-PWF4EY5P.js → chunk-ISQSYLZY.js} +4 -4
- package/Build/Workers/{chunk-7UHKH6M3.js → chunk-JZAMRL5I.js} +6 -6
- package/Build/Workers/{chunk-HUFQVUMY.js → chunk-K5G2WELR.js} +7 -7
- package/Build/Workers/{chunk-5S5OOA6U.js → chunk-L5SO4Y5V.js} +1 -1
- package/Build/Workers/{chunk-LNSWJ43X.js → chunk-LCMJQVIF.js} +11 -11
- package/Build/Workers/{chunk-WVNLSTOF.js → chunk-MWJW37I7.js} +2 -2
- package/Build/Workers/{chunk-ZGFIT57T.js → chunk-NAGMYRDW.js} +27 -20
- package/Build/Workers/{chunk-SDIDRZDG.js → chunk-OYO6TKMU.js} +7 -7
- package/Build/Workers/{chunk-HKHQ3EDR.js → chunk-PUTA3AE2.js} +4 -4
- package/Build/Workers/{chunk-JPDKYBLF.js → chunk-Q5BHMNKU.js} +13 -13
- package/Build/Workers/{chunk-XK4OP6VA.js → chunk-QTEX3Y4V.js} +17 -17
- package/Build/Workers/{chunk-TVL3F7IU.js → chunk-QZKN2RXM.js} +1 -1
- package/Build/Workers/{chunk-Z3QWTHI7.js → chunk-RO2Z3LCR.js} +14 -14
- package/Build/Workers/{chunk-N2XAJBC6.js → chunk-RRN6LRDX.js} +12 -12
- package/Build/Workers/{chunk-FYGLNDKG.js → chunk-SLIA3GQP.js} +7 -7
- package/Build/Workers/{chunk-7EO56M5R.js → chunk-TFCOEX3W.js} +2 -2
- package/Build/Workers/{chunk-KM6MITPF.js → chunk-TU6ZXHVU.js} +5 -5
- package/Build/Workers/{chunk-LS3KVHYY.js → chunk-VJ2PDF64.js} +6 -6
- package/Build/Workers/{chunk-D7ZBZPHV.js → chunk-VMVPONIV.js} +5 -5
- package/Build/Workers/{chunk-3PIZQT3I.js → chunk-WPXU45PH.js} +4 -4
- package/Build/Workers/{chunk-WEHZP4SE.js → chunk-XDHM4G3P.js} +7 -7
- package/Build/Workers/{chunk-TY4DKOWR.js → chunk-XED3RXKO.js} +2 -2
- package/Build/Workers/{chunk-ZMNLEL6W.js → chunk-YNYCGTQH.js} +5 -5
- package/Build/Workers/{chunk-4CHMVQTQ.js → chunk-Z4SI54EB.js} +4 -4
- package/Build/Workers/{chunk-3JBEPBPL.js → chunk-ZVDLC3T4.js} +13 -13
- package/Build/Workers/combineGeometry.js +22 -22
- package/Build/Workers/createBoxGeometry.js +16 -16
- package/Build/Workers/createBoxOutlineGeometry.js +14 -14
- package/Build/Workers/createCircleGeometry.js +24 -24
- package/Build/Workers/createCircleOutlineGeometry.js +17 -17
- package/Build/Workers/createCoplanarPolygonGeometry.js +31 -31
- package/Build/Workers/createCoplanarPolygonOutlineGeometry.js +29 -29
- package/Build/Workers/createCorridorGeometry.js +27 -27
- package/Build/Workers/createCorridorOutlineGeometry.js +26 -26
- package/Build/Workers/createCylinderGeometry.js +18 -18
- package/Build/Workers/createCylinderOutlineGeometry.js +16 -16
- package/Build/Workers/createEllipseGeometry.js +24 -24
- package/Build/Workers/createEllipseOutlineGeometry.js +17 -17
- package/Build/Workers/createEllipsoidGeometry.js +17 -17
- package/Build/Workers/createEllipsoidOutlineGeometry.js +16 -16
- package/Build/Workers/createFrustumGeometry.js +16 -16
- package/Build/Workers/createFrustumOutlineGeometry.js +16 -16
- package/Build/Workers/createGeometry.js +22 -22
- package/Build/Workers/createGroundPolylineGeometry.js +20 -20
- package/Build/Workers/createPlaneGeometry.js +14 -14
- package/Build/Workers/createPlaneOutlineGeometry.js +13 -13
- package/Build/Workers/createPolygonGeometry.js +30 -30
- package/Build/Workers/createPolygonOutlineGeometry.js +28 -28
- package/Build/Workers/createPolylineGeometry.js +23 -23
- package/Build/Workers/createPolylineVolumeGeometry.js +29 -29
- package/Build/Workers/createPolylineVolumeOutlineGeometry.js +25 -25
- package/Build/Workers/createRectangleGeometry.js +25 -25
- package/Build/Workers/createRectangleOutlineGeometry.js +18 -18
- package/Build/Workers/createSimplePolylineGeometry.js +21 -21
- package/Build/Workers/createSphereGeometry.js +17 -17
- package/Build/Workers/createSphereOutlineGeometry.js +16 -16
- package/Build/Workers/createTaskProcessorWorker.js +3 -3
- package/Build/Workers/createVectorTileClampedPolylines.js +13 -13
- package/Build/Workers/createVectorTileGeometries.js +22 -22
- package/Build/Workers/createVectorTilePoints.js +12 -12
- package/Build/Workers/createVectorTilePolygons.js +20 -20
- package/Build/Workers/createVectorTilePolylines.js +13 -13
- package/Build/Workers/createVerticesFromGoogleEarthEnterpriseBuffer.js +20 -20
- package/Build/Workers/createVerticesFromHeightmap.js +20 -20
- package/Build/Workers/createVerticesFromQuantizedTerrainMesh.js +17 -17
- package/Build/Workers/createWallGeometry.js +22 -22
- package/Build/Workers/createWallOutlineGeometry.js +21 -21
- package/Build/Workers/decodeDraco.js +11 -11
- package/Build/Workers/decodeGoogleEarthEnterprisePacket.js +5 -5
- package/Build/Workers/decodeI3S.js +10 -10
- package/Build/Workers/transcodeKTX2.js +50 -43
- package/Build/Workers/transferTypedArrayTest.js +1 -1
- package/Build/Workers/upsampleQuantizedTerrainMesh.js +20 -20
- package/Source/Core/EllipsoidRhumbLine.js +1 -1
- package/Source/Core/Ion.js +1 -1
- package/Source/Core/PolygonGeometryLibrary.js +26 -4
- package/Source/Core/TexturePacker.js +166 -0
- package/Source/DataSources/BillboardVisualizer.js +3 -3
- package/Source/DataSources/EntityCluster.js +44 -19
- package/Source/Renderer/Context.js +0 -4
- package/Source/Renderer/Texture.js +6 -5
- package/Source/Renderer/TextureAtlas.js +802 -0
- package/Source/Scene/ArcGisMapService.js +1 -1
- package/Source/Scene/Billboard.js +86 -141
- package/Source/Scene/BillboardCollection.js +132 -202
- package/Source/Scene/BillboardLoadState.js +44 -0
- package/Source/Scene/BillboardTexture.js +348 -0
- package/Source/Scene/Camera.js +2 -2
- package/Source/Scene/Cesium3DTilesVoxelProvider.js +380 -126
- package/Source/Scene/Cesium3DTilesetStatistics.js +0 -1
- package/Source/Scene/Expression.js +1 -0
- package/Source/Scene/GltfLoader.js +5 -7
- package/Source/Scene/ImplicitSubtree.js +2 -0
- package/Source/Scene/KeyframeNode.js +16 -2
- package/Source/Scene/LabelCollection.js +212 -182
- package/Source/Scene/Megatexture.js +145 -81
- package/Source/Scene/Model/CustomShader.js +0 -2
- package/Source/Scene/Model/Model.js +1 -1
- package/Source/Scene/Model/ModelUtility.js +5 -1
- package/Source/Scene/Scene.js +39 -15
- package/Source/Scene/ScreenSpaceCameraController.js +0 -8
- package/Source/Scene/SpatialNode.js +4 -11
- package/Source/Scene/Vector3DTilePoints.js +2 -5
- package/Source/Scene/VoxelBoxShape.js +12 -5
- package/Source/Scene/VoxelCell.js +6 -5
- package/Source/Scene/VoxelContent.js +171 -107
- package/Source/Scene/VoxelCylinderShape.js +65 -58
- package/Source/Scene/VoxelEllipsoidShape.js +15 -5
- package/Source/Scene/VoxelMetadataOrder.js +12 -0
- package/Source/Scene/VoxelPrimitive.js +122 -54
- package/Source/Scene/VoxelProvider.js +34 -29
- package/Source/Scene/VoxelRenderResources.js +30 -7
- package/Source/Scene/VoxelShape.js +10 -3
- package/Source/Scene/VoxelTraversal.js +264 -180
- package/Source/Scene/processVoxelProperties.js +3 -0
- package/Source/Shaders/GlobeFS.glsl +10 -1
- package/Source/Shaders/GlobeFS.js +10 -1
- package/Source/Shaders/Voxels/Megatexture.glsl +4 -16
- package/Source/Shaders/Voxels/Megatexture.js +4 -16
- package/Source/Shaders/Voxels/Octree.glsl +44 -7
- package/Source/Shaders/Voxels/Octree.js +44 -7
- package/Source/Shaders/Voxels/VoxelFS.glsl +9 -15
- package/Source/Shaders/Voxels/VoxelFS.js +9 -15
- package/Source/Shaders/Voxels/convertUvToCylinder.glsl +15 -15
- package/Source/Shaders/Voxels/convertUvToCylinder.js +15 -15
- package/index.d.ts +176 -79
- package/index.js +413 -409
- package/package.json +2 -2
- package/Source/Scene/TextureAtlas.js +0 -558
|
@@ -286,7 +286,16 @@ vec3 computeEllipsoidPosition()\n\
|
|
|
286
286
|
vec2 xy = gl_FragCoord.xy / czm_viewport.zw * 2.0 - vec2(1.0);\n\
|
|
287
287
|
xy *= czm_viewport.zw * mpp * 0.5;\n\
|
|
288
288
|
\n\
|
|
289
|
-
vec3 direction
|
|
289
|
+
vec3 direction;\n\
|
|
290
|
+
if (czm_orthographicIn3D == 1.0)\n\
|
|
291
|
+
{\n\
|
|
292
|
+
direction = vec3(0.0, 0.0, -1.0);\n\
|
|
293
|
+
}\n\
|
|
294
|
+
else\n\
|
|
295
|
+
{\n\
|
|
296
|
+
direction = normalize(vec3(xy, -czm_currentFrustum.x));\n\
|
|
297
|
+
}\n\
|
|
298
|
+
\n\
|
|
290
299
|
czm_ray ray = czm_ray(vec3(0.0), direction);\n\
|
|
291
300
|
\n\
|
|
292
301
|
vec3 ellipsoid_center = czm_view[3].xyz;\n\
|
|
@@ -12,12 +12,6 @@ uniform vec2 u_megatextureVoxelSizeUv;
|
|
|
12
12
|
uniform vec2 u_megatextureSliceSizeUv;
|
|
13
13
|
uniform vec2 u_megatextureTileSizeUv;
|
|
14
14
|
|
|
15
|
-
uniform ivec3 u_dimensions; // does not include padding
|
|
16
|
-
#if defined(PADDING)
|
|
17
|
-
uniform ivec3 u_paddingBefore;
|
|
18
|
-
uniform ivec3 u_paddingAfter;
|
|
19
|
-
#endif
|
|
20
|
-
|
|
21
15
|
// Integer min, max, clamp: For WebGL1 only
|
|
22
16
|
int intMin(int a, int b) {
|
|
23
17
|
return a <= b ? a : b;
|
|
@@ -72,14 +66,8 @@ vec2 index1DTo2DTexcoord(int index, ivec2 dimensions, vec2 uvScale)
|
|
|
72
66
|
|
|
73
67
|
Properties getPropertiesFromMegatexture(in SampleData sampleData) {
|
|
74
68
|
int tileIndex = sampleData.megatextureIndex;
|
|
75
|
-
vec3 voxelCoord = sampleData.tileUv * vec3(u_dimensions);
|
|
76
|
-
ivec3 voxelDimensions = u_dimensions;
|
|
77
|
-
|
|
78
|
-
#if defined(PADDING)
|
|
79
|
-
voxelDimensions += u_paddingBefore + u_paddingAfter;
|
|
80
|
-
voxelCoord += vec3(u_paddingBefore);
|
|
81
|
-
#endif
|
|
82
69
|
|
|
70
|
+
vec3 voxelCoord = sampleData.inputCoordinate;
|
|
83
71
|
#if defined(NEAREST_SAMPLING)
|
|
84
72
|
// Round to the center of the nearest voxel
|
|
85
73
|
voxelCoord = floor(voxelCoord) + vec3(0.5);
|
|
@@ -91,11 +79,11 @@ Properties getPropertiesFromMegatexture(in SampleData sampleData) {
|
|
|
91
79
|
// Slice location
|
|
92
80
|
float slice = voxelCoord.z - 0.5;
|
|
93
81
|
int sliceIndex = int(floor(slice));
|
|
94
|
-
int sliceIndex0 = intClamp(sliceIndex, 0,
|
|
82
|
+
int sliceIndex0 = intClamp(sliceIndex, 0, u_inputDimensions.z - 1);
|
|
95
83
|
vec2 sliceUvOffset0 = index1DTo2DTexcoord(sliceIndex0, u_megatextureSliceDimensions, u_megatextureSliceSizeUv);
|
|
96
84
|
|
|
97
85
|
// Voxel location
|
|
98
|
-
vec2 voxelUvOffset = clamp(voxelCoord.xy, vec2(0.5), vec2(
|
|
86
|
+
vec2 voxelUvOffset = clamp(voxelCoord.xy, vec2(0.5), vec2(u_inputDimensions.xy) - vec2(0.5)) * u_megatextureVoxelSizeUv;
|
|
99
87
|
|
|
100
88
|
// Final location in the megatexture
|
|
101
89
|
vec2 uv0 = tileUvOffset + sliceUvOffset0 + voxelUvOffset;
|
|
@@ -104,7 +92,7 @@ Properties getPropertiesFromMegatexture(in SampleData sampleData) {
|
|
|
104
92
|
return getPropertiesFromMegatextureAtUv(uv0);
|
|
105
93
|
#else
|
|
106
94
|
float sliceLerp = fract(slice);
|
|
107
|
-
int sliceIndex1 = intMin(sliceIndex + 1,
|
|
95
|
+
int sliceIndex1 = intMin(sliceIndex + 1, u_inputDimensions.z - 1);
|
|
108
96
|
vec2 sliceUvOffset1 = index1DTo2DTexcoord(sliceIndex1, u_megatextureSliceDimensions, u_megatextureSliceSizeUv);
|
|
109
97
|
vec2 uv1 = tileUvOffset + sliceUvOffset1 + voxelUvOffset;
|
|
110
98
|
Properties properties0 = getPropertiesFromMegatextureAtUv(uv0);
|
|
@@ -13,12 +13,6 @@ uniform vec2 u_megatextureVoxelSizeUv;\n\
|
|
|
13
13
|
uniform vec2 u_megatextureSliceSizeUv;\n\
|
|
14
14
|
uniform vec2 u_megatextureTileSizeUv;\n\
|
|
15
15
|
\n\
|
|
16
|
-
uniform ivec3 u_dimensions; // does not include padding\n\
|
|
17
|
-
#if defined(PADDING)\n\
|
|
18
|
-
uniform ivec3 u_paddingBefore;\n\
|
|
19
|
-
uniform ivec3 u_paddingAfter;\n\
|
|
20
|
-
#endif\n\
|
|
21
|
-
\n\
|
|
22
16
|
// Integer min, max, clamp: For WebGL1 only\n\
|
|
23
17
|
int intMin(int a, int b) {\n\
|
|
24
18
|
return a <= b ? a : b;\n\
|
|
@@ -73,14 +67,8 @@ vec2 index1DTo2DTexcoord(int index, ivec2 dimensions, vec2 uvScale)\n\
|
|
|
73
67
|
\n\
|
|
74
68
|
Properties getPropertiesFromMegatexture(in SampleData sampleData) {\n\
|
|
75
69
|
int tileIndex = sampleData.megatextureIndex;\n\
|
|
76
|
-
vec3 voxelCoord = sampleData.tileUv * vec3(u_dimensions);\n\
|
|
77
|
-
ivec3 voxelDimensions = u_dimensions;\n\
|
|
78
|
-
\n\
|
|
79
|
-
#if defined(PADDING)\n\
|
|
80
|
-
voxelDimensions += u_paddingBefore + u_paddingAfter;\n\
|
|
81
|
-
voxelCoord += vec3(u_paddingBefore);\n\
|
|
82
|
-
#endif\n\
|
|
83
70
|
\n\
|
|
71
|
+
vec3 voxelCoord = sampleData.inputCoordinate;\n\
|
|
84
72
|
#if defined(NEAREST_SAMPLING)\n\
|
|
85
73
|
// Round to the center of the nearest voxel\n\
|
|
86
74
|
voxelCoord = floor(voxelCoord) + vec3(0.5);\n\
|
|
@@ -92,11 +80,11 @@ Properties getPropertiesFromMegatexture(in SampleData sampleData) {\n\
|
|
|
92
80
|
// Slice location\n\
|
|
93
81
|
float slice = voxelCoord.z - 0.5;\n\
|
|
94
82
|
int sliceIndex = int(floor(slice));\n\
|
|
95
|
-
int sliceIndex0 = intClamp(sliceIndex, 0,
|
|
83
|
+
int sliceIndex0 = intClamp(sliceIndex, 0, u_inputDimensions.z - 1);\n\
|
|
96
84
|
vec2 sliceUvOffset0 = index1DTo2DTexcoord(sliceIndex0, u_megatextureSliceDimensions, u_megatextureSliceSizeUv);\n\
|
|
97
85
|
\n\
|
|
98
86
|
// Voxel location\n\
|
|
99
|
-
vec2 voxelUvOffset = clamp(voxelCoord.xy, vec2(0.5), vec2(
|
|
87
|
+
vec2 voxelUvOffset = clamp(voxelCoord.xy, vec2(0.5), vec2(u_inputDimensions.xy) - vec2(0.5)) * u_megatextureVoxelSizeUv;\n\
|
|
100
88
|
\n\
|
|
101
89
|
// Final location in the megatexture\n\
|
|
102
90
|
vec2 uv0 = tileUvOffset + sliceUvOffset0 + voxelUvOffset;\n\
|
|
@@ -105,7 +93,7 @@ Properties getPropertiesFromMegatexture(in SampleData sampleData) {\n\
|
|
|
105
93
|
return getPropertiesFromMegatextureAtUv(uv0);\n\
|
|
106
94
|
#else\n\
|
|
107
95
|
float sliceLerp = fract(slice);\n\
|
|
108
|
-
int sliceIndex1 = intMin(sliceIndex + 1,
|
|
96
|
+
int sliceIndex1 = intMin(sliceIndex + 1, u_inputDimensions.z - 1);\n\
|
|
109
97
|
vec2 sliceUvOffset1 = index1DTo2DTexcoord(sliceIndex1, u_megatextureSliceDimensions, u_megatextureSliceSizeUv);\n\
|
|
110
98
|
vec2 uv1 = tileUvOffset + sliceUvOffset1 + voxelUvOffset;\n\
|
|
111
99
|
Properties properties0 = getPropertiesFromMegatextureAtUv(uv0);\n\
|
|
@@ -13,6 +13,11 @@ uniform sampler2D u_octreeLeafNodeTexture;
|
|
|
13
13
|
uniform vec2 u_octreeLeafNodeTexelSizeUv;
|
|
14
14
|
uniform int u_octreeLeafNodeTilesPerRow;
|
|
15
15
|
#endif
|
|
16
|
+
uniform ivec3 u_dimensions; // does not include padding, and is in the z-up orientation
|
|
17
|
+
uniform ivec3 u_inputDimensions; // includes padding, and is in the orientation of the input data
|
|
18
|
+
#if defined(PADDING)
|
|
19
|
+
uniform ivec3 u_paddingBefore;
|
|
20
|
+
#endif
|
|
16
21
|
|
|
17
22
|
struct OctreeNodeData {
|
|
18
23
|
int data;
|
|
@@ -28,6 +33,7 @@ struct SampleData {
|
|
|
28
33
|
int megatextureIndex;
|
|
29
34
|
ivec4 tileCoords;
|
|
30
35
|
vec3 tileUv;
|
|
36
|
+
vec3 inputCoordinate;
|
|
31
37
|
#if (SAMPLE_COUNT > 1)
|
|
32
38
|
float weight;
|
|
33
39
|
#endif
|
|
@@ -88,6 +94,37 @@ vec3 getClampedTileUv(in vec3 shapePosition, in ivec4 octreeCoords) {
|
|
|
88
94
|
return clamp(tileUv, vec3(0.0), vec3(1.0));
|
|
89
95
|
}
|
|
90
96
|
|
|
97
|
+
void addSampleCoordinates(in vec3 shapePosition, inout SampleData sampleData) {
|
|
98
|
+
vec3 tileUv = getClampedTileUv(shapePosition, sampleData.tileCoords);
|
|
99
|
+
|
|
100
|
+
vec3 inputCoordinate = tileUv * vec3(u_dimensions);
|
|
101
|
+
#if defined(PADDING)
|
|
102
|
+
inputCoordinate += vec3(u_paddingBefore);
|
|
103
|
+
#endif
|
|
104
|
+
#if defined(GLTF_METADATA_ORDER)
|
|
105
|
+
#if defined(SHAPE_BOX)
|
|
106
|
+
float inputY = inputCoordinate.y;
|
|
107
|
+
inputCoordinate.y = float(u_inputDimensions.y) - inputCoordinate.z;
|
|
108
|
+
inputCoordinate.z = inputY;
|
|
109
|
+
#elif defined(SHAPE_CYLINDER)
|
|
110
|
+
float angle = inputCoordinate.y;
|
|
111
|
+
float height = inputCoordinate.z;
|
|
112
|
+
#if (!defined(CYLINDER_HAS_SHAPE_BOUNDS_ANGLE))
|
|
113
|
+
// Account for the different 0-angle convention in glTF vs 3DTiles
|
|
114
|
+
if (sampleData.tileCoords.w == 0) {
|
|
115
|
+
float angleCount = float(u_inputDimensions.z);
|
|
116
|
+
angle = mod(angle + angleCount / 2.0, angleCount);
|
|
117
|
+
}
|
|
118
|
+
#endif
|
|
119
|
+
inputCoordinate.y = height;
|
|
120
|
+
inputCoordinate.z = angle;
|
|
121
|
+
#endif
|
|
122
|
+
#endif
|
|
123
|
+
|
|
124
|
+
sampleData.tileUv = tileUv;
|
|
125
|
+
sampleData.inputCoordinate = inputCoordinate;
|
|
126
|
+
}
|
|
127
|
+
|
|
91
128
|
void getOctreeLeafSampleData(in OctreeNodeData data, in ivec4 octreeCoords, out SampleData sampleData) {
|
|
92
129
|
sampleData.megatextureIndex = data.data;
|
|
93
130
|
sampleData.tileCoords = (data.flag == OCTREE_FLAG_PACKED_LEAF_FROM_PARENT)
|
|
@@ -172,11 +209,11 @@ void traverseOctreeFromBeginning(in vec3 shapePosition, out TraversalData traver
|
|
|
172
209
|
|
|
173
210
|
#if (SAMPLE_COUNT == 1)
|
|
174
211
|
getOctreeLeafSampleData(nodeData, traversalData.octreeCoords, sampleDatas[0]);
|
|
175
|
-
|
|
212
|
+
addSampleCoordinates(shapePosition, sampleDatas[0]);
|
|
176
213
|
#else
|
|
177
214
|
getOctreeLeafSampleDatas(nodeData, traversalData.octreeCoords, sampleDatas);
|
|
178
|
-
|
|
179
|
-
|
|
215
|
+
addSampleCoordinates(shapePosition, sampleDatas[0]);
|
|
216
|
+
addSampleCoordinates(shapePosition, sampleDatas[1]);
|
|
180
217
|
#endif
|
|
181
218
|
}
|
|
182
219
|
|
|
@@ -194,7 +231,7 @@ bool insideTile(in vec3 shapePosition, in ivec4 octreeCoords) {
|
|
|
194
231
|
void traverseOctreeFromExisting(in vec3 shapePosition, inout TraversalData traversalData, inout SampleData sampleDatas[SAMPLE_COUNT]) {
|
|
195
232
|
if (insideTile(shapePosition, traversalData.octreeCoords)) {
|
|
196
233
|
for (int i = 0; i < SAMPLE_COUNT; i++) {
|
|
197
|
-
|
|
234
|
+
addSampleCoordinates(shapePosition, sampleDatas[i]);
|
|
198
235
|
}
|
|
199
236
|
return;
|
|
200
237
|
}
|
|
@@ -216,10 +253,10 @@ void traverseOctreeFromExisting(in vec3 shapePosition, inout TraversalData trave
|
|
|
216
253
|
|
|
217
254
|
#if (SAMPLE_COUNT == 1)
|
|
218
255
|
getOctreeLeafSampleData(nodeData, traversalData.octreeCoords, sampleDatas[0]);
|
|
219
|
-
|
|
256
|
+
addSampleCoordinates(shapePosition, sampleDatas[0]);
|
|
220
257
|
#else
|
|
221
258
|
getOctreeLeafSampleDatas(nodeData, traversalData.octreeCoords, sampleDatas);
|
|
222
|
-
|
|
223
|
-
|
|
259
|
+
addSampleCoordinates(shapePosition, sampleDatas[0]);
|
|
260
|
+
addSampleCoordinates(shapePosition, sampleDatas[1]);
|
|
224
261
|
#endif
|
|
225
262
|
}
|
|
@@ -14,6 +14,11 @@ uniform sampler2D u_octreeLeafNodeTexture;\n\
|
|
|
14
14
|
uniform vec2 u_octreeLeafNodeTexelSizeUv;\n\
|
|
15
15
|
uniform int u_octreeLeafNodeTilesPerRow;\n\
|
|
16
16
|
#endif\n\
|
|
17
|
+
uniform ivec3 u_dimensions; // does not include padding, and is in the z-up orientation\n\
|
|
18
|
+
uniform ivec3 u_inputDimensions; // includes padding, and is in the orientation of the input data\n\
|
|
19
|
+
#if defined(PADDING)\n\
|
|
20
|
+
uniform ivec3 u_paddingBefore;\n\
|
|
21
|
+
#endif\n\
|
|
17
22
|
\n\
|
|
18
23
|
struct OctreeNodeData {\n\
|
|
19
24
|
int data;\n\
|
|
@@ -29,6 +34,7 @@ struct SampleData {\n\
|
|
|
29
34
|
int megatextureIndex;\n\
|
|
30
35
|
ivec4 tileCoords;\n\
|
|
31
36
|
vec3 tileUv;\n\
|
|
37
|
+
vec3 inputCoordinate;\n\
|
|
32
38
|
#if (SAMPLE_COUNT > 1)\n\
|
|
33
39
|
float weight;\n\
|
|
34
40
|
#endif\n\
|
|
@@ -89,6 +95,37 @@ vec3 getClampedTileUv(in vec3 shapePosition, in ivec4 octreeCoords) {\n\
|
|
|
89
95
|
return clamp(tileUv, vec3(0.0), vec3(1.0));\n\
|
|
90
96
|
}\n\
|
|
91
97
|
\n\
|
|
98
|
+
void addSampleCoordinates(in vec3 shapePosition, inout SampleData sampleData) {\n\
|
|
99
|
+
vec3 tileUv = getClampedTileUv(shapePosition, sampleData.tileCoords);\n\
|
|
100
|
+
\n\
|
|
101
|
+
vec3 inputCoordinate = tileUv * vec3(u_dimensions);\n\
|
|
102
|
+
#if defined(PADDING)\n\
|
|
103
|
+
inputCoordinate += vec3(u_paddingBefore);\n\
|
|
104
|
+
#endif\n\
|
|
105
|
+
#if defined(GLTF_METADATA_ORDER)\n\
|
|
106
|
+
#if defined(SHAPE_BOX)\n\
|
|
107
|
+
float inputY = inputCoordinate.y;\n\
|
|
108
|
+
inputCoordinate.y = float(u_inputDimensions.y) - inputCoordinate.z;\n\
|
|
109
|
+
inputCoordinate.z = inputY;\n\
|
|
110
|
+
#elif defined(SHAPE_CYLINDER)\n\
|
|
111
|
+
float angle = inputCoordinate.y;\n\
|
|
112
|
+
float height = inputCoordinate.z;\n\
|
|
113
|
+
#if (!defined(CYLINDER_HAS_SHAPE_BOUNDS_ANGLE))\n\
|
|
114
|
+
// Account for the different 0-angle convention in glTF vs 3DTiles\n\
|
|
115
|
+
if (sampleData.tileCoords.w == 0) {\n\
|
|
116
|
+
float angleCount = float(u_inputDimensions.z);\n\
|
|
117
|
+
angle = mod(angle + angleCount / 2.0, angleCount);\n\
|
|
118
|
+
}\n\
|
|
119
|
+
#endif\n\
|
|
120
|
+
inputCoordinate.y = height;\n\
|
|
121
|
+
inputCoordinate.z = angle;\n\
|
|
122
|
+
#endif\n\
|
|
123
|
+
#endif\n\
|
|
124
|
+
\n\
|
|
125
|
+
sampleData.tileUv = tileUv;\n\
|
|
126
|
+
sampleData.inputCoordinate = inputCoordinate;\n\
|
|
127
|
+
}\n\
|
|
128
|
+
\n\
|
|
92
129
|
void getOctreeLeafSampleData(in OctreeNodeData data, in ivec4 octreeCoords, out SampleData sampleData) {\n\
|
|
93
130
|
sampleData.megatextureIndex = data.data;\n\
|
|
94
131
|
sampleData.tileCoords = (data.flag == OCTREE_FLAG_PACKED_LEAF_FROM_PARENT)\n\
|
|
@@ -173,11 +210,11 @@ void traverseOctreeFromBeginning(in vec3 shapePosition, out TraversalData traver
|
|
|
173
210
|
\n\
|
|
174
211
|
#if (SAMPLE_COUNT == 1)\n\
|
|
175
212
|
getOctreeLeafSampleData(nodeData, traversalData.octreeCoords, sampleDatas[0]);\n\
|
|
176
|
-
|
|
213
|
+
addSampleCoordinates(shapePosition, sampleDatas[0]);\n\
|
|
177
214
|
#else\n\
|
|
178
215
|
getOctreeLeafSampleDatas(nodeData, traversalData.octreeCoords, sampleDatas);\n\
|
|
179
|
-
|
|
180
|
-
|
|
216
|
+
addSampleCoordinates(shapePosition, sampleDatas[0]);\n\
|
|
217
|
+
addSampleCoordinates(shapePosition, sampleDatas[1]);\n\
|
|
181
218
|
#endif\n\
|
|
182
219
|
}\n\
|
|
183
220
|
\n\
|
|
@@ -195,7 +232,7 @@ bool insideTile(in vec3 shapePosition, in ivec4 octreeCoords) {\n\
|
|
|
195
232
|
void traverseOctreeFromExisting(in vec3 shapePosition, inout TraversalData traversalData, inout SampleData sampleDatas[SAMPLE_COUNT]) {\n\
|
|
196
233
|
if (insideTile(shapePosition, traversalData.octreeCoords)) {\n\
|
|
197
234
|
for (int i = 0; i < SAMPLE_COUNT; i++) {\n\
|
|
198
|
-
|
|
235
|
+
addSampleCoordinates(shapePosition, sampleDatas[i]);\n\
|
|
199
236
|
}\n\
|
|
200
237
|
return;\n\
|
|
201
238
|
}\n\
|
|
@@ -217,11 +254,11 @@ void traverseOctreeFromExisting(in vec3 shapePosition, inout TraversalData trave
|
|
|
217
254
|
\n\
|
|
218
255
|
#if (SAMPLE_COUNT == 1)\n\
|
|
219
256
|
getOctreeLeafSampleData(nodeData, traversalData.octreeCoords, sampleDatas[0]);\n\
|
|
220
|
-
|
|
257
|
+
addSampleCoordinates(shapePosition, sampleDatas[0]);\n\
|
|
221
258
|
#else\n\
|
|
222
259
|
getOctreeLeafSampleDatas(nodeData, traversalData.octreeCoords, sampleDatas);\n\
|
|
223
|
-
|
|
224
|
-
|
|
260
|
+
addSampleCoordinates(shapePosition, sampleDatas[0]);\n\
|
|
261
|
+
addSampleCoordinates(shapePosition, sampleDatas[1]);\n\
|
|
225
262
|
#endif\n\
|
|
226
263
|
}\n\
|
|
227
264
|
";
|
|
@@ -100,21 +100,15 @@ vec2 packFloatToVec2(float value) {
|
|
|
100
100
|
return vec2(highBits, lowBits);
|
|
101
101
|
}
|
|
102
102
|
|
|
103
|
-
int getSampleIndex(in
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
// tileUv = 1.0 is a valid coordinate but sampleIndex = voxelDimensions is not.
|
|
107
|
-
// (tileUv = 1.0 corresponds to the last sample, at index = voxelDimensions - 1).
|
|
103
|
+
int getSampleIndex(in SampleData sampleData) {
|
|
104
|
+
// tileUv = 1.0 is a valid coordinate but sampleIndex = u_inputDimensions is not.
|
|
105
|
+
// (tileUv = 1.0 corresponds to the far edge of the last sample, at index = u_inputDimensions - 1).
|
|
108
106
|
// Clamp to [0, voxelDimensions - 0.5) to avoid numerical error before flooring
|
|
109
|
-
vec3 maxCoordinate = vec3(
|
|
110
|
-
|
|
111
|
-
ivec3 sampleIndex = ivec3(floor(
|
|
112
|
-
#if defined(PADDING)
|
|
113
|
-
voxelDimensions += u_paddingBefore + u_paddingAfter;
|
|
114
|
-
sampleIndex += u_paddingBefore;
|
|
115
|
-
#endif
|
|
107
|
+
vec3 maxCoordinate = vec3(u_inputDimensions) - vec3(0.5);
|
|
108
|
+
vec3 inputCoordinate = clamp(sampleData.inputCoordinate, vec3(0.0), maxCoordinate);
|
|
109
|
+
ivec3 sampleIndex = ivec3(floor(inputCoordinate));
|
|
116
110
|
// Convert to a 1D index for lookup in a 1D data array
|
|
117
|
-
return sampleIndex.x +
|
|
111
|
+
return sampleIndex.x + u_inputDimensions.x * (sampleIndex.y + u_inputDimensions.y * sampleIndex.z);
|
|
118
112
|
}
|
|
119
113
|
|
|
120
114
|
void main()
|
|
@@ -181,7 +175,7 @@ void main()
|
|
|
181
175
|
fragmentInput.voxel.travelDistance = step.w;
|
|
182
176
|
fragmentInput.voxel.stepCount = stepCount;
|
|
183
177
|
fragmentInput.voxel.tileIndex = sampleDatas[0].megatextureIndex;
|
|
184
|
-
fragmentInput.voxel.sampleIndex = getSampleIndex(sampleDatas[0]
|
|
178
|
+
fragmentInput.voxel.sampleIndex = getSampleIndex(sampleDatas[0]);
|
|
185
179
|
|
|
186
180
|
// Run the custom shader
|
|
187
181
|
czm_modelMaterial materialOutput;
|
|
@@ -250,7 +244,7 @@ void main()
|
|
|
250
244
|
discard;
|
|
251
245
|
}
|
|
252
246
|
vec2 megatextureId = packIntToVec2(sampleDatas[0].megatextureIndex);
|
|
253
|
-
vec2 sampleIndex = packIntToVec2(getSampleIndex(sampleDatas[0]
|
|
247
|
+
vec2 sampleIndex = packIntToVec2(getSampleIndex(sampleDatas[0]));
|
|
254
248
|
out_FragColor = vec4(megatextureId, sampleIndex);
|
|
255
249
|
#else
|
|
256
250
|
out_FragColor = colorAccum;
|
|
@@ -101,21 +101,15 @@ vec2 packFloatToVec2(float value) {\n\
|
|
|
101
101
|
return vec2(highBits, lowBits);\n\
|
|
102
102
|
}\n\
|
|
103
103
|
\n\
|
|
104
|
-
int getSampleIndex(in
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
// tileUv = 1.0 is a valid coordinate but sampleIndex = voxelDimensions is not.\n\
|
|
108
|
-
// (tileUv = 1.0 corresponds to the last sample, at index = voxelDimensions - 1).\n\
|
|
104
|
+
int getSampleIndex(in SampleData sampleData) {\n\
|
|
105
|
+
// tileUv = 1.0 is a valid coordinate but sampleIndex = u_inputDimensions is not.\n\
|
|
106
|
+
// (tileUv = 1.0 corresponds to the far edge of the last sample, at index = u_inputDimensions - 1).\n\
|
|
109
107
|
// Clamp to [0, voxelDimensions - 0.5) to avoid numerical error before flooring\n\
|
|
110
|
-
vec3 maxCoordinate = vec3(
|
|
111
|
-
|
|
112
|
-
ivec3 sampleIndex = ivec3(floor(
|
|
113
|
-
#if defined(PADDING)\n\
|
|
114
|
-
voxelDimensions += u_paddingBefore + u_paddingAfter;\n\
|
|
115
|
-
sampleIndex += u_paddingBefore;\n\
|
|
116
|
-
#endif\n\
|
|
108
|
+
vec3 maxCoordinate = vec3(u_inputDimensions) - vec3(0.5);\n\
|
|
109
|
+
vec3 inputCoordinate = clamp(sampleData.inputCoordinate, vec3(0.0), maxCoordinate);\n\
|
|
110
|
+
ivec3 sampleIndex = ivec3(floor(inputCoordinate));\n\
|
|
117
111
|
// Convert to a 1D index for lookup in a 1D data array\n\
|
|
118
|
-
return sampleIndex.x +
|
|
112
|
+
return sampleIndex.x + u_inputDimensions.x * (sampleIndex.y + u_inputDimensions.y * sampleIndex.z);\n\
|
|
119
113
|
}\n\
|
|
120
114
|
\n\
|
|
121
115
|
void main()\n\
|
|
@@ -182,7 +176,7 @@ void main()\n\
|
|
|
182
176
|
fragmentInput.voxel.travelDistance = step.w;\n\
|
|
183
177
|
fragmentInput.voxel.stepCount = stepCount;\n\
|
|
184
178
|
fragmentInput.voxel.tileIndex = sampleDatas[0].megatextureIndex;\n\
|
|
185
|
-
fragmentInput.voxel.sampleIndex = getSampleIndex(sampleDatas[0]
|
|
179
|
+
fragmentInput.voxel.sampleIndex = getSampleIndex(sampleDatas[0]);\n\
|
|
186
180
|
\n\
|
|
187
181
|
// Run the custom shader\n\
|
|
188
182
|
czm_modelMaterial materialOutput;\n\
|
|
@@ -251,7 +245,7 @@ void main()\n\
|
|
|
251
245
|
discard;\n\
|
|
252
246
|
}\n\
|
|
253
247
|
vec2 megatextureId = packIntToVec2(sampleDatas[0].megatextureIndex);\n\
|
|
254
|
-
vec2 sampleIndex = packIntToVec2(getSampleIndex(sampleDatas[0]
|
|
248
|
+
vec2 sampleIndex = packIntToVec2(getSampleIndex(sampleDatas[0]));\n\
|
|
255
249
|
out_FragColor = vec4(megatextureId, sampleIndex);\n\
|
|
256
250
|
#else\n\
|
|
257
251
|
out_FragColor = colorAccum;\n\
|
|
@@ -37,7 +37,7 @@ PointJacobianT convertUvToShapeSpaceDerivative(in vec3 positionUv) {
|
|
|
37
37
|
float angle = atan(position.y, position.x);
|
|
38
38
|
vec3 east = normalize(vec3(-position.y, position.x, 0.0));
|
|
39
39
|
|
|
40
|
-
vec3 point = vec3(radius,
|
|
40
|
+
vec3 point = vec3(radius, angle, height);
|
|
41
41
|
mat3 jacobianT = mat3(radial, z, east / length(position.xy));
|
|
42
42
|
return PointJacobianT(point, jacobianT);
|
|
43
43
|
}
|
|
@@ -48,12 +48,7 @@ vec3 convertShapeToShapeUvSpace(in vec3 positionShape) {
|
|
|
48
48
|
radius = radius * u_cylinderUvToShapeUvRadius.x + u_cylinderUvToShapeUvRadius.y;
|
|
49
49
|
#endif
|
|
50
50
|
|
|
51
|
-
float
|
|
52
|
-
#if defined(CYLINDER_HAS_SHAPE_BOUNDS_HEIGHT)
|
|
53
|
-
height = height * u_cylinderUvToShapeUvHeight.x + u_cylinderUvToShapeUvHeight.y;
|
|
54
|
-
#endif
|
|
55
|
-
|
|
56
|
-
float angle = (positionShape.z + czm_pi) / czm_twoPi;
|
|
51
|
+
float angle = (positionShape.y + czm_pi) / czm_twoPi;
|
|
57
52
|
#if defined(CYLINDER_HAS_SHAPE_BOUNDS_ANGLE)
|
|
58
53
|
#if defined(CYLINDER_HAS_SHAPE_BOUNDS_ANGLE_MIN_MAX_REVERSED)
|
|
59
54
|
// Comparing against u_cylinderShapeUvAngleMinMax has precision problems. u_cylinderShapeUvAngleRangeZeroMid is more conservative.
|
|
@@ -70,7 +65,12 @@ vec3 convertShapeToShapeUvSpace(in vec3 positionShape) {
|
|
|
70
65
|
angle = angle * u_cylinderUvToShapeUvAngle.x + u_cylinderUvToShapeUvAngle.y;
|
|
71
66
|
#endif
|
|
72
67
|
|
|
73
|
-
|
|
68
|
+
float height = positionShape.z;
|
|
69
|
+
#if defined(CYLINDER_HAS_SHAPE_BOUNDS_HEIGHT)
|
|
70
|
+
height = height * u_cylinderUvToShapeUvHeight.x + u_cylinderUvToShapeUvHeight.y;
|
|
71
|
+
#endif
|
|
72
|
+
|
|
73
|
+
return vec3(radius, angle, height);
|
|
74
74
|
}
|
|
75
75
|
|
|
76
76
|
PointJacobianT convertUvToShapeUvSpaceDerivative(in vec3 positionUv) {
|
|
@@ -85,15 +85,15 @@ vec3 scaleShapeUvToShapeSpace(in vec3 shapeUv) {
|
|
|
85
85
|
radius /= u_cylinderUvToShapeUvRadius.x;
|
|
86
86
|
#endif
|
|
87
87
|
|
|
88
|
-
float
|
|
89
|
-
#if defined(CYLINDER_HAS_SHAPE_BOUNDS_HEIGHT)
|
|
90
|
-
height /= u_cylinderUvToShapeUvHeight.x;
|
|
91
|
-
#endif
|
|
92
|
-
|
|
93
|
-
float angle = shapeUv.z * czm_twoPi;
|
|
88
|
+
float angle = shapeUv.y * czm_twoPi;
|
|
94
89
|
#if defined(CYLINDER_HAS_SHAPE_BOUNDS_ANGLE)
|
|
95
90
|
angle /= u_cylinderUvToShapeUvAngle.x;
|
|
96
91
|
#endif
|
|
97
92
|
|
|
98
|
-
|
|
93
|
+
float height = shapeUv.z;
|
|
94
|
+
#if defined(CYLINDER_HAS_SHAPE_BOUNDS_HEIGHT)
|
|
95
|
+
height /= u_cylinderUvToShapeUvHeight.x;
|
|
96
|
+
#endif
|
|
97
|
+
|
|
98
|
+
return vec3(radius, angle, height);
|
|
99
99
|
}
|
|
@@ -38,7 +38,7 @@ PointJacobianT convertUvToShapeSpaceDerivative(in vec3 positionUv) {\n\
|
|
|
38
38
|
float angle = atan(position.y, position.x);\n\
|
|
39
39
|
vec3 east = normalize(vec3(-position.y, position.x, 0.0));\n\
|
|
40
40
|
\n\
|
|
41
|
-
vec3 point = vec3(radius,
|
|
41
|
+
vec3 point = vec3(radius, angle, height);\n\
|
|
42
42
|
mat3 jacobianT = mat3(radial, z, east / length(position.xy));\n\
|
|
43
43
|
return PointJacobianT(point, jacobianT);\n\
|
|
44
44
|
}\n\
|
|
@@ -49,12 +49,7 @@ vec3 convertShapeToShapeUvSpace(in vec3 positionShape) {\n\
|
|
|
49
49
|
radius = radius * u_cylinderUvToShapeUvRadius.x + u_cylinderUvToShapeUvRadius.y;\n\
|
|
50
50
|
#endif\n\
|
|
51
51
|
\n\
|
|
52
|
-
float
|
|
53
|
-
#if defined(CYLINDER_HAS_SHAPE_BOUNDS_HEIGHT)\n\
|
|
54
|
-
height = height * u_cylinderUvToShapeUvHeight.x + u_cylinderUvToShapeUvHeight.y;\n\
|
|
55
|
-
#endif\n\
|
|
56
|
-
\n\
|
|
57
|
-
float angle = (positionShape.z + czm_pi) / czm_twoPi;\n\
|
|
52
|
+
float angle = (positionShape.y + czm_pi) / czm_twoPi;\n\
|
|
58
53
|
#if defined(CYLINDER_HAS_SHAPE_BOUNDS_ANGLE)\n\
|
|
59
54
|
#if defined(CYLINDER_HAS_SHAPE_BOUNDS_ANGLE_MIN_MAX_REVERSED)\n\
|
|
60
55
|
// Comparing against u_cylinderShapeUvAngleMinMax has precision problems. u_cylinderShapeUvAngleRangeZeroMid is more conservative.\n\
|
|
@@ -71,7 +66,12 @@ vec3 convertShapeToShapeUvSpace(in vec3 positionShape) {\n\
|
|
|
71
66
|
angle = angle * u_cylinderUvToShapeUvAngle.x + u_cylinderUvToShapeUvAngle.y;\n\
|
|
72
67
|
#endif\n\
|
|
73
68
|
\n\
|
|
74
|
-
|
|
69
|
+
float height = positionShape.z;\n\
|
|
70
|
+
#if defined(CYLINDER_HAS_SHAPE_BOUNDS_HEIGHT)\n\
|
|
71
|
+
height = height * u_cylinderUvToShapeUvHeight.x + u_cylinderUvToShapeUvHeight.y;\n\
|
|
72
|
+
#endif\n\
|
|
73
|
+
\n\
|
|
74
|
+
return vec3(radius, angle, height);\n\
|
|
75
75
|
}\n\
|
|
76
76
|
\n\
|
|
77
77
|
PointJacobianT convertUvToShapeUvSpaceDerivative(in vec3 positionUv) {\n\
|
|
@@ -86,16 +86,16 @@ vec3 scaleShapeUvToShapeSpace(in vec3 shapeUv) {\n\
|
|
|
86
86
|
radius /= u_cylinderUvToShapeUvRadius.x;\n\
|
|
87
87
|
#endif\n\
|
|
88
88
|
\n\
|
|
89
|
-
float
|
|
90
|
-
#if defined(CYLINDER_HAS_SHAPE_BOUNDS_HEIGHT)\n\
|
|
91
|
-
height /= u_cylinderUvToShapeUvHeight.x;\n\
|
|
92
|
-
#endif\n\
|
|
93
|
-
\n\
|
|
94
|
-
float angle = shapeUv.z * czm_twoPi;\n\
|
|
89
|
+
float angle = shapeUv.y * czm_twoPi;\n\
|
|
95
90
|
#if defined(CYLINDER_HAS_SHAPE_BOUNDS_ANGLE)\n\
|
|
96
91
|
angle /= u_cylinderUvToShapeUvAngle.x;\n\
|
|
97
92
|
#endif\n\
|
|
98
93
|
\n\
|
|
99
|
-
|
|
94
|
+
float height = shapeUv.z;\n\
|
|
95
|
+
#if defined(CYLINDER_HAS_SHAPE_BOUNDS_HEIGHT)\n\
|
|
96
|
+
height /= u_cylinderUvToShapeUvHeight.x;\n\
|
|
97
|
+
#endif\n\
|
|
98
|
+
\n\
|
|
99
|
+
return vec3(radius, angle, height);\n\
|
|
100
100
|
}\n\
|
|
101
101
|
";
|