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;
}
|