diff --git a/CONTRIBUTORS.md b/CONTRIBUTORS.md index 070e4376d78f..66c029cf7a0a 100644 --- a/CONTRIBUTORS.md +++ b/CONTRIBUTORS.md @@ -211,3 +211,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..ad58b415a499 100644 --- a/Source/Scene/processPbrMaterials.js +++ b/Source/Scene/processPbrMaterials.js @@ -740,9 +740,9 @@ 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 += ' vec3 ellipsoid_radii = vec3(6378137.0, 6378137.0, 6356752.314245);\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, ellipsoid_radii.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/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/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/DepthPlaneFS.glsl b/Source/Shaders/DepthPlaneFS.glsl index 41385729ae4b..9b6f2c62eb96 100644 --- a/Source/Shaders/DepthPlaneFS.glsl +++ b/Source/Shaders/DepthPlaneFS.glsl @@ -2,13 +2,14 @@ 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; + vec3 ellipsoid_radii = vec3(6378137.0, 6378137.0, 6356752.314245); + vec3 ellipsoid_inverseRadii = vec3(1.0 / ellipsoid_radii.x, 1.0 / ellipsoid_radii.y, 1.0 / ellipsoid_radii.z); + + czm_raySegment intersection = czm_rayEllipsoidIntersectionInterval(ray, ellipsoid_center, ellipsoid_inverseRadii); 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..efd65ceb2274 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 = vec3(6378137.0, 6378137.0, 6356752.314245); 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,11 @@ 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; + vec3 ellipsoid_radii = vec3(6378137.0, 6378137.0, 6356752.314245); + vec3 ellipsoid_inverseRadii = vec3(1.0 / ellipsoid_radii.x, 1.0 / ellipsoid_radii.y, 1.0 / ellipsoid_radii.z); + + czm_raySegment intersection = czm_rayEllipsoidIntersectionInterval(ray, ellipsoid_center, ellipsoid_inverseRadii); 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..96fb6ed6da18 100644 --- a/Source/Shaders/GlobeVS.glsl +++ b/Source/Shaders/GlobeVS.glsl @@ -176,7 +176,8 @@ void main() #endif #ifdef APPLY_MATERIAL - float northPoleZ = czm_getWgs84EllipsoidEC().radii.z; + vec3 ellipsoid_radii = vec3(6378137.0, 6378137.0, 6356752.314245); + float northPoleZ = ellipsoid_radii.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));