diff --git a/direct/src/showbase/showBase.cxx b/direct/src/showbase/showBase.cxx index d9ac6281c0..22ed16609d 100644 --- a/direct/src/showbase/showBase.cxx +++ b/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; diff --git a/direct/src/showbase/showBase.h b/direct/src/showbase/showBase.h index c13d5ee48a..e0041ba9c8 100644 --- a/direct/src/showbase/showBase.h +++ b/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);