[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [16712] trunk/blender: Created a KX_SoftBodyDeformer for real-time soft bodies.

Erwin Coumans blender at erwincoumans.com
Wed Sep 24 05:12:11 CEST 2008


Revision: 16712
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=16712
Author:   erwin
Date:     2008-09-24 05:12:10 +0200 (Wed, 24 Sep 2008)

Log Message:
-----------
Created a  KX_SoftBodyDeformer for real-time soft bodies.
Added SetDeformer/GetDeformer() to KX_GameObject.
Store mapping between graphics/soft body vertices (work-in-progress)
Real-time soft body integration is still very premature, but
for a quick preview, see this testfile:
http://bulletphysics.com/ftp/pub/test/index.php?dir=blender/&file=soft_test.blend

Modified Paths:
--------------
    trunk/blender/extern/bullet2/src/BulletCollision/BroadphaseCollision/btBroadphaseProxy.h
    trunk/blender/extern/bullet2/src/BulletCollision/CollisionShapes/btScaledBvhTriangleMeshShape.cpp
    trunk/blender/extern/bullet2/src/BulletCollision/CollisionShapes/btScaledBvhTriangleMeshShape.h
    trunk/blender/extern/bullet2/src/BulletSoftBody/btSoftBody.h
    trunk/blender/extern/bullet2/src/BulletSoftBody/btSoftRigidDynamicsWorld.cpp
    trunk/blender/extern/bullet2/src/BulletSoftBody/btSoftRigidDynamicsWorld.h
    trunk/blender/extern/bullet2/src/LinearMath/btConvexHull.cpp
    trunk/blender/extern/bullet2/src/LinearMath/btConvexHull.h
    trunk/blender/source/gameengine/Converter/BL_BlenderDataConversion.cpp
    trunk/blender/source/gameengine/Converter/BL_DeformableGameObject.h
    trunk/blender/source/gameengine/Converter/BL_SkinMeshObject.cpp
    trunk/blender/source/gameengine/Ketsji/KX_ConvertPhysicsObjects.cpp
    trunk/blender/source/gameengine/Ketsji/KX_GameObject.h
    trunk/blender/source/gameengine/Ketsji/KX_Scene.cpp
    trunk/blender/source/gameengine/Physics/Bullet/CcdPhysicsController.cpp
    trunk/blender/source/gameengine/Physics/Bullet/CcdPhysicsEnvironment.cpp
    trunk/blender/source/gameengine/Physics/Bullet/CcdPhysicsEnvironment.h

Modified: trunk/blender/extern/bullet2/src/BulletCollision/BroadphaseCollision/btBroadphaseProxy.h
===================================================================
--- trunk/blender/extern/bullet2/src/BulletCollision/BroadphaseCollision/btBroadphaseProxy.h	2008-09-24 02:52:47 UTC (rev 16711)
+++ trunk/blender/extern/bullet2/src/BulletCollision/BroadphaseCollision/btBroadphaseProxy.h	2008-09-24 03:12:10 UTC (rev 16712)
@@ -46,6 +46,7 @@
 CONCAVE_SHAPES_START_HERE,
 	//keep all the convex shapetype below here, for the check IsConvexShape in broadphase proxy!
 	TRIANGLE_MESH_SHAPE_PROXYTYPE,
+	SCALED_TRIANGLE_MESH_SHAPE_PROXYTYPE,
 	///used for demo integration FAST/Swift collision library and Bullet
 	FAST_CONCAVE_MESH_PROXYTYPE,
 	//terrain

Modified: trunk/blender/extern/bullet2/src/BulletCollision/CollisionShapes/btScaledBvhTriangleMeshShape.cpp
===================================================================
--- trunk/blender/extern/bullet2/src/BulletCollision/CollisionShapes/btScaledBvhTriangleMeshShape.cpp	2008-09-24 02:52:47 UTC (rev 16711)
+++ trunk/blender/extern/bullet2/src/BulletCollision/CollisionShapes/btScaledBvhTriangleMeshShape.cpp	2008-09-24 03:12:10 UTC (rev 16712)
@@ -117,5 +117,5 @@
 void	btScaledBvhTriangleMeshShape::calculateLocalInertia(btScalar mass,btVector3& inertia) const
 {
 	///don't make this a movable object!
-	btAssert(0);
+//	btAssert(0);
 }

Modified: trunk/blender/extern/bullet2/src/BulletCollision/CollisionShapes/btScaledBvhTriangleMeshShape.h
===================================================================
--- trunk/blender/extern/bullet2/src/BulletCollision/CollisionShapes/btScaledBvhTriangleMeshShape.h	2008-09-24 02:52:47 UTC (rev 16711)
+++ trunk/blender/extern/bullet2/src/BulletCollision/CollisionShapes/btScaledBvhTriangleMeshShape.h	2008-09-24 03:12:10 UTC (rev 16712)
@@ -39,7 +39,7 @@
 	virtual int	getShapeType() const
 	{
 		//use un-used 'FAST_CONCAVE_MESH_PROXYTYPE' for now, later add SCALED_TRIANGLE_MESH_SHAPE_PROXYTYPE to btBroadphaseProxy.h
-		return FAST_CONCAVE_MESH_PROXYTYPE;
+		return SCALED_TRIANGLE_MESH_SHAPE_PROXYTYPE;
 	}
 
 	virtual void getAabb(const btTransform& t,btVector3& aabbMin,btVector3& aabbMax) const;
@@ -49,6 +49,16 @@
 
 	virtual void	processAllTriangles(btTriangleCallback* callback,const btVector3& aabbMin,const btVector3& aabbMax) const;
 
+	btBvhTriangleMeshShape*	getChildShape()
+	{
+		return m_bvhTriMeshShape;
+	}
+
+	const btBvhTriangleMeshShape*	getChildShape() const
+	{
+		return m_bvhTriMeshShape;
+	}
+
 	//debugging
 	virtual const char*	getName()const {return "SCALEDBVHTRIANGLEMESH";}
 

Modified: trunk/blender/extern/bullet2/src/BulletSoftBody/btSoftBody.h
===================================================================
--- trunk/blender/extern/bullet2/src/BulletSoftBody/btSoftBody.h	2008-09-24 02:52:47 UTC (rev 16711)
+++ trunk/blender/extern/bullet2/src/BulletSoftBody/btSoftBody.h	2008-09-24 03:12:10 UTC (rev 16712)
@@ -29,7 +29,7 @@
 #include "BulletCollision/BroadphaseCollision/btDbvt.h"
 
 class btBroadphaseInterface;
-class btCollisionDispatcher;
+class btDispatcher;
 
 /* btSoftBodyWorldInfo	*/ 
 struct	btSoftBodyWorldInfo
@@ -39,7 +39,7 @@
 	btScalar				water_offset;
 	btVector3				water_normal;
 	btBroadphaseInterface*	m_broadphase;
-	btCollisionDispatcher*	m_dispatcher;
+	btDispatcher*	m_dispatcher;
 	btVector3				m_gravity;
 	btSparseSdf<3>			m_sparsesdf;
 };	
