diff --git a/sources/reactphysics3d/engine/Timer.cpp b/sources/reactphysics3d/engine/Timer.cpp
new file mode 100644
index 00000000..e90a9d4b
--- /dev/null
+++ b/sources/reactphysics3d/engine/Timer.cpp
@@ -0,0 +1,85 @@
+/****************************************************************************
+ * Copyright (C) 2009 Daniel Chappuis *
+ ****************************************************************************
+ * This file is part of ReactPhysics3D. *
+ * *
+ * ReactPhysics3D is free software: you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation, either version 3 of the License, or *
+ * (at your option) any later version. *
+ * *
+ * ReactPhysics3D is distributed in the hope that it will be useful, *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
+ * GNU General Public License for more details. *
+ * *
+ * You should have received a copy of the GNU General Public License *
+ * along with ReactPhysics3D. If not, see . *
+ ***************************************************************************/
+
+// Libraries
+#include "Timer.h"
+
+// We want to use the ReactPhysics3D namespace
+using namespace reactphysics3d;
+
+ // Constructor
+ Timer::Timer(const Time& initialTime, const Time& timeStep) throw(std::invalid_argument)
+ : timeStep(timeStep), time(initialTime), currentDisplayTime(Time(0.0)), deltatDisplayTime(Time(0.0)) {
+ // Check if the timestep is different from zero
+ if (timeStep.getValue() != 0.0) {
+ accumulator = 0.0;
+ isRunning = false;
+
+ }
+ else {
+ // We throw an exception
+ throw std::invalid_argument("Exception in Timer constructor : The timestep has to be different from zero");
+ }
+ }
+
+
+// Copy-constructor
+Timer::Timer(const Timer& timer)
+ : timeStep(timer.timeStep), time(timer.time), currentDisplayTime(timer.currentDisplayTime),
+ deltatDisplayTime(timer.deltatDisplayTime), accumulator(timer.accumulator) {
+ isRunning = timer.isRunning;
+}
+
+// Destructor
+Timer::~Timer() {
+
+}
+
+// Update the timer
+void Timer::update() {
+ // Update the current time of the physics engine
+ time.setValue(time.getValue() + timeStep.getValue());
+
+ // Update the accumulator value
+ accumulator -= timeStep.getValue();
+}
+
+// Compute and return the interpolation factor between two body states
+double Timer::getInterpolationFactor() const {
+ // Compute and return the interpolation factor
+ return (accumulator / timeStep.getValue());
+}
+
+// Set the new currentDisplayTime value
+void Timer::updateDisplayTime(const Time& newDisplayTime) {
+ // Compute the delta display time between two display frames
+ deltatDisplayTime.setValue(newDisplayTime.getValue() - currentDisplayTime.getValue());
+
+ // Update the current display time
+ currentDisplayTime = newDisplayTime;
+}
+
+
+
+
+
+
+
+
+
diff --git a/sources/reactphysics3d/engine/Timer.h b/sources/reactphysics3d/engine/Timer.h
new file mode 100644
index 00000000..40c62e95
--- /dev/null
+++ b/sources/reactphysics3d/engine/Timer.h
@@ -0,0 +1,108 @@
+/****************************************************************************
+ * Copyright (C) 2009 Daniel Chappuis *
+ ****************************************************************************
+ * This file is part of ReactPhysics3D. *
+ * *
+ * ReactPhysics3D is free software: you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation, either version 3 of the License, or *
+ * (at your option) any later version. *
+ * *
+ * ReactPhysics3D is distributed in the hope that it will be useful, *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
+ * GNU General Public License for more details. *
+ * *
+ * You should have received a copy of the GNU General Public License *
+ * along with ReactPhysics3D. If not, see . *
+ ***************************************************************************/
+
+ #ifndef TIMER_H
+ #define TIMER_H
+
+ // Libraries
+ #include "../physics/physics.h"
+ #include
+
+ // Namespace ReactPhysics3D
+ namespace reactphysics3d {
+
+/* -------------------------------------------------------------------
+ Class Timer :
+ This class will take care of the time in the physics engine.
+ -------------------------------------------------------------------
+*/
+class Timer {
+ private :
+ Time timeStep; // Timestep dt of the physics engine (timestep > 0.0)
+ Time time; // Current time of the physics engine
+ Time currentDisplayTime; // Current display time
+ Time deltatDisplayTime; // Current time difference between two display frames
+ double accumulator; // Used to fix the time step and avoid strange time effects
+ bool isRunning; // True if the timer is running
+
+ public :
+ Timer(const Time& initialTime, const Time& timeStep) throw(std::invalid_argument); // Constructor
+ Timer(const Timer& timer); // Copy-constructor
+ virtual ~Timer(); // Destructor
+
+ Time getTimeStep() const; // Return the timestep of the physics engine
+ void setTimeStep(const Time& timeStep) throw(std::invalid_argument); // Set the timestep of the physics engine
+ Time getTime() const; // Return the current time
+ void setTime(const Time& time); // Set the current time
+ bool getIsRunning() const; // Return if the timer is running
+ void setIsRunning(bool isRunning); // Set if the timer is running
+ double getAccumulator() const; // Return the accumulator value
+
+ void update(); // Update the timer
+ double getInterpolationFactor() const; // Compute and return the interpolation factor between two body states
+ void updateDisplayTime(const Time& newDisplayTime); // Set the new currentDisplayTime value
+};
+
+// --- Inline functions --- //
+
+// Return the timestep of the physics engine
+inline Time Timer::getTimeStep() const {
+ return timeStep;
+}
+
+// Set the timestep of the physics engine
+inline void Timer::setTimeStep(const Time& timeStep) throw(std::invalid_argument) {
+ // Check if the timestep is different from zero
+ if (timeStep.getValue() != 0.0) {
+ this->timeStep = timeStep;
+ }
+ else {
+ // We throw an exception
+ throw std::invalid_argument("Exception in Timer : the timestep has to be different from zero");
+ }
+}
+
+// Return the current time
+inline Time Timer::getTime() const {
+ return time;
+}
+
+// Set the current time
+inline void Timer::setTime(const Time& time) {
+ this->time = time;
+}
+
+// Return if the timer is running
+inline bool Timer::getIsRunning() const {
+ return isRunning;
+}
+
+// Set if the timer is running
+inline void Timer::setIsRunning(bool isRunning) {
+ this->isRunning = isRunning;
+}
+
+// Return the accumulator value
+inline double Timer::getAccumulator() const {
+ return accumulator;
+}
+
+ } // End of the ReactPhysics3D namespace
+
+ #endif
diff --git a/sources/reactphysics3d/engine/World.cpp b/sources/reactphysics3d/engine/World.cpp
new file mode 100644
index 00000000..5461826e
--- /dev/null
+++ b/sources/reactphysics3d/engine/World.cpp
@@ -0,0 +1,81 @@
+/****************************************************************************
+* Copyright (C) 2009 Daniel Chappuis *
+****************************************************************************
+* This file is part of ReactPhysics3D. *
+* *
+* ReactPhysics3D is free software: you can redistribute it and/or modify *
+* it under the terms of the GNU General Public License as published by *
+* the Free Software Foundation, either version 3 of the License, or *
+* (at your option) any later version. *
+* *
+* ReactPhysics3D is distributed in the hope that it will be useful, *
+* but WITHOUT ANY WARRANTY; without even the implied warranty of *
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
+* GNU General Public License for more details. *
+* *
+* You should have received a copy of the GNU General Public License *
+* along with ReactPhysics3D. If not, see . *
+***************************************************************************/
+
+// Libraries
+#include "World.h"
+
+// We want to use the ReactPhysics3D namespace
+using namespace reactphysics3d;
+
+// Constructor
+PhysicsWorld::PhysicsWorld(const Vector3D& gravity) : gravity(gravity) {
+
+}
+
+// Destructor
+PhysicsWorld::~PhysicsWorld() {
+
+}
+
+// Add a body to the physics world
+void PhysicsWorld::addBody(Body* body) throw(std::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(std::vector::iterator it = bodyList.begin(); it != bodyList.end(); ) {
+ if (*it == body) {
+ // The body is already in the bodyList, therefore we throw an exception
+ throw std::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
+ bodyList.push_back(body);
+ }
+ else {
+ // Throw an exception
+ throw std::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(std::invalid_argument) {
+ // Check if the body pointer is not null
+ if (body != 0) {
+ // Look for the body to remove in the bodyList
+ std::vector::iterator it = bodyList.begin();
+ while(it != bodyList.end() && *it != body) {
+ // Increment the iterator
+ ++it;
+ }
+
+ // If we have found the body to remove in the bodyList
+ if (*it == body) {
+ // Remove the body
+ bodyList.erase(it);
+ } else {
+ // The body is not in the bodyList, therfore we throw an exception
+ throw std::invalid_argument("Exception in PhysicsWorld::removeBody() : The argument body to remove is not in the PhysicsWorld");
+ }
+ }
+ else {
+ // Throw an exception
+ throw std::invalid_argument("Exception in PhysicsWorld::removeBody() : The argument pointer cannot be NULL");
+ }
+}
diff --git a/sources/reactphysics3d/engine/World.h b/sources/reactphysics3d/engine/World.h
new file mode 100644
index 00000000..048e8b74
--- /dev/null
+++ b/sources/reactphysics3d/engine/World.h
@@ -0,0 +1,57 @@
+/****************************************************************************
+* Copyright (C) 2009 Daniel Chappuis *
+****************************************************************************
+* This file is part of ReactPhysics3D. *
+* *
+* ReactPhysics3D is free software: you can redistribute it and/or modify *
+* it under the terms of the GNU General Public License as published by *
+* the Free Software Foundation, either version 3 of the License, or *
+* (at your option) any later version. *
+* *
+* ReactPhysics3D is distributed in the hope that it will be useful, *
+* but WITHOUT ANY WARRANTY; without even the implied warranty of *
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
+* GNU General Public License for more details. *
+* *
+* You should have received a copy of the GNU General Public License *
+* along with ReactPhysics3D. If not, see . *
+***************************************************************************/
+
+#ifndef WORLD_H
+#define WORLD_H
+
+// Libraries
+#include
+#include
+#include "../mathematics/mathematics.h"
+#include "../body/Body.h"
+
+// Namespace reactphysics3d
+namespace reactphysics3d {
+
+/* -------------------------------------------------------------------
+ Class PhysicsWorld :
+ This is an abstract class that represents the world of the
+ physics engine. A physics world contains all the bodies of the physics
+ engine.
+ -------------------------------------------------------------------
+*/
+class PhysicsWorld {
+ private :
+ PhysicsWorld(const PhysicsWorld&); // Copy-constructor is private because we don't want it to be used
+
+ protected :
+ std::vector bodyList; // list that contains all bodies of the physics world
+ Vector3D gravity; // Gravity vector of the world
+
+ public :
+ 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
+};
+
+} // End of the ReactPhysics3D namespace
+
+ #endif