diff --git a/CONTRIBUTORS.md b/CONTRIBUTORS.md index 8e1df7e7dc27..548883638470 100644 --- a/CONTRIBUTORS.md +++ b/CONTRIBUTORS.md @@ -209,3 +209,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..5d322756f140 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 += ' 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_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/ellipsoidNew.glsl b/Source/Shaders/Builtin/Functions/ellipsoidNew.glsl index b1bd61fce129..57f3f576bf99 100644 --- a/Source/Shaders/Builtin/Functions/ellipsoidNew.glsl +++ b/Source/Shaders/Builtin/Functions/ellipsoidNew.glsl @@ -9,6 +9,8 @@ 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; + czm_ellipsoid_center = center; + czm_ellipsoid_radii = radii; + czm_ellipsoid_inverseRadii = inverseRadii; + czm_ellipsoid_inverseRadiiSquared = inverseRadiiSquared; } diff --git a/Source/Shaders/Builtin/Functions/getWgs84EllipsoidEC.glsl b/Source/Shaders/Builtin/Functions/getWgs84EllipsoidEC.glsl index 204e9f31a63b..dd6671154e48 100644 --- a/Source/Shaders/Builtin/Functions/getWgs84EllipsoidEC.glsl +++ b/Source/Shaders/Builtin/Functions/getWgs84EllipsoidEC.glsl @@ -4,18 +4,19 @@ * @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_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; + czm_ellipsoid_center = czm_view[3].xyz; + czm_ellipsoid_radii = radii; + czm_ellipsoid_inverseRadii = inverseRadii; + czm_ellipsoid_inverseRadiiSquared = inverseRadiiSquared; } diff --git a/Source/Shaders/Builtin/Functions/rayEllipsoidIntersectionInterval.glsl b/Source/Shaders/Builtin/Functions/rayEllipsoidIntersectionInterval.glsl index b1bea1a33495..df8a9e654bab 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 center, vec3 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 = inverseRadii * (czm_inverseModelView * vec4(ray.origin, 1.0)).xyz; + vec3 w = inverseRadii * (czm_inverseModelView * vec4(ray.direction, 0.0)).xyz; + + q = q - inverseRadii * (czm_inverseModelView * vec4(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 index c4bf84a440c0..62e3854426db 100644 --- a/Source/Shaders/Builtin/Structs/ellipsoid.glsl +++ b/Source/Shaders/Builtin/Structs/ellipsoid.glsl @@ -1,12 +1,8 @@ -/** DOC_TBA - * - * @name czm_ellipsoid - * @glslStruct - */ -struct czm_ellipsoid -{ - vec3 center; - vec3 radii; - vec3 inverseRadii; - vec3 inverseRadiiSquared; -}; +/** +* +struct ellipsoid +*/ +vec3 czm_ellipsoid_center; +vec3 czm_ellipsoid_radii; +vec3 czm_ellipsoid_inverseRadii; +vec3 czm_ellipsoid_inverseRadiiSquared; diff --git a/Source/Shaders/DepthPlaneFS.glsl b/Source/Shaders/DepthPlaneFS.glsl index 41385729ae4b..aa4036e0a5e8 100644 --- a/Source/Shaders/DepthPlaneFS.glsl +++ b/Source/Shaders/DepthPlaneFS.glsl @@ -3,12 +3,12 @@ varying vec4 positionEC; void main() { // TODO: make arbitrary ellipsoid - czm_ellipsoid ellipsoid = czm_getWgs84EllipsoidEC(); + czm_getWgs84EllipsoidEC(); vec3 direction = normalize(positionEC.xyz); czm_ray ray = czm_ray(vec3(0.0), direction); - czm_raySegment intersection = czm_rayEllipsoidIntersectionInterval(ray, ellipsoid); + czm_raySegment intersection = czm_rayEllipsoidIntersectionInterval(ray, czm_ellipsoid_center, czm_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..f742acca4038 100644 --- a/Source/Shaders/EllipsoidFS.glsl +++ b/Source/Shaders/EllipsoidFS.glsl @@ -73,9 +73,9 @@ 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_ellipsoidNew(ellipsoidCenter, u_radii); czm_ray ray = czm_ray(t * direction, direction); - czm_raySegment intersection = czm_rayEllipsoidIntersectionInterval(ray, ellipsoid); + czm_raySegment intersection = czm_rayEllipsoidIntersectionInterval(ray, czm_ellipsoid_center, czm_ellipsoid_inverseRadii); if (czm_isEmpty(intersection)) { diff --git a/Source/Shaders/GlobeFS.glsl b/Source/Shaders/GlobeFS.glsl index ed6085494247..1953abced014 100644 --- a/Source/Shaders/GlobeFS.glsl +++ b/Source/Shaders/GlobeFS.glsl @@ -278,7 +278,8 @@ void main() float fadeOutDist = u_lightingFadeDistance.x; float fadeInDist = u_lightingFadeDistance.y; if (czm_sceneMode != czm_sceneMode3D) { - vec3 radii = czm_getWgs84EllipsoidEC().radii; + czm_getWgs84EllipsoidEC(); + vec3 radii = czm_ellipsoid_radii; float maxRadii = max(radii.x, max(radii.y, radii.z)); fadeOutDist -= maxRadii; fadeInDist -= maxRadii; @@ -376,7 +377,7 @@ void main() } #if defined(PER_FRAGMENT_GROUND_ATMOSPHERE) && (defined(ENABLE_DAYNIGHT_SHADING) || defined(ENABLE_VERTEX_LIGHTING)) - czm_ellipsoid ellipsoid = czm_getWgs84EllipsoidEC(); + 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); @@ -385,7 +386,7 @@ 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); + czm_raySegment intersection = czm_rayEllipsoidIntersectionInterval(ray, czm_ellipsoid_center, czm_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..fc69a93eea2f 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; + czm_getWgs84EllipsoidEC(); + float northPoleZ = czm_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));