@@ -607,6 +607,7 @@
 	virtual ~btSoftBody();
 	/* Check for existing link												*/ 
 
+	btAlignedObjectArray<int>	m_userIndexMapping;
 
 	virtual void	setCollisionShape(btCollisionShape* collisionShape)
 	{

Modified: trunk/blender/extern/bullet2/src/BulletSoftBody/btSoftRigidDynamicsWorld.cpp
===================================================================
--- trunk/blender/extern/bullet2/src/BulletSoftBody/btSoftRigidDynamicsWorld.cpp	2008-09-24 02:52:47 UTC (rev 16711)
+++ trunk/blender/extern/bullet2/src/BulletSoftBody/btSoftRigidDynamicsWorld.cpp	2008-09-24 03:12:10 UTC (rev 16712)
@@ -21,6 +21,10 @@
 #include "btSoftBody.h"
 #include "btSoftBodyHelpers.h"
 
+
+
+
+
 btSoftRigidDynamicsWorld::btSoftRigidDynamicsWorld(btDispatcher* dispatcher,btBroadphaseInterface* pairCache,btConstraintSolver* constraintSolver,btCollisionConfiguration* collisionConfiguration)
 :btDiscreteDynamicsWorld(dispatcher,pairCache,constraintSolver,collisionConfiguration)
 {
@@ -28,6 +32,11 @@
 m_drawNodeTree		=	true;
 m_drawFaceTree		=	false;
 m_drawClusterTree	=	false;
+m_sbi.m_broadphase = pairCache;
+m_sbi.m_dispatcher = dispatcher;
+m_sbi.m_sparsesdf.Initialize();
+m_sbi.m_sparsesdf.Reset();
+
 }
 		
 btSoftRigidDynamicsWorld::~btSoftRigidDynamicsWorld()

Modified: trunk/blender/extern/bullet2/src/BulletSoftBody/btSoftRigidDynamicsWorld.h
===================================================================
--- trunk/blender/extern/bullet2/src/BulletSoftBody/btSoftRigidDynamicsWorld.h	2008-09-24 02:52:47 UTC (rev 16711)
+++ trunk/blender/extern/bullet2/src/BulletSoftBody/btSoftRigidDynamicsWorld.h	2008-09-24 03:12:10 UTC (rev 16712)
@@ -13,12 +13,12 @@
 3. This notice may not be removed or altered from any source distribution.
 */
 
-#include "BulletDynamics/Dynamics/btDiscreteDynamicsWorld.h"
-
 #ifndef BT_SOFT_RIGID_DYNAMICS_WORLD_H
 #define BT_SOFT_RIGID_DYNAMICS_WORLD_H
 
-class btSoftBody;
+#include "BulletDynamics/Dynamics/btDiscreteDynamicsWorld.h"
+#include "btSoftBody.h"
+
 typedef	btAlignedObjectArray<btSoftBody*> btSoftBodyArray;
 
 class btSoftRigidDynamicsWorld : public btDiscreteDynamicsWorld
@@ -29,7 +29,8 @@
 	bool			m_drawNodeTree;
 	bool			m_drawFaceTree;
 	bool			m_drawClusterTree;
-		
+	btSoftBodyWorldInfo m_sbi;
+
 protected:
 	
 	virtual void	predictUnconstraintMotion(btScalar timeStep);
@@ -40,7 +41,6 @@
 
 	void	solveSoftBodiesConstraints();
 
-	
 
 public:
 	
@@ -57,6 +57,15 @@
 	int		getDrawFlags() const { return(m_drawFlags); }
 	void	setDrawFlags(int f)	{ m_drawFlags=f; }
 
+	btSoftBodyWorldInfo&	getWorldInfo()
+	{
+		return m_sbi;
+	}
+	const btSoftBodyWorldInfo&	getWorldInfo() const
+	{
+		return m_sbi;
+	}
+
 			
 	btSoftBodyArray& getSoftBodyArray()
 	{

Modified: trunk/blender/extern/bullet2/src/LinearMath/btConvexHull.cpp
===================================================================
--- trunk/blender/extern/bullet2/src/LinearMath/btConvexHull.cpp	2008-09-24 02:52:47 UTC (rev 16711)
+++ trunk/blender/extern/bullet2/src/LinearMath/btConvexHull.cpp	2008-09-24 03:12:10 UTC (rev 16712)
@@ -869,7 +869,9 @@
 {
 	if ( svcount == 0 ) return false;
 
+	m_vertexIndexMapping.resize(0);
 
+
 #define EPSILON btScalar(0.000001) /* close enough to consider two btScalaring point numbers to be 'the same'. */
 
 	vcount = 0;
@@ -1027,6 +1029,7 @@
 						v[0] = px;
 						v[1] = py;
 						v[2] = pz;
+						
 					}
 
 					break;
@@ -1041,6 +1044,7 @@
 				dest[2] = pz;
 				vcount++;
 			}
+			m_vertexIndexMapping.push_back(j);
 		}
 	}
 
