2 Bullet Continuous Collision Detection and Physics Library
3 Copyright (c) 2003-2006 Erwin Coumans http://continuousphysics.com/Bullet/
5 This software is provided 'as-is', without any express or implied warranty.
6 In no event will the authors be held liable for any damages arising from the use of this software.
7 Permission is granted to anyone to use this software for any purpose,
8 including commercial applications, and to alter it and redistribute it freely,
9 subject to the following restrictions:
11 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.
12 2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software.
13 3. This notice may not be removed or altered from any source distribution.
16 #ifndef CCDPHYSICSENVIRONMENT
17 #define CCDPHYSICSENVIRONMENT
19 #include "PHY_IPhysicsEnvironment.h"
22 class CcdPhysicsController;
23 #include "LinearMath/btVector3.h"
24 #include "LinearMath/btTransform.h"
29 class btTypedConstraint;
30 class btSimulationIslandManager;
31 class btCollisionDispatcher;
33 //#include "btBroadphaseInterface.h"
35 //switch on/off new vehicle support
36 #define NEW_BULLET_VEHICLE_SUPPORT 1
38 #include "BulletDynamics/ConstraintSolver/btContactSolverInfo.h"
41 class btPersistentManifold;
42 class btBroadphaseInterface;
43 class btOverlappingPairCache;
46 class CcdOverlapFilterCallBack;
48 /// CcdPhysicsEnvironment is an experimental mainloop for physics simulation using optional continuous collision detection.
49 /// Physics Environment takes care of stepping the simulation and is a container for physics entities.
50 /// It stores rigidbodies,constraints, materials etc.
51 /// A derived class may be able to 'construct' entities by loading and/or converting
52 class CcdPhysicsEnvironment : public PHY_IPhysicsEnvironment
54 friend class CcdOverlapFilterCallBack;
58 btIDebugDraw* m_debugDrawer;
60 class btDefaultCollisionConfiguration* m_collisionConfiguration;
61 class btBroadphaseInterface* m_broadphase;
66 //timestep subdivisions
67 int m_numTimeSubSteps;
73 bool m_enableSatCollisionDetection;
75 btContactSolverInfo m_solverInfo;
79 CcdPhysicsEnvironment(btDispatcher* dispatcher=0, btOverlappingPairCache* pairCache=0);
81 virtual ~CcdPhysicsEnvironment();
83 /////////////////////////////////////
84 //PHY_IPhysicsEnvironment interface
85 /////////////////////////////////////
87 /// Perform an integration step of duration 'timeStep'.
89 virtual void setDebugDrawer(btIDebugDraw* debugDrawer);
91 virtual void setNumIterations(int numIter);
92 virtual void setNumTimeSubSteps(int numTimeSubSteps)
94 m_numTimeSubSteps = numTimeSubSteps;
96 virtual void setDeactivationTime(float dTime);
97 virtual void setDeactivationLinearTreshold(float linTresh) ;
98 virtual void setDeactivationAngularTreshold(float angTresh) ;
99 virtual void setContactBreakingTreshold(float contactBreakingTreshold) ;
100 virtual void setCcdMode(int ccdMode);
101 virtual void setSolverType(int solverType);
102 virtual void setSolverSorConstant(float sor);
103 virtual void setSolverTau(float tau);
104 virtual void setSolverDamping(float damping);
105 virtual void setLinearAirDamping(float damping);
106 virtual void setUseEpa(bool epa) ;
108 virtual void beginFrame();
109 virtual void endFrame() {};
110 /// Perform an integration step of duration 'timeStep'.
111 virtual bool proceedDeltaTime(double curTime,float timeStep);
112 // virtual bool proceedDeltaTimeOneStep(float timeStep);
114 virtual void setFixedTimeStep(bool useFixedTimeStep,float fixedTimeStep){};
115 //returns 0.f if no fixed timestep is used
117 virtual float getFixedTimeStep(){ return 0.f;};
119 virtual void setDebugMode(int debugMode);
121 virtual void setGravity(float x,float y,float z);
122 virtual void getGravity(PHY__Vector3& grav);
125 virtual int createConstraint(class PHY_IPhysicsController* ctrl,class PHY_IPhysicsController* ctrl2,PHY_ConstraintType type,
126 float pivotX,float pivotY,float pivotZ,
127 float axisX,float axisY,float axisZ,
128 float axis1X=0,float axis1Y=0,float axis1Z=0,
129 float axis2X=0,float axis2Y=0,float axis2Z=0
133 //Following the COLLADA physics specification for constraints
134 virtual int createUniversalD6Constraint(
135 class PHY_IPhysicsController* ctrlRef,class PHY_IPhysicsController* ctrlOther,
136 btTransform& localAttachmentFrameRef,
137 btTransform& localAttachmentOther,
138 const btVector3& linearMinLimits,
139 const btVector3& linearMaxLimits,
140 const btVector3& angularMinLimits,
141 const btVector3& angularMaxLimits
144 virtual void setConstraintParam(int constraintId,int param,float value,float value1);
146 virtual void removeConstraint(int constraintid);
148 virtual float getAppliedImpulse(int constraintid);
151 virtual void CallbackTriggers();
154 #ifdef NEW_BULLET_VEHICLE_SUPPORT
155 //complex constraint for vehicles
156 virtual PHY_IVehicle* getVehicleConstraint(int constraintId);
158 virtual class PHY_IVehicle* getVehicleConstraint(int constraintId)
162 #endif //NEW_BULLET_VEHICLE_SUPPORT
164 btTypedConstraint* getConstraintById(int constraintId);
166 virtual PHY_IPhysicsController* rayTest(PHY_IRayCastFilterCallback &filterCallback, float fromX,float fromY,float fromZ, float toX,float toY,float toZ);
169 //Methods for gamelogic collision/physics callbacks
170 virtual void addSensor(PHY_IPhysicsController* ctrl);
171 virtual void removeSensor(PHY_IPhysicsController* ctrl);
172 virtual void addTouchCallback(int response_class, PHY_ResponseCallback callback, void *user);
173 virtual void requestCollisionCallback(PHY_IPhysicsController* ctrl);
174 virtual void removeCollisionCallback(PHY_IPhysicsController* ctrl);
175 //These two methods are used *solely* to create controllers for Near/Radar sensor! Don't use for anything else
176 virtual PHY_IPhysicsController* CreateSphereController(float radius,const PHY__Vector3& position);
177 virtual PHY_IPhysicsController* CreateConeController(float coneradius,float coneheight);
180 virtual int getNumContactPoints();
182 virtual void getContactPoint(int i,float& hitX,float& hitY,float& hitZ,float& normalX,float& normalY,float& normalZ);
184 //////////////////////
185 //CcdPhysicsEnvironment interface
186 ////////////////////////
188 void addCcdPhysicsController(CcdPhysicsController* ctrl);
190 void removeCcdPhysicsController(CcdPhysicsController* ctrl);
192 void updateCcdPhysicsController(CcdPhysicsController* ctrl, btScalar newMass, int newCollisionFlags, short int newCollisionGroup, short int newCollisionMask);
194 void disableCcdPhysicsController(CcdPhysicsController* ctrl);
196 void enableCcdPhysicsController(CcdPhysicsController* ctrl);
198 btBroadphaseInterface* getBroadphase();
200 btDispatcher* getDispatcher();
203 bool IsSatCollisionDetectionEnabled() const
205 return m_enableSatCollisionDetection;
208 void EnableSatCollisionDetection(bool enableSat)
210 m_enableSatCollisionDetection = enableSat;
214 const btPersistentManifold* GetManifold(int index) const;
217 void SyncMotionStates(float timeStep);
221 class btConstraintSolver* GetConstraintSolver();
228 std::set<CcdPhysicsController*> m_controllers;
230 std::set<CcdPhysicsController*> m_triggerControllers;
232 PHY_ResponseCallback m_triggerCallbacks[PHY_NUM_RESPONSE];
233 void* m_triggerCallbacksUserPtrs[PHY_NUM_RESPONSE];
235 std::vector<WrapperVehicle*> m_wrapperVehicles;
237 //use explicit btSoftRigidDynamicsWorld/btDiscreteDynamicsWorld* so that we have access to
238 //btDiscreteDynamicsWorld::addRigidBody(body,filter,group)
239 //so that we can set the body collision filter/group at the time of creation
240 //and not afterwards (breaks the collision system for radar/near sensor)
241 //Ideally we would like to have access to this function from the btDynamicsWorld interface
242 //class btDynamicsWorld* m_dynamicsWorld;
243 class btSoftRigidDynamicsWorld* m_dynamicsWorld;
245 class btConstraintSolver* m_solver;
247 class btOverlappingPairCache* m_ownPairCache;
249 class CcdOverlapFilterCallBack* m_filterCallback;
251 class btDispatcher* m_ownDispatcher;
253 bool m_scalingPropagated;
259 #endif //CCDPHYSICSENVIRONMENT