Geant4 Cross Reference

Cross-Referencing   Geant4
Geant4/externals/g4tools/include/tools/sg/back_area

Version: [ ReleaseNotes ] [ 1.0 ] [ 1.1 ] [ 2.0 ] [ 3.0 ] [ 3.1 ] [ 3.2 ] [ 4.0 ] [ 4.0.p1 ] [ 4.0.p2 ] [ 4.1 ] [ 4.1.p1 ] [ 5.0 ] [ 5.0.p1 ] [ 5.1 ] [ 5.1.p1 ] [ 5.2 ] [ 5.2.p1 ] [ 5.2.p2 ] [ 6.0 ] [ 6.0.p1 ] [ 6.1 ] [ 6.2 ] [ 6.2.p1 ] [ 6.2.p2 ] [ 7.0 ] [ 7.0.p1 ] [ 7.1 ] [ 7.1.p1 ] [ 8.0 ] [ 8.0.p1 ] [ 8.1 ] [ 8.1.p1 ] [ 8.1.p2 ] [ 8.2 ] [ 8.2.p1 ] [ 8.3 ] [ 8.3.p1 ] [ 8.3.p2 ] [ 9.0 ] [ 9.0.p1 ] [ 9.0.p2 ] [ 9.1 ] [ 9.1.p1 ] [ 9.1.p2 ] [ 9.1.p3 ] [ 9.2 ] [ 9.2.p1 ] [ 9.2.p2 ] [ 9.2.p3 ] [ 9.2.p4 ] [ 9.3 ] [ 9.3.p1 ] [ 9.3.p2 ] [ 9.4 ] [ 9.4.p1 ] [ 9.4.p2 ] [ 9.4.p3 ] [ 9.4.p4 ] [ 9.5 ] [ 9.5.p1 ] [ 9.5.p2 ] [ 9.6 ] [ 9.6.p1 ] [ 9.6.p2 ] [ 9.6.p3 ] [ 9.6.p4 ] [ 10.0 ] [ 10.0.p1 ] [ 10.0.p2 ] [ 10.0.p3 ] [ 10.0.p4 ] [ 10.1 ] [ 10.1.p1 ] [ 10.1.p2 ] [ 10.1.p3 ] [ 10.2 ] [ 10.2.p1 ] [ 10.2.p2 ] [ 10.2.p3 ] [ 10.3 ] [ 10.3.p1 ] [ 10.3.p2 ] [ 10.3.p3 ] [ 10.4 ] [ 10.4.p1 ] [ 10.4.p2 ] [ 10.4.p3 ] [ 10.5 ] [ 10.5.p1 ] [ 10.6 ] [ 10.6.p1 ] [ 10.6.p2 ] [ 10.6.p3 ] [ 10.7 ] [ 10.7.p1 ] [ 10.7.p2 ] [ 10.7.p3 ] [ 10.7.p4 ] [ 11.0 ] [ 11.0.p1 ] [ 11.0.p2 ] [ 11.0.p3, ] [ 11.0.p4 ] [ 11.1 ] [ 11.1.1 ] [ 11.1.2 ] [ 11.1.3 ] [ 11.2 ] [ 11.2.1 ] [ 11.2.2 ] [ 11.3.0 ]

Diff markup

