Hi,
Here is my (very crude) test terrain provider. It flattens a piece of terrain (0 alt) near London Hearthrow airport.
Artefact becomes visible when getting close to the ground.
var FlatTerrainProvider = function(options) {
this.baseProvider = new Cesium.CesiumTerrainProvider(options);
this.setRegion(51.46491,-0.44692); // London Heathrow
};
FlatTerrainProvider.prototype = {
get availability() {
return this.baseProvider.availability;
},
get credit() {
return this.baseProvider.credit;
},
get errorEvent() {
return this.baseProvider.errorEvent;
},
get hasVertexNormals() {
return this.baseProvider.hasVertexNormals;
},
get hasWaterMask() {
return this.baseProvider.hasWaterMask;
},
get ready() {
return this.baseProvider.ready;
},
get readyPromise() {
return this.baseProvider.readyPromise;
},
get tilingScheme() {
return this.baseProvider.tilingScheme;
},
getLevelMaximumGeometricError: function(level) {
return this.baseProvider.getLevelMaximumGeometricError(level);
},
getTileDataAvailable: function(x, y, level) {
return this.baseProvider.getTileDataAvailable(x, y, level);
},
setRegion: function(lat, lon) {
this.region = Cesium.Rectangle.fromDegrees(lon - 0.02, lat - 0.02, lon + 0.02, lat + 0.02);
},
requestTileGeometry: function(x, y, level, request) {
var t00 = this.baseProvider.getTileDataAvailable(x * 2, y * 2, level + 1);
var t01 = this.baseProvider.getTileDataAvailable(x * 2, y * 2 + 1, level + 1);
var t10 = this.baseProvider.getTileDataAvailable(x * 2 + 1, y * 2, level + 1);
var t11 = this.baseProvider.getTileDataAvailable(x * 2 + 1, y * 2 + 1, level + 1);
if (level > 13 || !(t00 && t01 && t10 && t11)) {
var size = 2;
var tileRect = this.baseProvider.tilingScheme.tileXYToRectangle(x, y, level);
var widthBuffer = 2 * tileRect.width / (size - 1);
var heightBuffer = 2 * tileRect.height / (size - 1);
var union = Cesium.Rectangle;
var regionRect = new Cesium.Rectangle(this.region.west - widthBuffer, this.region.south - heightBuffer, this.region.east + widthBuffer, this.region.north + heightBuffer);
var intersection = Cesium.Rectangle.intersection(regionRect, tileRect);
if (intersection !== undefined) {
var promise = this.baseProvider.requestTileGeometry(x, y, level, request);
if (promise === undefined) return undefined;
return this.getPromise(promise, size, tileRect, intersection);
}
}
return this.baseProvider.requestTileGeometry(x, y, level, request);
},
getPromise: function(promise, size, tileRect, intersection) {
if (promise === undefined) return undefined;
var height = 0;
return promise.then((terrainData) => {
var size = 2;
var heights = new Float32Array(size * size);
for (var i = 0; i < size; i++) {
for (var j = 0; j < size; j++) {
heights[i * size + j] = height;
}
}
var childTileMask = 0;
return new Cesium.HeightmapTerrainData({ buffer: heights, width: size, height: size, childTileMask: childTileMask });
});
}
};