[Bf-blender-cvs] [baabe028a4a] temp-fracture-modifier-2.8: brought compound back + some recent fixes from 2.7 branch

Martin Felke noreply at git.blender.org
Sun Nov 18 17:39:54 CET 2018


Commit: baabe028a4a7ce0040b6b94b934ad3f8db3594a0
Author: Martin Felke
Date:   Sun Nov 18 17:39:19 2018 +0100
Branches: temp-fracture-modifier-2.8
https://developer.blender.org/rBbaabe028a4a7ce0040b6b94b934ad3f8db3594a0

brought compound back + some recent fixes from 2.7 branch

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

M	extern/bullet2/src/BulletDynamics/Dynamics/btFractureDynamicsWorld.cpp
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_rigidbody.h
M	source/blender/blenkernel/intern/fracture.c
M	source/blender/blenkernel/intern/fracture_automerge.c
M	source/blender/blenkernel/intern/fracture_constraints.c
M	source/blender/blenkernel/intern/fracture_prefractured.c
M	source/blender/blenkernel/intern/fracture_rigidbody.c
M	source/blender/blenkernel/intern/rigidbody.c
M	source/blender/makesdna/DNA_fracture_types.h
M	source/blender/makesdna/DNA_rigidbody_types.h
M	source/blender/makesrna/intern/rna_fracture.c

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

diff --git a/extern/bullet2/src/BulletDynamics/Dynamics/btFractureDynamicsWorld.cpp b/extern/bullet2/src/BulletDynamics/Dynamics/btFractureDynamicsWorld.cpp
index f17b338e477..a551feb9f66 100644
--- a/extern/bullet2/src/BulletDynamics/Dynamics/btFractureDynamicsWorld.cpp
+++ b/extern/bullet2/src/BulletDynamics/Dynamics/btFractureDynamicsWorld.cpp
@@ -221,6 +221,7 @@ void btFractureDynamicsWorld::glueCallback()
 			m_idCallback(body0->getUserPointer(),&objectId0, &shardId0);
 			m_idCallback(body1->getUserPointer(),&objectId1, &shardId1);
 
