libcrbn/rendering/scanline.hpp

00001 
00002 #ifndef __scanliner_hpp__
00003 #define __scanliner_hpp__
00004 
00005 #include <deque>
00006 
00007 #include <crbn/basic/vec3.hpp>
00008 
00009 class Scanline
00010 {
00011 public:
00012   Scanline( int w, int h ) {
00013     _array = new vec3 [ w ];
00014     _remaining = w;
00015     _height = h;
00016   }
00017   ~Scanline() {
00018     delete [] _array;
00019     _array = 0;
00020   }
00021   int height() { return _height; }
00022   bool filled() { return (_remaining == 0); }
00023 
00024   void put( int x, vec3& col ) {
00025     _array[ x ] = col;
00026     --_remaining;
00027   }
00028 
00029   vec3* get() {
00030     return _array;
00031   }
00032 private:
00033   vec3* _array;
00034   int _remaining;
00035   int _height;
00036 };
00037 
00038 typedef std::deque<Scanline*> scanlineq;
00039 
00040 class Scanliner
00041 {
00042 public:
00043   // CTOR
00044   Scanliner( int w, int h ) {
00045     _scanlines.clear();
00046     _scanlines.push_back( new Scanline( w, 0 ) );
00047     _w = w;
00048     _h = h;
00049   }
00050   //DTOR
00051   ~Scanliner() {
00052     for( unsigned i = 0; i < _scanlines.size(); ++i ) {
00053       delete _scanlines[ i ];
00054     }
00055     _scanlines.clear();
00056   }
00057 
00058   // Add a color in the stuff
00059   void put( int x, int y, vec3& col ) {
00060     Scanline* scanline = 0;
00061     if( _scanlines.empty() ) {
00062       scanline = new Scanline( _w, y );
00063       scanline -> put( x, col );
00064       _scanlines.push_back( scanline );
00065     } else {
00066       unsigned decal = y - _scanlines[ 0 ] -> height();
00067       if( decal >= _scanlines.size() ) {
00068         scanline = new Scanline( _w, y );
00069         scanline -> put( x, col );
00070         _scanlines.push_back( scanline );
00071       } else {
00072         _scanlines[ decal ] -> put( x, col );
00073       }
00074     }
00075   }
00076 
00077   // Gets the first scanline if it's filled
00078   vec3* get() {
00079     if( _scanlines.empty() )
00080       return 0;
00081     if( !( _scanlines[ 0 ] -> filled()) )
00082       return 0;
00083     return _scanlines[ 0 ] -> get();
00084   }
00085 
00086   // remove the first scanline in queue
00087   void clear_first() {
00088     if( !_scanlines.empty() ) {
00089       delete _scanlines[ 0 ];
00090       _scanlines.pop_front();
00091     }
00092   }
00093 private:
00094   int _w, _h;
00095   scanlineq _scanlines;
00096 };
00097 
00098 #endif // __scanliner_hpp__

Generated on Tue Nov 14 15:40:08 2006 for libcrbn by  doxygen 1.5.0