-
Notifications
You must be signed in to change notification settings - Fork 3.6k
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
Changes from 6 commits
28d2921
4aff9c2
e80ba2b
c1e0e54
daa095f
cb90b62
b5fe609
2dd4fd3
b9b8ab7
722cd71
d5ccbb8
8d27fe1
3ec59b0
e5b9b61
47f66ba
88d3458
eb5ec0c
924dc1c
3d5bfaa
151f8fe
270c805
dbf8d3a
3d632cd
2a08e5d
c826ec9
356f677
d5cf453
cdc9045
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -7,12 +7,30 @@ 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. | ||
* | ||
* @alias TextureMagnificationFilter | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Use |
||
* | ||
* @see TextureMinificationFilter | ||
* @see ImageryLayer#magnificationFilter | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. @lilleyse this |
||
*/ | ||
var TextureMagnificationFilter = { | ||
/** | ||
* Nearest neighbor sampling of image pixels to texture. | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe 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? |
||
*/ | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. For each of these also add
|
||
NEAREST : WebGLConstants.NEAREST, | ||
/** | ||
* Bi-linear interpolation of image pixels to texture. | ||
*/ | ||
LINEAR : WebGLConstants.LINEAR, | ||
|
||
/** | ||
* Validates the given <code>textureMinificationFilter</code> with respect to the possible enum values. | ||
* | ||
* @param textureMagnificationFilter | ||
* @returns {boolean} <code>true</code> if <code>textureMagnificationFilter</code> is valid. | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. We typically make the type uppercase |
||
*/ | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
|
||
validate : function(textureMagnificationFilter) { | ||
return ((textureMagnificationFilter === TextureMagnificationFilter.NEAREST) || | ||
(textureMagnificationFilter === TextureMagnificationFilter.LINEAR)); | ||
|
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -7,16 +7,46 @@ 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. | ||
* | ||
* @alias TextureMinificationFilter | ||
* | ||
* @see TextureMagnificationFilter | ||
* @see ImageryLayer#minificationFilter | ||
*/ | ||
var TextureMinificationFilter = { | ||
/** | ||
* Nearest neighbor sampling of image pixels to texture. | ||
*/ | ||
NEAREST : WebGLConstants.NEAREST, | ||
/** | ||
* Bi-linear interpolation of image pixels to texture. | ||
*/ | ||
LINEAR : WebGLConstants.LINEAR, | ||
/** | ||
* WebGL <code>NEAREST_MIPMAP_NEAREST</code> interpolation of image pixels to texture. | ||
*/ | ||
NEAREST_MIPMAP_NEAREST : WebGLConstants.NEAREST_MIPMAP_NEAREST, | ||
/** | ||
* WebGL <code>LINEAR_MIPMAP_NEAREST</code> interpolation of image pixels to texture. | ||
*/ | ||
LINEAR_MIPMAP_NEAREST : WebGLConstants.LINEAR_MIPMAP_NEAREST, | ||
/** | ||
* WebGL <code>NEAREST_MIPMAP_LINEAR</code> interpolation of image pixels to texture. | ||
*/ | ||
NEAREST_MIPMAP_LINEAR : WebGLConstants.NEAREST_MIPMAP_LINEAR, | ||
/** | ||
* WebGL <code>LINEAR_MIPMAP_LINEAR</code> interpolation of image pixels to texture. | ||
*/ | ||
LINEAR_MIPMAP_LINEAR : WebGLConstants.LINEAR_MIPMAP_LINEAR, | ||
|
||
/** | ||
* Validates the given <code>textureMinificationFilter</code> with respect to the possible enum values. | ||
* | ||
* @param textureMinificationFilter | ||
* @returns {boolean} <code>true</code> if <code>textureMinificationFilter</code> is valid. | ||
*/ | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe 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) || | ||
|
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,26 @@ 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}. | ||
* | ||
* @type {TextureMinificationFilter} | ||
* @default {@link ImageryLayer.DEFAULT_MINIFICATION_FILTER} | ||
*/ | ||
this.minificationFilter = defaultValue(options.minificationFilter, defaultValue(imageryProvider.defaultMinificationFilter, ImageryLayer.DEFAULT_MINIFICATION_FILTER)); | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Did you mean to add Probably fine to not have it, but up to you. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I wasn't sure if I should add them, because |
||
|
||
/** | ||
* The {@link TextureMagnificationFilter} to apply to this layer. | ||
* Possible values are {@link TextureMagnificationFilter.LINEAR} (the default) | ||
* and {@link TextureMagnificationFilter.NEAREST}. | ||
* | ||
* @type {TextureMagnificationFilter} | ||
* @default {@link ImageryLayer.DEFAULT_MAGNIFICATION_FILTER} | ||
*/ | ||
this.magnificationFilter = defaultValue(options.magnificationFilter, defaultValue(imageryProvider.defaultMagnificationFilter, ImageryLayer.DEFAULT_MAGNIFICATION_FILTER)); | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe 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 +337,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 magnification filter for the imagery layer if one is not provided | ||
* during construction or by the imagery provider. | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. If you decide to leave texture filtering out of the imagery provider, tweak this and below's doc. |
||
* @type {TextureMagnificationFilter} | ||
* @default TextureMagnificationFilter.LINEAR | ||
*/ | ||
ImageryLayer.DEFAULT_MAGNIFICATION_FILTER = TextureMagnificationFilter.LINEAR; | ||
|
||
/** | ||
* 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; | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. For consistency with the rest of the code, |
||
|
||
/** | ||
* 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 +808,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 +823,15 @@ define([ | |
height : image.height, | ||
source : { | ||
arrayBufferView : image.bufferView | ||
} | ||
}, | ||
sampler: sampler | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Format as |
||
}); | ||
} else { | ||
texture = new Texture({ | ||
context : context, | ||
source : image, | ||
pixelFormat : imageryProvider.hasAlphaChannel ? PixelFormat.RGBA : PixelFormat.RGB | ||
pixelFormat : imageryProvider.hasAlphaChannel ? PixelFormat.RGBA : PixelFormat.RGB, | ||
sampler: sampler | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Format as |
||
}); | ||
} | ||
|
||
|
@@ -799,11 +850,17 @@ define([ | |
var mipmapSampler = context.cache.imageryLayer_mipmapSampler; | ||
if (!defined(mipmapSampler)) { | ||
var maximumSupportedAnisotropy = ContextLimits.maximumTextureFilterAnisotropy; | ||
var mipmapMinificationFilter = imageryLayer.minificationFilter; | ||
if (imageryLayer.minificationFilter === TextureMinificationFilter.NEAREST) { | ||
mipmapMinificationFilter = TextureMinificationFilter.NEAREST_MIPMAP_NEAREST; | ||
} else if (imageryLayer.minificationFilter === TextureMinificationFilter.LINEAR) { | ||
mipmapMinificationFilter = TextureMinificationFilter.LINEAR_MIPMAP_LINEAR; | ||
} | ||
mipmapSampler = context.cache.imageryLayer_mipmapSampler = new Sampler({ | ||
wrapS : TextureWrap.CLAMP_TO_EDGE, | ||
wrapT : TextureWrap.CLAMP_TO_EDGE, | ||
minificationFilter : TextureMinificationFilter.LINEAR_MIPMAP_LINEAR, | ||
magnificationFilter : TextureMagnificationFilter.LINEAR, | ||
minificationFilter : mipmapMinificationFilter, | ||
magnificationFilter : imageryLayer.magnificationFilter, | ||
maximumAnisotropy : Math.min(maximumSupportedAnisotropy, defaultValue(imageryLayer._maximumAnisotropy, maximumSupportedAnisotropy)) | ||
}); | ||
} | ||
|
@@ -815,8 +872,8 @@ define([ | |
nonMipmapSampler = context.cache.imageryLayer_nonMipmapSampler = new Sampler({ | ||
wrapS : TextureWrap.CLAMP_TO_EDGE, | ||
wrapT : TextureWrap.CLAMP_TO_EDGE, | ||
minificationFilter : TextureMinificationFilter.LINEAR, | ||
magnificationFilter : TextureMagnificationFilter.LINEAR | ||
minificationFilter : imageryLayer.minificationFilter, | ||
magnificationFilter : imageryLayer.magnificationFilter | ||
}); | ||
} | ||
texture.sampler = nonMipmapSampler; | ||
|
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,25 @@ defineSuite([ | |
expect(layer.isDestroyed()).toEqual(true); | ||
}); | ||
|
||
it('texture filter properties work as expected', function() { | ||
var provider = new SingleTileImageryProvider({ | ||
url : 'Data/Images/Red16x16.png' | ||
}); | ||
|
||
var layer = new ImageryLayer(provider, {}); | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. This can just be |
||
expect(layer.magnificationFilter).toEqual(TextureMagnificationFilter.LINEAR); | ||
expect(layer.minificationFilter).toEqual(TextureMinificationFilter.LINEAR); | ||
layer.destroy(); | ||
|
||
layer = new ImageryLayer(provider, { | ||
magnificationFilter: TextureMagnificationFilter.NEAREST, | ||
minificationFilter: TextureMinificationFilter.NEAREST | ||
}); | ||
expect(layer.magnificationFilter).toEqual(TextureMagnificationFilter.NEAREST); | ||
expect(layer.minificationFilter).toEqual(TextureMinificationFilter.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 | ||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Usually we don't use line breaks in
CHANGES.md
, one long line is fine.can be its own bullet.