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