diff --git a/CHANGES.md b/CHANGES.md index 0243f1619607..03a177007630 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -16,6 +16,7 @@ Change Log * Fixed polyline colors when `scene.highDynamicRange` is enabled. [#7924](https://github.com/AnalyticalGraphicsInc/cesium/pull/7924) * Fixed a bug in the inspector where the min/max height values of a picked tile were undefined. [#7904](https://github.com/AnalyticalGraphicsInc/cesium/pull/7904) * Fixed `Math.factorial` to return the correct values. (https://github.com/AnalyticalGraphicsInc/cesium/pull/7969) +* Fixed a bug that caused 3D models to appear darker on Android devices. [#7944](https://github.com/AnalyticalGraphicsInc/cesium/pull/7944) ### 1.58.1 - 2018-06-03 _This is an npm-only release to fix a publishing issue_. diff --git a/CONTRIBUTORS.md b/CONTRIBUTORS.md index 010541e06f61..8d006d3fdbe3 100644 --- a/CONTRIBUTORS.md +++ b/CONTRIBUTORS.md @@ -214,3 +214,4 @@ See [CONTRIBUTING.md](CONTRIBUTING.md) for details on how to contribute to Cesiu * [Trubie Turner](https://github.com/flexei) * [Merijn Wijngaard](https://github.com/mwijngaard) * [Dennis Adams](https://github.com/dennisadams) +* [Hai Zhou](https://github.com/verybigzhouhai) diff --git a/Source/Scene/processPbrMaterials.js b/Source/Scene/processPbrMaterials.js index b9eeb0af8f9d..b61e97ac8b29 100644 --- a/Source/Scene/processPbrMaterials.js +++ b/Source/Scene/processPbrMaterials.js @@ -740,9 +740,8 @@ define([ fragmentShader += ' vec3 r = normalize(czm_inverseViewRotation * normalize(reflect(v, n)));\n'; // Figure out if the reflection vector hits the ellipsoid - fragmentShader += ' czm_ellipsoid ellipsoid = czm_getWgs84EllipsoidEC();\n'; fragmentShader += ' float vertexRadius = length(positionWC);\n'; - fragmentShader += ' float horizonDotNadir = 1.0 - min(1.0, ellipsoid.radii.x / vertexRadius);\n'; + fragmentShader += ' float horizonDotNadir = 1.0 - min(1.0, czm_ellipsoidRadii.x / vertexRadius);\n'; fragmentShader += ' float reflectionDotNadir = dot(r, normalize(positionWC));\n'; // Flipping the X vector is a cheap way to get the inverse of czm_temeToPseudoFixed, since that's a rotation about Z. fragmentShader += ' r.x = -r.x;\n'; diff --git a/Source/Shaders/Builtin/Constants/ellipsoidInverseRadii.glsl b/Source/Shaders/Builtin/Constants/ellipsoidInverseRadii.glsl new file mode 100644 index 000000000000..1350a9a8ded8 --- /dev/null +++ b/Source/Shaders/Builtin/Constants/ellipsoidInverseRadii.glsl @@ -0,0 +1,7 @@ +/** + * The reciprocal of the radius of the WGS84 ellipsoid. + * + * @name czm_ellipsoidInverseRadii + * @glslConstant + */ +const vec3 czm_ellipsoidInverseRadii = vec3(1.0 / 6378137.0, 1.0 / 6378137.0, 1.0 / 6356752.314245); diff --git a/Source/Shaders/Builtin/Constants/ellipsoidRadii.glsl b/Source/Shaders/Builtin/Constants/ellipsoidRadii.glsl new file mode 100644 index 000000000000..01574c8b1f1c --- /dev/null +++ b/Source/Shaders/Builtin/Constants/ellipsoidRadii.glsl @@ -0,0 +1,7 @@ +/** + * The radius of the WGS84 ellipsoid. + * + * @name czm_ellipsoidRadii + * @glslConstant + */ +const vec3 czm_ellipsoidRadii = vec3(6378137.0, 6378137.0, 6356752.314245); diff --git a/Source/Shaders/Builtin/Functions/ellipsoidContainsPoint.glsl b/Source/Shaders/Builtin/Functions/ellipsoidContainsPoint.glsl index cc3e4efc3b38..0b3e8f237c8e 100644 --- a/Source/Shaders/Builtin/Functions/ellipsoidContainsPoint.glsl +++ b/Source/Shaders/Builtin/Functions/ellipsoidContainsPoint.glsl @@ -5,8 +5,8 @@ * @glslFunction * */ -bool czm_ellipsoidContainsPoint(czm_ellipsoid ellipsoid, vec3 point) +bool czm_ellipsoidContainsPoint(vec3 ellipsoid_inverseRadii, vec3 point) { - vec3 scaled = ellipsoid.inverseRadii * (czm_inverseModelView * vec4(point, 1.0)).xyz; + vec3 scaled = ellipsoid_inverseRadii * (czm_inverseModelView * vec4(point, 1.0)).xyz; return (dot(scaled, scaled) <= 1.0); } diff --git a/Source/Shaders/Builtin/Functions/ellipsoidNew.glsl b/Source/Shaders/Builtin/Functions/ellipsoidNew.glsl deleted file mode 100644 index b1bd61fce129..000000000000 --- a/Source/Shaders/Builtin/Functions/ellipsoidNew.glsl +++ /dev/null @@ -1,14 +0,0 @@ -/** - * DOC_TBA - * - * @name czm_ellipsoidNew - * @glslFunction - * - */ -czm_ellipsoid czm_ellipsoidNew(vec3 center, vec3 radii) -{ - vec3 inverseRadii = vec3(1.0 / radii.x, 1.0 / radii.y, 1.0 / radii.z); - vec3 inverseRadiiSquared = inverseRadii * inverseRadii; - czm_ellipsoid temp = czm_ellipsoid(center, radii, inverseRadii, inverseRadiiSquared); - return temp; -} diff --git a/Source/Shaders/Builtin/Functions/getWgs84EllipsoidEC.glsl b/Source/Shaders/Builtin/Functions/getWgs84EllipsoidEC.glsl deleted file mode 100644 index 204e9f31a63b..000000000000 --- a/Source/Shaders/Builtin/Functions/getWgs84EllipsoidEC.glsl +++ /dev/null @@ -1,21 +0,0 @@ -/** - * Returns the WGS84 ellipsoid, with its center at the origin of world coordinates, in eye coordinates. - * - * @name czm_getWgs84EllipsoidEC - * @glslFunction - * - * @returns {czm_ellipsoid} The WGS84 ellipsoid, with its center at the origin of world coordinates, in eye coordinates. - * - * @see Ellipsoid.WGS84 - * - * @example - * czm_ellipsoid ellipsoid = czm_getWgs84EllipsoidEC(); - */ -czm_ellipsoid czm_getWgs84EllipsoidEC() -{ - vec3 radii = vec3(6378137.0, 6378137.0, 6356752.314245); - vec3 inverseRadii = vec3(1.0 / radii.x, 1.0 / radii.y, 1.0 / radii.z); - vec3 inverseRadiiSquared = inverseRadii * inverseRadii; - czm_ellipsoid temp = czm_ellipsoid(czm_view[3].xyz, radii, inverseRadii, inverseRadiiSquared); - return temp; -} diff --git a/Source/Shaders/Builtin/Functions/rayEllipsoidIntersectionInterval.glsl b/Source/Shaders/Builtin/Functions/rayEllipsoidIntersectionInterval.glsl index b1bea1a33495..29086ab9363a 100644 --- a/Source/Shaders/Builtin/Functions/rayEllipsoidIntersectionInterval.glsl +++ b/Source/Shaders/Builtin/Functions/rayEllipsoidIntersectionInterval.glsl @@ -4,17 +4,17 @@ * @name czm_rayEllipsoidIntersectionInterval * @glslFunction */ -czm_raySegment czm_rayEllipsoidIntersectionInterval(czm_ray ray, czm_ellipsoid ellipsoid) +czm_raySegment czm_rayEllipsoidIntersectionInterval(czm_ray ray, vec3 ellipsoid_center, vec3 ellipsoid_inverseRadii) { // ray and ellipsoid center in eye coordinates. radii in model coordinates. - vec3 q = ellipsoid.inverseRadii * (czm_inverseModelView * vec4(ray.origin, 1.0)).xyz; - vec3 w = ellipsoid.inverseRadii * (czm_inverseModelView * vec4(ray.direction, 0.0)).xyz; - - q = q - ellipsoid.inverseRadii * (czm_inverseModelView * vec4(ellipsoid.center, 1.0)).xyz; - + vec3 q = ellipsoid_inverseRadii * (czm_inverseModelView * vec4(ray.origin, 1.0)).xyz; + vec3 w = ellipsoid_inverseRadii * (czm_inverseModelView * vec4(ray.direction, 0.0)).xyz; + + q = q - ellipsoid_inverseRadii * (czm_inverseModelView * vec4(ellipsoid_center, 1.0)).xyz; + float q2 = dot(q, q); float qw = dot(q, w); - + if (q2 > 1.0) // Outside ellipsoid. { if (qw >= 0.0) // Looking outward or tangent (0 intersections). @@ -27,11 +27,11 @@ czm_raySegment czm_rayEllipsoidIntersectionInterval(czm_ray ray, czm_ellipsoid e float difference = q2 - 1.0; // Positively valued. float w2 = dot(w, w); float product = w2 * difference; - + if (qw2 < product) // Imaginary roots (0 intersections). { - return czm_emptyRaySegment; - } + return czm_emptyRaySegment; + } else if (qw2 > product) // Distinct roots (2 intersections). { float discriminant = qw * qw - product; diff --git a/Source/Shaders/Builtin/Structs/ellipsoid.glsl b/Source/Shaders/Builtin/Structs/ellipsoid.glsl deleted file mode 100644 index c4bf84a440c0..000000000000 --- a/Source/Shaders/Builtin/Structs/ellipsoid.glsl +++ /dev/null @@ -1,12 +0,0 @@ -/** DOC_TBA - * - * @name czm_ellipsoid - * @glslStruct - */ -struct czm_ellipsoid -{ - vec3 center; - vec3 radii; - vec3 inverseRadii; - vec3 inverseRadiiSquared; -}; diff --git a/Source/Shaders/DepthPlaneFS.glsl b/Source/Shaders/DepthPlaneFS.glsl index 41385729ae4b..10c3ca2a0722 100644 --- a/Source/Shaders/DepthPlaneFS.glsl +++ b/Source/Shaders/DepthPlaneFS.glsl @@ -2,13 +2,12 @@ varying vec4 positionEC; void main() { - // TODO: make arbitrary ellipsoid - czm_ellipsoid ellipsoid = czm_getWgs84EllipsoidEC(); - vec3 direction = normalize(positionEC.xyz); czm_ray ray = czm_ray(vec3(0.0), direction); - czm_raySegment intersection = czm_rayEllipsoidIntersectionInterval(ray, ellipsoid); + vec3 ellipsoid_center = czm_view[3].xyz; + + czm_raySegment intersection = czm_rayEllipsoidIntersectionInterval(ray, ellipsoid_center, czm_ellipsoidInverseRadii); if (!czm_isEmpty(intersection)) { gl_FragColor = vec4(1.0, 1.0, 0.0, 1.0); diff --git a/Source/Shaders/EllipsoidFS.glsl b/Source/Shaders/EllipsoidFS.glsl index d028e502b96d..e7e5fbe1c267 100644 --- a/Source/Shaders/EllipsoidFS.glsl +++ b/Source/Shaders/EllipsoidFS.glsl @@ -72,10 +72,11 @@ void main() } // March ray forward to intersection with larger sphere and find - // actual intersection point with ellipsoid. - czm_ellipsoid ellipsoid = czm_ellipsoidNew(ellipsoidCenter, u_radii); czm_ray ray = czm_ray(t * direction, direction); - czm_raySegment intersection = czm_rayEllipsoidIntersectionInterval(ray, ellipsoid); + + vec3 ellipsoid_inverseRadii = vec3(1.0 / u_radii.x, 1.0 / u_radii.y, 1.0 / u_radii.z); + + czm_raySegment intersection = czm_rayEllipsoidIntersectionInterval(ray, ellipsoidCenter, ellipsoid_inverseRadii); if (czm_isEmpty(intersection)) { diff --git a/Source/Shaders/GlobeFS.glsl b/Source/Shaders/GlobeFS.glsl index ed6085494247..59907afb4063 100644 --- a/Source/Shaders/GlobeFS.glsl +++ b/Source/Shaders/GlobeFS.glsl @@ -278,7 +278,7 @@ void main() float fadeOutDist = u_lightingFadeDistance.x; float fadeInDist = u_lightingFadeDistance.y; if (czm_sceneMode != czm_sceneMode3D) { - vec3 radii = czm_getWgs84EllipsoidEC().radii; + vec3 radii = czm_ellipsoidRadii; float maxRadii = max(radii.x, max(radii.y, radii.z)); fadeOutDist -= maxRadii; fadeInDist -= maxRadii; @@ -376,8 +376,6 @@ void main() } #if defined(PER_FRAGMENT_GROUND_ATMOSPHERE) && (defined(ENABLE_DAYNIGHT_SHADING) || defined(ENABLE_VERTEX_LIGHTING)) - czm_ellipsoid ellipsoid = czm_getWgs84EllipsoidEC(); - float mpp = czm_metersPerPixel(vec4(0.0, 0.0, -czm_currentFrustum.x, 1.0)); vec2 xy = gl_FragCoord.xy / czm_viewport.zw * 2.0 - vec2(1.0); xy *= czm_viewport.zw * mpp * 0.5; @@ -385,7 +383,9 @@ void main() vec3 direction = normalize(vec3(xy, -czm_currentFrustum.x)); czm_ray ray = czm_ray(vec3(0.0), direction); - czm_raySegment intersection = czm_rayEllipsoidIntersectionInterval(ray, ellipsoid); + vec3 ellipsoid_center = czm_view[3].xyz; + + czm_raySegment intersection = czm_rayEllipsoidIntersectionInterval(ray, ellipsoid_center, czm_ellipsoidInverseRadii); vec3 ellipsoidPosition = czm_pointAlongRay(ray, intersection.start); ellipsoidPosition = (czm_inverseView * vec4(ellipsoidPosition, 1.0)).xyz; diff --git a/Source/Shaders/GlobeVS.glsl b/Source/Shaders/GlobeVS.glsl index 5099f15af85d..684321547163 100644 --- a/Source/Shaders/GlobeVS.glsl +++ b/Source/Shaders/GlobeVS.glsl @@ -176,7 +176,7 @@ void main() #endif #ifdef APPLY_MATERIAL - float northPoleZ = czm_getWgs84EllipsoidEC().radii.z; + float northPoleZ = czm_ellipsoidRadii.z; vec3 northPolePositionMC = vec3(0.0, 0.0, northPoleZ); vec3 ellipsoidNormal = normalize(v_positionMC); // For a sphere this is correct, but not generally for an ellipsoid. vec3 vectorEastMC = normalize(cross(northPolePositionMC - v_positionMC, ellipsoidNormal));