1 ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
3 * OPCODE - Optimized Collision Detection
4 * Copyright (C) 2001 Pierre Terdiman
5 * Homepage: http://www.codercorner.com/Opcode.htm
7 ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
9 ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
11 * Contains base collider class.
12 * \file OPC_Collider.h
13 * \author Pierre Terdiman
16 ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
18 ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
20 #ifndef __OPC_COLLIDER_H__
21 #define __OPC_COLLIDER_H__
25 OPC_FIRST_CONTACT
= (1<<0), //!< Report all contacts (false) or only first one (true)
26 OPC_TEMPORAL_COHERENCE
= (1<<1), //!< Use temporal coherence or not
27 OPC_CONTACT
= (1<<2), //!< Final contact status after a collision query
28 OPC_TEMPORAL_HIT
= (1<<3), //!< There has been an early exit due to temporal coherence
29 OPC_NO_PRIMITIVE_TESTS
= (1<<4), //!< Keep or discard primitive-bv tests in leaf nodes (volume-mesh queries)
31 OPC_CONTACT_FOUND
= OPC_FIRST_CONTACT
| OPC_CONTACT
,
32 OPC_TEMPORAL_CONTACT
= OPC_TEMPORAL_HIT
| OPC_CONTACT
,
34 OPC_FORCE_DWORD
= 0x7fffffff
37 class OPCODE_API Collider
40 // Constructor / Destructor
46 ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
48 * Gets the last collision status after a collision query.
49 * \return true if a collision occured
51 ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
52 inline_ BOOL
GetContactStatus() const { return mFlags
& OPC_CONTACT
; }
54 ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
56 * Gets the "first contact" mode.
57 * \return true if "first contact" mode is on
59 ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
60 inline_ BOOL
FirstContactEnabled() const { return mFlags
& OPC_FIRST_CONTACT
; }
62 ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
64 * Gets the temporal coherence mode.
65 * \return true if temporal coherence is on
67 ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
68 inline_ BOOL
TemporalCoherenceEnabled() const { return mFlags
& OPC_TEMPORAL_COHERENCE
; }
70 ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
72 * Checks a first contact has already been found.
73 * \return true if a first contact has been found and we can stop a query
75 ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
76 inline_ BOOL
ContactFound() const { return (mFlags
&OPC_CONTACT_FOUND
)==OPC_CONTACT_FOUND
; }
78 ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
80 * Checks there's been an early exit due to temporal coherence;
81 * \return true if a temporal hit has occured
83 ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
84 inline_ BOOL
TemporalHit() const { return mFlags
& OPC_TEMPORAL_HIT
; }
86 ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
88 * Checks primitive tests are enabled;
89 * \return true if primitive tests must be skipped
91 ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
92 inline_ BOOL
SkipPrimitiveTests() const { return mFlags
& OPC_NO_PRIMITIVE_TESTS
; }
96 ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
98 * Reports all contacts (false) or first contact only (true)
99 * \param flag [in] true for first contact, false for all contacts
100 * \see SetTemporalCoherence(bool flag)
101 * \see ValidateSettings()
103 ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
104 inline_
void SetFirstContact(bool flag
)
106 if(flag
) mFlags
|= OPC_FIRST_CONTACT
;
107 else mFlags
&= ~OPC_FIRST_CONTACT
;
110 ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
112 * Enable/disable temporal coherence.
113 * \param flag [in] true to enable temporal coherence, false to discard it
114 * \see SetFirstContact(bool flag)
115 * \see ValidateSettings()
117 ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
118 inline_
void SetTemporalCoherence(bool flag
)
120 if(flag
) mFlags
|= OPC_TEMPORAL_COHERENCE
;
121 else mFlags
&= ~OPC_TEMPORAL_COHERENCE
;
124 ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
126 * Enable/disable primitive tests.
127 * \param flag [in] true to enable primitive tests, false to discard them
129 ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
130 inline_
void SetPrimitiveTests(bool flag
)
132 if(!flag
) mFlags
|= OPC_NO_PRIMITIVE_TESTS
;
133 else mFlags
&= ~OPC_NO_PRIMITIVE_TESTS
;
136 ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
138 * Validates current settings. You should call this method after all the settings / callbacks have been defined for a collider.
139 * \return null if everything is ok, else a string describing the problem
141 ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
142 virtual const char* ValidateSettings() = 0;
145 udword mFlags
; //!< Bit flags
146 const BaseModel
* mCurrentModel
; //!< Current model for collision query (owner of touched faces)
147 // User mesh interface
148 const MeshInterface
* mIMesh
; //!< User-defined mesh interface
151 ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
153 * Setups current collision model
154 * \param model [in] current collision model
155 * \return TRUE if success
157 ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
158 inline_ BOOL
Setup(const BaseModel
* model
)
160 // Keep track of current model
161 mCurrentModel
= model
;
162 if(!mCurrentModel
) return FALSE
;
164 mIMesh
= model
->GetMeshInterface();
168 ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
170 * Initializes a query
172 ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
173 virtual inline_
void InitQuery() { mFlags
&= ~OPC_TEMPORAL_CONTACT
; }
176 #endif // __OPC_COLLIDER_H__