summaryrefslogtreecommitdiffhomepage
path: root/third-party/Opcode/OPC_OBBCollider.h
diff options
context:
space:
mode:
Diffstat (limited to 'third-party/Opcode/OPC_OBBCollider.h')
-rw-r--r--third-party/Opcode/OPC_OBBCollider.h142
1 files changed, 142 insertions, 0 deletions
diff --git a/third-party/Opcode/OPC_OBBCollider.h b/third-party/Opcode/OPC_OBBCollider.h
new file mode 100644
index 0000000..9753384
--- /dev/null
+++ b/third-party/Opcode/OPC_OBBCollider.h
@@ -0,0 +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__