Commit: 597936b3fb006876e780e6da9c9c3da9bb345bb3
Author: Martin Felke
Date:   Tue Oct 20 21:31:29 2015 +0200
Branches: fracture_modifier
https://developer.blender.org/rB597936b3fb006876e780e6da9c9c3da9bb345bb3

new feature: attempt to accelerate simulation of many adjacent shards by 
compounds; todo... improve connectivity check

===================================================================

M       extern/bullet2/CMakeLists.txt
A       
extern/bullet2/src/BulletDynamics/ConstraintSolver/btCompoundConstraint.cpp
A       
extern/bullet2/src/BulletDynamics/ConstraintSolver/btCompoundConstraint.h
A       extern/bullet2/src/BulletDynamics/Dynamics/btFractureBody.cpp
A       extern/bullet2/src/BulletDynamics/Dynamics/btFractureBody.h
A       extern/bullet2/src/BulletDynamics/Dynamics/btFractureDynamicsWorld.cpp
A       extern/bullet2/src/BulletDynamics/Dynamics/btFractureDynamicsWorld.h
M       extern/bullet2/src/BulletDynamics/Dynamics/btRigidBody.h
M       extern/bullet2/src/btBulletDynamicsCommon.h
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/intern/rigidbody.c
M       source/blender/makesdna/DNA_modifier_types.h
M       source/blender/makesdna/DNA_rigidbody_types.h
M       source/blender/makesrna/intern/rna_modifier.c
M       source/blender/modifiers/intern/MOD_fracture.c

===================================================================

