Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'source/gameengine/Physics/Bullet/CcdPhysicsEnvironment.cpp')
-rw-r--r--source/gameengine/Physics/Bullet/CcdPhysicsEnvironment.cpp74
1 files changed, 65 insertions, 9 deletions
diff --git a/source/gameengine/Physics/Bullet/CcdPhysicsEnvironment.cpp b/source/gameengine/Physics/Bullet/CcdPhysicsEnvironment.cpp
index 89c8c124bc8..759e8bd6f7e 100644
--- a/source/gameengine/Physics/Bullet/CcdPhysicsEnvironment.cpp
+++ b/source/gameengine/Physics/Bullet/CcdPhysicsEnvironment.cpp
@@ -410,6 +410,10 @@ m_ccdMode(0),
m_solverType(-1),
m_profileTimings(0),
m_enableSatCollisionDetection(false),
+m_deactivationTime(2.0f),
+m_linearDeactivationThreshold(0.8f),
+m_angularDeactivationThreshold(1.0f),
+m_contactBreakingThreshold(0.02f),
m_solver(NULL),
m_ownPairCache(NULL),
m_filterCallback(NULL),
@@ -452,6 +456,7 @@ m_scalingPropagated(false)
SetSolverType(1);//issues with quickstep and memory allocations
// m_dynamicsWorld = new btDiscreteDynamicsWorld(dispatcher,m_broadphase,m_solver,m_collisionConfiguration);
m_dynamicsWorld = new btSoftRigidDynamicsWorld(dispatcher,m_broadphase,m_solver,m_collisionConfiguration);
+ m_dynamicsWorld->setInternalTickCallback(&CcdPhysicsEnvironment::StaticSimulationSubtickCallback, this);
//m_dynamicsWorld->getSolverInfo().m_linearSlop = 0.01f;
//m_dynamicsWorld->getSolverInfo().m_solverMode= SOLVER_USE_WARMSTARTING + SOLVER_USE_2_FRICTION_DIRECTIONS + SOLVER_RANDMIZE_ORDER + SOLVER_USE_FRICTION_WARMSTARTING;
@@ -471,8 +476,10 @@ void CcdPhysicsEnvironment::AddCcdPhysicsController(CcdPhysicsController* ctrl)
//this m_userPointer is just used for triggers, see CallbackTriggers
obj->setUserPointer(ctrl);
- if (body)
- body->setGravity( m_gravity );
+ if (body) {
+ body->setGravity(m_gravity);
+ body->setSleepingThresholds(m_linearDeactivationThreshold, m_angularDeactivationThreshold);
+ }
if (body)
{
@@ -677,11 +684,31 @@ void CcdPhysicsEnvironment::DebugDrawWorld()
m_dynamicsWorld->debugDrawWorld();
}
+void CcdPhysicsEnvironment::StaticSimulationSubtickCallback(btDynamicsWorld *world, btScalar timeStep)
+{
+ // Get the pointer to the CcdPhysicsEnvironment associated with this Bullet world.
+ CcdPhysicsEnvironment *this_ = static_cast<CcdPhysicsEnvironment*>(world->getWorldUserInfo());
+ this_->SimulationSubtickCallback(timeStep);
+}
+
+void CcdPhysicsEnvironment::SimulationSubtickCallback(btScalar timeStep)
+{
+ std::set<CcdPhysicsController*>::iterator it;
+
+ for (it = m_controllers.begin(); it != m_controllers.end(); it++) {
+ (*it)->SimulationTick(timeStep);
+ }
+}
+
bool CcdPhysicsEnvironment::ProceedDeltaTime(double curTime,float timeStep,float interval)
{
std::set<CcdPhysicsController*>::iterator it;
int i;
+ // Update Bullet global variables.
+ gDeactivationTime = m_deactivationTime;
+ gContactBreakingThreshold = m_contactBreakingThreshold;
+
for (it=m_controllers.begin(); it!=m_controllers.end(); it++)
{
(*it)->SynchronizeMotionStates(timeStep);
@@ -901,21 +928,32 @@ void CcdPhysicsEnvironment::SetNumIterations(int numIter)
}
void CcdPhysicsEnvironment::SetDeactivationTime(float dTime)
{
- gDeactivationTime = dTime;
+ m_deactivationTime = dTime;
}
void CcdPhysicsEnvironment::SetDeactivationLinearTreshold(float linTresh)
{
- gLinearSleepingTreshold = linTresh;
+ m_linearDeactivationThreshold = linTresh;
+
+ // Update from all controllers.
+ for (std::set<CcdPhysicsController*>::iterator it = m_controllers.begin(); it != m_controllers.end(); it++) {
+ if ((*it)->GetRigidBody())
+ (*it)->GetRigidBody()->setSleepingThresholds(m_linearDeactivationThreshold, m_angularDeactivationThreshold);
+ }
}
void CcdPhysicsEnvironment::SetDeactivationAngularTreshold(float angTresh)
{
- gAngularSleepingTreshold = angTresh;
+ m_angularDeactivationThreshold = angTresh;
+
+ // Update from all controllers.
+ for (std::set<CcdPhysicsController*>::iterator it = m_controllers.begin(); it != m_controllers.end(); it++) {
+ if ((*it)->GetRigidBody())
+ (*it)->GetRigidBody()->setSleepingThresholds(m_linearDeactivationThreshold, m_angularDeactivationThreshold);
+ }
}
void CcdPhysicsEnvironment::SetContactBreakingTreshold(float contactBreakingTreshold)
{
- gContactBreakingThreshold = contactBreakingTreshold;
-
+ m_contactBreakingThreshold = contactBreakingTreshold;
}
@@ -1065,7 +1103,10 @@ int CcdPhysicsEnvironment::CreateUniversalD6Constraint(
void CcdPhysicsEnvironment::RemoveConstraint(int constraintId)
{
-
+ // For soft body constraints
+ if (constraintId == 0)
+ return;
+
int i;
int numConstraints = m_dynamicsWorld->getNumConstraints();
for (i=0;i<numConstraints;i++)
@@ -2009,6 +2050,9 @@ CcdPhysicsEnvironment::~CcdPhysicsEnvironment()
float CcdPhysicsEnvironment::GetConstraintParam(int constraintId,int param)
{
btTypedConstraint* typedConstraint = GetConstraintById(constraintId);
+ if (!typedConstraint)
+ return 0.0f;
+
switch (typedConstraint->getUserConstraintType())
{
case PHY_GENERIC_6DOF_CONSTRAINT:
@@ -2048,6 +2092,9 @@ float CcdPhysicsEnvironment::GetConstraintParam(int constraintId,int param)
void CcdPhysicsEnvironment::SetConstraintParam(int constraintId,int param,float value0,float value1)
{
btTypedConstraint* typedConstraint = GetConstraintById(constraintId);
+ if (!typedConstraint)
+ return;
+
switch (typedConstraint->getUserConstraintType())
{
case PHY_GENERIC_6DOF_CONSTRAINT:
@@ -2157,6 +2204,9 @@ void CcdPhysicsEnvironment::SetConstraintParam(int constraintId,int param,float
btTypedConstraint* CcdPhysicsEnvironment::GetConstraintById(int constraintId)
{
+ // For soft body constraints
+ if (constraintId == 0)
+ return NULL;
int numConstraints = m_dynamicsWorld->getNumConstraints();
int i;
@@ -2225,7 +2275,7 @@ void CcdPhysicsEnvironment::AddTouchCallback(int response_class, PHY_ResponseCal
bool CcdPhysicsEnvironment::RequestCollisionCallback(PHY_IPhysicsController* ctrl)
{
CcdPhysicsController* ccdCtrl = static_cast<CcdPhysicsController*>(ctrl);
- return !ccdCtrl->Register();
+ return ccdCtrl->Register();
}
void CcdPhysicsEnvironment::CallbackTriggers()
@@ -2937,6 +2987,10 @@ PHY_IPhysicsController* CcdPhysicsEnvironment::CreateConeController(float conera
float CcdPhysicsEnvironment::getAppliedImpulse(int constraintid)
{
+ // For soft body constraints
+ if (constraintid == 0)
+ return 0.0f;
+
int i;
int numConstraints = m_dynamicsWorld->getNumConstraints();
for (i=0;i<numConstraints;i++)
@@ -3094,6 +3148,8 @@ void CcdPhysicsEnvironment::ConvertObject(KX_GameObject *gameobj, RAS_MeshObject
ci.m_mass = isbulletdyna ? shapeprops->m_mass : 0.f;
ci.m_clamp_vel_min = shapeprops->m_clamp_vel_min;
ci.m_clamp_vel_max = shapeprops->m_clamp_vel_max;
+ ci.m_clamp_angvel_min = shapeprops->m_clamp_angvel_min;
+ ci.m_clamp_angvel_max = shapeprops->m_clamp_angvel_max;
ci.m_stepHeight = isbulletchar ? shapeprops->m_step_height : 0.f;
ci.m_jumpSpeed = isbulletchar ? shapeprops->m_jump_speed : 0.f;
ci.m_fallSpeed = isbulletchar ? shapeprops->m_fall_speed : 0.f;