00001
00002 #include "bgui3d_tableau.h"
00003
00004
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
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
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
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
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
00057
00058
00059
00060
00061
00062
00063 }
00064
00065
00066 vcl_string bgui3d_tableau::type_name() const {return "bgui3d_tableau";}
00067
00068
00069
00070 void
00071 bgui3d_tableau::setup_opengl() const
00072 {
00073
00074 glEnable(GL_DEPTH_TEST);
00075
00076 glLineWidth( 1.0 );
00077 glPointSize( 1.0 );
00078 }
00079
00080
00081
00082 bool
00083 bgui3d_tableau::render()
00084 {
00085 if (!scene_manager_)
00086 return false;
00087
00088 glPushAttrib(GL_ALL_ATTRIB_BITS);
00089
00090
00091 this->setup_opengl();
00092
00093
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
00104 scene_manager_->reinitialize();
00105
00106
00107 scene_manager_->render(scene_manager_->getGLRenderAction(), false, false);
00108
00109 glPopAttrib();
00110
00111 return true;
00112 }
00113
00114
00115
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
00125 this->setup_opengl();
00126
00127
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
00138 overlay_scene_manager_->reinitialize();
00139
00140
00141 overlay_scene_manager_->render(overlay_scene_manager_->getGLRenderAction(),false,false);
00142
00143 glPopAttrib();
00144
00145 return true;
00146 }
00147
00148
00149
00150 bool bgui3d_tableau::handle(const vgui_event& e)
00151 {
00152
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
00163
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
00192 void
00193 bgui3d_tableau::enable_idle()
00194 {
00195 idle_enabled_ = true;
00196 this->post_idle_request();
00197 }
00198
00199
00200
00201 void
00202 bgui3d_tableau::disable_idle()
00203 {
00204 idle_enabled_ = false;
00205 }
00206
00207
00208
00209 bool
00210 bgui3d_tableau::is_idle_enabled()
00211 {
00212 return idle_enabled_;
00213 }
00214
00215
00216
00217 void
00218 bgui3d_tableau::request_render()
00219 {
00220 this->post_redraw();
00221 }
00222
00223
00224
00225 void
00226 bgui3d_tableau::request_render_overlay()
00227 {
00228 this->post_overlay_redraw();
00229 }
00230
00231
00232
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
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
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
00283
00284 bool
00285 bgui3d_tableau::set_camera(const vpgl_proj_camera<double>& camera)
00286 {
00287 return false;
00288 }
00289
00290
00291
00292
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
00316 void
00317 bgui3d_tableau::set_interaction_type(interaction_type_enum type)
00318 {
00319 interaction_type_ = type;
00320 }
00321
00322
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
00339 }
00340 return scene_manager_;
00341 }