[Bf-blender-cvs] [ec90dcb] fracture_modifier: first commit of dynamic fracture, still highly unstable, needs fixes in storage handling and memory management

Martin Felke noreply at git.blender.org
Mon Jun 1 21:29:16 CEST 2015


Commit: ec90dcb5b7c88a098cdfa997ffb8361cf6f51f81
Author: Martin Felke
Date:   Sun May 17 22:04:55 2015 +0200
Branches: fracture_modifier
https://developer.blender.org/rBec90dcb5b7c88a098cdfa997ffb8361cf6f51f81

first commit of dynamic fracture, still highly unstable, needs fixes in storage handling and memory management

===================================================================

M	intern/rigidbody/RBI_api.h
M	intern/rigidbody/rb_bullet_api.cpp
M	release/scripts/startup/bl_ui/properties_physics_fracture.py
M	source/blender/blenkernel/BKE_fracture.h
M	source/blender/blenkernel/intern/fracture.c
M	source/blender/blenkernel/intern/pointcache.c
M	source/blender/blenkernel/intern/rigidbody.c
M	source/blender/makesdna/DNA_modifier_types.h
M	source/blender/makesdna/DNA_rigidbody_types.h
M	source/blender/makesrna/intern/rna_modifier.c
M	source/blender/modifiers/intern/MOD_fracture.c

===================================================================

diff --git a/intern/rigidbody/RBI_api.h b/intern/rigidbody/RBI_api.h
index da24c55..1ee95a1 100644
--- a/intern/rigidbody/RBI_api.h
+++ b/intern/rigidbody/RBI_api.h
@@ -69,13 +69,15 @@ typedef struct rbConstraint rbConstraint;
 /* Collision feedback (manifolds and contact points */
 typedef struct rbContactPoint {
 	float contact_force;
-	void *contact_bodyA;
-	void *contact_bodyB;
+	int contact_body_indexA;
+	int contact_body_indexB;
 	float contact_pos_world_onA[3];
 	float contact_pos_world_onB[3];
 } rbContactPoint;
 
-typedef struct rbContactCallback rbContactCallback;
+/*Subclass because of Internal Tick Callback... sigh why doesnt this work with a simple collision callback ? */
+
+
 
 /* ********************************** */
 /* Dynamics World Methods */
@@ -117,7 +119,7 @@ void RB_dworld_export(rbDynamicsWorld *world, const char *filename);
 /* Setup ---------------------------- */
 
 /* Add RigidBody to dynamics world */
-void RB_dworld_add_body(rbDynamicsWorld *world, rbRigidBody *body, int col_groups, void* meshIsland, void *blenderOb);
+void RB_dworld_add_body(rbDynamicsWorld *world, rbRigidBody *body, int col_groups, void* meshIsland, void *blenderOb, int linear_index);
 
 /* Remove RigidBody from dynamics world */
 void RB_dworld_remove_body(rbDynamicsWorld *world, rbRigidBody *body);
diff --git a/intern/rigidbody/rb_bullet_api.cpp b/intern/rigidbody/rb_bullet_api.cpp
index cc2bdd6..5ce75e7 100644
--- a/intern/rigidbody/rb_bullet_api.cpp
+++ b/intern/rigidbody/rb_bullet_api.cpp
@@ -74,6 +74,95 @@ subject to the following restrictions:
 #include "BulletCollision/CollisionShapes/btScaledBvhTriangleMeshShape.h"
 #include "BulletCollision/CollisionDispatch/btCollisionWorld.h"
 
