From 22b88a49701495a471486a6c834aebfca94f4a9a Mon Sep 17 00:00:00 2001 From: "chappuis.daniel" Date: Tue, 10 Feb 2009 14:31:43 +0000 Subject: [PATCH] git-svn-id: https://reactphysics3d.googlecode.com/svn/trunk@82 92aac97c-a6ce-11dd-a772-7fcde58d38e6 --- sources/reactphysics3d/engine/PhysicsEngine.h | 53 ++++++++++++ .../reactphysics3d/engine/PhysicsWorld.cpp | 81 +++++++++++++++++++ sources/reactphysics3d/engine/PhysicsWorld.h | 57 +++++++++++++ 3 files changed, 191 insertions(+) create mode 100644 sources/reactphysics3d/engine/PhysicsEngine.h create mode 100644 sources/reactphysics3d/engine/PhysicsWorld.cpp create mode 100644 sources/reactphysics3d/engine/PhysicsWorld.h diff --git a/sources/reactphysics3d/engine/PhysicsEngine.h b/sources/reactphysics3d/engine/PhysicsEngine.h new file mode 100644 index 00000000..ef94d4a3 --- /dev/null +++ b/sources/reactphysics3d/engine/PhysicsEngine.h @@ -0,0 +1,53 @@ +/**************************************************************************** +* 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 PHYSICSENGINE_H +#define PHYSICSENGINE_H + +// Libraries +#include "PhysicsWorld.h" +#include "Timer.h" + +// Namespace ReactPhysics3D +namespace reactphysics3d { + +/* ------------------------------------------------------------------- + Class PhysicsEngine : + This is an abstract class that represents the physics engine + of the library. + ------------------------------------------------------------------- +*/ +class PhysicsEngine { + private : + PhysicsEngine(const PhysicsEngine&); // Copy-constructor is private because we don't want it to be used + + protected : + PhysicsWorld world; // Physics world of the physics engine + Timer timer; // Timer of the physics engine + + public : + PhysicsEngine(); // Constructor + virtual ~PhysicsEngine(); // Destructor + + virtual void update()=0; // Update the physics simulation +}; + +} + +#endif diff --git a/sources/reactphysics3d/engine/PhysicsWorld.cpp b/sources/reactphysics3d/engine/PhysicsWorld.cpp new file mode 100644 index 00000000..5461826e --- /dev/null +++ b/sources/reactphysics3d/engine/PhysicsWorld.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/PhysicsWorld.h b/sources/reactphysics3d/engine/PhysicsWorld.h new file mode 100644 index 00000000..af03d5ca --- /dev/null +++ b/sources/reactphysics3d/engine/PhysicsWorld.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