[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [16568] trunk/blender: Preparation for real-time soft bodies for the game engine, step 1 out of 3 .

Erwin Coumans blender at erwincoumans.com
Wed Sep 17 03:50:03 CEST 2008


Revision: 16568
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=16568
Author:   erwin
Date:     2008-09-17 03:49:47 +0200 (Wed, 17 Sep 2008)

Log Message:
-----------
Preparation for real-time soft bodies for the game engine, step 1 out of 3. This should be harmless/non-intrusive.
Please make sure each build system include extern/bullet2/src/BulletSoftBody/* and extern/bullet2/src/LinearMath/btConvexHull.*

Modified Paths:
--------------
    trunk/blender/extern/bullet2/src/BulletCollision/CollisionDispatch/btCollisionObject.h
    trunk/blender/source/gameengine/Physics/Bullet/CcdPhysicsController.cpp
    trunk/blender/source/gameengine/Physics/Bullet/CcdPhysicsController.h
    trunk/blender/source/gameengine/Physics/Bullet/CcdPhysicsEnvironment.cpp
    trunk/blender/source/gameengine/Physics/Bullet/CcdPhysicsEnvironment.h

Modified: trunk/blender/extern/bullet2/src/BulletCollision/CollisionDispatch/btCollisionObject.h
===================================================================
--- trunk/blender/extern/bullet2/src/BulletCollision/CollisionDispatch/btCollisionObject.h	2008-09-17 01:29:54 UTC (rev 16567)
+++ trunk/blender/extern/bullet2/src/BulletCollision/CollisionDispatch/btCollisionObject.h	2008-09-17 01:49:47 UTC (rev 16568)
@@ -268,7 +268,16 @@
 		m_interpolationWorldTransform = trans;
 	}
 
+	void	setInterpolationLinearVelocity(const btVector3& linvel)
+	{
+		m_interpolationLinearVelocity = linvel;
+	}
 
+	void	setInterpolationAngularVelocity(const btVector3& angvel)
+	{
+		m_interpolationAngularVelocity = angvel;
+	}
+
 	const btVector3&	getInterpolationLinearVelocity() const
 	{
 		return m_interpolationLinearVelocity;

Modified: trunk/blender/source/gameengine/Physics/Bullet/CcdPhysicsController.cpp
===================================================================
--- trunk/blender/source/gameengine/Physics/Bullet/CcdPhysicsController.cpp	2008-09-17 01:29:54 UTC (rev 16567)
+++ trunk/blender/source/gameengine/Physics/Bullet/CcdPhysicsController.cpp	2008-09-17 01:49:47 UTC (rev 16568)
@@ -19,6 +19,7 @@
 #include "PHY_IMotionState.h"
 #include "CcdPhysicsEnvironment.h"
 #include "RAS_MeshObject.h"
+#include "BulletSoftBody/btSoftBody.h"
 
 
 class BP_Proxy;
@@ -63,11 +64,11 @@
 	CreateRigidbody();
 	
 
-	
-	#ifdef WIN32
-	if (m_body->getInvMass())
-		m_body->setLinearVelocity(startVel);
-	#endif
+///???
+#ifdef WIN32
+	if (GetRigidBody() && !GetRigidBody()->isStaticObject())
+		GetRigidBody()->setLinearVelocity(startVel);
+#endif
 
 }
 
@@ -119,21 +120,60 @@
 };
 
 
+btRigidBody* CcdPhysicsController::GetRigidBody()
+{
+	return btRigidBody::upcast(m_object);
+}
+btCollisionObject*	CcdPhysicsController::GetCollisionObject()
+{
+	return m_object;
+}
+btSoftBody* CcdPhysicsController::GetSoftBody()
+{
+	return btSoftBody::upcast(m_object);
+}
+
+
 void CcdPhysicsController::CreateRigidbody()
 {
 
 	btTransform trans = GetTransformFromMotionState(m_MotionState);
-
 	m_bulletMotionState = new BlenderBulletMotionState(m_MotionState);
 
-	btRigidBody::btRigidBodyConstructionInfo rbci(m_cci.m_mass,m_bulletMotionState,m_collisionShape,m_cci.m_localInertiaTensor * m_cci.m_inertiaFactor);
-	rbci.m_linearDamping = m_cci.m_linearDamping;
-	rbci.m_angularDamping = m_cci.m_angularDamping;
-	rbci.m_friction = m_cci.m_friction;
-	rbci.m_restitution = m_cci.m_restitution;
+	///either create a btCollisionObject, btRigidBody or btSoftBody
+
+	//create a collision object
+	if (0)//m_cci.m_mass==0.f)
+	{
+		btRigidBody::btRigidBodyConstructionInfo rbci(m_cci.m_mass,m_bulletMotionState,m_collisionShape,m_cci.m_localInertiaTensor * m_cci.m_inertiaFactor);
+		rbci.m_linearDamping = m_cci.m_linearDamping;
+		rbci.m_angularDamping = m_cci.m_angularDamping;
+		rbci.m_friction = m_cci.m_friction;
+		rbci.m_restitution = m_cci.m_restitution;
+		m_object = new btCollisionObject();
+		m_object->setCollisionShape(rbci.m_collisionShape);
+		btTransform startTrans;
+
+		if (rbci.m_motionState)
+		{
+			rbci.m_motionState->getWorldTransform(startTrans);
+		} else
+		{
+			startTrans = rbci.m_startWorldTransform;
+		}
+		m_object->setWorldTransform(startTrans);
+		m_object->setInterpolationWorldTransform(startTrans);
+
+	} else
+	{
+		btRigidBody::btRigidBodyConstructionInfo rbci(m_cci.m_mass,m_bulletMotionState,m_collisionShape,m_cci.m_localInertiaTensor * m_cci.m_inertiaFactor);
+		rbci.m_linearDamping = m_cci.m_linearDamping;
+		rbci.m_angularDamping = m_cci.m_angularDamping;
+		rbci.m_friction = m_cci.m_friction;
+		rbci.m_restitution = m_cci.m_restitution;
+		m_object = new btRigidBody(rbci);
+	}
 	
-	m_body = new btRigidBody(rbci);
-	
 	//
 	// init the rigidbody properly
 	//
@@ -145,15 +185,20 @@
 	if ((m_cci.m_collisionFilterGroup & CcdConstructionInfo::SensorFilter) != 0)
 	{
 		// reset the flags that have been set so far
-		m_body->setCollisionFlags(0);
+		GetCollisionObject()->setCollisionFlags(0);
 	}
-	m_body->setCollisionFlags(m_body->getCollisionFlags() | m_cci.m_collisionFlags);
-	m_body->setGravity( m_cci.m_gravity);
-	m_body->setDamping(m_cci.m_linearDamping, m_cci.m_angularDamping);
+	GetCollisionObject()->setCollisionFlags(m_object->getCollisionFlags() | m_cci.m_collisionFlags);
+	btRigidBody* body = GetRigidBody();
 
-	if (!m_cci.m_bRigid)
+	if (body)
 	{
-		m_body->setAngularFactor(0.f);
+		body->setGravity( m_cci.m_gravity);
+		body->setDamping(m_cci.m_linearDamping, m_cci.m_angularDamping);
+
+		if (!m_cci.m_bRigid)
+		{
+			body->setAngularFactor(0.f);
+		}
 	}
 }
 
@@ -180,7 +225,7 @@
 		delete m_MotionState;
 	if (m_bulletMotionState)
 		delete m_bulletMotionState;
-	delete m_body;
+	delete m_object;
 
 	if (m_collisionShape)
 	{
@@ -212,12 +257,14 @@
 {
 	//sync non-static to motionstate, and static from motionstate (todo: add kinematic etc.)
 
-	if (!m_body->isStaticObject())
+	btRigidBody* body = GetRigidBody();
+
+	if (body && !body->isStaticObject())
 	{
-		const btVector3& worldPos = m_body->getCenterOfMassPosition();
+		const btVector3& worldPos = body->getCenterOfMassPosition();
 		m_MotionState->setWorldPosition(worldPos[0],worldPos[1],worldPos[2]);
 		
-		const btQuaternion& worldquat = m_body->getOrientation();
+		const btQuaternion& worldquat = body->getOrientation();
 		m_MotionState->setWorldOrientation(worldquat[0],worldquat[1],worldquat[2],worldquat[3]);
 
 		m_MotionState->calculateWorldTransformations();
@@ -236,7 +283,7 @@
 		btTransform oldTrans = m_body->getCenterOfMassTransform();
 		btTransform newTrans(worldquat,worldPos);
 				
-		m_body->setCenterOfMassTransform(newTrans);
+		SetCenterOfMassTransform(newTrans);
 		//need to keep track of previous position for friction effects...
 		
 		m_MotionState->calculateWorldTransformations();
@@ -285,15 +332,17 @@
 		}
 	}
 
-	m_body = 0;
+	m_object = 0;
 	CreateRigidbody();
 
-	if (m_body)
+	btRigidBody* body = GetRigidBody();
+
+	if (body)
 	{
 		if (m_cci.m_mass)
 		{
-			m_body->setMassProps(m_cci.m_mass, m_cci.m_localInertiaTensor * m_cci.m_inertiaFactor);
-		} 
+			body->setMassProps(m_cci.m_mass, m_cci.m_localInertiaTensor * m_cci.m_inertiaFactor);
+		}
 	}			
 	m_cci.m_physicsEnv->addCcdPhysicsController(this);
 
@@ -330,40 +379,75 @@
 
 }
 
+
+void	CcdPhysicsController::SetCenterOfMassTransform(btTransform& xform)
+{
+	btRigidBody* body = GetRigidBody();
+	if (body)
+	{
+		body->setCenterOfMassTransform(xform);
+	} else
+	{
+		//either collision object or soft body?
+		if (GetSoftBody())
+		{
+			//not yet
+		} else
+		{
+
+			if (m_object->isStaticOrKinematicObject())
+			{
+				m_object->setInterpolationWorldTransform(m_object->getWorldTransform());
+			} else
+			{
+				m_object->setInterpolationWorldTransform(xform);
+			}
+			if (body)
+			{
+				body->setInterpolationLinearVelocity(body->getLinearVelocity());
+				body->setInterpolationAngularVelocity(body->getAngularVelocity());
+				body->updateInertiaTensor();
+			}
+			m_object->setWorldTransform(xform);
+		}
+	}
+}
+
 		// kinematic methods
 void		CcdPhysicsController::RelativeTranslate(float dlocX,float dlocY,float dlocZ,bool local)
 {
-	if (m_body)
+	if (m_object)
 	{
-		m_body->activate(true);
-		if (m_body->isStaticObject())
+		m_object->activate(true);
+		if (m_object->isStaticObject())
 		{
-			m_body->setCollisionFlags(m_body->getCollisionFlags() | btCollisionObject::CF_KINEMATIC_OBJECT);
+			m_object->setCollisionFlags(m_object->getCollisionFlags() | btCollisionObject::CF_KINEMATIC_OBJECT);
 		}
 
+		btRigidBody* body = GetRigidBody();
 
 		btVector3 dloc(dlocX,dlocY,dlocZ);
-		btTransform xform = m_body->getCenterOfMassTransform();
-
+		btTransform xform = m_object->getWorldTransform();
+	
 		if (local)
 		{
 			dloc = xform.getBasis()*dloc;
 		}
 
 		xform.setOrigin(xform.getOrigin() + dloc);
-		m_body->setCenterOfMassTransform(xform);
+		SetCenterOfMassTransform(xform);
 	}
 
 }
 
 void		CcdPhysicsController::RelativeRotate(const float rotval[9],bool local)
 {
-	if (m_body)
+	if (m_object)
 	{
-		m_body->activate(true);
-		if (m_body->isStaticObject())
+		m_object->activate(true);
+		if (m_object->isStaticObject())
 		{
-			m_body->setCollisionFlags(m_body->getCollisionFlags() | btCollisionObject::CF_KINEMATIC_OBJECT);
+			m_object->setCollisionFlags(m_object->getCollisionFlags() | btCollisionObject::CF_KINEMATIC_OBJECT);
 		}
 
 		btMatrix3x3 drotmat(	rotval[0],rotval[4],rotval[8],
@@ -374,16 +458,16 @@
 		btMatrix3x3 currentOrn;
 		GetWorldOrientation(currentOrn);
 
-		btTransform xform = m_body->getCenterOfMassTransform();
-
+		btTransform xform = m_object->getWorldTransform();
+		
 		xform.setBasis(xform.getBasis()*(local ? 
 		drotmat : (currentOrn.inverse() * drotmat * currentOrn)));
 
-		m_body->setCenterOfMassTransform(xform);
+		SetCenterOfMassTransform(xform);
 	}
-
 }
 
+
 void CcdPhysicsController::GetWorldOrientation(btMatrix3x3& mat)
 {
 	float orn[4];
@@ -394,7 +478,7 @@
 
 void		CcdPhysicsController::getOrientation(float &quatImag0,float &quatImag1,float &quatImag2,float &quatReal)
 {
-	btQuaternion q = m_body->getCenterOfMassTransform().getRotation();
+	btQuaternion q = m_object->getWorldTransform().getRotation();
 	quatImag0 = q[0];
 	quatImag1 = q[1];
 	quatImag2 = q[2];
@@ -402,18 +486,18 @@
 }
 void		CcdPhysicsController::setOrientation(float quatImag0,float quatImag1,float quatImag2,float quatReal)
 {
-	if (m_body)
+	if (m_object)
 	{
-		m_body->activate(true);
-		if (m_body->isStaticObject())
+		m_object->activate(true);
+		if (m_object->isStaticObject())
 		{
-			m_body->setCollisionFlags(m_body->getCollisionFlags() | btCollisionObject::CF_KINEMATIC_OBJECT);
+			m_object->setCollisionFlags(m_object->getCollisionFlags() | btCollisionObject::CF_KINEMATIC_OBJECT);
 		}
 		// not required
 		//m_MotionState->setWorldOrientation(quatImag0,quatImag1,quatImag2,quatReal);
-		btTransform xform  = m_body->getCenterOfMassTransform();
+		btTransform xform  = m_object->getWorldTransform();
 		xform.setRotation(btQuaternion(quatImag0,quatImag1,quatImag2,quatReal));
-		m_body->setCenterOfMassTransform(xform);
+		SetCenterOfMassTransform(xform);
 		// not required
 		//m_bulletMotionState->setWorldTransform(xform);
 	}
@@ -422,18 +506,18 @@
 
 void CcdPhysicsController::setWorldOrientation(const btMatrix3x3& orn)
 {
-	if (m_body)
+	if (m_object)
 	{
-		m_body->activate(true);
-		if (m_body->isStaticObject())
+		m_object->activate(true);
+		if (m_object->isStaticObject())
 		{

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list