Skip to content

Commit 98476c1

Browse files
committed
Merge pull request #1036 from AnalyticalGraphicsInc/minMaxLevel
Add min/max terrain level option to ImageryLayer.
2 parents 0a6e0be + ccb2a9e commit 98476c1

File tree

3 files changed

+62
-0
lines changed

3 files changed

+62
-0
lines changed

CHANGES.md

+1
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ Beta Releases
1616
* Added `PolylinePipeline.scaleToSurface`.
1717
* Added `PolylinePipeline.scaleToGeodeticHeight`.
1818
* `Viewer` now automatically sets its clock to that of the first added `DataSource`, regardless of how it was added to the `DataSourceCollection`. Previously, this was only done for dropped files by `viewerDragDropMixin`.
19+
* Added the ability to specify a `minimumTerrainLevel` and `maximumTerrainLevel` when constructing an `ImageryLayer`. The layer will only be shown for terrain tiles within the specified range.
1920

2021
### b19 - 2013-08-01
2122

Source/Scene/ImageryLayer.js

+14
Original file line numberDiff line numberDiff line change
@@ -122,6 +122,10 @@ define([
122122
* for texture filtering. If this parameter is not specified, the maximum anisotropy supported
123123
* by the WebGL stack will be used. Larger values make the imagery look better in horizon
124124
* views.
125+
* @param {Number} [description.minimumTerrainLevel] The minimum terrain level-of-detail at which to show this imagery layer,
126+
* or undefined to show it at all levels. Level zero is the least-detailed level.
127+
* @param {Number} [description.maximumTerrainLevel] The maximum terrain level-of-detail at which to show this imagery layer,
128+
* or undefined to show it at all levels. Level zero is the least-detailed level.
125129
*/
126130
var ImageryLayer = function ImageryLayer(imageryProvider, description) {
127131
this._imageryProvider = imageryProvider;
@@ -221,6 +225,9 @@ define([
221225
*/
222226
this.show = defaultValue(description.show, true);
223227

228+
this._minimumTerrainLevel = description.minimumTerrainLevel;
229+
this._maximumTerrainLevel = description.maximumTerrainLevel;
230+
224231
this._extent = defaultValue(description.extent, Extent.MAX_VALUE);
225232
this._maximumAnisotropy = description.maximumAnisotropy;
226233

@@ -369,6 +376,13 @@ define([
369376
* @returns {Boolean} true if this layer overlaps any portion of the terrain tile; otherwise, false.
370377
*/
371378
ImageryLayer.prototype._createTileImagerySkeletons = function(tile, terrainProvider, insertionPoint) {
379+
if (defined(this._minimumTerrainLevel) && tile.level < this._minimumTerrainLevel) {
380+
return false;
381+
}
382+
if (defined(this._maximumTerrainLevel) && tile.level > this._maximumTerrainLevel) {
383+
return false;
384+
}
385+
372386
var imageryProvider = this._imageryProvider;
373387

374388
if (!defined(insertionPoint)) {

Specs/Scene/ImageryLayerSpec.js

+47
Original file line numberDiff line numberDiff line change
@@ -287,4 +287,51 @@ defineSuite([
287287
expect(tiles[1].imagery.length).toBe(0);
288288
});
289289
});
290+
291+
it('createTileImagerySkeletons honors the minimumTerrainLevel and maximumTerrainLevel properties', function() {
292+
var provider = new SingleTileImageryProvider({
293+
url : 'Data/Images/Green4x4.png'
294+
});
295+
296+
var layer = new ImageryLayer(provider, {
297+
minimumTerrainLevel : 2,
298+
maximumTerrainLevel : 4
299+
});
300+
301+
var layers = new ImageryLayerCollection();
302+
layers.add(layer);
303+
304+
var terrainProvider = new EllipsoidTerrainProvider();
305+
306+
waitsFor(function() {
307+
return provider.isReady() && terrainProvider.isReady();
308+
}, 'imagery provider to become ready');
309+
310+
runs(function() {
311+
var level0 = terrainProvider.getTilingScheme().createLevelZeroTiles();
312+
var level1 = level0[0].getChildren();
313+
var level2 = level1[0].getChildren();
314+
var level3 = level2[0].getChildren();
315+
var level4 = level3[0].getChildren();
316+
var level5 = level4[0].getChildren();
317+
318+
layer._createTileImagerySkeletons(level0[0], terrainProvider);
319+
expect(level0[0].imagery.length).toBe(0);
320+
321+
layer._createTileImagerySkeletons(level1[0], terrainProvider);
322+
expect(level1[0].imagery.length).toBe(0);
323+
324+
layer._createTileImagerySkeletons(level2[0], terrainProvider);
325+
expect(level2[0].imagery.length).toBe(1);
326+
327+
layer._createTileImagerySkeletons(level3[0], terrainProvider);
328+
expect(level3[0].imagery.length).toBe(1);
329+
330+
layer._createTileImagerySkeletons(level4[0], terrainProvider);
331+
expect(level4[0].imagery.length).toBe(1);
332+
333+
layer._createTileImagerySkeletons(level5[0], terrainProvider);
334+
expect(level5[0].imagery.length).toBe(0);
335+
});
336+
});
290337
}, 'WebGL');

0 commit comments

Comments
 (0)