+			printf("%d %d %d %d\n", objectId0, objectId1, tag0, tag1);
 			//if (!colObj0->isStaticOrKinematicObject() && !colObj1->isStaticOrKinematicObject())
 			if (objectId0 == objectId1 && objectId0 > -1 && tag0 > -1 && tag1 > -1)
 			{
diff --git a/intern/rigidbody/RBI_api.h b/intern/rigidbody/RBI_api.h
index cf3ebccdea6..7aba57c8ad8 100644
--- a/intern/rigidbody/RBI_api.h
+++ b/intern/rigidbody/RBI_api.h
@@ -91,9 +91,10 @@ void RB_dworld_init_compounds(rbDynamicsWorld *world);
 
 /* Create a new dynamics world instance */
 // TODO: add args to set the type of constraint solvers, etc.
-rbDynamicsWorld *RB_dworld_new(const float gravity[3], void* blenderWorld, void *blenderScene, int (*callback)(void*, void*, void*, void*, void*, bool),
-								void (*contactCallback)(rbContactPoint*, void *), void (*idCallbackOut)(void*, void*, int*, int*),
-								void (*tickCallback)(float, void *));
+rbDynamicsWorld *RB_dworld_new(const float gravity[3], void* blenderWorld, void *blenderScene,
+							   int (*callback)(void*, void*, void*, void*, void*, bool),
+							   void (*contactCallback)(rbContactPoint*, void *), void (*idCallbackOut)(void*, int*, int*),
+							  void (*tickCallback)(float, void *));
 
 /* Delete the given dynamics world, and free any extra data it may require */
 void RB_dworld_delete(rbDynamicsWorld *world);
diff --git a/intern/rigidbody/rb_bullet_api.cpp b/intern/rigidbody/rb_bullet_api.cpp
index 2c27b699969..83d0ab50888 100644
--- a/intern/rigidbody/rb_bullet_api.cpp
+++ b/intern/rigidbody/rb_bullet_api.cpp
@@ -152,7 +152,7 @@ struct rbRigidBody {
 	rbDynamicsWorld *world;
 };
 
-typedef void (*IdOutCallback)(void *world, void *meshisland, int *objectId, int *shardId);
+typedef void (*IdOutCallback)(void *meshisland, int *objectId, int *shardId);
 
 static btRigidBody* getBodyFromShape(void *shapePtr)
 {
@@ -293,6 +293,25 @@ static bool weakenCompound(const btCollisionObject *body, btScalar force, btVect
 	return false;
 }
 
+static void manifold_callback(TickDiscreteDynamicsWorld* tworld, btManifoldPoint& pt,
+                              const btCollisionObject *obA,  const btCollisionObject *obB)
+{
+	btFractureDynamicsWorld *fworld = (btFractureDynamicsWorld*)tworld;
+
+	if (pt.getDistance()<0.f)
+	{
+		if (tworld->m_contactCallback)
+		{
+			rbContactPoint* cp = tworld->make_contact_point(pt, obA, obB);
+			//broken = weakenCompound(obA, cp->contact_force, pt.getPositionWorldOnA(), fworld);
+			//broken = broken || weakenCompound(obB, cp->contact_force, pt.getPositionWorldOnB(), fworld);
+			tworld->m_contactCallback(cp, tworld->m_bscene);
+			delete cp;
+		}
+	}
+}
+
+
 static void tickCallback(btDynamicsWorld *world, btScalar timeStep)
 {
 	btFractureDynamicsWorld *fworld = (btFractureDynamicsWorld*)world;
@@ -311,6 +330,8 @@ static void tickCallback(btDynamicsWorld *world, btScalar timeStep)
 		int numContacts = contactManifold->getNumContacts();
 		for (int j=0;j<numContacts;j++)
 		{
+			manifold_callback(tworld, contactManifold->getContactPoint(j), obA, obB);
+#if 0
 			btManifoldPoint& pt = contactManifold->getContactPoint(j);
 			if (pt.getDistance()<0.f)
 			{
@@ -332,10 +353,11 @@ static void tickCallback(btDynamicsWorld *world, btScalar timeStep)
 				//if (broken)
 				//	break;
 			}
+#endif
 		}
 
-		if (broken)
-			break;
+		//if (broken)
+		//	break;
 	}
 
 	if (tworld->m_tickCallback)
@@ -345,11 +367,13 @@ static void tickCallback(btDynamicsWorld *world, btScalar timeStep)
 }
 
 TickDiscreteDynamicsWorld::TickDiscreteDynamicsWorld(btDispatcher* dispatcher, btBroadphaseInterface* pairCache,
-                                                     btConstraintSolver* constraintSolver, btCollisionConfiguration* collisionConfiguration,
-                                                     rbContactCallback cont_callback, void *bworld, void *bScene, IdCallback id_callback,
+                                                     btConstraintSolver* constraintSolver,
+                                                     btCollisionConfiguration* collisionConfiguration,
+                                                     rbContactCallback cont_callback, void *bworld, void *bScene,
+                                                     IdCallback id_callback,
                                                      rbTickCallback tick_callback) :
-
-                                                     btFractureDynamicsWorld(dispatcher, pairCache, constraintSolver, collisionConfiguration,
+                                                     btFractureDynamicsWorld(dispatcher, pairCache,
+                                                                             constraintSolver, collisionConfiguration,
                                                                              id_callback, getBodyFromShape)
 {
 	m_internalTickCallback = tickCallback;
@@ -754,6 +778,10 @@ struct rbFilterCallback : public btOverlapFilterCallback
 
 	virtual bool needBroadphaseCollision(btBroadphaseProxy *proxy0, btBroadphaseProxy *proxy1) const
 	{
+		if (!proxy0 || !proxy1) {
+			return false;
+		}
+
 		rbRigidBody *rb0 = (rbRigidBody *)((btFractureBody *)proxy0->m_clientObject)->getUserPointer();
 		rbRigidBody *rb1 = (rbRigidBody *)((btFractureBody *)proxy1->m_clientObject)->getUserPointer();
 		
@@ -765,6 +793,10 @@ struct rbFilterCallback : public btOverlapFilterCallback
 		           (proxy0->m_collisionFilterMask | btBroadphaseProxy::StaticFilter |
 		            btBroadphaseProxy::KinematicFilter));
 
+		if (!rb0 || !rb1) {
+			return collides;
+		}
+
 		//no self collisions between kinematic shards in own object allowed
 		collides = collides && ((!rb0->body->isStaticOrKinematicObject() || !rb1->body->isStaticOrKinematicObject()) ||
 		           ((rb0->body->isStaticOrKinematicObject() && rb1->body->isStaticOrKinematicObject()) &&
@@ -851,7 +883,7 @@ static void idCallback(void *userPtr, int* objectId, int* shardId)
 	{
 		rbDynamicsWorld *world = body->world;
 		if (world->idOutCallback)
-			world->idOutCallback(world->blenderWorld, body->meshIsland, objectId, shardId);
+			world->idOutCallback(body->meshIsland, objectId, shardId);
 	}
 }
 
@@ -976,6 +1008,12 @@ static void nearCallback(btBroadphasePair &collisionPair, btCollisionDispatcher
 
 				//handle_activation(manifold, rb0, rb1);
 				//handle_activation(manifold, rb1, rb0);
+
+				for (int i = 0; i < manifold->getNumContacts(); i++)
+				{
+					manifold_callback(rb0->world->dynamicsWorld, manifold->getContactPoint(i), colObj0, colObj1);
+				}
+
 				((rbFilterCallback*)(rb0->world->filterCallback))->callback(
 							   rb0->world->blenderScene, rb0->meshIsland, rb1->meshIsland,
 							   rb0->blenderOb, rb1->blenderOb, true);
@@ -985,8 +1023,10 @@ static void nearCallback(btBroadphasePair &collisionPair, btCollisionDispatcher
 }
 
 //yuck, but need a handle for the world somewhere for collision callback...
-rbDynamicsWorld *RB_dworld_new(const float gravity[3], void* blenderWorld, void* blenderScene, int (*callback)(void *, void *, void *, void *, void *, bool),
-							   void (*contactCallback)(rbContactPoint* cp, void *bworld), void (*idCallbackOut)(void*, void*, int*, int*),
+rbDynamicsWorld *RB_dworld_new(const float gravity[3], void* blenderWorld, void* blenderScene,
+							   int (*callback)(void *, void *, void *, void *, void *, bool),
+							   void (*contactCallback)(rbContactPoint* cp, void *bworld),
+							   void (*idCallbackOut)(void*, int*, int*),
 							   void (*tickCallback)(float timestep, void *bworld))
 {
 	rbDynamicsWorld *world = new rbDynamicsWorld;
diff --git a/release/scripts/startup/bl_ui/properties_physics_fracture.py b/release/scripts/startup/bl_ui/properties_physics_fracture.py
index b3be04f9c5d..ce5e33928f0 100644
--- a/release/scripts/startup/bl_ui/properties_physics_fracture.py
+++ b/release/scripts/startup/bl_ui/properties_physics_fracture.py
@@ -222,10 +222,10 @@ class PHYSICS_PT_fracture_simulation(PhysicButtonsPanel, Panel):
         row.prop(md, "use_self_collision")
 
         col = layout.column(align=True)
-        col.prop(md, "constraint_target")
         col.prop(md, "constraint_type")
+        col.prop(md, "constraint_target")
         col = layout.column(align=True)
-        col.prop(md, "constraint_limit", text="Constraint limit, per MeshIsland")
+        col.prop(md, "constraint_limit")
         col.prop(md, "contact_dist")
 
         layout.label(text="Constraint Cluster Settings")
@@ -234,64 +234,76 @@ class PHYSICS_PT_fracture_simulation(PhysicButtonsPanel, Panel):
         col.prop(md, "cluster_group")
         col.prop(md, "cluster_constraint_type", text="Cluster Type")
 
-        if md.use_compounds:
-            layout.label(text="Compound Breaking Settings")
-        else:
-            layout.label(text="Constraint Breaking Settings")
+        layout.label(text="Constraint Breaking Settings")
 
         col = layout.column(align=True)
         col.prop(md, "breaking_threshold", text="Threshold")
         col.prop(md, "cluster_breaking_threshold")
 
-        if md.use_compounds:
-            #layout.label("Compound Damage Propagation Settings")
-            col = layout.column(align=True)
-            col.prop(md, "minimum_impulse")
-            #col.prop(md, "impulse_dampening")
-            #col.prop(md, "directional_factor")
-            col.prop(md, "mass_threshold_factor")
-        else:
-            layout.label(text="Constraint Special Breaking Settings")
-            col = layout.column(align=True)
-            row = col.row(align=True)
-            row.prop(md, "breaking_percentage", text="Percentage")
-            row.prop(md, "cluster_breaking_percentage",

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list