contrib/brl/bbas/bgui3d/bgui3d_tableau.cxx

Go to the documentation of this file.
00001 // This is brl/bbas/bgui3d/bgui3d_tableau.cxx
00002 #include "bgui3d_tableau.h"
00003 //:
00004 // \file
00005 
00006 #include "bgui3d_translate_event.h"
00007 #include <vgui/vgui_gl.h>
00008 #include <vgui/vgui_macro.h>
00009 
00010 #include <Inventor/SbColor.h>
00011 #include <Inventor/SoDB.h>
00012 #include <Inventor/SbViewportRegion.h>
00013 #include <Inventor/nodes/SoNode.h>
00014 #include <Inventor/SoSceneManager.h>
00015 #include <Inventor/actions/SoGLRenderAction.h>
00016 
00017 
00018 //: The callback called by the scene manager to initiate a redraw
00019 static void
00020 bgui3d_render_callback(void *tableau, SoSceneManager *mgr)
00021 {
00022   bgui3d_tableau * tab = (bgui3d_tableau *) tableau;
00023   tab->request_render();
00024 }
00025 
00026 //: The callback called by the overlay scene manager to initiate a redraw
00027 static void
00028 bgui3d_render_overlay_callback(void *tableau, SoSceneManager *mgr)
00029 {
00030   bgui3d_tableau * tab = (bgui3d_tableau *) tableau;
00031   tab->request_render_overlay();
00032 }
00033 
00034 //------------------------------------------------------------------
00035 
00036 //: Constructor - don't use this, use bgui3d_tableau_new.
00037 bgui3d_tableau::bgui3d_tableau(SoNode * scene_root)
00038  : scene_root_(NULL), overlay_scene_root_(NULL),
00039    scene_manager_(NULL), overlay_scene_manager_(NULL),
00040    idle_enabled_(false), interaction_type_(SCENEGRAPH)
00041 {
00042   this->set_scene_root(scene_root);
00043 }
00044 
00045 
00046 //: Destructor
00047 bgui3d_tableau::~bgui3d_tableau()
00048 {
00049   this->disable_idle();
00050 
00051   if (scene_root_)
00052     scene_root_->unref();
00053   if (overlay_scene_root_)
00054     overlay_scene_root_->unref();
00055 
00056   //: Ming: no need to release memory of the SoSceneManager* scene_manager_
00057   ///if (scene_manager_)
00058   ///  delete scene_manager_;
00059 
00060   //: Ming: no need to release memory of the SoSceneManager* overlay_scene_manager_
00061   ///if (overlay_scene_manager_)
00062   ///  delete overlay_scene_manager_;
00063 }
00064 
00065 
00066 vcl_string bgui3d_tableau::type_name() const {return "bgui3d_tableau";}
00067 
00068 
00069 //: Set up OpenGL for rendering
00070 void
00071 bgui3d_tableau::setup_opengl() const
00072 {
00073   // This call is still needed on the linux side
00074   glEnable(GL_DEPTH_TEST);
00075 
00076   glLineWidth( 1.0 );
00077   glPointSize( 1.0 );
00078 }
00079 
00080 
00081 //: Render the scene graph (called on draw events)
00082 bool
00083 bgui3d_tableau::render()
00084 {
00085   if (!scene_manager_)
00086     return false;
00087 
00088   glPushAttrib(GL_ALL_ATTRIB_BITS);
00089 
00090   // Set up OpenGL for Rendering
00091   this->setup_opengl();
00092 
00093   // Update the scene manager if the viewport has changed
00094   GLint vp[4];
00095   glGetIntegerv(GL_VIEWPORT, vp);
00096   SbViewportRegion vguiViewport;
00097   vguiViewport.setViewportPixels(vp[0], vp[1], vp[2], vp[3]);
00098 
00099   if ( !(scene_manager_->getViewportRegion() == vguiViewport) ) {
00100     scene_manager_->setViewportRegion(vguiViewport);
00101   }
00102 
00103   // Reinitialize to account for changes in the OpenGL context
00104   scene_manager_->reinitialize();
00105 
00106   // Do the rendering
00107   scene_manager_->render(scene_manager_->getGLRenderAction(), false, false);
00108 
00109   glPopAttrib();
00110 
00111   return true;
00112 }
00113 
00114 
00115 //: Render the overlay scene graph (called on draw overlay events)
00116 bool
00117 bgui3d_tableau::render_overlay()
00118 {
00119   if (!overlay_scene_manager_)
00120     return false;
00121 
00122   glPushAttrib(GL_ALL_ATTRIB_BITS);
00123 
00124   // Set up OpenGL for Rendering
00125   this->setup_opengl();
00126 
00127   // Update the scene manager if the viewport has changed
00128   GLint vp[4];
00129   glGetIntegerv(GL_VIEWPORT, vp);
00130   SbViewportRegion vguiViewport;
00131   vguiViewport.setViewportPixels(vp[0], vp[1], vp[2], vp[3]);
00132 
00133   if ( !(overlay_scene_manager_->getViewportRegion() == vguiViewport) ) {
00134     overlay_scene_manager_->setViewportRegion(vguiViewport);
00135   }
00136 
00137   // Reinitialize to account for changes in the OpenGL context
00138   overlay_scene_manager_->reinitialize();
00139 
00140   // Do the rendering
00141   overlay_scene_manager_->render(overlay_scene_manager_->getGLRenderAction(),false,false);
00142 
00143   glPopAttrib();
00144 
00145   return true;
00146 }
00147 
00148 
00149 //: Handle vgui events
00150 bool bgui3d_tableau::handle(const vgui_event& e)
00151 {
00152   // Handle draw events
00153   if ( e.type == vgui_DRAW )
00154     return this->render();
00155 
00156   if ( e.type == vgui_DRAW_OVERLAY )
00157     return this->render_overlay();
00158 
00159   if (!scene_manager_)
00160     return false;
00161 
00162   // Attempt to convert all unhandled events to SoEvents
00163   // and pass the SoEvents to the scene graph for handling
00164   SoDB::getSensorManager()->processDelayQueue(TRUE);
00165   SoDB::getSensorManager()->processTimerQueue();
00166   if ( interaction_type_ == SCENEGRAPH )
00167   {
00168     bool handled = false;
00169     SoEvent* event = bgui3d_translate_event(e);
00170     if (event) {
00171       handled = scene_manager_->processEvent(event) > 0;
00172       if (handled)
00173         return true;
00174     }
00175   }
00176   request_render();
00177 
00178   return vgui_tableau::handle(e);
00179 }
00180 
00181 
00182 bool
00183 bgui3d_tableau::idle()
00184 {
00185   SoDB::getSensorManager()->processTimerQueue();
00186   SoDB::getSensorManager()->processDelayQueue(TRUE);
00187   return idle_enabled_;
00188 }
00189 
00190 
00191 //: Enable handling of idle events
00192 void
00193 bgui3d_tableau::enable_idle()
00194 {
00195   idle_enabled_ = true;
00196   this->post_idle_request();
00197 }
00198 
00199 
00200 //: Disable handling of idle events
00201 void
00202 bgui3d_tableau::disable_idle()
00203 {
00204   idle_enabled_ = false;
00205 }
00206 
00207 
00208 //: Returns true if idle event handling is enabled
00209 bool
00210 bgui3d_tableau::is_idle_enabled()
00211 {
00212   return idle_enabled_;
00213 }
00214 
00215 
00216 //: Called when the scene manager requests a render action
00217 void
00218 bgui3d_tableau::request_render()
00219 {
00220   this->post_redraw();
00221 }
00222 
00223 
00224 //: Called when the overlay scene manager requests a render action
00225 void
00226 bgui3d_tableau::request_render_overlay()
00227 {
00228   this->post_overlay_redraw();
00229 }
00230 
00231 
00232 //: Set scene root node
00233 void
00234 bgui3d_tableau::set_scene_root(SoNode* scene_root)
00235 {
00236   if (scene_root_)
00237     scene_root_->unref();
00238   scene_root_ = scene_root;
00239   if (scene_root_)
00240     scene_root_->ref();
00241 
00242   if (scene_root_) {
00243     if (!scene_manager_)
00244     {
00245       scene_manager_ = new SoSceneManager();
00246       scene_manager_->getGLRenderAction()->setTransparencyType(SoGLRenderAction::SORTED_OBJECT_BLEND);
00247       //DELAYED_BLEND
00248     }
00249     else
00250       scene_manager_->deactivate();
00251 
00252     scene_manager_->setSceneGraph(scene_root_);
00253     scene_manager_->setRenderCallback(bgui3d_render_callback, this);
00254     scene_manager_->activate();
00255   }
00256 }
00257 
00258 
00259 //: Set overlay scene root node
00260 void
00261 bgui3d_tableau::set_overlay_scene_root(SoNode* scene_root)
00262 {
00263   if (overlay_scene_root_)
00264     overlay_scene_root_->unref();
00265   overlay_scene_root_ = scene_root;
00266   if (overlay_scene_root_)
00267     overlay_scene_root_->ref();
00268 
00269   if (overlay_scene_root_) {
00270     if (!overlay_scene_manager_)
00271       overlay_scene_manager_ = new SoSceneManager();
00272     else
00273       overlay_scene_manager_->deactivate();
00274 
00275     overlay_scene_manager_->setSceneGraph(scene_root_);
00276     overlay_scene_manager_->setRenderCallback(bgui3d_render_overlay_callback, this);
00277     overlay_scene_manager_->activate();
00278   }
00279 }
00280 
00281 
00282 //: Set the scene camera
00283 // creates a graphics camera from a vpgl camera (either perspective or affine)
00284 bool
00285 bgui3d_tableau::set_camera(const vpgl_proj_camera<double>& camera)
00286 {
00287   return false;
00288 }
00289 
00290 
00291 //: Get the scene camera
00292 // creates a vpgl camera (either perspective or affine) from the graphics camera
00293 vcl_auto_ptr<vpgl_proj_camera<double> >
00294 bgui3d_tableau::camera() const
00295 {
00296   return vcl_auto_ptr<vpgl_proj_camera<double> >(NULL);
00297 }
00298 
00299 
00300 void
00301 bgui3d_tableau::set_viewport_region(const SbViewportRegion& region)
00302 {
00303   if (region.getWindowSize()[0] == -1) return;
00304 
00305   scene_manager_->setViewportRegion(region);
00306   overlay_scene_manager_->setViewportRegion(region);
00307 }
00308 
00309 const SbViewportRegion &
00310 bgui3d_tableau::get_viewport_region() const
00311 {
00312   return scene_manager()->getViewportRegion();
00313 }
00314 
00315 //: Set the interaction type
00316 void
00317 bgui3d_tableau::set_interaction_type(interaction_type_enum type)
00318 {
00319   interaction_type_ = type;
00320 }
00321 
00322 //: Get the interaction type
00323 bgui3d_tableau::interaction_type_enum
00324 bgui3d_tableau::interaction_type() const
00325 {
00326   return interaction_type_;
00327 }
00328 
00329 
00330 SoSceneManager*
00331 bgui3d_tableau::scene_manager() const
00332 {
00333   if (!scene_manager_)
00334   {
00335     SoSceneManager*& sm = const_cast<SoSceneManager*&>(scene_manager_);
00336     sm = new SoSceneManager();
00337     sm->getGLRenderAction()->setTransparencyType(SoGLRenderAction::SORTED_OBJECT_BLEND);
00338     //BLEND
00339   }
00340   return scene_manager_;
00341 }

Generated on Mon Mar 8 05:31:57 2010 for contrib/brl/bbas/bgui3d by  doxygen 1.5.1