#ifndef CSV_WORLD_PHYSICSENGINE_H #define CSV_WORLD_PHYSICSENGINE_H #include #include #include class btBroadphaseInterface; class btDefaultCollisionConfiguration; class btSequentialImpulseConstraintSolver; class btCollisionDispatcher; class btDiscreteDynamicsWorld; class btHeightfieldTerrainShape; namespace BtOgre { class DebugDrawer; } namespace Ogre { class Vector3; class SceneNode; class SceneManager; class Quaternion; } namespace OEngine { namespace Physic { class BulletShapeLoader; } } namespace CSVWorld { // This class is just an extension of normal btRigidBody in order to add extra info. // When bullet give back a btRigidBody, you can just do a static_cast to RigidBody, // so one never should use btRigidBody directly! class RigidBody: public btRigidBody { std::string mReferenceId; public: RigidBody(btRigidBody::btRigidBodyConstructionInfo &CI, const std::string &referenceId); virtual ~RigidBody(); std::string getReferenceId() const { return mReferenceId; } }; struct HeightField { btHeightfieldTerrainShape* mShape; RigidBody* mBody; }; // The PhysicsEngine class contain everything which is needed for Physic. // It's needed that Ogre Resources are set up before the PhysicsEngine is created. // Note:deleting it WILL NOT delete the RigidBody! class PhysicsEngine { //Bullet Stuff btBroadphaseInterface *mBroadphase; btDefaultCollisionConfiguration *mCollisionConfiguration; btSequentialImpulseConstraintSolver *mSolver; btCollisionDispatcher *mDispatcher; btDiscreteDynamicsWorld *mDynamicsWorld; //the NIF file loader. OEngine::Physic::BulletShapeLoader *mShapeLoader; typedef std::map HeightFieldContainer; HeightFieldContainer mHeightFieldMap; typedef std::map RigidBodyContainer; RigidBodyContainer mCollisionObjectMap; RigidBodyContainer mRaycastingObjectMap; std::map mDebugDrawers; std::map mDebugSceneNodes; enum CollisionType { CollisionType_Nothing = 0, // rayTest(const btVector3 &from, const btVector3 &to, bool raycastingObjectOnly = true, bool ignoreHeightMap = false, Ogre::Vector3* normal = NULL); private: PhysicsEngine(const PhysicsEngine&); PhysicsEngine& operator=(const PhysicsEngine&); // Create a debug rendering. It is called by setDebgRenderingMode if it's // not created yet. // Important Note: this will crash if the Render is not yet initialised! void createDebugRendering(); // Set the debug rendering mode. 0 to turn it off. // Important Note: this will crash if the Render is not yet initialised! void setDebugRenderingMode(int mode); }; } #endif // CSV_WORLD_PHYSICSENGINE_H