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;
449 std::ostream &operator<<(std::ostream &os, const UT_BoundingBoxT<T> &
box)
461 static T computeDelta(
T bmin,
T bmax,
T val);
462 static T computeDelta(
T amin,
T amax,
T bmin,
T bmax);
464 template <
typename Y>
static Y getMinMantissa(
Y val,
int bits);
466 static T computeMaxDelta(
T bmin,
T bmax,
T val);
468 static T computeOverlapDelta(
T amin,
T amax,
T bmin,
T bmax);
478 template <
typename T>
487 template <
typename T>
491 return vals[0][0] <= vals[0][1] &&
492 vals[1][0] <= vals[1][1] &&
493 vals[2][0] <= vals[2][1];
496 template <
typename T>
502 const T minv = -maxv;
511 template <
typename T>
523 template <
typename T>
535 template <
typename T>
539 vals[0][0] =
SYSmin(vals[0][0], pt.
x());
540 vals[0][1] =
SYSmax(vals[0][1], pt.
x());
541 vals[1][0] =
SYSmin(vals[1][0], pt.
y());
542 vals[1][1] =
SYSmax(vals[1][1], pt.
y());
543 vals[2][0] =
SYSmin(vals[2][0], pt.
z());
544 vals[2][1] =
SYSmax(vals[2][1], pt.
z());
547 template <
typename T>
551 vals[0][0] =
SYSmin(vals[0][0], x);
552 vals[0][1] =
SYSmax(vals[0][1], x);
553 vals[1][0] =
SYSmin(vals[1][0], y);
554 vals[1][1] =
SYSmax(vals[1][1], y);
555 vals[2][0] =
SYSmin(vals[2][0], z);
556 vals[2][1] =
SYSmax(vals[2][1], z);
559 template <
typename T>
563 vals[0][0] =
SYSmin(vals[0][0],
box(0, 0));
564 vals[0][1] =
SYSmax(vals[0][1],
box(0, 1));
565 vals[1][0] =
SYSmin(vals[1][0],
box(1, 0));
566 vals[1][1] =
SYSmax(vals[1][1],
box(1, 1));
567 vals[2][0] =
SYSmin(vals[2][0],
box(2, 0));
568 vals[2][1] =
SYSmax(vals[2][1],
box(2, 1));
571 template <
typename T>
579 d = absolute + vals[0][1]*relative - vals[0][0]*relative;
580 vals[0][0] -= d; vals[0][1] += d;
581 d = absolute + vals[1][1]*relative - vals[1][0]*relative;
582 vals[1][0] -= d; vals[1][1] += d;
583 d = absolute + vals[2][1]*relative - vals[2][0]*relative;
584 vals[2][0] -= d; vals[2][1] += d;
587 template <
typename T>
591 vals[0][0] -= dltx; vals[0][1] += dltx;
592 vals[1][0] -= dlty; vals[1][1] += dlty;
593 vals[2][0] -= dltz; vals[2][1] += dltz;
596 template <
typename T>
600 if (vals[0][0] > pt.
x() || vals[0][1] < pt.
x())
return 0;
601 if (vals[1][0] > pt.
y() || vals[1][1] < pt.
y())
return 0;
602 if (vals[2][0] > pt.
z() || vals[2][1] < pt.
z())
return 0;
606 template <
typename T>
610 if (vals[0][0] > pt.
x() || vals[0][1] < pt.
x())
return 0;
611 if (vals[1][0] > pt.
y() || vals[1][1] < pt.
y())
return 0;
612 if (vals[2][0] > pt.
z() || vals[2][1] < pt.
z())
return 0;
616 template <
typename T>
620 if (vals[0][0] > x || vals[0][1] < x)
return 0;
621 if (vals[1][0] > y || vals[1][1] < y)
return 0;
622 if (vals[2][0] > z || vals[2][1] < z)
return 0;
626 template <
typename T>
630 if (vals[0][0] < box.
vals[0][0] || vals[0][1] > box.
vals[0][1])
return 0;
631 if (vals[1][0] < box.
vals[1][0] || vals[1][1] > box.
vals[1][1])
return 0;
632 if (vals[2][0] < box.
vals[2][0] || vals[2][1] > box.
vals[2][1])
return 0;
636 template <
typename T>
640 if (vals[0][0] > box.
vals[0][1] || vals[0][1] < box.
vals[0][0])
return 0;
641 if (vals[1][0] > box.
vals[1][1] || vals[1][1] < box.
vals[1][0])
return 0;
642 if (vals[2][0] > box.
vals[2][1] || vals[2][1] < box.
vals[2][0])
return 0;
646 template <
typename T>
653 vals[0][0] =
SYSmax(vals[0][0],
box(0, 0));
654 vals[0][1] =
SYSmin(vals[0][1],
box(0, 1));
655 vals[1][0] =
SYSmax(vals[1][0],
box(1, 0));
656 vals[1][1] =
SYSmin(vals[1][1],
box(1, 1));
657 vals[2][0] =
SYSmax(vals[2][0],
box(2, 0));
658 vals[2][1] =
SYSmin(vals[2][1],
box(2, 1));
662 #define UT_TESTMAX tmax = t1 < tmax ? t1 : tmax;
663 #define UT_TESTMIN tmin = t1 > tmin ? t1 : tmin;
665 #define UT_FASTBOX(idx) \
666 positive = (idir(idx) > 0.0); \
667 t1 = (vals[idx][ positive] - v0(idx))*idir(idx); UT_TESTMAX \
668 t1 = (vals[idx][!positive] - v0(idx))*idir(idx); UT_TESTMIN \
671 template <
typename T>
694 template <
typename T>
705 dist =
SYSmax(SYSsqrt(dist) - getRadius(), 0.0);
709 template <
typename T>
717 template <
typename T>
722 vals[0][0] = min.
x(); vals[0][1] = max.
x();
723 vals[1][0] = min.
y(); vals[1][1] = max.
y();
724 vals[2][0] = min.
z(); vals[2][1] = max.
z();
727 template <
typename T>
731 vals[0][0] = vals[0][1] = pt.
x();
732 vals[1][0] = vals[1][1] = pt.
y();
733 vals[2][0] = vals[2][1] = pt.
z();
736 template <
typename T>
740 vals[0][0] =
box(0, 0);
741 vals[0][1] =
box(0, 1);
742 vals[1][0] =
box(1, 0);
743 vals[1][1] =
box(1, 1);
744 vals[2][0] =
box(2, 0);
745 vals[2][1] =
box(2, 1);
748 template <
typename T>
753 vals[0][0] =
SYSmin(vals[0][0], min.
x());
754 vals[0][1] =
SYSmax(vals[0][1], max.
x());
755 vals[1][0] =
SYSmin(vals[1][0], min.
y());
756 vals[1][1] =
SYSmax(vals[1][1], max.
y());
757 vals[2][0] =
SYSmin(vals[2][0], min.
z());
758 vals[2][1] =
SYSmax(vals[2][1], max.
z());
761 template <
typename T>
765 vals[0][0] =
SYSmin(vals[0][0], pt.
x());
766 vals[0][1] =
SYSmax(vals[0][1], pt.
x());
767 vals[1][0] =
SYSmin(vals[1][0], pt.
y());
768 vals[1][1] =
SYSmax(vals[1][1], pt.
y());
769 vals[2][0] =
SYSmin(vals[2][0], pt.
z());
770 vals[2][1] =
SYSmax(vals[2][1], pt.
z());
776 template <
typename T>
777 template <
typename Y>
782 typedef typename FPRealUnion::uint_type UInt;
784 static const int exponent_bits = FPRealUnion::EXPONENT_BITS;
785 static const int mantissa_bits = FPRealUnion::MANTISSA_BITS;
789 tmp.uval >>= mantissa_bits;
790 tmp.uval &= ((UInt(1) << exponent_bits) - UInt(1));
791 tmp.uval -= mantissa_bits - bits;
792 tmp.uval <<= mantissa_bits;
796 template <
typename T>
804 for (i = 0; i < 3; i++)
806 val =
SYSmax(getMinMantissa(vals[i][0], bits),
807 getMinMantissa(vals[i][1], bits), min);
819 UT_ASSERT(!
"enlargeFloats is no-op for int64");
823 template <
typename T>
827 vals[0][0] =
SYSmax(vals[0][0],
box(0, 0));
828 vals[0][1] =
SYSmin(vals[0][1],
box(0, 1));
829 vals[1][0] =
SYSmax(vals[1][0],
box(1, 0));
830 vals[1][1] =
SYSmin(vals[1][1],
box(1, 1));
831 vals[2][0] =
SYSmax(vals[2][0],
box(2, 0));
832 vals[2][1] =
SYSmin(vals[2][1],
box(2, 1));
835 template <
typename T>
836 template <
typename MATRIX>
845 template <
typename T>
846 template <
typename MATRIX>
861 template <
typename T>
865 vals[0][0] += delta.
x();
866 vals[0][1] += delta.
x();
867 vals[1][0] += delta.
y();
868 vals[1][1] += delta.
y();
869 vals[2][0] += delta.
z();
870 vals[2][1] += delta.
z();
873 #define UT_TESTMAX(face) if (t < tmax) { \
874 if (t < tmin) return 0; \
878 #define UT_TESTMIN(face) if (t > tmin) { \
879 if (t > tmax) return 0; \
883 #define UT_FASTBOX(face) \
884 ray = 1.0 / d(face); \
885 positive = (ray > 0.0); \
886 t = (vals[face][ positive] - o(face))*ray; UT_TESTMAX(face) \
887 t = (vals[face][1-positive] - o(face))*ray; UT_TESTMIN(face) \
890 template <
typename T>
898 int positive, foundmin, foundmax;
914 if(foundmin == 0) nml->
assign(1.0, 0.0, 0.0);
915 else if(foundmin == 1) nml->
assign(0.0, 1.0, 0.0);
916 else nml->
assign(0.0, 0.0, 1.0);
919 if(distance) *distance = tmin;
922 else if (foundmax != -1)
929 if(foundmax == 0) nml->
assign(1.0, 0.0, 0.0);
930 else if(foundmax == 1) nml->
assign(0.0, 1.0, 0.0);
931 else nml->
assign(0.0, 0.0, 1.0);
934 if(distance) *distance = tmax;
944 #define UT_TESTMAX if(t < tmax) { if(t < tmin) return 0; tmax = t; }
945 #define UT_TESTMIN if(t > tmin) { if(t > tmax) return 0; tmin = t; }
947 #define UT_FASTBOX(face) \
948 ray = 1.0 / d(face); \
949 positive = (ray > 0.0); \
950 t = (vals[face][ positive] - o(face))*ray; UT_TESTMAX \
951 t = (vals[face][1-positive] - o(face))*ray; UT_TESTMIN \
954 template <
typename T>
958 T &tmin, T &tmax)
const
978 template <
typename T>
982 T radius, T mint, T maxt)
const
1005 template <
typename T>
1009 T t = vals[0][1] - vals[0][0];
1010 T d = vals[1][1] - vals[1][0];
1013 d = vals[2][1] - vals[2][0];
1018 template <
typename T>
1022 T t = vals[0][1] - vals[0][0];
1023 T d = vals[1][1] - vals[1][0];
1026 if (t < d) { t = d; axis = 1; }
1027 d = vals[2][1] - vals[2][0];
1028 if (t < d) { t = d; axis = 2; }
1032 template <
typename T>
1036 return (val > bmax) ? val - bmax :
SYSmin(val - bmin,
T(0));
1039 template <
typename T>
1045 delta.
x() = computeDelta(vals[0][0], vals[0][1], p.
x());
1046 delta.
y() = computeDelta(vals[1][0], vals[1][1], p.
y());
1047 delta.
z() = computeDelta(vals[2][0], vals[2][1], p.
z());
1052 template <
typename T>
1058 d1 =
SYSmax(bmin - amax,
T(0));
1059 d2 =
SYSmax(amin - bmax,
T(0));
1060 return d1 > d2 ? d1 : -d2;
1063 template <
typename T>
1069 delta.
x() = computeDelta(
1070 vals[0][0], vals[0][1], box.
vals[0][0], box.
vals[0][1]);
1071 delta.
y() = computeDelta(
1072 vals[1][0], vals[1][1], box.
vals[1][0], box.
vals[1][1]);
1073 delta.
z() = computeDelta(
1074 vals[2][0], vals[2][1], box.
vals[2][0], box.
vals[2][1]);
1079 template <
typename T>
1089 template <
typename T>
1095 delta.
x() = computeMaxDelta(vals[0][0], vals[0][1], p.
x());
1096 delta.
y() = computeMaxDelta(vals[1][0], vals[1][1], p.
y());
1097 delta.
z() = computeMaxDelta(vals[2][0], vals[2][1], p.
z());
1102 template <
typename T>
1112 return ((d1 < 0) != (d2 < 0)) ? 0 : (
SYSabs(d1) <
SYSabs(d2) ? d1 : d2);
1115 template <
typename T>
1121 delta.
x() = computeOverlapDelta(
1122 vals[0][0], vals[0][1], box.
vals[0][0], box.
vals[0][1]);
1123 delta.
y() = computeOverlapDelta(
1124 vals[1][0], vals[1][1], box.
vals[1][0], box.
vals[1][1]);
1125 delta.
z() = computeOverlapDelta(
1126 vals[2][0], vals[2][1], box.
vals[2][0], box.
vals[2][1]);
1131 template <
typename T>
1137 if (pt.
x() < vals[0][0]) code |= 1;
1138 else if (pt.
x() > vals[0][1]) code |= 2;
1139 if (pt.
y() < vals[1][0]) code |= 4;
1140 else if (pt.
y() > vals[1][1]) code |= 8;
1141 if (pt.
z() < vals[2][0]) code |= 16;
1142 else if (pt.
z() > vals[2][1]) code |= 32;
1147 template <
typename T>
1153 xlen = sizeX(); ylen = sizeY(); zlen = sizeZ();
1154 return 2*(xlen*ylen+ylen*zlen+zlen*xlen);
1157 template <
typename T>
1161 vals[0][0] += vec[0];
1162 vals[1][0] += vec[1];
1163 vals[2][0] += vec[2];
1166 template <
typename T>
1170 vals[0][1] += vec[0];
1171 vals[1][1] += vec[1];
1172 vals[2][1] += vec[2];
1175 template <
typename T>
1180 vals[0][0] *= scale[0]; vals[0][1] *= scale[0];
1181 vals[1][0] *= scale[1]; vals[1][1] *= scale[1];
1182 vals[2][0] *= scale[2]; vals[2][1] *= scale[2];
1183 vals[0][0] += offset[0]; vals[0][1] += offset[0];
1184 vals[1][0] += offset[1]; vals[1][1] += offset[1];
1185 vals[2][0] += offset[2]; vals[2][1] += offset[2];
1188 template <
typename T>
1192 return sizeX() > sizeY() ? (sizeX() > sizeZ() ? 0 : 2) :
1193 sizeY() > sizeZ() ? 1 : 2;
1196 template <
typename T>
1200 return sizeX() < sizeY() ? (sizeX() < sizeZ() ? 0 : 2) :
1201 sizeY() < sizeZ() ? 1 : 2;
1204 template <
typename T>
1208 ptarray[0].assign(vals[0][0], vals[1][0], vals[2][0]);
1209 ptarray[1].assign(vals[0][0], vals[1][0], vals[2][1]);
1210 ptarray[2].assign(vals[0][0], vals[1][1], vals[2][0]);
1211 ptarray[3].assign(vals[0][0], vals[1][1], vals[2][1]);
1212 ptarray[4].assign(vals[0][1], vals[1][0], vals[2][0]);
1213 ptarray[5].assign(vals[0][1], vals[1][0], vals[2][1]);
1214 ptarray[6].assign(vals[0][1], vals[1][1], vals[2][0]);
1215 ptarray[7].assign(vals[0][1], vals[1][1], vals[2][1]);
1218 template <
typename T>
1222 ptarray[0].assign(vals[0][0], vals[1][0], vals[2][0], 1.0);
1223 ptarray[1].assign(vals[0][0], vals[1][0], vals[2][1], 1.0);
1224 ptarray[2].assign(vals[0][0], vals[1][1], vals[2][0], 1.0);
1225 ptarray[3].assign(vals[0][0], vals[1][1], vals[2][1], 1.0);
1226 ptarray[4].assign(vals[0][1], vals[1][0], vals[2][0], 1.0);
1227 ptarray[5].assign(vals[0][1], vals[1][0], vals[2][1], 1.0);
1228 ptarray[6].assign(vals[0][1], vals[1][1], vals[2][0], 1.0);
1229 ptarray[7].assign(vals[0][1], vals[1][1], vals[2][1], 1.0);
1232 template <
typename T>
1233 template <
typename MATRIX>
1237 const MATRIX &transform_matrix)
const
1239 ptarray[0].assign(vals[0][0], vals[1][0], vals[2][0]);
1240 ptarray[1].assign(vals[0][0], vals[1][0], vals[2][1]);
1241 ptarray[2].assign(vals[0][0], vals[1][1], vals[2][0]);
1242 ptarray[3].assign(vals[0][0], vals[1][1], vals[2][1]);
1243 ptarray[4].assign(vals[0][1], vals[1][0], vals[2][0]);
1244 ptarray[5].assign(vals[0][1], vals[1][0], vals[2][1]);
1245 ptarray[6].assign(vals[0][1], vals[1][1], vals[2][0]);
1246 ptarray[7].assign(vals[0][1], vals[1][1], vals[2][1]);
1248 if ( transform_matrix.isIdentity() )
1251 ptarray[0] *= transform_matrix;
1252 ptarray[1] *= transform_matrix;
1253 ptarray[2] *= transform_matrix;
1254 ptarray[3] *= transform_matrix;
1255 ptarray[4] *= transform_matrix;
1256 ptarray[5] *= transform_matrix;
1257 ptarray[6] *= transform_matrix;
1258 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
GLboolean GLboolean GLboolean b
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.
GLenum GLenum GLenum GLenum GLenum scale
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)
T approxLineDist2(const UT_Vector3T< T > &v0, const UT_Vector3T< T > &dir) const
constexpr SYS_FORCE_INLINE T & z() noexcept
UT_Vector3T< T > maxvec() const
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)
GLuint GLfloat GLfloat GLfloat GLfloat GLfloat GLfloat GLfloat GLfloat GLfloat t1
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.
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.
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
GLubyte GLubyte GLubyte GLubyte w
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.
GLuint GLenum GLenum transform
UT_API bool save(UT_JSONWriter &w) const
T & operator()(unsigned m, unsigned n)
void setSerialized(const fpreal64 floats[6])
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)
GLsizei GLsizei GLfloat distance
GLboolean GLboolean GLboolean GLboolean a
int intersectTube(const UT_Vector3T< T > &org, const UT_Vector3T< T > &dir, T radius, T tmin=-1E17f, T tmax=1E17f) const
GLdouble GLdouble GLdouble z
void enlargeBounds(const fpreal32 *v)
Enlarge the existing bounds to encompass the point given in v.
UT_API size_t format(char *buf, size_t bufsize, const UT_BoundingBoxT< T > &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.
UT_Vector3T< T > minDistToMaxOverlap(const UT_BoundingBoxT< T > &box) const
void enlargeBounds(const UT_Vector3T< T > &min, const UT_Vector3T< T > &max)
uint64 hash() const
Compute UT_BoundingBox hash.
UT_Vector3T< T > size() const
const T * getSerialized() const
GLenum GLuint GLenum GLsizei const GLchar * buf
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.
GLsizei const GLint box[]
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)
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)
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: