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. @@

_______________________________________________
Bf-blender-cvs mailing list
Bf-blender-cvs@blender.org
https://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to