forked from bartvdbraak/blender
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:
parent
f4c1fcefe8
commit
949b6ca80f
@ -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);
|
||||
|
||||
};
|
||||
|
Loading…
Reference in New Issue
Block a user