summaryrefslogtreecommitdiffhomepage
path: root/Opcode/OPC_OBBCollider.h
diff options
context:
space:
mode:
Diffstat (limited to 'Opcode/OPC_OBBCollider.h')
-rw-r--r--Opcode/OPC_OBBCollider.h284
1 files changed, 142 insertions, 142 deletions
diff --git a/Opcode/OPC_OBBCollider.h b/Opcode/OPC_OBBCollider.h
index 0601b20..9753384 100644
--- a/Opcode/OPC_OBBCollider.h
+++ b/Opcode/OPC_OBBCollider.h
@@ -1,142 +1,142 @@
-///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-/*
- * OPCODE - Optimized Collision Detection
- * Copyright (C) 2001 Pierre Terdiman
- * Homepage: http://www.codercorner.com/Opcode.htm
- */
-///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-
-///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-/**
- * Contains code for an OBB collider.
- * \file OPC_OBBCollider.h
- * \author Pierre Terdiman
- * \date January, 1st, 2002
- */
-///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-
-///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-// Include Guard
-#ifndef __OPC_OBBCOLLIDER_H__
-#define __OPC_OBBCOLLIDER_H__
-
- struct OPCODE_API OBBCache : VolumeCache
- {
- OBBCache() : FatCoeff(1.1f)
- {
- FatBox.mCenter.Zero();
- FatBox.mExtents.Zero();
- FatBox.mRot.Identity();
- }
-
- // Cached faces signature
- OBB FatBox; //!< Box used when performing the query resulting in cached faces
- // User settings
- float FatCoeff; //!< extents multiplier used to create a fat box
- };
-
- class OPCODE_API OBBCollider : public VolumeCollider
- {
- public:
- // Constructor / Destructor
- OBBCollider();
- virtual ~OBBCollider();
-
- ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- /**
- * Generic collision query for generic OPCODE models. After the call, access the results:
- * - with GetContactStatus()
- * - with GetNbTouchedPrimitives()
- * - with GetTouchedPrimitives()
- *
- * \param cache [in/out] a box cache
- * \param box [in] collision OBB in local space
- * \param model [in] Opcode model to collide with
- * \param worldb [in] OBB's world matrix, or null
- * \param worldm [in] model's world matrix, or null
- * \return true if success
- * \warning SCALE NOT SUPPORTED. The matrices must contain rotation & translation parts only.
- */
- ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- bool Collide(OBBCache& cache, const OBB& box, const Model& model, const Matrix4x4* worldb=null, const Matrix4x4* worldm=null);
-
- // Settings
-
- ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- /**
- * Settings: select between full box-box tests or "SAT-lite" tests (where Class III axes are discarded)
- * \param flag [in] true for full tests, false for coarse tests
- */
- ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- inline_ void SetFullBoxBoxTest(bool flag) { mFullBoxBoxTest = flag; }
-
- // Settings
-
- ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- /**
- * Validates current settings. You should call this method after all the settings and callbacks have been defined for a collider.
- * \return null if everything is ok, else a string describing the problem
- */
- ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- override(Collider) const char* ValidateSettings();
-
- protected:
- // Precomputed data
- Matrix3x3 mAR; //!< Absolute rotation matrix
- Matrix3x3 mRModelToBox; //!< Rotation from model space to obb space
- Matrix3x3 mRBoxToModel; //!< Rotation from obb space to model space
- IcePoint mTModelToBox; //!< Translation from model space to obb space
- IcePoint mTBoxToModel; //!< Translation from obb space to model space
-
- IcePoint mBoxExtents;
- IcePoint mB0; //!< - mTModelToBox + mBoxExtents
- IcePoint mB1; //!< - mTModelToBox - mBoxExtents
-
- float mBBx1;
- float mBBy1;
- float mBBz1;
-
- float mBB_1;
- float mBB_2;
- float mBB_3;
- float mBB_4;
- float mBB_5;
- float mBB_6;
- float mBB_7;
- float mBB_8;
- float mBB_9;
-
- // Leaf description
- IcePoint mLeafVerts[3]; //!< Triangle vertices
- // Settings
- bool mFullBoxBoxTest; //!< Perform full BV-BV tests (true) or SAT-lite tests (false)
- // Internal methods
- void _Collide(const AABBCollisionNode* node);
- void _Collide(const AABBNoLeafNode* node);
- void _Collide(const AABBQuantizedNode* node);
- void _Collide(const AABBQuantizedNoLeafNode* node);
- void _CollideNoPrimitiveTest(const AABBCollisionNode* node);
- void _CollideNoPrimitiveTest(const AABBNoLeafNode* node);
- void _CollideNoPrimitiveTest(const AABBQuantizedNode* node);
- void _CollideNoPrimitiveTest(const AABBQuantizedNoLeafNode* node);
- // Overlap tests
- inline_ BOOL OBBContainsBox(const IcePoint& bc, const IcePoint& be);
- inline_ BOOL BoxBoxOverlap(const IcePoint& extents, const IcePoint& center);
- inline_ BOOL TriBoxOverlap();
- // Init methods
- BOOL InitQuery(OBBCache& cache, const OBB& box, const Matrix4x4* worldb=null, const Matrix4x4* worldm=null);
- };
-
- class OPCODE_API HybridOBBCollider : public OBBCollider
- {
- public:
- // Constructor / Destructor
- HybridOBBCollider();
- virtual ~HybridOBBCollider();
-
- bool Collide(OBBCache& cache, const OBB& box, const HybridModel& model, const Matrix4x4* worldb=null, const Matrix4x4* worldm=null);
- protected:
- Container mTouchedBoxes;
- };
-
-#endif // __OPC_OBBCOLLIDER_H__
+///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+/*
+ * OPCODE - Optimized Collision Detection
+ * Copyright (C) 2001 Pierre Terdiman
+ * Homepage: http://www.codercorner.com/Opcode.htm
+ */
+///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+
+///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+/**
+ * Contains code for an OBB collider.
+ * \file OPC_OBBCollider.h
+ * \author Pierre Terdiman
+ * \date January, 1st, 2002
+ */
+///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+
+///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+// Include Guard
+#ifndef __OPC_OBBCOLLIDER_H__
+#define __OPC_OBBCOLLIDER_H__
+
+ struct OPCODE_API OBBCache : VolumeCache
+ {
+ OBBCache() : FatCoeff(1.1f)
+ {
+ FatBox.mCenter.Zero();
+ FatBox.mExtents.Zero();
+ FatBox.mRot.Identity();
+ }
+
+ // Cached faces signature
+ OBB FatBox; //!< Box used when performing the query resulting in cached faces
+ // User settings
+ float FatCoeff; //!< extents multiplier used to create a fat box
+ };
+
+ class OPCODE_API OBBCollider : public VolumeCollider
+ {
+ public:
+ // Constructor / Destructor
+ OBBCollider();
+ virtual ~OBBCollider();
+
+ ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+ /**
+ * Generic collision query for generic OPCODE models. After the call, access the results:
+ * - with GetContactStatus()
+ * - with GetNbTouchedPrimitives()
+ * - with GetTouchedPrimitives()
+ *
+ * \param cache [in/out] a box cache
+ * \param box [in] collision OBB in local space
+ * \param model [in] Opcode model to collide with
+ * \param worldb [in] OBB's world matrix, or null
+ * \param worldm [in] model's world matrix, or null
+ * \return true if success
+ * \warning SCALE NOT SUPPORTED. The matrices must contain rotation & translation parts only.
+ */
+ ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+ bool Collide(OBBCache& cache, const OBB& box, const Model& model, const Matrix4x4* worldb=null, const Matrix4x4* worldm=null);
+
+ // Settings
+
+ ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+ /**
+ * Settings: select between full box-box tests or "SAT-lite" tests (where Class III axes are discarded)
+ * \param flag [in] true for full tests, false for coarse tests
+ */
+ ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+ inline_ void SetFullBoxBoxTest(bool flag) { mFullBoxBoxTest = flag; }
+
+ // Settings
+
+ ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+ /**
+ * Validates current settings. You should call this method after all the settings and callbacks have been defined for a collider.
+ * \return null if everything is ok, else a string describing the problem
+ */
+ ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+ override(Collider) const char* ValidateSettings();
+
+ protected:
+ // Precomputed data
+ Matrix3x3 mAR; //!< Absolute rotation matrix
+ Matrix3x3 mRModelToBox; //!< Rotation from model space to obb space
+ Matrix3x3 mRBoxToModel; //!< Rotation from obb space to model space
+ IcePoint mTModelToBox; //!< Translation from model space to obb space
+ IcePoint mTBoxToModel; //!< Translation from obb space to model space
+
+ IcePoint mBoxExtents;
+ IcePoint mB0; //!< - mTModelToBox + mBoxExtents
+ IcePoint mB1; //!< - mTModelToBox - mBoxExtents
+
+ float mBBx1;
+ float mBBy1;
+ float mBBz1;
+
+ float mBB_1;
+ float mBB_2;
+ float mBB_3;
+ float mBB_4;
+ float mBB_5;
+ float mBB_6;
+ float mBB_7;
+ float mBB_8;
+ float mBB_9;
+
+ // Leaf description
+ IcePoint mLeafVerts[3]; //!< Triangle vertices
+ // Settings
+ bool mFullBoxBoxTest; //!< Perform full BV-BV tests (true) or SAT-lite tests (false)
+ // Internal methods
+ void _Collide(const AABBCollisionNode* node);
+ void _Collide(const AABBNoLeafNode* node);
+ void _Collide(const AABBQuantizedNode* node);
+ void _Collide(const AABBQuantizedNoLeafNode* node);
+ void _CollideNoPrimitiveTest(const AABBCollisionNode* node);
+ void _CollideNoPrimitiveTest(const AABBNoLeafNode* node);
+ void _CollideNoPrimitiveTest(const AABBQuantizedNode* node);
+ void _CollideNoPrimitiveTest(const AABBQuantizedNoLeafNode* node);
+ // Overlap tests
+ inline_ BOOL OBBContainsBox(const IcePoint& bc, const IcePoint& be);
+ inline_ BOOL BoxBoxOverlap(const IcePoint& extents, const IcePoint& center);
+ inline_ BOOL TriBoxOverlap();
+ // Init methods
+ BOOL InitQuery(OBBCache& cache, const OBB& box, const Matrix4x4* worldb=null, const Matrix4x4* worldm=null);
+ };
+
+ class OPCODE_API HybridOBBCollider : public OBBCollider
+ {
+ public:
+ // Constructor / Destructor
+ HybridOBBCollider();
+ virtual ~HybridOBBCollider();
+
+ bool Collide(OBBCache& cache, const OBB& box, const HybridModel& model, const Matrix4x4* worldb=null, const Matrix4x4* worldm=null);
+ protected:
+ Container mTouchedBoxes;
+ };
+
+#endif // __OPC_OBBCOLLIDER_H__