[Bf-blender-cvs] [03a4109] fracture_modifier: exposed bullet tick callback to bpy.app.handlers, also wrapped the passed timestep into the rigidbody world, so it can be accessed too
Martin Felke
noreply at git.blender.org
Sat Jan 30 16:03:57 CET 2016
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. @@
More information about the Bf-blender-cvs
mailing list