Back to home page

EIC code displayed by LXR

 
 

    


Warning, /include/Geant4/tools/sg/back_area 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_back_area
0005 #define tools_sg_back_area
0006 
0007 #include "node"
0008 #include "atb_vertices"
0009 #include "rgba"
0010 #include "draw_style"
0011 #include "../mathf"
0012 
0013 #include "separator"
0014 #include "normal"
0015 
0016 namespace tools {
0017 namespace sg {
0018 
0019 class back_area : public node {
0020   TOOLS_NODE(back_area,tools::sg::back_area,node)
0021 public:
0022   static unsigned int corner_top_right()    {return 1<<0;}
0023   static unsigned int corner_top_left()     {return 1<<1;}
0024   static unsigned int corner_bottom_right() {return 1<<2;}
0025   static unsigned int corner_bottom_left()  {return 1<<3;}
0026   static unsigned int corner_all()          {
0027     return corner_top_right()|corner_top_left()|corner_bottom_right()|corner_bottom_left();
0028   }
0029 public:
0030   sf<float> width;
0031   sf<float> height;
0032 
0033   sf_vec<colorf,float> color;
0034 
0035   sf<bool> gradient;
0036   sf_vec<colorf,float> color_top;
0037 
0038   sf<bool> border_visible;
0039   sf_vec<colorf,float> border_color;
0040   sf<float> border_line_width;
0041 
0042   sf<float> shadow; //in percent of width.
0043 
0044   sf<float> corner_radius; //percent of height.
0045   sf<unsigned int> corner_steps;
0046   sf<unsigned int> corner_mask;
0047 public:
0048   virtual const desc_fields& node_desc_fields() const {
0049     TOOLS_FIELD_DESC_NODE_CLASS(tools::sg::back_area)
0050     static const desc_fields s_v(parent::node_desc_fields(),12, //WARNING : take care of count.
0051       TOOLS_ARG_FIELD_DESC(width),
0052       TOOLS_ARG_FIELD_DESC(height),
0053       TOOLS_ARG_FIELD_DESC(color),
0054       TOOLS_ARG_FIELD_DESC(gradient),
0055       TOOLS_ARG_FIELD_DESC(color_top),
0056       TOOLS_ARG_FIELD_DESC(border_visible),
0057       TOOLS_ARG_FIELD_DESC(border_color),
0058       TOOLS_ARG_FIELD_DESC(border_line_width),
0059       TOOLS_ARG_FIELD_DESC(shadow),
0060       TOOLS_ARG_FIELD_DESC(corner_radius),
0061       TOOLS_ARG_FIELD_DESC(corner_steps),
0062       TOOLS_ARG_FIELD_DESC(corner_mask)
0063     );
0064     return s_v;
0065   }
0066 private:
0067   void add_fields(){
0068     add_field(&width);
0069     add_field(&height);
0070 
0071     add_field(&color);
0072     add_field(&gradient);
0073     add_field(&color_top);
0074     add_field(&border_visible);
0075     add_field(&border_color);
0076     add_field(&border_line_width);
0077 
0078     add_field(&shadow);
0079 
0080     add_field(&corner_radius);
0081     add_field(&corner_steps);
0082     add_field(&corner_mask);
0083   }
0084 public:
0085   virtual void render(render_action& a_action) {
0086     if(touched()) {
0087       update_sg();
0088       reset_touched();
0089     }
0090     m_back_sep.render(a_action);
0091   }
0092   virtual void search(search_action& a_action) {
0093     if(touched()) {
0094       update_sg();
0095       reset_touched();
0096     }
0097     parent::search(a_action);
0098     if(a_action.done()) return;
0099     m_back_sep.search(a_action);
0100     if(a_action.done()) return;
0101   }
0102   virtual void pick(pick_action& a_action) {
0103     if(touched()) {
0104       update_sg();
0105       reset_touched();
0106     }
0107     m_back_sep.pick(a_action);
0108   }
0109 public:
0110   back_area()
0111   :parent()
0112   ,width(1)
0113   ,height(1)
0114   ,color(colorf_white())
0115   ,gradient(false)
0116   ,color_top(colorf_white())
0117   ,border_visible(true)
0118   ,border_color(colorf_black())
0119   ,border_line_width(1)
0120   ,shadow(0)
0121   ,corner_radius(0) //in percent of the height.
0122   ,corner_steps(12)
0123   ,corner_mask(corner_all())
0124   {
0125     add_fields();
0126   }
0127   virtual ~back_area(){}
0128 public:
0129   back_area(const back_area& a_from)
0130   :parent(a_from)
0131   ,width(a_from.width)
0132   ,height(a_from.height)
0133   ,color(a_from.color)
0134   ,gradient(a_from.gradient)
0135   ,color_top(a_from.color_top)
0136   ,border_visible(a_from.border_visible)
0137   ,border_color(a_from.border_color)
0138   ,border_line_width(a_from.border_line_width)
0139   ,shadow(a_from.shadow)
0140   ,corner_radius(a_from.corner_radius)
0141   ,corner_steps(a_from.corner_steps)
0142   ,corner_mask(a_from.corner_mask)
0143   {
0144     add_fields();
0145   }
0146   back_area& operator=(const back_area& a_from){
0147     parent::operator=(a_from);
0148     width = a_from.width;
0149     height = a_from.height;
0150     color = a_from.color;
0151     gradient = a_from.gradient;
0152     color_top = a_from.color_top;
0153     border_visible = a_from.border_visible;
0154     border_color = a_from.border_color;
0155     border_line_width = a_from.border_line_width;
0156     shadow = a_from.shadow;
0157     corner_radius = a_from.corner_radius;
0158     corner_steps = a_from.corner_steps;
0159     corner_mask = a_from.corner_mask;
0160     return *this;
0161   }
0162 protected:
0163   void update_sg() {
0164     m_back_sep.clear();
0165 
0166     if(width.value()<=0) return;
0167     if(height.value()<=0) return;
0168 
0169     float xb = -width*0.5f;
0170     float xe =  width*0.5f;
0171     float yb = -height*0.5f;
0172 
0173     float zshadow = -0.005f; //ok with gopaw and ROOT_default.
0174     float zback = 0;
0175     float zborder = 0.01f;
0176 
0177     if(shadow.value()) {
0178       float zz = zback+zshadow;
0179       float ye = height*0.5f;
0180 
0181       sg::rgba* mat = new sg::rgba();
0182       mat->color = colorf_black();
0183       m_back_sep.add(mat);
0184 
0185       normal* nm = new normal;
0186       //nm->vec.value(); //default is z. ok.
0187       m_back_sep.add(nm);
0188 
0189       vertices* vtxs = new vertices;
0190       vtxs->mode = gl::triangle_fan();
0191       m_back_sep.add(vtxs);
0192 
0193       float dx = width*shadow;
0194       float dy = -dx;
0195       vtxs->add(xb+dx,yb+dy,zz);
0196       vtxs->add(xe+dx,yb+dy,zz);
0197       vtxs->add(xe+dx,ye+dy,zz);
0198       vtxs->add(xb+dx,ye+dy,zz);
0199     }
0200 
0201    {//background :
0202     normal* nm = new normal;
0203     //nm->vec.value(); //default is z. ok.
0204     m_back_sep.add(nm);
0205 
0206     if(gradient.value()) {
0207       //color gradient from (bottom,color) to (top,color_top)
0208 
0209       atb_vertices* vtxs = new atb_vertices;
0210       vtxs->mode = gl::triangle_strip();
0211       m_back_sep.add(vtxs);
0212 
0213       float zz = zback;
0214 
0215       unsigned int ncol = 50;
0216       float dy = height/ncol;
0217       float ye = yb+dy;
0218 
0219       colorf col_beg = color.value();
0220       colorf col_end = color_top.value();
0221 
0222       float dr = (col_end.r()-col_beg.r())/ncol;
0223       float dg = (col_end.g()-col_beg.g())/ncol;
0224       float db = (col_end.b()-col_beg.b())/ncol;
0225       float da = (col_end.a()-col_beg.a())/ncol;
0226       vec4f dcol(dr,dg,db,da);
0227 
0228       colorf col = col_beg;
0229 
0230       vtxs->add(xb,yb,zz);
0231       vtxs->add_color(col);
0232 
0233       vtxs->add(xe,yb,zz);
0234       vtxs->add_color(col);
0235 
0236       for(unsigned int index=0;index<ncol;index++) {
0237         vtxs->add(xb,ye,zz);
0238         vtxs->add(xe,ye,zz);
0239 
0240         vtxs->add_color(col);
0241         vtxs->add_color(col);
0242 
0243         ye  += dy;
0244         col += dcol;
0245       }
0246 
0247     } else {
0248 
0249       float zz = zback;
0250       float ye =  height*0.5f;
0251 
0252       sg::rgba* mat = new sg::rgba();
0253       mat->color = color;
0254       m_back_sep.add(mat);
0255 
0256       vertices* vtxs = new vertices;
0257       vtxs->mode = gl::triangle_fan();
0258       m_back_sep.add(vtxs);
0259 
0260       float r = height*corner_radius;
0261       if((r>(0.5f*height.value()))||(r>(0.5f*width.value()))) r = 0;
0262 
0263       if((r>0) && corner_steps.value()) {
0264         float dangle = fhalf_pi()/float(corner_steps);
0265         unsigned int nslice = corner_steps;
0266 
0267         vtxs->add(0,0,zz);
0268         vtxs->add(xe,yb+r,zz);
0269         vtxs->add(xe,ye-r,zz);
0270 
0271         // top-right :
0272         float angle = dangle;
0273         if(corner_mask.value() & corner_top_right()) {
0274           float xc = xe-r;
0275           float yc = ye-r;
0276           for(unsigned int i=0;i<nslice;i++,angle+=dangle) {
0277             vtxs->add(r*fcos(angle)+xc,r*fsin(angle)+yc,zz);
0278           }
0279         } else {
0280           angle += fhalf_pi();
0281           vtxs->add(xe,ye,zz);
0282           vtxs->add(xe-r,ye,zz);
0283         }
0284 
0285         vtxs->add(xb+r,ye,zz);
0286 
0287         // top-left :
0288         if(corner_mask.value() & corner_top_left()) {
0289           float xc = xb+r;
0290           float yc = ye-r;
0291           for(unsigned int i=0;i<nslice;i++,angle+=dangle) {
0292             vtxs->add(r*fcos(angle)+xc,r*fsin(angle)+yc,zz);
0293           }
0294         } else {
0295           angle += fhalf_pi();
0296           vtxs->add(xb,ye,zz);
0297           vtxs->add(xb,ye-r,zz);
0298         }
0299 
0300         vtxs->add(xb,yb+r,zz);
0301 
0302         // bottom-left :
0303         if(corner_mask.value() & corner_bottom_left()) {
0304           float xc = xb+r;
0305           float yc = yb+r;
0306           for(unsigned int i=0;i<nslice;i++,angle+=dangle) {
0307             vtxs->add(r*fcos(angle)+xc,r*fsin(angle)+yc,zz);
0308           }
0309         } else {
0310           angle += fhalf_pi();
0311           vtxs->add(xb,yb,zz);
0312           vtxs->add(xb+r,yb,zz);
0313         }
0314 
0315         vtxs->add(xe-r,yb,zz);
0316 
0317         // bottom-right :
0318         if(corner_mask.value() & corner_bottom_right()) {
0319           float xc = xe-r;
0320           float yc = yb+r;
0321           for(unsigned int i=0;i<nslice;i++,angle+=dangle) {
0322             vtxs->add(r*fcos(angle)+xc,r*fsin(angle)+yc,zz);
0323           }
0324         } else {
0325           angle += fhalf_pi();
0326           vtxs->add(xe,yb,zz);
0327           vtxs->add(xe,yb+r,zz);
0328         }
0329 
0330       } else {
0331         vtxs->add(xb,yb,zz);
0332         vtxs->add(xe,yb,zz);
0333         vtxs->add(xe,ye,zz);
0334         vtxs->add(xb,ye,zz);
0335       }
0336 
0337     }}
0338 
0339     if(border_visible.value()){
0340       float zz = zborder;
0341       float ye = height*0.5f;
0342 
0343       sg::rgba* mat = new sg::rgba();
0344       mat->color = border_color;
0345       m_back_sep.add(mat);
0346 
0347       draw_style* ds = new draw_style;
0348       ds->style = draw_lines;
0349       ds->line_width = border_line_width;
0350       m_back_sep.add(ds);
0351 
0352       vertices* vtxs = new vertices;
0353       vtxs->mode = gl::line_strip();
0354       m_back_sep.add(vtxs);
0355 
0356       float r = height*corner_radius;
0357       if((r>(0.5f*height.value()))||(r>(0.5f*width.value()))) r = 0;
0358 
0359       if((r>0) && corner_steps.value()) {
0360         float dangle = fhalf_pi()/float(corner_steps);
0361         unsigned int nslice = corner_steps;
0362 
0363         vtxs->add(xe,yb+r,zz);
0364         vtxs->add(xe,ye-r,zz);
0365 
0366         // top-right :
0367         float angle = dangle;
0368         if(corner_mask.value() & corner_top_right()) {
0369           float xc = xe-r;
0370           float yc = ye-r;
0371           for(unsigned int i=0;i<nslice;i++,angle+=dangle) {
0372             vtxs->add(r*fcos(angle)+xc,r*fsin(angle)+yc,zz);
0373           }
0374         } else {
0375           angle += fhalf_pi();
0376           vtxs->add(xe,ye,zz);
0377           vtxs->add(xe-r,ye,zz);
0378         }
0379 
0380         vtxs->add(xb+r,ye,zz);
0381 
0382         // top-left :
0383         if(corner_mask.value() & corner_top_left()) {
0384           float xc = xb+r;
0385           float yc = ye-r;
0386           for(unsigned int i=0;i<nslice;i++,angle+=dangle) {
0387             vtxs->add(r*fcos(angle)+xc,r*fsin(angle)+yc,zz);
0388           }
0389         } else {
0390           angle += fhalf_pi();
0391           vtxs->add(xb,ye,zz);
0392           vtxs->add(xb,ye-r,zz);
0393         }
0394 
0395         vtxs->add(xb,yb+r,zz);
0396 
0397         // bottom-left :
0398         if(corner_mask.value() & corner_bottom_left()) {
0399           float xc = xb+r;
0400           float yc = yb+r;
0401           for(unsigned int i=0;i<nslice;i++,angle+=dangle) {
0402             vtxs->add(r*fcos(angle)+xc,r*fsin(angle)+yc,zz);
0403           }
0404         } else {
0405           angle += fhalf_pi();
0406           vtxs->add(xb,yb,zz);
0407           vtxs->add(xb+r,yb,zz);
0408         }
0409 
0410         vtxs->add(xe-r,yb,zz);
0411 
0412         // bottom-right :
0413         if(corner_mask.value() & corner_bottom_right()) {
0414           float xc = xe-r;
0415           float yc = yb+r;
0416           for(unsigned int i=0;i<nslice;i++,angle+=dangle) {
0417             vtxs->add(r*fcos(angle)+xc,r*fsin(angle)+yc,zz);
0418           }
0419         } else {
0420           angle += fhalf_pi();
0421           vtxs->add(xe,yb,zz);
0422           vtxs->add(xe,yb+r,zz);
0423         }
0424 
0425       } else {
0426         vtxs->add(xb,yb,zz);
0427         vtxs->add(xe,yb,zz);
0428         vtxs->add(xe,ye,zz);
0429         vtxs->add(xb,ye,zz);
0430         vtxs->add(xb,yb,zz);
0431       }
0432     }
0433 
0434   }
0435 protected:
0436   separator m_back_sep;
0437 };
0438 
0439 }}
0440 
0441 #endif