Commit: ec90dcb5b7c88a098cdfa997ffb8361cf6f51f81
Author: Martin Felke
Date:   Sun May 17 22:04:55 2015 +0200
Branches: fracture_modifier
https://developer.blender.org/rBec90dcb5b7c88a098cdfa997ffb8361cf6f51f81

first commit of dynamic fracture, still highly unstable, needs fixes in storage 
handling and memory management

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

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_fracture.h
M       source/blender/blenkernel/intern/fracture.c
M       source/blender/blenkernel/intern/pointcache.c
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/intern/rigidbody/RBI_api.h b/intern/rigidbody/RBI_api.h
index da24c55..1ee95a1 100644
--- a/intern/rigidbody/RBI_api.h
+++ b/intern/rigidbody/RBI_api.h
@@ -69,13 +69,15 @@ typedef struct rbConstraint rbConstraint;
 /* Collision feedback (manifolds and contact points */
 typedef struct rbContactPoint {
        float contact_force;
-       void *contact_bodyA;
-       void *contact_bodyB;
+       int contact_body_indexA;
+       int contact_body_indexB;
        float contact_pos_world_onA[3];
        float contact_pos_world_onB[3];
 } rbContactPoint;
 
-typedef struct rbContactCallback rbContactCallback;
+/*Subclass because of Internal Tick Callback... sigh why doesnt this work with 
a simple collision callback ? */
+
+
 
 /* ********************************** */
 /* Dynamics World Methods */
@@ -117,7 +119,7 @@ void RB_dworld_export(rbDynamicsWorld *world, const char 
*filename);
 /* Setup ---------------------------- */
 
 /* Add RigidBody to dynamics world */
-void RB_dworld_add_body(rbDynamicsWorld *world, rbRigidBody *body, int 
col_groups, void* meshIsland, void *blenderOb);
+void RB_dworld_add_body(rbDynamicsWorld *world, rbRigidBody *body, int 
col_groups, void* meshIsland, void *blenderOb, int linear_index);
 
 /* Remove RigidBody from dynamics world */
 void RB_dworld_remove_body(rbDynamicsWorld *world, rbRigidBody *body);
diff --git a/intern/rigidbody/rb_bullet_api.cpp 
b/intern/rigidbody/rb_bullet_api.cpp
index cc2bdd6..5ce75e7 100644
--- a/intern/rigidbody/rb_bullet_api.cpp
+++ b/intern/rigidbody/rb_bullet_api.cpp
@@ -74,6 +74,95 @@ subject to the following restrictions:
 #include "BulletCollision/CollisionShapes/btScaledBvhTriangleMeshShape.h"
 #include "BulletCollision/CollisionDispatch/btCollisionWorld.h"
 
