Commit: 03a410993003e8c060d7a066356a14eb10f2db71
Author: Martin Felke
Date:   Sat Jan 30 16:03:26 2016 +0100
Branches: fracture_modifier
https://developer.blender.org/rB03a410993003e8c060d7a066356a14eb10f2db71

exposed bullet tick callback to bpy.app.handlers, also wrapped the passed 
timestep into the rigidbody world, so it can be accessed too

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

M       intern/rigidbody/RBI_api.h
M       intern/rigidbody/rb_bullet_api.cpp
M       source/blender/blenkernel/intern/rigidbody.c
M       source/blender/blenlib/BLI_callbacks.h
M       source/blender/makesdna/DNA_rigidbody_types.h
M       source/blender/makesrna/intern/rna_rigidbody.c
M       source/blender/python/intern/bpy_app_handlers.c

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

diff --git a/intern/rigidbody/RBI_api.h b/intern/rigidbody/RBI_api.h
index 0791bda..f4c2706 100644
--- a/intern/rigidbody/RBI_api.h
+++ b/intern/rigidbody/RBI_api.h
@@ -88,8 +88,9 @@ void RB_dworld_init_compounds(rbDynamicsWorld *world);
 
 /* Create a new dynamics world instance */
 // TODO: add args to set the type of constraint solvers, etc.
-rbDynamicsWorld *RB_dworld_new(const float gravity[3], void* blenderWorld, int 
(*callback)(void*, void*, void*, void*, void*),
-                                                               void 
(*contactCallback)(rbContactPoint*, void *), void (*idCallbackOut)(void*, 
void*, int*, int*));
+rbDynamicsWorld *RB_dworld_new(const float gravity[3], void* blenderWorld, 
void *blenderScene, int (*callback)(void*, void*, void*, void*, void*),
+                                                               void 
(*contactCallback)(rbContactPoint*, void *), void (*idCallbackOut)(void*, 
void*, int*, int*),
+                                                               void 
(*tickCallback)(float, void *));
 
 /* Delete the given dynamics world, and free any extra data it may require */
 void RB_dworld_delete(rbDynamicsWorld *world);
diff --git a/intern/rigidbody/rb_bullet_api.cpp 
b/intern/rigidbody/rb_bullet_api.cpp
index c3b63d2..4786ba6 100644
--- a/intern/rigidbody/rb_bullet_api.cpp
+++ b/intern/rigidbody/rb_bullet_api.cpp
@@ -107,16 +107,19 @@ static inline void copy_v3_btvec3(float vec[3], const 
btVector3 &btvec)
 }
 
 typedef void (*rbContactCallback)(rbContactPoint * cp, void *bworld);
+typedef void (*rbTickCallback)(btScalar timeStep, void *bworld);
 
 class TickDiscreteDynamicsWorld : public btFractureDynamicsWorld
 {
        public:
-               TickDiscreteDynamicsWorld(btDispatcher* 
dispatcher,btBroadphaseInterface* pairCache,
-                                         btConstraintSolver* 
constraintSolver,btCollisionConfiguration* collisionConfiguration,
-                                         rbContactCallback cont_callback, void 
*bworld, IdCallback id_callback);
+               TickDiscreteDynamicsWorld(btDispatcher* dispatcher, 
btBroadphaseInterface* pairCache,
+                                         btConstraintSolver* constraintSolver, 
btCollisionConfiguration* collisionConfiguration,
+                                         rbContactCallback cont_callback, void 
*bworld, void *bScene, IdCallback id_callback, rbTickCallback tick_callback);
                rbContactPoint* make_contact_point(btManifoldPoint& point, 
const btCollisionObject *body0, const btCollisionObject *body1);
                rbContactCallback m_contactCallback;
+               rbTickCallback m_tickCallback;
                void* m_bworld;
+               void* m_bscene;
 };
 
 void tickCallback(btDynamicsWorld *world, btScalar timeStep)
@@ -124,6 +127,8 @@ void tickCallback(btDynamicsWorld *world, btScalar timeStep)
        btFractureDynamicsWorld *fworld = (btFractureDynamicsWorld*)world;
        fworld->updateBodies();
 
