37 #ifndef INCLUDED_IMATHBOXALGO_H 38 #define INCLUDED_IMATHBOXALGO_H 91 for (
int i = 0; i < int (box.
min.dimensions()); i++)
93 if (p[i] < box.
min[i])
95 else if (p[i] > box.
max[i])
109 return clip (p, box);
135 (d1.
y < d2.
y)? d1.
y: d2.
y,
136 (d1.
z < d2.
z)? d1.
z: d2.
z);
138 if (d.
x < d.
y && d.
x < d.
z)
140 q.
x = (d1.
x < d2.
x)? box.min.x: box.max.x;
144 q.
y = (d1.
y < d2.
y)? box.min.y: box.max.y;
148 q.
z = (d1.
z < d2.
z)? box.min.z: box.max.z;
156 template <
class S,
class T>
181 if (m[0][3] == 0 && m[1][3] == 0 && m[2][3] == 0 && m[3][3] == 1)
185 for (
int i = 0; i < 3; i++)
187 newBox.
min[i] = newBox.
max[i] = (S) m[3][i];
189 for (
int j = 0; j < 3; j++)
193 a = (S) m[j][i] * box.min[j];
194 b = (S) m[j][i] * box.max[j];
220 points[0][0] = points[1][0] = points[2][0] = points[3][0] = box.min[0];
221 points[4][0] = points[5][0] = points[6][0] = points[7][0] = box.max[0];
223 points[0][1] = points[1][1] = points[4][1] = points[5][1] = box.min[1];
224 points[2][1] = points[3][1] = points[6][1] = points[7][1] = box.max[1];
226 points[0][2] = points[2][2] = points[4][2] = points[6][2] = box.min[2];
227 points[1][2] = points[3][2] = points[5][2] = points[7][2] = box.max[2];
231 for (
int i = 0; i < 8; i++)
238 template <
class S,
class T>
262 for (
int i = 0; i < 3; i++)
264 newBox.
min[i] = newBox.
max[i] = (S) m[3][i];
266 for (
int j = 0; j < 3; j++)
270 a = (S) m[j][i] * box.min[j];
271 b = (S) m[j][i] * box.max[j];
357 T d1 = b.max.x - r.
pos.x;
358 T d2 = b.min.x - r.
pos.x;
361 (
abs (d1) < TMAX * r.
dir.x &&
362 abs (d2) < TMAX * r.
dir.x))
372 exit.
y =
clamp (r.
pos.y + t1 * r.
dir.y, b.min.y, b.max.y);
373 exit.
z =
clamp (r.
pos.z + t1 * r.
dir.z, b.min.z, b.max.z);
381 entry.
y =
clamp (r.
pos.y + t2 * r.
dir.y, b.min.y, b.max.y);
382 entry.
z =
clamp (r.
pos.z + t2 * r.
dir.z, b.min.z, b.max.z);
385 else if (r.
pos.x < b.min.x || r.
pos.x > b.max.x)
392 T d1 = b.min.x - r.
pos.x;
393 T d2 = b.max.x - r.
pos.x;
396 (
abs (d1) < -TMAX * r.
dir.x &&
397 abs (d2) < -TMAX * r.
dir.x))
407 exit.
y =
clamp (r.
pos.y + t1 * r.
dir.y, b.min.y, b.max.y);
408 exit.
z =
clamp (r.
pos.z + t1 * r.
dir.z, b.min.z, b.max.z);
416 entry.
y =
clamp (r.
pos.y + t2 * r.
dir.y, b.min.y, b.max.y);
417 entry.
z =
clamp (r.
pos.z + t2 * r.
dir.z, b.min.z, b.max.z);
420 else if (r.
pos.x < b.min.x || r.
pos.x > b.max.x)
432 T d1 = b.max.y - r.
pos.y;
433 T d2 = b.min.y - r.
pos.y;
436 (
abs (d1) < TMAX * r.
dir.y &&
437 abs (d2) < TMAX * r.
dir.y))
446 exit.
x =
clamp (r.
pos.x + t1 * r.
dir.x, b.min.x, b.max.x);
448 exit.
z =
clamp (r.
pos.z + t1 * r.
dir.z, b.min.z, b.max.z);
455 entry.
x =
clamp (r.
pos.x + t2 * r.
dir.x, b.min.x, b.max.x);
457 entry.
z =
clamp (r.
pos.z + t2 * r.
dir.z, b.min.z, b.max.z);
460 else if (r.
pos.y < b.min.y || r.
pos.y > b.max.y)
467 T d1 = b.min.y - r.
pos.y;
468 T d2 = b.max.y - r.
pos.y;
471 (
abs (d1) < -TMAX * r.
dir.y &&
472 abs (d2) < -TMAX * r.
dir.y))
481 exit.
x =
clamp (r.
pos.x + t1 * r.
dir.x, b.min.x, b.max.x);
483 exit.
z =
clamp (r.
pos.z + t1 * r.
dir.z, b.min.z, b.max.z);
490 entry.
x =
clamp (r.
pos.x + t2 * r.
dir.x, b.min.x, b.max.x);
492 entry.
z =
clamp (r.
pos.z + t2 * r.
dir.z, b.min.z, b.max.z);
495 else if (r.
pos.y < b.min.y || r.
pos.y > b.max.y)
507 T d1 = b.max.z - r.
pos.z;
508 T d2 = b.min.z - r.
pos.z;
511 (
abs (d1) < TMAX * r.
dir.z &&
512 abs (d2) < TMAX * r.
dir.z))
521 exit.
x =
clamp (r.
pos.x + t1 * r.
dir.x, b.min.x, b.max.x);
522 exit.
y =
clamp (r.
pos.y + t1 * r.
dir.y, b.min.y, b.max.y);
530 entry.
x =
clamp (r.
pos.x + t2 * r.
dir.x, b.min.x, b.max.x);
531 entry.
y =
clamp (r.
pos.y + t2 * r.
dir.y, b.min.y, b.max.y);
535 else if (r.
pos.z < b.min.z || r.
pos.z > b.max.z)
542 T d1 = b.min.z - r.
pos.z;
543 T d2 = b.max.z - r.
pos.z;
546 (
abs (d1) < -TMAX * r.
dir.z &&
547 abs (d2) < -TMAX * r.
dir.z))
556 exit.
x =
clamp (r.
pos.x + t1 * r.
dir.x, b.min.x, b.max.x);
557 exit.
y =
clamp (r.
pos.y + t1 * r.
dir.y, b.min.y, b.max.y);
565 entry.
x =
clamp (r.
pos.x + t2 * r.
dir.x, b.min.x, b.max.x);
566 entry.
y =
clamp (r.
pos.y + t2 * r.
dir.y, b.min.y, b.max.y);
570 else if (r.
pos.z < b.min.z || r.
pos.z > b.max.z)
576 return tFrontMax <= tBackMin;
617 if (b.intersects (r.
pos))
651 if (r.
pos.x > b.max.x)
654 T d = b.max.x - r.
pos.x;
656 if (r.
dir.x > 1 || d < TMAX * r.
dir.x)
664 if (r.
pos.x <= b.min.x)
666 T d = b.min.x - r.
pos.x;
667 T t = (r.
dir.x > 1 || d < TMAX * r.
dir.x)? d / r.
dir.x: TMAX;
679 else if (r.
dir.x < 0)
681 if (r.
pos.x < b.min.x)
684 T d = b.min.x - r.
pos.x;
686 if (r.
dir.x < -1 || d > TMAX * r.
dir.x)
694 if (r.
pos.x >= b.max.x)
696 T d = b.max.x - r.
pos.x;
697 T t = (r.
dir.x < -1 || d > TMAX * r.
dir.x)? d / r.
dir.x: TMAX;
711 if (r.
pos.x < b.min.x || r.
pos.x > b.max.x)
721 if (r.
pos.y > b.max.y)
724 T d = b.max.y - r.
pos.y;
726 if (r.
dir.y > 1 || d < TMAX * r.
dir.y)
734 if (r.
pos.y <= b.min.y)
736 T d = b.min.y - r.
pos.y;
737 T t = (r.
dir.y > 1 || d < TMAX * r.
dir.y)? d / r.
dir.y: TMAX;
749 else if (r.
dir.y < 0)
751 if (r.
pos.y < b.min.y)
754 T d = b.min.y - r.
pos.y;
756 if (r.
dir.y < -1 || d > TMAX * r.
dir.y)
764 if (r.
pos.y >= b.max.y)
766 T d = b.max.y - r.
pos.y;
767 T t = (r.
dir.y < -1 || d > TMAX * r.
dir.y)? d / r.
dir.y: TMAX;
781 if (r.
pos.y < b.min.y || r.
pos.y > b.max.y)
791 if (r.
pos.z > b.max.z)
794 T d = b.max.z - r.
pos.z;
796 if (r.
dir.z > 1 || d < TMAX * r.
dir.z)
804 if (r.
pos.z <= b.min.z)
806 T d = b.min.z - r.
pos.z;
807 T t = (r.
dir.z > 1 || d < TMAX * r.
dir.z)? d / r.
dir.z: TMAX;
819 else if (r.
dir.z < 0)
821 if (r.
pos.z < b.min.z)
824 T d = b.min.z - r.
pos.z;
826 if (r.
dir.z < -1 || d > TMAX * r.
dir.z)
834 if (r.
pos.z >= b.max.z)
836 T d = b.max.z - r.
pos.z;
837 T t = (r.
dir.z < -1 || d > TMAX * r.
dir.z)? d / r.
dir.z: TMAX;
851 if (r.
pos.z < b.min.z || r.
pos.z > b.max.z)
855 return tFrontMax <= tBackMin;
bool findEntryAndExitPoints(const Line3< T > &r, const Box< Vec3< T > > &b, Vec3< T > &entry, Vec3< T > &exit)
Definition: ImathBoxAlgo.h:292
Definition: ImathBox.h:71
Vec3< T > closestPointOnBox(const Vec3< T > &p, const Box< Vec3< T > > &box)
Definition: ImathBoxAlgo.h:115
Definition: ImathFrame.h:42
Definition: ImathFrame.h:43
T max
Definition: ImathBox.h:80
T abs(T a)
Definition: ImathFun.h:53
T x
Definition: ImathVec.h:274
T y
Definition: ImathVec.h:274
bool intersects(const Box< Vec3< T > > &b, const Line3< T > &r, Vec3< T > &ip)
Definition: ImathBoxAlgo.h:582
Vec3< T > dir
Definition: ImathLine.h:59
Vec3< T > pos
Definition: ImathLine.h:58
void extendBy(const T &point)
Definition: ImathBox.h:192
Box< Vec3< S > > transform(const Box< Vec3< S > > &box, const Matrix44< T > &m)
Definition: ImathBoxAlgo.h:158
T z
Definition: ImathVec.h:274
Definition: ImathLine.h:54
T clamp(T a, T l, T h)
Definition: ImathFun.h:109
T min
Definition: ImathBox.h:79
Definition: ImathBox.h:67
T closestPointInBox(const T &p, const Box< T > &box)
Definition: ImathBoxAlgo.h:107
T clip(const T &p, const Box< T > &box)
Definition: ImathBoxAlgo.h:82
Box< Vec3< S > > affineTransform(const Box< Vec3< S > > &box, const Matrix44< T > &m)
Definition: ImathBoxAlgo.h:240