[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [16733] trunk/blender/source/gameengine: don't apply vertex transformation for deformable game soft bodies.

Erwin Coumans blender at erwincoumans.com
Thu Sep 25 23:04:48 CEST 2008


Revision: 16733
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=16733
Author:   erwin
Date:     2008-09-25 23:04:41 +0200 (Thu, 25 Sep 2008)

Log Message:
-----------
don't apply vertex transformation for deformable game soft bodies.
set a fake world transform for game soft bodies, based on center of the AABB, so visiblity and some game logic works. note: this world transform is not smooth.

Modified Paths:
--------------
    trunk/blender/source/gameengine/Ketsji/KX_ConvertPhysicsObjects.cpp
    trunk/blender/source/gameengine/Physics/Bullet/CcdPhysicsController.cpp
    trunk/blender/source/gameengine/Rasterizer/RAS_Deformer.h
    trunk/blender/source/gameengine/Rasterizer/RAS_MaterialBucket.cpp

Modified: trunk/blender/source/gameengine/Ketsji/KX_ConvertPhysicsObjects.cpp
===================================================================
--- trunk/blender/source/gameengine/Ketsji/KX_ConvertPhysicsObjects.cpp	2008-09-25 20:29:15 UTC (rev 16732)
+++ trunk/blender/source/gameengine/Ketsji/KX_ConvertPhysicsObjects.cpp	2008-09-25 21:04:41 UTC (rev 16733)
@@ -672,11 +672,11 @@
 	{
 		btSoftBody*	m_softBody;
 		class RAS_MeshObject*	m_pMeshObject;
-		class BL_DeformableGameObject*	m_gameobj;
+		class KX_GameObject*	m_gameobj;
 
 
 	public:
-		KX_SoftBodyDeformer(btSoftBody* softBody,RAS_MeshObject*	pMeshObject,BL_DeformableGameObject*	gameobj)
+		KX_SoftBodyDeformer(btSoftBody* softBody,RAS_MeshObject*	pMeshObject,KX_GameObject*	gameobj)
 			: m_softBody(softBody),
 			m_pMeshObject(pMeshObject),
 			m_gameobj(gameobj)
@@ -703,6 +703,8 @@
 			// update the vertex in m_transverts
 			Update();
 
+
+
 			// The vertex cache can only be updated for this deformer:
 			// Duplicated objects with more than one ploymaterial (=multiple mesh slot per object)
 			// share the same mesh (=the same cache). As the rendering is done per polymaterial
@@ -748,6 +750,12 @@
 			//printf("getReplica\n");
 			return 0;
 		}
+
+		virtual bool SkipVertexTransform()
+		{
+			return true;
+		}
+
 	protected:
 		//class RAS_MeshObject	*m_pMesh;
 	};
@@ -1089,7 +1097,7 @@
 		if (softBody && gameobj->GetMesh(0))//only the first mesh, if any
 		{
 			//should be a mesh then, so add a soft body deformer
-			KX_SoftBodyDeformer* softbodyDeformer = new KX_SoftBodyDeformer(softBody, gameobj->GetMesh(0),(BL_DeformableGameObject*)gameobj);
+			KX_SoftBodyDeformer* softbodyDeformer = new KX_SoftBodyDeformer(softBody, gameobj->GetMesh(0),gameobj);
 			gameobj->SetDeformer(softbodyDeformer);
 			
 		}

Modified: trunk/blender/source/gameengine/Physics/Bullet/CcdPhysicsController.cpp
===================================================================
--- trunk/blender/source/gameengine/Physics/Bullet/CcdPhysicsController.cpp	2008-09-25 20:29:15 UTC (rev 16732)
+++ trunk/blender/source/gameengine/Physics/Bullet/CcdPhysicsController.cpp	2008-09-25 21:04:41 UTC (rev 16733)
@@ -401,14 +401,18 @@
 		{
 			startTrans = rbci.m_startWorldTransform;
 		}
