[Bf-blender-cvs] [d72a489] fracture_modifier: exposed a couple of compound damage propagation parameters, need to test still to find good values
Martin Felke
noreply at git.blender.org
Fri Oct 23 12:03:00 CEST 2015
Commit: d72a489ddb36bd256f9ed720d41b62e7466a5d3e
Author: Martin Felke
Date: Fri Oct 23 12:02:41 2015 +0200
Branches: fracture_modifier
https://developer.blender.org/rBd72a489ddb36bd256f9ed720d41b62e7466a5d3e
exposed a couple of compound damage propagation parameters, need to test still to find good values
===================================================================
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 intern/rigidbody/RBI_api.h
M intern/rigidbody/rb_bullet_api.cpp
M release/scripts/startup/bl_operators/presets.py
M release/scripts/startup/bl_ui/properties_physics_fracture.py
M source/blender/blenkernel/intern/rigidbody.c
M source/blender/makesdna/DNA_modifier_types.h
M source/blender/makesrna/intern/rna_modifier.c
M source/blender/modifiers/intern/MOD_fracture.c
===================================================================
diff --git a/extern/bullet2/src/BulletDynamics/Dynamics/btFractureBody.h b/extern/bullet2/src/BulletDynamics/Dynamics/btFractureBody.h
index a46d975..ec9f364 100644
--- a/extern/bullet2/src/BulletDynamics/Dynamics/btFractureBody.h
+++ b/extern/bullet2/src/BulletDynamics/Dynamics/btFractureBody.h
@@ -15,6 +15,7 @@ class btManifoldPoint;
#define CUSTOM_FRACTURE_TYPE (btRigidBody::CO_USER_TYPE+1)
+
struct btConnection
{
@@ -25,6 +26,13 @@ struct btConnection
btScalar m_strength;
};
+struct btPropagationParameter
+{
+ btScalar m_impulse_dampening;
+ btScalar m_directional_factor;
+ btScalar m_minimum_impulse;
+};
+
class btFractureBody : public btRigidBody
{
//connections
@@ -34,13 +42,13 @@ public:
btAlignedObjectArray<btScalar> m_masses;
btAlignedObjectArray<btConnection> m_connections;
btHashMap<btHashInt, btAlignedObjectArray<int> > *m_connection_map;
+ btPropagationParameter m_propagationParameter;
-
-
- btFractureBody( const btRigidBodyConstructionInfo& constructionInfo)
+ btFractureBody( const btRigidBodyConstructionInfo& constructionInfo, btPropagationParameter parameter)
:btRigidBody(constructionInfo),
m_world(0),
- m_connection_map(NULL)
+ m_connection_map(NULL),
+ m_propagationParameter(parameter)
{
m_masses.push_back(constructionInfo.m_mass);
m_internalType=CUSTOM_FRACTURE_TYPE+CO_RIGID_BODY;
@@ -50,9 +58,10 @@ public:
///btRigidBody constructor for backwards compatibility.
///To specify friction (etc) during rigid body construction, please use the other constructor (using btRigidBodyConstructionInfo)
- btFractureBody( btScalar mass, btMotionState* motionState, btCollisionShape* collisionShape, const btVector3& localInertia, btScalar* masses, int numMasses, btDynamicsWorld* world)
+ btFractureBody( btScalar mass, btMotionState* motionState, btCollisionShape* collisionShape, const btVector3& localInertia, btScalar* masses, int numMasses, btDynamicsWorld* world, btPropagationParameter parameter)
:btRigidBody(mass,motionState,collisionShape,localInertia),
- m_world(world)
+ m_world(world),
+ m_propagationParameter(parameter)
{
for (int i=0;i<numMasses;i++)
diff --git a/extern/bullet2/src/BulletDynamics/Dynamics/btFractureDynamicsWorld.cpp b/extern/bullet2/src/BulletDynamics/Dynamics/btFractureDynamicsWorld.cpp
index 8a26ca4..10ebda7 100644
--- a/extern/bullet2/src/BulletDynamics/Dynamics/btFractureDynamicsWorld.cpp
+++ b/extern/bullet2/src/BulletDynamics/Dynamics/btFractureDynamicsWorld.cpp
@@ -341,6 +341,7 @@ void btFractureDynamicsWorld::glueCallback()
}
+ //btFractureBody* fracObj = (btFractureBody*)getCollisionObjectArray()[fractureObjectIndex];
btTransform shift;
shift.setIdentity();
@@ -350,7 +351,7 @@ void btFractureDynamicsWorld::glueCallback()
btVector3 localInertia;
newCompound->calculateLocalInertia(totalMass,localInertia);
- btFractureBody* newBody = new btFractureBody(totalMass,0,newCompound,localInertia, &massArray[0], numChildren,this);
+ btFractureBody* newBody = new btFractureBody(totalMass,0,newCompound,localInertia, &massArray[0], numChildren,this, fracObj->m_propagationParameter);
//newBody->recomputeConnectivity(this);
//newBody->recomputeConnectivityByConstraints(this);
newBody->setWorldTransform(fracObj->getWorldTransform()*shift);
@@ -439,7 +440,7 @@ void btFractureDynamicsWorld::solveConstraints(btContactSolverInfo& solverInfo)
fractureCallback();
}
-btFractureBody* btFractureDynamicsWorld::addNewBody(const btTransform& oldTransform,btScalar* masses, btCompoundShape* oldCompound)
+btFractureBody* btFractureDynamicsWorld::addNewBody(const btTransform& oldTransform,btScalar* masses, btCompoundShape* oldCompound, btPropagationParameter& param)
{
int i;
@@ -452,7 +453,7 @@ btFractureBody* btFractureDynamicsWorld::addNewBody(const btTransform& oldTransf
totalMass += masses[i];
//newCompound->calculateLocalInertia(totalMass,localInertia);
- btFractureBody* newBody = new btFractureBody(totalMass,0,newCompound,localInertia, masses,newCompound->getNumChildShapes(), this);
+ btFractureBody* newBody = new btFractureBody(totalMass,0,newCompound,localInertia, masses,newCompound->getNumChildShapes(), this, param);
//newBody->recomputeConnectivity(this);
newBody->recomputeConnectivityByConstraints(this);
@@ -613,6 +614,8 @@ void btFractureDynamicsWorld::breakDisconnectedParts( btFractureBody* fracObj)
{
int tag0 = tags[connection.m_childIndex0];
int tag1 = tags[connection.m_childIndex1];
+
+ //printf("Uniting: %d %d\n",connection.m_childIndex0, connection.m_childIndex1);
unionFind.unite(tag0, tag1);
}
}
@@ -666,7 +669,7 @@ void btFractureDynamicsWorld::breakDisconnectedParts( btFractureBody* fracObj)
if (numShapes)
{
int objectIndex, shardIndex;
- btFractureBody* newBody = addNewBody(fracObj->getWorldTransform(),&masses[0],newCompound);
+ btFractureBody* newBody = addNewBody(fracObj->getWorldTransform(),&masses[0],newCompound, fracObj->m_propagationParameter);
newBody->setLinearVelocity(fracObj->getLinearVelocity());
newBody->setAngularVelocity(fracObj->getAngularVelocity());
@@ -699,24 +702,41 @@ void btFractureDynamicsWorld::breakDisconnectedParts( btFractureBody* fracObj)
#include <stdio.h>
-void btFractureDynamicsWorld::propagateDamage(btFractureBody *body, btScalar *impulse, int connection_index, bool* needsBreakingCheck)
+void btFractureDynamicsWorld::propagateDamage(btFractureBody *body, btScalar *impulse, int connection_index,
+ bool* needsBreakingCheck, btVector3& direction)
{
//min break impulse, todo expose
- if (*impulse > 0.5f && body->m_connections.size() > connection_index)
+ if (*impulse > body->m_propagationParameter.m_minimum_impulse && body->m_connections.size() > connection_index)
{
btConnection& connection = body->m_connections[connection_index];
- connection.m_strength -= *impulse;
- //printf("strengthp=%f %f\n",connection.m_strength, *impulse);
+ btCollisionShape* shape0 = connection.m_childShape0;
+ btCollisionShape* shape1 = connection.m_childShape1;
+
+ btFractureBody *fbody0 = m_shapeBodyCallback(shape0->getUserPointer());
+ btFractureBody *fbody1 = m_shapeBodyCallback(shape1->getUserPointer());
- if (connection.m_strength<0)
+ //calculate dot product between body->fbody and direction, if > say 0.75 then roughly same direction ?
+
+ btScalar factor = body->m_propagationParameter.m_directional_factor;
+ btVector3 dir = fbody0->getWorldTransform().getOrigin() - fbody1->getWorldTransform().getOrigin();
+ if (dir.dot(direction) > factor)
{
- //remove or set to zero
- connection.m_strength=0.f;
- *needsBreakingCheck = true;
+ //printf("FACTOR: %f\n", dir.dot(direction));
+
+ connection.m_strength -= *impulse;
+ //printf("strengthp=%f %f\n",connection.m_strength, *impulse);
+
+ if (connection.m_strength<0)
+ {
+ //remove or set to zero
+ //printf("Breaking: %d %d\n",connection.m_childIndex0, connection.m_childIndex1);
+ connection.m_strength=0.f;
+ *needsBreakingCheck = true;
+ }
}
//impulse dampening, todo expose
- *impulse *= 0.85f;
+ *impulse *= (1.0f - body->m_propagationParameter.m_impulse_dampening);
btAlignedObjectArray<int> *adjacents = body->m_connection_map->find(connection_index);
if (adjacents)
@@ -724,7 +744,8 @@ void btFractureDynamicsWorld::propagateDamage(btFractureBody *body, btScalar *im
int i, size = adjacents->size();
for (i=0;i<size;i++)
{
- propagateDamage(body, impulse, adjacents->at(i), needsBreakingCheck);
+ if (size > 1)
+ propagateDamage(body, impulse, adjacents->at(i), needsBreakingCheck, direction);
}
}
}
@@ -766,7 +787,7 @@ void btFractureDynamicsWorld::fractureCallback( )
maxImpact = totalImpact;
//some threshold otherwise resting contact would break objects after a while
- if (totalImpact < 1.f) //40.f
+ if (totalImpact < 1.0f) //40.f
continue;
// printf("strong impact\n");
@@ -921,10 +942,14 @@ void btFractureDynamicsWorld::fractureCallback( )
//propagated damage
if (pt.m_appliedImpulse > 0.f) {
btScalar impulse = pt.m_appliedImpulse;
- propagateDamage(sFracturePairs[i].m_fracObj,&impulse, connection.m_childIndex0, &needsBreakingCheck);
+ btVector3 direction = manifold->getBody0()->getWorldTransform().getOrigin()-
+ manifold->getBody1()->getWorldTransform().getOrigin();
+ propagateDamage(sFracturePairs[i].m_fracObj,&impulse, connection.m_childIndex0,
+ &needsBreakingCheck, direction);
impulse = pt.m_appliedImpulse;
- propagateDamage(sFracturePairs[i].m_fracObj,&impulse, connection.m_childIndex1, &needsBreakingCheck);
+ propagateDamage(sFracturePairs[i].m_fracObj,&impulse, connection.m_childIndex1,
+ &needsBreakingCheck, direction);
}
}
} else
@@ -949,10 +974,14 @@ void btFractureDynamicsWorld::fractureCallback( )
//propagated damage
if (pt.m_appliedImpulse > 0.f) {
btScalar impulse = pt.m_appliedImpulse;
- propagateDamage(sFracturePairs[i].m_fracObj, &impulse, connection.m_childIndex0, &needsBreakingCheck);
+ btVector3 direction = manifold->getBody0()->getWorldTransform().getOrigin()-
+ manifold->getBody1()->getWorldTransform().getOrigin();
+ propagateDamage(sFracturePairs[i].m_fracObj, &impulse, connection.m_childIndex0,
+ &needsBreakingCheck, direction);
impulse = pt.m_appliedImpulse;
- propagateDamage(sFracturePairs[i].m_fracObj, &impulse, connection.m_childIndex1, &needsBreakingCheck);
+ propagateDamage(sFracturePairs[i].m_fracObj, &impulse, connection.m_childIndex1,
+ &needsBreakingCheck, direction);
}
}
}
diff --git a/extern/bullet2/src/BulletDynamics/Dynamics/btFractureDynamicsWorld.h b/extern/bullet2/src/BulletDynamics/Dynamics/btFractureDynamicsWorld.h
index 4343166..36e84f2 100644
--- a/extern/bullet2/src/BulletDynamics/Dynamics/btFra
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list