/******************************************************************************** * 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_BODY_H #define REACTPHYSICS3D_BODY_H // Libraries #include #include #include "../configuration.h" /// Namespace reactphysics3d namespace reactphysics3d { // Class Body /** * This class is an abstract class to represent a body of the physics engine. */ class Body { protected : // -------------------- Attributes -------------------- // /// ID of the body bodyindex mID; /// True if the body has already been added in an island (for sleeping technique) bool mIsAlreadyInIsland; /// True if the body is allowed to go to sleep for better efficiency bool mIsAllowedToSleep; /// True if the body is active bool mIsActive; /// True if the body is sleeping (for sleeping technique) bool mIsSleeping; /// Elapsed time since the body velocity was bellow the sleep velocity decimal mSleepTime; /// Pointer that can be used to attach user data to the body void* mUserData; // -------------------- Methods -------------------- // /// Private copy-constructor Body(const Body& body); /// Private assignment operator Body& operator=(const Body& body); public : // -------------------- Methods -------------------- // /// Constructor Body(bodyindex id); /// Destructor virtual ~Body(); /// Return the id of the body bodyindex getID() const; /// Return whether or not the body is allowed to sleep bool isAllowedToSleep() const; /// Set whether or not the body is allowed to go to sleep void setIsAllowedToSleep(bool isAllowedToSleep); /// Return whether or not the body is sleeping bool isSleeping() const; /// Return true if the body is active bool isActive() const; /// Set the variable to know whether or not the body is sleeping virtual void setIsSleeping(bool isSleeping); /// Return a pointer to the user data attached to this body void* getUserData() const; /// Attach user data to this body void setUserData(void* userData); /// Smaller than operator bool operator<(const Body& body2) const; /// Larger than operator bool operator>(const Body& body2) const; /// Equal operator bool operator==(const Body& body2) const; /// Not equal operator bool operator!=(const Body& body2) const; // -------------------- Friendship -------------------- // friend class DynamicsWorld; }; // Return the id of the body inline bodyindex Body::getID() const { return mID; } // Return whether or not the body is allowed to sleep inline bool Body::isAllowedToSleep() const { return mIsAllowedToSleep; } // Set whether or not the body is allowed to go to sleep inline void Body::setIsAllowedToSleep(bool isAllowedToSleep) { mIsAllowedToSleep = isAllowedToSleep; if (!mIsAllowedToSleep) setIsSleeping(false); } // Return whether or not the body is sleeping inline bool Body::isSleeping() const { return mIsSleeping; } // Return true if the body is active inline bool Body::isActive() const { return mIsActive; } // Set the variable to know whether or not the body is sleeping inline void Body::setIsSleeping(bool isSleeping) { if (isSleeping) { mSleepTime = decimal(0.0); } else { if (mIsSleeping) { mSleepTime = decimal(0.0); } } mIsSleeping = isSleeping; } // Return a pointer to the user data attached to this body inline void* Body::getUserData() const { return mUserData; } // Attach user data to this body inline void Body::setUserData(void* userData) { mUserData = userData; } // Smaller than operator inline bool Body::operator<(const Body& body2) const { return (mID < body2.mID); } // Larger than operator inline bool Body::operator>(const Body& body2) const { return (mID > body2.mID); } // Equal operator inline bool Body::operator==(const Body& body2) const { return (mID == body2.mID); } // Not equal operator inline bool Body::operator!=(const Body& body2) const { return (mID != body2.mID); } } #endif