8 #ifndef __UT_BoundingBox_h__
9 #define __UT_BoundingBox_h__
37 T axmax,
T aymax,
T azmax)
39 setBounds(axmin, aymin, azmin, axmax, aymax, azmax);
45 vals[0][0] = lowerbound[0];
46 vals[0][1] = upperbound[0];
47 vals[1][0] = lowerbound[1];
48 vals[1][1] = upperbound[1];
49 vals[2][0] = lowerbound[2];
50 vals[2][1] = upperbound[2];
88 return vals[0][0] == bbox.
vals[0][0] &&
97 return !(*
this == bbox);
157 T x_max,
T y_max,
T z_max)
180 for (
int i = 0; i < 6; ++i)
185 for (
int i = 0; i < 6; ++i)
313 template <
typename MATRIX>
315 template <
typename MATRIX>
331 vals[1][1] - vals[1][0],
332 vals[2][1] - vals[2][0]); }
336 return vals[axis][1] -
vals[axis][0];
378 {
return (
vals[axis][0] +
vals[axis][1])*0.5; }
413 T tmin=-1E17f,
T tmax=1E17f)
const;
429 template <
typename MATRIX>
431 const MATRIX &transform_matrix)
const;
455 std::ostream &operator<<(std::ostream &os, const UT_BoundingBoxT<T> &box)
467 static T computeDelta(
T bmin,
T bmax,
T val);
468 static T computeDelta(
T amin,
T amax,
T bmin,
T bmax);
470 template <
typename Y>
static Y getMinMantissa(
Y val,
int bits);
472 static T computeMaxDelta(
T bmin,
T bmax,
T val);
474 static T computeOverlapDelta(
T amin,
T amax,
T bmin,
T bmax);
484 template <
typename T>
494 template <
typename T>
498 return vals[0][0] <= vals[0][1] &&
499 vals[1][0] <= vals[1][1] &&
500 vals[2][0] <= vals[2][1];
503 template <
typename T>
509 const T minv = -maxv;
518 template <
typename T>
530 template <
typename T>
542 template <
typename T>
546 vals[0][0] =
SYSmin(vals[0][0], pt.
x());
547 vals[0][1] =
SYSmax(vals[0][1], pt.
x());
548 vals[1][0] =
SYSmin(vals[1][0], pt.
y());
549 vals[1][1] =
SYSmax(vals[1][1], pt.
y());
550 vals[2][0] =
SYSmin(vals[2][0], pt.
z());
551 vals[2][1] =
SYSmax(vals[2][1], pt.
z());
554 template <
typename T>
558 vals[0][0] =
SYSmin(vals[0][0], x);
559 vals[0][1] =
SYSmax(vals[0][1], x);
560 vals[1][0] =
SYSmin(vals[1][0], y);
561 vals[1][1] =
SYSmax(vals[1][1], y);
562 vals[2][0] =
SYSmin(vals[2][0], z);
563 vals[2][1] =
SYSmax(vals[2][1], z);
566 template <
typename T>
570 vals[0][0] =
SYSmin(vals[0][0], box(0, 0));
571 vals[0][1] =
SYSmax(vals[0][1], box(0, 1));
572 vals[1][0] =
SYSmin(vals[1][0], box(1, 0));
573 vals[1][1] =
SYSmax(vals[1][1], box(1, 1));
574 vals[2][0] =
SYSmin(vals[2][0], box(2, 0));
575 vals[2][1] =
SYSmax(vals[2][1], box(2, 1));
578 template <
typename T>
586 d = absolute + vals[0][1]*relative - vals[0][0]*relative;
587 vals[0][0] -= d; vals[0][1] += d;
588 d = absolute + vals[1][1]*relative - vals[1][0]*relative;
589 vals[1][0] -= d; vals[1][1] += d;
590 d = absolute + vals[2][1]*relative - vals[2][0]*relative;
591 vals[2][0] -= d; vals[2][1] += d;
594 template <
typename T>
598 vals[0][0] -= dltx; vals[0][1] += dltx;
599 vals[1][0] -= dlty; vals[1][1] += dlty;
600 vals[2][0] -= dltz; vals[2][1] += dltz;
603 template <
typename T>
607 if (vals[0][0] > pt.
x() || vals[0][1] < pt.
x())
return 0;
608 if (vals[1][0] > pt.
y() || vals[1][1] < pt.
y())
return 0;
609 if (vals[2][0] > pt.
z() || vals[2][1] < pt.
z())
return 0;
613 template <
typename T>
617 if (vals[0][0] > pt.
x() || vals[0][1] < pt.
x())
return 0;
618 if (vals[1][0] > pt.
y() || vals[1][1] < pt.
y())
return 0;
619 if (vals[2][0] > pt.
z() || vals[2][1] < pt.
z())
return 0;
623 template <
typename T>
627 if (vals[0][0] > x || vals[0][1] < x)
return 0;
628 if (vals[1][0] > y || vals[1][1] < y)
return 0;
629 if (vals[2][0] > z || vals[2][1] < z)
return 0;
633 template <
typename T>
637 if (vals[0][0] < box.
vals[0][0] || vals[0][1] > box.
vals[0][1])
return 0;
638 if (vals[1][0] < box.
vals[1][0] || vals[1][1] > box.
vals[1][1])
return 0;
639 if (vals[2][0] < box.
vals[2][0] || vals[2][1] > box.
vals[2][1])
return 0;
643 template <
typename T>
647 if (vals[0][0] > box.
vals[0][1] || vals[0][1] < box.
vals[0][0])
return 0;
648 if (vals[1][0] > box.
vals[1][1] || vals[1][1] < box.
vals[1][0])
return 0;
649 if (vals[2][0] > box.
vals[2][1] || vals[2][1] < box.
vals[2][0])
return 0;
653 template <
typename T>
660 vals[0][0] =
SYSmax(vals[0][0], box(0, 0));
661 vals[0][1] =
SYSmin(vals[0][1], box(0, 1));
662 vals[1][0] =
SYSmax(vals[1][0], box(1, 0));
663 vals[1][1] =
SYSmin(vals[1][1], box(1, 1));
664 vals[2][0] =
SYSmax(vals[2][0], box(2, 0));
665 vals[2][1] =
SYSmin(vals[2][1], box(2, 1));
669 #define UT_TESTMAX tmax = t1 < tmax ? t1 : tmax;
670 #define UT_TESTMIN tmin = t1 > tmin ? t1 : tmin;
672 #define UT_FASTBOX(idx) \
673 positive = (idir(idx) > 0.0); \
674 t1 = (vals[idx][ positive] - v0(idx))*idir(idx); UT_TESTMAX \
675 t1 = (vals[idx][!positive] - v0(idx))*idir(idx); UT_TESTMIN \
678 template <
typename T>
701 template <
typename T>
712 dist =
SYSmax(SYSsqrt(dist) - getRadius(), 0.0);
716 template <
typename T>
724 template <
typename T>
729 vals[0][0] = min.
x(); vals[0][1] = max.
x();
730 vals[1][0] = min.
y(); vals[1][1] = max.
y();
731 vals[2][0] = min.
z(); vals[2][1] = max.
z();
734 template <
typename T>
738 vals[0][0] = vals[0][1] = pt.
x();
739 vals[1][0] = vals[1][1] = pt.
y();
740 vals[2][0] = vals[2][1] = pt.
z();
743 template <
typename T>
747 vals[0][0] = box(0, 0);
748 vals[0][1] = box(0, 1);
749 vals[1][0] = box(1, 0);
750 vals[1][1] = box(1, 1);
751 vals[2][0] = box(2, 0);
752 vals[2][1] = box(2, 1);
755 template <
typename T>
760 vals[0][0] =
SYSmin(vals[0][0], min.
x());
761 vals[0][1] =
SYSmax(vals[0][1], max.
x());
762 vals[1][0] =
SYSmin(vals[1][0], min.
y());
763 vals[1][1] =
SYSmax(vals[1][1], max.
y());
764 vals[2][0] =
SYSmin(vals[2][0], min.
z());
765 vals[2][1] =
SYSmax(vals[2][1], max.
z());
768 template <
typename T>
772 vals[0][0] =
SYSmin(vals[0][0], pt.
x());
773 vals[0][1] =
SYSmax(vals[0][1], pt.
x());
774 vals[1][0] =
SYSmin(vals[1][0], pt.
y());
775 vals[1][1] =
SYSmax(vals[1][1], pt.
y());
776 vals[2][0] =
SYSmin(vals[2][0], pt.
z());
777 vals[2][1] =
SYSmax(vals[2][1], pt.
z());
783 template <
typename T>
784 template <
typename Y>
789 typedef typename FPRealUnion::uint_type UInt;
791 static const int exponent_bits = FPRealUnion::EXPONENT_BITS;
792 static const int mantissa_bits = FPRealUnion::MANTISSA_BITS;
796 tmp.uval >>= mantissa_bits;
797 tmp.uval &= ((UInt(1) << exponent_bits) - UInt(1));
798 tmp.uval -= mantissa_bits - bits;
799 tmp.uval <<= mantissa_bits;
803 template <
typename T>
811 for (i = 0; i < 3; i++)
813 val =
SYSmax(getMinMantissa(vals[i][0], bits),
814 getMinMantissa(vals[i][1], bits), min);
826 UT_ASSERT(!
"enlargeFloats is no-op for int64");
830 template <
typename T>
834 vals[0][0] =
SYSmax(vals[0][0], box(0, 0));
835 vals[0][1] =
SYSmin(vals[0][1], box(0, 1));
836 vals[1][0] =
SYSmax(vals[1][0], box(1, 0));
837 vals[1][1] =
SYSmin(vals[1][1], box(1, 1));
838 vals[2][0] =
SYSmax(vals[2][0], box(2, 0));
839 vals[2][1] =
SYSmin(vals[2][1], box(2, 1));
842 template <
typename T>
843 template <
typename MATRIX>
852 template <
typename T>
853 template <
typename MATRIX>
868 template <
typename T>
872 vals[0][0] += delta.
x();
873 vals[0][1] += delta.
x();
874 vals[1][0] += delta.
y();
875 vals[1][1] += delta.
y();
876 vals[2][0] += delta.
z();
877 vals[2][1] += delta.
z();
880 #define UT_TESTMAX(face) if (t < tmax) { \
881 if (t < tmin) return 0; \
885 #define UT_TESTMIN(face) if (t > tmin) { \
886 if (t > tmax) return 0; \
890 #define UT_FASTBOX(face) \
891 ray = 1.0 / d(face); \
892 positive = (ray > 0.0); \
893 t = (vals[face][ positive] - o(face))*ray; UT_TESTMAX(face) \
894 t = (vals[face][1-positive] - o(face))*ray; UT_TESTMIN(face) \
897 template <
typename T>
905 int positive, foundmin, foundmax;
921 if(foundmin == 0) nml->
assign(1.0, 0.0, 0.0);
922 else if(foundmin == 1) nml->
assign(0.0, 1.0, 0.0);
923 else nml->
assign(0.0, 0.0, 1.0);
926 if(distance) *distance = tmin;
929 else if (foundmax != -1)
936 if(foundmax == 0) nml->
assign(1.0, 0.0, 0.0);
937 else if(foundmax == 1) nml->
assign(0.0, 1.0, 0.0);
938 else nml->
assign(0.0, 0.0, 1.0);
941 if(distance) *distance = tmax;
951 #define UT_TESTMAX if(t < tmax) { if(t < tmin) return 0; tmax = t; }
952 #define UT_TESTMIN if(t > tmin) { if(t > tmax) return 0; tmin = t; }
954 #define UT_FASTBOX(face) \
955 ray = 1.0 / d(face); \
956 positive = (ray > 0.0); \
957 t = (vals[face][ positive] - o(face))*ray; UT_TESTMAX \
958 t = (vals[face][1-positive] - o(face))*ray; UT_TESTMIN \
961 template <
typename T>
965 T &tmin, T &tmax)
const
985 template <
typename T>
989 T radius, T mint, T maxt)
const
1012 template <
typename T>
1016 T t = vals[0][1] - vals[0][0];
1017 T d = vals[1][1] - vals[1][0];
1020 d = vals[2][1] - vals[2][0];
1025 template <
typename T>
1029 T t = vals[0][1] - vals[0][0];
1030 T d = vals[1][1] - vals[1][0];
1033 if (t < d) { t = d; axis = 1; }
1034 d = vals[2][1] - vals[2][0];
1035 if (t < d) { t = d; axis = 2; }
1039 template <
typename T>
1043 return (val > bmax) ? val - bmax :
SYSmin(val - bmin,
T(0));
1046 template <
typename T>
1052 delta.
x() = computeDelta(vals[0][0], vals[0][1], p.
x());
1053 delta.
y() = computeDelta(vals[1][0], vals[1][1], p.
y());
1054 delta.
z() = computeDelta(vals[2][0], vals[2][1], p.
z());
1059 template <
typename T>
1065 d1 =
SYSmax(bmin - amax,
T(0));
1066 d2 =
SYSmax(amin - bmax,
T(0));
1067 return d1 > d2 ? d1 : -d2;
1070 template <
typename T>
1076 delta.
x() = computeDelta(
1077 vals[0][0], vals[0][1], box.
vals[0][0], box.
vals[0][1]);
1078 delta.
y() = computeDelta(
1079 vals[1][0], vals[1][1], box.
vals[1][0], box.
vals[1][1]);
1080 delta.
z() = computeDelta(
1081 vals[2][0], vals[2][1], box.
vals[2][0], box.
vals[2][1]);
1086 template <
typename T>
1096 template <
typename T>
1102 delta.
x() = computeMaxDelta(vals[0][0], vals[0][1], p.
x());
1103 delta.
y() = computeMaxDelta(vals[1][0], vals[1][1], p.
y());
1104 delta.
z() = computeMaxDelta(vals[2][0], vals[2][1], p.
z());
1109 template <
typename T>
1119 return ((d1 < 0) != (d2 < 0)) ? 0 : (
SYSabs(d1) <
SYSabs(d2) ? d1 : d2);
1122 template <
typename T>
1128 delta.
x() = computeOverlapDelta(
1129 vals[0][0], vals[0][1], box.
vals[0][0], box.
vals[0][1]);
1130 delta.
y() = computeOverlapDelta(
1131 vals[1][0], vals[1][1], box.
vals[1][0], box.
vals[1][1]);
1132 delta.
z() = computeOverlapDelta(
1133 vals[2][0], vals[2][1], box.
vals[2][0], box.
vals[2][1]);
1138 template <
typename T>
1144 if (pt.
x() < vals[0][0]) code |= 1;
1145 else if (pt.
x() > vals[0][1]) code |= 2;
1146 if (pt.
y() < vals[1][0]) code |= 4;
1147 else if (pt.
y() > vals[1][1]) code |= 8;
1148 if (pt.
z() < vals[2][0]) code |= 16;
1149 else if (pt.
z() > vals[2][1]) code |= 32;
1154 template <
typename T>
1160 xlen = sizeX(); ylen = sizeY(); zlen = sizeZ();
1161 return 2*(xlen*ylen+ylen*zlen+zlen*xlen);
1164 template <
typename T>
1168 vals[0][0] += vec[0];
1169 vals[1][0] += vec[1];
1170 vals[2][0] += vec[2];
1173 template <
typename T>
1177 vals[0][1] += vec[0];
1178 vals[1][1] += vec[1];
1179 vals[2][1] += vec[2];
1182 template <
typename T>
1187 vals[0][0] *= scale[0]; vals[0][1] *= scale[0];
1188 vals[1][0] *= scale[1]; vals[1][1] *= scale[1];
1189 vals[2][0] *= scale[2]; vals[2][1] *= scale[2];
1190 vals[0][0] += offset[0]; vals[0][1] += offset[0];
1191 vals[1][0] += offset[1]; vals[1][1] += offset[1];
1192 vals[2][0] += offset[2]; vals[2][1] += offset[2];
1195 template <
typename T>
1199 return sizeX() > sizeY() ? (sizeX() > sizeZ() ? 0 : 2) :
1200 sizeY() > sizeZ() ? 1 : 2;
1203 template <
typename T>
1207 return sizeX() < sizeY() ? (sizeX() < sizeZ() ? 0 : 2) :
1208 sizeY() < sizeZ() ? 1 : 2;
1211 template <
typename T>
1215 ptarray[0].assign(vals[0][0], vals[1][0], vals[2][0]);
1216 ptarray[1].assign(vals[0][0], vals[1][0], vals[2][1]);
1217 ptarray[2].assign(vals[0][0], vals[1][1], vals[2][0]);
1218 ptarray[3].assign(vals[0][0], vals[1][1], vals[2][1]);
1219 ptarray[4].assign(vals[0][1], vals[1][0], vals[2][0]);
1220 ptarray[5].assign(vals[0][1], vals[1][0], vals[2][1]);
1221 ptarray[6].assign(vals[0][1], vals[1][1], vals[2][0]);
1222 ptarray[7].assign(vals[0][1], vals[1][1], vals[2][1]);
1225 template <
typename T>
1229 ptarray[0].assign(vals[0][0], vals[1][0], vals[2][0], 1.0);
1230 ptarray[1].assign(vals[0][0], vals[1][0], vals[2][1], 1.0);
1231 ptarray[2].assign(vals[0][0], vals[1][1], vals[2][0], 1.0);
1232 ptarray[3].assign(vals[0][0], vals[1][1], vals[2][1], 1.0);
1233 ptarray[4].assign(vals[0][1], vals[1][0], vals[2][0], 1.0);
1234 ptarray[5].assign(vals[0][1], vals[1][0], vals[2][1], 1.0);
1235 ptarray[6].assign(vals[0][1], vals[1][1], vals[2][0], 1.0);
1236 ptarray[7].assign(vals[0][1], vals[1][1], vals[2][1], 1.0);
1239 template <
typename T>
1240 template <
typename MATRIX>
1244 const MATRIX &transform_matrix)
const
1246 ptarray[0].assign(vals[0][0], vals[1][0], vals[2][0]);
1247 ptarray[1].assign(vals[0][0], vals[1][0], vals[2][1]);
1248 ptarray[2].assign(vals[0][0], vals[1][1], vals[2][0]);
1249 ptarray[3].assign(vals[0][0], vals[1][1], vals[2][1]);
1250 ptarray[4].assign(vals[0][1], vals[1][0], vals[2][0]);
1251 ptarray[5].assign(vals[0][1], vals[1][0], vals[2][1]);
1252 ptarray[6].assign(vals[0][1], vals[1][1], vals[2][0]);
1253 ptarray[7].assign(vals[0][1], vals[1][1], vals[2][1]);
1255 if ( transform_matrix.isIdentity() )
1258 ptarray[0] *= transform_matrix;
1259 ptarray[1] *= transform_matrix;
1260 ptarray[2] *= transform_matrix;
1261 ptarray[3] *= transform_matrix;
1262 ptarray[4] *= transform_matrix;
1263 ptarray[5] *= transform_matrix;
1264 ptarray[6] *= transform_matrix;
1265 ptarray[7] *= transform_matrix;
int intersectRay(const UT_Vector3T< T > &org, const UT_Vector3T< T > &dir, T tmax=1E17F, T *distance=0, UT_Vector3T< T > *nml=0) const
GA_API const UT_StringHolder dist
GLenum GLuint GLenum GLsizei const GLchar * buf
bool operator==(const UT_BoundingBoxT< T > &bbox) const
int intersects(const UT_BoundingBoxT< T > &box) const
SYS_FORCE_INLINE bool hasVolume() const
GLenum GLuint GLsizei bufsize
UT_Vector3T< T > maxDistDelta(const UT_Vector3T< T > &p) const
Returns the maximum delta vector from the bounding box to the point.
T minDist2(const UT_Vector3T< T > &p) const
SYS_FORCE_INLINE void makeInvalid()
Axis-aligned bounding box (AABB).
UT_API void dump(const char *msg=0) const
Dump the bounding box to stderr. The msg is printed before the bounds.
void transform(const MATRIX &mat)
constexpr SYS_FORCE_INLINE T & y() noexcept
T approxLineDist2(const UT_Vector3T< T > &v0, const UT_Vector3T< T > &dir) const
GLdouble GLdouble GLdouble z
constexpr SYS_FORCE_INLINE T & z() noexcept
UT_Vector3T< T > maxvec() const
GLboolean GLboolean GLboolean GLboolean a
UT_Vector3T< T > minDistDelta(const UT_Vector3T< T > &p) const
JSON reader class which handles parsing of JSON or bJSON files.
ImageBuf OIIO_API min(Image_or_Const A, Image_or_Const B, ROI roi={}, int nthreads=0)
void setBounds(T x_min, T y_min, T z_min, T x_max, T y_max, T z_max)
Class which writes ASCII or binary JSON streams.
GLfloat GLfloat GLfloat v2
void addToMin(const UT_Vector3T< T > &vec)
unsigned long long uint64
SYS_FORCE_INLINE bool isInvalidFast() const
T sizeAxis(int axis) const
void translate(const UT_Vector3T< T > &delta)
Adds the given translate to each component of the bounding box.
constexpr SYS_FORCE_INLINE T & x() noexcept
T segmentPointDist2(const UT_Vector3T< T > &pos, const UT_Vector3T< T > &pt1, const UT_Vector3T< T > &pt2)
void addToMax(const UT_Vector3T< T > &vec)
void initBounds(const fpreal64 *v)
Initialize zero-sized bounds at the location of the point given by v.
UT_BoundingBoxT & operator=(const UT_BoundingBoxT< S > &bbox)
int intersectRange(const UT_Vector3T< T > &org, const UT_Vector3T< T > &dir, T &min, T &max) const
SYS_FORCE_INLINE void expandBounds(T relative, T absolute)
T maxDist2(const UT_Vector3T< T > &p) const
Returns maximum distance between point and bounding box squared.
UT_API bool save(UT_JSONWriter &w) const
GA_API const UT_StringHolder scale
T & operator()(unsigned m, unsigned n)
void setSerialized(const fpreal64 floats[6])
UT_API size_t UTformatBuffer(char *buf, size_t bufsize, const UT_BoundingBoxT< T > &v)
bool operator!=(const UT_BoundingBoxT< T > &bbox) const
void getBBoxPoints(UT_Vector3T< T >(&ptarray)[8]) const
UT_Vector3T< T > center() const
UT_API void outTo(std::ostream &os) const
UT_BoundingBoxT(const UT_Vector3T< T > &lowerbound, const UT_Vector3T< T > &upperbound)
constexpr SYS_FORCE_INLINE T & z() noexcept
int intersectTube(const UT_Vector3T< T > &org, const UT_Vector3T< T > &dir, T radius, T tmin=-1E17f, T tmax=1E17f) const
UT_API bool triangleIntersects(const UT_Vector3T< T > &v0, const UT_Vector3T< T > &v1, const UT_Vector3T< T > &v2) const
void enlargeBounds(const fpreal32 *v)
Enlarge the existing bounds to encompass the point given in v.
UT_API bool load(UT_JSONParser &p)
int computeIntersection(const UT_BoundingBoxT< T > &box)
T minDist2(const UT_BoundingBoxT< T > &box) const
Minimum disance between two bboxes squared.
T sizeMax() const
Return the size of the largest dimension.
GLboolean GLboolean GLboolean b
UT_Vector3T< T > minDistToMaxOverlap(const UT_BoundingBoxT< T > &box) const
void enlargeBounds(const UT_Vector3T< T > &min, const UT_Vector3T< T > &max)
GA_API const UT_StringHolder transform
uint64 hash() const
Compute UT_BoundingBox hash.
UT_Vector3T< T > size() const
const T * getSerialized() const
void setSerialized(const fpreal32 floats[6])
void assign(T xx=0.0f, T yy=0.0f, T zz=0.0f)
Set the values of the vector components.
UT_API void dumpGeo(FILE *fp) const
Dump the bounding box geometry to a draw file.
T getRadius() const
Returns the radius of a sphere that would fully enclose the box.
void enlargeBounds(const fpreal64 *v)
Enlarge the existing bounds to encompass the point given in v.
T operator()(unsigned m, unsigned n) const
SYS_FORCE_INLINE bool isValid() const
Check whether the bounding box contains at least one point.
UT_Vector3T< T > minvec() const
void splitRight(UT_BoundingBoxT< T > &box, int axis, T split)
ImageBuf OIIO_API max(Image_or_Const A, Image_or_Const B, ROI roi={}, int nthreads=0)
void initMaxBounds()
Initialize the box to the largest size.
SYS_FORCE_INLINE void initBounds()
Class to store JSON objects as C++ objects.
void splitLeft(UT_BoundingBoxT< T > &box, int axis, T split)
IMATH_HOSTDEVICE IMATH_CONSTEXPR14 bool intersects(const Box< Vec3< T >> &b, const Line3< T > &r, Vec3< T > &ip) IMATH_NOEXCEPT
int isInside(const UT_Vector3T< T > &pt) const
UT_BoundingBoxT(T axmin, T aymin, T azmin, T axmax, T aymax, T azmax)
GLubyte GLubyte GLubyte GLubyte w
friend std::size_t hash_value(const this_type &t)
Compute UT_BoundingBox hash.
void OIIO_UTIL_API split(string_view str, std::vector< string_view > &result, string_view sep=string_view(), int maxsplit=-1)
void enlargeFloats(int bits=1, T min=1e-5)
SIM_API const UT_StringHolder distance
UT_BoundingBoxT(const UT_BoundingBoxT< S > &bbox)
constexpr SYS_FORCE_INLINE T & y() noexcept
void initBounds(const fpreal32 *v)
Initialize zero-sized bounds at the location of the point given by v.
static bool SYSisEqual(int64 a, int64 b, int64)
int isLineInside(const UT_Vector3T< T > &v0, const UT_Vector3T< T > &idir) const
T centerAxis(int axis) const
void clipBounds(const UT_BoundingBoxT< T > &box)
Find the intersections of two bounding boxes.
void scaleOffset(const UT_Vector3T< T > &scale, const UT_Vector3T< T > &offset)
Scale then offset a bounding box.
bool isEqual(const UT_BoundingBoxT< T > &bbox, T tol=SYS_FTOLERANCE_R) const
constexpr SYS_FORCE_INLINE T & x() noexcept
int getOutCode(const UT_Vector3T< T > &pt) const
Finds the out code of the point relative to this box: