diff options
Diffstat (limited to 'dep/src/g3dlite/Intersect.cpp')
-rw-r--r-- | dep/src/g3dlite/Intersect.cpp | 844 |
1 files changed, 0 insertions, 844 deletions
diff --git a/dep/src/g3dlite/Intersect.cpp b/dep/src/g3dlite/Intersect.cpp deleted file mode 100644 index 929a2e4e670..00000000000 --- a/dep/src/g3dlite/Intersect.cpp +++ /dev/null @@ -1,844 +0,0 @@ -/** - @file Intersect.cpp - - @maintainer Morgan McGuire, http://graphics.cs.williams.edu - - @created 2009-06-29 - @edited 2009-06-29 - - Copyright 2000-2009, Morgan McGuire. - All rights reserved. - - From the G3D Innovation Engine - http://g3d.sf.net - */ -#include "G3D/Intersect.h" - -namespace G3D { - -#ifdef _MSC_VER -// Turn on fast floating-point optimizations -#pragma float_control( push ) -#pragma fp_contract( on ) -#pragma fenv_access( off ) -#pragma float_control( except, off ) -#pragma float_control( precise, off ) -#endif - -bool __fastcall Intersect::rayAABox(const Ray& ray, const AABox& box) { - switch (ray.classification) { - case Ray::MMM: - - if ((ray.m_origin.x < box.lo.x) || (ray.m_origin.y < box.lo.y) || (ray.m_origin.z < box.lo.z) - || (ray.jbyi * box.lo.x - box.hi.y + ray.c_xy > 0) - || (ray.ibyj * box.lo.y - box.hi.x + ray.c_yx > 0) - || (ray.jbyk * box.lo.z - box.hi.y + ray.c_zy > 0) - || (ray.kbyj * box.lo.y - box.hi.z + ray.c_yz > 0) - || (ray.kbyi * box.lo.x - box.hi.z + ray.c_xz > 0) - || (ray.ibyk * box.lo.z - box.hi.x + ray.c_zx > 0) - ) - return false; - - return true; - - case Ray::MMP: - - if ((ray.m_origin.x < box.lo.x) || (ray.m_origin.y < box.lo.y) || (ray.m_origin.z > box.hi.z) - || (ray.jbyi * box.lo.x - box.hi.y + ray.c_xy > 0) - || (ray.ibyj * box.lo.y - box.hi.x + ray.c_yx > 0) - || (ray.jbyk * box.hi.z - box.hi.y + ray.c_zy > 0) - || (ray.kbyj * box.lo.y - box.lo.z + ray.c_yz < 0) - || (ray.kbyi * box.lo.x - box.lo.z + ray.c_xz < 0) - || (ray.ibyk * box.hi.z - box.hi.x + ray.c_zx > 0) - ) - return false; - - return true; - - case Ray::MPM: - - if ((ray.m_origin.x < box.lo.x) || (ray.m_origin.y > box.hi.y) || (ray.m_origin.z < box.lo.z) - || (ray.jbyi * box.lo.x - box.lo.y + ray.c_xy < 0) - || (ray.ibyj * box.hi.y - box.hi.x + ray.c_yx > 0) - || (ray.jbyk * box.lo.z - box.lo.y + ray.c_zy < 0) - || (ray.kbyj * box.hi.y - box.hi.z + ray.c_yz > 0) - || (ray.kbyi * box.lo.x - box.hi.z + ray.c_xz > 0) - || (ray.ibyk * box.lo.z - box.hi.x + ray.c_zx > 0) - ) - return false; - - return true; - - case Ray::MPP: - - if ((ray.m_origin.x < box.lo.x) || (ray.m_origin.y > box.hi.y) || (ray.m_origin.z > box.hi.z) - || (ray.jbyi * box.lo.x - box.lo.y + ray.c_xy < 0) - || (ray.ibyj * box.hi.y - box.hi.x + ray.c_yx > 0) - || (ray.jbyk * box.hi.z - box.lo.y + ray.c_zy < 0) - || (ray.kbyj * box.hi.y - box.lo.z + ray.c_yz < 0) - || (ray.kbyi * box.lo.x - box.lo.z + ray.c_xz < 0) - || (ray.ibyk * box.hi.z - box.hi.x + ray.c_zx > 0) - ) - return false; - - return true; - - case Ray::PMM: - - if ((ray.m_origin.x > box.hi.x) || (ray.m_origin.y < box.lo.y) || (ray.m_origin.z < box.lo.z) - || (ray.jbyi * box.hi.x - box.hi.y + ray.c_xy > 0) - || (ray.ibyj * box.lo.y - box.lo.x + ray.c_yx < 0) - || (ray.jbyk * box.lo.z - box.hi.y + ray.c_zy > 0) - || (ray.kbyj * box.lo.y - box.hi.z + ray.c_yz > 0) - || (ray.kbyi * box.hi.x - box.hi.z + ray.c_xz > 0) - || (ray.ibyk * box.lo.z - box.lo.x + ray.c_zx < 0) - ) - return false; - - return true; - - case Ray::PMP: - - if ((ray.m_origin.x > box.hi.x) || (ray.m_origin.y < box.lo.y) || (ray.m_origin.z > box.hi.z) - || (ray.jbyi * box.hi.x - box.hi.y + ray.c_xy > 0) - || (ray.ibyj * box.lo.y - box.lo.x + ray.c_yx < 0) - || (ray.jbyk * box.hi.z - box.hi.y + ray.c_zy > 0) - || (ray.kbyj * box.lo.y - box.lo.z + ray.c_yz < 0) - || (ray.kbyi * box.hi.x - box.lo.z + ray.c_xz < 0) - || (ray.ibyk * box.hi.z - box.lo.x + ray.c_zx < 0) - ) - return false; - - return true; - - case Ray::PPM: - - if ((ray.m_origin.x > box.hi.x) || (ray.m_origin.y > box.hi.y) || (ray.m_origin.z < box.lo.z) - || (ray.jbyi * box.hi.x - box.lo.y + ray.c_xy < 0) - || (ray.ibyj * box.hi.y - box.lo.x + ray.c_yx < 0) - || (ray.jbyk * box.lo.z - box.lo.y + ray.c_zy < 0) - || (ray.kbyj * box.hi.y - box.hi.z + ray.c_yz > 0) - || (ray.kbyi * box.hi.x - box.hi.z + ray.c_xz > 0) - || (ray.ibyk * box.lo.z - box.lo.x + ray.c_zx < 0) - ) - return false; - - return true; - - case Ray::PPP: - - if ((ray.m_origin.x > box.hi.x) || (ray.m_origin.y > box.hi.y) || (ray.m_origin.z > box.hi.z) - || (ray.jbyi * box.hi.x - box.lo.y + ray.c_xy < 0) - || (ray.ibyj * box.hi.y - box.lo.x + ray.c_yx < 0) - || (ray.jbyk * box.hi.z - box.lo.y + ray.c_zy < 0) - || (ray.kbyj * box.hi.y - box.lo.z + ray.c_yz < 0) - || (ray.kbyi * box.hi.x - box.lo.z + ray.c_xz < 0) - || (ray.ibyk * box.hi.z - box.lo.x + ray.c_zx < 0)) { - return false; - } - - return true; - - case Ray::OMM: - - if((ray.m_origin.x < box.lo.x) || (ray.m_origin.x > box.hi.x) - || (ray.m_origin.y < box.lo.y) || (ray.m_origin.z < box.lo.z) - || (ray.jbyk * box.lo.z - box.hi.y + ray.c_zy > 0) - || (ray.kbyj * box.lo.y - box.hi.z + ray.c_yz > 0) - ) - return false; - - return true; - - case Ray::OMP: - - if((ray.m_origin.x < box.lo.x) || (ray.m_origin.x > box.hi.x) - || (ray.m_origin.y < box.lo.y) || (ray.m_origin.z > box.hi.z) - || (ray.jbyk * box.hi.z - box.hi.y + ray.c_zy > 0) - || (ray.kbyj * box.lo.y - box.lo.z + ray.c_yz < 0) - ) - return false; - - return true; - - case Ray::OPM: - - if((ray.m_origin.x < box.lo.x) || (ray.m_origin.x > box.hi.x) - || (ray.m_origin.y > box.hi.y) || (ray.m_origin.z < box.lo.z) - || (ray.jbyk * box.lo.z - box.lo.y + ray.c_zy < 0) - || (ray.kbyj * box.hi.y - box.hi.z + ray.c_yz > 0) - ) - return false; - - return true; - - case Ray::OPP: - - if((ray.m_origin.x < box.lo.x) || (ray.m_origin.x > box.hi.x) - || (ray.m_origin.y > box.hi.y) || (ray.m_origin.z > box.hi.z) - || (ray.jbyk * box.hi.z - box.lo.y + ray.c_zy < 0) - || (ray.kbyj * box.hi.y - box.lo.z + ray.c_yz < 0) - ) - return false; - - return true; - - case Ray::MOM: - - if((ray.m_origin.y < box.lo.y) || (ray.m_origin.y > box.hi.y) - || (ray.m_origin.x < box.lo.x) || (ray.m_origin.z < box.lo.z) - || (ray.kbyi * box.lo.x - box.hi.z + ray.c_xz > 0) - || (ray.ibyk * box.lo.z - box.hi.x + ray.c_zx > 0) - ) - return false; - - return true; - - case Ray::MOP: - - if((ray.m_origin.y < box.lo.y) || (ray.m_origin.y > box.hi.y) - || (ray.m_origin.x < box.lo.x) || (ray.m_origin.z > box.hi.z) - || (ray.kbyi * box.lo.x - box.lo.z + ray.c_xz < 0) - || (ray.ibyk * box.hi.z - box.hi.x + ray.c_zx > 0) - ) - return false; - - return true; - - case Ray::POM: - - if((ray.m_origin.y < box.lo.y) || (ray.m_origin.y > box.hi.y) - || (ray.m_origin.x > box.hi.x) || (ray.m_origin.z < box.lo.z) - || (ray.kbyi * box.hi.x - box.hi.z + ray.c_xz > 0) - || (ray.ibyk * box.lo.z - box.lo.x + ray.c_zx < 0) - ) - return false; - - return true; - - case Ray::POP: - - if((ray.m_origin.y < box.lo.y) || (ray.m_origin.y > box.hi.y) - || (ray.m_origin.x > box.hi.x) || (ray.m_origin.z > box.hi.z) - || (ray.kbyi * box.hi.x - box.lo.z + ray.c_xz < 0) - || (ray.ibyk * box.hi.z - box.lo.x + ray.c_zx < 0) - ) - return false; - - return true; - - case Ray::MMO: - - if((ray.m_origin.z < box.lo.z) || (ray.m_origin.z > box.hi.z) - || (ray.m_origin.x < box.lo.x) || (ray.m_origin.y < box.lo.y) - || (ray.jbyi * box.lo.x - box.hi.y + ray.c_xy > 0) - || (ray.ibyj * box.lo.y - box.hi.x + ray.c_yx > 0) - ) - return false; - - return true; - - case Ray::MPO: - - if((ray.m_origin.z < box.lo.z) || (ray.m_origin.z > box.hi.z) - || (ray.m_origin.x < box.lo.x) || (ray.m_origin.y > box.hi.y) - || (ray.jbyi * box.lo.x - box.lo.y + ray.c_xy < 0) - || (ray.ibyj * box.hi.y - box.hi.x + ray.c_yx > 0) - ) - return false; - - return true; - - case Ray::PMO: - - if((ray.m_origin.z < box.lo.z) || (ray.m_origin.z > box.hi.z) - || (ray.m_origin.x > box.hi.x) || (ray.m_origin.y < box.lo.y) - || (ray.jbyi * box.hi.x - box.hi.y + ray.c_xy > 0) - || (ray.ibyj * box.lo.y - box.lo.x + ray.c_yx < 0) - ) - return false; - - return true; - - case Ray::PPO: - - if((ray.m_origin.z < box.lo.z) || (ray.m_origin.z > box.hi.z) - || (ray.m_origin.x > box.hi.x) || (ray.m_origin.y > box.hi.y) - || (ray.jbyi * box.hi.x - box.lo.y + ray.c_xy < 0) - || (ray.ibyj * box.hi.y - box.lo.x + ray.c_yx < 0) - ) - return false; - - return true; - - case Ray::MOO: - - if((ray.m_origin.x < box.lo.x) - || (ray.m_origin.y < box.lo.y) || (ray.m_origin.y > box.hi.y) - || (ray.m_origin.z < box.lo.z) || (ray.m_origin.z > box.hi.z) - ) - return false; - - return true; - - case Ray::POO: - - if((ray.m_origin.x > box.hi.x) - || (ray.m_origin.y < box.lo.y) || (ray.m_origin.y > box.hi.y) - || (ray.m_origin.z < box.lo.z) || (ray.m_origin.z > box.hi.z) - ) - return false; - - return true; - - case Ray::OMO: - - if((ray.m_origin.y < box.lo.y) - || (ray.m_origin.x < box.lo.x) || (ray.m_origin.x > box.hi.x) - || (ray.m_origin.z < box.lo.z) || (ray.m_origin.z > box.hi.z) - ) - return false; - - case Ray::OPO: - - if((ray.m_origin.y > box.hi.y) - || (ray.m_origin.x < box.lo.x) || (ray.m_origin.x > box.hi.x) - || (ray.m_origin.z < box.lo.z) || (ray.m_origin.z > box.hi.z) - ) - return false; - - case Ray::OOM: - - if((ray.m_origin.z < box.lo.z) - || (ray.m_origin.x < box.lo.x) || (ray.m_origin.x > box.hi.x) - || (ray.m_origin.y < box.lo.y) || (ray.m_origin.y > box.hi.y) - ) - return false; - - case Ray::OOP: - - if((ray.m_origin.z > box.hi.z) - || (ray.m_origin.x < box.lo.x) || (ray.m_origin.x > box.hi.x) - || (ray.m_origin.y < box.lo.y) || (ray.m_origin.y > box.hi.y) - ) - return false; - - return true; - - } - - return false; -} - - -bool __fastcall Intersect::rayAABox(const Ray& ray, const AABox& box, float& time) { - - switch (ray.classification) { - case Ray::MMM: - { - if ((ray.m_origin.x < box.lo.x) || (ray.m_origin.y < box.lo.y) || (ray.m_origin.z < box.lo.z) - || (ray.jbyi * box.lo.x - box.hi.y + ray.c_xy > 0) - || (ray.ibyj * box.lo.y - box.hi.x + ray.c_yx > 0) - || (ray.jbyk * box.lo.z - box.hi.y + ray.c_zy > 0) - || (ray.kbyj * box.lo.y - box.hi.z + ray.c_yz > 0) - || (ray.kbyi * box.lo.x - box.hi.z + ray.c_xz > 0) - || (ray.ibyk * box.lo.z - box.hi.x + ray.c_zx > 0)) { - return false; - } - - // compute the intersection distance - - time = (box.hi.x - ray.m_origin.x) * ray.m_invDirection.x; - float t1 = (box.hi.y - ray.m_origin.y) * ray.m_invDirection.y; - if (t1 > time) { - time = t1; - } - - float t2 = (box.hi.z - ray.m_origin.z) * ray.m_invDirection.z; - if (t2 > time) { - time = t2; - } - - return true; - } - - case Ray::MMP: - { - if ((ray.m_origin.x < box.lo.x) || (ray.m_origin.y < box.lo.y) || (ray.m_origin.z > box.hi.z) - || (ray.jbyi * box.lo.x - box.hi.y + ray.c_xy > 0) - || (ray.ibyj * box.lo.y - box.hi.x + ray.c_yx > 0) - || (ray.jbyk * box.hi.z - box.hi.y + ray.c_zy > 0) - || (ray.kbyj * box.lo.y - box.lo.z + ray.c_yz < 0) - || (ray.kbyi * box.lo.x - box.lo.z + ray.c_xz < 0) - || (ray.ibyk * box.hi.z - box.hi.x + ray.c_zx > 0)) { - return false; - } - - time = (box.hi.x - ray.m_origin.x) * ray.m_invDirection.x; - float t1 = (box.hi.y - ray.m_origin.y) * ray.m_invDirection.y; - if (t1 > time) { - time = t1; - } - float t2 = (box.lo.z - ray.m_origin.z) * ray.m_invDirection.z; - if (t2 > time) { - time = t2; - } - - return true; - } - - case Ray::MPM: - { - if ((ray.m_origin.x < box.lo.x) || (ray.m_origin.y > box.hi.y) || (ray.m_origin.z < box.lo.z) - || (ray.jbyi * box.lo.x - box.lo.y + ray.c_xy < 0) - || (ray.ibyj * box.hi.y - box.hi.x + ray.c_yx > 0) - || (ray.jbyk * box.lo.z - box.lo.y + ray.c_zy < 0) - || (ray.kbyj * box.hi.y - box.hi.z + ray.c_yz > 0) - || (ray.kbyi * box.lo.x - box.hi.z + ray.c_xz > 0) - || (ray.ibyk * box.lo.z - box.hi.x + ray.c_zx > 0)) { - return false; - } - - time = (box.hi.x - ray.m_origin.x) * ray.m_invDirection.x; - float t1 = (box.lo.y - ray.m_origin.y) * ray.m_invDirection.y; - if (t1 > time) { - time = t1; - } - float t2 = (box.hi.z - ray.m_origin.z) * ray.m_invDirection.z; - if (t2 > time) { - time = t2; - } - - return true; - } - - case Ray::MPP: - { - if ((ray.m_origin.x < box.lo.x) || (ray.m_origin.y > box.hi.y) || (ray.m_origin.z > box.hi.z) - || (ray.jbyi * box.lo.x - box.lo.y + ray.c_xy < 0) - || (ray.ibyj * box.hi.y - box.hi.x + ray.c_yx > 0) - || (ray.jbyk * box.hi.z - box.lo.y + ray.c_zy < 0) - || (ray.kbyj * box.hi.y - box.lo.z + ray.c_yz < 0) - || (ray.kbyi * box.lo.x - box.lo.z + ray.c_xz < 0) - || (ray.ibyk * box.hi.z - box.hi.x + ray.c_zx > 0)) { - return false; - } - - time = (box.hi.x - ray.m_origin.x) * ray.m_invDirection.x; - float t1 = (box.lo.y - ray.m_origin.y) * ray.m_invDirection.y; - if (t1 > time) { - time = t1; - } - float t2 = (box.lo.z - ray.m_origin.z) * ray.m_invDirection.z; - if (t2 > time) { - time = t2; - } - - return true; - } - - case Ray::PMM: - { - if ((ray.m_origin.x > box.hi.x) || (ray.m_origin.y < box.lo.y) || (ray.m_origin.z < box.lo.z) - || (ray.jbyi * box.hi.x - box.hi.y + ray.c_xy > 0) - || (ray.ibyj * box.lo.y - box.lo.x + ray.c_yx < 0) - || (ray.jbyk * box.lo.z - box.hi.y + ray.c_zy > 0) - || (ray.kbyj * box.lo.y - box.hi.z + ray.c_yz > 0) - || (ray.kbyi * box.hi.x - box.hi.z + ray.c_xz > 0) - || (ray.ibyk * box.lo.z - box.lo.x + ray.c_zx < 0)) { - return false; - } - - time = (box.lo.x - ray.m_origin.x) * ray.m_invDirection.x; - float t1 = (box.hi.y - ray.m_origin.y) * ray.m_invDirection.y; - if (t1 > time) { - time = t1; - } - float t2 = (box.hi.z - ray.m_origin.z) * ray.m_invDirection.z; - if (t2 > time) { - time = t2; - } - - return true; - } - - - case Ray::PMP: - { - if ((ray.m_origin.x > box.hi.x) || (ray.m_origin.y < box.lo.y) || (ray.m_origin.z > box.hi.z) - || (ray.jbyi * box.hi.x - box.hi.y + ray.c_xy > 0) - || (ray.ibyj * box.lo.y - box.lo.x + ray.c_yx < 0) - || (ray.jbyk * box.hi.z - box.hi.y + ray.c_zy > 0) - || (ray.kbyj * box.lo.y - box.lo.z + ray.c_yz < 0) - || (ray.kbyi * box.hi.x - box.lo.z + ray.c_xz < 0) - || (ray.ibyk * box.hi.z - box.lo.x + ray.c_zx < 0)) { - return false; - } - - time = (box.lo.x - ray.m_origin.x) * ray.m_invDirection.x; - float t1 = (box.hi.y - ray.m_origin.y) * ray.m_invDirection.y; - if (t1 > time) { - time = t1; - } - float t2 = (box.lo.z - ray.m_origin.z) * ray.m_invDirection.z; - if (t2 > time) { - time = t2; - } - - return true; - } - - case Ray::PPM: - { - if ((ray.m_origin.x > box.hi.x) || (ray.m_origin.y > box.hi.y) || (ray.m_origin.z < box.lo.z) - || (ray.jbyi * box.hi.x - box.lo.y + ray.c_xy < 0) - || (ray.ibyj * box.hi.y - box.lo.x + ray.c_yx < 0) - || (ray.jbyk * box.lo.z - box.lo.y + ray.c_zy < 0) - || (ray.kbyj * box.hi.y - box.hi.z + ray.c_yz > 0) - || (ray.kbyi * box.hi.x - box.hi.z + ray.c_xz > 0) - || (ray.ibyk * box.lo.z - box.lo.x + ray.c_zx < 0)) { - return false; - } - - time = (box.lo.x - ray.m_origin.x) * ray.m_invDirection.x; - float t1 = (box.lo.y - ray.m_origin.y) * ray.m_invDirection.y; - if (t1 > time) { - time = t1; - } - float t2 = (box.hi.z - ray.m_origin.z) * ray.m_invDirection.z; - if (t2 > time) { - time = t2; - } - - return true; - } - - case Ray::PPP: - { - if ((ray.m_origin.x > box.hi.x) || (ray.m_origin.y > box.hi.y) || (ray.m_origin.z > box.hi.z) - || (ray.jbyi * box.hi.x - box.lo.y + ray.c_xy < 0) - || (ray.ibyj * box.hi.y - box.lo.x + ray.c_yx < 0) - || (ray.jbyk * box.hi.z - box.lo.y + ray.c_zy < 0) - || (ray.kbyj * box.hi.y - box.lo.z + ray.c_yz < 0) - || (ray.kbyi * box.hi.x - box.lo.z + ray.c_xz < 0) - || (ray.ibyk * box.hi.z - box.lo.x + ray.c_zx < 0)) { - return false; - } - - time = (box.lo.x - ray.m_origin.x) * ray.m_invDirection.x; - float t1 = (box.lo.y - ray.m_origin.y) * ray.m_invDirection.y; - if (t1 > time) { - time = t1; - } - float t2 = (box.lo.z - ray.m_origin.z) * ray.m_invDirection.z; - if (t2 > time) { - time = t2; - } - - return true; - } - - case Ray::OMM: - { - if((ray.m_origin.x < box.lo.x) || (ray.m_origin.x > box.hi.x) - || (ray.m_origin.y < box.lo.y) || (ray.m_origin.z < box.lo.z) - || (ray.jbyk * box.lo.z - box.hi.y + ray.c_zy > 0) - || (ray.kbyj * box.lo.y - box.hi.z + ray.c_yz > 0)) { - return false; - } - - time = (box.hi.y - ray.m_origin.y) * ray.m_invDirection.y; - float t2 = (box.hi.z - ray.m_origin.z) * ray.m_invDirection.z; - if (t2 > time) { - time = t2; - } - - return true; - } - - case Ray::OMP: - { - if((ray.m_origin.x < box.lo.x) || (ray.m_origin.x > box.hi.x) - || (ray.m_origin.y < box.lo.y) || (ray.m_origin.z > box.hi.z) - || (ray.jbyk * box.hi.z - box.hi.y + ray.c_zy > 0) - || (ray.kbyj * box.lo.y - box.lo.z + ray.c_yz < 0)) { - return false; - } - - time = (box.hi.y - ray.m_origin.y) * ray.m_invDirection.y; - float t2 = (box.lo.z - ray.m_origin.z) * ray.m_invDirection.z; - if (t2 > time) { - time = t2; - } - - return true; - } - - case Ray::OPM: - { - if((ray.m_origin.x < box.lo.x) || (ray.m_origin.x > box.hi.x) - || (ray.m_origin.y > box.hi.y) || (ray.m_origin.z < box.lo.z) - || (ray.jbyk * box.lo.z - box.lo.y + ray.c_zy < 0) - || (ray.kbyj * box.hi.y - box.hi.z + ray.c_yz > 0)) { - return false; - } - - time = (box.lo.y - ray.m_origin.y) * ray.m_invDirection.y; - float t2 = (box.hi.z - ray.m_origin.z) * ray.m_invDirection.z; - if (t2 > time) { - time = t2; - } - - return true; - } - - case Ray::OPP: - { - if((ray.m_origin.x < box.lo.x) || (ray.m_origin.x > box.hi.x) - || (ray.m_origin.y > box.hi.y) || (ray.m_origin.z > box.hi.z) - || (ray.jbyk * box.hi.z - box.lo.y + ray.c_zy < 0) - || (ray.kbyj * box.hi.y - box.lo.z + ray.c_yz < 0)) { - return false; - } - - time = (box.lo.y - ray.m_origin.y) * ray.m_invDirection.y; - float t2 = (box.lo.z - ray.m_origin.z) * ray.m_invDirection.z; - if (t2 > time) { - time = t2; - } - - return true; - } - - - case Ray::MOM: - { - if((ray.m_origin.y < box.lo.y) || (ray.m_origin.y > box.hi.y) - || (ray.m_origin.x < box.lo.x) || (ray.m_origin.z < box.lo.z) - || (ray.kbyi * box.lo.x - box.hi.z + ray.c_xz > 0) - || (ray.ibyk * box.lo.z - box.hi.x + ray.c_zx > 0)) { - return false; - } - - time = (box.hi.x - ray.m_origin.x) * ray.m_invDirection.x; - float t2 = (box.hi.z - ray.m_origin.z) * ray.m_invDirection.z; - if (t2 > time) { - time = t2; - } - - return true; - } - - - case Ray::MOP: - { - if((ray.m_origin.y < box.lo.y) || (ray.m_origin.y > box.hi.y) - || (ray.m_origin.x < box.lo.x) || (ray.m_origin.z > box.hi.z) - || (ray.kbyi * box.lo.x - box.lo.z + ray.c_xz < 0) - || (ray.ibyk * box.hi.z - box.hi.x + ray.c_zx > 0)) { - return false; - } - - time = (box.hi.x - ray.m_origin.x) * ray.m_invDirection.x; - float t2 = (box.lo.z - ray.m_origin.z) * ray.m_invDirection.z; - if (t2 > time) { - time = t2; - } - - return true; - } - - case Ray::POM: - { - if((ray.m_origin.y < box.lo.y) || (ray.m_origin.y > box.hi.y) - || (ray.m_origin.x > box.hi.x) || (ray.m_origin.z < box.lo.z) - || (ray.kbyi * box.hi.x - box.hi.z + ray.c_xz > 0) - || (ray.ibyk * box.lo.z - box.lo.x + ray.c_zx < 0)) { - return false; - } - - time = (box.lo.x - ray.m_origin.x) * ray.m_invDirection.x; - float t2 = (box.hi.z - ray.m_origin.z) * ray.m_invDirection.z; - if (t2 > time) { - time = t2; - } - - return true; - } - - - case Ray::POP: - { - if((ray.m_origin.y < box.lo.y) || (ray.m_origin.y > box.hi.y) - || (ray.m_origin.x > box.hi.x) || (ray.m_origin.z > box.hi.z) - || (ray.kbyi * box.hi.x - box.lo.z + ray.c_xz < 0) - || (ray.ibyk * box.hi.z - box.lo.x + ray.c_zx < 0)) { - return false; - } - - time = (box.lo.x - ray.m_origin.x) * ray.m_invDirection.x; - float t2 = (box.lo.z - ray.m_origin.z) * ray.m_invDirection.z; - if (t2 > time) { - time = t2; - } - - return true; - } - - case Ray::MMO: - { - if((ray.m_origin.z < box.lo.z) || (ray.m_origin.z > box.hi.z) - || (ray.m_origin.x < box.lo.x) || (ray.m_origin.y < box.lo.y) - || (ray.jbyi * box.lo.x - box.hi.y + ray.c_xy > 0) - || (ray.ibyj * box.lo.y - box.hi.x + ray.c_yx > 0)) { - return false; - } - - time = (box.hi.x - ray.m_origin.x) * ray.m_invDirection.x; - float t1 = (box.hi.y - ray.m_origin.y) * ray.m_invDirection.y; - if (t1 > time) { - time = t1; - } - - return true; - } - - case Ray::MPO: - { - if((ray.m_origin.z < box.lo.z) || (ray.m_origin.z > box.hi.z) - || (ray.m_origin.x < box.lo.x) || (ray.m_origin.y > box.hi.y) - || (ray.jbyi * box.lo.x - box.lo.y + ray.c_xy < 0) - || (ray.ibyj * box.hi.y - box.hi.x + ray.c_yx > 0)) { - return false; - } - - time = (box.hi.x - ray.m_origin.x) * ray.m_invDirection.x; - float t1 = (box.lo.y - ray.m_origin.y) * ray.m_invDirection.y; - if (t1 > time) { - time = t1; - } - - return true; - } - - - case Ray::PMO: - { - if((ray.m_origin.z < box.lo.z) || (ray.m_origin.z > box.hi.z) - || (ray.m_origin.x > box.hi.x) || (ray.m_origin.y < box.lo.y) - || (ray.jbyi * box.hi.x - box.hi.y + ray.c_xy > 0) - || (ray.ibyj * box.lo.y - box.lo.x + ray.c_yx < 0)) { - return false; - } - - time = (box.lo.x - ray.m_origin.x) * ray.m_invDirection.x; - float t1 = (box.hi.y - ray.m_origin.y) * ray.m_invDirection.y; - if (t1 > time) { - time = t1; - } - - return true; - } - - case Ray::PPO: - { - if((ray.m_origin.z < box.lo.z) || (ray.m_origin.z > box.hi.z) - || (ray.m_origin.x > box.hi.x) || (ray.m_origin.y > box.hi.y) - || (ray.jbyi * box.hi.x - box.lo.y + ray.c_xy < 0) - || (ray.ibyj * box.hi.y - box.lo.x + ray.c_yx < 0)) { - return false; - } - - time = (box.lo.x - ray.m_origin.x) * ray.m_invDirection.x; - float t1 = (box.lo.y - ray.m_origin.y) * ray.m_invDirection.y; - if (t1 > time) { - time = t1; - } - - return true; - } - - - case Ray::MOO: - { - if((ray.m_origin.x < box.lo.x) - || (ray.m_origin.y < box.lo.y) || (ray.m_origin.y > box.hi.y) - || (ray.m_origin.z < box.lo.z) || (ray.m_origin.z > box.hi.z)) { - return false; - } - - time = (box.hi.x - ray.m_origin.x) * ray.m_invDirection.x; - return true; - } - - case Ray::POO: - { - if ((ray.m_origin.x > box.hi.x) - || (ray.m_origin.y < box.lo.y) || (ray.m_origin.y > box.hi.y) - || (ray.m_origin.z < box.lo.z) || (ray.m_origin.z > box.hi.z)) { - return false; - } - - time = (box.lo.x - ray.m_origin.x) * ray.m_invDirection.x; - return true; - } - - case Ray::OMO: - { - if ((ray.m_origin.y < box.lo.y) - || (ray.m_origin.x < box.lo.x) || (ray.m_origin.x > box.hi.x) - || (ray.m_origin.z < box.lo.z) || (ray.m_origin.z > box.hi.z)) { - return false; - } - - time = (box.hi.y - ray.m_origin.y) * ray.m_invDirection.y; - return true; - } - - case Ray::OPO: - { - if ((ray.m_origin.y > box.hi.y) - || (ray.m_origin.x < box.lo.x) || (ray.m_origin.x > box.hi.x) - || (ray.m_origin.z < box.lo.z) || (ray.m_origin.z > box.hi.z)) { - return false; - } - - time = (box.lo.y - ray.m_origin.y) * ray.m_invDirection.y; - return true; - } - - - case Ray::OOM: - { - if ((ray.m_origin.z < box.lo.z) - || (ray.m_origin.x < box.lo.x) || (ray.m_origin.x > box.hi.x) - || (ray.m_origin.y < box.lo.y) || (ray.m_origin.y > box.hi.y)) { - return false; - } - - time = (box.hi.z - ray.m_origin.z) * ray.m_invDirection.z; - return true; - } - - case Ray::OOP: - { - if ((ray.m_origin.z > box.hi.z) - || (ray.m_origin.x < box.lo.x) || (ray.m_origin.x > box.hi.x) - || (ray.m_origin.y < box.lo.y) || (ray.m_origin.y > box.hi.y)) { - return false; - } - - time = (box.lo.z - ray.m_origin.z) * ray.m_invDirection.z; - return true; - } - } - - return false; -} - -#ifdef _MSC_VER -// Turn off fast floating-point optimizations -#pragma float_control( pop ) -#endif - -} |