[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