@@ -1116,13 +1120,22 @@
 
 void HullLibrary::BringOutYourDead(const btVector3* verts,unsigned int vcount, btVector3* overts,unsigned int &ocount,unsigned int *indices,unsigned indexcount)
 {
+	btAlignedObjectArray<int>tmpIndices;
+	tmpIndices.resize(m_vertexIndexMapping.size());
+	int i;
+
+	for (i=0;i<m_vertexIndexMapping.size();i++)
+	{
+		tmpIndices[i] = m_vertexIndexMapping[i];
+	}
+
 	TUIntArray usedIndices;
 	usedIndices.resize(static_cast<int>(vcount));
 	memset(&usedIndices[0],0,sizeof(unsigned int)*vcount);
 
 	ocount = 0;
 
-	for (unsigned int i=0; i<indexcount; i++)
+	for (i=0; i<indexcount; i++)
 	{
 		unsigned int v = indices[i]; // original array index
 
@@ -1141,11 +1154,19 @@
 			overts[ocount][1] = verts[v][1];
 			overts[ocount][2] = verts[v][2];
 
+			for (int k=0;k<m_vertexIndexMapping.size();k++)
+			{
+				if (tmpIndices[k]==v)
+					m_vertexIndexMapping[k]=ocount;
+			}
+
 			ocount++; // increment output vert count
 
 			btAssert( ocount >=0 && ocount <= vcount );
 
 			usedIndices[static_cast<int>(v)] = ocount; // assign new index remapping
+
+		
 		}
 	}
 

