Cosmetic: Newlines were corrected
[ode.git] / OPCODE / OPC_Collider.h
blobd718e0298f081943db1d5c2bd073d6002715ea20
1 ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
2 /*
3 * OPCODE - Optimized Collision Detection
4 * Copyright (C) 2001 Pierre Terdiman
5 * Homepage: http://www.codercorner.com/Opcode.htm
6 */
7 ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
9 ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
10 /**
11 * Contains base collider class.
12 * \file OPC_Collider.h
13 * \author Pierre Terdiman
14 * \date June, 2, 2001
16 ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
18 ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
19 // Include Guard
20 #ifndef __OPC_COLLIDER_H__
21 #define __OPC_COLLIDER_H__
23 enum CollisionFlag
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
39 public:
40 // Constructor / Destructor
41 Collider();
42 virtual ~Collider();
44 // Collision report
46 ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
47 /**
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 ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
55 /**
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 ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
63 /**
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 ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
71 /**
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 ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
79 /**
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 ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
87 /**
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; }
94 // Settings
96 ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
97 /**
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;
144 protected:
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
150 // Internal methods
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();
165 return mIMesh!=null;
168 ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
170 * Initializes a query
172 ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
173 virtual inline_ void InitQuery() { mFlags &= ~OPC_TEMPORAL_CONTACT; }
176 #endif // __OPC_COLLIDER_H__