Differences between /externals/g4tools/include/tools/sg/back_area (Version 11.3.0) and /externals/g4tools/include/tools/sg/back_area (Version 3.0)


  1 // Copyright (C) 2010, Guy Barrand. All rights    
  2 // See the file tools.license for terms.          
  3                                                   
  4 #ifndef tools_sg_back_area                        
  5 #define tools_sg_back_area                        
  6                                                   
  7 #include "node"                                   
  8 #include "atb_vertices"                           
  9 #include "rgba"                                   
 10 #include "draw_style"                             
 11 #include "../mathf"                               
 12                                                   
 13 #include "separator"                              
 14 #include "normal"                                 
 15                                                   
 16 namespace tools {                                 
 17 namespace sg {                                    
 18                                                   
 19 class back_area : public node {                   
 20   TOOLS_NODE(back_area,tools::sg::back_area,no    
 21 public:                                           
 22   static unsigned int corner_top_right()    {r    
 23   static unsigned int corner_top_left()     {r    
 24   static unsigned int corner_bottom_right() {r    
 25   static unsigned int corner_bottom_left()  {r    
 26   static unsigned int corner_all()          {     
 27     return corner_top_right()|corner_top_left(    
 28   }                                               
 29 public:                                           
 30   sf<float> width;                                
 31   sf<float> height;                               
 32                                                   
 33   sf_vec<colorf,float> color;                     
 34                                                   
 35   sf<bool> gradient;                              
 36   sf_vec<colorf,float> color_top;                 
 37                                                   
 38   sf<bool> border_visible;                        
 39   sf_vec<colorf,float> border_color;              
 40   sf<float> border_line_width;                    
 41                                                   
 42   sf<float> shadow; //in percent of width.        
 43                                                   
 44   sf<float> corner_radius; //percent of height    
 45   sf<unsigned int> corner_steps;                  
 46   sf<unsigned int> corner_mask;                   
 47 public:                                           
 48   virtual const desc_fields& node_desc_fields(    
 49     TOOLS_FIELD_DESC_NODE_CLASS(tools::sg::bac    
 50     static const desc_fields s_v(parent::node_    
 51       TOOLS_ARG_FIELD_DESC(width),                
 52       TOOLS_ARG_FIELD_DESC(height),               
 53       TOOLS_ARG_FIELD_DESC(color),                
 54       TOOLS_ARG_FIELD_DESC(gradient),             
 55       TOOLS_ARG_FIELD_DESC(color_top),            
 56       TOOLS_ARG_FIELD_DESC(border_visible),       
 57       TOOLS_ARG_FIELD_DESC(border_color),         
 58       TOOLS_ARG_FIELD_DESC(border_line_width),    
 59       TOOLS_ARG_FIELD_DESC(shadow),               
 60       TOOLS_ARG_FIELD_DESC(corner_radius),        
 61       TOOLS_ARG_FIELD_DESC(corner_steps),         
 62       TOOLS_ARG_FIELD_DESC(corner_mask)           
 63     );                                            
 64     return s_v;                                   
 65   }                                               
 66 private:                                          
 67   void add_fields(){                              
 68     add_field(&width);                            
 69     add_field(&height);                           
 70                                                   
 71     add_field(&color);                            
 72     add_field(&gradient);                         
 73     add_field(&color_top);                        
 74     add_field(&border_visible);                   
 75     add_field(&border_color);                     
 76     add_field(&border_line_width);                
 77                                                   
 78     add_field(&shadow);                           
 79                                                   
 80     add_field(&corner_radius);                    
 81     add_field(&corner_steps);                     
 82     add_field(&corner_mask);                      
 83   }                                               
 84 public:                                           
 85   virtual void render(render_action& a_action)    
 86     if(touched()) {                               
 87       update_sg();                                
 88       reset_touched();                            
 89     }                                             
 90     m_back_sep.render(a_action);                  
 91   }                                               
 92   virtual void search(search_action& a_action)    
 93     if(touched()) {                               
 94       update_sg();                                
 95       reset_touched();                            
 96     }                                             
 97     parent::search(a_action);                     
 98     if(a_action.done()) return;                   
 99     m_back_sep.search(a_action);                  
100     if(a_action.done()) return;                   
101   }                                               
102   virtual void pick(pick_action& a_action) {      
103     if(touched()) {                               
104       update_sg();                                
105       reset_touched();                            
106     }                                             
107     m_back_sep.pick(a_action);                    
108   }                                               
109 public:                                           
110   back_area()                                     
111   :parent()                                       
112   ,width(1)                                       
113   ,height(1)                                      
114   ,color(colorf_white())                          
115   ,gradient(false)                                
116   ,color_top(colorf_white())                      
117   ,border_visible(true)                           
118   ,border_color(colorf_black())                   
119   ,border_line_width(1)                           
120   ,shadow(0)                                      
121   ,corner_radius(0) //in percent of the height    
122   ,corner_steps(12)                               
123   ,corner_mask(corner_all())                      
124   {                                               
125     add_fields();                                 
126   }                                               
127   virtual ~back_area(){}                          
128 public:                                           
129   back_area(const back_area& a_from)              
130   :parent(a_from)                                 
131   ,width(a_from.width)                            
132   ,height(a_from.height)                          
133   ,color(a_from.color)                            
134   ,gradient(a_from.gradient)                      
135   ,color_top(a_from.color_top)                    
136   ,border_visible(a_from.border_visible)          
137   ,border_color(a_from.border_color)              
138   ,border_line_width(a_from.border_line_width)    
139   ,shadow(a_from.shadow)                          
140   ,corner_radius(a_from.corner_radius)            
141   ,corner_steps(a_from.corner_steps)              
142   ,corner_mask(a_from.corner_mask)                
143   {                                               
144     add_fields();                                 
145   }                                               
146   back_area& operator=(const back_area& a_from    
147     parent::operator=(a_from);                    
148     width = a_from.width;                         
149     height = a_from.height;                       
150     color = a_from.color;                         
151     gradient = a_from.gradient;                   
152     color_top = a_from.color_top;                 
153     border_visible = a_from.border_visible;       
154     border_color = a_from.border_color;           
155     border_line_width = a_from.border_line_wid    
156     shadow = a_from.shadow;                       
157     corner_radius = a_from.corner_radius;         
158     corner_steps = a_from.corner_steps;           
159     corner_mask = a_from.corner_mask;             
160     return *this;                                 
161   }                                               
162 protected:                                        
163   void update_sg() {                              
164     m_back_sep.clear();                           
165                                                   
166     if(width.value()<=0) return;                  
167     if(height.value()<=0) return;                 
168                                                   
169     float xb = -width*0.5f;                       
170     float xe =  width*0.5f;                       
171     float yb = -height*0.5f;                      
172                                                   
173   //float zshadow = -0.05f;                       
174     float zshadow = -0.005f; //ok with gopaw a    
175     float zback = 0;                              
176     float zborder = 0.01f;                        
177                                                   
178     if(shadow.value()) {                          
179       float zz = zback+zshadow;                   
180       float ye = height*0.5f;                     
181                                                   
182       sg::rgba* mat = new sg::rgba();             
183       mat->color = colorf_black();                
184       m_back_sep.add(mat);                        
185                                                   
186       normal* nm = new normal;                    
187       //nm->vec.value(); //default is z. ok.      
188       m_back_sep.add(nm);                         
189                                                   
190       vertices* vtxs = new vertices;              
191       vtxs->mode = gl::triangle_fan();            
192       m_back_sep.add(vtxs);                       
193                                                   
194       float dx = width*shadow;                    
195       float dy = -dx;                             
196       vtxs->add(xb+dx,yb+dy,zz);                  
197       vtxs->add(xe+dx,yb+dy,zz);                  
198       vtxs->add(xe+dx,ye+dy,zz);                  
199       vtxs->add(xb+dx,ye+dy,zz);                  
200     }                                             
201                                                   
202    {//background :                                
203     normal* nm = new normal;                      
204     //nm->vec.value(); //default is z. ok.        
205     m_back_sep.add(nm);                           
206                                                   
207     if(gradient.value()) {                        
208 //    if(true) {                                  
209       //color gradient from (bottom,color) to     
210                                                   
211       atb_vertices* vtxs = new atb_vertices;      
212       vtxs->mode = gl::triangle_strip();          
213       m_back_sep.add(vtxs);                       
214                                                   
215       float zz = zback;                           
216                                                   
217       unsigned int ncol = 50;                     
218       float dy = height/ncol;                     
219       float ye = yb+dy;                           
220                                                   
221       colorf col_beg = color.value();             
222       colorf col_end = color_top.value();         
223                                                   
224       float dr = (col_end.r()-col_beg.r())/nco    
225       float dg = (col_end.g()-col_beg.g())/nco    
226       float db = (col_end.b()-col_beg.b())/nco    
227       float da = (col_end.a()-col_beg.a())/nco    
228       vec4f dcol(dr,dg,db,da);                    
229                                                   
230       colorf col = col_beg;                       
231                                                   
232       vtxs->add(xb,yb,zz);                        
233       vtxs->add_color(col);                       
234                                                   
235       vtxs->add(xe,yb,zz);                        
236       vtxs->add_color(col);                       
237                                                   
238       for(unsigned int index=0;index<ncol;inde    
239         vtxs->add(xb,ye,zz);                      
240         vtxs->add(xe,ye,zz);                      
241                                                   
242         vtxs->add_color(col);                     
243         vtxs->add_color(col);                     
244                                                   
245         ye  += dy;                                
246         col += dcol;                              
247       }                                           
248                                                   
249     } else {                                      
250                                                   
251       float zz = zback;                           
252       float ye =  height*0.5f;                    
253                                                   
254       sg::rgba* mat = new sg::rgba();             
255       mat->color = color;                         
256       m_back_sep.add(mat);                        
257                                                   
258       vertices* vtxs = new vertices;              
259       vtxs->mode = gl::triangle_fan();            
260       m_back_sep.add(vtxs);                       
261                                                   
262       float r = height*corner_radius;             
263       if((r>(0.5f*height.value()))||(r>(0.5f*w    
264                                                   
265       if((r>0) && corner_steps.value()) {         
266         float dangle = fhalf_pi()/float(corner    
267         unsigned int nslice = corner_steps;       
268                                                   
269         vtxs->add(0,0,zz);                        
270         vtxs->add(xe,yb+r,zz);                    
271         vtxs->add(xe,ye-r,zz);                    
272                                                   
273         // top-right :                            
274         float angle = dangle;                     
275         if(corner_mask.value() & corner_top_ri    
276           float xc = xe-r;                        
277           float yc = ye-r;                        
278           for(unsigned int i=0;i<nslice;i++,an    
279             vtxs->add(r*fcos(angle)+xc,r*fsin(    
280           }                                       
281         } else {                                  
282           angle += fhalf_pi();                    
283           vtxs->add(xe,ye,zz);                    
284           vtxs->add(xe-r,ye,zz);                  
285         }                                         
286                                                   
287         vtxs->add(xb+r,ye,zz);                    
288                                                   
289         // top-left :                             
290         if(corner_mask.value() & corner_top_le    
291           float xc = xb+r;                        
292           float yc = ye-r;                        
293           for(unsigned int i=0;i<nslice;i++,an    
294             vtxs->add(r*fcos(angle)+xc,r*fsin(    
295           }                                       
296         } else {                                  
297           angle += fhalf_pi();                    
298           vtxs->add(xb,ye,zz);                    
299           vtxs->add(xb,ye-r,zz);                  
300         }                                         
301                                                   
302         vtxs->add(xb,yb+r,zz);                    
303                                                   
304         // bottom-left :                          
305         if(corner_mask.value() & corner_bottom    
306           float xc = xb+r;                        
307           float yc = yb+r;                        
308           for(unsigned int i=0;i<nslice;i++,an    
309             vtxs->add(r*fcos(angle)+xc,r*fsin(    
310           }                                       
311         } else {                                  
312           angle += fhalf_pi();                    
313           vtxs->add(xb,yb,zz);                    
314           vtxs->add(xb+r,yb,zz);                  
315         }                                         
316                                                   
317         vtxs->add(xe-r,yb,zz);                    
318                                                   
319         // bottom-right :                         
320         if(corner_mask.value() & corner_bottom    
321           float xc = xe-r;                        
322           float yc = yb+r;                        
323           for(unsigned int i=0;i<nslice;i++,an    
324             vtxs->add(r*fcos(angle)+xc,r*fsin(    
325           }                                       
326         } else {                                  
327           angle += fhalf_pi();                    
328           vtxs->add(xe,yb,zz);                    
329           vtxs->add(xe,yb+r,zz);                  
330         }                                         
331                                                   
332       } else {                                    
333         vtxs->add(xb,yb,zz);                      
334         vtxs->add(xe,yb,zz);                      
335         vtxs->add(xe,ye,zz);                      
336         vtxs->add(xb,ye,zz);                      
337       }                                           
338                                                   
339     }}                                            
340                                                   
341     if(border_visible.value()){                   
342       float zz = zborder;                         
343       float ye = height*0.5f;                     
344                                                   
345       sg::rgba* mat = new sg::rgba();             
346       mat->color = border_color;                  
347       m_back_sep.add(mat);                        
348                                                   
349       draw_style* ds = new draw_style;            
350       ds->style = draw_lines;                     
351       ds->line_width = border_line_width;         
352       m_back_sep.add(ds);                         
353                                                   
354       vertices* vtxs = new vertices;              
355       vtxs->mode = gl::line_strip();              
356       m_back_sep.add(vtxs);                       
357                                                   
358       float r = height*corner_radius;             
359       if((r>(0.5f*height.value()))||(r>(0.5f*w    
360                                                   
361       if((r>0) && corner_steps.value()) {         
362         float dangle = fhalf_pi()/float(corner    
363         unsigned int nslice = corner_steps;       
364                                                   
365         vtxs->add(xe,yb+r,zz);                    
366         vtxs->add(xe,ye-r,zz);                    
367                                                   
368         // top-right :                            
369         float angle = dangle;                     
370         if(corner_mask.value() & corner_top_ri    
371           float xc = xe-r;                        
372           float yc = ye-r;                        
373           for(unsigned int i=0;i<nslice;i++,an    
374             vtxs->add(r*fcos(angle)+xc,r*fsin(    
375           }                                       
376         } else {                                  
377           angle += fhalf_pi();                    
378           vtxs->add(xe,ye,zz);                    
379           vtxs->add(xe-r,ye,zz);                  
380         }                                         
381                                                   
382         vtxs->add(xb+r,ye,zz);                    
383                                                   
384         // top-left :                             
385         if(corner_mask.value() & corner_top_le    
386           float xc = xb+r;                        
387           float yc = ye-r;                        
388           for(unsigned int i=0;i<nslice;i++,an    
389             vtxs->add(r*fcos(angle)+xc,r*fsin(    
390           }                                       
391         } else {                                  
392           angle += fhalf_pi();                    
393           vtxs->add(xb,ye,zz);                    
394           vtxs->add(xb,ye-r,zz);                  
395         }                                         
396                                                   
397         vtxs->add(xb,yb+r,zz);                    
398                                                   
399         // bottom-left :                          
400         if(corner_mask.value() & corner_bottom    
401           float xc = xb+r;                        
402           float yc = yb+r;                        
403           for(unsigned int i=0;i<nslice;i++,an    
404             vtxs->add(r*fcos(angle)+xc,r*fsin(    
405           }                                       
406         } else {                                  
407           angle += fhalf_pi();                    
408           vtxs->add(xb,yb,zz);                    
409           vtxs->add(xb+r,yb,zz);                  
410         }                                         
411                                                   
412         vtxs->add(xe-r,yb,zz);                    
413                                                   
414         // bottom-right :                         
415         if(corner_mask.value() & corner_bottom    
416           float xc = xe-r;                        
417           float yc = yb+r;                        
418           for(unsigned int i=0;i<nslice;i++,an    
419             vtxs->add(r*fcos(angle)+xc,r*fsin(    
420           }                                       
421         } else {                                  
422           angle += fhalf_pi();                    
423           vtxs->add(xe,yb,zz);                    
424           vtxs->add(xe,yb+r,zz);                  
425         }                                         
426                                                   
427       } else {                                    
428         vtxs->add(xb,yb,zz);                      
429         vtxs->add(xe,yb,zz);                      
430         vtxs->add(xe,ye,zz);                      
431         vtxs->add(xb,ye,zz);                      
432         vtxs->add(xb,yb,zz);                      
433       }                                           
434     }                                             
435                                                   
436   }                                               
437 protected:                                        
438   separator m_back_sep;                           
439 };                                                
440                                                   
441 }}                                                
442                                                   
443 #endif