From b32a0e34910dc1b3c1ae8598c752580d048a1519 Mon Sep 17 00:00:00 2001 From: "erwin.coumans" Date: Thu, 16 Oct 2008 20:19:01 +0000 Subject: [PATCH] Removed ray-AABB slopes code again, we are not using it and it is archived in Subversion repo now. --- src/LinearMath/btAabbUtil2.h | 627 ----------------------------------- 1 file changed, 627 deletions(-) diff --git a/src/LinearMath/btAabbUtil2.h b/src/LinearMath/btAabbUtil2.h index ddc543662..6fbbac302 100644 --- a/src/LinearMath/btAabbUtil2.h +++ b/src/LinearMath/btAabbUtil2.h @@ -22,8 +22,6 @@ subject to the following restrictions: #include "btMinMax.h" -#define TEST_RAY_SLOPES 1 - SIMD_FORCE_INLINE void AabbExpand (btVector3& aabbMin, btVector3& aabbMax, @@ -87,631 +85,6 @@ SIMD_FORCE_INLINE int btOutcode(const btVector3& p,const btVector3& halfExtent) (p.getZ() > halfExtent.getZ() ? 0x20 : 0x0); } -/// http://jgt.akpeters.com/papers/EisemannEtAl07/ -/// See test case in btDbvt::rayTestInternal on dynamic AABB tree, Bullet/src/BulletCollision/BroadphaseCollision/btDbvt.h - - -enum CLASSIFICATION -{ MMM, MMP, MPM, MPP, PMM, PMP, PPM, PPP, POO, MOO, OPO, OMO, OOP, OOM, - OMM,OMP,OPM,OPP,MOM,MOP,POM,POP,MMO,MPO,PMO,PPO}; - -struct btRaySlope -{ - //common variables - float x, y, z; // ray origin - float i, j, k; // ray direction - float ii, ij, ik; // inverses of direction components - - // ray slope - int classification; - float ibyj, jbyi, kbyj, jbyk, ibyk, kbyi; //slope - float c_xy, c_xz, c_yx, c_yz, c_zx, c_zy; -}; - -struct btAaboxSlope -{ - float x0, y0, z0, x1, y1, z1; -}; - -SIMD_FORCE_INLINE void btMakeRaySlope(float x, float y, float z, float i, float j, float k, btRaySlope *r) -{ - //common variables - r->x = x; - r->y = y; - r->z = z; - r->i = i; - r->j = j; - r->k = k; - - r->ii = 1.0f/i; - r->ij = 1.0f/j; - r->ik = 1.0f/k; - - //ray slope - r->ibyj = r->i * r->ij; - r->jbyi = r->j * r->ii; - r->jbyk = r->j * r->ik; - r->kbyj = r->k * r->ij; - r->ibyk = r->i * r->ik; - r->kbyi = r->k * r->ii; - r->c_xy = r->y - r->jbyi * r->x; - r->c_xz = r->z - r->kbyi * r->x; - r->c_yx = r->x - r->ibyj * r->y; - r->c_yz = r->z - r->kbyj * r->y; - r->c_zx = r->x - r->ibyk * r->z; - r->c_zy = r->y - r->jbyk * r->z; - - //ray slope classification - if(i < 0) - { - if(j < 0) - { - if(k < 0) - { - r->classification = MMM; - } - else if(k > 0){ - r->classification = MMP; - } - else//(k >= 0) - { - r->classification = MMO; - } - } - else//(j >= 0) - { - if(k < 0) - { - r->classification = MPM; - if(j==0) - r->classification = MOM; - } - else//(k >= 0) - { - if((j==0) && (k==0)) - r->classification = MOO; - else if(k==0) - r->classification = MPO; - else if(j==0) - r->classification = MOP; - else - r->classification = MPP; - } - } - } - else//(i >= 0) - { - if(j < 0) - { - if(k < 0) - { - r->classification = PMM; - if(i==0) - r->classification = OMM; - } - else//(k >= 0) - { - if((i==0) && (k==0)) - r->classification = OMO; - else if(k==0) - r->classification = PMO; - else if(i==0) - r->classification = OMP; - else - r->classification = PMP; - } - } - else//(j >= 0) - { - if(k < 0) - { - if((i==0) && (j==0)) - r->classification = OOM; - else if(i==0) - r->classification = OPM; - else if(j==0) - r->classification = POM; - else - r->classification = PPM; - } - else//(k > 0) - { - if(i==0) - { - if(j==0) - r->classification = OOP; - else if(k==0) - r->classification = OPO; - else - r->classification = OPP; - } - else - { - if((j==0) && (k==0)) - r->classification = POO; - else if(j==0) - r->classification = POP; - else if(k==0) - r->classification = PPO; - else - r->classification = PPP; - } - } - } - } -} - - -//SIMD_FORCE_INLINE bool slopeint_div(const btRaySlope* r, const btAaboxSlope* b, float *t) -SIMD_FORCE_INLINE bool btRaySlopeAabb(const btRaySlope* r, const btAaboxSlope* b, float *t) -{ - switch (r->classification) - { - case MMM: - { - if ((r->x < b->x0) || (r->y < b->y0) || (r->z < b->z0) - || (r->jbyi * b->x0 - b->y1 + r->c_xy > 0) - || (r->ibyj * b->y0 - b->x1 + r->c_yx > 0) - || (r->jbyk * b->z0 - b->y1 + r->c_zy > 0) - || (r->kbyj * b->y0 - b->z1 + r->c_yz > 0) - || (r->kbyi * b->x0 - b->z1 + r->c_xz > 0) - || (r->ibyk * b->z0 - b->x1 + r->c_zx > 0) - ) - return false; - - *t = (b->x1 - r->x) / r->i; - float t1 = (b->y1 - r->y) / r->j; - if(t1 > *t) - *t = t1; - float t2 = (b->z1 - r->z) / r->k; - if(t2 > *t) - *t = t2; - - return true; - } - - - case MMP: - { - if ((r->x < b->x0) || (r->y < b->y0) || (r->z > b->z1) - || (r->jbyi * b->x0 - b->y1 + r->c_xy > 0) - || (r->ibyj * b->y0 - b->x1 + r->c_yx > 0) - || (r->jbyk * b->z1 - b->y1 + r->c_zy > 0) - || (r->kbyj * b->y0 - b->z0 + r->c_yz < 0) - || (r->kbyi * b->x0 - b->z0 + r->c_xz < 0) - || (r->ibyk * b->z1 - b->x1 + r->c_zx > 0) - ) - return false; - *t = (b->x1 - r->x) / r->i; - float t1 = (b->y1 - r->y) / r->j; - if(t1 > *t) - *t = t1; - float t2 = (b->z0 - r->z) / r->k; - if(t2 > *t) - *t = t2; - - return true; - } - - - case MPM: - { - if ((r->x < b->x0) || (r->y > b->y1) || (r->z < b->z0) - || (r->jbyi * b->x0 - b->y0 + r->c_xy < 0) - || (r->ibyj * b->y1 - b->x1 + r->c_yx > 0) - || (r->jbyk * b->z0 - b->y0 + r->c_zy < 0) - || (r->kbyj * b->y1 - b->z1 + r->c_yz > 0) - || (r->kbyi * b->x0 - b->z1 + r->c_xz > 0) - || (r->ibyk * b->z0 - b->x1 + r->c_zx > 0) - ) - return false; - - *t = (b->x1 - r->x) / r->i; - float t1 = (b->y0 - r->y) / r->j; - if(t1 > *t) - *t = t1; - float t2 = (b->z1 - r->z) / r->k; - if(t2 > *t) - *t = t2; - - return true; - } - - case MPP: - { - if ((r->x < b->x0) || (r->y > b->y1) || (r->z > b->z1) - || (r->jbyi * b->x0 - b->y0 + r->c_xy < 0) - || (r->ibyj * b->y1 - b->x1 + r->c_yx > 0) - || (r->jbyk * b->z1 - b->y0 + r->c_zy < 0) - || (r->kbyj * b->y1 - b->z0 + r->c_yz < 0) - || (r->kbyi * b->x0 - b->z0 + r->c_xz < 0) - || (r->ibyk * b->z1 - b->x1 + r->c_zx > 0) - ) - return false; - - *t = (b->x1 - r->x) / r->i; - float t1 = (b->y0 - r->y) / r->j; - if(t1 > *t) - *t = t1; - float t2 = (b->z0 - r->z) / r->k; - if(t2 > *t) - *t = t2; - - return true; - } - - case PMM: - { - if ((r->x > b->x1) || (r->y < b->y0) || (r->z < b->z0) - || (r->jbyi * b->x1 - b->y1 + r->c_xy > 0) - || (r->ibyj * b->y0 - b->x0 + r->c_yx < 0) - || (r->jbyk * b->z0 - b->y1 + r->c_zy > 0) - || (r->kbyj * b->y0 - b->z1 + r->c_yz > 0) - || (r->kbyi * b->x1 - b->z1 + r->c_xz > 0) - || (r->ibyk * b->z0 - b->x0 + r->c_zx < 0) - ) - return false; - - *t = (b->x0 - r->x) / r->i; - float t1 = (b->y1 - r->y) / r->j; - if(t1 > *t) - *t = t1; - float t2 = (b->z1 - r->z) / r->k; - if(t2 > *t) - *t = t2; - - return true; - } - - case PMP: - { - if ((r->x > b->x1) || (r->y < b->y0) || (r->z > b->z1) - || (r->jbyi * b->x1 - b->y1 + r->c_xy > 0) - || (r->ibyj * b->y0 - b->x0 + r->c_yx < 0) - || (r->jbyk * b->z1 - b->y1 + r->c_zy > 0) - || (r->kbyj * b->y0 - b->z0 + r->c_yz < 0) - || (r->kbyi * b->x1 - b->z0 + r->c_xz < 0) - || (r->ibyk * b->z1 - b->x0 + r->c_zx < 0) - ) - return false; - - *t = (b->x0 - r->x) / r->i; - float t1 = (b->y1 - r->y) / r->j; - if(t1 > *t) - *t = t1; - float t2 = (b->z0 - r->z) / r->k; - if(t2 > *t) - *t = t2; - - return true; - } - - case PPM: - { - if ((r->x > b->x1) || (r->y > b->y1) || (r->z < b->z0) - || (r->jbyi * b->x1 - b->y0 + r->c_xy < 0) - || (r->ibyj * b->y1 - b->x0 + r->c_yx < 0) - || (r->jbyk * b->z0 - b->y0 + r->c_zy < 0) - || (r->kbyj * b->y1 - b->z1 + r->c_yz > 0) - || (r->kbyi * b->x1 - b->z1 + r->c_xz > 0) - || (r->ibyk * b->z0 - b->x0 + r->c_zx < 0) - ) - return false; - - *t = (b->x0 - r->x) / r->i; - float t1 = (b->y0 - r->y) / r->j; - if(t1 > *t) - *t = t1; - float t2 = (b->z1 - r->z) / r->k; - if(t2 > *t) - *t = t2; - - return true; - } - - case PPP: - { - if ((r->x > b->x1) || (r->y > b->y1) || (r->z > b->z1) - || (r->jbyi * b->x1 - b->y0 + r->c_xy < 0) - || (r->ibyj * b->y1 - b->x0 + r->c_yx < 0) - || (r->jbyk * b->z1 - b->y0 + r->c_zy < 0) - || (r->kbyj * b->y1 - b->z0 + r->c_yz < 0) - || (r->kbyi * b->x1 - b->z0 + r->c_xz < 0) - || (r->ibyk * b->z1 - b->x0 + r->c_zx < 0) - ) - return false; - - *t = (b->x0 - r->x) / r->i; - float t1 = (b->y0 - r->y) / r->j; - if(t1 > *t) - *t = t1; - float t2 = (b->z0 - r->z) / r->k; - if(t2 > *t) - *t = t2; - - return true; - } - - case OMM: - { - if((r->x < b->x0) || (r->x > b->x1) - || (r->y < b->y0) || (r->z < b->z0) - || (r->jbyk * b->z0 - b->y1 + r->c_zy > 0) - || (r->kbyj * b->y0 - b->z1 + r->c_yz > 0) - ) - return false; - - *t = (b->y1 - r->y) / r->j; - float t2 = (b->z1 - r->z) / r->k; - if(t2 > *t) - *t = t2; - - return true; - } - - case OMP: - { - if((r->x < b->x0) || (r->x > b->x1) - || (r->y < b->y0) || (r->z > b->z1) - || (r->jbyk * b->z1 - b->y1 + r->c_zy > 0) - || (r->kbyj * b->y0 - b->z0 + r->c_yz < 0) - ) - return false; - - *t = (b->y1 - r->y) / r->j; - float t2 = (b->z0 - r->z) / r->k; - if(t2 > *t) - *t = t2; - - return true; - } - - case OPM: - { - if((r->x < b->x0) || (r->x > b->x1) - || (r->y > b->y1) || (r->z < b->z0) - || (r->jbyk * b->z0 - b->y0 + r->c_zy < 0) - || (r->kbyj * b->y1 - b->z1 + r->c_yz > 0) - ) - return false; - - *t = (b->y0 - r->y) / r->j; - float t2 = (b->z1 - r->z) / r->k; - if(t2 > *t) - *t = t2; - - return true; - } - - case OPP: - { - if((r->x < b->x0) || (r->x > b->x1) - || (r->y > b->y1) || (r->z > b->z1) - || (r->jbyk * b->z1 - b->y0 + r->c_zy < 0) - || (r->kbyj * b->y1 - b->z0 + r->c_yz < 0) - ) - return false; - - *t = (b->y0 - r->y) / r->j; - float t2 = (b->z0 - r->z) / r->k; - if(t2 > *t) - *t = t2; - - return true; - } - - case MOM: - { - if((r->y < b->y0) || (r->y > b->y1) - || (r->x < b->x0) || (r->z < b->z0) - || (r->kbyi * b->x0 - b->z1 + r->c_xz > 0) - || (r->ibyk * b->z0 - b->x1 + r->c_zx > 0) - ) - return false; - - *t = (b->x1 - r->x) / r->i; - float t2 = (b->z1 - r->z) / r->k; - if(t2 > *t) - *t = t2; - - return true; - } - - case MOP: - { - if((r->y < b->y0) || (r->y > b->y1) - || (r->x < b->x0) || (r->z > b->z1) - || (r->kbyi * b->x0 - b->z0 + r->c_xz < 0) - || (r->ibyk * b->z1 - b->x1 + r->c_zx > 0) - ) - return false; - - *t = (b->x1 - r->x) / r->i; - float t2 = (b->z0 - r->z) / r->k; - if(t2 > *t) - *t = t2; - - return true; - } - - case POM: - { - if((r->y < b->y0) || (r->y > b->y1) - || (r->x > b->x1) || (r->z < b->z0) - || (r->kbyi * b->x1 - b->z1 + r->c_xz > 0) - || (r->ibyk * b->z0 - b->x0 + r->c_zx < 0) - ) - return false; - - *t = (b->x0 - r->x) / r->i; - float t2 = (b->z1 - r->z) / r->k; - if(t2 > *t) - *t = t2; - - return true; - } - - case POP: - { - if((r->y < b->y0) || (r->y > b->y1) - || (r->x > b->x1) || (r->z > b->z1) - || (r->kbyi * b->x1 - b->z0 + r->c_xz < 0) - || (r->ibyk * b->z1 - b->x0 + r->c_zx < 0) - ) - return false; - - *t = (b->x0 - r->x) / r->i; - float t2 = (b->z0 - r->z) / r->k; - if(t2 > *t) - *t = t2; - - return true; - } - - case MMO: - { - if((r->z < b->z0) || (r->z > b->z1) - || (r->x < b->x0) || (r->y < b->y0) - || (r->jbyi * b->x0 - b->y1 + r->c_xy > 0) - || (r->ibyj * b->y0 - b->x1 + r->c_yx > 0) - ) - return false; - - *t = (b->x1 - r->x) / r->i; - float t1 = (b->y1 - r->y) / r->j; - if(t1 > *t) - *t = t1; - - return true; - } - - case MPO: - { - if((r->z < b->z0) || (r->z > b->z1) - || (r->x < b->x0) || (r->y > b->y1) - || (r->jbyi * b->x0 - b->y0 + r->c_xy < 0) - || (r->ibyj * b->y1 - b->x1 + r->c_yx > 0) - ) - return false; - - *t = (b->x1 - r->x) / r->i; - float t1 = (b->y0 - r->y) / r->j; - if(t1 > *t) - *t = t1; - - return true; - } - - case PMO: - { - if((r->z < b->z0) || (r->z > b->z1) - || (r->x > b->x1) || (r->y < b->y0) - || (r->jbyi * b->x1 - b->y1 + r->c_xy > 0) - || (r->ibyj * b->y0 - b->x0 + r->c_yx < 0) - ) - return false; - - *t = (b->x0 - r->x) / r->i; - float t1 = (b->y1 - r->y) / r->j; - if(t1 > *t) - *t = t1; - - return true; - } - - case PPO: - { - if((r->z < b->z0) || (r->z > b->z1) - || (r->x > b->x1) || (r->y > b->y1) - || (r->jbyi * b->x1 - b->y0 + r->c_xy < 0) - || (r->ibyj * b->y1 - b->x0 + r->c_yx < 0) - ) - return false; - - *t = (b->x0 - r->x) / r->i; - float t1 = (b->y0 - r->y) / r->j; - if(t1 > *t) - *t = t1; - - return true; - } - case MOO: - { - if((r->x < b->x0) - || (r->y < b->y0) || (r->y > b->y1) - || (r->z < b->z0) || (r->z > b->z1) - ) - return false; - - *t = (b->x1 - r->x) / r->i; - return true; - } - - case POO: - { - if((r->x > b->x1) - || (r->y < b->y0) || (r->y > b->y1) - || (r->z < b->z0) || (r->z > b->z1) - ) - return false; - - *t = (b->x0 - r->x) / r->i; - return true; - } - - case OMO: - { - if((r->y < b->y0) - || (r->x < b->x0) || (r->x > b->x1) - || (r->z < b->z0) || (r->z > b->z1) - ) - return false; - - *t = (b->y1 - r->y) / r->j; - return true; - } - - case OPO: - { - if((r->y > b->y1) - || (r->x < b->x0) || (r->x > b->x1) - || (r->z < b->z0) || (r->z > b->z1) - ) - return false; - - *t = (b->y0 - r->y) / r->j; - return true; - } - - - case OOM: - { - if((r->z < b->z0) - || (r->x < b->x0) || (r->x > b->x1) - || (r->y < b->y0) || (r->y > b->y1) - ) - return false; - - *t = (b->z1 - r->z) / r->k; - return true; - } - - case OOP: - { - if((r->z > b->z1) - || (r->x < b->x0) || (r->x > b->x1) - || (r->y < b->y0) || (r->y > b->y1) - ) - return false; - - *t = (b->z0 - r->z) / r->k; - return true; - } - - } - - return false; -} SIMD_FORCE_INLINE bool btRayAabb2(const btVector3& rayFrom,