diff options
Diffstat (limited to 'source/gameengine/Physics/Bullet')
5 files changed, 68 insertions, 35 deletions
diff --git a/source/gameengine/Physics/Bullet/CcdPhysicsController.cpp b/source/gameengine/Physics/Bullet/CcdPhysicsController.cpp index 8ecb586f77e..f11d7ac017f 100644 --- a/source/gameengine/Physics/Bullet/CcdPhysicsController.cpp +++ b/source/gameengine/Physics/Bullet/CcdPhysicsController.cpp @@ -81,24 +81,24 @@ void BlenderBulletCharacterController::updateAction(btCollisionWorld *collisionW m_motionState->setWorldTransform(getGhostObject()->getWorldTransform()); } -int BlenderBulletCharacterController::getMaxJumps() const +unsigned char BlenderBulletCharacterController::getMaxJumps() const { return m_maxJumps; } -void BlenderBulletCharacterController::setMaxJumps(int maxJumps) +void BlenderBulletCharacterController::setMaxJumps(unsigned char maxJumps) { m_maxJumps = maxJumps; } -int BlenderBulletCharacterController::getJumpCount() const +unsigned char BlenderBulletCharacterController::getJumpCount() const { return m_jumps; } bool BlenderBulletCharacterController::canJump() const { - return onGround() || m_jumps < m_maxJumps; + return (onGround() && m_maxJumps > 0) || m_jumps < m_maxJumps; } void BlenderBulletCharacterController::jump() @@ -533,6 +533,7 @@ bool CcdPhysicsController::CreateCharacterController() m_characterController->setJumpSpeed(m_cci.m_jumpSpeed); m_characterController->setFallSpeed(m_cci.m_fallSpeed); + m_characterController->setMaxJumps(m_cci.m_maxJumps); return true; } @@ -820,6 +821,9 @@ void CcdPhysicsController::PostProcessReplica(class PHY_IMotionState* motionsta m_registerCount = 0; m_collisionShape = NULL; + // Clear all old constraints. + m_ccdConstraintRefs.clear(); + // always create a new shape to avoid scaling bug if (m_shapeInfo) { @@ -1080,7 +1084,7 @@ void CcdPhysicsController::RefreshCollisions() void CcdPhysicsController::SuspendDynamics(bool ghost) { btRigidBody *body = GetRigidBody(); - if (body && !m_suspended && !GetConstructionInfo().m_bSensor) + if (body && !m_suspended && !GetConstructionInfo().m_bSensor && GetPhysicsEnvironment()->IsActiveCcdPhysicsController(this)) { btBroadphaseProxy* handle = body->getBroadphaseHandle(); @@ -1102,7 +1106,7 @@ void CcdPhysicsController::SuspendDynamics(bool ghost) void CcdPhysicsController::RestoreDynamics() { btRigidBody *body = GetRigidBody(); - if (body && m_suspended) + if (body && m_suspended && GetPhysicsEnvironment()->IsActiveCcdPhysicsController(this)) { // before make sure any position change that was done in this logic frame are accounted for SetTransform(); @@ -1280,7 +1284,13 @@ void CcdPhysicsController::ApplyForce(const MT_Vector3& forcein,bool local) void CcdPhysicsController::SetAngularVelocity(const MT_Vector3& ang_vel,bool local) { btVector3 angvel(ang_vel.x(),ang_vel.y(),ang_vel.z()); - if (m_object && angvel.length2() > (SIMD_EPSILON*SIMD_EPSILON)) + + /* Refuse tiny tiny velocities, as they might cause instabilities. */ + float vel_squared = angvel.length2(); + if (vel_squared > 0 && vel_squared <= (SIMD_EPSILON*SIMD_EPSILON)) + angvel = btVector3(0, 0, 0); + + if (m_object) { m_object->activate(true); if (m_object->isStaticObject()) @@ -1302,9 +1312,14 @@ void CcdPhysicsController::SetAngularVelocity(const MT_Vector3& ang_vel,bool lo } void CcdPhysicsController::SetLinearVelocity(const MT_Vector3& lin_vel,bool local) { - btVector3 linVel(lin_vel.x(),lin_vel.y(),lin_vel.z()); - if (m_object/* && linVel.length2() > (SIMD_EPSILON*SIMD_EPSILON)*/) + + /* Refuse tiny tiny velocities, as they might cause instabilities. */ + float vel_squared = linVel.length2(); + if (vel_squared > 0 && vel_squared <= (SIMD_EPSILON*SIMD_EPSILON)) + linVel = btVector3(0, 0, 0); + + if (m_object) { m_object->activate(true); if (m_object->isStaticObject()) diff --git a/source/gameengine/Physics/Bullet/CcdPhysicsController.h b/source/gameengine/Physics/Bullet/CcdPhysicsController.h index c49ae8d20e1..a0b04736bdf 100644 --- a/source/gameengine/Physics/Bullet/CcdPhysicsController.h +++ b/source/gameengine/Physics/Bullet/CcdPhysicsController.h @@ -316,7 +316,8 @@ struct CcdConstructionInfo float m_stepHeight; float m_jumpSpeed; float m_fallSpeed; - + unsigned char m_maxJumps; + int m_gamesoftFlag; float m_soft_linStiff; /* linear stiffness 0..1 */ float m_soft_angStiff; /* angular stiffness 0..1 */ @@ -407,19 +408,19 @@ class BlenderBulletCharacterController : public btKinematicCharacterController, { private: btMotionState* m_motionState; - int m_jumps; - int m_maxJumps; + unsigned char m_jumps; + unsigned char m_maxJumps; public: BlenderBulletCharacterController(btMotionState *motionState, btPairCachingGhostObject *ghost, btConvexShape* shape, float stepHeight); virtual void updateAction(btCollisionWorld *collisionWorld, btScalar dt); - int getMaxJumps() const; + unsigned char getMaxJumps() const; - void setMaxJumps(int maxJumps); + void setMaxJumps(unsigned char maxJumps); - int getJumpCount() const; + unsigned char getJumpCount() const; virtual bool canJump() const; @@ -432,9 +433,9 @@ public: virtual bool OnGround(){ return onGround(); } virtual float GetGravity() { return getGravity(); } virtual void SetGravity(float gravity) { setGravity(gravity); } - virtual int GetMaxJumps() { return getMaxJumps(); } - virtual void SetMaxJumps(int maxJumps) { setMaxJumps(maxJumps); } - virtual int GetJumpCount() { return getJumpCount(); } + virtual unsigned char GetMaxJumps() { return getMaxJumps(); } + virtual void SetMaxJumps(unsigned char maxJumps) { setMaxJumps(maxJumps); } + virtual unsigned char GetJumpCount() { return getJumpCount(); } virtual void SetWalkDirection(const MT_Vector3& dir) { btVector3 vec = btVector3(dir[0], dir[1], dir[2]); diff --git a/source/gameengine/Physics/Bullet/CcdPhysicsEnvironment.cpp b/source/gameengine/Physics/Bullet/CcdPhysicsEnvironment.cpp index 759e8bd6f7e..bf81a18fa78 100644 --- a/source/gameengine/Physics/Bullet/CcdPhysicsEnvironment.cpp +++ b/source/gameengine/Physics/Bullet/CcdPhysicsEnvironment.cpp @@ -511,7 +511,26 @@ void CcdPhysicsEnvironment::AddCcdPhysicsController(CcdPhysicsController* ctrl) assert(obj->getBroadphaseHandle()); } - +void CcdPhysicsEnvironment::RemoveConstraint(btTypedConstraint *con) +{ + btRigidBody &rbA = con->getRigidBodyA(); + btRigidBody &rbB = con->getRigidBodyB(); + rbA.activate(); + rbB.activate(); + m_dynamicsWorld->removeConstraint(con); + + if (rbA.getUserPointer()) { + ((CcdPhysicsController *)rbA.getUserPointer())->removeCcdConstraintRef(con); + } + + if (rbB.getUserPointer()) { + ((CcdPhysicsController *)rbB.getUserPointer())->removeCcdConstraintRef(con); + } + + /* Since we remove the constraint in the onwer and the target, we can delete it, + * KX_ConstraintWrapper keep the constraint id not the pointer, so no problems. */ + delete con; +} bool CcdPhysicsEnvironment::RemoveCcdPhysicsController(CcdPhysicsController* ctrl) { @@ -534,11 +553,7 @@ bool CcdPhysicsEnvironment::RemoveCcdPhysicsController(CcdPhysicsController* ctr for (int i = ctrl->getNumCcdConstraintRefs() - 1; i >= 0; i--) { btTypedConstraint* con = ctrl->getCcdConstraintRef(i); - con->getRigidBodyA().activate(); - con->getRigidBodyB().activate(); - m_dynamicsWorld->removeConstraint(con); - ctrl->removeCcdConstraintRef(con); - //delete con; //might be kept by python KX_ConstraintWrapper + RemoveConstraint(con); } m_dynamicsWorld->removeRigidBody(ctrl->GetRigidBody()); @@ -553,7 +568,7 @@ bool CcdPhysicsEnvironment::RemoveCcdPhysicsController(CcdPhysicsController* ctr } if (vehicle_constraint > 0) - RemoveConstraint(vehicle_constraint); + RemoveConstraintById(vehicle_constraint); } else { //if a softbody @@ -1099,9 +1114,7 @@ int CcdPhysicsEnvironment::CreateUniversalD6Constraint( return 0; } - - -void CcdPhysicsEnvironment::RemoveConstraint(int constraintId) +void CcdPhysicsEnvironment::RemoveConstraintById(int constraintId) { // For soft body constraints if (constraintId == 0) @@ -1114,9 +1127,7 @@ void CcdPhysicsEnvironment::RemoveConstraint(int constraintId) btTypedConstraint* constraint = m_dynamicsWorld->getConstraint(i); if (constraint->getUserConstraintId() == constraintId) { - constraint->getRigidBodyA().activate(); - constraint->getRigidBodyB().activate(); - m_dynamicsWorld->removeConstraint(constraint); + RemoveConstraint(constraint); break; } } @@ -3122,9 +3133,7 @@ void CcdPhysicsEnvironment::ConvertObject(KX_GameObject *gameobj, RAS_MeshObject { KX_BlenderSceneConverter *converter = (KX_BlenderSceneConverter*)KX_GetActiveEngine()->GetSceneConverter(); parent = converter->FindGameObject(blenderparent); - isbulletdyna = false; isbulletsoftbody = false; - shapeprops->m_mass = 0.f; } if (!isbulletdyna) @@ -3153,6 +3162,7 @@ void CcdPhysicsEnvironment::ConvertObject(KX_GameObject *gameobj, RAS_MeshObject ci.m_stepHeight = isbulletchar ? shapeprops->m_step_height : 0.f; ci.m_jumpSpeed = isbulletchar ? shapeprops->m_jump_speed : 0.f; ci.m_fallSpeed = isbulletchar ? shapeprops->m_fall_speed : 0.f; + ci.m_maxJumps = isbulletchar ? shapeprops->m_max_jumps : 0; //mmm, for now, take this for the size of the dynamicobject // Blender uses inertia for radius of dynamic object @@ -3581,6 +3591,9 @@ void CcdPhysicsEnvironment::ConvertObject(KX_GameObject *gameobj, RAS_MeshObject } } + if (parent) + physicscontroller->SuspendDynamics(false); + CcdPhysicsController* parentCtrl = parent ? (CcdPhysicsController*)parent->GetPhysicsController() : 0; physicscontroller->SetParentCtrl(parentCtrl); diff --git a/source/gameengine/Physics/Bullet/CcdPhysicsEnvironment.h b/source/gameengine/Physics/Bullet/CcdPhysicsEnvironment.h index 3d7e3943f98..86f663959f1 100644 --- a/source/gameengine/Physics/Bullet/CcdPhysicsEnvironment.h +++ b/source/gameengine/Physics/Bullet/CcdPhysicsEnvironment.h @@ -67,6 +67,9 @@ class CcdPhysicsEnvironment : public PHY_IPhysicsEnvironment friend class CcdOverlapFilterCallBack; btVector3 m_gravity; + // Removes the constraint and his references from the owner and the target. + void RemoveConstraint(btTypedConstraint *con); + protected: btIDebugDraw* m_debugDrawer; @@ -185,7 +188,7 @@ protected: virtual float GetConstraintParam(int constraintId,int param); - virtual void RemoveConstraint(int constraintid); + virtual void RemoveConstraintById(int constraintid); virtual float getAppliedImpulse(int constraintid); diff --git a/source/gameengine/Physics/Bullet/SConscript b/source/gameengine/Physics/Bullet/SConscript index 30287553a10..5c5b1fe6ea6 100644 --- a/source/gameengine/Physics/Bullet/SConscript +++ b/source/gameengine/Physics/Bullet/SConscript @@ -52,7 +52,8 @@ incs = ' '.join(incs) incs += ' ' + env['BF_BULLET_INC'] -defs = env['BF_GL_DEFINITIONS'] +defs = [] +defs += env['BF_GL_DEFINITIONS'] if env['WITH_BF_PYTHON']: incs += ' ' + env['BF_PYTHON_INC'] |