+struct rbRigidBody {
+       btRigidBody *body;
+       int col_groups;
+       int linear_index;
+       void *meshIsland;
+       void *blenderOb;
+       rbDynamicsWorld *world;
+};
+
+static inline void copy_v3_btvec3(float vec[3], const btVector3 &btvec)
+{
+       vec[0] = (float)btvec[0];
+       vec[1] = (float)btvec[1];
+       vec[2] = (float)btvec[2];
+}
+
+typedef void (*rbContactCallback)(rbContactPoint * cp, void *bworld);
+
+class TickDiscreteDynamicsWorld : public btDiscreteDynamicsWorld
+{
+       public:
+               TickDiscreteDynamicsWorld(btDispatcher* 
dispatcher,btBroadphaseInterface* pairCache,
+                                         btConstraintSolver* 
constraintSolver,btCollisionConfiguration* collisionConfiguration,
+                                         rbContactCallback cont_callback, void 
*bworld);
+               rbContactPoint* make_contact_point(btManifoldPoint& point, 
const btCollisionObject *body0, const btCollisionObject *body1);
+               rbContactCallback m_contactCallback;
+               void* m_bworld;
+};
+
+void tickCallback(btDynamicsWorld *world, btScalar timeStep)
+{
+       int numManifolds = world->getDispatcher()->getNumManifolds();
+       for (int i=0;i<numManifolds;i++)
+       {
+               btPersistentManifold* contactManifold =  
world->getDispatcher()->getManifoldByIndexInternal(i);
+               const btCollisionObject* obA = contactManifold->getBody0();
+               const btCollisionObject* obB = contactManifold->getBody1();
+
+               int numContacts = contactManifold->getNumContacts();
+               for (int j=0;j<numContacts;j++)
+               {
+                       btManifoldPoint& pt = 
contactManifold->getContactPoint(j);
+                       if (pt.getDistance()<0.f)
+                       {
+                               /*const btVector3& ptA = 
pt.getPositionWorldOnA();
+                               const btVector3& ptB = pt.getPositionWorldOnB();
+                               const btVector3& normalOnB = 
pt.m_normalWorldOnB;*/
+
+                               TickDiscreteDynamicsWorld* tworld = 
(TickDiscreteDynamicsWorld*)world;
+                               if (tworld->m_contactCallback)
+                               {
+                                       rbContactPoint* cp = 
tworld->make_contact_point(pt, obA, obB);
+                                       tworld->m_contactCallback(cp, 
tworld->m_bworld);
+                                       delete cp;
+                               }
+                       }
+               }
+       }
+}
+
+TickDiscreteDynamicsWorld::TickDiscreteDynamicsWorld(btDispatcher* 
dispatcher,btBroadphaseInterface* pairCache,
+                                                     btConstraintSolver* 
constraintSolver,btCollisionConfiguration* collisionConfiguration,
+                                                     rbContactCallback 
cont_callback, void *bworld) :
+                                                     
btDiscreteDynamicsWorld(dispatcher, pairCache, constraintSolver, 
collisionConfiguration)
+{
+       m_internalTickCallback = tickCallback;
+       m_contactCallback = cont_callback;
+       m_bworld = bworld;
+}
+
+rbContactPoint* TickDiscreteDynamicsWorld::make_contact_point(btManifoldPoint& 
point, const btCollisionObject* body0, const btCollisionObject* body1)
+{
+       rbContactPoint *cp = new rbContactPoint;
+       btRigidBody* bodyA = (btRigidBody*)(body0);
+       btRigidBody* bodyB = (btRigidBody*)(body1);
+       rbRigidBody* rbA = (rbRigidBody*)(bodyA->getUserPointer());
+       rbRigidBody* rbB = (rbRigidBody*)(bodyB->getUserPointer());
+       if (rbA)
+               cp->contact_body_indexA = rbA->linear_index;
+
+       if (rbB)
+               cp->contact_body_indexB = rbB->linear_index;
+
+       cp->contact_force = point.getAppliedImpulse();
+       copy_v3_btvec3(cp->contact_pos_world_onA, point.getPositionWorldOnA());
+       copy_v3_btvec3(cp->contact_pos_world_onB, point.getPositionWorldOnB());
+
+       return cp;
+}
 
 struct rbDynamicsWorld {
        btDiscreteDynamicsWorld *dynamicsWorld;
@@ -83,14 +172,7 @@ struct rbDynamicsWorld {
        btConstraintSolver *constraintSolver;
        btOverlapFilterCallback *filterCallback;
        void *blenderWorld;
-       struct rbContactCallback *contactCallback;
-};
-struct rbRigidBody {
-       btRigidBody *body;
-       int col_groups;
-       void *meshIsland;
-       void *blenderOb;
-       rbDynamicsWorld *world;
+       //struct rbContactCallback *contactCallback;
 };
 
 struct rbVert {
@@ -222,12 +304,6 @@ struct rbFilterCallback : public btOverlapFilterCallback
        }
 };
 
-static inline void copy_v3_btvec3(float vec[3], const btVector3 &btvec)
-{
-       vec[0] = (float)btvec[0];
-       vec[1] = (float)btvec[1];
-       vec[2] = (float)btvec[2];
-}
 static inline void copy_quat_btquat(float quat[4], const btQuaternion &btquat)
 {
        quat[0] = btquat.getW();
@@ -236,6 +312,7 @@ static inline void copy_quat_btquat(float quat[4], const 
btQuaternion &btquat)
        quat[3] = btquat.getZ();
 }
 
+#if 0
 /*Contact Handling*/
 typedef void (*cont_callback)(rbContactPoint *cp, void* bworld);
 
@@ -247,11 +324,11 @@ struct rbContactCallback
        static bool handle_contacts(btManifoldPoint& point, btCollisionObject* 
body0, btCollisionObject* body1);
 };
 