diff --git a/extern/bullet2/CMakeLists.txt b/extern/bullet2/CMakeLists.txt
index 2b2c18c..35ef63d 100644
--- a/extern/bullet2/CMakeLists.txt
+++ b/extern/bullet2/CMakeLists.txt
@@ -143,8 +143,11 @@ set(SRC
        src/BulletDynamics/ConstraintSolver/btUniversalConstraint.cpp
        src/BulletDynamics/ConstraintSolver/btGearConstraint.cpp
        src/BulletDynamics/ConstraintSolver/btFixedConstraint.cpp
+       src/BulletDynamics/ConstraintSolver/btCompoundConstraint.cpp
        src/BulletDynamics/Dynamics/btDiscreteDynamicsWorld.cpp
+       src/BulletDynamics/Dynamics/btFractureDynamicsWorld.cpp
        src/BulletDynamics/Dynamics/btRigidBody.cpp
+       src/BulletDynamics/Dynamics/btFractureBody.cpp
        src/BulletDynamics/Dynamics/btSimpleDynamicsWorld.cpp
        src/BulletDynamics/Dynamics/Bullet-C-API.cpp
        src/BulletDynamics/Vehicle/btRaycastVehicle.cpp
@@ -323,11 +326,14 @@ set(SRC
        src/BulletDynamics/ConstraintSolver/btUniversalConstraint.h
        src/BulletDynamics/ConstraintSolver/btGearConstraint.h
        src/BulletDynamics/ConstraintSolver/btFixedConstraint.h
+       src/BulletDynamics/ConstraintSolver/btCompoundConstraint.h
        src/BulletDynamics/Dynamics/btActionInterface.h
        src/BulletDynamics/Dynamics/btDiscreteDynamicsWorld.h
        src/BulletDynamics/Dynamics/btDynamicsWorld.h
        src/BulletDynamics/Dynamics/btSimpleDynamicsWorld.h
        src/BulletDynamics/Dynamics/btRigidBody.h
+       src/BulletDynamics/Dynamics/btFractureBody.h
+       src/BulletDynamics/Dynamics/btFractureDynamicsWorld.h
        src/BulletDynamics/Vehicle/btRaycastVehicle.h
        src/BulletDynamics/Vehicle/btVehicleRaycaster.h
        src/BulletDynamics/Vehicle/btWheelInfo.h
diff --git 
a/extern/bullet2/src/BulletDynamics/ConstraintSolver/btCompoundConstraint.cpp 
b/extern/bullet2/src/BulletDynamics/ConstraintSolver/btCompoundConstraint.cpp
new file mode 100644
index 0000000..6965035
--- /dev/null
+++ 
b/extern/bullet2/src/BulletDynamics/ConstraintSolver/btCompoundConstraint.cpp
@@ -0,0 +1,8 @@
+
+#include "btCompoundConstraint.h"
+
+btCompoundConstraint::btCompoundConstraint(btRigidBody& rbA, btRigidBody& rbB)
+    :btTypedConstraint::btTypedConstraint(COMPOUND_CONSTRAINT_TYPE, rbA, rbB)
+{
+}
+
diff --git 
a/extern/bullet2/src/BulletDynamics/ConstraintSolver/btCompoundConstraint.h 
b/extern/bullet2/src/BulletDynamics/ConstraintSolver/btCompoundConstraint.h
new file mode 100644
index 0000000..d95ddbe
--- /dev/null
+++ b/extern/bullet2/src/BulletDynamics/ConstraintSolver/btCompoundConstraint.h
@@ -0,0 +1,20 @@
+#ifndef BTCOMPOUNDCONSTRAINT_H
+#define BTCOMPOUNDCONSTRAINT_H
+
+#include "btTypedConstraint.h"
+
+#define COMPOUND_CONSTRAINT_TYPE (MAX_CONSTRAINT_TYPE+1)
+
+ATTRIBUTE_ALIGNED16(class) btCompoundConstraint : public btTypedConstraint
+{
+       public:
+               btCompoundConstraint(btRigidBody& rbA,btRigidBody& rbB);
+               virtual void getInfo1(btConstraintInfo1* info) {}
+               virtual void getInfo2(btConstraintInfo2* info) {}
+               virtual btScalar getParam(int num, int axis) const { return 0;}
+               virtual void setParam(int num, btScalar value, int axis) {}
+
+               int m_objectId;
+};
+
+#endif // BTCOMPOUNDCONSTRAINT_H
diff --git a/extern/bullet2/src/BulletDynamics/Dynamics/btFractureBody.cpp 
b/extern/bullet2/src/BulletDynamics/Dynamics/btFractureBody.cpp
new file mode 100644
index 0000000..e92dcb7
--- /dev/null
+++ b/extern/bullet2/src/BulletDynamics/Dynamics/btFractureBody.cpp
@@ -0,0 +1,178 @@
+
+#include "btFractureBody.h"
+#include "BulletCollision/CollisionDispatch/btCollisionWorld.h"
+#include "BulletCollision/CollisionShapes/btCompoundShape.h"
+#include "BulletDynamics/Dynamics/btDynamicsWorld.h"
+
+#include "BulletDynamics/Dynamics/btFractureDynamicsWorld.h"
+
+
+
+void   btFractureBody::recomputeConnectivity(btCollisionWorld* world)
+{
+       m_connections.clear();
+       //@todo use the AABB tree to avoid N^2 checks
+
+       if (getCollisionShape()->isCompound())
+       {
+               btCompoundShape* compound = 
(btCompoundShape*)getCollisionShape();
+               for (int i=0;i<compound->getNumChildShapes();i++)
+               {
+                       for (int j=i+1;j<compound->getNumChildShapes();j++)
+                       {
+
+                               struct   MyContactResultCallback : public 
btCollisionWorld::ContactResultCallback
+                               {
+                                       bool m_connected;
+                                       btScalar m_margin;
+                                       MyContactResultCallback() 
:m_connected(false),m_margin(0.05)
+                                       {
+                                       }
+                                       virtual   btScalar   
addSingleResult(btManifoldPoint& cp,   const btCollisionObjectWrapper* 
colObj0Wrap,int partId0,int index0,const btCollisionObjectWrapper* 
colObj1Wrap,int partId1,int index1)
+                                       {
+                                               if (cp.getDistance()<=m_margin)
+                                                       m_connected = true;
+                                               return 1.f;
+                                       }
+                          };
+
+                               MyContactResultCallback result;
+
+                               btCollisionObject obA;
+                               
obA.setWorldTransform(compound->getChildTransform(i));
+                               
obA.setCollisionShape(compound->getChildShape(i));
+                               btCollisionObject obB;
+                               
obB.setWorldTransform(compound->getChildTransform(j));
+                               
obB.setCollisionShape(compound->getChildShape(j));
+                               world->contactPairTest(&obA,&obB,result);
+                               if (result.m_connected)
+                               {
+                                       btConnection tmp;
+                                       tmp.m_childIndex0 = i;
+                                       tmp.m_childIndex1 = j;
+                                       tmp.m_childShape0 = 
compound->getChildShape(i);
+                                       tmp.m_childShape1 = 
compound->getChildShape(j);
+                                       tmp.m_strength = 1.f;//??
+                                       m_connections.push_back(tmp);
+                               }
+                       }
+               }
+       }
+       
+
+}
+
+void btFractureBody::recomputeConnectivityByConstraints(btCollisionWorld 
*world1)
+{
+       btFractureDynamicsWorld *world = (btFractureDynamicsWorld*)world1;
+
+       if (world->m_idCallback != NULL)
+       {
+               int i;
+               m_connections.clear();
+
+               for (i=0; i<world->m_compoundConstraints.size();i++)
+               {
+                       btCompoundConstraint *con = 
world->m_compoundConstraints[i];
+
+                       if (con->isEnabled())
+                       {
+                               int obIdA, shardIdA, obIdB, shardIdB;
+                               btFractureBody *obA = 
(btFractureBody*)&con->getRigidBodyA();
+                               btFractureBody *obB = 
(btFractureBody*)&con->getRigidBodyB();
+
+                               world->m_idCallback(obA->getUserPointer(), 
&obIdA, &shardIdA);
+                               world->m_idCallback(obB->getUserPointer(), 
&obIdB, &shardIdB);
+
+                               if ((obIdA == obIdB) && (shardIdA != shardIdB))
+                               {
+                                       btConnection tmp;
+                                       tmp.m_childIndex0 = shardIdA;
+                                       tmp.m_childIndex1 = shardIdB;
+                                       tmp.m_childShape0 = 
obA->getCollisionShape();
+                                       tmp.m_childShape1 = 
obB->getCollisionShape();
+                                       tmp.m_strength = 
con->getBreakingImpulseThreshold();
+                                       m_connections.push_back(tmp);
+                               }
+                       }
+               }
+       }
+}
+
+btCompoundShape* btFractureBody::shiftTransformDistributeMass(btCompoundShape* 
boxCompound,btScalar mass,btTransform& shift)
+{
+
+       btVector3 principalInertia;
+
+       btScalar* masses = new btScalar[boxCompound->getNumChildShapes()];
+       for (int j=0;j<boxCompound->getNumChildShapes();j++)
+       {
+               //evenly distribute mass
+               masses[j]=mass/boxCompound->getNumChildShapes();
+       }
+
+       return shiftTransform(boxCompound,masses,shift,principalInertia);
+
+}
+
+
+btCompoundShape* btFractureBody::shiftTransform(btCompoundShape* 
boxCompound,btScalar* masses,btTransform& shift, btVector3& principalInertia)
+{
+       btTransform principal;
+
+       
boxCompound->calculatePrincipalAxisTransform(masses,principal,principalInertia);
+
+
+       ///create a new compound with world transform/center of mass properly 
aligned with the principal axis
+
+       ///non-recursive compound shapes perform better
+       
+#ifdef USE_RECURSIVE_COMPOUND
+
+       btCompoundShape* newCompound = new btCompoundShape();
+       newCompound->addChildShape(principal.inverse(),boxCompound);
+       newBoxCompound = newCompound;
+       //m_collisionShapes.push_back(newCompound);
+
+       //btDefaultMotionState* myMotionState = new 
btDefaultMotionState(startTransform);
+       //btRigidBody::btRigidBodyConstructionInfo 
rbInfo(mass,myMotionState,newCompound,principalInertia);
+
+#else
+#ifdef CHANGE_COMPOUND_INPLACE
+       newBoxCompound = boxCompound;
+       for (int i=0;i<boxCompound->getNumChildShapes();i++)
+       {
+               btTransform newChildTransform = 
principal.inverse()*boxCompound->getChildTransform(i);
+               ///updateChildTransform is really slow, because it 
re-calculates the AABB each time. todo: add option to disable this update
+               boxCompound->updateChildTransform(i,newChildTransform);
+       }
+       bool isDynamic = (mass != 0.f);
+       btVector3 localInertia(0,0,0);
+       if (isDynamic)
+               boxCompound->calculateLocalInertia(mass,localInertia);
+       
+#else
+       ///creation is faster using a new compound to store the shifted children
+       btCompoundShape* newBoxCompound = new btCompoundShape();
+       for (int i=0;i<boxCompound->getNumChildShapes();i++)
+       {
+               btTransform newChildTransform = 
principal.inverse()*boxCompound->getChildTransform(i);
+               ///updateChildTransform is really slow, because it 
re-calculates the AABB each time. todo: add option to disable this update
+               
newBoxCompound->addChildShape(newChildTransform,boxCompound->getChildShape(i));
+       }
+
+
+
+#endif
+
+#endif//USE_RECURSIVE_COMPOUND
+
+       shift = principal;
+       return newBoxCompound;
+}
+
+
+
+
+
+
diff --git a/extern/bullet2/src/BulletDynamics/Dynamics/btFractureBody.h 
b/extern/bullet2/src/BulletDynamics/Dynamics/btFractureBody.h
new file mode 100644
index 0000000..031a48e
--- /dev/null
+++ b/extern/bullet2/src/BulletDynamics/Dynamics/btFractureBody.h
@@ -0,0 +1,85 @@
+
+#ifndef BT_FRACTURE_BODY
+#define BT_FRACTURE_BODY
+
+class btCollisionShape;
+class btDynamicsWorld;
+class btCollisionWorld;
+class btCompoundShape;
+class btManifoldPoint;
+
+#include "LinearMath/btAlignedObjectArray.h"
+#include "BulletDynamics/Dynamics/btRigidBody.h"
+
+#define CUSTOM_FRACTURE_TYPE (btRigidBody::CO_USER_TYPE+1)
+
+
+struct btConnection
+{
+       
+       btCollisionShape*       m_childShape0;
+       btCollisionShape*       m_childShape1;
+       int     m_childIndex0;
+       int     m_childIndex1;
+       btScalar        m_strength;
+};
+
+class btFractureBody : public btRigidBody
+{
+       //connections
+public:
+
+       btDynamicsWorld*        m_world;
+       btAlignedObjectArray<btScalar>  m_masses;
+       btAlignedObjectArray<btConnection>      m_connections;
+       int m_childIndex;
+
+
+
+       btFractureBody( const btRigidBodyConstructionInfo& constructionInfo)
+               :btRigidBody(constructionInfo),
+               m_world(0),
+               m_childIndex(-1)
+       {
+               m_masses.push_back(constructionInfo.m_mass);
+               m_internalType=CUSTOM_FRACTURE_TYPE+CO_RIGID_BODY;
+       }
+
+
+
+       ///btRigidBody constructor for backwards compatibility. 
+       ///To specify friction (etc) during rigid body construction, please use 
the other constructor (using btRigidBodyConstructionInfo)
+       

@@ Diff output truncated at 10240 characters. @@

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to