mirror of
https://github.com/OpenSpace/OpenSpace.git
synced 2026-01-23 12:40:01 -06:00
Merge branch 'feature/globebrowsing' into feature/globe-atmosphere
This commit is contained in:
@@ -30,6 +30,12 @@ struct PositionNormalPair {
|
||||
vec3 normal;
|
||||
};
|
||||
|
||||
struct Intersection {
|
||||
bool intersects;
|
||||
float nearParameter;// Along ray
|
||||
float farParameter; // Along ray
|
||||
};
|
||||
|
||||
vec3 geodeticSurfaceNormal(float latitude, float longitude)
|
||||
{
|
||||
float cosLat = cos(latitude);
|
||||
@@ -68,4 +74,33 @@ vec3 latLonToCartesian(float latitude, float longitude, float radius) {
|
||||
sin(latitude));
|
||||
}
|
||||
|
||||
//
|
||||
// Assumes ellipsoid is at (0, 0, 0)
|
||||
//
|
||||
Intersection rayIntersectEllipsoid(
|
||||
vec3 rayOrigin,
|
||||
vec3 rayOriginSquared,
|
||||
vec3 rayDirection,
|
||||
vec3 oneOverEllipsoidRadiiSquared)
|
||||
{
|
||||
float a = dot(rayDirection * rayDirection, oneOverEllipsoidRadiiSquared);
|
||||
float b = 2.0 * dot(rayOrigin * rayDirection, oneOverEllipsoidRadiiSquared);
|
||||
float c = dot(rayOriginSquared, oneOverEllipsoidRadiiSquared) - 1.0;
|
||||
float discriminant = b * b - 4.0 * a * c;
|
||||
|
||||
if (discriminant < 0.0) {
|
||||
return Intersection(false, 0.0, 0.0);
|
||||
}
|
||||
else if (discriminant == 0.0) {
|
||||
float time = -0.5 * b / a;
|
||||
return Intersection(true, time, time);
|
||||
}
|
||||
|
||||
float t = -0.5 * (b + (b > 0.0 ? 1.0 : -1.0) * sqrt(discriminant));
|
||||
float root1 = t / a;
|
||||
float root2 = c / t;
|
||||
|
||||
return Intersection(true, min(root1, root2), max(root1, root2));
|
||||
}
|
||||
|
||||
#endif // ELLIPSOID_HGLSL
|
||||
Reference in New Issue
Block a user