From 0f7c1bcd9faf4a0907b2a616a7518e36aee5201d Mon Sep 17 00:00:00 2001 From: Calogero Mauceri Date: Mon, 7 Aug 2023 17:27:16 +0200 Subject: [PATCH 1/7] increase tile skirts size and adding bottom plane to tile for better occluding light --- .../Source/Core/QuantizedMeshTerrainData.js | 1 + .../engine/Source/Core/TerrainProvider.js | 26 ++- .../engine/Source/Scene/GlobeSurfaceTile.js | 17 +- .../createVerticesFromQuantizedTerrainMesh.js | 191 +++++++++++++----- 4 files changed, 183 insertions(+), 52 deletions(-) diff --git a/packages/engine/Source/Core/QuantizedMeshTerrainData.js b/packages/engine/Source/Core/QuantizedMeshTerrainData.js index f3c8d45d7cad..2d5df8d5e891 100644 --- a/packages/engine/Source/Core/QuantizedMeshTerrainData.js +++ b/packages/engine/Source/Core/QuantizedMeshTerrainData.js @@ -335,6 +335,7 @@ QuantizedMeshTerrainData.prototype.createMesh = function (options) { ellipsoid: ellipsoid, exaggeration: exaggeration, exaggerationRelativeHeight: exaggerationRelativeHeight, + level: level, }); if (!defined(verticesPromise)) { diff --git a/packages/engine/Source/Core/TerrainProvider.js b/packages/engine/Source/Core/TerrainProvider.js index 6478b2eeb3a4..ce49eca0daba 100644 --- a/packages/engine/Source/Core/TerrainProvider.js +++ b/packages/engine/Source/Core/TerrainProvider.js @@ -269,7 +269,31 @@ TerrainProvider.addSkirtIndices = function ( offset ); vertexIndex += eastIndicesNorthToSouth.length; - addSkirtIndices(northIndicesWestToEast, vertexIndex, indices, offset); + offset = addSkirtIndices( + northIndicesWestToEast, + vertexIndex, + indices, + offset + ); + return offset; +}; + +TerrainProvider.addSkirtsBottomPlane = function ( + WSVertexIndex, + WNVertexIndex, + ENVertexIndex, + ESVertexIndex, + indices, + offset +) { + // add triangles for bottom plane + indices[offset++] = WSVertexIndex; + indices[offset++] = WNVertexIndex; + indices[offset++] = ENVertexIndex; + + indices[offset++] = WSVertexIndex; + indices[offset++] = ENVertexIndex; + indices[offset++] = ESVertexIndex; }; function getEdgeIndices(width, height) { diff --git a/packages/engine/Source/Scene/GlobeSurfaceTile.js b/packages/engine/Source/Scene/GlobeSurfaceTile.js index 8ac18d1b6904..4e21779329a3 100644 --- a/packages/engine/Source/Scene/GlobeSurfaceTile.js +++ b/packages/engine/Source/Scene/GlobeSurfaceTile.js @@ -168,7 +168,22 @@ GlobeSurfaceTile.prototype.pick = function ( const vertices = mesh.vertices; const indices = mesh.indices; const encoding = mesh.encoding; - const indicesLength = indices.length; + let indicesLength = indices.length; + + // do not consider skirts pixels for finding terrain interceptions + const edgeVertexCount = + mesh.westIndicesSouthToNorth.length + + mesh.eastIndicesNorthToSouth.length + + mesh.southIndicesEastToWest.length + + mesh.northIndicesWestToEast.length; + const edgeTriangleCount = Math.max(0, (edgeVertexCount - 4) * 2); + let skirtsIndexBufferLength = edgeTriangleCount * 3; + if (this.level >= 3) { + // 2 more triangles for bottom skirts plane + skirtsIndexBufferLength += 2 * 3; + } + + indicesLength -= skirtsIndexBufferLength; let minT = Number.MAX_VALUE; diff --git a/packages/engine/Source/WorkersES6/createVerticesFromQuantizedTerrainMesh.js b/packages/engine/Source/WorkersES6/createVerticesFromQuantizedTerrainMesh.js index 743a62361ebd..591c858201f9 100644 --- a/packages/engine/Source/WorkersES6/createVerticesFromQuantizedTerrainMesh.js +++ b/packages/engine/Source/WorkersES6/createVerticesFromQuantizedTerrainMesh.js @@ -27,6 +27,8 @@ function createVerticesFromQuantizedTerrainMesh( parameters, transferableObjects ) { + const enableLongSkirt = parameters.level >= 3; + const enableSkirtsBottomPlane = parameters.level >= 3; const quantizedVertices = parameters.quantizedVertices; const quantizedVertexCount = quantizedVertices.length / 3; const octEncodedNormals = parameters.octEncodedNormals; @@ -245,11 +247,25 @@ function createVerticesFromQuantizedTerrainMesh( ) ); + let fullHMin; + if (enableLongSkirt) { + let eastT = rectangle.east; + const westT = rectangle.west; + if (eastT < westT) { + eastT += CesiumMath.TWO_PI; + } + const tileXSize = (eastT - westT) * ellipsoid.maximumRadius; + const longSkirtHeight = tileXSize * 2; + fullHMin = Math.min(hMin, -longSkirtHeight); + } else { + fullHMin = hMin; + } + const aaBox = new AxisAlignedBoundingBox(minimum, maximum, center); const encoding = new TerrainEncoding( center, aaBox, - hMin, + fullHMin, maximumHeight, fromENU, hasVertexNormals, @@ -284,7 +300,11 @@ function createVerticesFromQuantizedTerrainMesh( } const edgeTriangleCount = Math.max(0, (edgeVertexCount - 4) * 2); - const indexBufferLength = parameters.indices.length + edgeTriangleCount * 3; + let indexBufferLength = parameters.indices.length + edgeTriangleCount * 3; + if (enableSkirtsBottomPlane) { + // 2 more triangles for bottom skirts plane + indexBufferLength += 2 * 3; + } const indexBuffer = IndexDatatype.createTypedArray( quantizedVertexCount + edgeVertexCount, indexBufferLength @@ -304,6 +324,8 @@ function createVerticesFromQuantizedTerrainMesh( const southLatitudeOffset = -latOffset; // Add skirts. + // Note: create longer skirts for better light occlusion + const terrainHeight = fullHMin; let vertexBufferIndex = quantizedVertexCount * vertexStride; addSkirt( vertexBuffer, @@ -319,7 +341,8 @@ function createVerticesFromQuantizedTerrainMesh( southMercatorY, oneOverMercatorHeight, westLongitudeOffset, - westLatitudeOffset + westLatitudeOffset, + terrainHeight ); vertexBufferIndex += parameters.westIndices.length * vertexStride; addSkirt( @@ -336,7 +359,8 @@ function createVerticesFromQuantizedTerrainMesh( southMercatorY, oneOverMercatorHeight, southLongitudeOffset, - southLatitudeOffset + southLatitudeOffset, + terrainHeight ); vertexBufferIndex += parameters.southIndices.length * vertexStride; addSkirt( @@ -353,7 +377,8 @@ function createVerticesFromQuantizedTerrainMesh( southMercatorY, oneOverMercatorHeight, eastLongitudeOffset, - eastLatitudeOffset + eastLatitudeOffset, + terrainHeight ); vertexBufferIndex += parameters.eastIndices.length * vertexStride; addSkirt( @@ -370,10 +395,11 @@ function createVerticesFromQuantizedTerrainMesh( southMercatorY, oneOverMercatorHeight, northLongitudeOffset, - northLatitudeOffset + northLatitudeOffset, + terrainHeight ); - TerrainProvider.addSkirtIndices( + const offset = TerrainProvider.addSkirtIndices( westIndicesSouthToNorth, southIndicesEastToWest, eastIndicesNorthToSouth, @@ -383,6 +409,27 @@ function createVerticesFromQuantizedTerrainMesh( parameters.indices.length ); + if (enableSkirtsBottomPlane) { + // add the bottom plane to skirts + // this is needed for occluding light source coming from the bottom of the tile + let vertexIndex = quantizedVertexCount; + const WSVertexIndex = vertexIndex; + const WNVertexIndex = vertexIndex + westIndicesSouthToNorth.length - 1; + vertexIndex += westIndicesSouthToNorth.length; + vertexIndex += southIndicesEastToWest.length; + const ENVertexIndex = vertexIndex; + const ESVertexIndex = vertexIndex + eastIndicesNorthToSouth.length - 1; + + TerrainProvider.addSkirtsBottomPlane( + WSVertexIndex, + WNVertexIndex, + ENVertexIndex, + ESVertexIndex, + indexBuffer, + offset + ); + } + transferableObjects.push(vertexBuffer.buffer, indexBuffer.buffer); return { @@ -448,6 +495,66 @@ function findMinMaxSkirts( return hMin; } +function addSkirtVertex( + vertexBuffer, + vertexBufferIndex, + encoding, + index, + height, + uv, + octEncodedNormals, + ellipsoid, + north, + south, + east, + west, + southMercatorY, + oneOverMercatorHeight, + longitudeOffset, + latitudeOffset +) { + const hasVertexNormals = defined(octEncodedNormals); + + cartographicScratch.longitude = + CesiumMath.lerp(west, east, uv.x) + longitudeOffset; + cartographicScratch.latitude = + CesiumMath.lerp(south, north, uv.y) + latitudeOffset; + cartographicScratch.height = height; + + const position = ellipsoid.cartographicToCartesian( + cartographicScratch, + cartesian3Scratch + ); + + if (hasVertexNormals) { + const n = index * 2.0; + toPack.x = octEncodedNormals[n]; + toPack.y = octEncodedNormals[n + 1]; + } + + let webMercatorT; + if (encoding.hasWebMercatorT) { + webMercatorT = + (WebMercatorProjection.geodeticLatitudeToMercatorAngle( + cartographicScratch.latitude + ) - + southMercatorY) * + oneOverMercatorHeight; + } + + vertexBufferIndex = encoding.encode( + vertexBuffer, + vertexBufferIndex, + position, + uv, + cartographicScratch.height, + toPack, + webMercatorT + ); + + return vertexBufferIndex; +} + function addSkirt( vertexBuffer, vertexBufferIndex, @@ -462,10 +569,9 @@ function addSkirt( southMercatorY, oneOverMercatorHeight, longitudeOffset, - latitudeOffset + latitudeOffset, + terrainHeight ) { - const hasVertexNormals = defined(octEncodedNormals); - const north = rectangle.north; const south = rectangle.south; let east = rectangle.east; @@ -475,53 +581,38 @@ function addSkirt( east += CesiumMath.TWO_PI; } + let index; + let uv; + let height; + if (terrainHeight) { + height = terrainHeight; + } const length = edgeVertices.length; for (let i = 0; i < length; ++i) { - const index = edgeVertices[i]; - const h = heights[index]; - const uv = uvs[index]; - - cartographicScratch.longitude = - CesiumMath.lerp(west, east, uv.x) + longitudeOffset; - cartographicScratch.latitude = - CesiumMath.lerp(south, north, uv.y) + latitudeOffset; - cartographicScratch.height = h - skirtLength; - - const position = ellipsoid.cartographicToCartesian( - cartographicScratch, - cartesian3Scratch - ); + index = edgeVertices[i]; + uv = uvs[index]; - if (hasVertexNormals) { - const n = index * 2.0; - toPack.x = octEncodedNormals[n]; - toPack.y = octEncodedNormals[n + 1]; + if (!terrainHeight) { + const h = heights[index]; + height = h - skirtLength; } - - let webMercatorT; - if (encoding.hasWebMercatorT) { - webMercatorT = - (WebMercatorProjection.geodeticLatitudeToMercatorAngle( - cartographicScratch.latitude - ) - - southMercatorY) * - oneOverMercatorHeight; - } - - let geodeticSurfaceNormal; - if (encoding.hasGeodeticSurfaceNormals) { - geodeticSurfaceNormal = ellipsoid.geodeticSurfaceNormal(position); - } - - vertexBufferIndex = encoding.encode( + vertexBufferIndex = addSkirtVertex( vertexBuffer, vertexBufferIndex, - position, + encoding, + index, + height, uv, - cartographicScratch.height, - toPack, - webMercatorT, - geodeticSurfaceNormal + octEncodedNormals, + ellipsoid, + north, + south, + east, + west, + southMercatorY, + oneOverMercatorHeight, + longitudeOffset, + latitudeOffset ); } } From 7431534b86bc1b92632f16bcef3e4a3893a380b0 Mon Sep 17 00:00:00 2001 From: Calogero Mauceri Date: Wed, 9 Aug 2023 15:06:07 +0200 Subject: [PATCH 2/7] fixed minor issue --- .../WorkersES6/createVerticesFromQuantizedTerrainMesh.js | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/packages/engine/Source/WorkersES6/createVerticesFromQuantizedTerrainMesh.js b/packages/engine/Source/WorkersES6/createVerticesFromQuantizedTerrainMesh.js index 591c858201f9..ee30e3ecb1fe 100644 --- a/packages/engine/Source/WorkersES6/createVerticesFromQuantizedTerrainMesh.js +++ b/packages/engine/Source/WorkersES6/createVerticesFromQuantizedTerrainMesh.js @@ -542,6 +542,11 @@ function addSkirtVertex( oneOverMercatorHeight; } + let geodeticSurfaceNormal; + if (encoding.hasGeodeticSurfaceNormals) { + geodeticSurfaceNormal = ellipsoid.geodeticSurfaceNormal(position); + } + vertexBufferIndex = encoding.encode( vertexBuffer, vertexBufferIndex, @@ -549,7 +554,8 @@ function addSkirtVertex( uv, cartographicScratch.height, toPack, - webMercatorT + webMercatorT, + geodeticSurfaceNormal ); return vertexBufferIndex; From 8f5c0ead2d946e17832282fab3ba98c9cd41ee89 Mon Sep 17 00:00:00 2001 From: Calogero Mauceri Date: Wed, 3 Apr 2024 16:03:16 +0200 Subject: [PATCH 3/7] restored default behaviour if long skirts are not enabled --- .../Source/Workers/createVerticesFromQuantizedTerrainMesh.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/engine/Source/Workers/createVerticesFromQuantizedTerrainMesh.js b/packages/engine/Source/Workers/createVerticesFromQuantizedTerrainMesh.js index ee30e3ecb1fe..2ae68a6c7b36 100644 --- a/packages/engine/Source/Workers/createVerticesFromQuantizedTerrainMesh.js +++ b/packages/engine/Source/Workers/createVerticesFromQuantizedTerrainMesh.js @@ -325,7 +325,7 @@ function createVerticesFromQuantizedTerrainMesh( // Add skirts. // Note: create longer skirts for better light occlusion - const terrainHeight = fullHMin; + const terrainHeight = enableLongSkirt ? fullHMin : undefined; let vertexBufferIndex = quantizedVertexCount * vertexStride; addSkirt( vertexBuffer, From ada4f7001700142079441c61cf7cec9113e479c3 Mon Sep 17 00:00:00 2001 From: Calogero Mauceri Date: Thu, 4 Apr 2024 18:15:45 +0200 Subject: [PATCH 4/7] added extendedSkirts flag to CesiumTerrainProvider to enable extended skirts for better light occlusion when shaddows are enabled --- .../Source/Core/CesiumTerrainProvider.js | 24 +++++++++++++++++++ .../Source/Core/QuantizedMeshTerrainData.js | 4 ++++ .../Source/Core/createWorldTerrainAsync.js | 2 ++ packages/engine/Source/Scene/Terrain.js | 1 + .../createVerticesFromQuantizedTerrainMesh.js | 11 ++++++--- 5 files changed, 39 insertions(+), 3 deletions(-) diff --git a/packages/engine/Source/Core/CesiumTerrainProvider.js b/packages/engine/Source/Core/CesiumTerrainProvider.js index c70769c02fcf..317c658be604 100644 --- a/packages/engine/Source/Core/CesiumTerrainProvider.js +++ b/packages/engine/Source/Core/CesiumTerrainProvider.js @@ -45,6 +45,7 @@ function LayerInformation(layer) { * @property {boolean} [requestVertexNormals=false] Flag that indicates if the client should request additional lighting information from the server, in the form of per vertex normals if available. * @property {boolean} [requestWaterMask=false] Flag that indicates if the client should request per tile water masks from the server, if available. * @property {boolean} [requestMetadata=true] Flag that indicates if the client should request per tile metadata from the server, if available. + * @property {boolean} [extendedSkirts=false] Flag that indicates if the tile should have extended skirts for better light occlusion when shadows are enabled. * @property {Ellipsoid} [ellipsoid] The ellipsoid. If not specified, the WGS84 ellipsoid is used. * @property {Credit|string} [credit] A credit for the data source, which is displayed on the canvas. */ @@ -503,6 +504,15 @@ function CesiumTerrainProvider(options) { */ this._requestWaterMask = defaultValue(options.requestWaterMask, false); + /** + * Boolean flag that indicates if the tile should have extended skirts for better light occlusion + * when shadows are enabled. + * @type {boolean} + * @default false + * @private + */ + this._extendedSkirts = defaultValue(options.extendedSkirts, false); + /** * Boolean flag that indicates if the client should request tile metadata from the server. * @type {boolean} @@ -834,6 +844,7 @@ function createQuantizedMeshTerrainData(provider, buffer, level, x, y, layer) { childTileMask: provider.availability.computeChildMaskForTile(level, x, y), waterMask: waterMaskBuffer, credits: provider._tileCredits, + extendedSkirts: provider._extendedSkirts, }); } @@ -1140,6 +1151,19 @@ Object.defineProperties(CesiumTerrainProvider.prototype, { return this._availability; }, }, + + /** + * Gets a value indicating whether or not the requested tiles include extended skirts. + * Extended skirts are used for better light occlusion when shadows are enabled. + * @memberof CesiumTerrainProvider.prototype + * @type {boolean} + * @readonly + */ + extendedSkirts: { + get: function () { + return this._extendedSkirts; + }, + }, }); /** diff --git a/packages/engine/Source/Core/QuantizedMeshTerrainData.js b/packages/engine/Source/Core/QuantizedMeshTerrainData.js index 2d5df8d5e891..b08158a2b545 100644 --- a/packages/engine/Source/Core/QuantizedMeshTerrainData.js +++ b/packages/engine/Source/Core/QuantizedMeshTerrainData.js @@ -59,6 +59,7 @@ import TerrainMesh from "./TerrainMesh.js"; * @param {Uint8Array} [options.encodedNormals] The buffer containing per vertex normals, encoded using 'oct' encoding * @param {Uint8Array} [options.waterMask] The buffer containing the watermask. * @param {Credit[]} [options.credits] Array of credits for this tile. + * @param {boolean} [options.extendedSkirts=false] True if the tile has extended skirts for better light occlusion when shadows are enabled. * * * @example @@ -203,6 +204,7 @@ function QuantizedMeshTerrainData(options) { this._createdByUpsampling = defaultValue(options.createdByUpsampling, false); this._waterMask = options.waterMask; + this._extendedSkirts = defaultValue(options.extendedSkirts, false); this._mesh = undefined; } @@ -336,6 +338,7 @@ QuantizedMeshTerrainData.prototype.createMesh = function (options) { exaggeration: exaggeration, exaggerationRelativeHeight: exaggerationRelativeHeight, level: level, + extendedSkirts: this._extendedSkirts, }); if (!defined(verticesPromise)) { @@ -553,6 +556,7 @@ QuantizedMeshTerrainData.prototype.upsample = function ( childTileMask: 0, credits: credits, createdByUpsampling: true, + extendedSkirts: this._extendedSkirts, }); }); }; diff --git a/packages/engine/Source/Core/createWorldTerrainAsync.js b/packages/engine/Source/Core/createWorldTerrainAsync.js index ec931a8ed4e6..4cc003d08188 100644 --- a/packages/engine/Source/Core/createWorldTerrainAsync.js +++ b/packages/engine/Source/Core/createWorldTerrainAsync.js @@ -9,6 +9,7 @@ import defaultValue from "./defaultValue.js"; * @param {Object} [options] Object with the following properties: * @param {Boolean} [options.requestVertexNormals=false] Flag that indicates if the client should request additional lighting information from the server if available. * @param {Boolean} [options.requestWaterMask=false] Flag that indicates if the client should request per tile water masks from the server if available. + * @param {Boolean} [options.extendedSkirts=false] Flag that indicates if the tiles should have extended skirts for better light occlusion when shadows are enabled. * @returns {Promise} A promise that resolves to the created CesiumTerrainProvider * * @see Ion @@ -43,6 +44,7 @@ function createWorldTerrainAsync(options) { return CesiumTerrainProvider.fromIonAssetId(1, { requestVertexNormals: defaultValue(options.requestVertexNormals, false), requestWaterMask: defaultValue(options.requestWaterMask, false), + extendedSkirts: defaultValue(options.extendedSkirts, false), }); } export default createWorldTerrainAsync; diff --git a/packages/engine/Source/Scene/Terrain.js b/packages/engine/Source/Scene/Terrain.js index a737da0e66eb..4eae1ea4a516 100644 --- a/packages/engine/Source/Scene/Terrain.js +++ b/packages/engine/Source/Scene/Terrain.js @@ -115,6 +115,7 @@ Object.defineProperties(Terrain.prototype, { * @param {Object} [options] Object with the following properties: * @param {Boolean} [options.requestVertexNormals=false] Flag that indicates if the client should request additional lighting information from the server if available. * @param {Boolean} [options.requestWaterMask=false] Flag that indicates if the client should request per tile water masks from the server if available. + * @param {Boolean} [options.extendedSkirts=false] Flag that indicates if the tiles should have extended skirts for better light occlusion when shadows are enabled. * @returns {Terrain} An asynchronous helper object for a CesiumTerrainProvider * * @see Ion diff --git a/packages/engine/Source/Workers/createVerticesFromQuantizedTerrainMesh.js b/packages/engine/Source/Workers/createVerticesFromQuantizedTerrainMesh.js index 2ae68a6c7b36..d7a20d8ade30 100644 --- a/packages/engine/Source/Workers/createVerticesFromQuantizedTerrainMesh.js +++ b/packages/engine/Source/Workers/createVerticesFromQuantizedTerrainMesh.js @@ -27,8 +27,9 @@ function createVerticesFromQuantizedTerrainMesh( parameters, transferableObjects ) { - const enableLongSkirt = parameters.level >= 3; - const enableSkirtsBottomPlane = parameters.level >= 3; + const enableLongSkirt = parameters.extendedSkirts && parameters.level >= 3; + const enableSkirtsBottomPlane = + parameters.extendedSkirts && parameters.level >= 3; const quantizedVertices = parameters.quantizedVertices; const quantizedVertexCount = quantizedVertices.length / 3; const octEncodedNormals = parameters.octEncodedNormals; @@ -255,7 +256,11 @@ function createVerticesFromQuantizedTerrainMesh( eastT += CesiumMath.TWO_PI; } const tileXSize = (eastT - westT) * ellipsoid.maximumRadius; - const longSkirtHeight = tileXSize * 2; + let longSkirtHeight = tileXSize * 2; + if (longSkirtHeight < 4000) { + // Note: force higher skirt size for better shadows rendering on smaller tiles + longSkirtHeight = 5000; + } fullHMin = Math.min(hMin, -longSkirtHeight); } else { fullHMin = hMin; From 2342e836b117622ca9963f39abad20a58c5db563 Mon Sep 17 00:00:00 2001 From: Calogero Mauceri Date: Fri, 5 Apr 2024 13:55:17 +0200 Subject: [PATCH 5/7] updated changes file --- CHANGES.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGES.md b/CHANGES.md index d4125b2882b2..b90c8f39dab2 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -15,6 +15,7 @@ - Implemented sharper rendering and lighting on voxels with CYLINDER and ELLIPSOID shape. [#11875](https://github.com/CesiumGS/cesium/pull/11875) - Implemented vertical exaggeration for voxels with BOX shape. [#11887](https://github.com/CesiumGS/cesium/pull/11887) - Added the `Check` object of validators to the public api and types. [#11901](https://github.com/CesiumGS/cesium/pull/11901) +- Added ab optional property 'extendedSkirts' to `CesiumTerrainProvider`to enable extended skirts on tiles, improving light occlusion when shadows are enabled. [#11459][https://github.com/cesiumgs/cesium/issues/11459] ##### Fixes :wrench: From 5771a8088563ec83d45580a8ed8fa71484a28e30 Mon Sep 17 00:00:00 2001 From: Calogero Mauceri Date: Fri, 5 Apr 2024 14:43:54 +0200 Subject: [PATCH 6/7] fixed typo --- CHANGES.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGES.md b/CHANGES.md index b90c8f39dab2..11e9565ae103 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -15,7 +15,7 @@ - Implemented sharper rendering and lighting on voxels with CYLINDER and ELLIPSOID shape. [#11875](https://github.com/CesiumGS/cesium/pull/11875) - Implemented vertical exaggeration for voxels with BOX shape. [#11887](https://github.com/CesiumGS/cesium/pull/11887) - Added the `Check` object of validators to the public api and types. [#11901](https://github.com/CesiumGS/cesium/pull/11901) -- Added ab optional property 'extendedSkirts' to `CesiumTerrainProvider`to enable extended skirts on tiles, improving light occlusion when shadows are enabled. [#11459][https://github.com/cesiumgs/cesium/issues/11459] +- Added an optional property 'extendedSkirts' to `CesiumTerrainProvider`to enable extended skirts on tiles, improving light occlusion when shadows are enabled. [#11459][https://github.com/cesiumgs/cesium/issues/11459] ##### Fixes :wrench: From b3a7c124643eb9330092a80a2e43bac909b681fd Mon Sep 17 00:00:00 2001 From: Calogero Mauceri Date: Wed, 15 May 2024 15:55:23 +0200 Subject: [PATCH 7/7] fixed test failure --- packages/engine/Source/Core/QuantizedMeshTerrainData.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/engine/Source/Core/QuantizedMeshTerrainData.js b/packages/engine/Source/Core/QuantizedMeshTerrainData.js index b08158a2b545..72790ad5cbe9 100644 --- a/packages/engine/Source/Core/QuantizedMeshTerrainData.js +++ b/packages/engine/Source/Core/QuantizedMeshTerrainData.js @@ -522,6 +522,7 @@ QuantizedMeshTerrainData.prototype.upsample = function ( ? this._northSkirtHeight : shortestSkirt * 0.5; const credits = this._credits; + const extendedSkirts = this._extendedSkirts; return Promise.resolve(upsamplePromise).then(function (result) { const quantizedVertices = new Uint16Array(result.vertices); @@ -556,7 +557,7 @@ QuantizedMeshTerrainData.prototype.upsample = function ( childTileMask: 0, credits: credits, createdByUpsampling: true, - extendedSkirts: this._extendedSkirts, + extendedSkirts: extendedSkirts, }); }); };