diff --git a/sources/reactphysics3d/body/RigidBody.h b/sources/reactphysics3d/body/RigidBody.h index e2f2b215..d475a603 100644 --- a/sources/reactphysics3d/body/RigidBody.h +++ b/sources/reactphysics3d/body/RigidBody.h @@ -48,7 +48,6 @@ class RigidBody : public Body { Matrix3x3 inertiaTensorLocal; // Local inertia tensor of the body (in body coordinates) Matrix3x3 inertiaTensorLocalInverse; // Inverse of the inertia tensor of the body (in body coordinates) double massInverse; // Inverse of the mass of the body - double interpolationFactor; // Interpolation factor used for the state interpolation double restitution; // Coefficient of restitution (between 0 and 1), 1 for a very boucing body diff --git a/sources/reactphysics3d/engine/PhysicsWorld.cpp b/sources/reactphysics3d/engine/PhysicsWorld.cpp index fcb6d61e..53f3f96d 100644 --- a/sources/reactphysics3d/engine/PhysicsWorld.cpp +++ b/sources/reactphysics3d/engine/PhysicsWorld.cpp @@ -33,72 +33,8 @@ PhysicsWorld::PhysicsWorld(const Vector3D& gravity) // Destructor PhysicsWorld::~PhysicsWorld() { - -} - -// Add a body to the physics world -void PhysicsWorld::addBody(Body* body) throw(invalid_argument) { - // Check if the body pointer is not null - if (body != 0) { - // Check if the body pointer isn't already in the bodyList - for(vector::iterator it = bodies.begin(); it != bodies.end(); ++it) { - if (*it == body) { - // The body is already in the bodyList, therefore we throw an exception - throw invalid_argument("Exception in PhysicsWorld::addBody() : The argument body is already in the PhysicsWorld"); - } - } - - // The body isn't already in the bodyList, therefore we add it to the list - bodies.push_back(body); - addedBodies.push_back(body); - vector::iterator it = find(removedBodies.begin(), removedBodies.end(), body); - if (it != removedBodies.end()) { - removedBodies.erase(it); - } - } - else { - // Throw an exception - throw invalid_argument("Exception in PhysicsWorld::addBody() : The argument pointer cannot be NULL"); - } -} - -// Remove a body from the physics world -void PhysicsWorld::removeBody(Body const* const body) throw(invalid_argument) { - // Check if the body pointer is not null - if (body != 0) { - // Look for the body to remove in the bodyList - vector::iterator it = bodies.begin(); - while(it != bodies.end() && *it != body) { - // Increment the iterator - ++it; - } - - // If we have found the body to remove in the bodyList - if (*it == body) { - // Remove the body - bodies.erase(it); - addedBodies.erase(it); - removedBodies.push_back(*it); - } else { - // The body is not in the bodyList, therfore we throw an exception - throw invalid_argument("Exception in PhysicsWorld::removeBody() : The argument body to remove is not in the PhysicsWorld"); - } - } - else { - // Throw an exception - throw invalid_argument("Exception in PhysicsWorld::removeBody() : The argument pointer cannot be NULL"); - } -} - -// Add a constraint into the physics world -void PhysicsWorld::addConstraint(Constraint* constraint) throw(invalid_argument) { - assert(constraint != 0); - constraints.push_back(constraint); -} - -// Remove a constraint -void PhysicsWorld::removeConstraint(Constraint* constraint) throw(invalid_argument) { - // TODO : Implement this method + // Remove and free the memory of all constraints + removeAllConstraints(); } // Remove all collision contacts constraints @@ -121,3 +57,11 @@ void PhysicsWorld::removeAllContactConstraints() { } } +// Remove all constraints in the physics world and also delete them (free their memory) +void PhysicsWorld::removeAllConstraints() { + for (vector::iterator it = constraints.begin(); it != constraints.end(); it++) { + delete *it; + } + constraints.clear(); +} + diff --git a/sources/reactphysics3d/engine/PhysicsWorld.h b/sources/reactphysics3d/engine/PhysicsWorld.h index 3378318e..20d5325d 100644 --- a/sources/reactphysics3d/engine/PhysicsWorld.h +++ b/sources/reactphysics3d/engine/PhysicsWorld.h @@ -22,7 +22,7 @@ // Libraries #include -#include +#include #include "../mathematics/mathematics.h" #include "../body/Body.h" #include "../constraint/Constraint.h" @@ -51,24 +51,71 @@ class PhysicsWorld { PhysicsWorld(const Vector3D& gravity); // Constructor virtual ~PhysicsWorld(); // Destructor - void addBody(Body* body) throw(std::invalid_argument); // Add a body to the physics world - void removeBody(Body const* const body) throw(std::invalid_argument); // Remove a body from the physics world + void addBody(Body* body); // Add a body to the physics world + void removeBody(Body const* const body); // Remove a body from the physics world void clearAddedAndRemovedBodies(); // Clear the addedBodies and removedBodies sets Vector3D getGravity() const; // Return the gravity vector of the world bool getIsGravityOn() const; // Return if the gravity is on void setIsGratityOn(bool isGravityOn); // Set the isGravityOn attribute - void addConstraint(Constraint* constraint) throw(std::invalid_argument); // Add a constraint - void removeConstraint(Constraint* constraint) throw(std::invalid_argument); // Remove a constraint - void removeAllContactConstraints(); // Remove all collision contacts constraints - std::vector::iterator getConstraintsBeginIterator(); // Return a start iterator on the constraint list - std::vector::iterator getConstraintsEndIterator(); // Return a end iterator on the constraint list - std::vector::iterator getBodiesBeginIterator(); // Return an iterator to the beginning of the bodies of the physics world - std::vector::iterator getBodiesEndIterator(); // Return an iterator to the end of the bodies of the physics world - std::vector& getAddedBodies(); // Return the added bodies since last update of the physics engine - std::vector& getRemovedBodies(); // Retrun the removed bodies since last update of the physics engine + void addConstraint(Constraint* constraint); // Add a constraint + void removeConstraint(Constraint* constraint); // Remove a constraint + void removeAllContactConstraints(); // Remove all collision contacts constraints + void removeAllConstraints(); // Remove all constraints and delete them (free their memory) + std::vector::iterator getConstraintsBeginIterator(); // Return a start iterator on the constraint list + std::vector::iterator getConstraintsEndIterator(); // Return a end iterator on the constraint list + std::vector::iterator getBodiesBeginIterator(); // Return an iterator to the beginning of the bodies of the physics world + std::vector::iterator getBodiesEndIterator(); // Return an iterator to the end of the bodies of the physics world + std::vector& getAddedBodies(); // Return the added bodies since last update of the physics engine + std::vector& getRemovedBodies(); // Retrun the removed bodies since last update of the physics engine }; -// --- Inline functions --- // +// Add a body to the physics world +inline void PhysicsWorld::addBody(Body* body) { + std::vector::iterator it; + + assert(body); + it = std::find(bodies.begin(), bodies.end(), body); + assert(it == bodies.end()); + + // The body isn't already in the bodyList, therefore we add it to the list + bodies.push_back(body); + addedBodies.push_back(body); + it = std::find(removedBodies.begin(), removedBodies.end(), body); + if (it != removedBodies.end()) { + removedBodies.erase(it); + } +} + +// Remove a body from the physics world +inline void PhysicsWorld::removeBody(Body const* const body) { + std::vector::iterator it; + + assert(body); + it = std::find(bodies.begin(), bodies.end(), body); + assert(*it == body); + + // Remove the body + bodies.erase(it); + addedBodies.erase(it); + removedBodies.push_back(*it); +} + +// Add a constraint into the physics world +inline void PhysicsWorld::addConstraint(Constraint* constraint) { + assert(constraint != 0); + constraints.push_back(constraint); +} + +// Remove a constraint and free its memory +inline void PhysicsWorld::removeConstraint(Constraint* constraint) { + std::vector::iterator it; + + assert(constraint); + it = std::find(constraints.begin(), constraints.end(), constraint); + assert(*it == constraint); + delete *it; + constraints.erase(it); +} // Clear the addedBodies and removedBodies sets inline void PhysicsWorld::clearAddedAndRemovedBodies() {