diff options
author | dan miller | 2007-10-19 05:15:33 +0000 |
---|---|---|
committer | dan miller | 2007-10-19 05:15:33 +0000 |
commit | 79eca25c945a535a7a0325999034bae17da92412 (patch) | |
tree | 40ff433d94859d629aac933d5ec73b382f62ba1a /libraries/ode-0.9/OPCODE/OPC_OBBCollider.h | |
parent | adding ode source to /libraries (diff) | |
download | opensim-SC_OLD-79eca25c945a535a7a0325999034bae17da92412.zip opensim-SC_OLD-79eca25c945a535a7a0325999034bae17da92412.tar.gz opensim-SC_OLD-79eca25c945a535a7a0325999034bae17da92412.tar.bz2 opensim-SC_OLD-79eca25c945a535a7a0325999034bae17da92412.tar.xz |
resubmitting ode
Diffstat (limited to 'libraries/ode-0.9/OPCODE/OPC_OBBCollider.h')
-rw-r--r-- | libraries/ode-0.9/OPCODE/OPC_OBBCollider.h | 142 |
1 files changed, 142 insertions, 0 deletions
diff --git a/libraries/ode-0.9/OPCODE/OPC_OBBCollider.h b/libraries/ode-0.9/OPCODE/OPC_OBBCollider.h new file mode 100644 index 0000000..a050118 --- /dev/null +++ b/libraries/ode-0.9/OPCODE/OPC_OBBCollider.h | |||
@@ -0,0 +1,142 @@ | |||
1 | /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | ||
2 | /* | ||
3 | * OPCODE - Optimized Collision Detection | ||
4 | * Copyright (C) 2001 Pierre Terdiman | ||
5 | * Homepage: http://www.codercorner.com/Opcode.htm | ||
6 | */ | ||
7 | /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | ||
8 | |||
9 | /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | ||
10 | /** | ||
11 | * Contains code for an OBB collider. | ||
12 | * \file OPC_OBBCollider.h | ||
13 | * \author Pierre Terdiman | ||
14 | * \date January, 1st, 2002 | ||
15 | */ | ||
16 | /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | ||
17 | |||
18 | /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | ||
19 | // Include Guard | ||
20 | #ifndef __OPC_OBBCOLLIDER_H__ | ||
21 | #define __OPC_OBBCOLLIDER_H__ | ||
22 | |||
23 | struct OPCODE_API OBBCache : VolumeCache | ||
24 | { | ||
25 | OBBCache() : FatCoeff(1.1f) | ||
26 | { | ||
27 | FatBox.mCenter.Zero(); | ||
28 | FatBox.mExtents.Zero(); | ||
29 | FatBox.mRot.Identity(); | ||
30 | } | ||
31 | |||
32 | // Cached faces signature | ||
33 | OBB FatBox; //!< Box used when performing the query resulting in cached faces | ||
34 | // User settings | ||
35 | float FatCoeff; //!< extents multiplier used to create a fat box | ||
36 | }; | ||
37 | |||
38 | class OPCODE_API OBBCollider : public VolumeCollider | ||
39 | { | ||
40 | public: | ||
41 | // Constructor / Destructor | ||
42 | OBBCollider(); | ||
43 | virtual ~OBBCollider(); | ||
44 | |||
45 | /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | ||
46 | /** | ||
47 | * Generic collision query for generic OPCODE models. After the call, access the results: | ||
48 | * - with GetContactStatus() | ||
49 | * - with GetNbTouchedPrimitives() | ||
50 | * - with GetTouchedPrimitives() | ||
51 | * | ||
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. | ||
59 | */ | ||
60 | /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | ||
61 | bool Collide(OBBCache& cache, const OBB& box, const Model& model, const Matrix4x4* worldb=null, const Matrix4x4* worldm=null); | ||
62 | |||
63 | // Settings | ||
64 | |||
65 | /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | ||
66 | /** | ||
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 | ||
69 | */ | ||
70 | /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | ||
71 | inline_ void SetFullBoxBoxTest(bool flag) { mFullBoxBoxTest = flag; } | ||
72 | |||
73 | // Settings | ||
74 | |||
75 | /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | ||
76 | /** | ||
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 | ||
79 | */ | ||
80 | /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | ||
81 | override(Collider) const char* ValidateSettings(); | ||
82 | |||
83 | protected: | ||
84 | // Precomputed data | ||
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 | ||
90 | |||
91 | Point mBoxExtents; | ||
92 | Point mB0; //!< - mTModelToBox + mBoxExtents | ||
93 | Point mB1; //!< - mTModelToBox - mBoxExtents | ||
94 | |||
95 | float mBBx1; | ||
96 | float mBBy1; | ||
97 | float mBBz1; | ||
98 | |||
99 | float mBB_1; | ||
100 | float mBB_2; | ||
101 | float mBB_3; | ||
102 | float mBB_4; | ||
103 | float mBB_5; | ||
104 | float mBB_6; | ||
105 | float mBB_7; | ||
106 | float mBB_8; | ||
107 | float mBB_9; | ||
108 | |||
109 | // Leaf description | ||
110 | Point mLeafVerts[3]; //!< Triangle vertices | ||
111 | // Settings | ||
112 | bool mFullBoxBoxTest; //!< Perform full BV-BV tests (true) or SAT-lite tests (false) | ||
113 | // Internal methods | ||
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); | ||
122 | // Overlap tests | ||
123 | inline_ BOOL OBBContainsBox(const Point& bc, const Point& be); | ||
124 | inline_ BOOL BoxBoxOverlap(const Point& extents, const Point& center); | ||
125 | inline_ BOOL TriBoxOverlap(); | ||
126 | // Init methods | ||
127 | BOOL InitQuery(OBBCache& cache, const OBB& box, const Matrix4x4* worldb=null, const Matrix4x4* worldm=null); | ||
128 | }; | ||
129 | |||
130 | class OPCODE_API HybridOBBCollider : public OBBCollider | ||
131 | { | ||
132 | public: | ||
133 | // Constructor / Destructor | ||
134 | HybridOBBCollider(); | ||
135 | virtual ~HybridOBBCollider(); | ||
136 | |||
137 | bool Collide(OBBCache& cache, const OBB& box, const HybridModel& model, const Matrix4x4* worldb=null, const Matrix4x4* worldm=null); | ||
138 | protected: | ||
139 | Container mTouchedBoxes; | ||
140 | }; | ||
141 | |||
142 | #endif // __OPC_OBBCOLLIDER_H__ | ||