1 #ifndef INCLUDE_AL_RAY_HPP
2 #define INCLUDE_AL_RAY_HPP
45 #include "al/math/al_Vec.hpp"
51 typedef Ray<float> Rayf;
52 typedef Ray<double> Rayd;
71 Vec<3, T> operator()(T t) {
return o + d * t; }
78 if (den == 0)
return -1;
79 return n.
dot(p0 - o) / den;
84 if (den == 0)
return -1;
85 T t = n.
dot(p0 - o) / den;
86 T r = ((*this)(t)-p0).mag();
87 if (r <= rmax && r >= rmin)
94 T intersectSphere(
Vec<3, T> cen, T radius) {
97 T B = 2. * (d.
dot(o_c));
98 T C = (o_c.
dot(o_c)) - radius * radius;
99 T det = B * B - 4 * A * C;
102 T t1 = (-B - sqrt(det)) / (2. * A);
103 if (t1 > 0.)
return t1;
104 T t2 = (-B + sqrt(det)) / (2. * A);
105 if (t2 > 0.)
return t2;
107 }
else if (det == 0.) {
109 if (t > 0.)
return t;
114 bool intersectsSphere(
Vec<3, T> cen, T radius) {
115 return intersectSphere(cen, radius) > 0.;
120 float tmin, tmax, tymin, tymax, tzmin, tzmax;
130 sign[0] = (inv_direction.x < 0);
131 sign[1] = (inv_direction.y < 0);
132 sign[2] = (inv_direction.z < 0);
134 tmin = (parameters[sign[0]].x - o.x) * inv_direction.x;
135 tmax = (parameters[1 - sign[0]].x - o.x) * inv_direction.x;
136 tymin = (parameters[sign[1]].y - o.y) * inv_direction.y;
137 tymax = (parameters[1 - sign[1]].y - o.y) * inv_direction.y;
138 if ((tmin > tymax) || (tymin > tmax))
return -1.0;
139 if (tymin > tmin) tmin = tymin;
140 if (tymax < tmax) tmax = tymax;
141 tzmin = (parameters[sign[2]].z - o.z) * inv_direction.z;
142 tzmax = (parameters[1 - sign[2]].z - o.z) * inv_direction.z;
143 if ((tmin > tzmax) || (tzmin > tmax))
return -1.0;
144 if (tzmin > tmin) tmin = tzmin;
145 if (tzmax < tmax) tmax = tzmax;
157 return intersectBox(cen, scl) > 0.0;
161 T intersectCylinderXY(T radius) {
162 T A = d.x * d.x + d.y * d.y;
163 T B = 2. * (d.x * o.x + d.y * o.y);
164 T C = (o.x * o.x + o.y * o.y) - radius * radius;
165 T det = B * B - 4 * A * C;
168 T t1 = (-B - sqrt(det)) / (2. * A);
169 if (t1 > 0.)
return t1;
170 T t2 = (-B + sqrt(det)) / (2. * A);
171 if (t2 > 0.)
return t2;
173 }
else if (det == 0.) {
175 if (t > 0.)
return t;
182 T intersectCylinderXZ(T radius) {
183 T A = d.x * d.x + d.z * d.z;
184 T B = 2. * (d.x * o.x + d.z * o.z);
185 T C = (o.x * o.x + o.z * o.z) - radius * radius;
186 T det = B * B - 4 * A * C;
189 T t1 = (-B - sqrt(det)) / (2. * A);
190 if (t1 > 0.)
return t1;
191 T t2 = (-B + sqrt(det)) / (2. * A);
192 if (t2 > 0.)
return t2;
194 }
else if (det == 0.) {
196 if (t > 0.)
return t;
205 T intersectAllosphere() {
207 T bridgeWidth2 = 2.09f / 2.;
210 T t = intersectCylinderXY(radius);
215 return intersectSphere(
Vec<3, T>(0, 0, -bridgeWidth2), radius);
217 return intersectSphere(
Vec<3, T>(0, 0, bridgeWidth2), radius);
221 if (p.z < -bridgeWidth2) {
222 return intersectSphere(
Vec<3, T>(0, 0, -bridgeWidth2), radius);
223 }
else if (p.z > bridgeWidth2) {
224 return intersectSphere(
Vec<3, T>(0, 0, bridgeWidth2), radius);
Vec & set(const Vec< N, T2 > &v)
Set elements from another vector.
Vec normalized(T scale=T(1)) const
Return closest vector lying on unit sphere.
T dot(const Vec< N, U > &v) const
Returns dot (inner) product between vectors.
T min(const T &v1, const T &v2, const T &v3)
T max(const T &v1, const T &v2, const T &v3)