Bullet physics: fixed some accuracy problem (square length should be compared to square epsilons), and more collision sensor work + deactivation issues
This commit is contained in:
@@ -195,16 +195,21 @@ void CcdPhysicsController::PostProcessReplica(class PHY_IMotionState* motionsta
|
||||
// kinematic methods
|
||||
void CcdPhysicsController::RelativeTranslate(float dlocX,float dlocY,float dlocZ,bool local)
|
||||
{
|
||||
SimdVector3 dloc(dlocX,dlocY,dlocZ);
|
||||
SimdTransform xform = m_body->getCenterOfMassTransform();
|
||||
|
||||
if (local)
|
||||
if (m_body)
|
||||
{
|
||||
dloc = xform.getBasis()*dloc;
|
||||
}
|
||||
m_body->activate();
|
||||
|
||||
xform.setOrigin(xform.getOrigin() + dloc);
|
||||
this->m_body->setCenterOfMassTransform(xform);
|
||||
SimdVector3 dloc(dlocX,dlocY,dlocZ);
|
||||
SimdTransform xform = m_body->getCenterOfMassTransform();
|
||||
|
||||
if (local)
|
||||
{
|
||||
dloc = xform.getBasis()*dloc;
|
||||
}
|
||||
|
||||
xform.setOrigin(xform.getOrigin() + dloc);
|
||||
m_body->setCenterOfMassTransform(xform);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -212,6 +217,8 @@ void CcdPhysicsController::RelativeRotate(const float rotval[9],bool local)
|
||||
{
|
||||
if (m_body )
|
||||
{
|
||||
m_body->activate();
|
||||
|
||||
SimdMatrix3x3 drotmat( rotval[0],rotval[1],rotval[2],
|
||||
rotval[4],rotval[5],rotval[6],
|
||||
rotval[8],rotval[9],rotval[10]);
|
||||
@@ -319,34 +326,47 @@ void CcdPhysicsController::ApplyForce(float forceX,float forceY,float forceZ,bo
|
||||
void CcdPhysicsController::SetAngularVelocity(float ang_velX,float ang_velY,float ang_velZ,bool local)
|
||||
{
|
||||
SimdVector3 angvel(ang_velX,ang_velY,ang_velZ);
|
||||
SimdTransform xform = m_body->getCenterOfMassTransform();
|
||||
if (local)
|
||||
if (angvel.length2() > (SIMD_EPSILON*SIMD_EPSILON))
|
||||
{
|
||||
angvel = xform.getBasis()*angvel;
|
||||
}
|
||||
SimdTransform xform = m_body->getCenterOfMassTransform();
|
||||
if (local)
|
||||
{
|
||||
angvel = xform.getBasis()*angvel;
|
||||
}
|
||||
|
||||
m_body->setAngularVelocity(angvel);
|
||||
m_body->setAngularVelocity(angvel);
|
||||
}
|
||||
|
||||
}
|
||||
void CcdPhysicsController::SetLinearVelocity(float lin_velX,float lin_velY,float lin_velZ,bool local)
|
||||
{
|
||||
|
||||
SimdVector3 linVel(lin_velX,lin_velY,lin_velZ);
|
||||
SimdTransform xform = m_body->getCenterOfMassTransform();
|
||||
if (local)
|
||||
if (linVel.length2() > (SIMD_EPSILON*SIMD_EPSILON))
|
||||
{
|
||||
linVel = xform.getBasis()*linVel;
|
||||
m_body->activate();
|
||||
SimdTransform xform = m_body->getCenterOfMassTransform();
|
||||
if (local)
|
||||
{
|
||||
linVel = xform.getBasis()*linVel;
|
||||
}
|
||||
m_body->setLinearVelocity(linVel);
|
||||
}
|
||||
m_body->setLinearVelocity(linVel);
|
||||
}
|
||||
void CcdPhysicsController::applyImpulse(float attachX,float attachY,float attachZ, float impulseX,float impulseY,float impulseZ)
|
||||
{
|
||||
|
||||
SimdVector3 impulse(impulseX,impulseY,impulseZ);
|
||||
SimdVector3 pos(attachX,attachY,attachZ);
|
||||
|
||||
m_body->activate();
|
||||
if (impulse.length2() > (SIMD_EPSILON*SIMD_EPSILON))
|
||||
{
|
||||
m_body->activate();
|
||||
|
||||
SimdVector3 pos(attachX,attachY,attachZ);
|
||||
|
||||
m_body->applyImpulse(impulse,pos);
|
||||
m_body->activate();
|
||||
|
||||
m_body->applyImpulse(impulse,pos);
|
||||
}
|
||||
|
||||
}
|
||||
void CcdPhysicsController::SetActive(bool active)
|
||||
|
||||
@@ -1462,15 +1462,15 @@ TypedConstraint* CcdPhysicsEnvironment::getConstraintById(int constraintId)
|
||||
|
||||
void CcdPhysicsEnvironment::addSensor(PHY_IPhysicsController* ctrl)
|
||||
{
|
||||
printf("addSensor\n");
|
||||
//printf("addSensor\n");
|
||||
}
|
||||
void CcdPhysicsEnvironment::removeSensor(PHY_IPhysicsController* ctrl)
|
||||
{
|
||||
printf("removeSensor\n");
|
||||
//printf("removeSensor\n");
|
||||
}
|
||||
void CcdPhysicsEnvironment::addTouchCallback(int response_class, PHY_ResponseCallback callback, void *user)
|
||||
{
|
||||
printf("addTouchCallback\n(response class = %i)\n",response_class);
|
||||
/* printf("addTouchCallback\n(response class = %i)\n",response_class);
|
||||
|
||||
//map PHY_ convention into SM_ convention
|
||||
switch (response_class)
|
||||
@@ -1494,6 +1494,7 @@ void CcdPhysicsEnvironment::addTouchCallback(int response_class, PHY_ResponseCal
|
||||
assert(0);
|
||||
return;
|
||||
}
|
||||
*/
|
||||
|
||||
m_triggerCallbacks[response_class] = callback;
|
||||
m_triggerCallbacksUserPtrs[response_class] = user;
|
||||
@@ -1503,7 +1504,7 @@ void CcdPhysicsEnvironment::requestCollisionCallback(PHY_IPhysicsController* ctr
|
||||
{
|
||||
CcdPhysicsController* ccdCtrl = static_cast<CcdPhysicsController*>(ctrl);
|
||||
|
||||
printf("requestCollisionCallback\n");
|
||||
//printf("requestCollisionCallback\n");
|
||||
m_triggerControllers.push_back(ccdCtrl);
|
||||
}
|
||||
|
||||
@@ -1514,7 +1515,7 @@ void CcdPhysicsEnvironment::CallbackTriggers()
|
||||
|
||||
if (m_triggerCallbacks[PHY_OBJECT_RESPONSE])
|
||||
{
|
||||
|
||||
//walk over all overlapping pairs, and if one of the involved bodies is registered for trigger callback, perform callback
|
||||
int numManifolds = m_collisionWorld->GetDispatcher()->GetNumManifolds();
|
||||
for (int i=0;i<numManifolds;i++)
|
||||
{
|
||||
@@ -1547,7 +1548,7 @@ void CcdPhysicsEnvironment::CallbackTriggers()
|
||||
|
||||
|
||||
}
|
||||
//walk over all overlapping pairs, and if
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user