-rbContactCallback::rbContactCallback(cont_callback callback, void *bworld){
+/*rbContactCallback::rbContactCallback(cont_callback callback, void *bworld){
        rbContactCallback::callback = callback;
        rbContactCallback::bworld = bworld;
        gContactProcessedCallback = 
(ContactProcessedCallback)&rbContactCallback::handle_contacts;
-}
+}*/
 
 cont_callback rbContactCallback::callback = 0;
 void* rbContactCallback::bworld = NULL;
@@ -267,10 +344,10 @@ bool rbContactCallback::handle_contacts(btManifoldPoint& 
point, btCollisionObjec
                rbRigidBody* rbA = (rbRigidBody*)(bodyA->getUserPointer());
                rbRigidBody* rbB = (rbRigidBody*)(bodyB->getUserPointer());
                if (rbA)
-                       cp->contact_bodyA = rbA->meshIsland;
+                       cp->contact_body_indexA = rbA->linear_index;
 
                if (rbB)
-                       cp->contact_bodyB = rbB->meshIsland;
+                       cp->contact_body_indexB = rbB->linear_index;
 
                cp->contact_force = point.getAppliedImpulse();
                copy_v3_btvec3(cp->contact_pos_world_onA, 
point.getPositionWorldOnA());
@@ -282,6 +359,7 @@ bool rbContactCallback::handle_contacts(btManifoldPoint& 
point, btCollisionObjec
        }
        return ret;
 }
+#endif
 
 /* ********************************** */
 /* Dynamics World Methods */
@@ -290,7 +368,7 @@ bool rbContactCallback::handle_contacts(btManifoldPoint& 
point, btCollisionObjec
 
 //yuck, but need a handle for the world somewhere for collision callback...
 rbDynamicsWorld *RB_dworld_new(const float gravity[3], void* blenderWorld, int 
(*callback)(void *, void *, void *, void *, void *),
-                                                          void 
(*contactCallback)(rbContactPoint * cp, void *bworld))
+                                                          void 
(*contactCallback)(rbContactPoint* cp, void *bworld))
 {
        rbDynamicsWorld *world = new rbDynamicsWorld;
        
@@ -308,20 +386,24 @@ rbDynamicsWorld *RB_dworld_new(const float gravity[3], 
void* blenderWorld, int (
        /* constraint solving */
        world->constraintSolver = new btSequentialImpulseConstraintSolver();
 
+       TickDiscreteDynamicsWorld *tworld = new 
TickDiscreteDynamicsWorld(world->dispatcher,
+                                                                         
world->pairCache,
+                                                             
world->constraintSolver,
+                                                             
world->collisionConfiguration,
+                                                             contactCallback, 
blenderWorld);
+
        /* world */
-       world->dynamicsWorld = new btDiscreteDynamicsWorld(world->dispatcher,
-                                                          world->pairCache,
-                                                          
world->constraintSolver,
-                                                          
world->collisionConfiguration);
+       world->dynamicsWorld = (btDiscreteDynamicsWorld*)tworld;
        world->blenderWorld = blenderWorld;
 
        RB_dworld_set_gravity(world, gravity);
 
        /*contact callback */
+/*
        if (contactCallback)
        {
                world->contactCallback = new rbContactCallback(contactCallback, 
world->blenderWorld);
-       }
+       } */
        
        return world;
 }
@@ -406,13 +488,14 @@ void RB_dworld_export(rbDynamicsWorld *world, const char 
*filename)
 
 /* Setup ---------------------------- */
 
-void RB_dworld_add_body(rbDynamicsWorld *world, rbRigidBody *object, int 
col_groups, void* meshIsland, void* blenderOb)
+void RB_dworld_add_body(rbDynamicsWorld *world, rbRigidBody *object, int 
col_groups, void* meshIsland, void* blenderOb, int linear_index)
 {
        btRigidBody *body = object->body;
        object->col_groups = col_groups;
        object->meshIsland = meshIsland;
        object->world = world;
        object->blenderOb = blenderOb;
+       object->linear_index = linear_index;
        
        world->dynamicsWorld->addRigidBody(body);
 }
diff --git a/release/scripts/startup/bl_ui/properties_physics_fracture.py 
b/release/scripts/startup/bl_ui/properties_physics_fracture.py
index f8e44b8..3ac3760 100644
--- a/release/scripts/startup/bl_ui/properties_physics_fracture.py
+++ b/release/scripts/startup/bl_ui/properties_physics_fracture.py
@@ -70,6 +70,11 @@ class PHYSICS_PT_

@@ 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