summaryrefslogtreecommitdiffhomepage
path: root/contrib/Opcode/OPC_SweepAndPrune.h
diff options
context:
space:
mode:
Diffstat (limited to 'contrib/Opcode/OPC_SweepAndPrune.h')
-rw-r--r--contrib/Opcode/OPC_SweepAndPrune.h86
1 files changed, 86 insertions, 0 deletions
diff --git a/contrib/Opcode/OPC_SweepAndPrune.h b/contrib/Opcode/OPC_SweepAndPrune.h
new file mode 100644
index 0000000..cbb87ac
--- /dev/null
+++ b/contrib/Opcode/OPC_SweepAndPrune.h
@@ -0,0 +1,86 @@
+///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+/*
+ * OPCODE - Optimized Collision Detection
+ * Copyright (C) 2001 Pierre Terdiman
+ * Homepage: http://www.codercorner.com/Opcode.htm
+ */
+///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+
+///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+/**
+ * Contains an implementation of the sweep-and-prune algorithm (moved from Z-Collide)
+ * \file OPC_SweepAndPrune.h
+ * \author Pierre Terdiman
+ * \date January, 29, 2000
+ */
+///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+
+///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+// Include Guard
+#ifndef __OPC_SWEEPANDPRUNE_H__
+#define __OPC_SWEEPANDPRUNE_H__
+
+ ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+ /**
+ * User-callback, called by OPCODE for each colliding pairs.
+ * \param id0 [in] id of colliding object
+ * \param id1 [in] id of colliding object
+ * \param user_data [in] user-defined data
+ * \return TRUE to continue enumeration
+ */
+ ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+ typedef BOOL (*PairCallback) (udword id0, udword id1, void* user_data);
+
+ class SAP_Element;
+ class SAP_EndPoint;
+ class SAP_Box;
+
+ class OPCODE_API SAP_PairData
+ {
+ public:
+ SAP_PairData();
+ ~SAP_PairData();
+
+ bool Init(udword nb_objects);
+
+ void AddPair(udword id1, udword id2);
+ void RemovePair(udword id1, udword id2);
+
+ void DumpPairs(Pairs& pairs) const;
+ void DumpPairs(PairCallback callback, void* user_data) const;
+ private:
+ udword mNbElements; //!< Total number of elements in the pool
+ udword mNbUsedElements; //!< Number of used elements
+ SAP_Element* mElementPool; //!< Array of mNbElements elements
+ SAP_Element* mFirstFree; //!< First free element in the pool
+
+ udword mNbObjects; //!< Max number of objects we can handle
+ SAP_Element** mArray; //!< Pointers to pool
+ // Internal methods
+ SAP_Element* GetFreeElem(udword id, SAP_Element* next, udword* remap=null);
+ inline_ void FreeElem(SAP_Element* elem);
+ void Release();
+ };
+
+ class OPCODE_API SweepAndPrune
+ {
+ public:
+ SweepAndPrune();
+ ~SweepAndPrune();
+
+ bool Init(udword nb_objects, const AABB** boxes);
+ bool UpdateObject(udword i, const AABB& box);
+
+ void GetPairs(Pairs& pairs) const;
+ void GetPairs(PairCallback callback, void* user_data) const;
+ private:
+ SAP_PairData mPairs;
+
+ udword mNbObjects;
+ SAP_Box* mBoxes;
+ SAP_EndPoint* mList[3];
+ // Internal methods
+ bool CheckListsIntegrity();
+ };
+
+#endif //__OPC_SWEEPANDPRUNE_H__ \ No newline at end of file