[Bf-blender-cvs] [12806f5] fracture_modifier: disabled damage propagation (and settings) in code and ui, was slow and not really necessary, also fixed a crash which happened when freed bullet manifolds were used again.
Martin Felke
noreply at git.blender.org
Wed Oct 28 16:45:49 CET 2015
Commit: 12806f5ef8da54541c6897330b3cc59650c2edc2
Author: Martin Felke
Date: Wed Oct 28 16:43:40 2015 +0100
Branches: fracture_modifier
https://developer.blender.org/rB12806f5ef8da54541c6897330b3cc59650c2edc2
disabled damage propagation (and settings) in code and ui, was slow and not really necessary, also fixed a crash which happened when freed bullet manifolds were used again.
===================================================================
M extern/bullet2/src/BulletDynamics/Dynamics/btFractureBody.cpp
M extern/bullet2/src/BulletDynamics/Dynamics/btFractureBody.h
M extern/bullet2/src/BulletDynamics/Dynamics/btFractureDynamicsWorld.cpp
M extern/bullet2/src/BulletDynamics/Dynamics/btFractureDynamicsWorld.h
M release/scripts/startup/bl_ui/properties_physics_fracture.py
===================================================================
diff --git a/extern/bullet2/src/BulletDynamics/Dynamics/btFractureBody.cpp b/extern/bullet2/src/BulletDynamics/Dynamics/btFractureBody.cpp
index db89898..7eaf035 100644
--- a/extern/bullet2/src/BulletDynamics/Dynamics/btFractureBody.cpp
+++ b/extern/bullet2/src/BulletDynamics/Dynamics/btFractureBody.cpp
@@ -113,7 +113,7 @@ void btFractureBody::recomputeConnectivityByConstraints(btCollisionWorld *world1
size = m_connections.size();
for (i=0; i < size; i++)
{
- btConnection con = m_connections[i];
+ btConnection& con = m_connections[i];
btAlignedObjectArray<int> *adjacents = m_connection_map->find(con.m_childIndex0);
if (!adjacents) {
btAlignedObjectArray<int> adj;
diff --git a/extern/bullet2/src/BulletDynamics/Dynamics/btFractureBody.h b/extern/bullet2/src/BulletDynamics/Dynamics/btFractureBody.h
index ec9f364..cd5dbc2 100644
--- a/extern/bullet2/src/BulletDynamics/Dynamics/btFractureBody.h
+++ b/extern/bullet2/src/BulletDynamics/Dynamics/btFractureBody.h
@@ -18,7 +18,15 @@ class btManifoldPoint;
struct btConnection
{
-
+ bool operator==(const btConnection& con)
+ {
+ return this->m_childIndex0 == con.m_childIndex0 &&
+ this->m_childIndex1 == con.m_childIndex1 &&
+ this->m_childShape0 == con.m_childShape0 &&
+ this->m_childShape1 == con.m_childShape1 &&
+ this->m_strength == con.m_strength;
+ }
+
btCollisionShape* m_childShape0;
btCollisionShape* m_childShape1;
int m_childIndex0;
diff --git a/extern/bullet2/src/BulletDynamics/Dynamics/btFractureDynamicsWorld.cpp b/extern/bullet2/src/BulletDynamics/Dynamics/btFractureDynamicsWorld.cpp
index ed914d9..775cedb 100644
--- a/extern/bullet2/src/BulletDynamics/Dynamics/btFractureDynamicsWorld.cpp
+++ b/extern/bullet2/src/BulletDynamics/Dynamics/btFractureDynamicsWorld.cpp
@@ -190,19 +190,21 @@ void btFractureDynamicsWorld::glueCallback()
for (int i=0;i<numManifolds;i++)
{
btPersistentManifold* manifold = getDispatcher()->getManifoldByIndexInternal(i);
- /*if (!manifold->getNumContacts())
+#if 0
+ if (!manifold->getNumContacts())
{
- printf("Manifold %d has NO CONTACT POINT!!\n", i);
- continue;
- }*/
+ //printf("Manifold %d has NO CONTACT POINT!!\n", i);
+ // continue;
+ }
- /*btScalar minDist = 1e30f;
+ btScalar minDist = 1e30f;
for (int v=0;v<manifold->getNumContacts();v++)
{
minDist = btMin(minDist,manifold->getContactPoint(v).getDistance());
}
- if (minDist>0.5)
- continue;*/
+ if (minDist>0.f)
+ continue;
+#endif
btCollisionObject* colObj0 = (btCollisionObject*)manifold->getBody0();
btCollisionObject* colObj1 = (btCollisionObject*)manifold->getBody1();
@@ -223,9 +225,8 @@ void btFractureDynamicsWorld::glueCallback()
}
}
}
-
#if 0
- else //fallback if no manifolds are there (kinematic)
+ //else //fallback if no manifolds are there (kinematic)
{
int numConstraints = m_compoundConstraints.size();
for (int i=0;i<numConstraints;i++)
@@ -570,7 +571,7 @@ void btFractureDynamicsWorld::glueCallback()
struct btFracturePair
{
btFractureBody* m_fracObj;
- btAlignedObjectArray<btPersistentManifold*> m_contactManifolds;
+ btAlignedObjectArray<int> m_contactManifolds;
};
@@ -720,9 +721,14 @@ void btFractureDynamicsWorld::removeRigidBody(btRigidBody* body)
/*btDiscreteDynamicsWorld::*/removeConstraint(tmpConstraints[i]);
//m_fractureBodies.remove(fbody);
- }
- btDiscreteDynamicsWorld::removeRigidBody(body);
+ //m_nonStaticRigidBodies.remove(body);
+ //removeCollisionObject(body);
+ }
+ /*else
+ {*/
+ btDiscreteDynamicsWorld::removeRigidBody(body);
+ //}
}
void btFractureDynamicsWorld::breakDisconnectedParts( btFractureBody* fracObj)
@@ -757,7 +763,7 @@ void btFractureDynamicsWorld::breakDisconnectedParts( btFractureBody* fracObj)
int numElem = unionFind.getNumElements();
for (i=0;i<fracObj->m_connections.size();i++)
{
- btConnection& connection = fracObj->m_connections[i];
+ btConnection connection = fracObj->m_connections[i];
if (connection.m_childIndex0 >= tags.size() ||
connection.m_childIndex1 >= tags.size() )
{
@@ -859,16 +865,21 @@ void btFractureDynamicsWorld::breakDisconnectedParts( btFractureBody* fracObj)
#include <stdio.h>
void btFractureDynamicsWorld::propagateDamage(btFractureBody *body, btScalar *impulse, int connection_index,
- bool* needsBreakingCheck, const btVector3& direction)
+ bool* needsBreakingCheck, const btVector3& direction, int* depth)
{
+ if (*depth == 0)
+ return;
+
+ (*depth)--;
+
//min break impulse, todo expose
- if (body->m_propagationParameter.m_minimum_impulse > 0 &&
- (*impulse > body->m_propagationParameter.m_minimum_impulse) &&
+ if (/*body->m_propagationParameter.m_minimum_impulse > 0 &&
+ (*impulse > body->m_propagationParameter.m_minimum_impulse) &&*/
(body->m_connections.size() > connection_index))
{
- btConnection* connection = &body->m_connections[connection_index];
- btCollisionShape* shape0 = connection->m_childShape0;
- btCollisionShape* shape1 = connection->m_childShape1;
+ btConnection& connection = body->m_connections[connection_index];
+ btCollisionShape* shape0 = connection.m_childShape0;
+ btCollisionShape* shape1 = connection.m_childShape1;
btRigidBody *fbody0 = m_shapeBodyCallback(shape0->getUserPointer());
btRigidBody *fbody1 = m_shapeBodyCallback(shape1->getUserPointer());
@@ -881,15 +892,17 @@ void btFractureDynamicsWorld::propagateDamage(btFractureBody *body, btScalar *im
{
//printf("FACTOR: %f\n", dir.dot(direction));
- connection->m_strength -= *impulse;
- //printf("strengthp=%f %f\n",connection.m_strength, *impulse);
+ connection.m_strength -= *impulse;
+ //printf("strengthp=%f %f\n",connection->m_strength, *impulse);
- if (connection->m_strength<0)
+ if (connection.m_strength<0)
{
+ //printf("brokenp=%d %d\n",connection->m_childIndex0, connection->m_childIndex1);
//remove or set to zero
//printf("Breaking: %d %d\n",connection.m_childIndex0, connection.m_childIndex1);
- connection->m_strength=0.f;
+ connection.m_strength=0.f;
*needsBreakingCheck = true;
+ body->m_connections.remove(connection);
}
}
@@ -906,7 +919,7 @@ void btFractureDynamicsWorld::propagateDamage(btFractureBody *body, btScalar *im
for (i=0;i<size;i++)
{
if(body->m_connections[adjacents->at(i)].m_strength > 0.f)
- propagateDamage(body, impulse, adjacents->at(i), needsBreakingCheck, direction);
+ propagateDamage(body, impulse, adjacents->at(i), needsBreakingCheck, direction, depth);
}
}
}
@@ -999,12 +1012,12 @@ void btFractureDynamicsWorld::fractureCallback( )
{
btFracturePair p;
p.m_fracObj = m_fractureBodies[j];
- p.m_contactManifolds.push_back(manifold);
+ p.m_contactManifolds.push_back(manifold->m_index1a);
sFracturePairs.push_back(p);
} else
{
- btAssert(sFracturePairs[pi].m_contactManifolds.findLinearSearch(manifold)==sFracturePairs[pi].m_contactManifolds.size());
- sFracturePairs[pi].m_contactManifolds.push_back(manifold);
+ //btAssert(sFracturePairs[pi].m_contactManifolds.findLinearSearch(manifold)==sFracturePairs[pi].m_contactManifolds.size());
+ sFracturePairs[pi].m_contactManifolds.push_back(manifold->m_index1a);
}
}
@@ -1032,12 +1045,12 @@ void btFractureDynamicsWorld::fractureCallback( )
{
btFracturePair p;
p.m_fracObj = m_fractureBodies[j];
- p.m_contactManifolds.push_back( manifold);
+ p.m_contactManifolds.push_back( manifold->m_index1a);
sFracturePairs.push_back(p);
} else
{
- btAssert(sFracturePairs[pi].m_contactManifolds.findLinearSearch(manifold)==sFracturePairs[pi].m_contactManifolds.size());
- sFracturePairs[pi].m_contactManifolds.push_back(manifold);
+ //btAssert(sFracturePairs[pi].m_contactManifolds.findLinearSearch(manifold)==sFracturePairs[pi].m_contactManifolds.size());
+ sFracturePairs[pi].m_contactManifolds.push_back(manifold->m_index1a);
}
}
}
@@ -1079,87 +1092,76 @@ void btFractureDynamicsWorld::fractureCallback( )
for (int j=0;j<sFracturePairs[i].m_contactManifolds.size();j++)
{
- btPersistentManifold* manifold = sFracturePairs[i].m_contactManifolds[j];
- for (int k=0;k<manifold->getNumContacts();k++)
+ if (getDispatcher()->getNumManifolds() > sFracturePairs[i].m_contactManifolds[j])
{
- btManifoldPoint& pt = manifold->getContactPoint(k);
- totalObjImpact += pt.m_appliedImpulse;
+ btPersistentManifold* manifold = getDispatcher()->getManifoldByIndexInternal(sFracturePairs[i].m_contactManifolds[j]);
+ if (!manifold)
+ continue;
+
+ for (int k=0;k<manifold->getNumContacts();k++)
+ {
+ btManifoldPoint& pt = manifold->getContactPoint(k);
+ totalObjImpact += pt.m_appliedImpulse;
+ }
}
}
- if (totalObjImpact < sFracturePairs[i].m_fracObj->m_propagationParameter.m_minimum_impulse)
+ if ((totalObjImpact < sFracturePairs[i].m_fracObj->m_propagationParameter.m_minimum_impulse) ||
+ (sFracturePairs[i].m_fracObj->m_propagationParameter.m_minimum_impulse == 0.0f))
continue;
for (int j=0;j<sFracturePairs[i].m_contactManifolds.size();j++)
{
- btPersistentManifold* manifold = sFracturePairs[i].m_contactManifolds[j];
- for (int k=0;k<manifold->getNumContacts();k++)
+ if (getDispatcher()->getNumManifolds() > sFracturePairs[i].m_contactManifolds[j])
{
- btManifoldPoint& pt = manifold->getContactPoint(k);
- if (manifold->getBody0()==sFracturePairs[i].m_fracObj)
+ btPersistentManifold* manifold = getDispatcher()->getManifoldByIndexInternal(sFracturePairs[i].m_contactManifolds[j]);
+ if (!manifold)
+ continue;
+
+ for (int k=0;k<manifold->getNumContacts();k++)
{
- for (int f=0;f<sFracturePairs[i].m_fracObj->m_connections.size();f++)
+ btManifoldPoint& pt = manifold->getContactPoint(k);
+ if (manifold->getBody0()==sFracturePairs[i].m_fracObj)
{
- //direct damage
- btConnectio
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list