1 // Opcode 1.1: ray-AABB overlap tests based on Woo's code
2 // Opcode 1.2: ray-AABB overlap tests based on the separating axis theorem
4 // The point of intersection is not computed anymore. The distance to impact is not needed anymore
5 // since we now have two different queries for segments or rays.
7 ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
9 * Computes a segment-AABB overlap test using the separating axis theorem. Segment is cached within the class.
10 * \param center [in] AABB center
11 * \param extents [in] AABB extents
12 * \return true on overlap
14 ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
15 inline_ BOOL
RayCollider::SegmentAABBOverlap(const Point
& center
, const Point
& extents
)
20 float Dx
= mData2
.x
- center
.x
; if(fabsf(Dx
) > extents
.x
+ mFDir
.x
) return FALSE
;
21 float Dy
= mData2
.y
- center
.y
; if(fabsf(Dy
) > extents
.y
+ mFDir
.y
) return FALSE
;
22 float Dz
= mData2
.z
- center
.z
; if(fabsf(Dz
) > extents
.z
+ mFDir
.z
) return FALSE
;
25 f
= mData
.y
* Dz
- mData
.z
* Dy
; if(fabsf(f
) > extents
.y
*mFDir
.z
+ extents
.z
*mFDir
.y
) return FALSE
;
26 f
= mData
.z
* Dx
- mData
.x
* Dz
; if(fabsf(f
) > extents
.x
*mFDir
.z
+ extents
.z
*mFDir
.x
) return FALSE
;
27 f
= mData
.x
* Dy
- mData
.y
* Dx
; if(fabsf(f
) > extents
.x
*mFDir
.y
+ extents
.y
*mFDir
.x
) return FALSE
;
32 ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
34 * Computes a ray-AABB overlap test using the separating axis theorem. Ray is cached within the class.
35 * \param center [in] AABB center
36 * \param extents [in] AABB extents
37 * \return true on overlap
39 ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
40 inline_ BOOL
RayCollider::RayAABBOverlap(const Point
& center
, const Point
& extents
)
45 // float Dx = mOrigin.x - center.x; if(fabsf(Dx) > extents.x && Dx*mDir.x>=0.0f) return FALSE;
46 // float Dy = mOrigin.y - center.y; if(fabsf(Dy) > extents.y && Dy*mDir.y>=0.0f) return FALSE;
47 // float Dz = mOrigin.z - center.z; if(fabsf(Dz) > extents.z && Dz*mDir.z>=0.0f) return FALSE;
49 float Dx
= mOrigin
.x
- center
.x
; if(GREATER(Dx
, extents
.x
) && Dx
*mDir
.x
>=0.0f
) return FALSE
;
50 float Dy
= mOrigin
.y
- center
.y
; if(GREATER(Dy
, extents
.y
) && Dy
*mDir
.y
>=0.0f
) return FALSE
;
51 float Dz
= mOrigin
.z
- center
.z
; if(GREATER(Dz
, extents
.z
) && Dz
*mDir
.z
>=0.0f
) return FALSE
;
53 // float Dx = mOrigin.x - center.x; if(GREATER(Dx, extents.x) && ((SIR(Dx)-1)^SIR(mDir.x))>=0.0f) return FALSE;
54 // float Dy = mOrigin.y - center.y; if(GREATER(Dy, extents.y) && ((SIR(Dy)-1)^SIR(mDir.y))>=0.0f) return FALSE;
55 // float Dz = mOrigin.z - center.z; if(GREATER(Dz, extents.z) && ((SIR(Dz)-1)^SIR(mDir.z))>=0.0f) return FALSE;
58 f
= mDir
.y
* Dz
- mDir
.z
* Dy
; if(fabsf(f
) > extents
.y
*mFDir
.z
+ extents
.z
*mFDir
.y
) return FALSE
;
59 f
= mDir
.z
* Dx
- mDir
.x
* Dz
; if(fabsf(f
) > extents
.x
*mFDir
.z
+ extents
.z
*mFDir
.x
) return FALSE
;
60 f
= mDir
.x
* Dy
- mDir
.y
* Dx
; if(fabsf(f
) > extents
.x
*mFDir
.y
+ extents
.y
*mFDir
.x
) return FALSE
;