add 'force activate', for static/kinematic objects that get moved.
fixed some activation issues with kinematic objects
This commit is contained in:
@@ -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;
|
||||||
|
|||||||
@@ -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
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
Reference in New Issue
Block a user