diff options
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 |