add 'force activate', for static/kinematic objects that get moved.

fixed some activation issues with kinematic objects
This commit is contained in:
ejcoumans
2006-11-21 13:00:18 +00:00
parent f4e8bf70c5
commit 0757f1fe9e
5 changed files with 31 additions and 10 deletions

View File

@@ -41,9 +41,9 @@ void btCollisionObject::forceActivationState(int newState)
m_activationState1 = newState; m_activationState1 = newState;
} }
void btCollisionObject::activate() void btCollisionObject::activate(bool forceActivation)
{ {
if (!(m_collisionFlags & (CF_STATIC_OBJECT|CF_KINEMATIC_OBJECT))) if (forceActivation || !(m_collisionFlags & (CF_STATIC_OBJECT|CF_KINEMATIC_OBJECT)))
{ {
setActivationState(ACTIVE_TAG); setActivationState(ACTIVE_TAG);
m_deactivationTime = 0.f; m_deactivationTime = 0.f;

View File

@@ -148,7 +148,7 @@ public:
void forceActivationState(int newState); void forceActivationState(int newState);
void activate(); void activate(bool forceActivation = false);
inline bool isActive() const inline bool isActive() const
{ {

View File

@@ -176,7 +176,8 @@ void btSimulationIslandManager::buildAndProcessIslands(btDispatcher* dispatcher,
} }
} }
} }
if (allSleeping) if (allSleeping)
{ {
int idx; int idx;
@@ -239,14 +240,15 @@ void btSimulationIslandManager::buildAndProcessIslands(btDispatcher* dispatcher,
if (((colObj0) && colObj0->getActivationState() != ISLAND_SLEEPING) || if (((colObj0) && colObj0->getActivationState() != ISLAND_SLEEPING) ||
((colObj1) && colObj1->getActivationState() != ISLAND_SLEEPING)) ((colObj1) && colObj1->getActivationState() != ISLAND_SLEEPING))
{ {
//kinematic objects don't merge islands, but wake up all connected objects //kinematic objects don't merge islands, but wake up all connected objects
if (colObj0->isKinematicObject() && colObj0->getActivationState() != ISLAND_SLEEPING) if (colObj0->isStaticOrKinematicObject() && colObj0->getActivationState() != ISLAND_SLEEPING)
{ {
colObj1->setActivationState(ACTIVE_TAG); colObj1->activate();
} }
if (colObj1->isKinematicObject() && colObj1->getActivationState() != ISLAND_SLEEPING) if (colObj1->isStaticOrKinematicObject() && colObj1->getActivationState() != ISLAND_SLEEPING)
{ {
colObj0->setActivationState(ACTIVE_TAG); colObj0->activate();
} }
//filtering for response //filtering for response

View File

@@ -27,6 +27,18 @@ m_height(height)
m_sinAngle = (m_radius / sqrt(m_radius * m_radius + m_height * m_height)); m_sinAngle = (m_radius / sqrt(m_radius * m_radius + m_height * m_height));
} }
btConeShapeZ::btConeShapeZ (btScalar radius,btScalar height):
btConeShape(radius,height)
{
setConeUpIndex(2);
}
btConeShapeX::btConeShapeX (btScalar radius,btScalar height):
btConeShape(radius,height)
{
setConeUpIndex(0);
}
///choose upAxis index ///choose upAxis index
void btConeShape::setConeUpIndex(int upIndex) void btConeShape::setConeUpIndex(int upIndex)
{ {

View File

@@ -368,8 +368,14 @@ void btDiscreteDynamicsWorld::updateActivationState(float timeStep)
if (body->wantsSleeping()) if (body->wantsSleeping())
{ {
if (body->getActivationState() == ACTIVE_TAG) if (body->isStaticOrKinematicObject())
body->setActivationState( WANTS_DEACTIVATION ); {
body->setActivationState(ISLAND_SLEEPING);
} else
{
if (body->getActivationState() == ACTIVE_TAG)
body->setActivationState( WANTS_DEACTIVATION );
}
} else } else
{ {
if (body->getActivationState() != DISABLE_DEACTIVATION) if (body->getActivationState() != DISABLE_DEACTIVATION)
@@ -834,6 +840,7 @@ void btDiscreteDynamicsWorld::debugDrawObject(const btTransform& worldTransform,
} }
} }
void btDiscreteDynamicsWorld::setConstraintSolver(btConstraintSolver* solver) void btDiscreteDynamicsWorld::setConstraintSolver(btConstraintSolver* solver)
{ {
if (m_ownsConstraintSolver) if (m_ownsConstraintSolver)