-Remove unnecessary contact manifold
-Delete the BroadPhasePair class
This commit is contained in:
parent
2570d794c3
commit
5f7af61593
|
@ -79,8 +79,6 @@ SET (REACTPHYSICS3D_SOURCES
|
|||
"src/collision/shapes/CylinderShape.cpp"
|
||||
"src/collision/shapes/SphereShape.h"
|
||||
"src/collision/shapes/SphereShape.cpp"
|
||||
"src/collision/BroadPhasePair.h"
|
||||
"src/collision/BroadPhasePair.cpp"
|
||||
"src/collision/RaycastInfo.h"
|
||||
"src/collision/RaycastInfo.cpp"
|
||||
"src/collision/ProxyShape.h"
|
||||
|
|
|
@ -102,7 +102,7 @@ Scene::Scene(Viewer* viewer, const std::string& shaderFolderPath, const std::str
|
|||
}
|
||||
|
||||
// Create all the spheres of the scene
|
||||
for (int i=0; i<NB_SPHERES; i++) {
|
||||
for (int i=0; i<NB_CUBES; i++) {
|
||||
|
||||
// Position
|
||||
float angle = i * 35.0f;
|
||||
|
@ -301,15 +301,6 @@ Scene::~Scene() {
|
|||
delete (*it);
|
||||
}
|
||||
|
||||
// Destroy all the visual contact points
|
||||
for (std::vector<VisualContactPoint*>::iterator it = mContactPoints.begin();
|
||||
it != mContactPoints.end(); ++it) {
|
||||
delete (*it);
|
||||
}
|
||||
|
||||
// Destroy the static data for the visual contact points
|
||||
VisualContactPoint::destroyStaticData();
|
||||
|
||||
// Destroy the rigid body of the floor
|
||||
mDynamicsWorld->destroyRigidBody(mFloor->getRigidBody());
|
||||
|
||||
|
@ -380,27 +371,6 @@ void Scene::simulate() {
|
|||
(*it)->updateTransform();
|
||||
}
|
||||
|
||||
// Destroy all the visual contact points
|
||||
for (std::vector<VisualContactPoint*>::iterator it = mContactPoints.begin();
|
||||
it != mContactPoints.end(); ++it) {
|
||||
delete (*it);
|
||||
}
|
||||
mContactPoints.clear();
|
||||
|
||||
// Generate the new visual contact points
|
||||
const std::vector<rp3d::ContactManifold*>& manifolds = mDynamicsWorld->getContactManifolds();
|
||||
for (std::vector<rp3d::ContactManifold*>::const_iterator it = manifolds.begin();
|
||||
it != manifolds.end(); ++it) {
|
||||
for (unsigned int i=0; i<(*it)->getNbContactPoints(); i++) {
|
||||
rp3d::ContactPoint* point = (*it)->getContactPoint(i);
|
||||
|
||||
const rp3d::Vector3 pos = point->getWorldPointOnBody1();
|
||||
openglframework::Vector3 position(pos.x, pos.y, pos.z);
|
||||
VisualContactPoint* visualPoint = new VisualContactPoint(position);
|
||||
mContactPoints.push_back(visualPoint);
|
||||
}
|
||||
}
|
||||
|
||||
mFloor->updateTransform();
|
||||
}
|
||||
}
|
||||
|
@ -466,12 +436,6 @@ void Scene::render() {
|
|||
(*it)->render(mPhongShader, worldToCameraMatrix);
|
||||
}
|
||||
|
||||
// Render all the visual contact points
|
||||
for (std::vector<VisualContactPoint*>::iterator it = mContactPoints.begin();
|
||||
it != mContactPoints.end(); ++it) {
|
||||
(*it)->render(mPhongShader, worldToCameraMatrix);
|
||||
}
|
||||
|
||||
// Render the floor
|
||||
mFloor->render(mPhongShader, worldToCameraMatrix);
|
||||
|
||||
|
|
|
@ -41,7 +41,7 @@
|
|||
|
||||
// Constants
|
||||
const int NB_BOXES = 2;
|
||||
const int NB_SPHERES = 1;
|
||||
const int NB_CUBES = 1;
|
||||
const int NB_CONES = 3;
|
||||
const int NB_CYLINDERS = 2;
|
||||
const int NB_CAPSULES = 1;
|
||||
|
@ -97,9 +97,6 @@ class Scene {
|
|||
/// All the dumbbell of the scene
|
||||
std::vector<Dumbbell*> mDumbbells;
|
||||
|
||||
/// All the visual contact points
|
||||
std::vector<VisualContactPoint*> mContactPoints;
|
||||
|
||||
/// Box for the floor
|
||||
Box* mFloor;
|
||||
|
||||
|
|
|
@ -60,7 +60,7 @@ Scene::Scene(Viewer* viewer, const std::string& shaderFolderPath)
|
|||
float radius = 2.0f;
|
||||
|
||||
// Create all the cubes of the scene
|
||||
for (int i=0; i<NB_SPHERES; i++) {
|
||||
for (int i=0; i<NB_CUBES; i++) {
|
||||
|
||||
// Position of the cubes
|
||||
float angle = i * 30.0f;
|
||||
|
@ -132,7 +132,9 @@ void Scene::simulate() {
|
|||
if (mIsRunning) {
|
||||
|
||||
counter++;
|
||||
if (counter == 1000) mIsRunning = false;
|
||||
if (counter == 400) {
|
||||
//mIsRunning = false;
|
||||
}
|
||||
|
||||
// Take a simulation step
|
||||
mDynamicsWorld->update();
|
||||
|
|
|
@ -33,7 +33,7 @@
|
|||
#include "Viewer.h"
|
||||
|
||||
// Constants
|
||||
const int NB_SPHERES = 200; // Number of boxes in the scene
|
||||
const int NB_CUBES = 200; // Number of boxes in the scene
|
||||
const openglframework::Vector3 BOX_SIZE(2, 2, 2); // Box dimensions in meters
|
||||
const openglframework::Vector3 FLOOR_SIZE(50, 0.5f, 50); // Floor dimensions in meters
|
||||
const float BOX_MASS = 1.0f; // Box mass in kilograms
|
||||
|
|
|
@ -246,10 +246,30 @@ void CollisionBody::askForBroadPhaseCollisionCheck() const {
|
|||
// For all the proxy collision shapes of the body
|
||||
for (ProxyShape* shape = mProxyCollisionShapes; shape != NULL; shape = shape->mNext) {
|
||||
|
||||
mWorld.mCollisionDetection.askForBroadPhaseCollisionCheck(shape);
|
||||
mWorld.mCollisionDetection.askForBroadPhaseCollisionCheck(shape);
|
||||
}
|
||||
}
|
||||
|
||||
// Reset the mIsAlreadyInIsland variable of the body and contact manifolds.
|
||||
/// This method also returns the number of contact manifolds of the body.
|
||||
int CollisionBody::resetIsAlreadyInIslandAndCountManifolds() {
|
||||
|
||||
mIsAlreadyInIsland = false;
|
||||
|
||||
int nbManifolds = 0;
|
||||
|
||||
// Reset the mIsAlreadyInIsland variable of the contact manifolds for
|
||||
// this body
|
||||
ContactManifoldListElement* currentElement = mContactManifoldsList;
|
||||
while (currentElement != NULL) {
|
||||
currentElement->contactManifold->mIsAlreadyInIsland = false;
|
||||
currentElement = currentElement->next;
|
||||
nbManifolds++;
|
||||
}
|
||||
|
||||
return nbManifolds;
|
||||
}
|
||||
|
||||
// Return true if a point is inside the collision body
|
||||
bool CollisionBody::testPointInside(const Vector3& worldPoint) const {
|
||||
|
||||
|
|
|
@ -118,6 +118,9 @@ class CollisionBody : public Body {
|
|||
/// (as if the body has moved).
|
||||
void askForBroadPhaseCollisionCheck() const;
|
||||
|
||||
/// Reset the mIsAlreadyInIsland variable of the body and contact manifolds
|
||||
int resetIsAlreadyInIslandAndCountManifolds();
|
||||
|
||||
public :
|
||||
|
||||
// -------------------- Methods -------------------- //
|
||||
|
|
|
@ -1,40 +0,0 @@
|
|||
/********************************************************************************
|
||||
* ReactPhysics3D physics library, http://code.google.com/p/reactphysics3d/ *
|
||||
* Copyright (c) 2010-2013 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. *
|
||||
* *
|
||||
********************************************************************************/
|
||||
|
||||
// Libraries
|
||||
#include "BroadPhasePair.h"
|
||||
|
||||
using namespace reactphysics3d;
|
||||
|
||||
// Constructor
|
||||
BroadPhasePair::BroadPhasePair(CollisionBody* body1, CollisionBody* body2)
|
||||
: body1(body1), body2(body2), previousSeparatingAxis(Vector3(1,1,1)) {
|
||||
|
||||
}
|
||||
|
||||
// Destructor
|
||||
BroadPhasePair::~BroadPhasePair() {
|
||||
|
||||
}
|
|
@ -1,111 +0,0 @@
|
|||
/********************************************************************************
|
||||
* ReactPhysics3D physics library, http://code.google.com/p/reactphysics3d/ *
|
||||
* Copyright (c) 2010-2013 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_BROAD_PHASE_PAIR_H
|
||||
#define REACTPHYSICS3D_BROAD_PHASE_PAIR_H
|
||||
|
||||
// Libraries
|
||||
#include "body/CollisionBody.h"
|
||||
|
||||
/// ReactPhysics3D namespace
|
||||
namespace reactphysics3d {
|
||||
|
||||
// TODO : DELETE THIS CLASS
|
||||
// Structure BroadPhasePair
|
||||
/**
|
||||
* This structure represents a pair of bodies
|
||||
* during the broad-phase collision detection.
|
||||
*/
|
||||
struct BroadPhasePair {
|
||||
|
||||
public:
|
||||
|
||||
// -------------------- Attributes -------------------- //
|
||||
|
||||
/// Pointer to the first body
|
||||
CollisionBody* body1;
|
||||
|
||||
/// Pointer to the second body
|
||||
CollisionBody* body2;
|
||||
|
||||
/// Previous cached separating axis
|
||||
Vector3 previousSeparatingAxis;
|
||||
|
||||
// -------------------- Methods -------------------- //
|
||||
|
||||
/// Constructor
|
||||
BroadPhasePair(CollisionBody* body1, CollisionBody* body2);
|
||||
|
||||
/// Destructor
|
||||
~BroadPhasePair();
|
||||
|
||||
/// Return the pair of bodies index
|
||||
static bodyindexpair computeBodiesIndexPair(CollisionBody* body1, CollisionBody* body2);
|
||||
|
||||
/// Return the pair of bodies index
|
||||
bodyindexpair getBodiesIndexPair() const;
|
||||
|
||||
/// Smaller than operator
|
||||
bool operator<(const BroadPhasePair& broadPhasePair2) const;
|
||||
|
||||
/// Larger than operator
|
||||
bool operator>(const BroadPhasePair& broadPhasePair2) const;
|
||||
|
||||
/// Equal operator
|
||||
bool operator==(const BroadPhasePair& broadPhasePair2) const;
|
||||
|
||||
/// Not equal operator
|
||||
bool operator!=(const BroadPhasePair& broadPhasePair2) const;
|
||||
};
|
||||
|
||||
// Return the pair of bodies index
|
||||
inline bodyindexpair BroadPhasePair::getBodiesIndexPair() const {
|
||||
|
||||
return computeBodiesIndexPair(body1, body2);
|
||||
}
|
||||
|
||||
// Smaller than operator
|
||||
inline bool BroadPhasePair::operator<(const BroadPhasePair& broadPhasePair2) const {
|
||||
return (body1 < broadPhasePair2.body1 ? true : (body2 < broadPhasePair2.body2));
|
||||
}
|
||||
|
||||
// Larger than operator
|
||||
inline bool BroadPhasePair::operator>(const BroadPhasePair& broadPhasePair2) const {
|
||||
return (body1 > broadPhasePair2.body1 ? true : (body2 > broadPhasePair2.body2));
|
||||
}
|
||||
|
||||
// Equal operator
|
||||
inline bool BroadPhasePair::operator==(const BroadPhasePair& broadPhasePair2) const {
|
||||
return (body1 == broadPhasePair2.body1 && body2 == broadPhasePair2.body2);
|
||||
}
|
||||
|
||||
// Not equal operator
|
||||
inline bool BroadPhasePair::operator!=(const BroadPhasePair& broadPhasePair2) const {
|
||||
return (body1 != broadPhasePair2.body1 || body2 != broadPhasePair2.body2);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
#endif
|
|
@ -220,9 +220,6 @@ void CollisionDetection::createContact(OverlappingPair* overlappingPair,
|
|||
// Add the contact to the contact cache of the corresponding overlapping pair
|
||||
overlappingPair->addContact(contact);
|
||||
|
||||
// Add the contact manifold to the list of contact manifolds
|
||||
mContactManifolds.push_back(overlappingPair->getContactManifold());
|
||||
|
||||
// Add the contact manifold into the list of contact manifolds
|
||||
// of the two bodies involved in the contact
|
||||
addContactManifoldToBody(overlappingPair->getContactManifold(),
|
||||
|
|
|
@ -80,10 +80,6 @@ class CollisionDetection {
|
|||
/// True if some collision shapes have been added previously
|
||||
bool mIsCollisionShapesAdded;
|
||||
|
||||
/// All the contact constraints
|
||||
// TODO : Remove this variable (we will use the ones in the island now)
|
||||
std::vector<ContactManifold*> mContactManifolds;
|
||||
|
||||
// -------------------- Methods -------------------- //
|
||||
|
||||
/// Private copy-constructor
|
||||
|
|
|
@ -66,9 +66,6 @@ class CollisionWorld {
|
|||
/// All the collision shapes of the world
|
||||
std::list<CollisionShape*> mCollisionShapes;
|
||||
|
||||
/// Broad-phase overlapping pairs of bodies
|
||||
std::map<bodyindexpair, OverlappingPair*> mOverlappingPairs;
|
||||
|
||||
/// Current body ID
|
||||
bodyindex mCurrentBodyID;
|
||||
|
||||
|
|
|
@ -210,6 +210,7 @@ class ContactManifold {
|
|||
|
||||
friend class DynamicsWorld;
|
||||
friend class Island;
|
||||
friend class CollisionBody;
|
||||
};
|
||||
|
||||
// Return a pointer to the first body of the contact manifold
|
||||
|
|
|
@ -57,14 +57,6 @@ DynamicsWorld::DynamicsWorld(const Vector3 &gravity, decimal timeStep = DEFAULT_
|
|||
// Destructor
|
||||
DynamicsWorld::~DynamicsWorld() {
|
||||
|
||||
// Delete the remaining overlapping pairs
|
||||
map<std::pair<bodyindex, bodyindex>, OverlappingPair*>::iterator it;
|
||||
for (it = mOverlappingPairs.begin(); it != mOverlappingPairs.end(); it++) {
|
||||
// Delete the overlapping pair
|
||||
(*it).second->OverlappingPair::~OverlappingPair();
|
||||
mMemoryAllocator.release((*it).second, sizeof(OverlappingPair));
|
||||
}
|
||||
|
||||
// Release the memory allocated for the islands
|
||||
for (uint i=0; i<mNbIslands; i++) {
|
||||
|
||||
|
@ -117,9 +109,6 @@ void DynamicsWorld::update() {
|
|||
// While the time accumulator is not empty
|
||||
while(mTimer.isPossibleToTakeStep()) {
|
||||
|
||||
// Remove all contact manifolds
|
||||
mCollisionDetection.mContactManifolds.clear();
|
||||
|
||||
// Reset all the contact manifolds lists of each body
|
||||
resetContactManifoldListsOfBodies();
|
||||
|
||||
|
@ -676,13 +665,12 @@ void DynamicsWorld::computeIslands() {
|
|||
}
|
||||
mNbIslands = 0;
|
||||
|
||||
int nbContactManifolds = 0;
|
||||
|
||||
// Reset all the isAlreadyInIsland variables of bodies, joints and contact manifolds
|
||||
for (std::set<RigidBody*>::iterator it = mRigidBodies.begin(); it != mRigidBodies.end(); ++it) {
|
||||
(*it)->mIsAlreadyInIsland = false;
|
||||
}
|
||||
for (std::vector<ContactManifold*>::iterator it = mCollisionDetection.mContactManifolds.begin();
|
||||
it != mCollisionDetection.mContactManifolds.end(); ++it) {
|
||||
(*it)->mIsAlreadyInIsland = false;
|
||||
int nbBodyManifolds = (*it)->resetIsAlreadyInIslandAndCountManifolds();
|
||||
nbContactManifolds += nbBodyManifolds;
|
||||
}
|
||||
for (std::set<Joint*>::iterator it = mJoints.begin(); it != mJoints.end(); ++it) {
|
||||
(*it)->mIsAlreadyInIsland = false;
|
||||
|
@ -715,7 +703,7 @@ void DynamicsWorld::computeIslands() {
|
|||
// Create the new island
|
||||
void* allocatedMemoryIsland = mMemoryAllocator.allocate(sizeof(Island));
|
||||
mIslands[mNbIslands] = new (allocatedMemoryIsland) Island(nbBodies,
|
||||
mCollisionDetection.mContactManifolds.size(),
|
||||
nbContactManifolds,
|
||||
mJoints.size(), mMemoryAllocator);
|
||||
|
||||
// While there are still some bodies to visit in the stack
|
||||
|
|
|
@ -242,9 +242,6 @@ class DynamicsWorld : public CollisionWorld {
|
|||
/// Return the number of joints in the world
|
||||
uint getNbJoints() const;
|
||||
|
||||
/// Return the number of contact manifolds in the world
|
||||
uint getNbContactManifolds() const;
|
||||
|
||||
/// Return the current physics time (in seconds)
|
||||
long double getPhysicsTime() const;
|
||||
|
||||
|
@ -254,9 +251,6 @@ class DynamicsWorld : public CollisionWorld {
|
|||
/// Return an iterator to the end of the rigid bodies of the physics world
|
||||
std::set<RigidBody*>::iterator getRigidBodiesEndIterator();
|
||||
|
||||
/// Return a reference to the contact manifolds of the world
|
||||
const std::vector<ContactManifold*>& getContactManifolds() const;
|
||||
|
||||
/// Return true if the sleeping technique is enabled
|
||||
bool isSleepingEnabled() const;
|
||||
|
||||
|
@ -382,18 +376,6 @@ inline std::set<RigidBody*>::iterator DynamicsWorld::getRigidBodiesEndIterator()
|
|||
return mRigidBodies.end();
|
||||
}
|
||||
|
||||
// Return a reference to the contact manifolds of the world
|
||||
// TODO : DELETE THIS METHOD AND USE EVENT LISTENER IN EXAMPLES INSTEAD
|
||||
inline const std::vector<ContactManifold*>& DynamicsWorld::getContactManifolds() const {
|
||||
return mCollisionDetection.mContactManifolds;
|
||||
}
|
||||
|
||||
// Return the number of contact manifolds in the world
|
||||
// TODO : DELETE THIS METHOD AND USE EVENT LISTENER IN EXAMPLES INSTEAD
|
||||
inline uint DynamicsWorld::getNbContactManifolds() const {
|
||||
return mCollisionDetection.mContactManifolds.size();
|
||||
}
|
||||
|
||||
// Return the current physics time (in seconds)
|
||||
inline long double DynamicsWorld::getPhysicsTime() const {
|
||||
return mTimer.getPhysicsTime();
|
||||
|
|
Loading…
Reference in New Issue
Block a user