[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [16650] trunk/blender: BGE real-time soft bodies, step 2 / 3: create a btSoftBody.

Erwin Coumans blender at erwincoumans.com
Sun Sep 21 17:17:50 CEST 2008


Revision: 16650
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=16650
Author:   erwin
Date:     2008-09-21 17:17:50 +0200 (Sun, 21 Sep 2008)

Log Message:
-----------
BGE real-time soft bodies, step 2 / 3: create a btSoftBody. Next step is hooking up / deform graphics mesh and choose collision shape.
Note: feature is still disabled.

Modified Paths:
--------------
    trunk/blender/extern/bullet2/src/BulletCollision/BroadphaseCollision/btDbvtBroadphase.cpp
    trunk/blender/extern/bullet2/src/BulletCollision/BroadphaseCollision/btDbvtBroadphase.h
    trunk/blender/extern/bullet2/src/BulletCollision/CollisionDispatch/btCollisionObject.h
    trunk/blender/extern/bullet2/src/BulletSoftBody/btSoftBody.cpp
    trunk/blender/extern/bullet2/src/BulletSoftBody/btSoftBody.h
    trunk/blender/extern/bullet2/src/BulletSoftBody/btSoftBodyInternals.h
    trunk/blender/source/gameengine/Converter/BL_BlenderDataConversion.cpp
    trunk/blender/source/gameengine/Ketsji/KX_ConvertPhysicsObject.h
    trunk/blender/source/gameengine/Ketsji/KX_ConvertPhysicsObjects.cpp
    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/BroadphaseCollision/btDbvtBroadphase.cpp
===================================================================
--- trunk/blender/extern/bullet2/src/BulletCollision/BroadphaseCollision/btDbvtBroadphase.cpp	2008-09-21 13:03:39 UTC (rev 16649)
+++ trunk/blender/extern/bullet2/src/BulletCollision/BroadphaseCollision/btDbvtBroadphase.cpp	2008-09-21 15:17:50 UTC (rev 16650)
@@ -119,7 +119,7 @@
 //
 btDbvtBroadphase::btDbvtBroadphase(btOverlappingPairCache* paircache)
 {
-m_deferedcollide	=	true;//false;
+m_deferedcollide	=	false;
 m_needcleanup		=	true;
 m_releasepaircache	=	(paircache!=0)?false:true;
 m_prediction		=	1/(btScalar)2;
@@ -164,7 +164,7 @@
 																void* userPtr,
 																short int collisionFilterGroup,
 																short int collisionFilterMask,
-																btDispatcher* dispatcher,
+																btDispatcher* /*dispatcher*/,
 																void* /*multiSapProxy*/)
 {
 btDbvtProxy*		proxy=new(btAlignedAlloc(sizeof(btDbvtProxy),16)) btDbvtProxy(	userPtr,
@@ -180,6 +180,7 @@
 	btDbvtTreeCollider	collider(this);
 	collider.proxy=proxy;
 	btDbvt::collideTV(m_sets[0].m_root,proxy->aabb,collider);
+	btDbvt::collideTV(m_sets[1].m_root,proxy->aabb,collider);
 	}
 return(proxy);
 }

Modified: trunk/blender/extern/bullet2/src/BulletCollision/BroadphaseCollision/btDbvtBroadphase.h
===================================================================
--- trunk/blender/extern/bullet2/src/BulletCollision/BroadphaseCollision/btDbvtBroadphase.h	2008-09-21 13:03:39 UTC (rev 16649)
+++ trunk/blender/extern/bullet2/src/BulletCollision/BroadphaseCollision/btDbvtBroadphase.h	2008-09-21 15:17:50 UTC (rev 16650)
@@ -86,7 +86,6 @@
 bool					m_releasepaircache;			// Release pair cache on delete
 bool					m_deferedcollide;			// Defere dynamic/static collision to collide call
 bool					m_needcleanup;				// Need to run cleanup?
-bool					m_initialize;				// Initialization
 #if DBVT_BP_PROFILE
 btClock					m_clock;
 struct	{

Modified: trunk/blender/extern/bullet2/src/BulletCollision/CollisionDispatch/btCollisionObject.h
===================================================================
--- trunk/blender/extern/bullet2/src/BulletCollision/CollisionDispatch/btCollisionObject.h	2008-09-21 13:03:39 UTC (rev 16649)
+++ trunk/blender/extern/bullet2/src/BulletCollision/CollisionDispatch/btCollisionObject.h	2008-09-21 15:17:50 UTC (rev 16650)
@@ -143,7 +143,7 @@
 
 	virtual ~btCollisionObject();
 
-	void	setCollisionShape(btCollisionShape* collisionShape)
+	virtual void	setCollisionShape(btCollisionShape* collisionShape)
 	{
 		m_collisionShape = collisionShape;
 		m_rootCollisionShape = collisionShape;

Modified: trunk/blender/extern/bullet2/src/BulletSoftBody/btSoftBody.cpp
===================================================================
--- trunk/blender/extern/bullet2/src/BulletSoftBody/btSoftBody.cpp	2008-09-21 13:03:39 UTC (rev 16649)
+++ trunk/blender/extern/bullet2/src/BulletSoftBody/btSoftBody.cpp	2008-09-21 15:17:50 UTC (rev 16650)
@@ -69,7 +69,7 @@
 	pm->m_flags	=	fMaterial::Default;
 	/* Collision shape	*/ 
 	///for now, create a collision shape internally
-	setCollisionShape(new btSoftBodyCollisionShape(this));	
+	m_collisionShape = new btSoftBodyCollisionShape(this);
 	m_collisionShape->setMargin(0.25);
 	/* Nodes			*/ 
 	const btScalar		margin=getCollisionShape()->getMargin();

Modified: trunk/blender/extern/bullet2/src/BulletSoftBody/btSoftBody.h
===================================================================
--- trunk/blender/extern/bullet2/src/BulletSoftBody/btSoftBody.h	2008-09-21 13:03:39 UTC (rev 16649)
+++ trunk/blender/extern/bullet2/src/BulletSoftBody/btSoftBody.h	2008-09-21 15:17:50 UTC (rev 16650)
@@ -606,6 +606,13 @@
 	/* dtor																	*/ 
 	virtual ~btSoftBody();
 	/* Check for existing link												*/ 
+
+
+	virtual void	setCollisionShape(btCollisionShape* collisionShape)
+	{
+		//don't do anything, due to the internal shape hack: todo: fix this
+	}
+
 	bool				checkLink(	int node0,
 		int node1) const;
 	bool				checkLink(	const Node* node0,

Modified: trunk/blender/extern/bullet2/src/BulletSoftBody/btSoftBodyInternals.h
===================================================================
--- trunk/blender/extern/bullet2/src/BulletSoftBody/btSoftBodyInternals.h	2008-09-21 13:03:39 UTC (rev 16649)
+++ trunk/blender/extern/bullet2/src/BulletSoftBody/btSoftBodyInternals.h	2008-09-21 15:17:50 UTC (rev 16650)
@@ -94,7 +94,6 @@
 	virtual void	setLocalScaling(const btVector3& /*scaling*/)
 	{		
 		///na
-		btAssert(0);
 	}
 	virtual const btVector3& getLocalScaling() const
 	{

Modified: trunk/blender/source/gameengine/Converter/BL_BlenderDataConversion.cpp
===================================================================
--- trunk/blender/source/gameengine/Converter/BL_BlenderDataConversion.cpp	2008-09-21 13:03:39 UTC (rev 16649)
+++ trunk/blender/source/gameengine/Converter/BL_BlenderDataConversion.cpp	2008-09-21 15:17:50 UTC (rev 16650)
@@ -1318,6 +1318,7 @@
 	// ACTOR is now a separate feature
 	objprop.m_isactor = (blenderobject->gameflag & OB_ACTOR)!=0;
 	objprop.m_dyna = (blenderobject->gameflag & OB_DYNAMIC) != 0;
+	objprop.m_softbody = (blenderobject->gameflag & OB_SOFT_BODY) != 0;
 	objprop.m_angular_rigidbody = (blenderobject->gameflag & OB_RIGID_BODY) != 0;
 	objprop.m_ghost = (blenderobject->gameflag & OB_GHOST) != 0;
 	objprop.m_disableSleeping = (blenderobject->gameflag & OB_COLLISION_RESPONSE) != 0;//abuse the OB_COLLISION_RESPONSE flag

Modified: trunk/blender/source/gameengine/Ketsji/KX_ConvertPhysicsObject.h
===================================================================
--- trunk/blender/source/gameengine/Ketsji/KX_ConvertPhysicsObject.h	2008-09-21 13:03:39 UTC (rev 16649)
+++ trunk/blender/source/gameengine/Ketsji/KX_ConvertPhysicsObject.h	2008-09-21 15:17:50 UTC (rev 16650)
@@ -75,6 +75,7 @@
 struct KX_ObjectProperties
 {
 	bool	m_dyna;
+	bool	m_softbody;
 	double m_radius;
 	bool	m_angular_rigidbody;
 	bool	m_in_active_layer;

Modified: trunk/blender/source/gameengine/Ketsji/KX_ConvertPhysicsObjects.cpp
===================================================================
--- trunk/blender/source/gameengine/Ketsji/KX_ConvertPhysicsObjects.cpp	2008-09-21 13:03:39 UTC (rev 16649)
+++ trunk/blender/source/gameengine/Ketsji/KX_ConvertPhysicsObjects.cpp	2008-09-21 15:17:50 UTC (rev 16650)
@@ -917,6 +917,7 @@
 	ci.m_collisionFilterGroup = (isbulletdyna) ? short(CcdConstructionInfo::DefaultFilter) : short(CcdConstructionInfo::StaticFilter);
 	ci.m_collisionFilterMask = (isbulletdyna) ? short(CcdConstructionInfo::AllFilter) : short(CcdConstructionInfo::AllFilter ^ CcdConstructionInfo::StaticFilter);
 	ci.m_bRigid = objprop->m_dyna && objprop->m_angular_rigidbody;
+	ci.m_bSoft = objprop->m_softbody;
 	MT_Vector3 scaling = gameobj->NodeGetWorldScaling();
 	ci.m_scaling.setValue(scaling[0], scaling[1], scaling[2]);
 	KX_BulletPhysicsController* physicscontroller = new KX_BulletPhysicsController(ci,isbulletdyna);
@@ -933,10 +934,12 @@
 
 	gameobj->SetPhysicsController(physicscontroller,isbulletdyna);
 	physicscontroller->setNewClientInfo(gameobj->getClientInfo());		
-	btRigidBody* rbody = physicscontroller->GetRigidBody();
+	{
+		btRigidBody* rbody = physicscontroller->GetRigidBody();
 
-	if (objprop->m_disableSleeping)
-		rbody->setActivationState(DISABLE_DEACTIVATION);
+		if (rbody && objprop->m_disableSleeping)
+			rbody->setActivationState(DISABLE_DEACTIVATION);
+	}
 	
 	//Now done directly in ci.m_collisionFlags so that it propagates to replica
 	//if (objprop->m_ghost)

Modified: trunk/blender/source/gameengine/Physics/Bullet/CcdPhysicsController.cpp
===================================================================
--- trunk/blender/source/gameengine/Physics/Bullet/CcdPhysicsController.cpp	2008-09-21 13:03:39 UTC (rev 16649)
+++ trunk/blender/source/gameengine/Physics/Bullet/CcdPhysicsController.cpp	2008-09-21 15:17:50 UTC (rev 16650)
@@ -133,7 +133,14 @@
 	return btSoftBody::upcast(m_object);
 }
 
+#include "BulletSoftBody/btSoftBodyHelpers.h"
 
+btVector3 pts[3] = {btVector3(0,0,0),
+btVector3(0,1,0),
+btVector3(1,1,0)};
+int triangles[3] = {0,1,2};
+btSoftBodyWorldInfo sbi;
+
 void CcdPhysicsController::CreateRigidbody()
 {
 
@@ -143,14 +150,64 @@
 	///either create a btCollisionObject, btRigidBody or btSoftBody
 
 	//create a collision object
-	if (0)//m_cci.m_mass==0.f)
+
+	//disable soft body until first sneak preview is ready
+	if (0)//m_cci.m_bSoft)
 	{
 		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();
+
+		
+		sbi.m_broadphase = this->m_cci.m_physicsEnv->getBroadphase();
+		sbi.m_dispatcher = (btCollisionDispatcher*) m_cci.m_physicsEnv->getDispatcher();
+		
+		int nodecount = 0;
+		
+		
+		int numtriangles = 1;
+		
+		btVector3 p = trans.getOrigin();
+		btScalar h = 1.f;
+		
+		PHY__Vector3	grav;
+		m_cci.m_physicsEnv->getGravity(grav);
+		sbi.m_gravity.setValue(grav[0],grav[1],grav[2]);
+
+		const btVector3	c[]={	p+h*btVector3(-1,-1,-1),
+		p+h*btVector3(+1,-1,-1),
+		p+h*btVector3(-1,+1,-1),
+		p+h*btVector3(+1,+1,-1),
+		p+h*btVector3(-1,-1,+1),
+		p+h*btVector3(+1,-1,+1),
+		p+h*btVector3(-1,+1,+1),
+		p+h*btVector3(+1,+1,+1)};
+
+		int i=0;
+		const int n=15;
+		//btSoftBody*	psb=btSoftBodyHelpers::CreateRope(sbi,	btVector3(-10,0,i*0.25),btVector3(10,0,i*0.25),	16,1+2);
+		btSoftBody* psb = btSoftBodyHelpers::CreateFromConvexHull(sbi,c,8);
+
+		m_object = psb;//btSoftBodyHelpers::CreateFromTriMesh(sbi,&pts[0].getX(),triangles,numtriangles);
+
+		psb->m_cfg.collisions	=	btSoftBody::fCollision::SDF_RS;//btSoftBody::fCollision::CL_SS+	btSoftBody::fCollision::CL_RS;
+
+		sbi.m_sparsesdf.Reset();
+		sbi.m_sparsesdf.Initialize();
+
+		psb->generateBendingConstraints(2);
+
+		psb->m_cfg.kDF=1;
+		psb->activate();
+		psb->setActivationState(1);
+		psb->setDeactivationTime(1.f);
+		psb->m_cfg.piterations		=	4;
+		//psb->m_materials[0]->m_kLST	=	0.1+(i/(btScalar)(n-1))*0.9;
+		psb->setTotalMass(20);
+		psb->setCollisionFlags(0);
+
 		m_object->setCollisionShape(rbci.m_collisionShape);
 		btTransform startTrans;
 


@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list