-		startTrans.setIdentity();
+		//startTrans.setIdentity();
 
-		m_object->setWorldTransform(startTrans);
-		m_object->setInterpolationWorldTransform(startTrans);
-		m_MotionState->setWorldPosition(0,0,0);
+		//m_object->setWorldTransform(startTrans);
+		//m_object->setInterpolationWorldTransform(startTrans);
+		m_MotionState->setWorldPosition(startTrans.getOrigin().getX(),startTrans.getOrigin().getY(),startTrans.getOrigin().getZ());
 		m_MotionState->setWorldOrientation(0,0,0,1);
 
+//		btVector3 wp = m_softBody->getWorldTransform().getOrigin();
+//		MT_Point3 center(wp.getX(),wp.getY(),wp.getZ());
+//		m_gameobj->NodeSetWorldPosition(center);
 
+
 	} else
 	{
 		btRigidBody::btRigidBodyConstructionInfo rbci(m_cci.m_mass,m_bulletMotionState,m_collisionShape,m_cci.m_localInertiaTensor * m_cci.m_inertiaFactor);
@@ -502,10 +506,22 @@
 {
 	//sync non-static to motionstate, and static from motionstate (todo: add kinematic etc.)
 
+	btSoftBody* sb = GetSoftBody();
+	if (sb)
+	{
+		btVector3 aabbMin,aabbMax;
+		sb->getAabb(aabbMin,aabbMax);
+		btVector3 worldPos  = (aabbMax+aabbMin)*0.5f;
+		m_MotionState->setWorldPosition(worldPos[0],worldPos[1],worldPos[2]);
+		m_MotionState->calculateWorldTransformations();
+		return true;
+	}
+
 	btRigidBody* body = GetRigidBody();
 
 	if (body && !body->isStaticObject())
 	{
+
 		const btVector3& worldPos = body->getCenterOfMassPosition();
 		m_MotionState->setWorldPosition(worldPos[0],worldPos[1],worldPos[2]);
 		

Modified: trunk/blender/source/gameengine/Rasterizer/RAS_Deformer.h
===================================================================
--- trunk/blender/source/gameengine/Rasterizer/RAS_Deformer.h	2008-09-25 20:29:15 UTC (rev 16732)
+++ trunk/blender/source/gameengine/Rasterizer/RAS_Deformer.h	2008-09-25 21:04:41 UTC (rev 16733)
@@ -45,6 +45,10 @@
 	virtual bool Apply(class RAS_IPolyMaterial *polymat)=0;
 	virtual bool Update(void)=0;
 	virtual RAS_Deformer *GetReplica()=0;
+	virtual bool SkipVertexTransform()
+	{
+		return false;
+	}
 protected:
 	class RAS_MeshObject	*m_pMesh;
 };

Modified: trunk/blender/source/gameengine/Rasterizer/RAS_MaterialBucket.cpp
===================================================================
--- trunk/blender/source/gameengine/Rasterizer/RAS_MaterialBucket.cpp	2008-09-25 20:29:15 UTC (rev 16732)
+++ trunk/blender/source/gameengine/Rasterizer/RAS_MaterialBucket.cpp	2008-09-25 21:04:41 UTC (rev 16733)
@@ -539,7 +539,10 @@
 		ms.m_mesh->SortPolygons(ms, cameratrans*MT_Transform(ms.m_OpenGLMatrix));
 
 	rendertools->PushMatrix();
-	rendertools->applyTransform(rasty,ms.m_OpenGLMatrix,m_material->GetDrawingMode());
+	if (!ms.m_pDeformer || !ms.m_pDeformer->SkipVertexTransform())
+	{
+		rendertools->applyTransform(rasty,ms.m_OpenGLMatrix,m_material->GetDrawingMode());
+	}
 
 	if(rasty->QueryLists())
 		if(ms.m_DisplayList)





More information about the Bf-blender-cvs mailing list