+       TickDiscreteDynamicsWorld* tworld = (TickDiscreteDynamicsWorld*)world;
+
        int numManifolds = world->getDispatcher()->getNumManifolds();
        for (int i=0;i<numManifolds;i++)
        {
@@ -141,7 +146,7 @@ void tickCallback(btDynamicsWorld *world, btScalar timeStep)
                                const btVector3& ptB = pt.getPositionWorldOnB();
                                const btVector3& normalOnB = 
pt.m_normalWorldOnB;*/
 
-                               TickDiscreteDynamicsWorld* tworld = 
(TickDiscreteDynamicsWorld*)world;
+                               //TickDiscreteDynamicsWorld* tworld = 
(TickDiscreteDynamicsWorld*)world;
                                if (tworld->m_contactCallback)
                                {
                                        rbContactPoint* cp = 
tworld->make_contact_point(pt, obA, obB);
@@ -151,17 +156,26 @@ void tickCallback(btDynamicsWorld *world, btScalar 
timeStep)
                        }
                }
        }
+
+       if (tworld->m_tickCallback)
+       {
+               tworld->m_tickCallback(timeStep, tworld->m_bscene);
+       }
 }
 
-TickDiscreteDynamicsWorld::TickDiscreteDynamicsWorld(btDispatcher* 
dispatcher,btBroadphaseInterface* pairCache,
-                                                     btConstraintSolver* 
constraintSolver,btCollisionConfiguration* collisionConfiguration,
-                                                     rbContactCallback 
cont_callback, void *bworld, IdCallback id_callback) :
+TickDiscreteDynamicsWorld::TickDiscreteDynamicsWorld(btDispatcher* dispatcher, 
btBroadphaseInterface* pairCache,
+                                                     btConstraintSolver* 
constraintSolver, btCollisionConfiguration* collisionConfiguration,
+                                                     rbContactCallback 
cont_callback, void *bworld, void *bScene, IdCallback id_callback,
+                                                     rbTickCallback 
tick_callback) :
+
                                                      
btFractureDynamicsWorld(dispatcher, pairCache, constraintSolver, 
collisionConfiguration,
                                                                              
id_callback, getBodyFromShape)
 {
        m_internalTickCallback = tickCallback;
        m_contactCallback = cont_callback;
        m_bworld = bworld;
+       m_bscene = bScene;
+       m_tickCallback = tick_callback;
 }
 
 rbContactPoint* TickDiscreteDynamicsWorld::make_contact_point(btManifoldPoint& 
point, const btCollisionObject* body0, const btCollisionObject* body1)
@@ -194,6 +208,7 @@ struct rbDynamicsWorld {
        void *blenderWorld;
        //struct rbContactCallback *contactCallback;
        IdOutCallback idOutCallback;
+       void *blenderScene; // ouch, very very clumsy approach, this is just a 
borrowed pointer
 };
 
 struct rbVert {
@@ -410,8 +425,9 @@ static void idCallback(void *userPtr, int* objectId, int* 
shardId)
 }
 
 //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 
(*idCallbackOut)(void*, void*, int*, int*))
+rbDynamicsWorld *RB_dworld_new(const float gravity[3], void* blenderWorld, 
void* blenderScene, int (*callback)(void *, void *, void *, void *, void *),
+                                                          void 
(*contactCallback)(rbContactPoint* cp, void *bworld), void 
(*idCallbackOut)(void*, void*, int*, int*),
+                                                          void 
(*tickCallback)(float timestep, void *bworld))
 {
        rbDynamicsWorld *world = new rbDynamicsWorld;
        
@@ -433,7 +449,7 @@ rbDynamicsWorld *RB_dworld_new(const float gravity[3], 
void* blenderWorld, int (
                                                                          
world->pairCache,
                                                              
world->constraintSolver,
                                                              
world->collisionConfiguration,
-                                                             contactCallback, 
blenderWorld, idCallback);
+                                                             contactCallback, 
blenderWorld, blenderScene, idCallback, tickCallback);
 
        /* world */
        world->dynamicsWorld = (btFractureDynamicsWorld*)tworld;
diff --git a/source/blender/blenkernel/intern/rigidbody.c 
b/source/blender/blenkernel/intern/rigidbody.c
index 936d430..203dd2f 100644
--- a/source/blender/blenkernel/intern/rigidbody.c
+++ b/source/blender/blenkernel/intern/rigidbody.c
@@ -40,6 +40,7 @@
 #include "MEM_guardedalloc.h"
 
 #include "BLI_blenlib.h"
+#include "BLI_callbacks.h"
 #include "BLI_math.h"
 #include "BLI_kdtree.h"
 #include "BLI_utildefines.h"
@@ -2171,6 +2172,15 @@ static void idCallback(void *world, void* island, int* 
objectId, int* islandId)
        }
 }
 
