10 #ifndef INCLUDED_IMATHBOXALGO_H
11 #define INCLUDED_IMATHBOXALGO_H
20 IMATH_INTERNAL_NAMESPACE_HEADER_ENTER
33 for (
int i = 0; i <
int (box.min.dimensions ()); i++)
35 if (p[i] < box.min[i])
37 else if (p[i] > box.max[i])
69 if (box.isEmpty ())
return p;
79 (d1.
x < d2.
x) ? d1.
x : d2.
x,
80 (d1.
y < d2.
y) ? d1.
y : d2.
y,
81 (d1.
z < d2.
z) ? d1.
z : d2.
z);
83 if (d.
x < d.
y && d.
x < d.
z)
85 q.
x = (d1.
x < d2.
x) ? box.min.x : box.max.x;
89 q.
y = (d1.
y < d2.
y) ? box.min.y : box.max.y;
93 q.
z = (d1.
z < d2.
z) ? box.min.z : box.max.z;
112 template <
class S,
class T>
116 if (box.isEmpty () || box.isInfinite ())
return box;
123 if (m[0][3] == 0 && m[1][3] == 0 && m[2][3] == 0 && m[3][3] == 1)
127 for (
int i = 0; i < 3; i++)
129 newBox.
min[i] = newBox.
max[i] = (
S) m[3][i];
131 for (
int j = 0;
j < 3;
j++)
135 a = (
S) m[
j][i] * box.min[
j];
136 b = (
S) m[
j][i] * box.max[
j];
162 points[0][0] = points[1][0] = points[2][0] = points[3][0] = box.min[0];
163 points[4][0] = points[5][0] = points[6][0] = points[7][0] = box.max[0];
165 points[0][1] = points[1][1] = points[4][1] = points[5][1] = box.min[1];
166 points[2][1] = points[3][1] = points[6][1] = points[7][1] = box.max[1];
168 points[0][2] = points[2][2] = points[4][2] = points[6][2] = box.min[2];
169 points[1][2] = points[3][2] = points[5][2] = points[7][2] = box.max[2];
173 for (
int i = 0; i < 8; i++)
192 template <
class S,
class T>
197 if (box.isEmpty () || box.isInfinite ()) {
return; }
204 if (m[0][3] == 0 && m[1][3] == 0 && m[2][3] == 0 && m[3][3] == 1)
206 for (
int i = 0; i < 3; i++)
210 for (
int j = 0;
j < 3;
j++)
214 a = (
S) m[
j][i] * box.min[
j];
215 b = (
S) m[
j][i] * box.max[
j];
241 points[0][0] = points[1][0] = points[2][0] = points[3][0] = box.min[0];
242 points[4][0] = points[5][0] = points[6][0] = points[7][0] = box.max[0];
244 points[0][1] = points[1][1] = points[4][1] = points[5][1] = box.min[1];
245 points[2][1] = points[3][1] = points[6][1] = points[7][1] = box.max[1];
247 points[0][2] = points[2][2] = points[4][2] = points[6][2] = box.min[2];
248 points[1][2] = points[3][2] = points[5][2] = points[7][2] = box.max[2];
250 for (
int i = 0; i < 8; i++)
251 result.extendBy (points[i] * m);
265 template <
class S,
class T>
269 if (box.isEmpty () || box.isInfinite ())
return box;
273 for (
int i = 0; i < 3; i++)
275 newBox.
min[i] = newBox.
max[i] = (
S) m[3][i];
277 for (
int j = 0;
j < 3;
j++)
281 a = (
S) m[
j][i] * box.min[
j];
282 b = (
S) m[
j][i] * box.max[
j];
312 template <
class S,
class T>
325 if (box.isInfinite ())
331 for (
int i = 0; i < 3; i++)
335 for (
int j = 0;
j < 3;
j++)
339 a = (
S) m[
j][i] * box.min[
j];
340 b = (
S) m[
j][i] * box.max[
j];
413 T d1 =
b.max.x -
r.pos.x;
414 T d2 =
b.min.x -
r.pos.x;
417 (
abs (d1) < TMAX *
r.dir.x &&
abs (d2) < TMAX *
r.dir.x))
427 exit.y =
clamp (
r.pos.y + t1 *
r.dir.y,
b.min.y,
b.max.y);
428 exit.z =
clamp (
r.pos.z + t1 *
r.dir.z,
b.min.z,
b.max.z);
436 entry.y =
clamp (
r.pos.y + t2 *
r.dir.y,
b.min.y,
b.max.y);
437 entry.z =
clamp (
r.pos.z + t2 *
r.dir.z,
b.min.z,
b.max.z);
440 else if (
r.pos.x <
b.min.x ||
r.pos.x >
b.max.x)
447 T d1 =
b.min.x -
r.pos.x;
448 T d2 =
b.max.x -
r.pos.x;
451 (
abs (d1) < -TMAX *
r.dir.x &&
abs (d2) < -TMAX *
r.dir.x))
461 exit.y =
clamp (
r.pos.y + t1 *
r.dir.y,
b.min.y,
b.max.y);
462 exit.z =
clamp (
r.pos.z + t1 *
r.dir.z,
b.min.z,
b.max.z);
470 entry.y =
clamp (
r.pos.y + t2 *
r.dir.y,
b.min.y,
b.max.y);
471 entry.z =
clamp (
r.pos.z + t2 *
r.dir.z,
b.min.z,
b.max.z);
474 else if (
r.pos.x <
b.min.x ||
r.pos.x >
b.max.x)
486 T d1 =
b.max.y -
r.pos.y;
487 T d2 =
b.min.y -
r.pos.y;
490 (
abs (d1) < TMAX *
r.dir.y &&
abs (d2) < TMAX *
r.dir.y))
499 exit.x =
clamp (
r.pos.x + t1 *
r.dir.x,
b.min.x,
b.max.x);
501 exit.z =
clamp (
r.pos.z + t1 *
r.dir.z,
b.min.z,
b.max.z);
508 entry.x =
clamp (
r.pos.x + t2 *
r.dir.x,
b.min.x,
b.max.x);
510 entry.z =
clamp (
r.pos.z + t2 *
r.dir.z,
b.min.z,
b.max.z);
513 else if (
r.pos.y <
b.min.y ||
r.pos.y >
b.max.y)
520 T d1 =
b.min.y -
r.pos.y;
521 T d2 =
b.max.y -
r.pos.y;
524 (
abs (d1) < -TMAX *
r.dir.y &&
abs (d2) < -TMAX *
r.dir.y))
533 exit.x =
clamp (
r.pos.x + t1 *
r.dir.x,
b.min.x,
b.max.x);
535 exit.z =
clamp (
r.pos.z + t1 *
r.dir.z,
b.min.z,
b.max.z);
542 entry.x =
clamp (
r.pos.x + t2 *
r.dir.x,
b.min.x,
b.max.x);
544 entry.z =
clamp (
r.pos.z + t2 *
r.dir.z,
b.min.z,
b.max.z);
547 else if (
r.pos.y <
b.min.y ||
r.pos.y >
b.max.y)
559 T d1 =
b.max.z -
r.pos.z;
560 T d2 =
b.min.z -
r.pos.z;
563 (
abs (d1) < TMAX *
r.dir.z &&
abs (d2) < TMAX *
r.dir.z))
572 exit.x =
clamp (
r.pos.x + t1 *
r.dir.x,
b.min.x,
b.max.x);
573 exit.y =
clamp (
r.pos.y + t1 *
r.dir.y,
b.min.y,
b.max.y);
581 entry.x =
clamp (
r.pos.x + t2 *
r.dir.x,
b.min.x,
b.max.x);
582 entry.y =
clamp (
r.pos.y + t2 *
r.dir.y,
b.min.y,
b.max.y);
586 else if (
r.pos.z <
b.min.z ||
r.pos.z >
b.max.z)
593 T d1 =
b.min.z -
r.pos.z;
594 T d2 =
b.max.z -
r.pos.z;
597 (
abs (d1) < -TMAX *
r.dir.z &&
abs (d2) < -TMAX *
r.dir.z))
606 exit.x =
clamp (
r.pos.x + t1 *
r.dir.x,
b.min.x,
b.max.x);
607 exit.y =
clamp (
r.pos.y + t1 *
r.dir.y,
b.min.y,
b.max.y);
615 entry.x =
clamp (
r.pos.x + t2 *
r.dir.x,
b.min.x,
b.max.x);
616 entry.y =
clamp (
r.pos.y + t2 *
r.dir.y,
b.min.y,
b.max.y);
620 else if (
r.pos.z <
b.min.z ||
r.pos.z >
b.max.z)
626 return tFrontMax <= tBackMin;
661 if (
b.intersects (
r.pos))
695 if (
r.pos.x >
b.max.x)
return false;
697 T d =
b.max.x -
r.pos.x;
699 if (
r.dir.x > 1 || d < TMAX *
r.dir.x)
703 if (tBackMin > t) tBackMin =
t;
706 if (
r.pos.x <=
b.min.x)
708 T d =
b.min.x -
r.pos.x;
709 T t = (
r.dir.x > 1 || d < TMAX *
r.dir.x) ? d /
r.dir.x : TMAX;
716 ip.y =
clamp (
r.pos.y + t *
r.dir.y,
b.min.y,
b.max.y);
717 ip.z =
clamp (
r.pos.z + t *
r.dir.z,
b.min.z,
b.max.z);
721 else if (
r.dir.x < 0)
723 if (
r.pos.x <
b.min.x)
return false;
725 T d =
b.min.x -
r.pos.x;
727 if (
r.dir.x < -1 || d > TMAX *
r.dir.x)
731 if (tBackMin > t) tBackMin =
t;
734 if (
r.pos.x >=
b.max.x)
736 T d =
b.max.x -
r.pos.x;
737 T t = (
r.dir.x < -1 || d > TMAX *
r.dir.x) ? d /
r.dir.x : TMAX;
744 ip.y =
clamp (
r.pos.y + t *
r.dir.y,
b.min.y,
b.max.y);
745 ip.z =
clamp (
r.pos.z + t *
r.dir.z,
b.min.z,
b.max.z);
751 if (
r.pos.x <
b.min.x ||
r.pos.x >
b.max.x)
return false;
760 if (
r.pos.y >
b.max.y)
return false;
762 T d =
b.max.y -
r.pos.y;
764 if (
r.dir.y > 1 || d < TMAX *
r.dir.y)
768 if (tBackMin > t) tBackMin =
t;
771 if (
r.pos.y <=
b.min.y)
773 T d =
b.min.y -
r.pos.y;
774 T t = (
r.dir.y > 1 || d < TMAX *
r.dir.y) ? d /
r.dir.y : TMAX;
780 ip.x =
clamp (
r.pos.x + t *
r.dir.x,
b.min.x,
b.max.x);
782 ip.z =
clamp (
r.pos.z + t *
r.dir.z,
b.min.z,
b.max.z);
786 else if (
r.dir.y < 0)
788 if (
r.pos.y <
b.min.y)
return false;
790 T d =
b.min.y -
r.pos.y;
792 if (
r.dir.y < -1 || d > TMAX *
r.dir.y)
796 if (tBackMin > t) tBackMin =
t;
799 if (
r.pos.y >=
b.max.y)
801 T d =
b.max.y -
r.pos.y;
802 T t = (
r.dir.y < -1 || d > TMAX *
r.dir.y) ? d /
r.dir.y : TMAX;
808 ip.x =
clamp (
r.pos.x + t *
r.dir.x,
b.min.x,
b.max.x);
810 ip.z =
clamp (
r.pos.z + t *
r.dir.z,
b.min.z,
b.max.z);
816 if (
r.pos.y <
b.min.y ||
r.pos.y >
b.max.y)
return false;
825 if (
r.pos.z >
b.max.z)
return false;
827 T d =
b.max.z -
r.pos.z;
829 if (
r.dir.z > 1 || d < TMAX *
r.dir.z)
833 if (tBackMin > t) tBackMin =
t;
836 if (
r.pos.z <=
b.min.z)
838 T d =
b.min.z -
r.pos.z;
839 T t = (
r.dir.z > 1 || d < TMAX *
r.dir.z) ? d /
r.dir.z : TMAX;
845 ip.x =
clamp (
r.pos.x + t *
r.dir.x,
b.min.x,
b.max.x);
846 ip.y =
clamp (
r.pos.y + t *
r.dir.y,
b.min.y,
b.max.y);
851 else if (
r.dir.z < 0)
853 if (
r.pos.z <
b.min.z)
return false;
855 T d =
b.min.z -
r.pos.z;
857 if (
r.dir.z < -1 || d > TMAX *
r.dir.z)
861 if (tBackMin > t) tBackMin =
t;
864 if (
r.pos.z >=
b.max.z)
866 T d =
b.max.z -
r.pos.z;
867 T t = (
r.dir.z < -1 || d > TMAX *
r.dir.z) ? d /
r.dir.z : TMAX;
873 ip.x =
clamp (
r.pos.x + t *
r.dir.x,
b.min.x,
b.max.x);
874 ip.y =
clamp (
r.pos.y + t *
r.dir.y,
b.min.y,
b.max.y);
881 if (
r.pos.z <
b.min.z ||
r.pos.z >
b.max.z)
return false;
884 return tFrontMax <= tBackMin;
899 IMATH_INTERNAL_NAMESPACE_HEADER_EXIT
901 #endif // INCLUDED_IMATHBOXALGO_H
typedef int(APIENTRYP RE_PFNGLXSWAPINTERVALSGIPROC)(int)
GLdouble GLdouble GLint GLint const GLdouble * points
IMATH_HOSTDEVICE IMATH_CONSTEXPR14 bool findEntryAndExitPoints(const Line3< T > &r, const Box< Vec3< T >> &b, Vec3< T > &entry, Vec3< T > &exit) IMATH_NOEXCEPT
IMATH_HOSTDEVICE constexpr T closestPointInBox(const T &p, const Box< T > &box) IMATH_NOEXCEPT
IMATH_HOSTDEVICE void extendBy(const V &point) IMATH_NOEXCEPT
Extend the box to include the given point.
GLboolean GLboolean GLboolean GLboolean a
**But if you need a result
GLdouble GLdouble GLdouble q
IMATH_HOSTDEVICE IMATH_CONSTEXPR14 Vec3< T > closestPointOnBox(const Vec3< T > &p, const Box< Vec3< T >> &box) IMATH_NOEXCEPT
IMATH_HOSTDEVICE Box< Vec3< S > > transform(const Box< Vec3< S >> &box, const Matrix44< T > &m) IMATH_NOEXCEPT
V max
The maximum value of the box.
V min
The minimum value of the box.
GLboolean GLboolean GLboolean b
ImageBuf OIIO_API max(Image_or_Const A, Image_or_Const B, ROI roi={}, int nthreads=0)
IMATH_HOSTDEVICE IMATH_CONSTEXPR14 bool intersects(const Box< Vec3< T >> &b, const Line3< T > &r, Vec3< T > &ip) IMATH_NOEXCEPT
IMATH_INTERNAL_NAMESPACE_HEADER_ENTER IMATH_HOSTDEVICE constexpr T abs(T a) IMATH_NOEXCEPT
IMATH_INTERNAL_NAMESPACE_HEADER_ENTER IMATH_HOSTDEVICE IMATH_CONSTEXPR14 T clip(const T &p, const Box< T > &box) IMATH_NOEXCEPT
IMATH_HOSTDEVICE Box< Vec3< S > > affineTransform(const Box< Vec3< S >> &box, const Matrix44< T > &m) IMATH_NOEXCEPT