Cosmetic: Premake script fixed to avoid adding outest.cpp to the project being generated
[ode.git] / OPCODE / OPC_PlanesCollider.h
blob872f8c55af711bcfecb3fbb5270919a4769bb458
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 code for a planes collider.
12 * \file OPC_PlanesCollider.h
13 * \author Pierre Terdiman
14 * \date January, 1st, 2002
16 ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
18 ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
19 // Include Guard
20 #ifndef __OPC_PLANESCOLLIDER_H__
21 #define __OPC_PLANESCOLLIDER_H__
23 struct OPCODE_API PlanesCache : VolumeCache
25 PlanesCache()
30 class OPCODE_API PlanesCollider : public VolumeCollider
32 public:
33 // Constructor / Destructor
34 PlanesCollider();
35 virtual ~PlanesCollider();
37 ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
38 /**
39 * Generic collision query for generic OPCODE models. After the call, access the results:
40 * - with GetContactStatus()
41 * - with GetNbTouchedPrimitives()
42 * - with GetTouchedPrimitives()
44 * \param cache [in/out] a planes cache
45 * \param planes [in] list of planes in world space
46 * \param nb_planes [in] number of planes
47 * \param model [in] Opcode model to collide with
48 * \param worldm [in] model's world matrix, or null
49 * \return true if success
50 * \warning SCALE NOT SUPPORTED. The matrices must contain rotation & translation parts only.
52 ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
53 bool Collide(PlanesCache& cache, const Plane* planes, udword nb_planes, const Model& model, const Matrix4x4* worldm=null);
55 // Mutant box-with-planes collision queries
56 inline_ bool Collide(PlanesCache& cache, const OBB& box, const Model& model, const Matrix4x4* worldb=null, const Matrix4x4* worldm=null)
58 Plane PL[6];
60 if(worldb)
62 // Create a new OBB in world space
63 OBB WorldBox;
64 box.Rotate(*worldb, WorldBox);
65 // Compute planes from the sides of the box
66 WorldBox.ComputePlanes(PL);
68 else
70 // Compute planes from the sides of the box
71 box.ComputePlanes(PL);
74 // Collide with box planes
75 return Collide(cache, PL, 6, model, worldm);
77 // Settings
79 ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
80 /**
81 * Validates current settings. You should call this method after all the settings and callbacks have been defined for a collider.
82 * \return null if everything is ok, else a string describing the problem
84 ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
85 override(Collider) const char* ValidateSettings();
87 protected:
88 // Planes in model space
89 udword mNbPlanes;
90 Plane* mPlanes;
91 // Leaf description
92 VertexPointers mVP;
93 ConversionArea mVC;
94 // Internal methods
95 void _Collide(const AABBCollisionNode* node, udword clip_mask);
96 void _Collide(const AABBNoLeafNode* node, udword clip_mask);
97 void _Collide(const AABBQuantizedNode* node, udword clip_mask);
98 void _Collide(const AABBQuantizedNoLeafNode* node, udword clip_mask);
99 void _CollideNoPrimitiveTest(const AABBCollisionNode* node, udword clip_mask);
100 void _CollideNoPrimitiveTest(const AABBNoLeafNode* node, udword clip_mask);
101 void _CollideNoPrimitiveTest(const AABBQuantizedNode* node, udword clip_mask);
102 void _CollideNoPrimitiveTest(const AABBQuantizedNoLeafNode* node, udword clip_mask);
103 // Overlap tests
104 inline_ BOOL PlanesAABBOverlap(const Point& center, const Point& extents, udword& out_clip_mask, udword in_clip_mask);
105 inline_ BOOL PlanesTriOverlap(udword in_clip_mask);
106 // Init methods
107 BOOL InitQuery(PlanesCache& cache, const Plane* planes, udword nb_planes, const Matrix4x4* worldm=null);
110 class OPCODE_API HybridPlanesCollider : public PlanesCollider
112 public:
113 // Constructor / Destructor
114 HybridPlanesCollider();
115 virtual ~HybridPlanesCollider();
117 bool Collide(PlanesCache& cache, const Plane* planes, udword nb_planes, const HybridModel& model, const Matrix4x4* worldm=null);
118 protected:
119 Container mTouchedBoxes;
122 #endif // __OPC_PLANESCOLLIDER_H__