BGE bug #17688 fixed: Near Sensor Reset not working (for Gamekit)

Implementation of the PHY_IPhysicsController::SetMargin(),
GetMargin(), SetRadius() and GetRadius() for Bullet and Sumo
to allow resetting the Near sensor radius. For bullet use 
the new setUnscaledRadius() function to change sphere radius.

In pPreparation of a Fh constraint actuator:
- Add KX_IPhysicsController::GetRadius()
- Fix implementation of KX_BulletPhysicsController::GetVelocity()
  (velocity at a point in geometric coordinate)
- Don't try to set velocity on static object (Bullet will assert)
- Add KX_GameObject::GetVelocity() for C access to local velocity
This commit is contained in:
Benoit Bolsee 2008-10-01 07:55:02 +00:00
parent f4c1fcefe8
commit 949b6ca80f
15 changed files with 74 additions and 14 deletions

@ -115,7 +115,7 @@ MT_Vector3 KX_BulletPhysicsController::GetAngularVelocity()
MT_Vector3 KX_BulletPhysicsController::GetVelocity(const MT_Point3& pos)
{
float linVel[3];
CcdPhysicsController::GetLinearVelocity(linVel[0],linVel[1],linVel[2]);
CcdPhysicsController::GetVelocity(pos[0], pos[1], pos[2], linVel[0],linVel[1],linVel[2]);
return MT_Vector3(linVel[0],linVel[1],linVel[2]);
}
@ -160,6 +160,12 @@ MT_Scalar KX_BulletPhysicsController::GetMass()
return 0.f;
}
MT_Scalar KX_BulletPhysicsController::GetRadius()
{
return MT_Scalar(CcdPhysicsController::GetRadius());
}
MT_Vector3 KX_BulletPhysicsController::getReactionForce()
{
assert(0);

@ -49,9 +49,7 @@ public:
virtual SG_Controller* GetReplica(class SG_Node* destnode);
void SetDyna(bool isDynamic) {
m_bDyna = isDynamic;
}
virtual MT_Scalar GetRadius();
virtual void SetSumoTransform(bool nondynaonly);

@ -772,7 +772,14 @@ MT_Vector3 KX_GameObject::GetAngularVelocity(bool local)
return velocity;
}
MT_Vector3 KX_GameObject::GetVelocity(const MT_Point3& point)
{
if (m_pPhysicsController1)
{
return m_pPhysicsController1->GetVelocity(point);
}
return MT_Vector3(0.0,0.0,0.0);
}
// scenegraph node stuff

@ -264,6 +264,15 @@ public:
bool local=false
);
/**
* Return the linear velocity of a given point in world coordinate
* but relative to center of object ([0,0,0]=center of object)
*/
MT_Vector3
GetVelocity(
const MT_Point3& position
);
/**
* Return the mass of the object
*/

@ -88,7 +88,11 @@ public:
m_bDyna = isDynamic;
}
bool IsDyna(void) {
return m_bDyna;
}
virtual MT_Scalar GetRadius()=0;
virtual void SetSumoTransform(bool nondynaonly)=0;
// todo: remove next line !
virtual void SetSimulatedTime(double time)=0;

@ -190,13 +190,13 @@ bool KX_NearSensor::Evaluate(CValue* event)
{
if (m_physCtrl)
{
m_physCtrl->SetMargin(m_ResetMargin);
m_physCtrl->SetRadius(m_ResetMargin);
}
} else
{
if (m_physCtrl)
{
m_physCtrl->SetMargin(m_Margin);
m_physCtrl->SetRadius(m_Margin);
}
}

