Commit: a7b45823be011dace76ed43e480f827e0ca36e3d
Author: Martin Felke
Date: Wed Oct 21 17:32:01 2015 +0200
Branches: fracture_modifier
https://developer.blender.org/rBa7b45823be011dace76ed43e480f827e0ca36e3d
added very basic damage propagation scheme to compoundbased fracture (direct
damage is too small, can be increased this way, but you mostly get single parts
falling off only)
===================================================================
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
===================================================================
diff --git a/extern/bullet2/src/BulletDynamics/Dynamics/btFractureBody.cpp
b/extern/bullet2/src/BulletDynamics/Dynamics/btFractureBody.cpp
index 7457ed6..eebd79e 100644
--- a/extern/bullet2/src/BulletDynamics/Dynamics/btFractureBody.cpp
+++ b/extern/bullet2/src/BulletDynamics/Dynamics/btFractureBody.cpp
@@ -68,10 +68,10 @@ void
btFractureBody::recomputeConnectivityByConstraints(btCollisionWorld *world1
if (world->m_idCallback != NULL)
{
- int i;
+ int i, size = world->m_compoundConstraints.size();
m_connections.clear();
- for (i=0; i<world->m_compoundConstraints.size();i++)
+ for (i=0; i<size;i++)
{
btCompoundConstraint *con =
world->m_compoundConstraints[i];
@@ -106,6 +106,26 @@ void
btFractureBody::recomputeConnectivityByConstraints(btCollisionWorld *world1
}
}
}
+
+ //build a connection map
+ m_connection_map->clear();
+
+ size = m_connections.size();
+ for (i=0; i < size; i++)
+ {
+ btConnection con = m_connections[i];
+ btAlignedObjectArray<int> *adjacents =
m_connection_map->find(con.m_childIndex0);
+ if (!adjacents) {
+ btAlignedObjectArray<int> adj;
+ adj.push_back(con.m_childIndex1);
+ m_connection_map->insert(con.m_childIndex0,
adj);
+ }
+ else
+ {
+ if (adjacents->size() !=
adjacents->findLinearSearch(con.m_childIndex1))
+ adjacents->push_back(con.m_childIndex1);
+ }
+ }
}
}
diff --git a/extern/bullet2/src/BulletDynamics/Dynamics/btFractureBody.h
b/extern/bullet2/src/BulletDynamics/Dynamics/btFractureBody.h
index 3b088c6..a46d975 100644
--- a/extern/bullet2/src/BulletDynamics/Dynamics/btFractureBody.h
+++ b/extern/bullet2/src/BulletDynamics/Dynamics/btFractureBody.h
@@ -9,6 +9,7 @@ class btCompoundShape;
class btManifoldPoint;
#include "LinearMath/btAlignedObjectArray.h"
+#include "LinearMath/btHashMap.h"
#include "BulletDynamics/Dynamics/btRigidBody.h"
#define CUSTOM_FRACTURE_TYPE (btRigidBody::CO_USER_TYPE+1)
@@ -31,13 +32,15 @@ public:
btDynamicsWorld* m_world;
btAlignedObjectArray<btScalar> m_masses;
- btAlignedObjectArray<btConnection> m_connections;
+ btAlignedObjectArray<btConnection> m_connections;
+ btHashMap<btHashInt, btAlignedObjectArray<int> > *m_connection_map;
btFractureBody( const btRigidBodyConstructionInfo& constructionInfo)
:btRigidBody(constructionInfo),
- m_world(0)
+ m_world(0),
+ m_connection_map(NULL)
{
m_masses.push_back(constructionInfo.m_mass);
m_internalType=CUSTOM_FRACTURE_TYPE+CO_RIGID_BODY;
@@ -56,6 +59,7 @@ public:
m_masses.push_back(masses[i]);
m_internalType=CUSTOM_FRACTURE_TYPE+CO_RIGID_BODY;
+ m_connection_map = new btHashMap<btHashInt,
btAlignedObjectArray<int> >();
}
void setWorld(btDynamicsWorld *world)
@@ -74,6 +78,10 @@ public:
static bool collisionCallback(btManifoldPoint& cp, const
btCollisionObject* colObj0,int partId0,int index0,const btCollisionObject*
colObj1,int partId1,int index1);
+ ~btFractureBody()
+ {
+ delete m_connection_map;
+ }
};
diff --git
a/extern/bullet2/src/BulletDynamics/Dynamics/btFractureDynamicsWorld.cpp
b/extern/bullet2/src/BulletDynamics/Dynamics/btFractureDynamicsWorld.cpp
index 848d011..37656ef 100644
--- a/extern/bullet2/src/BulletDynamics/Dynamics/btFractureDynamicsWorld.cpp
+++ b/extern/bullet2/src/BulletDynamics/Dynamics/btFractureDynamicsWorld.cpp
@@ -515,12 +515,12 @@ void
btFractureDynamicsWorld::breakDisconnectedParts( btFractureBody* fracObj)
for (i=0;i<fracObj->m_connections.size();i++)
{
btConnection& connection = fracObj->m_connections[i];
- /*if (connection.m_childIndex0 >= tags.size() ||
+ if (connection.m_childIndex0 >= tags.size() ||
connection.m_childIndex1 >= tags.size() )
{
//fracObj->m_connections.remove(connection);
continue;
- }*/
+ }
if (connection.m_strength > 0.)
{
@@ -612,10 +612,36 @@ void
btFractureDynamicsWorld::breakDisconnectedParts( btFractureBody* fracObj)
#include <stdio.h>
-/*void btFractureDynamicsWorld::propagateWeaken(btFractureBody *body,
btManifoldPoint *pt)
+void btFractureDynamicsWorld::propagateDamage(btFractureBody *body, btScalar
*impulse, int connection_index, bool* needsBreakingCheck)
{
+ //min break impulse, todo expose
+ if (*impulse > 0.5f)
+ {
+ btConnection& connection =
body->m_connections[connection_index];
+ connection.m_strength -= *impulse;
+ //printf("strengthp=%f %f\n",connection.m_strength, *impulse);
+
+ if (connection.m_strength<0)
+ {
+ //remove or set to zero
+ connection.m_strength=0.f;
+ *needsBreakingCheck = true;
+ }
-}*/
+ //impulse dampening, todo expose
+ *impulse *= 0.85f;
+
+ btAlignedObjectArray<int> *adjacents =
body->m_connection_map->find(connection_index);
+ if (adjacents)
+ {
+ int i, size = adjacents->size();
+ for (i=0;i<size;i++)
+ {
+ propagateDamage(body, impulse,
adjacents->at(i), needsBreakingCheck);
+ }
+ }
+ }
+}
void btFractureDynamicsWorld::fractureCallback( )
{
@@ -653,7 +679,7 @@ void btFractureDynamicsWorld::fractureCallback( )
maxImpact = totalImpact;
//some threshold otherwise resting contact would break objects
after a while
- if (totalImpact < 0.1f) //40.f
+ if (totalImpact < 1.f) //40.f
continue;
// printf("strong impact\n");
@@ -789,14 +815,13 @@ void btFractureDynamicsWorld::fractureCallback( )
{
for (int
f=0;f<sFracturePairs[i].m_fracObj->m_connections.size();f++)
{
+
//direct damage
btConnection& connection = sFracturePairs[i].m_fracObj->m_connections[f];
if
((connection.m_childIndex0 == pt.m_index0) ||
(connection.m_childIndex1 == pt.m_index0))
-
//(connection.m_childIndex0 == pt.m_index1) ||
-
//(connection.m_childIndex1 == pt.m_index1))
{
connection.m_strength -= pt.m_appliedImpulse;
-
printf("strength0=%f\n",connection.m_strength);
+
//printf("strength0=%f\n",connection.m_strength);
if (connection.m_strength<0)
{
@@ -805,19 +830,26 @@ void btFractureDynamicsWorld::fractureCallback( )
needsBreakingCheck = true;
}
}
+
+
//propagated damage
+ if
(pt.m_appliedImpulse > 0.f) {
+
btScalar impulse = pt.m_appliedImpulse;
+
propagateDamage(sFracturePairs[i].m_fracObj,&impulse, connection.m_childIndex0,
&needsBreakingCheck);
+
+
impulse = pt.m_appliedImpulse;
+
propagateDamage(sFracturePairs[i].m_fracObj,&impulse, connection.m_childIndex1,
&needsBreakingCheck);
+ }
}
} else
{
- //propagate
+ //direct damage
for (int
f=0;f<sFracturePairs[i].m_fracObj->m_connections.size();f++)
{
btConnection& connection = sFracturePairs[i].m_fracObj->m_connections[f];
if
((connection.m_childIndex0 == pt.m_index1) ||
(connection.m_childIndex1 == pt.m_index1))
- //
(connection.m_childIndex0 == pt.m_index0) ||
- //
(connection.m_childIndex1 == pt.m_index0))
{
-
printf("strength1=%f\n",connection.m_strength);
+
//printf("strength1=%f\n",connection.m_strength);
connection.m_strength -= pt.m_appliedImpulse;
if (connection.m_strength<0)
{
@@ -826,6 +858,15 @@ void btFractureDynamicsWorld::fractureCallback( )
needsBreakingCheck = true;
}
}
+
+
//propagated damage
+ if
(pt.m_appliedImpulse > 0.f) {
+
btScalar impulse = pt.m_appliedImpulse;
+
propagateDamage(sFracturePairs[i].m_fracObj, &impulse,
connection.m_childIndex0, &needsBreakingCheck);
+
+
impulse = pt.m_appliedImpulse;
+
propagateDamage(sFracturePairs[i].m_fracObj, &impulse,
connection.m_childIndex1, &needsBreakingCheck);
+ }
}
}
}
diff --git
a/extern/bullet2/src/BulletDynamics/Dynamics/btFractureDynamicsWorld.h
b/extern/bullet2/src/BulletDynamics/Dynamics/btFractureDynamicsWorld.h
index c78ae84..88f01d5 100644
--- a/extern/bullet2/src/BulletDynamics/Dynamics/btFractureDynamicsWorld.h
+++ b/extern/bullet2/src/BulletDynamics/Dynamics/btFractureDynamicsWorld.h
@@ -35,7 +35,9 @@ public:
btAlignedObjectArray<btFractureBody*> m_fractureBodies;
IdCallback m_idCallback;
+
ShapeBodyCallback m_shapeBodyCallback;
+
btHashMap<btHashInt, int> *m_childIndexHash;
virtual void addRigidBody(btRigidBody* body);
@@ -63,6 +65,8 @@ public:
void fractureCallback();
void updateBodies();
+
+ void propagateDamage(btFractureBody *body, btScalar *impulse, int
connection_index, bool *needsBreakingCheck);
};
#endif //_BT_FRACTURE_DYNAMICS_WORLD_H
_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs