Back to home page

EIC code displayed by LXR

 
 

    


Warning, /include/Geant4/toolx/X11/sg_viewer is written in an unsupported language. File is not indexed.

0001 // Copyright (C) 2010, Guy Barrand. All rights reserved.
0002 // See the file tools.license for terms.
0003 
0004 #ifndef toolx_X11_sg_viewer
0005 #define toolx_X11_sg_viewer
0006 
0007 #ifndef GL_GLEXT_LEGACY
0008 #define GL_GLEXT_LEGACY
0009 #endif
0010 #include <GL/gl.h>
0011 
0012 #ifndef GL_GLEXT_PROTOTYPES
0013 #define GL_GLEXT_PROTOTYPES
0014 #endif
0015 #include <GL/glext.h>
0016 
0017 #include "session"
0018 
0019 #include "../GL/gl_functions"
0020 
0021 #include "../sg/GL_action"
0022 #include "../sg/GL_viewer"
0023 
0024 namespace toolx {
0025 namespace sg {
0026   using GL_action = GL_action_T<GL::gl_functions>;
0027   using GL_manager = GL_manager_T<GL::gl_functions>;
0028   using GL_viewer = GL_viewer_T<GL_manager,GL_action>;
0029 }}
0030 
0031 #include "simple_dispatcher"
0032 
0033 #include <tools/sg/device_interactor>
0034 
0035 namespace toolx {
0036 namespace X11 {
0037 
0038 class sg_viewer: public sg::GL_viewer {
0039   typedef sg::GL_viewer parent;
0040 private:
0041   class dispatcher : public simple_dispatcher {
0042     typedef simple_dispatcher parent;
0043   public:
0044     virtual bool dispatch(XEvent& a_event) {
0045       if(parent::dispatch(a_event)) return true;
0046       bool shift_modifier = a_event.xkey.state & ShiftMask;
0047       bool control_modifier = a_event.xkey.state & ControlMask;
0048       if(a_event.type==ButtonPress && a_event.xbutton.button==1) {
0049         if(!m_viewer.device_interactor()) return false;
0050         tools::sg::mouse_down_event event(a_event.xbutton.x,a_event.xbutton.y,shift_modifier,control_modifier);
0051         m_viewer.device_interactor()->mouse_press(event);
0052         return true;
0053       } else if(a_event.type==ButtonRelease && a_event.xbutton.button==1) {
0054         if(!m_viewer.device_interactor()) return false;
0055         tools::sg::mouse_up_event event(a_event.xbutton.x,a_event.xbutton.y,shift_modifier,control_modifier);
0056         m_viewer.device_interactor()->mouse_release(event);
0057         return true;
0058       } else if(a_event.type==MotionNotify) {
0059         if(!m_viewer.device_interactor()) return false;
0060         if((a_event.xmotion.state & Button1MotionMask)==Button1MotionMask) {
0061           tools::sg::mouse_move_event event(a_event.xmotion.x,a_event.xmotion.y,shift_modifier,control_modifier,0,0,false);
0062           m_viewer.device_interactor()->mouse_move(event);
0063         }
0064       } else if((a_event.type==ButtonPress)&&(a_event.xbutton.button==4)) { // mouse scrollwheel down :
0065         if(!m_viewer.device_interactor()) return false;
0066         tools::sg::wheel_rotate_event event(8,a_event.xbutton.x,a_event.xbutton.y,shift_modifier,control_modifier);  //8=cooking.
0067         m_viewer.device_interactor()->wheel_rotate(event);
0068         return true;
0069       } else if((a_event.type==ButtonPress)&&(a_event.xbutton.button==5)) { // mouse scrollwheel up :
0070         if(!m_viewer.device_interactor()) return false;
0071         tools::sg::wheel_rotate_event event(-8,a_event.xbutton.x,a_event.xbutton.y,shift_modifier,control_modifier);  //8=cooking.
0072         m_viewer.device_interactor()->wheel_rotate(event);
0073         return true;
0074       }
0075       return false;
0076     }
0077     virtual void win_render() {m_viewer.win_render();}
0078     virtual void set_size(unsigned int a_width,unsigned int a_height) {m_viewer.set_size(a_width,a_height);}
0079     virtual dispatcher* copy() const {return new dispatcher(*this);}
0080   public:
0081     dispatcher(sg_viewer& a_viewer)
0082     :parent(a_viewer.m_session,a_viewer.m_win)
0083     ,m_viewer(a_viewer){}
0084     virtual ~dispatcher(){}
0085   protected:
0086     dispatcher(const dispatcher& a_from)
0087     :parent(a_from)
0088     ,m_viewer(a_from.m_viewer)
0089     {}
0090     dispatcher& operator=(const dispatcher& a_from) {
0091       parent::operator=(a_from);
0092       return *this;
0093     }
0094   protected:
0095     sg_viewer& m_viewer;
0096   };
0097 
0098 public:
0099   sg_viewer(session& a_session,
0100             int a_x = 0,int a_y = 0,
0101             unsigned int a_width = 500,unsigned int a_height = 500,
0102             const std::string& a_win_title = "")
0103   :parent(a_session.out(),a_width,a_height)
0104   ,m_session(a_session)
0105   ,m_win(0)
0106   ,m_interactor(0)
0107   {
0108     if(!m_session.display()) return; //throw
0109     m_win = m_session.create_window(a_win_title.c_str(),a_x,a_y,a_width,a_height);
0110     if(!m_win) return; //throw
0111     m_session.add_dispatcher(new dispatcher(*this));
0112   }
0113   virtual ~sg_viewer() {
0114     if(m_win) {
0115       m_session.remove_dispatchers_with_window(m_win);
0116       m_session.delete_window(m_win);
0117       m_session.sync();
0118     }
0119   }
0120 protected:
0121   sg_viewer(const sg_viewer& a_from)
0122   :parent(a_from)
0123   ,m_session(a_from.m_session)
0124   ,m_win(a_from.m_win)
0125   ,m_interactor(0)
0126   {}
0127   sg_viewer& operator=(const sg_viewer& a_from){
0128     parent::operator=(a_from);
0129     m_win = a_from.m_win;
0130     return *this;
0131   }
0132 public:
0133   bool has_window() const {return m_win?true:false;} //for SWIG
0134 
0135   Window window() const {return m_win;}
0136 
0137   bool show() {
0138     if(!m_win) return false;
0139     m_session.show_window(m_win);
0140     return true;
0141   }
0142 
0143   void win_render() {
0144     if(!m_win) return;
0145     if(::glXMakeCurrent(m_session.display(),m_win,m_session.context())==False){
0146       m_session.out() << "toolx::X11::sg_viewer::win_render : glXMakeCurrent failed." << std::endl;
0147       return;
0148     }
0149     render(); //viewer::render()
0150     ::glXSwapBuffers(m_session.display(),m_win);
0151     if(::glXMakeCurrent(m_session.display(),None,NULL)==False){
0152       m_session.out() << "toolx::X11::sg_viewer::win_render : glXMakeCurrent(None,NULL) failed." << std::endl;
0153     }
0154     m_session.sync();
0155   }
0156 
0157   void emit_win_render() {
0158     if(!m_win) return;
0159     m_session.post_expose(m_win);
0160   }
0161 
0162   bool window_size(unsigned int& a_w,unsigned int& a_h) {
0163     if(!m_win) {a_w = 0;a_h = 0;return false;}
0164     int width,height;
0165     if(!m_session.window_size(m_win,width,height)) {a_w = 0;a_h = 0;return false;}
0166     a_w = (unsigned int)width;
0167     a_h = (unsigned int)height;
0168     return true;
0169   }
0170   void render_area_size(unsigned int& a_w,unsigned int& a_h) {
0171     a_w = parent::width();
0172     a_h = parent::height();
0173   }
0174 
0175   void set_device_interactor(tools::sg::device_interactor* a_interactor) {m_interactor = a_interactor;}
0176 
0177 public:
0178   tools::sg::device_interactor* device_interactor() {return m_interactor;}
0179 protected:
0180   session& m_session;
0181   Window m_win;
0182   tools::sg::device_interactor* m_interactor;
0183 };
0184 
0185 }}
0186 
0187 #endif