Skip to content

Commit 0538b3a

Browse files
Merge pull request #2 from verybigzhouhai/3dtile-dark02
3dtile dark02
2 parents ad6c45c + a63512f commit 0538b3a

12 files changed

+40
-59
lines changed

CONTRIBUTORS.md

+1
Original file line numberDiff line numberDiff line change
@@ -211,3 +211,4 @@ See [CONTRIBUTING.md](CONTRIBUTING.md) for details on how to contribute to Cesiu
211211
* [Trubie Turner](https://github.com/flexei)
212212
* [Merijn Wijngaard](https://github.com/mwijngaard)
213213
* [Dennis Adams](https://github.com/dennisadams)
214+
* [Hai Zhou](https://github.com/verybigzhouhai)

Source/Scene/processPbrMaterials.js

+1-2
Original file line numberDiff line numberDiff line change
@@ -740,9 +740,8 @@ define([
740740

741741
fragmentShader += ' vec3 r = normalize(czm_inverseViewRotation * normalize(reflect(v, n)));\n';
742742
// Figure out if the reflection vector hits the ellipsoid
743-
fragmentShader += ' czm_ellipsoid ellipsoid = czm_getWgs84EllipsoidEC();\n';
744743
fragmentShader += ' float vertexRadius = length(positionWC);\n';
745-
fragmentShader += ' float horizonDotNadir = 1.0 - min(1.0, ellipsoid.radii.x / vertexRadius);\n';
744+
fragmentShader += ' float horizonDotNadir = 1.0 - min(1.0, czm_ellipsoid_radii.x / vertexRadius);\n';
746745
fragmentShader += ' float reflectionDotNadir = dot(r, normalize(positionWC));\n';
747746
// Flipping the X vector is a cheap way to get the inverse of czm_temeToPseudoFixed, since that's a rotation about Z.
748747
fragmentShader += ' r.x = -r.x;\n';
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
/**
2+
* 0.1
3+
*
4+
* @name czm_ellipsoid_inverseradii
5+
* @glslConstant
6+
*/
7+
const vec3 czm_ellipsoid_inverseRadii = vec3(1.0 / 6378137.0, 1.0 / 6378137.0, 1.0 / 6356752.314245);
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
/**
2+
* 0.1
3+
*
4+
* @name czm_ellipsoid_radii
5+
* @glslConstant
6+
*/
7+
const vec3 czm_ellipsoid_radii = vec3(6378137.0, 6378137.0, 6356752.314245);

Source/Shaders/Builtin/Functions/ellipsoidContainsPoint.glsl

+2-2
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,8 @@
55
* @glslFunction
66
*
77
*/
8-
bool czm_ellipsoidContainsPoint(czm_ellipsoid ellipsoid, vec3 point)
8+
bool czm_ellipsoidContainsPoint(vec3 ellipsoid_inverseRadii, vec3 point)
99
{
10-
vec3 scaled = ellipsoid.inverseRadii * (czm_inverseModelView * vec4(point, 1.0)).xyz;
10+
vec3 scaled = ellipsoid_inverseRadii * (czm_inverseModelView * vec4(point, 1.0)).xyz;
1111
return (dot(scaled, scaled) <= 1.0);
1212
}

Source/Shaders/Builtin/Functions/getWgs84EllipsoidEC.glsl

-21
This file was deleted.

Source/Shaders/Builtin/Functions/rayEllipsoidIntersectionInterval.glsl

+10-10
Original file line numberDiff line numberDiff line change
@@ -4,17 +4,17 @@
44
* @name czm_rayEllipsoidIntersectionInterval
55
* @glslFunction
66
*/
7-
czm_raySegment czm_rayEllipsoidIntersectionInterval(czm_ray ray, czm_ellipsoid ellipsoid)
7+
czm_raySegment czm_rayEllipsoidIntersectionInterval(czm_ray ray, vec3 ellipsoid_center, vec3 ellipsoid_inverseRadii)
88
{
99
// ray and ellipsoid center in eye coordinates. radii in model coordinates.
10-
vec3 q = ellipsoid.inverseRadii * (czm_inverseModelView * vec4(ray.origin, 1.0)).xyz;
11-
vec3 w = ellipsoid.inverseRadii * (czm_inverseModelView * vec4(ray.direction, 0.0)).xyz;
12-
13-
q = q - ellipsoid.inverseRadii * (czm_inverseModelView * vec4(ellipsoid.center, 1.0)).xyz;
14-
10+
vec3 q = ellipsoid_inverseRadii * (czm_inverseModelView * vec4(ray.origin, 1.0)).xyz;
11+
vec3 w = ellipsoid_inverseRadii * (czm_inverseModelView * vec4(ray.direction, 0.0)).xyz;
12+
13+
q = q - ellipsoid_inverseRadii * (czm_inverseModelView * vec4(ellipsoid_center, 1.0)).xyz;
14+
1515
float q2 = dot(q, q);
1616
float qw = dot(q, w);
17-
17+
1818
if (q2 > 1.0) // Outside ellipsoid.
1919
{
2020
if (qw >= 0.0) // Looking outward or tangent (0 intersections).
@@ -27,11 +27,11 @@ czm_raySegment czm_rayEllipsoidIntersectionInterval(czm_ray ray, czm_ellipsoid e
2727
float difference = q2 - 1.0; // Positively valued.
2828
float w2 = dot(w, w);
2929
float product = w2 * difference;
30-
30+
3131
if (qw2 < product) // Imaginary roots (0 intersections).
3232
{
33-
return czm_emptyRaySegment;
34-
}
33+
return czm_emptyRaySegment;
34+
}
3535
else if (qw2 > product) // Distinct roots (2 intersections).
3636
{
3737
float discriminant = qw * qw - product;

Source/Shaders/Builtin/Structs/ellipsoid.glsl

-12
This file was deleted.

Source/Shaders/DepthPlaneFS.glsl

+3-4
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,12 @@ varying vec4 positionEC;
22

33
void main()
44
{
5-
// TODO: make arbitrary ellipsoid
6-
czm_ellipsoid ellipsoid = czm_getWgs84EllipsoidEC();
7-
85
vec3 direction = normalize(positionEC.xyz);
96
czm_ray ray = czm_ray(vec3(0.0), direction);
107

11-
czm_raySegment intersection = czm_rayEllipsoidIntersectionInterval(ray, ellipsoid);
8+
vec3 ellipsoid_center = czm_view[3].xyz;
9+
10+
czm_raySegment intersection = czm_rayEllipsoidIntersectionInterval(ray, ellipsoid_center, czm_ellipsoid_inverseRadii);
1211
if (!czm_isEmpty(intersection))
1312
{
1413
gl_FragColor = vec4(1.0, 1.0, 0.0, 1.0);

Source/Shaders/EllipsoidFS.glsl

+4-3
Original file line numberDiff line numberDiff line change
@@ -72,10 +72,11 @@ void main()
7272
}
7373

7474
// March ray forward to intersection with larger sphere and find
75-
// actual intersection point with ellipsoid.
76-
czm_ellipsoid ellipsoid = czm_ellipsoidNew(ellipsoidCenter, u_radii);
7775
czm_ray ray = czm_ray(t * direction, direction);
78-
czm_raySegment intersection = czm_rayEllipsoidIntersectionInterval(ray, ellipsoid);
76+
77+
vec3 ellipsoid_inverseRadii = vec3(1.0 / u_radii.x, 1.0 / u_radii.y, 1.0 / u_radii.z);
78+
79+
czm_raySegment intersection = czm_rayEllipsoidIntersectionInterval(ray, ellipsoidCenter, ellipsoid_inverseRadii);
7980

8081
if (czm_isEmpty(intersection))
8182
{

Source/Shaders/GlobeFS.glsl

+4-4
Original file line numberDiff line numberDiff line change
@@ -278,7 +278,7 @@ void main()
278278
float fadeOutDist = u_lightingFadeDistance.x;
279279
float fadeInDist = u_lightingFadeDistance.y;
280280
if (czm_sceneMode != czm_sceneMode3D) {
281-
vec3 radii = czm_getWgs84EllipsoidEC().radii;
281+
vec3 radii = czm_ellipsoid_radii;
282282
float maxRadii = max(radii.x, max(radii.y, radii.z));
283283
fadeOutDist -= maxRadii;
284284
fadeInDist -= maxRadii;
@@ -376,16 +376,16 @@ void main()
376376
}
377377

378378
#if defined(PER_FRAGMENT_GROUND_ATMOSPHERE) && (defined(ENABLE_DAYNIGHT_SHADING) || defined(ENABLE_VERTEX_LIGHTING))
379-
czm_ellipsoid ellipsoid = czm_getWgs84EllipsoidEC();
380-
381379
float mpp = czm_metersPerPixel(vec4(0.0, 0.0, -czm_currentFrustum.x, 1.0));
382380
vec2 xy = gl_FragCoord.xy / czm_viewport.zw * 2.0 - vec2(1.0);
383381
xy *= czm_viewport.zw * mpp * 0.5;
384382

385383
vec3 direction = normalize(vec3(xy, -czm_currentFrustum.x));
386384
czm_ray ray = czm_ray(vec3(0.0), direction);
387385

388-
czm_raySegment intersection = czm_rayEllipsoidIntersectionInterval(ray, ellipsoid);
386+
vec3 ellipsoid_center = czm_view[3].xyz;
387+
388+
czm_raySegment intersection = czm_rayEllipsoidIntersectionInterval(ray, ellipsoid_center, czm_ellipsoid_inverseRadii);
389389

390390
vec3 ellipsoidPosition = czm_pointAlongRay(ray, intersection.start);
391391
ellipsoidPosition = (czm_inverseView * vec4(ellipsoidPosition, 1.0)).xyz;

Source/Shaders/GlobeVS.glsl

+1-1
Original file line numberDiff line numberDiff line change
@@ -176,7 +176,7 @@ void main()
176176
#endif
177177

178178
#ifdef APPLY_MATERIAL
179-
float northPoleZ = czm_getWgs84EllipsoidEC().radii.z;
179+
float northPoleZ = czm_ellipsoid_radii.z;
180180
vec3 northPolePositionMC = vec3(0.0, 0.0, northPoleZ);
181181
vec3 ellipsoidNormal = normalize(v_positionMC); // For a sphere this is correct, but not generally for an ellipsoid.
182182
vec3 vectorEastMC = normalize(cross(northPolePositionMC - v_positionMC, ellipsoidNormal));

0 commit comments

Comments
 (0)