diff options
Diffstat (limited to 'thirdparty/bullet/BulletDynamics/Dynamics')
4 files changed, 65 insertions, 7 deletions
diff --git a/thirdparty/bullet/BulletDynamics/Dynamics/btDiscreteDynamicsWorld.cpp b/thirdparty/bullet/BulletDynamics/Dynamics/btDiscreteDynamicsWorld.cpp index a3c9f42eb9..fb15ae31eb 100644 --- a/thirdparty/bullet/BulletDynamics/Dynamics/btDiscreteDynamicsWorld.cpp +++ b/thirdparty/bullet/BulletDynamics/Dynamics/btDiscreteDynamicsWorld.cpp @@ -800,6 +800,14 @@ public:  		///don't do CCD when the collision filters are not matching  		if (!ClosestConvexResultCallback::needsCollision(proxy0))  			return false; +		if (m_pairCache->getOverlapFilterCallback()) { +			btBroadphaseProxy* proxy1 = m_me->getBroadphaseHandle(); +			bool collides = m_pairCache->needsBroadphaseCollision(proxy0, proxy1); +			if (!collides) +			{ +				return false; +			} +		}  		btCollisionObject* otherObj = (btCollisionObject*)proxy0->m_clientObject; diff --git a/thirdparty/bullet/BulletDynamics/Dynamics/btRigidBody.cpp b/thirdparty/bullet/BulletDynamics/Dynamics/btRigidBody.cpp index 9e8705b001..27fdead761 100644 --- a/thirdparty/bullet/BulletDynamics/Dynamics/btRigidBody.cpp +++ b/thirdparty/bullet/BulletDynamics/Dynamics/btRigidBody.cpp @@ -136,8 +136,13 @@ void btRigidBody::setGravity(const btVector3& acceleration)  void btRigidBody::setDamping(btScalar lin_damping, btScalar ang_damping)  { -	m_linearDamping = btClamped(lin_damping, (btScalar)btScalar(0.0), (btScalar)btScalar(1.0)); -	m_angularDamping = btClamped(ang_damping, (btScalar)btScalar(0.0), (btScalar)btScalar(1.0)); +#ifdef BT_USE_OLD_DAMPING_METHOD +	m_linearDamping = btMax(lin_damping, btScalar(0.0)); +	m_angularDamping = btMax(ang_damping, btScalar(0.0)); +#else +	m_linearDamping = btClamped(lin_damping, btScalar(0.0), btScalar(1.0)); +	m_angularDamping = btClamped(ang_damping, btScalar(0.0), btScalar(1.0)); +#endif  }  ///applyDamping damps the velocity, using the given m_linearDamping and m_angularDamping @@ -146,10 +151,9 @@ void btRigidBody::applyDamping(btScalar timeStep)  	//On new damping: see discussion/issue report here: http://code.google.com/p/bullet/issues/detail?id=74  	//todo: do some performance comparisons (but other parts of the engine are probably bottleneck anyway -//#define USE_OLD_DAMPING_METHOD 1 -#ifdef USE_OLD_DAMPING_METHOD -	m_linearVelocity *= GEN_clamped((btScalar(1.) - timeStep * m_linearDamping), (btScalar)btScalar(0.0), (btScalar)btScalar(1.0)); -	m_angularVelocity *= GEN_clamped((btScalar(1.) - timeStep * m_angularDamping), (btScalar)btScalar(0.0), (btScalar)btScalar(1.0)); +#ifdef BT_USE_OLD_DAMPING_METHOD +	m_linearVelocity *= btMax((btScalar(1.0) - timeStep * m_linearDamping), btScalar(0.0)); +	m_angularVelocity *= btMax((btScalar(1.0) - timeStep * m_angularDamping), btScalar(0.0));  #else  	m_linearVelocity *= btPow(btScalar(1) - m_linearDamping, timeStep);  	m_angularVelocity *= btPow(btScalar(1) - m_angularDamping, timeStep); @@ -380,6 +384,9 @@ void btRigidBody::integrateVelocities(btScalar step)  	{  		m_angularVelocity *= (MAX_ANGVEL / step) / angvel;  	} +	#if defined(BT_CLAMP_VELOCITY_TO) && BT_CLAMP_VELOCITY_TO > 0 +	clampVelocity(m_angularVelocity); +	#endif  }  btQuaternion btRigidBody::getOrientation() const diff --git a/thirdparty/bullet/BulletDynamics/Dynamics/btRigidBody.h b/thirdparty/bullet/BulletDynamics/Dynamics/btRigidBody.h index 39d47cbbda..943d724cce 100644 --- a/thirdparty/bullet/BulletDynamics/Dynamics/btRigidBody.h +++ b/thirdparty/bullet/BulletDynamics/Dynamics/btRigidBody.h @@ -305,6 +305,9 @@ public:  	void applyTorque(const btVector3& torque)  	{  		m_totalTorque += torque * m_angularFactor; +		#if defined(BT_CLAMP_VELOCITY_TO) && BT_CLAMP_VELOCITY_TO > 0 +		clampVelocity(m_totalTorque); +		#endif  	}  	void applyForce(const btVector3& force, const btVector3& rel_pos) @@ -316,11 +319,17 @@ public:  	void applyCentralImpulse(const btVector3& impulse)  	{  		m_linearVelocity += impulse * m_linearFactor * m_inverseMass; +		#if defined(BT_CLAMP_VELOCITY_TO) && BT_CLAMP_VELOCITY_TO > 0 +		clampVelocity(m_linearVelocity); +		#endif  	}  	void applyTorqueImpulse(const btVector3& torque)  	{  		m_angularVelocity += m_invInertiaTensorWorld * torque * m_angularFactor; +		#if defined(BT_CLAMP_VELOCITY_TO) && BT_CLAMP_VELOCITY_TO > 0 +		clampVelocity(m_angularVelocity); +		#endif  	}  	void applyImpulse(const btVector3& impulse, const btVector3& rel_pos) @@ -361,20 +370,46 @@ public:      {          m_pushVelocity = v;      } -     + +    #if defined(BT_CLAMP_VELOCITY_TO) && BT_CLAMP_VELOCITY_TO > 0 +    void clampVelocity(btVector3& v) const { +        v.setX( +            fmax(-BT_CLAMP_VELOCITY_TO, +                 fmin(BT_CLAMP_VELOCITY_TO, v.getX())) +        ); +        v.setY( +            fmax(-BT_CLAMP_VELOCITY_TO, +                 fmin(BT_CLAMP_VELOCITY_TO, v.getY())) +        ); +        v.setZ( +            fmax(-BT_CLAMP_VELOCITY_TO, +                 fmin(BT_CLAMP_VELOCITY_TO, v.getZ())) +        ); +    } +    #endif +      void setTurnVelocity(const btVector3& v)      {          m_turnVelocity = v; +        #if defined(BT_CLAMP_VELOCITY_TO) && BT_CLAMP_VELOCITY_TO > 0 +        clampVelocity(m_turnVelocity); +        #endif      }      void applyCentralPushImpulse(const btVector3& impulse)      {          m_pushVelocity += impulse * m_linearFactor * m_inverseMass; +        #if defined(BT_CLAMP_VELOCITY_TO) && BT_CLAMP_VELOCITY_TO > 0 +        clampVelocity(m_pushVelocity); +        #endif      }      void applyTorqueTurnImpulse(const btVector3& torque)      {          m_turnVelocity += m_invInertiaTensorWorld * torque * m_angularFactor; +        #if defined(BT_CLAMP_VELOCITY_TO) && BT_CLAMP_VELOCITY_TO > 0 +        clampVelocity(m_turnVelocity); +        #endif      }  	void clearForces() @@ -408,12 +443,18 @@ public:  	{  		m_updateRevision++;  		m_linearVelocity = lin_vel; +		#if defined(BT_CLAMP_VELOCITY_TO) && BT_CLAMP_VELOCITY_TO > 0 +		clampVelocity(m_linearVelocity); +		#endif  	}  	inline void setAngularVelocity(const btVector3& ang_vel)  	{  		m_updateRevision++;  		m_angularVelocity = ang_vel; +		#if defined(BT_CLAMP_VELOCITY_TO) && BT_CLAMP_VELOCITY_TO > 0 +		clampVelocity(m_angularVelocity); +		#endif  	}  	btVector3 getVelocityInLocalPoint(const btVector3& rel_pos) const diff --git a/thirdparty/bullet/BulletDynamics/Dynamics/btSimulationIslandManagerMt.cpp b/thirdparty/bullet/BulletDynamics/Dynamics/btSimulationIslandManagerMt.cpp index 5353fe009e..772b774202 100644 --- a/thirdparty/bullet/BulletDynamics/Dynamics/btSimulationIslandManagerMt.cpp +++ b/thirdparty/bullet/BulletDynamics/Dynamics/btSimulationIslandManagerMt.cpp @@ -171,6 +171,8 @@ void btSimulationIslandManagerMt::initIslandPools()  btSimulationIslandManagerMt::Island* btSimulationIslandManagerMt::getIsland(int id)  { +	btAssert(id >= 0); +	btAssert(id < m_lookupIslandFromId.size());  	Island* island = m_lookupIslandFromId[id];  	if (island == NULL)  	{  |