[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