From bab1b90edc55251ceb5e3033d588347b48cceca4 Mon Sep 17 00:00:00 2001 From: Erwin Coumans Date: Sat, 31 Dec 2005 21:59:56 +0000 Subject: more game engine bug-fixes, hooked up 'formfactor' as inertia tensor tweaker, friction/restitution, more scaling related fixes. --- .../Physics/Bullet/CcdPhysicsController.cpp | 21 ++++++++++++++++----- .../Physics/Bullet/CcdPhysicsController.h | 8 ++++++-- 2 files changed, 22 insertions(+), 7 deletions(-) (limited to 'source/gameengine/Physics') diff --git a/source/gameengine/Physics/Bullet/CcdPhysicsController.cpp b/source/gameengine/Physics/Bullet/CcdPhysicsController.cpp index bb4f1465b2d..ee3b0ffb528 100644 --- a/source/gameengine/Physics/Bullet/CcdPhysicsController.cpp +++ b/source/gameengine/Physics/Bullet/CcdPhysicsController.cpp @@ -63,7 +63,7 @@ void CcdPhysicsController::CreateRigidbody() // init the rigidbody properly // - m_body->setMassProps(m_cci.m_mass, m_cci.m_localInertiaTensor); + m_body->setMassProps(m_cci.m_mass, m_cci.m_localInertiaTensor * m_cci.m_inertiaFactor); m_body->setGravity( m_cci.m_gravity); m_body->setDamping(m_cci.m_linearDamping, m_cci.m_angularDamping); m_body->setCenterOfMassTransform( trans ); @@ -237,15 +237,26 @@ void CcdPhysicsController::resolveCombinedVelocities(float linvelX,float linvel void CcdPhysicsController::getPosition(PHY__Vector3& pos) const { - assert(0); + const SimdTransform& xform = m_body->getCenterOfMassTransform(); + pos[0] = xform.getOrigin().x(); + pos[1] = xform.getOrigin().y(); + pos[2] = xform.getOrigin().z(); } void CcdPhysicsController::setScaling(float scaleX,float scaleY,float scaleZ) { - if (m_body && m_body->GetCollisionShape()) + if (!SimdFuzzyZero(m_cci.m_scaling.x()-scaleX) || + !SimdFuzzyZero(m_cci.m_scaling.y()-scaleY) || + !SimdFuzzyZero(m_cci.m_scaling.z()-scaleZ)) { - SimdVector3 scaling(scaleX,scaleY,scaleZ); - m_body->GetCollisionShape()->setLocalScaling(scaling); + m_cci.m_scaling = SimdVector3(scaleX,scaleY,scaleZ); + + if (m_body && m_body->GetCollisionShape()) + { + m_body->GetCollisionShape()->setLocalScaling(m_cci.m_scaling); + m_body->GetCollisionShape()->CalculateLocalInertia(m_cci.m_mass, m_cci.m_localInertiaTensor); + m_body->setMassProps(m_cci.m_mass, m_cci.m_localInertiaTensor * m_cci.m_inertiaFactor); + } } } diff --git a/source/gameengine/Physics/Bullet/CcdPhysicsController.h b/source/gameengine/Physics/Bullet/CcdPhysicsController.h index 87290f65fb4..3becd14028a 100644 --- a/source/gameengine/Physics/Bullet/CcdPhysicsController.h +++ b/source/gameengine/Physics/Bullet/CcdPhysicsController.h @@ -29,12 +29,15 @@ struct CcdConstructionInfo m_angularDamping(0.1f), m_MotionState(0), m_collisionShape(0), - m_physicsEnv(0) - + m_physicsEnv(0), + m_inertiaFactor(1.f), + m_scaling(1.f,1.f,1.f) { } + SimdVector3 m_localInertiaTensor; SimdVector3 m_gravity; + SimdVector3 m_scaling; SimdScalar m_mass; SimdScalar m_restitution; SimdScalar m_friction; @@ -45,6 +48,7 @@ struct CcdConstructionInfo CollisionShape* m_collisionShape; CcdPhysicsEnvironment* m_physicsEnv; //needed for self-replication + float m_inertiaFactor;//tweak the inertia (hooked up to Blender 'formfactor' }; -- cgit v1.2.3