Skip to content

Commit 906adcc

Browse files
authored
Merge pull request #7508 from shehzan10/optimize-interpolateHeight
Optimize QuantizedMeshTerrainData.interpolateHeight
2 parents 9892e1d + 4698bb2 commit 906adcc

File tree

2 files changed

+25
-12
lines changed

2 files changed

+25
-12
lines changed

CHANGES.md

+1
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ Change Log
2020
* 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)
2121
* Added `EllipsoidRhumbLine` class as a rhumb line counterpart to `EllipsoidGeodesic`. [#7484](https://github.com/AnalyticalGraphicsInc/cesium/pull/7484)
2222
* Added rhumb line support to `PolygonGeometry`, `PolygonOutlineGeometry`, `PolylineGeometry`, `GroundPolylineGeometry`, and `SimplePolylineGeometry`. [#7492](https://github.com/AnalyticalGraphicsInc/cesium/pull/7492)
23+
* Improved the performance of `QuantizedMeshTerrainData.interpolateHeight`. [#7508](https://github.com/AnalyticalGraphicsInc/cesium/pull/7508)
2324

2425
##### Fixes :wrench:
2526
* Fixed 3D Tiles performance regression. [#7482](https://github.com/AnalyticalGraphicsInc/cesium/pull/7482)

Source/Core/QuantizedMeshTerrainData.js

+24-12
Original file line numberDiff line numberDiff line change
@@ -498,6 +498,14 @@ define([
498498
return interpolateMeshHeight(this, u, v);
499499
};
500500

501+
function pointInBoundingBox(u, v, u0, v0, u1, v1, u2, v2) {
502+
var minU = Math.min(u0, u1, u2);
503+
var maxU = Math.max(u0, u1, u2);
504+
var minV = Math.min(v0, v1, v2);
505+
var maxV = Math.max(v0, v1, v2);
506+
return (u >= minU && u <= maxU && v >= minV && v <= maxV);
507+
}
508+
501509
var texCoordScratch0 = new Cartesian2();
502510
var texCoordScratch1 = new Cartesian2();
503511
var texCoordScratch2 = new Cartesian2();
@@ -517,12 +525,14 @@ define([
517525
var uv1 = encoding.decodeTextureCoordinates(vertices, i1, texCoordScratch1);
518526
var uv2 = encoding.decodeTextureCoordinates(vertices, i2, texCoordScratch2);
519527

520-
var barycentric = Intersections2D.computeBarycentricCoordinates(u, v, uv0.x, uv0.y, uv1.x, uv1.y, uv2.x, uv2.y, barycentricCoordinateScratch);
521-
if (barycentric.x >= -1e-15 && barycentric.y >= -1e-15 && barycentric.z >= -1e-15) {
522-
var h0 = encoding.decodeHeight(vertices, i0);
523-
var h1 = encoding.decodeHeight(vertices, i1);
524-
var h2 = encoding.decodeHeight(vertices, i2);
525-
return barycentric.x * h0 + barycentric.y * h1 + barycentric.z * h2;
528+
if (pointInBoundingBox(u, v, uv0.x, uv0.y, uv1.x, uv1.y, uv2.x, uv2.y)) {
529+
var barycentric = Intersections2D.computeBarycentricCoordinates(u, v, uv0.x, uv0.y, uv1.x, uv1.y, uv2.x, uv2.y, barycentricCoordinateScratch);
530+
if (barycentric.x >= -1e-15 && barycentric.y >= -1e-15 && barycentric.z >= -1e-15) {
531+
var h0 = encoding.decodeHeight(vertices, i0);
532+
var h1 = encoding.decodeHeight(vertices, i1);
533+
var h2 = encoding.decodeHeight(vertices, i2);
534+
return barycentric.x * h0 + barycentric.y * h1 + barycentric.z * h2;
535+
}
526536
}
527537
}
528538

@@ -549,12 +559,14 @@ define([
549559
var v1 = vBuffer[i1];
550560
var v2 = vBuffer[i2];
551561

552-
var barycentric = Intersections2D.computeBarycentricCoordinates(u, v, u0, v0, u1, v1, u2, v2, barycentricCoordinateScratch);
553-
if (barycentric.x >= -1e-15 && barycentric.y >= -1e-15 && barycentric.z >= -1e-15) {
554-
var quantizedHeight = barycentric.x * heightBuffer[i0] +
555-
barycentric.y * heightBuffer[i1] +
556-
barycentric.z * heightBuffer[i2];
557-
return CesiumMath.lerp(terrainData._minimumHeight, terrainData._maximumHeight, quantizedHeight / maxShort);
562+
if (pointInBoundingBox(u, v, u0, v0, u1, v1, u2, v2)) {
563+
var barycentric = Intersections2D.computeBarycentricCoordinates(u, v, u0, v0, u1, v1, u2, v2, barycentricCoordinateScratch);
564+
if (barycentric.x >= -1e-15 && barycentric.y >= -1e-15 && barycentric.z >= -1e-15) {
565+
var quantizedHeight = barycentric.x * heightBuffer[i0] +
566+
barycentric.y * heightBuffer[i1] +
567+
barycentric.z * heightBuffer[i2];
568+
return CesiumMath.lerp(terrainData._minimumHeight, terrainData._maximumHeight, quantizedHeight / maxShort);
569+
}
558570
}
559571
}
560572

0 commit comments

Comments
 (0)