Merge pull request #2240 from GarageGames/Release_3_10_1
[Torque-3d.git] / Engine / lib / opcode / OPC_VolumeCollider.h
blob3dfa9a524d1f074e49e0e84b7d28e17e25eda756
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 volume collider class.
12 * \file OPC_VolumeCollider.h
13 * \author Pierre Terdiman
14 * \date June, 2, 2001
16 ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
18 ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
19 // Include Guard
20 #ifndef __OPC_VOLUMECOLLIDER_H__
21 #define __OPC_VOLUMECOLLIDER_H__
23 struct OPCODE_API VolumeCache
25 VolumeCache() : Model(null) {}
26 ~VolumeCache() {}
28 OPC_Container TouchedPrimitives; //!< Indices of touched primitives
29 const BaseModel* Model; //!< Owner
32 class OPCODE_API VolumeCollider : public Collider
34 public:
35 // Constructor / Destructor
36 VolumeCollider();
37 virtual ~VolumeCollider() = 0;
39 // Collision report
41 ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
42 /**
43 * Gets the number of touched primitives after a collision query.
44 * \see GetContactStatus()
45 * \see GetTouchedPrimitives()
46 * \return the number of touched primitives
48 ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
49 inline_ udword GetNbTouchedPrimitives() const { return mTouchedPrimitives ? mTouchedPrimitives->GetNbEntries() : 0; }
51 ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
52 /**
53 * Gets the list of touched primitives after a collision query.
54 * \see GetContactStatus()
55 * \see GetNbTouchedPrimitives()
56 * \return the list of touched primitives (primitive indices)
58 ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
59 inline_ const udword* GetTouchedPrimitives() const { return mTouchedPrimitives ? mTouchedPrimitives->GetEntries() : null; }
61 // Stats
63 ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
64 /**
65 * Stats: gets the number of Volume-BV overlap tests after a collision query.
66 * \see GetNbVolumePrimTests()
67 * \return the number of Volume-BV tests performed during last query
69 ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
70 inline_ udword GetNbVolumeBVTests() const { return mNbVolumeBVTests; }
72 ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
73 /**
74 * Stats: gets the number of Volume-Triangle overlap tests after a collision query.
75 * \see GetNbVolumeBVTests()
76 * \return the number of Volume-Triangle tests performed during last query
78 ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
79 inline_ udword GetNbVolumePrimTests() const { return mNbVolumePrimTests; }
81 // Settings
83 ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
84 /**
85 * Validates current settings. You should call this method after all the settings / callbacks have been defined for a collider.
86 * \return null if everything is ok, else a string describing the problem
88 ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
89 override(Collider) const char* ValidateSettings();
91 protected:
92 // Touched primitives
93 OPC_Container* mTouchedPrimitives; //!< List of touched primitives
95 // Dequantization coeffs
96 Point mCenterCoeff;
97 Point mExtentsCoeff;
98 // Stats
99 udword mNbVolumeBVTests; //!< Number of Volume-BV tests
100 udword mNbVolumePrimTests; //!< Number of Volume-Primitive tests
101 // Internal methods
102 void _Dump(const AABBCollisionNode* node);
103 void _Dump(const AABBNoLeafNode* node);
104 void _Dump(const AABBQuantizedNode* node);
105 void _Dump(const AABBQuantizedNoLeafNode* node);
107 ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
109 * Initializes a query
111 ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
112 override(Collider) inline_ void InitQuery()
114 // Reset stats & contact status
115 mNbVolumeBVTests = 0;
116 mNbVolumePrimTests = 0;
117 Collider::InitQuery();
120 inline_ BOOL IsCacheValid(VolumeCache& cache)
122 // We're going to do a volume-vs-model query.
123 if(cache.Model!=mCurrentModel)
125 // Cached list was for another model so we can't keep it
126 // Keep track of new owner and reset cache
127 cache.Model = mCurrentModel;
128 return FALSE;
130 else
132 // Same models, no problem
133 return TRUE;
138 #endif // __OPC_VOLUMECOLLIDER_H__