engine/dep/include/reactphysics3d/collision/narrowphase/CollisionDispatch.h

227 lines
9.8 KiB
C++

/********************************************************************************
* ReactPhysics3D physics library, http://www.reactphysics3d.com *
* Copyright (c) 2010-2022 Daniel Chappuis *
*********************************************************************************
* *
* 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. *
* *
* 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. *
* *
********************************************************************************/
#ifndef REACTPHYSICS3D_COLLISION_DISPATCH_H
#define REACTPHYSICS3D_COLLISION_DISPATCH_H
// Libraries
#include <reactphysics3d/collision/narrowphase/SphereVsSphereAlgorithm.h>
#include <reactphysics3d/collision/narrowphase/SphereVsConvexPolyhedronAlgorithm.h>
#include <reactphysics3d/collision/narrowphase/SphereVsCapsuleAlgorithm.h>
#include <reactphysics3d/collision/narrowphase/CapsuleVsCapsuleAlgorithm.h>
#include <reactphysics3d/collision/narrowphase/CapsuleVsConvexPolyhedronAlgorithm.h>
#include <reactphysics3d/collision/narrowphase/ConvexPolyhedronVsConvexPolyhedronAlgorithm.h>
#include <reactphysics3d/collision/shapes/CollisionShape.h>
namespace reactphysics3d {
/// Enumeration for the type of narrow-phase
/// collision detection algorithm
enum class NarrowPhaseAlgorithmType {
None,
SphereVsSphere,
SphereVsCapsule,
CapsuleVsCapsule,
SphereVsConvexPolyhedron,
CapsuleVsConvexPolyhedron,
ConvexPolyhedronVsConvexPolyhedron
};
// Class CollisionDispatch
/**
* This is the collision dispatch configuration use in ReactPhysics3D.
* Collision dispatching decides which collision
* algorithm to use given two types of colliders.
*/
class CollisionDispatch {
protected:
/// Memory allocator
MemoryAllocator& mAllocator;
/// True if the sphere vs sphere algorithm is the default one
bool mIsSphereVsSphereDefault = true;
/// True if the capsule vs capsule algorithm is the default one
bool mIsCapsuleVsCapsuleDefault = true;
/// True if the sphere vs capsule algorithm is the default one
bool mIsSphereVsCapsuleDefault = true;
/// True if the sphere vs convex polyhedron algorithm is the default one
bool mIsSphereVsConvexPolyhedronDefault = true;
/// True if the capsule vs convex polyhedron algorithm is the default one
bool mIsCapsuleVsConvexPolyhedronDefault = true;
/// True if the convex polyhedron vs convex polyhedron algorithm is the default one
bool mIsConvexPolyhedronVsConvexPolyhedronDefault = true;
/// Sphere vs Sphere collision algorithm
SphereVsSphereAlgorithm* mSphereVsSphereAlgorithm;
/// Capsule vs Capsule collision algorithm
CapsuleVsCapsuleAlgorithm* mCapsuleVsCapsuleAlgorithm;
/// Sphere vs Capsule collision algorithm
SphereVsCapsuleAlgorithm* mSphereVsCapsuleAlgorithm;
/// Sphere vs Convex Polyhedron collision algorithm
SphereVsConvexPolyhedronAlgorithm* mSphereVsConvexPolyhedronAlgorithm;
/// Capsule vs Convex Polyhedron collision algorithm
CapsuleVsConvexPolyhedronAlgorithm* mCapsuleVsConvexPolyhedronAlgorithm;
/// Convex Polyhedron vs Convex Polyhedron collision algorithm
ConvexPolyhedronVsConvexPolyhedronAlgorithm* mConvexPolyhedronVsConvexPolyhedronAlgorithm;
/// Collision detection matrix (algorithms to use)
NarrowPhaseAlgorithmType mCollisionMatrix[NB_COLLISION_SHAPE_TYPES][NB_COLLISION_SHAPE_TYPES];
/// Select and return the narrow-phase collision detection algorithm to
/// use between two types of collision shapes.
NarrowPhaseAlgorithmType selectAlgorithm(int type1, int type2);
#ifdef IS_RP3D_PROFILING_ENABLED
/// Pointer to the profiler
Profiler* mProfiler;
#endif
public:
/// Constructor
CollisionDispatch(MemoryAllocator& allocator);
/// Destructor
~CollisionDispatch();
/// Set the Sphere vs Sphere narrow-phase collision detection algorithm
void setSphereVsSphereAlgorithm(SphereVsSphereAlgorithm* algorithm);
/// Get the Sphere vs Sphere narrow-phase collision detection algorithm
SphereVsSphereAlgorithm* getSphereVsSphereAlgorithm();
/// Set the Sphere vs Capsule narrow-phase collision detection algorithm
void setSphereVsCapsuleAlgorithm(SphereVsCapsuleAlgorithm* algorithm);
/// Get the Sphere vs Capsule narrow-phase collision detection algorithm
SphereVsCapsuleAlgorithm* getSphereVsCapsuleAlgorithm();
/// Set the Capsule vs Capsule narrow-phase collision detection algorithm
void setCapsuleVsCapsuleAlgorithm(CapsuleVsCapsuleAlgorithm* algorithm);
/// Get the Capsule vs Capsule narrow-phase collision detection algorithm
CapsuleVsCapsuleAlgorithm* getCapsuleVsCapsuleAlgorithm();
/// Set the Sphere vs Convex Polyhedron narrow-phase collision detection algorithm
void setSphereVsConvexPolyhedronAlgorithm(SphereVsConvexPolyhedronAlgorithm* algorithm);
/// Get the Sphere vs Convex Polyhedron narrow-phase collision detection algorithm
SphereVsConvexPolyhedronAlgorithm* getSphereVsConvexPolyhedronAlgorithm();
/// Set the Capsule vs Convex Polyhedron narrow-phase collision detection algorithm
void setCapsuleVsConvexPolyhedronAlgorithm(CapsuleVsConvexPolyhedronAlgorithm* algorithm);
/// Get the Capsule vs Convex Polyhedron narrow-phase collision detection algorithm
CapsuleVsConvexPolyhedronAlgorithm* getCapsuleVsConvexPolyhedronAlgorithm();
/// Set the Convex Polyhedron vs Convex Polyhedron narrow-phase collision detection algorithm
void setConvexPolyhedronVsConvexPolyhedronAlgorithm(ConvexPolyhedronVsConvexPolyhedronAlgorithm* algorithm);
/// Get the Convex Polyhedron vs Convex Polyhedron narrow-phase collision detection algorithm
ConvexPolyhedronVsConvexPolyhedronAlgorithm* getConvexPolyhedronVsConvexPolyhedronAlgorithm();
/// Fill-in the collision detection matrix
void fillInCollisionMatrix();
/// Return the corresponding narrow-phase algorithm type to use for two collision shapes
NarrowPhaseAlgorithmType selectNarrowPhaseAlgorithm(const CollisionShapeType& shape1Type,
const CollisionShapeType& shape2Type) const;
#ifdef IS_RP3D_PROFILING_ENABLED
/// Set the profiler
void setProfiler(Profiler* profiler);
#endif
};
// Get the Sphere vs Sphere narrow-phase collision detection algorithm
RP3D_FORCE_INLINE SphereVsSphereAlgorithm* CollisionDispatch::getSphereVsSphereAlgorithm() {
return mSphereVsSphereAlgorithm;
}
// Get the Sphere vs Capsule narrow-phase collision detection algorithm
RP3D_FORCE_INLINE SphereVsCapsuleAlgorithm* CollisionDispatch::getSphereVsCapsuleAlgorithm() {
return mSphereVsCapsuleAlgorithm;
}
// Get the Capsule vs Capsule narrow-phase collision detection algorithm
RP3D_FORCE_INLINE CapsuleVsCapsuleAlgorithm* CollisionDispatch::getCapsuleVsCapsuleAlgorithm() {
return mCapsuleVsCapsuleAlgorithm;
}
// Get the Sphere vs Convex Polyhedron narrow-phase collision detection algorithm
RP3D_FORCE_INLINE SphereVsConvexPolyhedronAlgorithm* CollisionDispatch::getSphereVsConvexPolyhedronAlgorithm() {
return mSphereVsConvexPolyhedronAlgorithm;
}
// Get the Capsule vs Convex Polyhedron narrow-phase collision detection algorithm
RP3D_FORCE_INLINE CapsuleVsConvexPolyhedronAlgorithm* CollisionDispatch::getCapsuleVsConvexPolyhedronAlgorithm() {
return mCapsuleVsConvexPolyhedronAlgorithm;
}
// Get the Convex Polyhedron vs Convex Polyhedron narrow-phase collision detection algorithm
RP3D_FORCE_INLINE ConvexPolyhedronVsConvexPolyhedronAlgorithm* CollisionDispatch::getConvexPolyhedronVsConvexPolyhedronAlgorithm() {
return mConvexPolyhedronVsConvexPolyhedronAlgorithm;
}
#ifdef IS_RP3D_PROFILING_ENABLED
// Set the profiler
RP3D_FORCE_INLINE void CollisionDispatch::setProfiler(Profiler* profiler) {
mProfiler = profiler;
mSphereVsSphereAlgorithm->setProfiler(profiler);
mCapsuleVsCapsuleAlgorithm->setProfiler(profiler);
mSphereVsCapsuleAlgorithm->setProfiler(profiler);
mSphereVsConvexPolyhedronAlgorithm->setProfiler(profiler);
mCapsuleVsConvexPolyhedronAlgorithm->setProfiler(profiler);
mConvexPolyhedronVsConvexPolyhedronAlgorithm->setProfiler(profiler);
}
#endif
}
#endif