diff options
author | click <none@none> | 2010-06-05 00:59:25 +0200 |
---|---|---|
committer | click <none@none> | 2010-06-05 00:59:25 +0200 |
commit | e77716188861d4aa83b227a90e04a66b63baeb1f (patch) | |
tree | ce72764181a760314ec851f7535052dcf75649db /dep/src/g3dlite/Intersect.cpp | |
parent | 1426c2970f42a2d065198806f750bf5dd28d580b (diff) |
HIGHLY EXPERIMENTAL - USE AT YOUR OWN RISK
Implement the use of the new vmap3-format by Lynx3d (mad props to you for this, and thanks for the talks earlier)
+ reduced Vmap size to less than one third, and improve precision
+ indoor/outdoor check which allows automatic unmounting of players
+ additional area information from WMOAreaTable.dbc, removed existing "hacks"
+ WMO liquid information for swimming and fishing correctly in buildings/cities/caves/instances (lava and slime WILL hurt from now on!)
- buildfiles for windows are not properly done, and will need to be sorted out
NOTE: Do NOT annoy Lynx3d about this, any issues with this "port" is entirely our fault !
THIS REVISION IS CONSIDERED UNSTABLE AND CONTAINS WORK IN PROGRESS - USE AT YOUR OWN RISK!
--HG--
branch : trunk
Diffstat (limited to 'dep/src/g3dlite/Intersect.cpp')
-rw-r--r-- | dep/src/g3dlite/Intersect.cpp | 844 |
1 files changed, 844 insertions, 0 deletions
diff --git a/dep/src/g3dlite/Intersect.cpp b/dep/src/g3dlite/Intersect.cpp new file mode 100644 index 00000000000..929a2e4e670 --- /dev/null +++ b/dep/src/g3dlite/Intersect.cpp @@ -0,0 +1,844 @@ +/** + @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 + +} |