Browse Source

*** empty log message ***

David Rose 25 years ago
parent
commit
571e04feae
2 changed files with 22 additions and 27 deletions
  1. 21 27
      direct/src/showbase/showBase.cxx
  2. 1 0
      direct/src/showbase/showBase.h

+ 21 - 27
direct/src/showbase/showBase.cxx

@@ -57,47 +57,38 @@ void render_frame(GraphicsPipe *pipe,
   throw_event("NewFrame");
 }
 
-// to be used with new display callback system
-class DisplayCallback : public GraphicsWindow::Callback {
+class WindowCallback : public GraphicsWindow::Callback {
 public:
-  DisplayCallback(GraphicsPipe *pipe, Node *render, NodeAttributes *initial_state) :
+  WindowCallback(GraphicsPipe *pipe, Node *render, Node *data_root,
+		  NodeAttributes *initial_state) :
     _pipe(pipe),
     _render(render),
+    _data_root(data_root),
     _initial_state(initial_state),
     _app_traverser(RenderRelation::get_class_type()) { }
   
   virtual void draw(bool) {
     _app_traverser.traverse(_render);
-    render_frame(_pipe, *_initial_state);
-  }
-  
-  PT(GraphicsPipe) _pipe;
-  PT(Node) _render;
-  NodeAttributes *_initial_state;
-  AppTraverser _app_traverser;
-};
-
-
-
-// to be used with new display callback system
-class IdleCallback : public GraphicsWindow::Callback {
-public:
-  IdleCallback(Node *render, Node *data_root) {
-    _render = render;
-    _data_root = data_root;
-  }
-  
-  virtual void idle(void) {
     // Initiate the data traversal, to send device data down its
     // respective pipelines.
     traverse_data_graph(_data_root);
     if (collision_traverser != (CollisionTraverser *)NULL) {
       collision_traverser->traverse(_render);
     }
+    render_frame(_pipe, *_initial_state);
   }
   
+  virtual void idle(void) {
+    // We used to do the collision traversal here, but it's better to
+    // do it immediately before the draw, so we don't get one frame of
+    // lag in collision updates.
+  }
+  
+  PT(GraphicsPipe) _pipe;
   PT(Node) _render;
   PT(Node) _data_root;
+  NodeAttributes *_initial_state;
+  AppTraverser _app_traverser;
 };
 
 
@@ -151,12 +142,12 @@ PT(GraphicsWindow) make_graphics_window(GraphicsPipe *pipe,
   main_win = ChanConfig(pipe, conf, camera, render, override);
   assert(main_win != (GraphicsWindow*)0L);
 
-  DisplayCallback *dcb = new DisplayCallback(pipe, render, &initial_state);
-  IdleCallback *icb = new IdleCallback(render, data_root);
+  WindowCallback *wcb = 
+    new WindowCallback(pipe, render, data_root, &initial_state);
 
   // Set draw and idle callbacks
-  main_win->set_draw_callback(dcb);
-  main_win->set_idle_callback(icb);
+  main_win->set_draw_callback(wcb);
+  main_win->set_idle_callback(wcb);
 
   return main_win;
 }
@@ -207,6 +198,9 @@ setup_panda_2d(PT(GraphicsWindow) win) {
 void set_collision_traverser(CollisionTraverser *traverser) {
   collision_traverser = traverser;
 }
+CollisionTraverser *get_collision_traverser() {
+  return collision_traverser;
+}
 // Stop the collision traversal.
 void clear_collision_traverser() {
   collision_traverser = NULL;

+ 1 - 0
direct/src/showbase/showBase.h

@@ -42,6 +42,7 @@ EXPCL_DIRECT PT(GraphicsWindow)
 EXPCL_DIRECT NodePath setup_panda_2d(PT(GraphicsWindow) win);
 
 EXPCL_DIRECT void set_collision_traverser(CollisionTraverser *traverser);
+EXPCL_DIRECT CollisionTraverser *get_collision_traverser();
 EXPCL_DIRECT void clear_collision_traverser();
 
 EXPCL_DIRECT void toggle_wireframe(NodeAttributes &initial_state);