+struct rbRigidBody {
+	btRigidBody *body;
+	int col_groups;
+	int linear_index;
+	void *meshIsland;
+	void *blenderOb;
+	rbDynamicsWorld *world;
+};
+
+static inline void copy_v3_btvec3(float vec[3], const btVector3 &btvec)
+{
+	vec[0] = (float)btvec[0];
+	vec[1] = (float)btvec[1];
+	vec[2] = (float)btvec[2];
+}
+
+typedef void (*rbContactCallback)(rbContactPoint * cp, void *bworld);
+
+class TickDiscreteDynamicsWorld : public btDiscreteDynamicsWorld
+{
+	public:
+		TickDiscreteDynamicsWorld(btDispatcher* dispatcher,btBroadphaseInterface* pairCache,
+		                          btConstraintSolver* constraintSolver,btCollisionConfiguration* collisionConfiguration,
+		                          rbContactCallback cont_callback, void *bworld);
+		rbContactPoint* make_contact_point(btManifoldPoint& point, const btCollisionObject *body0, const btCollisionObject *body1);
+		rbContactCallback m_contactCallback;
+		void* m_bworld;
+};
+
+void tickCallback(btDynamicsWorld *world, btScalar timeStep)
+{
+	int numManifolds = world->getDispatcher()->getNumManifolds();
+	for (int i=0;i<numManifolds;i++)
+	{
+		btPersistentManifold* contactManifold =  world->getDispatcher()->getManifoldByIndexInternal(i);
+		const btCollisionObject* obA = contactManifold->getBody0();
+		const btCollisionObject* obB = contactManifold->getBody1();
+
+		int numContacts = contactManifold->getNumContacts();
+		for (int j=0;j<numContacts;j++)
+		{
+			btManifoldPoint& pt = contactManifold->getContactPoint(j);
+			if (pt.getDistance()<0.f)
+			{
+				/*const btVector3& ptA = pt.getPositionWorldOnA();
+				const btVector3& ptB = pt.getPositionWorldOnB();
+				const btVector3& normalOnB = pt.m_normalWorldOnB;*/
+
+				TickDiscreteDynamicsWorld* tworld = (TickDiscreteDynamicsWorld*)world;
+				if (tworld->m_contactCallback)
+				{
+					rbContactPoint* cp = tworld->make_contact_point(pt, obA, obB);
+					tworld->m_contactCallback(cp, tworld->m_bworld);
+					delete cp;
+				}
+			}
+		}
+	}
+}
+
+TickDiscreteDynamicsWorld::TickDiscreteDynamicsWorld(btDispatcher* dispatcher,btBroadphaseInterface* pairCache,
+                                                     btConstraintSolver* constraintSolver,btCollisionConfiguration* collisionConfiguration,
+                                                     rbContactCallback cont_callback, void *bworld) :
+                                                     btDiscreteDynamicsWorld(dispatcher, pairCache, constraintSolver, collisionConfiguration)
+{
+	m_internalTickCallback = tickCallback;
+	m_contactCallback = cont_callback;
+	m_bworld = bworld;
+}
+
+rbContactPoint* TickDiscreteDynamicsWorld::make_contact_point(btManifoldPoint& point, const btCollisionObject* body0, const btCollisionObject* body1)
+{
+	rbContactPoint *cp = new rbContactPoint;
+	btRigidBody* bodyA = (btRigidBody*)(body0);
+	btRigidBody* bodyB = (btRigidBody*)(body1);
+	rbRigidBody* rbA = (rbRigidBody*)(bodyA->getUserPointer());
+	rbRigidBody* rbB = (rbRigidBody*)(bodyB->getUserPointer());
+	if (rbA)
+		cp->contact_body_indexA = rbA->linear_index;
+
+	if (rbB)
+		cp->contact_body_indexB = rbB->linear_index;
+
+	cp->contact_force = point.getAppliedImpulse();
+	copy_v3_btvec3(cp->contact_pos_world_onA, point.getPositionWorldOnA());
+	copy_v3_btvec3(cp->contact_pos_world_onB, point.getPositionWorldOnB());
+
+	return cp;
+}
 
 struct rbDynamicsWorld {
 	btDiscreteDynamicsWorld *dynamicsWorld;
@@ -83,14 +172,7 @@ struct rbDynamicsWorld {
 	btConstraintSolver *constraintSolver;
 	btOverlapFilterCallback *filterCallback;
 	void *blenderWorld;
-	struct rbContactCallback *contactCallback;
-};
-struct rbRigidBody {
-	btRigidBody *body;
-	int col_groups;
-	void *meshIsland;
-	void *blenderOb;
-	rbDynamicsWorld *world;
+	//struct rbContactCallback *contactCallback;
 };
 
 struct rbVert {
@@ -222,12 +304,6 @@ struct rbFilterCallback : public btOverlapFilterCallback
 	}
 };
 
-static inline void copy_v3_btvec3(float vec[3], const btVector3 &btvec)
-{
-	vec[0] = (float)btvec[0];
-	vec[1] = (float)btvec[1];
-	vec[2] = (float)btvec[2];
-}
 static inline void copy_quat_btquat(float quat[4], const btQuaternion &btquat)
 {
 	quat[0] = btquat.getW();
@@ -236,6 +312,7 @@ static inline void copy_quat_btquat(float quat[4], const btQuaternion &btquat)
 	quat[3] = btquat.getZ();
 }
 
+#if 0
 /*Contact Handling*/
 typedef void (*cont_callback)(rbContactPoint *cp, void* bworld);
 
@@ -247,11 +324,11 @@ struct rbContactCallback
 	static bool handle_contacts(btManifoldPoint& point, btCollisionObject* body0, btCollisionObject* body1);
 };
 
