Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Set texture sampler properties of ImageryLayer #5890

Merged
merged 28 commits into from
Oct 23, 2017
Merged
Changes from 22 commits
Commits
Show all changes
28 commits
Select commit Hold shift + click to select a range
28d2921
Added properties ImageryLayer.minificationFilter and .magnificationFi…
forman Oct 6, 2017
4aff9c2
Renamed local var as mipmapMinificationFilter
forman Oct 9, 2017
e80ba2b
Merge branch 'master' into new_texture_sampler_prop
forman Oct 9, 2017
c1e0e54
Added some more API doc
forman Oct 9, 2017
daa095f
Made TextureMagnification/MinificationFilter public and added API-docs.
forman Oct 10, 2017
cb90b62
Update wrt public TextureMagnification/MinificationFilter enums
forman Oct 10, 2017
b5fe609
avoid line breaks
forman Oct 12, 2017
2dd4fd3
Use @exports so enum doc appears as its own section in the documentation
forman Oct 12, 2017
b9b8ab7
added @type {Number} and @constant to enum values
forman Oct 12, 2017
722cd71
use upper case Boolean
forman Oct 12, 2017
d5ccbb8
made validate() methods @private
forman Oct 12, 2017
8d27fe1
added defaultMinificationFilter and defaultMagnificationFilter to Ima…
forman Oct 12, 2017
3ec59b0
Updated api docs minification/magnificationFilter props
forman Oct 12, 2017
e5b9b61
fixed order of constants
forman Oct 12, 2017
47f66ba
fixed coding style
forman Oct 12, 2017
88d3458
added new test for default texture filters of ImageryProvider
forman Oct 12, 2017
eb5ec0c
fix: turned context.cache.imageryLayer_<x>Sampler into context.cache.…
forman Oct 12, 2017
924dc1c
reverted experimental change
forman Oct 12, 2017
3d5bfaa
create mipmap textures only for linear mini/magni filters
forman Oct 13, 2017
151f8fe
added texture filter example to Sandcastle
forman Oct 13, 2017
270c805
Merge branch 'master' into new_texture_sampler_prop
forman Oct 13, 2017
dbf8d3a
fixed a harmless typo
forman Oct 13, 2017
3d632cd
be more explicit about checking if something is undefined
forman Oct 19, 2017
2a08e5d
Merge branch 'master' into new_texture_sampler_prop
forman Oct 19, 2017
c826ec9
merged upstream
forman Oct 19, 2017
356f677
Tweak comment wording
lilleyse Oct 19, 2017
d5cf453
added assertions for imagery.texture.sampler
forman Oct 23, 2017
cdc9045
Merge branch 'master' into new_texture_sampler_prop
forman Oct 23, 2017
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
110 changes: 110 additions & 0 deletions Apps/Sandcastle/gallery/Imagery Layers Texture Filters.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,110 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, minimum-scale=1, user-scalable=no">
<meta name="description" content="Set the texture minification and magnification filters of an imagery layer.">
<meta name="cesium-sandcastle-labels" content="Beginner, Tutorials, Showcases">
<title>Cesium Demo</title>
<script type="text/javascript" src="../Sandcastle-header.js"></script>
<script type="text/javascript" src="../../../ThirdParty/requirejs-2.1.20/require.js"></script>
<script type="text/javascript">
require.config({
baseUrl : '../../../Source',
waitSeconds : 60
});
</script>
</head>
<body class="sandcastle-loading" data-sandcastle-bucket="bucket-requirejs.html">

<style>
@import url(../templates/bucket.css);

#slider {
position: absolute;
left: 50%;
top: 0px;
background-color: #D3D3D3;
width: 2px;
height: 100%;
z-index: 9999;
}

#slider:hover {
cursor: ew-resize;
}

</style>

<div id="cesiumContainer" class="fullSize">
<div id="slider"></div>
</div>
<div id="loadingOverlay"><h1>Loading...</h1></div>
<div id="toolbar"></div>

<script id="cesium_sandcastle_script">


