2011-10-18 22:03:05 +00:00
|
|
|
/********************************************************************************
|
2015-02-15 20:56:45 +00:00
|
|
|
* ReactPhysics3D physics library, http://www.reactphysics3d.com *
|
2016-04-11 18:15:20 +00:00
|
|
|
* Copyright (c) 2010-2016 Daniel Chappuis *
|
2011-10-18 22:03:05 +00:00
|
|
|
*********************************************************************************
|
|
|
|
* *
|
2011-11-13 17:49:03 +00:00
|
|
|
* This software is provided 'as-is', without any express or implied warranty. *
|
|
|
|
* In no event will the authors be held liable for any damages arising from the *
|
|
|
|
* use of this software. *
|
2011-10-18 22:03:05 +00:00
|
|
|
* *
|
2011-11-13 17:49:03 +00:00
|
|
|
* Permission is granted to anyone to use this software for any purpose, *
|
|
|
|
* including commercial applications, and to alter it and redistribute it *
|
|
|
|
* freely, subject to the following restrictions: *
|
|
|
|
* *
|
|
|
|
* 1. The origin of this software must not be misrepresented; you must not claim *
|
|
|
|
* that you wrote the original software. If you use this software in a *
|
|
|
|
* product, an acknowledgment in the product documentation would be *
|
|
|
|
* appreciated but is not required. *
|
|
|
|
* *
|
|
|
|
* 2. Altered source versions must be plainly marked as such, and must not be *
|
|
|
|
* misrepresented as being the original software. *
|
|
|
|
* *
|
|
|
|
* 3. This notice may not be removed or altered from any source distribution. *
|
2011-10-18 22:03:05 +00:00
|
|
|
* *
|
|
|
|
********************************************************************************/
|
|
|
|
|
2013-04-18 20:54:36 +00:00
|
|
|
#ifndef REACTPHYSICS3D_OVERLAPPING_PAIR_H
|
|
|
|
#define REACTPHYSICS3D_OVERLAPPING_PAIR_H
|
2011-10-18 22:03:05 +00:00
|
|
|
|
|
|
|
// Libraries
|
2015-10-02 05:04:05 +00:00
|
|
|
#include "collision/ContactManifoldSet.h"
|
2014-08-04 20:46:58 +00:00
|
|
|
#include "collision/ProxyShape.h"
|
2014-08-07 19:38:31 +00:00
|
|
|
#include "collision/shapes/CollisionShape.h"
|
2011-10-18 22:03:05 +00:00
|
|
|
|
2013-03-05 22:09:50 +00:00
|
|
|
/// ReactPhysics3D namespace
|
2011-10-18 22:03:05 +00:00
|
|
|
namespace reactphysics3d {
|
|
|
|
|
2014-04-11 21:50:00 +00:00
|
|
|
// Type for the overlapping pair ID
|
2016-07-06 05:05:34 +00:00
|
|
|
using overlappingpairid = std::pair<uint, uint>;
|
2014-04-11 21:50:00 +00:00
|
|
|
|
2017-05-29 06:32:10 +00:00
|
|
|
// Structure LastFrameCollisionInfo
|
|
|
|
/**
|
|
|
|
* This structure contains collision info about the last frame.
|
|
|
|
* This is used for temporal coherence between frames.
|
|
|
|
*/
|
|
|
|
struct LastFrameCollisionInfo {
|
|
|
|
|
|
|
|
/// True if we have information about the previous frame
|
|
|
|
bool isValid;
|
|
|
|
|
|
|
|
/// True if the two shapes were colliding in the previous frame
|
|
|
|
bool wasColliding;
|
|
|
|
|
|
|
|
/// True if we were using GJK algorithm to check for collision in the previous frame
|
|
|
|
bool wasUsingGJK;
|
|
|
|
|
|
|
|
/// True if we were using SAT algorithm to check for collision in the previous frame
|
|
|
|
bool wasUsingSAT;
|
|
|
|
|
|
|
|
/// True if there was a narrow-phase collision
|
|
|
|
/// in the previous frame
|
|
|
|
bool wasCollidingLastFrame;
|
|
|
|
|
|
|
|
// ----- GJK Algorithm -----
|
|
|
|
|
|
|
|
/// Previous separating axis
|
|
|
|
Vector3 gjkSeparatingAxis;
|
|
|
|
|
|
|
|
// SAT Algorithm
|
|
|
|
bool satIsAxisFacePolyhedron1;
|
|
|
|
bool satIsAxisFacePolyhedron2;
|
|
|
|
uint satMinAxisFaceIndex;
|
|
|
|
uint satMinEdge1Index;
|
|
|
|
uint satMinEdge2Index;
|
|
|
|
|
|
|
|
/// Constructor
|
|
|
|
LastFrameCollisionInfo() {
|
|
|
|
|
|
|
|
isValid = false;
|
|
|
|
wasColliding = false;
|
|
|
|
wasUsingSAT = false;
|
|
|
|
wasUsingGJK = false;
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
2013-03-05 22:09:50 +00:00
|
|
|
// Class OverlappingPair
|
|
|
|
/**
|
2014-04-11 21:50:00 +00:00
|
|
|
* This class represents a pair of two proxy collision shapes that are overlapping
|
2013-03-05 22:09:50 +00:00
|
|
|
* during the broad-phase collision detection. It is created when
|
2014-04-11 21:50:00 +00:00
|
|
|
* the two proxy collision shapes start to overlap and is destroyed when they do not
|
2013-03-05 22:09:50 +00:00
|
|
|
* overlap anymore. This class contains a contact manifold that
|
|
|
|
* store all the contact points between the two bodies.
|
|
|
|
*/
|
2011-10-18 22:03:05 +00:00
|
|
|
class OverlappingPair {
|
2012-10-09 20:21:02 +00:00
|
|
|
|
2011-10-18 22:03:05 +00:00
|
|
|
private:
|
2012-10-09 20:21:02 +00:00
|
|
|
|
|
|
|
// -------------------- Attributes -------------------- //
|
|
|
|
|
2015-10-02 05:04:05 +00:00
|
|
|
/// Set of persistent contact manifolds
|
|
|
|
ContactManifoldSet mContactManifoldSet;
|
2012-10-09 20:21:02 +00:00
|
|
|
|
2017-05-29 06:32:10 +00:00
|
|
|
/// Collision information about the last frame (for temporal coherence)
|
|
|
|
LastFrameCollisionInfo mLastFrameCollisionInfo;
|
2012-10-09 20:21:02 +00:00
|
|
|
|
2011-10-18 22:03:05 +00:00
|
|
|
public:
|
2012-10-09 20:21:02 +00:00
|
|
|
|
|
|
|
// -------------------- Methods -------------------- //
|
|
|
|
|
2013-03-05 22:09:50 +00:00
|
|
|
/// Constructor
|
2015-10-08 19:28:37 +00:00
|
|
|
OverlappingPair(ProxyShape* shape1, ProxyShape* shape2,
|
2016-09-21 20:03:45 +00:00
|
|
|
int nbMaxContactManifolds, PoolAllocator& memoryAllocator);
|
2012-10-09 20:21:02 +00:00
|
|
|
|
2013-03-05 22:09:50 +00:00
|
|
|
/// Destructor
|
2016-07-19 04:52:18 +00:00
|
|
|
~OverlappingPair() = default;
|
2016-07-08 05:25:37 +00:00
|
|
|
|
|
|
|
/// Deleted copy-constructor
|
|
|
|
OverlappingPair(const OverlappingPair& pair) = delete;
|
|
|
|
|
|
|
|
/// Deleted assignment operator
|
|
|
|
OverlappingPair& operator=(const OverlappingPair& pair) = delete;
|
2011-10-18 22:03:05 +00:00
|
|
|
|
2014-04-11 21:50:00 +00:00
|
|
|
/// Return the pointer to first proxy collision shape
|
2015-08-17 04:44:26 +00:00
|
|
|
ProxyShape* getShape1() const;
|
2012-10-09 20:21:02 +00:00
|
|
|
|
2013-03-05 22:09:50 +00:00
|
|
|
/// Return the pointer to second body
|
2015-08-17 04:44:26 +00:00
|
|
|
ProxyShape* getShape2() const;
|
2012-10-09 20:21:02 +00:00
|
|
|
|
2017-02-26 11:48:50 +00:00
|
|
|
/// Add a contact manifold
|
|
|
|
void addContactManifold(const ContactManifoldInfo& contactManifoldInfo);
|
2012-10-09 20:21:02 +00:00
|
|
|
|
2017-05-29 06:32:10 +00:00
|
|
|
/// Return the last frame collision info
|
|
|
|
LastFrameCollisionInfo& getLastFrameCollisionInfo();
|
2012-10-09 20:21:02 +00:00
|
|
|
|
2013-03-05 22:09:50 +00:00
|
|
|
/// Return the number of contacts in the cache
|
2013-02-28 18:50:52 +00:00
|
|
|
uint getNbContactPoints() const;
|
2012-10-09 20:21:02 +00:00
|
|
|
|
2015-10-15 05:48:28 +00:00
|
|
|
/// Return the a reference to the contact manifold set
|
|
|
|
const ContactManifoldSet& getContactManifoldSet();
|
2013-08-26 19:28:48 +00:00
|
|
|
|
2014-12-27 23:54:34 +00:00
|
|
|
/// Clear the contact points of the contact manifold
|
|
|
|
void clearContactPoints();
|
|
|
|
|
2014-04-11 21:50:00 +00:00
|
|
|
/// Return the pair of bodies index
|
|
|
|
static overlappingpairid computeID(ProxyShape* shape1, ProxyShape* shape2);
|
|
|
|
|
|
|
|
/// Return the pair of bodies index of the pair
|
|
|
|
static bodyindexpair computeBodiesIndexPair(CollisionBody* body1, CollisionBody* body2);
|
|
|
|
|
2013-08-26 19:28:48 +00:00
|
|
|
// -------------------- Friendship -------------------- //
|
|
|
|
|
|
|
|
friend class DynamicsWorld;
|
2011-10-18 22:03:05 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
// Return the pointer to first body
|
2015-08-17 04:44:26 +00:00
|
|
|
inline ProxyShape* OverlappingPair::getShape1() const {
|
2015-10-13 17:10:13 +00:00
|
|
|
return mContactManifoldSet.getShape1();
|
2011-10-18 22:03:05 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
// Return the pointer to second body
|
2015-08-17 04:44:26 +00:00
|
|
|
inline ProxyShape* OverlappingPair::getShape2() const {
|
2015-10-13 17:10:13 +00:00
|
|
|
return mContactManifoldSet.getShape2();
|
2011-10-18 22:03:05 +00:00
|
|
|
}
|
|
|
|
|
2013-02-26 21:43:45 +00:00
|
|
|
// Add a contact to the contact manifold
|
2017-02-26 11:48:50 +00:00
|
|
|
inline void OverlappingPair::addContactManifold(const ContactManifoldInfo& contactManifoldInfo) {
|
|
|
|
mContactManifoldSet.addContactManifold(contactManifoldInfo);
|
2013-02-28 18:50:52 +00:00
|
|
|
}
|
2011-10-18 22:03:05 +00:00
|
|
|
|
2017-05-29 06:32:10 +00:00
|
|
|
// Return the last frame collision info
|
|
|
|
inline LastFrameCollisionInfo& OverlappingPair::getLastFrameCollisionInfo() {
|
|
|
|
return mLastFrameCollisionInfo;
|
2013-02-28 18:50:52 +00:00
|
|
|
}
|
2011-10-18 22:03:05 +00:00
|
|
|
|
2013-02-28 18:50:52 +00:00
|
|
|
// Return the number of contact points in the contact manifold
|
|
|
|
inline uint OverlappingPair::getNbContactPoints() const {
|
2015-10-02 05:04:05 +00:00
|
|
|
return mContactManifoldSet.getTotalNbContactPoints();
|
2013-02-26 21:43:45 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
// Return the contact manifold
|
2015-10-15 05:48:28 +00:00
|
|
|
inline const ContactManifoldSet& OverlappingPair::getContactManifoldSet() {
|
|
|
|
return mContactManifoldSet;
|
2011-10-18 22:03:05 +00:00
|
|
|
}
|
|
|
|
|
2014-04-11 21:50:00 +00:00
|
|
|
// Return the pair of bodies index
|
|
|
|
inline overlappingpairid OverlappingPair::computeID(ProxyShape* shape1, ProxyShape* shape2) {
|
|
|
|
assert(shape1->mBroadPhaseID >= 0 && shape2->mBroadPhaseID >= 0);
|
|
|
|
|
|
|
|
// Construct the pair of body index
|
|
|
|
overlappingpairid pairID = shape1->mBroadPhaseID < shape2->mBroadPhaseID ?
|
|
|
|
std::make_pair(shape1->mBroadPhaseID, shape2->mBroadPhaseID) :
|
|
|
|
std::make_pair(shape2->mBroadPhaseID, shape1->mBroadPhaseID);
|
|
|
|
assert(pairID.first != pairID.second);
|
|
|
|
return pairID;
|
|
|
|
}
|
|
|
|
|
|
|
|
// Return the pair of bodies index
|
|
|
|
inline bodyindexpair OverlappingPair::computeBodiesIndexPair(CollisionBody* body1,
|
|
|
|
CollisionBody* body2) {
|
|
|
|
|
|
|
|
// Construct the pair of body index
|
|
|
|
bodyindexpair indexPair = body1->getID() < body2->getID() ?
|
|
|
|
std::make_pair(body1->getID(), body2->getID()) :
|
|
|
|
std::make_pair(body2->getID(), body1->getID());
|
|
|
|
assert(indexPair.first != indexPair.second);
|
|
|
|
return indexPair;
|
|
|
|
}
|
|
|
|
|
2014-12-27 23:54:34 +00:00
|
|
|
// Clear the contact points of the contact manifold
|
|
|
|
inline void OverlappingPair::clearContactPoints() {
|
2015-10-02 05:04:05 +00:00
|
|
|
mContactManifoldSet.clear();
|
2014-12-27 23:54:34 +00:00
|
|
|
}
|
|
|
|
|
2013-03-02 15:26:18 +00:00
|
|
|
}
|
2011-10-18 22:03:05 +00:00
|
|
|
|
|
|
|
#endif
|
|
|
|
|