Browse Source

Implemented tick callback for BulletWorld.

enn0x 12 years ago
parent
commit
cc79e24c6c
2 changed files with 11 additions and 6 deletions
  1. 9 4
      panda/src/bullet/bulletWorld.cxx
  2. 2 2
      panda/src/bullet/bulletWorld.h

+ 9 - 4
panda/src/bullet/bulletWorld.cxx

@@ -852,10 +852,11 @@ clear_contact_added_callback() {
 //  Description:
 ////////////////////////////////////////////////////////////////////
 void BulletWorld::
-set_tick_callback(CallbackObject *obj) {
+set_tick_callback(CallbackObject *obj, bool is_pretick) {
 
   nassertv(obj != NULL);
   _tick_callback_obj = obj;
+  _world->setInternalTickCallback(&BulletWorld::tick_callback, this, is_pretick);
 }
 
 ////////////////////////////////////////////////////////////////////
@@ -867,6 +868,7 @@ void BulletWorld::
 clear_tick_callback() {
 
   _tick_callback_obj = NULL;
+  _world->setInternalTickCallback(NULL);
 }
 
 ///////////////////////////////////////////////////////////////////
@@ -880,8 +882,11 @@ tick_callback(btDynamicsWorld *world, btScalar timestep) {
   nassertv(world->getWorldUserInfo());
 
   BulletWorld *w = static_cast<BulletWorld *>(world->getWorldUserInfo());
-  BulletTickCallbackData cbdata(timestep);
-  w->_tick_callback_obj->do_callback(&cbdata);
+  CallbackObject *obj = w->_tick_callback_obj;
+  if (obj) {
+    BulletTickCallbackData cbdata(timestep);
+    obj->do_callback(&cbdata);
+  }
 }
 
 ////////////////////////////////////////////////////////////////////
@@ -895,7 +900,7 @@ set_filter_callback(CallbackObject *obj) {
   nassertv(obj != NULL);
 
   if (bullet_filter_algorithm != FA_callback) {
-    bullet_cat.warning() << "filter algorithm is not 'python-callback'" << endl;
+    bullet_cat.warning() << "filter algorithm is not 'callback'" << endl;
   }
 
   _filter_cb3._filter_callback_obj = obj;

+ 2 - 2
panda/src/bullet/bulletWorld.h

@@ -139,7 +139,7 @@ PUBLISHED:
   void set_contact_added_callback(CallbackObject *obj);
   void clear_contact_added_callback();
 
-  void set_tick_callback(CallbackObject *obj);
+  void set_tick_callback(CallbackObject *obj, bool is_pretick=false);
   void clear_tick_callback();
 
   void set_filter_callback(CallbackObject *obj);
@@ -184,7 +184,7 @@ private:
   void sync_p2b(PN_stdfloat dt, int num_substeps);
   void sync_b2p();
 
-  void tick_callback(btDynamicsWorld *world, btScalar timestep);
+  static void tick_callback(btDynamicsWorld *world, btScalar timestep);
 
   typedef PTA(PT(BulletRigidBodyNode)) BulletRigidBodies;
   typedef PTA(PT(BulletSoftBodyNode)) BulletSoftBodies;