/**
|
* Computes the size of a pixel in meters at a distance from the eye.
|
* <p>
|
* Use this version when passing in a custom pixel ratio. For example, passing in 1.0 will return meters per native device pixel.
|
* </p>
|
* @name czm_metersPerPixel
|
* @glslFunction
|
*
|
* @param {vec3} positionEC The position to get the meters per pixel in eye coordinates.
|
* @param {float} pixelRatio The scaling factor from pixel space to coordinate space
|
*
|
* @returns {float} The meters per pixel at positionEC.
|
*/
|
float czm_metersPerPixel(vec4 positionEC, float pixelRatio)
|
{
|
float width = czm_viewport.z;
|
float height = czm_viewport.w;
|
float pixelWidth;
|
float pixelHeight;
|
|
float top = czm_frustumPlanes.x;
|
float bottom = czm_frustumPlanes.y;
|
float left = czm_frustumPlanes.z;
|
float right = czm_frustumPlanes.w;
|
|
if (czm_sceneMode == czm_sceneMode2D || czm_orthographicIn3D == 1.0)
|
{
|
float frustumWidth = right - left;
|
float frustumHeight = top - bottom;
|
pixelWidth = frustumWidth / width;
|
pixelHeight = frustumHeight / height;
|
}
|
else
|
{
|
float distanceToPixel = -positionEC.z;
|
float inverseNear = 1.0 / czm_currentFrustum.x;
|
float tanTheta = top * inverseNear;
|
pixelHeight = 2.0 * distanceToPixel * tanTheta / height;
|
tanTheta = right * inverseNear;
|
pixelWidth = 2.0 * distanceToPixel * tanTheta / width;
|
}
|
|
return max(pixelWidth, pixelHeight) * pixelRatio;
|
}
|
|
/**
|
* Computes the size of a pixel in meters at a distance from the eye.
|
* <p>
|
* Use this version when scaling by pixel ratio.
|
* </p>
|
* @name czm_metersPerPixel
|
* @glslFunction
|
*
|
* @param {vec3} positionEC The position to get the meters per pixel in eye coordinates.
|
*
|
* @returns {float} The meters per pixel at positionEC.
|
*/
|
float czm_metersPerPixel(vec4 positionEC)
|
{
|
return czm_metersPerPixel(positionEC, czm_pixelRatio);
|
}
|