+static void tickCallback(float timestep, void *scene)
+{
+       Scene* sce = (Scene*)scene;
+       RigidBodyWorld *rbw = sce->rigidbody_world;
+       rbw->internal_tick = timestep;
+
+       BLI_callback_exec(G.main, &sce->id, BLI_CB_EVT_BULLET_TICK);
+}
+
 /* --------------------- */
 
 /* Create physics sim world given RigidBody world settings */
@@ -2185,7 +2195,7 @@ void BKE_rigidbody_validate_sim_world(Scene *scene, 
RigidBodyWorld *rbw, bool re
        if (rebuild || rbw->physics_world == NULL) {
                if (rbw->physics_world)
                        RB_dworld_delete(rbw->physics_world);
-               rbw->physics_world = 
RB_dworld_new(scene->physics_settings.gravity, rbw, filterCallback, 
contactCallback, idCallback);
+               rbw->physics_world = 
RB_dworld_new(scene->physics_settings.gravity, rbw, scene, filterCallback, 
contactCallback, idCallback, tickCallback);
        }
 
        RB_dworld_set_solver_iterations(rbw->physics_world, 
rbw->num_solver_iterations);
diff --git a/source/blender/blenlib/BLI_callbacks.h 
b/source/blender/blenlib/BLI_callbacks.h
index fdffbeb..c51c3e6 100644
--- a/source/blender/blenlib/BLI_callbacks.h
+++ b/source/blender/blenlib/BLI_callbacks.h
@@ -54,6 +54,7 @@ typedef enum {
        BLI_CB_EVT_GAME_PRE,
        BLI_CB_EVT_GAME_POST,
        BLI_CB_EVT_VERSION_UPDATE,
+       BLI_CB_EVT_BULLET_TICK,
        BLI_CB_EVT_TOT
 } eCbEvent;
 
diff --git a/source/blender/makesdna/DNA_rigidbody_types.h 
b/source/blender/makesdna/DNA_rigidbody_types.h
index c9b398a..6cb7fd4 100644
--- a/source/blender/makesdna/DNA_rigidbody_types.h
+++ b/source/blender/makesdna/DNA_rigidbody_types.h
@@ -75,7 +75,8 @@ typedef struct RigidBodyWorld {
        void *physics_world;            /* Physics sim world (i.e. 
btDiscreteDynamicsWorld) */
        RigidBodyOb **cache_index_map;          /* Maps the linear RigidbodyOb 
index to the nested Object(Modifier) Index, at runtime*/
        int *cache_offset_map;          /* Maps the linear RigidbodyOb index to 
the nested Object(Modifier) cell offset, at runtime, so it does not need to be 
calced in cache*/
-       //char pad2[4];
+       float internal_tick;            /* this is the current ? internal 
bullet time step, clumsy to put here but cannot expose custom callback 
parameters */
+       char pad2[4];
 } RigidBodyWorld;
 
 /* Flags for RigidBodyWorld */
diff --git a/source/blender/makesrna/intern/rna_rigidbody.c 
b/source/blender/makesrna/intern/rna_rigidbody.c
index 690c002..add7960 100644
--- a/source/blender/makesrna/intern/rna_rigidbody.c
+++ b/source/blender/makesrna/intern/rna_rigidbody.c
@@ -1002,6 +1002,11 @@ static void rna_def_rigidbody_world(BlenderRNA *brna)
 
        prop = RNA_def_int(func, "has_hit", 0, 0, 0, "", "If the function has 
found collision point, value is 1, otherwise 0", 0, 0);
        RNA_def_function_output(func, prop);
+
+       prop = RNA_def_property(srna, "bullet_step", PROP_FLOAT, PROP_NONE);
+       RNA_def_property_float_sdna(prop, NULL, "internal_tick");
+       RNA_def_property_float_default(prop, 0.0f);
+       RNA_def_property_ui_text(prop, "Bullet Step", "The current bullet step 
value (read only, as writing it has no effect)");
 }
 
 static void rna_def_rigidbody_object(BlenderRNA *brna)
diff --git a/source/ble

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