Modified: trunk/blender/extern/bullet2/src/LinearMath/btConvexHull.h
===================================================================
--- trunk/blender/extern/bullet2/src/LinearMath/btConvexHull.h	2008-09-24 02:52:47 UTC (rev 16711)
+++ trunk/blender/extern/bullet2/src/LinearMath/btConvexHull.h	2008-09-24 03:12:10 UTC (rev 16712)
@@ -192,6 +192,9 @@
 
 public:
 
+	btAlignedObjectArray<int> m_vertexIndexMapping;
+
+
 	HullError CreateConvexHull(const HullDesc& desc, // describes the input request
 				   HullResult&     result);        // contains the resulst
 	HullError ReleaseResult(HullResult &result); // release memory allocated for this result, we are done with it.

Modified: trunk/blender/source/gameengine/Converter/BL_BlenderDataConversion.cpp
===================================================================
--- trunk/blender/source/gameengine/Converter/BL_BlenderDataConversion.cpp	2008-09-24 02:52:47 UTC (rev 16711)
+++ trunk/blender/source/gameengine/Converter/BL_BlenderDataConversion.cpp	2008-09-24 03:12:10 UTC (rev 16712)
@@ -743,7 +743,8 @@
 	}
 
 	// Determine if we need to make a skinned mesh
-	if (mesh->dvert || mesh->key) {
+	if (mesh->dvert || mesh->key || ((blenderobj->gameflag & OB_SOFT_BODY) != 0)) 
+	{
 		meshobj = new BL_SkinMeshObject(mesh, lightlayer);
 		skinMesh = true;
 	}
@@ -1554,20 +1555,20 @@
 			// not that we can have shape keys without dvert! 
 			BL_ShapeDeformer *dcont = new BL_ShapeDeformer((BL_DeformableGameObject*)gameobj, 
 															ob, (BL_SkinMeshObject*)meshobj);
-			((BL_DeformableGameObject*)gameobj)->m_pDeformer = dcont;
+			((BL_DeformableGameObject*)gameobj)->SetDeformer(dcont);
 			if (bHasArmature)
 				dcont->LoadShapeDrivers(ob->parent);
 		} else if (bHasArmature) {
 			BL_SkinDeformer *dcont = new BL_SkinDeformer((BL_DeformableGameObject*)gameobj,
 															ob, (BL_SkinMeshObject*)meshobj);
-			((BL_DeformableGameObject*)gameobj)->m_pDeformer = dcont;
+			((BL_DeformableGameObject*)gameobj)->SetDeformer(dcont);
 		} else if (bHasDvert) {
 			// this case correspond to a mesh that can potentially deform but not with the
 			// object to which it is attached for the moment. A skin mesh was created in
 			// BL_ConvertMesh() so must create a deformer too!
 			BL_MeshDeformer *dcont = new BL_MeshDeformer((BL_DeformableGameObject*)gameobj,
 														  ob, (BL_SkinMeshObject*)meshobj);
-			((BL_DeformableGameObject*)gameobj)->m_pDeformer = dcont;

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list