1 ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
3 * OPCODE - Optimized Collision Detection
4 * Copyright (C) 2001 Pierre Terdiman
5 * Homepage: http://www.codercorner.com/Opcode.htm
7 ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
9 ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
11 * Contains code for an OBB collider.
12 * \file OPC_OBBCollider.h
13 * \author Pierre Terdiman
14 * \date January, 1st, 2002
16 ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
18 ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
20 #ifndef __OPC_OBBCOLLIDER_H__
21 #define __OPC_OBBCOLLIDER_H__
23 struct OPCODE_API OBBCache
: VolumeCache
25 OBBCache() : FatCoeff(1.1f
)
27 FatBox
.mCenter
.Zero();
28 FatBox
.mExtents
.Zero();
29 FatBox
.mRot
.Identity();
32 // Cached faces signature
33 OBB FatBox
; //!< Box used when performing the query resulting in cached faces
35 float FatCoeff
; //!< extents multiplier used to create a fat box
38 class OPCODE_API OBBCollider
: public VolumeCollider
41 // Constructor / Destructor
43 virtual ~OBBCollider();
45 ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
47 * Generic collision query for generic OPCODE models. After the call, access the results:
48 * - with GetContactStatus()
49 * - with GetNbTouchedPrimitives()
50 * - with GetTouchedPrimitives()
52 * \param cache [in/out] a box cache
53 * \param box [in] collision OBB in local space
54 * \param model [in] Opcode model to collide with
55 * \param worldb [in] OBB's world matrix, or null
56 * \param worldm [in] model's world matrix, or null
57 * \return true if success
58 * \warning SCALE NOT SUPPORTED. The matrices must contain rotation & translation parts only.
60 ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
61 bool Collide(OBBCache
& cache
, const OBB
& box
, const Model
& model
, const Matrix4x4
* worldb
=null
, const Matrix4x4
* worldm
=null
);
65 ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
67 * Settings: select between full box-box tests or "SAT-lite" tests (where Class III axes are discarded)
68 * \param flag [in] true for full tests, false for coarse tests
70 ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
71 inline_
void SetFullBoxBoxTest(bool flag
) { mFullBoxBoxTest
= flag
; }
75 ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
77 * Validates current settings. You should call this method after all the settings and callbacks have been defined for a collider.
78 * \return null if everything is ok, else a string describing the problem
80 ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
81 override(Collider
) const char* ValidateSettings();
85 Matrix3x3 mAR
; //!< Absolute rotation matrix
86 Matrix3x3 mRModelToBox
; //!< Rotation from model space to obb space
87 Matrix3x3 mRBoxToModel
; //!< Rotation from obb space to model space
88 Point mTModelToBox
; //!< Translation from model space to obb space
89 Point mTBoxToModel
; //!< Translation from obb space to model space
92 Point mB0
; //!< - mTModelToBox + mBoxExtents
93 Point mB1
; //!< - mTModelToBox - mBoxExtents
110 Point mLeafVerts
[3]; //!< Triangle vertices
112 bool mFullBoxBoxTest
; //!< Perform full BV-BV tests (true) or SAT-lite tests (false)
114 void _Collide(const AABBCollisionNode
* node
);
115 void _Collide(const AABBNoLeafNode
* node
);
116 void _Collide(const AABBQuantizedNode
* node
);
117 void _Collide(const AABBQuantizedNoLeafNode
* node
);
118 void _CollideNoPrimitiveTest(const AABBCollisionNode
* node
);
119 void _CollideNoPrimitiveTest(const AABBNoLeafNode
* node
);
120 void _CollideNoPrimitiveTest(const AABBQuantizedNode
* node
);
121 void _CollideNoPrimitiveTest(const AABBQuantizedNoLeafNode
* node
);
123 inline_ BOOL
OBBContainsBox(const Point
& bc
, const Point
& be
);
124 inline_ BOOL
BoxBoxOverlap(const Point
& extents
, const Point
& center
);
125 inline_ BOOL
TriBoxOverlap();
127 BOOL
InitQuery(OBBCache
& cache
, const OBB
& box
, const Matrix4x4
* worldb
=null
, const Matrix4x4
* worldm
=null
);
130 class OPCODE_API HybridOBBCollider
: public OBBCollider
133 // Constructor / Destructor
135 virtual ~HybridOBBCollider();
137 bool Collide(OBBCache
& cache
, const OBB
& box
, const HybridModel
& model
, const Matrix4x4
* worldb
=null
, const Matrix4x4
* worldm
=null
);
139 Container mTouchedBoxes
;
142 #endif // __OPC_OBBCOLLIDER_H__