Geant4 Cross Reference

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

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/base_tex (Version 11.3.0) and /externals/g4tools/include/tools/sg/base_tex (Version 9.5.p2)


  1 // Copyright (C) 2010, Guy Barrand. All rights    
  2 // See the file tools.license for terms.          
  3                                                   
  4 #ifndef tools_sg_base_tex                         
  5 #define tools_sg_base_tex                         
  6                                                   
  7 #include "../platform"                            
  8 #include "../img"                                 
  9 #include "../lina/line"                           
 10 #include "../lina/vec3f"                          
 11                                                   
 12 #include "sf_vec"                                 
 13 #include "sf_img"                                 
 14 #include "../colorfs"                             
 15                                                   
 16 namespace tools {                                 
 17 namespace sg {                                    
 18                                                   
 19 class base_tex {                                  
 20 public:                                           
 21   TOOLS_SCLASS(tools::sg::base_tex)               
 22 public:                                           
 23   virtual void* cast(const std::string& a_clas    
 24     if(void* p = cmp_cast<base_tex>(this,a_cla    
 25     return 0;                                     
 26   }                                               
 27 public:                                           
 28   sf_img<byte> img;                               
 29   sf_vec<colorf,float> back_color;                
 30   sf<bool> expand;                                
 31   sf<unsigned int> limit;                         
 32   sf<bool> nearest; //for glTexParameteri. See    
 33 public:                                           
 34   enum intersect_type {                           
 35     intersect_down,                               
 36     intersect_move,                               
 37     intersect_up                                  
 38   };                                              
 39   virtual bool intersect_value(std::ostream&,i    
 40 public:                                           
 41   base_tex()                                      
 42   :img(img_byte())                                
 43   ,back_color(colorf_white())                     
 44   ,expand(false)                                  
 45   ,limit(device::tex_mem_limit()) //OpenGL-ES     
 46   ,nearest(true)                                  
 47   ,m_img()                                        
 48   {}                                              
 49   virtual ~base_tex(){}                           
 50 public:                                           
 51   base_tex(const base_tex& a_from)                
 52   :img(a_from.img)                                
 53   ,back_color(a_from.back_color)                  
 54   ,expand(a_from.expand)                          
 55   ,limit(a_from.limit)                            
 56   ,nearest(a_from.nearest)                        
 57   ,m_img()                                        
 58   {}                                              
 59   base_tex& operator=(const base_tex& a_from){    
 60     img = a_from.img;                             
 61     back_color = a_from.back_color;               
 62     expand = a_from.expand;                       
 63     limit = a_from.limit;                         
 64     nearest = a_from.nearest;                     
 65     m_img.make_empty();                           
 66     return *this;                                 
 67   }                                               
 68 protected:                                        
 69   void _update_sg_(std::ostream& a_out) {         
 70     //clean_texs(); //must reset for all rende    
 71                                                   
 72     const img_byte& _img = img.value();           
 73                                                   
 74    //::printf("debug : base_tex::_update_sg :     
 75    //    _img.size(),_img.width(),_img.height(    
 76                                                   
 77                                                   
 78     if(_img.is_empty()) {                         
 79       m_img.make_empty();                         
 80       return;                                     
 81     }                                             
 82                                                   
 83     unsigned int bpp = _img.bpp();                
 84     if((bpp!=1)&&(bpp!=3)&&(bpp!=4)) {            
 85       a_out << "tools::sg::tex_rect::update_sg    
 86             << " bpp " << bpp << " not handled    
 87             << std::endl;                         
 88       m_img.make_empty();                         
 89       return;                                     
 90     }                                             
 91                                                   
 92     //a_out << "debug : tools::sg::tex_rect::u    
 93     //      << " this " << tools::p2s(this)       
 94     //      << std::endl;                         
 95                                                   
 96     // image must be power of two in width and    
 97                                                   
 98     const colorf& bc = back_color.value();        
 99     //::printf("debug : back_color %g %g %g %g    
100                                                   
101     byte pixel[4];                                
102     pixel[0] = bc.ruchar();                       
103     pixel[1] = bc.guchar();                       
104     pixel[2] = bc.buchar();                       
105     pixel[3] = bc.auchar();                       
106                                                   
107     //dump(a_out,"debug : 0000 :",_img);          
108                                                   
109     if((back_color.value().a()!=1)&&(bpp!=4))     
110       //transparent background.                   
111                                                   
112       //NOTE : the node must be rendered after    
113       //       transparency be taken into acco    
114                                                   
115       img_byte img4;                              
116       if(!_img.rgb2rgba(img4,255)){               
117         a_out << "tools::sg::tex_rect::update_    
118               << " rgb2rgba failed."              
119               << std::endl;                       
120         m_img.make_empty();                       
121         return;                                   
122       }                                           
123                                                   
124       if(!img4.to_texture(expand.value(),pixel    
125         a_out << "tools::sg::tex_rect::update_    
126               << " problem with tools::tex_rec    
127               << std::endl;                       
128         m_img.make_empty();                       
129         return;                                   
130       }                                           
131                                                   
132     } else {                                      
133       if(!_img.to_texture(expand.value(),pixel    
134         a_out << "tools::sg::tex_rect::update_    
135               << " problem with tools::tex_rec    
136               << std::endl;                       
137         m_img.make_empty();                       
138         return;                                   
139       }                                           
140     }                                             
141                                                   
142   //a_out << "debug : limit : 000 : " << limit    
143     if(limit.value()) {                           
144       unsigned int tw = m_img.width();            
145       unsigned int th = m_img.height();           
146       if((tw*th*m_img.bpp())>limit.value()) {     
147         //a_out << "debug : trunc " << (tw*th)    
148         unsigned int fac = 2;                     
149         while(true) {                             
150           unsigned int pw = tw/fac;               
151           unsigned int ph = th/fac;               
152           if((pw*ph)<limit.value()) {             
153             unsigned int sx = (tw-pw)/2;          
154             unsigned int sy = (th-ph)/2;          
155                                                   
156             img_byte part;                        
157             if(!m_img.get_part(sx,sy,pw,ph,par    
158               m_img.make_empty();                 
159               return;                             
160             }                                     
161           //a_out << "debug : base_tex : img.g    
162             m_img = part;                         
163             break;                                
164           }                                       
165           fac *= 2;                               
166         }                                         
167       }                                           
168     }                                             
169     //dump_not_null(a_out,"debug : base_tex::_    
170                                                   
171   }                                               
172                                                   
173   static void dump(std::ostream& a_out,const s    
174     if(a_cmt.size()) a_out << a_cmt << std::en    
175     a_out << " width " << a_img.width()           
176           << " height " << a_img.height()         
177           << " bpp " << a_img.bpp()               
178           << std::endl;                           
179   }                                               
180                                                   
181   static void dump_not_null(std::ostream& a_ou    
182     if(a_cmt.size()) a_out << a_cmt << std::en    
183     unsigned int w = a_img.width();               
184     unsigned int h = a_img.height();              
185     unsigned int n = a_img.bpp();                 
186     a_out << "img_byte : width " << w << " hei    
187     byte* pos = (byte*)a_img.buffer();            
188     if(n==3) {                                    
189       byte r,g,b;                                 
190       for(unsigned int j=0;j<h;j++) {             
191         for(unsigned int i=0;i<w;i++) {           
192           r = *pos;pos++;                         
193           g = *pos;pos++;                         
194           b = *pos;pos++;                         
195           if(r||g||b)                             
196             a_out << " " << i << " " << j         
197                   << " : " << (unsigned int)r     
198                   << std::endl;                   
199         }                                         
200       }                                           
201     }                                             
202   }                                               
203                                                   
204   void set_tcs(float a_tcs[8]) {                  
205     const img_byte& _img = img.value();           
206                                                   
207     a_tcs[0] = 0;a_tcs[1] = 0;                    
208     a_tcs[2] = 1;a_tcs[3] = 0;                    
209     a_tcs[4] = 1;a_tcs[5] = 1;                    
210     a_tcs[6] = 0;a_tcs[7] = 1;                    
211                                                   
212     float ax = 1;                                 
213     float bx = 0;                                 
214     float ay = 1;                                 
215     float by = 0;                                 
216    {unsigned int iw = _img.width();               
217     unsigned int ih = _img.height();              
218     unsigned int rw = m_img.width();              
219     unsigned int rh = m_img.height();             
220     if(rw>iw) {                                   
221       float part = float(iw)/float(rw);           
222       ax = part;                                  
223       bx = 0.5f*(1-part);                         
224     }                                             
225     if(rh>ih) {                                   
226       float part = float(ih)/float(rh);           
227       ay = part;                                  
228       by = 0.5f*(1-part);                         
229     }}                                            
230                                                   
231    {unsigned int num = 12/3;                      
232     for(unsigned int index=0;index<num;index++    
233       a_tcs[2*index]   = ax*a_tcs[2*index]  +b    
234       a_tcs[2*index+1] = ay*a_tcs[2*index+1]+b    
235     }}                                            
236                                                   
237   }                                               
238 protected:                                        
239   img_byte m_img;                                 
240 };                                                
241                                                   
242 }}                                                
243                                                   
244 #endif