@ -169,6 +169,11 @@ MT_Scalar KX_OdePhysicsController::GetMass()
return ODEPhysicsController::getMass();
}
MT_Scalar KX_OdePhysicsController::GetRadius()
{
return MT_Scalar(0.f);
}
MT_Vector3 KX_OdePhysicsController::getReactionForce()
{
return MT_Vector3(0,0,0);

@ -76,7 +76,7 @@ public:
virtual void SuspendDynamics(bool);
virtual void RestoreDynamics();
virtual MT_Scalar GetRadius();
virtual SG_Controller* GetReplica(class SG_Node* destnode);

@ -205,6 +205,11 @@ MT_Scalar KX_SumoPhysicsController::GetMass()
return SumoPhysicsController::getMass();
}
MT_Scalar KX_SumoPhysicsController::GetRadius()
{
return SumoPhysicsController::GetRadius();
}
MT_Vector3 KX_SumoPhysicsController::getReactionForce()
{
float force[3];

@ -84,6 +84,7 @@ public:
virtual void setPosition(const MT_Point3& pos);
virtual void setScaling(const MT_Vector3& scaling);
virtual MT_Scalar GetMass();
virtual MT_Scalar GetRadius();
virtual MT_Vector3 getReactionForce();
virtual void setRigidBody(bool rigid);

@ -111,6 +111,8 @@ public:
virtual void calcXform(){}
virtual void SetMargin(float margin) {}
virtual float GetMargin() const {return 0.f;}
virtual float GetRadius() const {return 0.f;}
virtual void SetRadius(float margin) {}
// clientinfo for raycasts for example
virtual void* getNewClientInfo() { return m_clientInfo;}

@ -980,7 +980,7 @@ void CcdPhysicsController::SetAngularVelocity(float ang_velX,float ang_velY,flo
if (m_object->isStaticObject())
{
m_object->setCollisionFlags(m_object->getCollisionFlags() | btCollisionObject::CF_KINEMATIC_OBJECT);
}
} else
{
btTransform xform = m_object->getWorldTransform();
if (local)
@ -1005,6 +1005,7 @@ void CcdPhysicsController::SetLinearVelocity(float lin_velX,float lin_velY,floa
if (m_object->isStaticObject())
{
m_object->setCollisionFlags(m_object->getCollisionFlags() | btCollisionObject::CF_KINEMATIC_OBJECT);
return;
}
btSoftBody* soft = GetSoftBody();
@ -1093,8 +1094,7 @@ void CcdPhysicsController::GetVelocity(const float posX,const float posY,const
btRigidBody* body = GetRigidBody();
if (body)
{
btVector3 rel_pos = pos-body->getCenterOfMassPosition();
btVector3 linvel = body->getVelocityInLocalPoint(rel_pos);
btVector3 linvel = body->getVelocityInLocalPoint(pos);
linvX = linvel.x();
linvY = linvel.y();
linvZ = linvel.z();

@ -413,8 +413,29 @@ class CcdPhysicsController : public PHY_IPhysicsController
}
virtual void calcXform() {} ;
virtual void SetMargin(float margin) {};
virtual float GetMargin() const {return 0.f;};
virtual void SetMargin(float margin)
{
if (m_collisionShape)
m_collisionShape->setMargin(btScalar(margin));
}
virtual float GetMargin() const
{
return (m_collisionShape) ? m_collisionShape->getMargin() : 0.f;
}
virtual float GetRadius() const
{
// this is not the actual shape radius, it's only used for Fh support
return m_cci.m_radius;
}
virtual void SetRadius(float margin)
{
if (m_collisionShape && m_collisionShape->getShapeType() == SPHERE_SHAPE_PROXYTYPE)
{
btSphereShape* sphereShape = static_cast<btSphereShape*>(m_collisionShape);
sphereShape->setUnscaledRadius(margin);
}
m_cci.m_radius = margin;
}
bool wantsSleeping();

@ -120,6 +120,7 @@ public:
virtual void SetMargin(float margin) ;
virtual float GetMargin() const;
virtual float GetRadius() const ;
virtual void SetRadius(float margin) { SetMargin(margin); }
// clientinfo for raycasts for example

@ -90,7 +90,8 @@ class PHY_IPhysicsController
virtual void calcXform() =0;
virtual void SetMargin(float margin) =0;
virtual float GetMargin() const=0;
virtual float GetRadius() const { return 0.f;}
virtual float GetRadius() const=0;
virtual void SetRadius(float margin) = 0;
PHY__Vector3 GetWorldPosition(PHY__Vector3& localpos);
};