From 949b6ca80f68d5cb99a0d17dd66238ef15444ac2 Mon Sep 17 00:00:00 2001 From: Benoit Bolsee Date: Wed, 1 Oct 2008 07:55:02 +0000 Subject: 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 --- .../Ketsji/KX_BulletPhysicsController.cpp | 8 ++++++- .../gameengine/Ketsji/KX_BulletPhysicsController.h | 4 +--- source/gameengine/Ketsji/KX_GameObject.cpp | 9 +++++++- source/gameengine/Ketsji/KX_GameObject.h | 9 ++++++++ source/gameengine/Ketsji/KX_IPhysicsController.h | 4 ++++ source/gameengine/Ketsji/KX_NearSensor.cpp | 4 ++-- .../gameengine/Ketsji/KX_OdePhysicsController.cpp | 5 +++++ source/gameengine/Ketsji/KX_OdePhysicsController.h | 2 +- .../gameengine/Ketsji/KX_SumoPhysicsController.cpp | 5 +++++ .../gameengine/Ketsji/KX_SumoPhysicsController.h | 1 + .../Physics/BlOde/OdePhysicsController.h | 2 ++ .../Physics/Bullet/CcdPhysicsController.cpp | 6 +++--- .../Physics/Bullet/CcdPhysicsController.h | 25 ++++++++++++++++++++-- .../Physics/Sumo/SumoPhysicsController.h | 1 + .../Physics/common/PHY_IPhysicsController.h | 3 ++- 15 files changed, 74 insertions(+), 14 deletions(-) (limited to 'source') diff --git a/source/gameengine/Ketsji/KX_BulletPhysicsController.cpp b/source/gameengine/Ketsji/KX_BulletPhysicsController.cpp index 3d20ce8a3a5..bf838e60210 100644 --- a/source/gameengine/Ketsji/KX_BulletPhysicsController.cpp +++ b/source/gameengine/Ketsji/KX_BulletPhysicsController.cpp @@ -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); diff --git a/source/gameengine/Ketsji/KX_BulletPhysicsController.h b/source/gameengine/Ketsji/KX_BulletPhysicsController.h index 2efe0474b30..cdcb82c87ca 100644 --- a/source/gameengine/Ketsji/KX_BulletPhysicsController.h +++ b/source/gameengine/Ketsji/KX_BulletPhysicsController.h @@ -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); diff --git a/source/gameengine/Ketsji/KX_GameObject.cpp b/source/gameengine/Ketsji/KX_GameObject.cpp index 15055a9cf93..1b57b9acc1d 100644 --- a/source/gameengine/Ketsji/KX_GameObject.cpp +++ b/source/gameengine/Ketsji/KX_GameObject.cpp @@ -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 diff --git a/source/gameengine/Ketsji/KX_GameObject.h b/source/gameengine/Ketsji/KX_GameObject.h index 12e29cf3294..472d31362dd 100644 --- a/source/gameengine/Ketsji/KX_GameObject.h +++ b/source/gameengine/Ketsji/KX_GameObject.h @@ -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 */ diff --git a/source/gameengine/Ketsji/KX_IPhysicsController.h b/source/gameengine/Ketsji/KX_IPhysicsController.h index ecfdb8c4275..4ea283e9f98 100644 --- a/source/gameengine/Ketsji/KX_IPhysicsController.h +++ b/source/gameengine/Ketsji/KX_IPhysicsController.h @@ -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; diff --git a/source/gameengine/Ketsji/KX_NearSensor.cpp b/source/gameengine/Ketsji/KX_NearSensor.cpp index 140dd37f5c6..b00cd616a5b 100644 --- a/source/gameengine/Ketsji/KX_NearSensor.cpp +++ b/source/gameengine/Ketsji/KX_NearSensor.cpp @@ -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); } } diff --git a/source/gameengine/Ketsji/KX_OdePhysicsController.cpp b/source/gameengine/Ketsji/KX_OdePhysicsController.cpp index 05feb11a2bc..6a701a5f25b 100644 --- a/source/gameengine/Ketsji/KX_OdePhysicsController.cpp +++ b/source/gameengine/Ketsji/KX_OdePhysicsController.cpp @@ -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); diff --git a/source/gameengine/Ketsji/KX_OdePhysicsController.h b/source/gameengine/Ketsji/KX_OdePhysicsController.h index 18f9edc6835..53050f6ce3e 100644 --- a/source/gameengine/Ketsji/KX_OdePhysicsController.h +++ b/source/gameengine/Ketsji/KX_OdePhysicsController.h @@ -76,7 +76,7 @@ public: virtual void SuspendDynamics(bool); virtual void RestoreDynamics(); - + virtual MT_Scalar GetRadius(); virtual SG_Controller* GetReplica(class SG_Node* destnode); diff --git a/source/gameengine/Ketsji/KX_SumoPhysicsController.cpp b/source/gameengine/Ketsji/KX_SumoPhysicsController.cpp index 4032a795ce3..c842ca1ee14 100644 --- a/source/gameengine/Ketsji/KX_SumoPhysicsController.cpp +++ b/source/gameengine/Ketsji/KX_SumoPhysicsController.cpp @@ -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]; diff --git a/source/gameengine/Ketsji/KX_SumoPhysicsController.h b/source/gameengine/Ketsji/KX_SumoPhysicsController.h index 1dd930bf3d9..abe48d99043 100644 --- a/source/gameengine/Ketsji/KX_SumoPhysicsController.h +++ b/source/gameengine/Ketsji/KX_SumoPhysicsController.h @@ -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); diff --git a/source/gameengine/Physics/BlOde/OdePhysicsController.h b/source/gameengine/Physics/BlOde/OdePhysicsController.h index d3eb443ed3a..925f5b6686a 100644 --- a/source/gameengine/Physics/BlOde/OdePhysicsController.h +++ b/source/gameengine/Physics/BlOde/OdePhysicsController.h @@ -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;} diff --git a/source/gameengine/Physics/Bullet/CcdPhysicsController.cpp b/source/gameengine/Physics/Bullet/CcdPhysicsController.cpp index 47329235517..c9c30c1b450 100644 --- a/source/gameengine/Physics/Bullet/CcdPhysicsController.cpp +++ b/source/gameengine/Physics/Bullet/CcdPhysicsController.cpp @@ -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(); diff --git a/source/gameengine/Physics/Bullet/CcdPhysicsController.h b/source/gameengine/Physics/Bullet/CcdPhysicsController.h index a1245f6a3e9..054ec91122a 100644 --- a/source/gameengine/Physics/Bullet/CcdPhysicsController.h +++ b/source/gameengine/Physics/Bullet/CcdPhysicsController.h @@ -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(m_collisionShape); + sphereShape->setUnscaledRadius(margin); + } + m_cci.m_radius = margin; + } bool wantsSleeping(); diff --git a/source/gameengine/Physics/Sumo/SumoPhysicsController.h b/source/gameengine/Physics/Sumo/SumoPhysicsController.h index 95f01b45f2b..d8ee54935d7 100644 --- a/source/gameengine/Physics/Sumo/SumoPhysicsController.h +++ b/source/gameengine/Physics/Sumo/SumoPhysicsController.h @@ -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 diff --git a/source/gameengine/Physics/common/PHY_IPhysicsController.h b/source/gameengine/Physics/common/PHY_IPhysicsController.h index ca8edea114a..884e14cfb5a 100644 --- a/source/gameengine/Physics/common/PHY_IPhysicsController.h +++ b/source/gameengine/Physics/common/PHY_IPhysicsController.h @@ -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); }; -- cgit v1.2.3