Back to home page

EIC code displayed by LXR

 
 

    


Warning, /include/Geant4/tools/sg/render_action 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 tools_sg_render_action
0005 #define tools_sg_render_action
0006 
0007 #include "matrix_action"
0008 
0009 #include "../glprims"
0010 #include "../colorf"
0011 
0012 namespace tools {
0013 namespace sg {
0014   class render_manager;
0015 }}
0016 
0017 
0018 namespace tools {
0019 namespace sg {
0020 
0021 typedef size_t bufpos;
0022 
0023 class render_action : public matrix_action {
0024   TOOLS_ACTION_NO_COPY(render_action,tools::sg::render_action,matrix_action)
0025 public:
0026   typedef unsigned int gstoid;
0027 public:
0028   virtual void load_proj_matrix(const mat4f&) = 0;
0029   virtual void load_model_matrix(const mat4f&) = 0;
0030 public:
0031   virtual void draw_vertex_array(gl::mode_t,size_t,const float*) = 0;
0032   virtual void draw_vertex_array_xy(gl::mode_t,size_t,const float*) = 0;
0033   virtual void draw_vertex_color_array(gl::mode_t,size_t,const float*,const float*) = 0;
0034   virtual void draw_vertex_normal_array(gl::mode_t,size_t,const float*,const float*) = 0;
0035   virtual void draw_vertex_color_normal_array(gl::mode_t,size_t,const float*,const float*,const float*) = 0;
0036 
0037   /////////////////////////////////////////////////////////////////
0038   /// texture /////////////////////////////////////////////////////
0039   /////////////////////////////////////////////////////////////////
0040   virtual void draw_vertex_array_texture(gl::mode_t,size_t,const float*,gstoid,const float*) = 0;
0041   virtual void draw_vertex_normal_array_texture(gl::mode_t,size_t,const float*,const float*,gstoid,const float*) = 0;
0042 
0043   /////////////////////////////////////////////////////////////////
0044   /// VBO /////////////////////////////////////////////////////////
0045   /////////////////////////////////////////////////////////////////
0046   virtual void begin_gsto(gstoid) = 0;
0047   virtual void draw_gsto_v(gl::mode_t,size_t,bufpos) = 0;
0048   virtual void draw_gsto_vc(gl::mode_t,size_t,bufpos,bufpos) = 0;
0049   virtual void draw_gsto_vn(gl::mode_t,size_t,bufpos,bufpos) = 0;
0050   virtual void draw_gsto_vcn(gl::mode_t,size_t,bufpos,bufpos,bufpos) = 0;
0051   virtual void end_gsto() = 0;
0052   /////////////////////////////////////////////////////////////////
0053   /////////////////////////////////////////////////////////////////
0054   /////////////////////////////////////////////////////////////////
0055 
0056   virtual void clear_color(float,float,float,float) = 0;
0057   virtual void color4f(float,float,float,float) = 0;
0058   virtual void line_width(float) = 0;
0059   virtual void point_size(float) = 0;
0060   virtual void set_polygon_offset(bool) = 0;
0061   virtual void set_winding(winding_type) = 0;
0062   virtual void set_shade_model(shade_type) = 0;
0063   virtual void set_cull_face(bool) = 0;
0064   virtual void set_point_smooth(bool) = 0;
0065   virtual void set_line_smooth(bool) = 0;
0066   virtual void normal(float,float,float) = 0;
0067   virtual void set_depth_test(bool) = 0;
0068   virtual unsigned int max_lights() = 0;
0069   virtual void enable_light(unsigned int,
0070                             float,float,float,             //directrion
0071                             float,float,float,float,       //diffuse RGBA
0072                             float,float,float,float) = 0;  //ambient RGBA
0073   virtual void set_lighting(bool) = 0;
0074   virtual void set_blend(bool) = 0;
0075   virtual void restore_state(unsigned int) = 0;
0076 
0077   virtual sg::render_manager& render_manager() = 0; //sg:: is needed.
0078 public:
0079   render_action(std::ostream& a_out,unsigned int a_ww,unsigned int a_wh)
0080   :parent(a_out,a_ww,a_wh)
0081   ,m_do_transparency(false)
0082   ,m_have_to_do_transparency(false)
0083   {}
0084   virtual ~render_action(){}
0085 public:
0086   render_action(const render_action& a_from)
0087   :parent(a_from)
0088   ,m_do_transparency(a_from.m_do_transparency)
0089   ,m_have_to_do_transparency(a_from.m_have_to_do_transparency)
0090   {}
0091   render_action& operator=(const render_action& a_from){
0092     parent::operator=(a_from);
0093     m_do_transparency = a_from.m_do_transparency;
0094     m_have_to_do_transparency = a_from.m_have_to_do_transparency;
0095     return *this;
0096   }
0097 public:
0098   void set_do_transparency(bool a_value) {m_do_transparency = a_value;}
0099   bool do_transparency() const {return m_do_transparency;}
0100   void set_have_to_do_transparency(bool a_value) {m_have_to_do_transparency = a_value;}
0101   bool have_to_do_transparency() const {return m_have_to_do_transparency;}
0102 
0103   bool have_to_render() {
0104     bool transparent = state().m_color.a()!=1.0f?true:false;
0105     if(transparent && state().m_GL_BLEND) {
0106       if(m_do_transparency) return true;
0107       m_have_to_do_transparency = true;
0108       return false;
0109     }
0110     if(m_do_transparency) return false;
0111     return true;
0112   }
0113 
0114   void load_matrices_to_identity() {
0115     load_proj_matrix(m_identity);
0116     load_model_matrix(m_identity);
0117   }
0118   void load_matrices_from_state() {
0119     const sg::state& _state = state();
0120     load_proj_matrix(_state.m_proj);
0121     load_model_matrix(_state.m_model);
0122   }
0123 
0124   void clear_color(const colorf& a_color){
0125     clear_color(a_color[0],a_color[1],a_color[2],a_color[3]);
0126   }
0127   void color4f(const colorf& a_color){
0128     color4f(a_color[0],a_color[1],a_color[2],a_color[3]);
0129   }
0130 
0131   void enable_light(unsigned int a_light,
0132                     const vec3f& a_dir,
0133                     const colorf& a_col,const colorf& a_ambient) {
0134     enable_light(a_light,
0135                  a_dir[0],a_dir[1],a_dir[2],
0136                  a_col[0],a_col[1],a_col[2],a_col[3],
0137                  a_ambient[0],a_ambient[1],a_ambient[2],a_ambient[3]);
0138   }
0139 
0140   void draw_vertex_array(gl::mode_t a_mode,const std::vector<float>& a_xyzs){
0141     const float* _xyzs = a_xyzs.data();
0142     draw_vertex_array(a_mode,a_xyzs.size(),_xyzs);
0143   }
0144 
0145   void draw_vertex_array_xy(gl::mode_t a_mode,const std::vector<float>& a_xys){
0146     const float* _xys = a_xys.data();
0147     draw_vertex_array_xy(a_mode,a_xys.size(),_xys);
0148   }
0149 
0150   void draw_vertex_color_array(gl::mode_t a_mode,
0151                                const std::vector<float>& a_xyzs,
0152                                const std::vector<float>& a_rgbas){
0153     const float* _xyzs = a_xyzs.data();
0154     const float* _rgbas = a_rgbas.data();
0155     draw_vertex_color_array(a_mode,a_xyzs.size(),_xyzs,_rgbas);
0156   }
0157 
0158   void draw_vertex_normal_array(gl::mode_t a_mode,
0159                                 const std::vector<float>& a_xyzs,
0160                                 const std::vector<float>& a_nms){
0161     const float* _xyzs = a_xyzs.data();
0162     const float* _nms = a_nms.data();
0163     draw_vertex_normal_array(a_mode,a_xyzs.size(),_xyzs,_nms);
0164   }
0165 
0166   void draw_vertex_color_normal_array(gl::mode_t a_mode,
0167                                       const std::vector<float>& a_xyzs,
0168                                       const std::vector<float>& a_rgbas,
0169                                       const std::vector<float>& a_nms){
0170     const float* _xyzs = a_xyzs.data();
0171     const float* _rgbas = a_rgbas.data();
0172     const float* _nms = a_nms.data();
0173     draw_vertex_color_normal_array(a_mode,a_xyzs.size(),_xyzs,_rgbas,_nms);
0174   }
0175 
0176   void normal(const vec3f& a_vec) {normal(a_vec[0],a_vec[1],a_vec[2]);}
0177 
0178 public:
0179   // for sphere::visit template.
0180   bool add_triangles_normal(size_t a_floatn,const float* a_xyzs,const float* a_nms) {
0181     draw_vertex_normal_array(gl::triangles(),a_floatn,a_xyzs,a_nms);
0182     return true;
0183   }
0184   bool add_triangle_fan_normal(size_t a_floatn,const float* a_xyzs,const float* a_nms) {
0185     draw_vertex_normal_array(gl::triangle_fan(),a_floatn,a_xyzs,a_nms);
0186     return true;
0187   }
0188   bool add_triangle_fan_normal_rgba(size_t a_floatn,const float* a_xyzs,float* a_nms,const float* a_rgbas) {
0189     draw_vertex_color_normal_array(gl::triangle_fan(),a_floatn,a_xyzs,a_rgbas,a_nms);
0190     return true;
0191   }
0192   bool add_triangle_strip_normal(size_t a_floatn,const float* a_xyzs,const float* a_nms) {
0193     draw_vertex_normal_array(gl::triangle_strip(),a_floatn,a_xyzs,a_nms);
0194     return true;
0195   }
0196   bool add_triangle_strip_normal_rgba(size_t a_floatn,const float* a_xyzs,const float* a_nms,const float* a_rgbas) {
0197     draw_vertex_color_normal_array(gl::triangle_strip(),a_floatn,a_xyzs,a_rgbas,a_nms);
0198     return true;
0199   }
0200   bool add_lines(size_t a_floatn,const float* a_xyzs) {
0201     draw_vertex_array(gl::lines(),a_floatn,a_xyzs);
0202     return true;
0203   }
0204   bool add_line_loop(size_t a_floatn,const float* a_xyzs) {
0205     draw_vertex_array(gl::line_loop(),a_floatn,a_xyzs);
0206     return true;
0207   }
0208   bool add_line_strip(size_t a_floatn,const float* a_xyzs) {
0209     draw_vertex_array(gl::line_strip(),a_floatn,a_xyzs);
0210     return true;
0211   }
0212   bool add_points(size_t a_floatn,const float* a_xyzs) {
0213     draw_vertex_array(gl::points(),a_floatn,a_xyzs);
0214     return true;
0215   }
0216 
0217   bool add_triangle_fan_texture_normal(size_t a_floatn,const float* a_xyzs,const float* a_nms,gstoid a_tex,const float* a_texs){
0218     draw_vertex_normal_array_texture(gl::triangle_fan(),a_floatn,a_xyzs,a_nms,a_tex,a_texs);
0219     return true;
0220   }
0221   bool add_triangle_strip_texture_normal(size_t a_floatn,const float* a_xyzs,const float* a_nms,gstoid a_tex,const float* a_texs){
0222     draw_vertex_normal_array_texture(gl::triangle_strip(),a_floatn,a_xyzs,a_nms,a_tex,a_texs);
0223     return true;
0224   }
0225 
0226   bool add_line_loop(const std::vector<float>& a_xyzs){
0227     const float* _xyzs = a_xyzs.data();
0228     draw_vertex_array(gl::line_loop(),a_xyzs.size(),_xyzs);
0229     return true;
0230   }
0231 
0232   bool add_line_strip(const std::vector<float>& a_xyzs){
0233     const float* _xyzs = a_xyzs.data();
0234     draw_vertex_array(gl::line_strip(),a_xyzs.size(),_xyzs);
0235     return true;
0236   }
0237 
0238 
0239   bool add_triangle_strip_as_triangles(size_t a_floatn,const float* a_xyzs,const float* a_nms) { //used in sg::sphere, icosahedron_sphere.
0240     // It appears that if glShadeModel is GL_FLAT, triangle strip does not look the same in "gsto mode" where it is rendered as triangles.
0241     // We use this function for immediate rendering, in case we want the same rendering as "gsto mode".
0242 
0243     size_t num = a_floatn/3;
0244     if(num<3) return false;
0245     size_t nxyzs = (num-2)*3*3;
0246 
0247     std::vector<float> m_xyzs(nxyzs);
0248     std::vector<float> m_nms(nxyzs);
0249 
0250    {float* pxyzs = m_xyzs.data();
0251     float* pnms = m_nms.data();
0252     gl::triangle_strip_to_triangles_nms(num,a_xyzs,a_nms,pxyzs,pnms);}
0253 
0254     return add_triangles_normal(nxyzs,m_xyzs.data(),m_nms.data());
0255   }
0256 
0257   void dump_vertex_array_xy(std::ostream& a_out,gl::mode_t /*a_mode*/,size_t a_floatn,const float* a_xys) {
0258     size_t num = a_floatn/2;
0259     if(!num) return;
0260     a_out << "dump_vertex_array_xy : begin : " << num << std::endl;
0261     for(size_t index=0;index<num;index++) {
0262       a_out << "xy : " << index
0263             << " " << a_xys[2*index]
0264             << " " << a_xys[2*index+1]
0265             << std::endl;
0266     }
0267     a_out << "dump_vertex_array_xy : end." << std::endl;
0268   }
0269 protected:
0270   bool m_do_transparency;
0271   bool m_have_to_do_transparency;
0272 };
0273 
0274 }}
0275 
0276 #endif