diff options
author | David Doan <daviddoan@Davids-MacBook-Pro-70.local> | 2023-12-08 13:25:50 -0500 |
---|---|---|
committer | David Doan <daviddoan@Davids-MacBook-Pro-70.local> | 2023-12-08 13:25:50 -0500 |
commit | 31d28f945856ff4b3f5d55e61a747afd08d6f0f9 (patch) | |
tree | 82916f5a11c14da7d91f8f8b0de1f977e6a3af08 /src/4dshapes/4dsphere.cpp | |
parent | 7445995cbedb5d77d5abea54df7c976ca6664d76 (diff) |
rotation
Diffstat (limited to 'src/4dshapes/4dsphere.cpp')
-rw-r--r-- | src/4dshapes/4dsphere.cpp | 37 |
1 files changed, 37 insertions, 0 deletions
diff --git a/src/4dshapes/4dsphere.cpp b/src/4dshapes/4dsphere.cpp new file mode 100644 index 0000000..4ebe2ba --- /dev/null +++ b/src/4dshapes/4dsphere.cpp @@ -0,0 +1,37 @@ +#include "raytracer/raytracer.h" + +// vector operations on 4d vectors, +// reference: https://hollasch.github.io/ray4/Four-Space_Visualization_of_4D_Objects.html#chapter5 + +bool HitSphere(RenderShapeData object, glm::vec4 rayOrigin, glm::vec4 rayDirection, glm::vec4 inter) { + float bb; + glm::vec4 cdir; + float rad; + float t1, t2; + + cdir = object.ctm * glm::vec4(0.f,0.f,0.f,1.f) - rayOrigin; + bb = glm::dot(cdir, rayDirection); + rad = (bb * bb) - glm::dot(cdir, cdir) + 0.25f; + + if (rad < 0.0) { + return false; + } + + rad = sqrt(rad); + t2 = bb - rad; + t1 = bb + rad; + + if ((t1 < 0.0) || ((t2 > 0.0) && (t2 < t1))) { + t1 = t2; + } + + if (t1 <= 0.0) { + return false; + } + + if (inter != glm::vec4(0.f,0.f,0.f, 1.f)) { + inter = rayOrigin + t1 * rayDirection; + } + + return true; +}
\ No newline at end of file |