-rbContactCallback::rbContactCallback(cont_callback callback, void *bworld){
+/*rbContactCallback::rbContactCallback(cont_callback callback, void *bworld){
 	rbContactCallback::callback = callback;
 	rbContactCallback::bworld = bworld;
 	gContactProcessedCallback = (ContactProcessedCallback)&rbContactCallback::handle_contacts;
-}
+}*/
 
 cont_callback rbContactCallback::callback = 0;
 void* rbContactCallback::bworld = NULL;
@@ -267,10 +344,10 @@ bool rbContactCallback::handle_contacts(btManifoldPoint& point, btCollisionObjec
 		rbRigidBody* rbA = (rbRigidBody*)(bodyA->getUserPointer());
 		rbRigidBody* rbB = (rbRigidBody*)(bodyB->getUserPointer());
 		if (rbA)
-			cp->contact_bodyA = rbA->meshIsland;
+			cp->contact_body_indexA = rbA->linear_index;
 
 		if (rbB)
-			cp->contact_bodyB = rbB->meshIsland;
+			cp->contact_body_indexB = rbB->linear_index;
 
 		cp->contact_force = point.getAppliedImpulse();
 		copy_v3_btvec3(cp->contact_pos_world_onA, point.getPositionWorldOnA());
@@ -282,6 +359,7 @@ bool rbContactCallback::handle_contacts(btManifoldPoint& point, btCollisionObjec
 	}
 	return ret;
 }
+#endif
 
 /* ********************************** */
 /* Dynamics World Methods */
@@ -290,7 +368,7 @@ bool rbContactCallback::handle_contacts(btManifoldPoint& point, btCollisionObjec
 
 //yuck, but need a handle for the world somewhere for collision callback...
 rbDynamicsWorld *RB_dworld_new(const float gravity[3], void* blenderWorld, int (*callback)(void *, void *, void *, void *, void *),
-							   void (*contactCallback)(rbContactPoint * cp, void *bworld))
+							   void (*contactCallback)(rbContactPoint* cp, void *bworld))
 {
 	rbDynamicsWorld *world = new rbDynamicsWorld;
 	
@@ -308,20 +386,24 @@ rbDynamicsWorld *RB_dworld_new(const float gravity[3], void* blenderWorld, int (
 	/* constraint solving */
 	world->constraintSolver = new btSequentialImpulseConstraintSolver();
 
+	TickDiscreteDynamicsWorld *tworld = new TickDiscreteDynamicsWorld(world->dispatcher,
+	                                                                  world->pairCache,
+	                                                      world->constraintSolver,
+	                                                      world->collisionConfiguration,
+	                                                      contactCallback, blenderWorld);
+
 	/* world */
-	world->dynamicsWorld = new btDiscreteDynamicsWorld(world->dispatcher,
-	                                                   world->pairCache,
-	                                                   world->constraintSolver,
-	                                                   world->collisionConfiguration);
+	world->dynamicsWorld = (btDiscreteDynamicsWorld*)tworld;
 	world->blenderWorld = blenderWorld;
 
 	RB_dworld_set_gravity(world, gravity);
 
 	/*contact callback */
+/*
 	if (contactCallback)
 	{
 		world->contactCallback = new rbContactCallback(contactCallback, world->blenderWorld);
-	}
+	} */
 	
 	return world;
 }
@@ -406,13 +488,14 @@ void RB_dworld_export(rbDynamicsWorld *world, const char *filename)
 
 /* Setup ---------------------------- */
 
-void RB_dworld_add_body(rbDynamicsWorld *world, rbRigidBody *object, int col_groups, void* meshIsland, void* blenderOb)
+void RB_dworld_add_body(rbDynamicsWorld *world, rbRigidBody *object, int col_groups, void* meshIsland, void* blenderOb, int linear_index)
 {
 	btRigidBody *body = object->body;
 	object->col_groups = col_groups;
 	object->meshIsland = meshIsland;
 	object->world = world;
 	object->blenderOb = blenderOb;
+	object->linear_index = linear_index;
 	
 	world->dynamicsWorld->addRigidBody(body);
 }
diff --git a/release/scripts/startup/bl_ui/properties_physics_fracture.py b/release/scripts/startup/bl_ui/properties_physics_fracture.py
index f8e44b8..3ac3760 100644
--- a/release/scripts/startup/bl_ui/properties_physics_fracture.py
+++ b/release/scripts/startup/bl_ui/properties_physics_fracture.py
@@ -70,6 +70,11 @@ class PHYSICS_PT_

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list