function startup(Cesium) {
'use strict';
//Sandcastle_Begin
var viewer = new Cesium.Viewer('cesiumContainer');
viewer.camera.flyTo({destination : new Cesium.Rectangle.fromDegrees(-84, 43, -80, 47)});

var layers = viewer.imageryLayers;
layers.removeAll();

var layerLinear = layers.addImageryProvider(Cesium.createTileMapServiceImageryProvider({
url : require.toUrl('Assets/Textures/NaturalEarthII')
}));

var layerNearest = layers.addImageryProvider(Cesium.createTileMapServiceImageryProvider({
url : require.toUrl('Assets/Textures/NaturalEarthII')
}));

// Set the texture minification and magnification filters of layerNearest. Default is LINEAR.
layerNearest.minificationFilter = Cesium.TextureMinificationFilter.NEAREST;
layerNearest.magnificationFilter = Cesium.TextureMagnificationFilter.NEAREST;

// The remaining code installs a split layer so the effect of the texture filters becomes apparent.

layerNearest.splitDirection = Cesium.ImagerySplitDirection.RIGHT;

var slider = document.getElementById('slider');
viewer.scene.imagerySplitPosition = (slider.offsetLeft) / slider.parentElement.offsetWidth;

var dragStartX = 0;

document.getElementById('slider').addEventListener('mousedown', mouseDown, false);
window.addEventListener('mouseup', mouseUp, false);

function mouseUp() {
window.removeEventListener('mousemove', sliderMove, true);
}

function mouseDown(e) {
var slider = document.getElementById('slider');
dragStartX = e.clientX - slider.offsetLeft;
window.addEventListener('mousemove', sliderMove, true);
}

function sliderMove(e) {
var slider = document.getElementById('slider');
var splitPosition = (e.clientX - dragStartX) / slider.parentElement.offsetWidth;
slider.style.left = 100.0 * splitPosition + "%";
viewer.scene.imagerySplitPosition = splitPosition;
}
//Sandcastle_End

Sandcastle.finishedLoading();
}
if (typeof Cesium !== "undefined") {
startup(Cesium);
} else if (typeof require === "function") {
require(["Cesium"], startup);
}
</script>

</body>
</html>
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
4 changes: 4 additions & 0 deletions CHANGES.md
Original file line number Diff line number Diff line change
@@ -1,7 +1,11 @@
Change Log
==========

### 1.39 - 2017-11-01

