[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [20437] trunk/blender/source/gameengine/ Physics/Bullet/CcdPhysicsController.cpp: BGE: fix a bug with kinematic object not giving the correct friction to dynamic object when they have a translation and rotation movement at the same time (translation is ignored).

Benoit Bolsee benoit.bolsee at online.be
Tue May 26 23:32:19 CEST 2009


Revision: 20437
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=20437
Author:   ben2610
Date:     2009-05-26 23:32:19 +0200 (Tue, 26 May 2009)

Log Message:
-----------
BGE: fix a bug with kinematic object not giving the correct friction to dynamic object when they have a translation and rotation movement at the same time (translation is ignored). Performance: avoid unnecessary synchronization for static object.

Modified Paths:
--------------
    trunk/blender/source/gameengine/Physics/Bullet/CcdPhysicsController.cpp

Modified: trunk/blender/source/gameengine/Physics/Bullet/CcdPhysicsController.cpp
===================================================================
--- trunk/blender/source/gameengine/Physics/Bullet/CcdPhysicsController.cpp	2009-05-26 18:54:39 UTC (rev 20436)
+++ trunk/blender/source/gameengine/Physics/Bullet/CcdPhysicsController.cpp	2009-05-26 21:32:19 UTC (rev 20437)
@@ -789,9 +789,12 @@
 	if (m_object)
 	{
 		m_object->activate(true);
-		if (m_object->isStaticObject() && !m_cci.m_bSensor)
+		if (m_object->isStaticObject())
 		{
-			m_object->setCollisionFlags(m_object->getCollisionFlags() | btCollisionObject::CF_KINEMATIC_OBJECT);
+			if (!m_cci.m_bSensor)
+				m_object->setCollisionFlags(m_object->getCollisionFlags() | btCollisionObject::CF_KINEMATIC_OBJECT);
+			// kinematic object should not set the transform, it disturbs the velocity interpolation
+			return;
 		}
 
 		// btRigidBody* body = GetRigidBody(); // not used anymore
@@ -815,9 +818,12 @@
 	if (m_object)
 	{
 		m_object->activate(true);
-		if (m_object->isStaticObject() && !m_cci.m_bSensor)
+		if (m_object->isStaticObject())
 		{
-			m_object->setCollisionFlags(m_object->getCollisionFlags() | btCollisionObject::CF_KINEMATIC_OBJECT);
+			if (!m_cci.m_bSensor)
+				m_object->setCollisionFlags(m_object->getCollisionFlags() | btCollisionObject::CF_KINEMATIC_OBJECT);
+			// kinematic object should not set the transform, it disturbs the velocity interpolation
+			return;
 		}
 
 		btMatrix3x3 drotmat(	rotval[0],rotval[4],rotval[8],
@@ -840,10 +846,9 @@
 
 void CcdPhysicsController::GetWorldOrientation(btMatrix3x3& mat)
 {
-	float orn[4];
-	m_MotionState->getWorldOrientation(orn[0],orn[1],orn[2],orn[3]);
-	btQuaternion quat(orn[0],orn[1],orn[2],orn[3]);
-	mat.setRotation(quat);
+	float ori[12];
+	m_MotionState->getWorldOrientation(ori);
+	mat.setFromOpenGLSubMatrix(ori);
 }
 
 void		CcdPhysicsController::getOrientation(float &quatImag0,float &quatImag1,float &quatImag2,float &quatReal)
@@ -859,9 +864,12 @@
 	if (m_object)
 	{
 		m_object->activate(true);
-		if (m_object->isStaticObject() && !m_cci.m_bSensor)
+		if (m_object->isStaticObject())
 		{
-			m_object->setCollisionFlags(m_object->getCollisionFlags() | btCollisionObject::CF_KINEMATIC_OBJECT);
+			if (!m_cci.m_bSensor)
+				m_object->setCollisionFlags(m_object->getCollisionFlags() | btCollisionObject::CF_KINEMATIC_OBJECT);
+			// kinematic object should not set the transform, it disturbs the velocity interpolation
+			return;
 		}
 		// not required
 		//m_MotionState->setWorldOrientation(quatImag0,quatImag1,quatImag2,quatReal);
@@ -911,9 +919,12 @@
 	if (m_object)
 	{
 		m_object->activate(true);
-		if (m_object->isStaticObject() && !m_cci.m_bSensor)
+		if (m_object->isStaticObject())
 		{
-			m_object->setCollisionFlags(m_object->getCollisionFlags() | btCollisionObject::CF_KINEMATIC_OBJECT);
+			if (!m_cci.m_bSensor)
+				m_object->setCollisionFlags(m_object->getCollisionFlags() | btCollisionObject::CF_KINEMATIC_OBJECT);
+			// kinematic object should not set the transform, it disturbs the velocity interpolation
+			return;
 		}
 		// not required, this function is only used to update the physic controller
 		//m_MotionState->setWorldPosition(posX,posY,posZ);





More information about the Bf-blender-cvs mailing list