Imported Upstream version 2.81
[platform/upstream/libbullet.git] / Extras / CDTestFramework / Opcode / OPC_RayAABBOverlap.h
1 /*
2  *      OPCODE - Optimized Collision Detection
3  * http://www.codercorner.com/Opcode.htm
4  * 
5  * Copyright (c) 2001-2008 Pierre Terdiman,  pierre@codercorner.com
6
7 This software is provided 'as-is', without any express or implied warranty.
8 In no event will the authors be held liable for any damages arising from the use of this software.
9 Permission is granted to anyone to use this software for any purpose, 
10 including commercial applications, and to alter it and redistribute it freely, 
11 subject to the following restrictions:
12
13 1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required.
14 2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software.
15 3. This notice may not be removed or altered from any source distribution.
16 */
17
18
19 // Opcode 1.1: ray-AABB overlap tests based on Woo's code
20 // Opcode 1.2: ray-AABB overlap tests based on the separating axis theorem
21 //
22 // The point of intersection is not computed anymore. The distance to impact is not needed anymore
23 // since we now have two different queries for segments or rays.
24
25 ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
26 /**
27  *      Computes a segment-AABB overlap test using the separating axis theorem. Segment is cached within the class.
28  *      \param          center  [in] AABB center
29  *      \param          extents [in] AABB extents
30  *      \return         true on overlap
31  */
32 ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
33 inline_ BOOL RayCollider::SegmentAABBOverlap(const Point& center, const Point& extents)
34 {
35         // Stats
36         mNbRayBVTests++;
37
38         float Dx = mData2.x - center.x;         if(fabsf(Dx) > extents.x + mFDir.x)     return FALSE;
39         float Dy = mData2.y - center.y;         if(fabsf(Dy) > extents.y + mFDir.y)     return FALSE;
40         float Dz = mData2.z - center.z;         if(fabsf(Dz) > extents.z + mFDir.z)     return FALSE;
41
42         float f;
43         f = mData.y * Dz - mData.z * Dy;        if(fabsf(f) > extents.y*mFDir.z + extents.z*mFDir.y)    return FALSE;
44         f = mData.z * Dx - mData.x * Dz;        if(fabsf(f) > extents.x*mFDir.z + extents.z*mFDir.x)    return FALSE;
45         f = mData.x * Dy - mData.y * Dx;        if(fabsf(f) > extents.x*mFDir.y + extents.y*mFDir.x)    return FALSE;
46
47         return TRUE;
48 }
49
50 ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
51 /**
52  *      Computes a ray-AABB overlap test using the separating axis theorem. Ray is cached within the class.
53  *      \param          center  [in] AABB center
54  *      \param          extents [in] AABB extents
55  *      \return         true on overlap
56  */
57 ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
58 inline_ BOOL RayCollider::RayAABBOverlap(const Point& center, const Point& extents)
59 {
60         // Stats
61         mNbRayBVTests++;
62
63 //      float Dx = mOrigin.x - center.x;        if(fabsf(Dx) > extents.x && Dx*mDir.x>=0.0f)    return FALSE;
64 //      float Dy = mOrigin.y - center.y;        if(fabsf(Dy) > extents.y && Dy*mDir.y>=0.0f)    return FALSE;
65 //      float Dz = mOrigin.z - center.z;        if(fabsf(Dz) > extents.z && Dz*mDir.z>=0.0f)    return FALSE;
66
67         float Dx = mOrigin.x - center.x;        if(GREATER(Dx, extents.x) && Dx*mDir.x>=0.0f)   return FALSE;
68         float Dy = mOrigin.y - center.y;        if(GREATER(Dy, extents.y) && Dy*mDir.y>=0.0f)   return FALSE;
69         float Dz = mOrigin.z - center.z;        if(GREATER(Dz, extents.z) && Dz*mDir.z>=0.0f)   return FALSE;
70
71 //      float Dx = mOrigin.x - center.x;        if(GREATER(Dx, extents.x) && ((SIR(Dx)-1)^SIR(mDir.x))>=0.0f)   return FALSE;
72 //      float Dy = mOrigin.y - center.y;        if(GREATER(Dy, extents.y) && ((SIR(Dy)-1)^SIR(mDir.y))>=0.0f)   return FALSE;
73 //      float Dz = mOrigin.z - center.z;        if(GREATER(Dz, extents.z) && ((SIR(Dz)-1)^SIR(mDir.z))>=0.0f)   return FALSE;
74
75         float f;
76         f = mDir.y * Dz - mDir.z * Dy;          if(fabsf(f) > extents.y*mFDir.z + extents.z*mFDir.y)    return FALSE;
77         f = mDir.z * Dx - mDir.x * Dz;          if(fabsf(f) > extents.x*mFDir.z + extents.z*mFDir.x)    return FALSE;
78         f = mDir.x * Dy - mDir.y * Dx;          if(fabsf(f) > extents.x*mFDir.y + extents.y*mFDir.x)    return FALSE;
79
80         return TRUE;
81 }