37 #ifndef INCLUDED_IMATHBOXALGO_H
38 #define INCLUDED_IMATHBOXALGO_H
98 for (
int i = 0; i <
int (box.
min.dimensions()); i++)
100 if (p[i] < box.
min[i])
102 else if (p[i] > box.
max[i])
116 return clip (p, box);
142 (d1.
y < d2.
y)? d1.
y: d2.
y,
143 (d1.
z < d2.
z)? d1.
z: d2.
z);
145 if (d.
x < d.
y && d.
x < d.
z)
147 q.
x = (d1.
x < d2.
x)? box.min.x: box.max.x;
151 q.
y = (d1.
y < d2.
y)? box.min.y: box.max.y;
155 q.
z = (d1.
z < d2.
z)? box.min.z: box.max.z;
163 template <
class S,
class T>
181 if (box.isEmpty() || box.isInfinite())
189 if (m[0][3] == 0 && m[1][3] == 0 && m[2][3] == 0 && m[3][3] == 1)
193 for (
int i = 0; i < 3; i++)
195 newBox.
min[i] = newBox.
max[i] = (
S) m[3][i];
197 for (
int j = 0; j < 3; j++)
201 a = (
S) m[j][i] * box.min[j];
202 b = (
S) m[j][i] * box.max[j];
228 points[0][0] = points[1][0] = points[2][0] = points[3][0] = box.min[0];
229 points[4][0] = points[5][0] = points[6][0] = points[7][0] = box.max[0];
231 points[0][1] = points[1][1] = points[4][1] = points[5][1] = box.min[1];
232 points[2][1] = points[3][1] = points[6][1] = points[7][1] = box.max[1];
234 points[0][2] = points[2][2] = points[4][2] = points[6][2] = box.min[2];
235 points[1][2] = points[3][2] = points[5][2] = points[7][2] = box.max[2];
239 for (
int i = 0; i < 8; i++)
245 template <
class S,
class T>
265 if (box.isEmpty() || box.isInfinite())
275 if (m[0][3] == 0 && m[1][3] == 0 && m[2][3] == 0 && m[3][3] == 1)
277 for (
int i = 0; i < 3; i++)
281 for (
int j = 0; j < 3; j++)
285 a = (
S) m[j][i] * box.min[j];
286 b = (
S) m[j][i] * box.max[j];
312 points[0][0] = points[1][0] = points[2][0] = points[3][0] = box.min[0];
313 points[4][0] = points[5][0] = points[6][0] = points[7][0] = box.max[0];
315 points[0][1] = points[1][1] = points[4][1] = points[5][1] = box.min[1];
316 points[2][1] = points[3][1] = points[6][1] = points[7][1] = box.max[1];
318 points[0][2] = points[2][2] = points[4][2] = points[6][2] = box.min[2];
319 points[1][2] = points[3][2] = points[5][2] = points[7][2] = box.max[2];
321 for (
int i = 0; i < 8; i++)
322 result.extendBy (points[i] * m);
326 template <
class S,
class T>
339 if (box.isEmpty() || box.isInfinite())
350 for (
int i = 0; i < 3; i++)
352 newBox.
min[i] = newBox.
max[i] = (
S) m[3][i];
354 for (
int j = 0; j < 3; j++)
358 a = (
S) m[j][i] * box.min[j];
359 b = (
S) m[j][i] * box.max[j];
377 template <
class S,
class T>
401 if (box.isInfinite())
410 for (
int i = 0; i < 3; i++)
414 for (
int j = 0; j < 3; j++)
418 a = (
S) m[j][i] * box.min[j];
419 b = (
S) m[j][i] * box.max[j];
503 T d1 =
b.max.x - r.
pos.x;
504 T d2 =
b.min.x - r.
pos.x;
507 (
abs (d1) < TMAX * r.
dir.x &&
508 abs (d2) < TMAX * r.
dir.x))
531 else if (r.
pos.x <
b.min.x || r.
pos.x >
b.max.x)
538 T d1 =
b.min.x - r.
pos.x;
539 T d2 =
b.max.x - r.
pos.x;
542 (
abs (d1) < -TMAX * r.
dir.x &&
543 abs (d2) < -TMAX * r.
dir.x))
566 else if (r.
pos.x <
b.min.x || r.
pos.x >
b.max.x)
578 T d1 =
b.max.y - r.
pos.y;
579 T d2 =
b.min.y - r.
pos.y;
582 (
abs (d1) < TMAX * r.
dir.y &&
583 abs (d2) < TMAX * r.
dir.y))
606 else if (r.
pos.y <
b.min.y || r.
pos.y >
b.max.y)
613 T d1 =
b.min.y - r.
pos.y;
614 T d2 =
b.max.y - r.
pos.y;
617 (
abs (d1) < -TMAX * r.
dir.y &&
618 abs (d2) < -TMAX * r.
dir.y))
641 else if (r.
pos.y <
b.min.y || r.
pos.y >
b.max.y)
653 T d1 =
b.max.z - r.
pos.z;
654 T d2 =
b.min.z - r.
pos.z;
657 (
abs (d1) < TMAX * r.
dir.z &&
658 abs (d2) < TMAX * r.
dir.z))
681 else if (r.
pos.z <
b.min.z || r.
pos.z >
b.max.z)
688 T d1 =
b.min.z - r.
pos.z;
689 T d2 =
b.max.z - r.
pos.z;
692 (
abs (d1) < -TMAX * r.
dir.z &&
693 abs (d2) < -TMAX * r.
dir.z))
716 else if (r.
pos.z <
b.min.z || r.
pos.z >
b.max.z)
722 return tFrontMax <= tBackMin;
763 if (
b.intersects (r.
pos))
797 if (r.
pos.x >
b.max.x)
800 T d =
b.max.x - r.
pos.x;
802 if (r.
dir.x > 1 || d < TMAX * r.
dir.x)
810 if (r.
pos.x <=
b.min.x)
812 T d =
b.min.x - r.
pos.x;
813 T t = (r.
dir.x > 1 || d < TMAX * r.
dir.x)? d / r.
dir.x: TMAX;
825 else if (r.
dir.x < 0)
827 if (r.
pos.x <
b.min.x)
830 T d =
b.min.x - r.
pos.x;
832 if (r.
dir.x < -1 || d > TMAX * r.
dir.x)
840 if (r.
pos.x >=
b.max.x)
842 T d =
b.max.x - r.
pos.x;
843 T t = (r.
dir.x < -1 || d > TMAX * r.
dir.x)? d / r.
dir.x: TMAX;
857 if (r.
pos.x <
b.min.x || r.
pos.x >
b.max.x)
867 if (r.
pos.y >
b.max.y)
870 T d =
b.max.y - r.
pos.y;
872 if (r.
dir.y > 1 || d < TMAX * r.
dir.y)
880 if (r.
pos.y <=
b.min.y)
882 T d =
b.min.y - r.
pos.y;
883 T t = (r.
dir.y > 1 || d < TMAX * r.
dir.y)? d / r.
dir.y: TMAX;
895 else if (r.
dir.y < 0)
897 if (r.
pos.y <
b.min.y)
900 T d =
b.min.y - r.
pos.y;
902 if (r.
dir.y < -1 || d > TMAX * r.
dir.y)
910 if (r.
pos.y >=
b.max.y)
912 T d =
b.max.y - r.
pos.y;
913 T t = (r.
dir.y < -1 || d > TMAX * r.
dir.y)? d / r.
dir.y: TMAX;
927 if (r.
pos.y <
b.min.y || r.
pos.y >
b.max.y)
937 if (r.
pos.z >
b.max.z)
940 T d =
b.max.z - r.
pos.z;
942 if (r.
dir.z > 1 || d < TMAX * r.
dir.z)
950 if (r.
pos.z <=
b.min.z)
952 T d =
b.min.z - r.
pos.z;
953 T t = (r.
dir.z > 1 || d < TMAX * r.
dir.z)? d / r.
dir.z: TMAX;
965 else if (r.
dir.z < 0)
967 if (r.
pos.z <
b.min.z)
970 T d =
b.min.z - r.
pos.z;
972 if (r.
dir.z < -1 || d > TMAX * r.
dir.z)
980 if (r.
pos.z >=
b.max.z)
982 T d =
b.max.z - r.
pos.z;
983 T t = (r.
dir.z < -1 || d > TMAX * r.
dir.z)? d / r.
dir.z: TMAX;
997 if (r.
pos.z <
b.min.z || r.
pos.z >
b.max.z)
1001 return tFrontMax <= tBackMin;
1016 #endif // INCLUDED_IMATHBOXALGO_H
#define IMATH_INTERNAL_NAMESPACE_HEADER_EXIT
#define IMATH_INTERNAL_NAMESPACE_HEADER_ENTER
GLboolean GLboolean GLboolean GLboolean a
Vec3< T > closestPointOnBox(const Vec3< T > &p, const Box< Vec3< T > > &box)
GLdouble GLdouble GLdouble GLdouble q
IMATH_INTERNAL_NAMESPACE_HEADER_ENTER T abs(T a)
typedef int(WINAPI *PFNWGLRELEASEPBUFFERDCARBPROC)(HPBUFFERARB hPbuffer
Box< Vec3< S > > affineTransform(const Box< Vec3< S > > &box, const Matrix44< T > &m)
bool findEntryAndExitPoints(const Line3< T > &r, const Box< Vec3< T > > &b, Vec3< T > &entry, Vec3< T > &exit)
void extendBy(const T &point)
Box< Vec3< S > > transform(const Box< Vec3< S > > &box, const Matrix44< T > &m)
GLdouble GLdouble GLdouble b
IMATH_INTERNAL_NAMESPACE_HEADER_ENTER T clip(const T &p, const Box< T > &box)
bool intersects(const Box< Vec3< T > > &b, const Line3< T > &r, Vec3< T > &ip)
GLuint GLfloat GLfloat GLfloat GLfloat GLfloat GLfloat GLfloat GLfloat GLfloat t1
GLuint GLdouble GLdouble GLint GLint const GLdouble * points
GLdouble GLdouble GLdouble r
T closestPointInBox(const T &p, const Box< T > &box)