* Added support for the layer.json `parentUrl` property in `CesiumTerrainProvider` to allow for compositing of tilesets.
* Added two new properties to `ImageryLayer` that allow for adjusting the texture sampler used for up- and down-sampling of image tiles, namely `minificationFilter` and `magnificationFilter` with possible values `LINEAR` (the default) and `NEAREST` defined in `TextureMinificationFilter` and `TextureMagnificationFilter`. [#5846](https://github.com/AnalyticalGraphicsInc/cesium/issues/5846)
* The enums `TextureMinificationFilter` and `TextureMagnificationFilter` have been made public to support the new texture filter properties mentioned above.

### 1.38 - 2017-10-02

28 changes: 27 additions & 1 deletion Source/Renderer/TextureMagnificationFilter.js
Original file line number Diff line number Diff line change
@@ -7,12 +7,38 @@ define([
'use strict';

/**
* @private
* Enumerates all possible filters used when magnifying WebGL textures, which takes places when zooming
* into imagery. Provides the possible values for the {@link ImageryLayer#magnificationFilter} property.
*
* @exports TextureMagnificationFilter
*
* @see TextureMinificationFilter
* @see ImageryLayer#magnificationFilter
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@lilleyse this @see - and the one in TextureMinificationFilter.js - is not needed and not customary. Can you please remove in master?

*/
var TextureMagnificationFilter = {
/**
* Nearest neighbor sampling of image pixels to texture.
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

In this file and below, try to avoid providing reference doc that is just a repeat of the enum. @lilleyse could you add a tad more description and trade offs, e.g., visual quality vs speed?

*
* @type {Number}
* @constant
*/
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

For each of these also add

         * @type {Number}
         * @constant

NEAREST : WebGLConstants.NEAREST,
/**
* Bi-linear interpolation of image pixels to texture.
*
* @type {Number}
* @constant
*/
LINEAR : WebGLConstants.LINEAR,

/**
* Validates the given <code>textureMinificationFilter</code> with respect to the possible enum values.
*
* @private
*
* @param textureMagnificationFilter
* @returns {Boolean} <code>true</code> if <code>textureMagnificationFilter</code> is valid.
*/
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

validate can be marked as @private.

validate : function(textureMagnificationFilter) {
return ((textureMagnificationFilter === TextureMagnificationFilter.NEAREST) ||
(textureMagnificationFilter === TextureMagnificationFilter.LINEAR));
52 changes: 51 additions & 1 deletion Source/Renderer/TextureMinificationFilter.js
Original file line number Diff line number Diff line change
@@ -7,16 +7,66 @@ define([
'use strict';

/**
* @private
* Enumerates all possible filters used when minifying WebGL textures, which takes places when zooming
* out of imagery. Provides the possible values for the {@link ImageryLayer#minificationFilter} property.
*
* @exports TextureMinificationFilter
*
* @see TextureMagnificationFilter
* @see ImageryLayer#minificationFilter
*/
var TextureMinificationFilter = {
/**
* Nearest neighbor sampling of image pixels to texture.
*
* @type {Number}
* @constant
*/
NEAREST : WebGLConstants.NEAREST,
/**
* Bi-linear interpolation of image pixels to texture.
*
* @type {Number}
* @constant
*/
LINEAR : WebGLConstants.LINEAR,
/**
* WebGL <code>NEAREST_MIPMAP_NEAREST</code> interpolation of image pixels to texture.
*
* @type {Number}
* @constant
*/
NEAREST_MIPMAP_NEAREST : WebGLConstants.NEAREST_MIPMAP_NEAREST,
/**
* WebGL <code>LINEAR_MIPMAP_NEAREST</code> interpolation of image pixels to texture.
*
* @type {Number}
* @constant
*/
LINEAR_MIPMAP_NEAREST : WebGLConstants.LINEAR_MIPMAP_NEAREST,
/**
* WebGL <code>NEAREST_MIPMAP_LINEAR</code> interpolation of image pixels to texture.
*
* @type {Number}
* @constant
*/
NEAREST_MIPMAP_LINEAR : WebGLConstants.NEAREST_MIPMAP_LINEAR,
/**
* WebGL <code>LINEAR_MIPMAP_LINEAR</code> interpolation of image pixels to texture.
*
* @type {Number}
* @constant
*/
LINEAR_MIPMAP_LINEAR : WebGLConstants.LINEAR_MIPMAP_LINEAR,

/**
* Validates the given <code>textureMinificationFilter</code> with respect to the possible enum values.
*
* @private
*
* @param textureMinificationFilter
* @returns {Boolean} <code>true</code> if <code>textureMinificationFilter</code> is valid.
*/
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Same comments for this section as above.

validate : function(textureMinificationFilter) {
return ((textureMinificationFilter === TextureMinificationFilter.NEAREST) ||
(textureMinificationFilter === TextureMinificationFilter.LINEAR) ||
110 changes: 95 additions & 15 deletions Source/Scene/ImageryLayer.js
Original file line number Diff line number Diff line change
@@ -136,6 +136,14 @@ define([
* the gamma value to use for the tile. The function is executed for every
* frame and for every tile, so it must be fast.
* @param {ImagerySplitDirection|Function} [options.splitDirection=ImagerySplitDirection.NONE] The {@link ImagerySplitDirection} split to apply to this layer.
* @param {TextureMinificationFilter} [options.minificationFilter=TextureMinificationFilter.LINEAR] The
* texture minification filter to apply to this layer. Possible values
* are <code>TextureMinificationFilter.LINEAR</code> and
* <code>TextureMinificationFilter.NEAREST</code>.
* @param {TextureMagnificationFilter} [options.magnificationFilter=TextureMagnificationFilter.LINEAR] The
* texture minification filter to apply to this layer. Possible values
* are <code>TextureMagnificationFilter.LINEAR</code> and
* <code>TextureMagnificationFilter.NEAREST</code>.
* @param {Boolean} [options.show=true] True if the layer is shown; otherwise, false.
* @param {Number} [options.maximumAnisotropy=maximum supported] The maximum anisotropy level to use
* for texture filtering. If this parameter is not specified, the maximum anisotropy supported
@@ -211,6 +219,32 @@ define([
*/
this.splitDirection = defaultValue(options.splitDirection, defaultValue(imageryProvider.defaultSplit, ImageryLayer.DEFAULT_SPLIT));

/**
* The {@link TextureMinificationFilter} to apply to this layer.
* Possible values are {@link TextureMinificationFilter.LINEAR} (the default)
* and {@link TextureMinificationFilter.NEAREST}.
*
* To take effect, this property must be set immediately after adding the imagery layer.
* Once a texture is loaded it won't be possible to change the texture filter used.
*
* @type {TextureMinificationFilter}
* @default {@link ImageryLayer.DEFAULT_MINIFICATION_FILTER}
*/
this.minificationFilter = defaultValue(options.minificationFilter, defaultValue(imageryProvider.defaultMinificationFilter, ImageryLayer.DEFAULT_MINIFICATION_FILTER));
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Did you mean to add defaultMinificationFilter and defaultMagnificationFilter to ImageryProvider?

Probably fine to not have it, but up to you.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I wasn't sure if I should add them, because ImageryProvider.defaultSplit is missing too. Adding them now...


/**
* The {@link TextureMagnificationFilter} to apply to this layer.
* Possible values are {@link TextureMagnificationFilter.LINEAR} (the default)
* and {@link TextureMagnificationFilter.NEAREST}.
*
* To take effect, this property must be set immediately after adding the imagery layer.
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is an important comment since I do not believe we ever create mipmaps for imagery tiles since the mipmapping is basically implicit in the tileset. Is this ever validated? A DeveloperError should be thrown if one of these two values is not set.

* Once a texture is loaded it won't be possible to change the texture filter used.
*
* @type {TextureMagnificationFilter}
* @default {@link ImageryLayer.DEFAULT_MAGNIFICATION_FILTER}
*/
this.magnificationFilter = defaultValue(options.magnificationFilter, defaultValue(imageryProvider.defaultMagnificationFilter, ImageryLayer.DEFAULT_MAGNIFICATION_FILTER));
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It should be noted somewhere that these values can be set immediately after adding the imagery layer but once a texture is loaded it won't be possible to change its filter.


/**
* Determines if this layer is shown.
*
@@ -309,13 +343,29 @@ define([
ImageryLayer.DEFAULT_GAMMA = 1.0;

/**
* This value is used as the default spliat for the imagery layer if one is not provided during construction
* This value is used as the default split for the imagery layer if one is not provided during construction
* or by the imagery provider.
* @type {ImagerySplitDirection}
* @default ImagerySplitDirection.NONE
*/
ImageryLayer.DEFAULT_SPLIT = ImagerySplitDirection.NONE;

/**
* This value is used as the default texture minification filter for the imagery layer if one is not provided
* during construction or by the imagery provider.
* @type {TextureMinificationFilter}
* @default TextureMinificationFilter.LINEAR
*/
ImageryLayer.DEFAULT_MINIFICATION_FILTER = TextureMinificationFilter.LINEAR;
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

For consistency with the rest of the code, DEFAULT_MINIFICATION_FILTER should be above ImageryLayer.DEFAULT_MAGNIFICATION_FILTER


/**
* This value is used as the default texture magnification filter for the imagery layer if one is not provided
* during construction or by the imagery provider.
* @type {TextureMagnificationFilter}
* @default TextureMagnificationFilter.LINEAR
*/
ImageryLayer.DEFAULT_MAGNIFICATION_FILTER = TextureMagnificationFilter.LINEAR;

/**
* Gets a value indicating whether this layer is the base layer in the
* {@link ImageryLayerCollection}. The base layer is the one that underlies all
@@ -764,6 +814,11 @@ define([
}
}

var sampler = new Sampler({
minificationFilter : this.minificationFilter,
magnificationFilter : this.magnificationFilter
});

// Imagery does not need to be discarded, so upload it to WebGL.
var texture;
if (defined(image.internalFormat)) {
@@ -774,13 +829,15 @@ define([
height : image.height,
source : {
arrayBufferView : image.bufferView
}
},
sampler : sampler
});
} else {
texture = new Texture({
context : context,
source : image,
pixelFormat : imageryProvider.hasAlphaChannel ? PixelFormat.RGBA : PixelFormat.RGB
pixelFormat : imageryProvider.hasAlphaChannel ? PixelFormat.RGBA : PixelFormat.RGB,
sampler : sampler
});
}

@@ -793,30 +850,53 @@ define([
imagery.state = ImageryState.TEXTURE_LOADED;
};

function getSamplerKey(minificationFilter, magnificationFilter, maximumAnisotropy) {
return minificationFilter + ':' + magnificationFilter + ':' + maximumAnisotropy;
}

function finalizeReprojectTexture(imageryLayer, context, imagery, texture) {
// Use mipmaps if this texture has power-of-two dimensions.
if (!PixelFormat.isCompressedFormat(texture.pixelFormat) && CesiumMath.isPowerOfTwo(texture.width) && CesiumMath.isPowerOfTwo(texture.height)) {
var mipmapSampler = context.cache.imageryLayer_mipmapSampler;
var minificationFilter = imageryLayer.minificationFilter;
var magnificationFilter = imageryLayer.magnificationFilter;
var usesLinearTextureFilter = minificationFilter === TextureMinificationFilter.LINEAR && magnificationFilter === TextureMagnificationFilter.LINEAR;
// Use mipmaps if this texture uses linear filters and has power-of-two dimensions.
if (usesLinearTextureFilter && !PixelFormat.isCompressedFormat(texture.pixelFormat) && CesiumMath.isPowerOfTwo(texture.width) && CesiumMath.isPowerOfTwo(texture.height)) {
if (minificationFilter === TextureMinificationFilter.NEAREST) {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The check for NEAREST here is no longer needed.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

oops

minificationFilter = TextureMinificationFilter.NEAREST_MIPMAP_NEAREST;
} else if (minificationFilter === TextureMinificationFilter.LINEAR) {
minificationFilter = TextureMinificationFilter.LINEAR_MIPMAP_LINEAR;
}
var maximumSupportedAnisotropy = ContextLimits.maximumTextureFilterAnisotropy;
var maximumAnisotropy = Math.min(maximumSupportedAnisotropy, defaultValue(imageryLayer._maximumAnisotropy, maximumSupportedAnisotropy));
var mipmapSamplerKey = getSamplerKey(minificationFilter, magnificationFilter, maximumAnisotropy);
var mipmapSamplers = context.cache.imageryLayerMipmapSamplers;
var mipmapSampler = mipmapSamplers && mipmapSamplers[mipmapSamplerKey];
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We usually try to be more explicit about checking if something is undefined. The section could be written slightly differently to be a bit more conformant with the rest of the code:

var mipmapSamplers = context.cache.imageryLayerMipmapSamplers;
if (!defined(mipmapSamplers)) {
    mipmapSamplers = {};
    context.cache.imageryLayerMipmapSamplers = mipmapSamplers;
}
var mipmapSampler = mipmapSamplers[mipmapSamplerKey];
if (!defined(mipmapSampler)) {
    mipmapSampler = new Sampler({
        wrapS : TextureWrap.CLAMP_TO_EDGE,
        wrapT : TextureWrap.CLAMP_TO_EDGE,
        minificationFilter : minificationFilter,
        magnificationFilter : magnificationFilter,
        maximumAnisotropy : maximumAnisotropy
    });
    mipmapSamplers[mipmapSamplerKey] = mipmapSampler;
}

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Will change this, thanks!

if (!defined(mipmapSampler)) {
var maximumSupportedAnisotropy = ContextLimits.maximumTextureFilterAnisotropy;
mipmapSampler = context.cache.imageryLayer_mipmapSampler = new Sampler({
if (!defined(mipmapSamplers)) {
mipmapSamplers = context.cache.imageryLayerMipmapSamplers = {};
}
mipmapSampler = mipmapSamplers[mipmapSamplerKey] = new Sampler({
wrapS : TextureWrap.CLAMP_TO_EDGE,
wrapT : TextureWrap.CLAMP_TO_EDGE,
minificationFilter : TextureMinificationFilter.LINEAR_MIPMAP_LINEAR,
magnificationFilter : TextureMagnificationFilter.LINEAR,
maximumAnisotropy : Math.min(maximumSupportedAnisotropy, defaultValue(imageryLayer._maximumAnisotropy, maximumSupportedAnisotropy))
minificationFilter : minificationFilter,
magnificationFilter : magnificationFilter,
maximumAnisotropy : maximumAnisotropy
});
}
texture.generateMipmap(MipmapHint.NICEST);
texture.sampler = mipmapSampler;
} else {
var nonMipmapSampler = context.cache.imageryLayer_nonMipmapSampler;
var nonMipmapSamplerKey = getSamplerKey(minificationFilter, magnificationFilter, 0);
var nonMipmapSamplers = context.cache.imageryLayerNonMipmapSamplers;
var nonMipmapSampler = nonMipmapSamplers && nonMipmapSamplers[nonMipmapSamplerKey];
if (!defined(nonMipmapSampler)) {
nonMipmapSampler = context.cache.imageryLayer_nonMipmapSampler = new Sampler({
if (!defined(nonMipmapSamplers)) {
nonMipmapSamplers = context.cache.imageryLayerNonMipmapSamplers = {};
}
nonMipmapSampler = nonMipmapSamplers[nonMipmapSamplerKey] = new Sampler({
wrapS : TextureWrap.CLAMP_TO_EDGE,
wrapT : TextureWrap.CLAMP_TO_EDGE,
minificationFilter : TextureMinificationFilter.LINEAR,
magnificationFilter : TextureMagnificationFilter.LINEAR
minificationFilter : minificationFilter,
magnificationFilter : magnificationFilter
});
}
texture.sampler = nonMipmapSampler;
16 changes: 16 additions & 0 deletions Source/Scene/ImageryProvider.js
Original file line number Diff line number Diff line change
@@ -93,6 +93,22 @@ define([
*/
this.defaultGamma = undefined;

/**
* The default texture minification filter to apply to this provider.
*
* @type {TextureMinificationFilter}
* @default undefined
*/
this.defaultMinificationFilter = undefined;

/**
* The default texture magnification filter to apply to this provider.
*
* @type {TextureMagnificationFilter}
* @default undefined
*/
this.defaultMagnificationFilter = undefined;

DeveloperError.throwInstantiationError();
}

39 changes: 39 additions & 0 deletions Specs/Scene/ImageryLayerSpec.js
Original file line number Diff line number Diff line change
@@ -7,6 +7,8 @@ defineSuite([
'Core/Rectangle',
'Core/RequestScheduler',
'Renderer/ComputeEngine',
'Renderer/TextureMagnificationFilter',
'Renderer/TextureMinificationFilter',
'Scene/ArcGisMapServerImageryProvider',
'Scene/BingMapsImageryProvider',
'Scene/createTileMapServiceImageryProvider',
@@ -30,6 +32,8 @@ defineSuite([
Rectangle,
RequestScheduler,
ComputeEngine,
TextureMagnificationFilter,
TextureMinificationFilter,
ArcGisMapServerImageryProvider,
BingMapsImageryProvider,
createTileMapServiceImageryProvider,
@@ -367,6 +371,41 @@ defineSuite([
expect(layer.isDestroyed()).toEqual(true);
});

it('allows setting texture filter properties', function() {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@lilleyse are these tests sufficient? How is coverage? Should these also do a smokescreen render?

var provider = new SingleTileImageryProvider({
url : 'Data/Images/Red16x16.png'
});

// expect default LINEAR
var layer = new ImageryLayer(provider);
expect(layer.minificationFilter).toEqual(TextureMinificationFilter.LINEAR);
expect(layer.magnificationFilter).toEqual(TextureMagnificationFilter.LINEAR);
layer.destroy();

// change to NEAREST
layer = new ImageryLayer(provider, {
minificationFilter: TextureMinificationFilter.NEAREST,
magnificationFilter: TextureMagnificationFilter.NEAREST
});
expect(layer.minificationFilter).toEqual(TextureMinificationFilter.NEAREST);
expect(layer.magnificationFilter).toEqual(TextureMagnificationFilter.NEAREST);
layer.destroy();
});

it('uses default texture filter properties of ImageryProvider', function() {
var provider = new SingleTileImageryProvider({
url : 'Data/Images/Red16x16.png'
});

provider.defaultMinificationFilter = TextureMinificationFilter.NEAREST;
provider.defaultMagnificationFilter = TextureMinificationFilter.NEAREST;

var layer = new ImageryLayer(provider);
expect(layer.minificationFilter).toEqual(TextureMinificationFilter.NEAREST);
expect(layer.magnificationFilter).toEqual(TextureMagnificationFilter.NEAREST);
layer.destroy();
});

it('returns HTTP status code information in TileProviderError', function() {
// Web browsers unfortunately provide very little information about what went wrong when an Image fails
// to load. But when an imagery provider is configured to use a TileDiscardPolicy, Cesium downloads the image