diff --git a/CHANGES.md b/CHANGES.md index b19c37bda547..514dda84cfae 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -20,6 +20,7 @@ Change Log * Added a [new Sandcastle example](https://cesiumjs.org/Cesium/Build/Apps/Sandcastle/?src=Time%20Dynamic%20Wheels.html) on using `nodeTransformations` to rotate a model's wheels based on its velocity. [#7361](https://github.com/AnalyticalGraphicsInc/cesium/pull/7361) * Added `EllipsoidRhumbLine` class as a rhumb line counterpart to `EllipsoidGeodesic`. [#7484](https://github.com/AnalyticalGraphicsInc/cesium/pull/7484) * Added rhumb line support to `PolygonGeometry`, `PolygonOutlineGeometry`, `PolylineGeometry`, `GroundPolylineGeometry`, and `SimplePolylineGeometry`. [#7492](https://github.com/AnalyticalGraphicsInc/cesium/pull/7492) +* Improved the performance of `QuantizedMeshTerrainData.interpolateHeight`. [#7508](https://github.com/AnalyticalGraphicsInc/cesium/pull/7508) ##### Fixes :wrench: * Fixed 3D Tiles performance regression. [#7482](https://github.com/AnalyticalGraphicsInc/cesium/pull/7482) diff --git a/Source/Core/QuantizedMeshTerrainData.js b/Source/Core/QuantizedMeshTerrainData.js index ed582ce13649..7040125f2ef6 100644 --- a/Source/Core/QuantizedMeshTerrainData.js +++ b/Source/Core/QuantizedMeshTerrainData.js @@ -498,6 +498,14 @@ define([ return interpolateMeshHeight(this, u, v); }; + function pointInBoundingBox(u, v, u0, v0, u1, v1, u2, v2) { + var minU = Math.min(u0, u1, u2); + var maxU = Math.max(u0, u1, u2); + var minV = Math.min(v0, v1, v2); + var maxV = Math.max(v0, v1, v2); + return (u >= minU && u <= maxU && v >= minV && v <= maxV); + } + var texCoordScratch0 = new Cartesian2(); var texCoordScratch1 = new Cartesian2(); var texCoordScratch2 = new Cartesian2(); @@ -517,12 +525,14 @@ define([ var uv1 = encoding.decodeTextureCoordinates(vertices, i1, texCoordScratch1); var uv2 = encoding.decodeTextureCoordinates(vertices, i2, texCoordScratch2); - var barycentric = Intersections2D.computeBarycentricCoordinates(u, v, uv0.x, uv0.y, uv1.x, uv1.y, uv2.x, uv2.y, barycentricCoordinateScratch); - if (barycentric.x >= -1e-15 && barycentric.y >= -1e-15 && barycentric.z >= -1e-15) { - var h0 = encoding.decodeHeight(vertices, i0); - var h1 = encoding.decodeHeight(vertices, i1); - var h2 = encoding.decodeHeight(vertices, i2); - return barycentric.x * h0 + barycentric.y * h1 + barycentric.z * h2; + if (pointInBoundingBox(u, v, uv0.x, uv0.y, uv1.x, uv1.y, uv2.x, uv2.y)) { + var barycentric = Intersections2D.computeBarycentricCoordinates(u, v, uv0.x, uv0.y, uv1.x, uv1.y, uv2.x, uv2.y, barycentricCoordinateScratch); + if (barycentric.x >= -1e-15 && barycentric.y >= -1e-15 && barycentric.z >= -1e-15) { + var h0 = encoding.decodeHeight(vertices, i0); + var h1 = encoding.decodeHeight(vertices, i1); + var h2 = encoding.decodeHeight(vertices, i2); + return barycentric.x * h0 + barycentric.y * h1 + barycentric.z * h2; + } } } @@ -549,12 +559,14 @@ define([ var v1 = vBuffer[i1]; var v2 = vBuffer[i2]; - var barycentric = Intersections2D.computeBarycentricCoordinates(u, v, u0, v0, u1, v1, u2, v2, barycentricCoordinateScratch); - if (barycentric.x >= -1e-15 && barycentric.y >= -1e-15 && barycentric.z >= -1e-15) { - var quantizedHeight = barycentric.x * heightBuffer[i0] + - barycentric.y * heightBuffer[i1] + - barycentric.z * heightBuffer[i2]; - return CesiumMath.lerp(terrainData._minimumHeight, terrainData._maximumHeight, quantizedHeight / maxShort); + if (pointInBoundingBox(u, v, u0, v0, u1, v1, u2, v2)) { + var barycentric = Intersections2D.computeBarycentricCoordinates(u, v, u0, v0, u1, v1, u2, v2, barycentricCoordinateScratch); + if (barycentric.x >= -1e-15 && barycentric.y >= -1e-15 && barycentric.z >= -1e-15) { + var quantizedHeight = barycentric.x * heightBuffer[i0] + + barycentric.y * heightBuffer[i1] + + barycentric.z * heightBuffer[i2]; + return CesiumMath.lerp(terrainData._minimumHeight, terrainData._maximumHeight, quantizedHeight / maxShort); + } } }