aboutsummaryrefslogtreecommitdiff
path: root/src/4dshapes/4dsphere.cpp
blob: 4ebe2ba7d3e6c52d70581310bc62922545986d5e (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
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;
}