Main Page | Namespace List | Class Hierarchy | Class List | Directories | File List | Namespace Members | Class Members | File Members

gouraud.cpp

Go to the documentation of this file.
00001 #include <stdio.h>
00002 #include "agg_basics.h"
00003 #include "agg_rendering_buffer.h"
00004 #include "agg_rasterizer_scanline_aa.h"
00005 #include "agg_scanline_u.h"
00006 #include "agg_scanline_p.h"
00007 #include "agg_renderer_scanline.h"
00008 #include "agg_span_allocator.h"
00009 #include "agg_span_gouraud_rgba.h"
00010 #include "agg_span_gouraud_gray.h"
00011 #include "agg_span_solid.h"
00012 #include "platform/agg_platform_support.h"
00013 
00014 #include "ctrl/agg_slider_ctrl.h"
00015 
00016 
00017 //#define AGG_GRAY8
00018 #define AGG_BGR24
00019 //#define AGG_RGB24
00020 //#define AGG_BGRA32 
00021 //#define AGG_RGBA32 
00022 //#define AGG_ARGB32 
00023 //#define AGG_ABGR32
00024 //#define AGG_RGB565
00025 //#define AGG_RGB555
00026 #include "pixel_formats.h"
00027 
00028 enum flip_y_e { flip_y = true };
00029 
00030 
00031 #include "agg_math.h"
00032 #include "agg_dda_line.h"
00033 
00034 
00035 class the_application : public agg::platform_support
00036 {
00037     double m_x[3];
00038     double m_y[3];
00039     double m_dx;
00040     double m_dy;
00041     int    m_idx;
00042 
00043     agg::slider_ctrl<agg::rgba> m_dilation;
00044     agg::slider_ctrl<agg::rgba> m_gamma;
00045     agg::slider_ctrl<agg::rgba> m_alpha;
00046 
00047 
00048 public:
00049     the_application(agg::pix_format_e format, bool flip_y) :
00050         agg::platform_support(format, flip_y),
00051         m_idx(-1),
00052         m_dilation(5, 5,    400-5, 11,    !flip_y),
00053         m_gamma   (5, 5+15, 400-5, 11+15, !flip_y),
00054         m_alpha   (5, 5+30, 400-5, 11+30, !flip_y)
00055 
00056     {
00057         m_x[0] = 57;    m_y[0] = 60;
00058         m_x[1] = 369;   m_y[1] = 170;
00059         m_x[2] = 143;   m_y[2] = 310;
00060        
00061         add_ctrl(m_dilation);
00062         add_ctrl(m_gamma);
00063         add_ctrl(m_alpha);
00064 
00065         m_dilation.label("Dilation=%3.2f");
00066         m_gamma.label("Linear gamma=%3.2f");
00067         m_alpha.label("Opacity=%3.2f");
00068 
00069         m_dilation.value(0.175);
00070         m_gamma.value(0.809);
00071         m_alpha.value(1.0);
00072     }
00073 
00074 
00075     template<class Scanline, class Ras> 
00076     void render_gouraud(Scanline& sl, Ras& ras)
00077     {
00078         double alpha = m_alpha.value();
00079         double brc = 1;
00080 
00081         typedef agg::renderer_base<pixfmt> base_ren_type;
00082 #ifdef AGG_GRAY8
00083         typedef agg::span_gouraud_gray<color_type> span_gen_type;
00084 #else
00085         typedef agg::span_gouraud_rgba<color_type> span_gen_type;
00086 #endif
00087         typedef agg::span_allocator<color_type> span_alloc_type;
00088         
00089         pixfmt pf(rbuf_window());
00090         base_ren_type ren_base(pf);
00091 
00092         span_alloc_type span_alloc;
00093         span_gen_type   span_gen;
00094 
00095         ras.gamma(agg::gamma_linear(0.0, m_gamma.value()));
00096 
00097         double d = m_dilation.value();
00098 
00099         // Single triangle
00100         //span_gen.colors(agg::rgba(1,   0,   0,  alpha),
00101         //                agg::rgba(0,   1,   0,  alpha),
00102         //                agg::rgba(0,   0,   1,  alpha));
00103         //span_gen.triangle(m_x[0], m_y[0], m_x[1], m_y[1], m_x[2], m_y[2], d);
00104         //ras.add_path(span_gen);
00105         //agg::render_scanlines_aa(ras, sl, ren_base, span_alloc, span_gen);
00106 
00107 
00108         // Six triangles
00109         double xc = (m_x[0] + m_x[1] + m_x[2]) / 3.0;
00110         double yc = (m_y[0] + m_y[1] + m_y[2]) / 3.0;
00111 
00112         double x1 = (m_x[1] + m_x[0]) / 2 - (xc - (m_x[1] + m_x[0]) / 2);
00113         double y1 = (m_y[1] + m_y[0]) / 2 - (yc - (m_y[1] + m_y[0]) / 2);
00114 
00115         double x2 = (m_x[2] + m_x[1]) / 2 - (xc - (m_x[2] + m_x[1]) / 2);
00116         double y2 = (m_y[2] + m_y[1]) / 2 - (yc - (m_y[2] + m_y[1]) / 2);
00117 
00118         double x3 = (m_x[0] + m_x[2]) / 2 - (xc - (m_x[0] + m_x[2]) / 2);
00119         double y3 = (m_y[0] + m_y[2]) / 2 - (yc - (m_y[0] + m_y[2]) / 2);
00120 
00121         span_gen.colors(agg::rgba(1,   0,   0,    alpha),
00122                         agg::rgba(0,   1,   0,    alpha),
00123                         agg::rgba(brc, brc, brc,  alpha));
00124         span_gen.triangle(m_x[0], m_y[0], m_x[1], m_y[1], xc, yc, d);
00125         ras.add_path(span_gen);
00126         agg::render_scanlines_aa(ras, sl, ren_base, span_alloc, span_gen);
00127 
00128 
00129         span_gen.colors(agg::rgba(0,   1,   0,    alpha),
00130                         agg::rgba(0,   0,   1,    alpha),
00131                         agg::rgba(brc, brc, brc,  alpha));
00132         span_gen.triangle(m_x[1], m_y[1], m_x[2], m_y[2], xc, yc, d);
00133         ras.add_path(span_gen);
00134         agg::render_scanlines_aa(ras, sl, ren_base, span_alloc, span_gen);
00135 
00136 
00137         span_gen.colors(agg::rgba(0,   0,   1,   alpha),
00138                         agg::rgba(1,   0,   0,   alpha),
00139                         agg::rgba(brc, brc, brc, alpha));
00140         span_gen.triangle(m_x[2], m_y[2], m_x[0], m_y[0], xc, yc, d);
00141         ras.add_path(span_gen);
00142         agg::render_scanlines_aa(ras, sl, ren_base, span_alloc, span_gen);
00143 
00144 
00145         brc = 1-brc;
00146         span_gen.colors(agg::rgba(1,   0,   0,    alpha),
00147                         agg::rgba(0,   1,   0,    alpha),
00148                         agg::rgba(brc, brc, brc,  alpha));
00149         span_gen.triangle(m_x[0], m_y[0], m_x[1], m_y[1], x1, y1, d);
00150         ras.add_path(span_gen);
00151         agg::render_scanlines_aa(ras, sl, ren_base, span_alloc, span_gen);
00152 
00153 
00154         span_gen.colors(agg::rgba(0,   1,   0,    alpha),
00155                         agg::rgba(0,   0,   1,    alpha),
00156                         agg::rgba(brc, brc, brc,  alpha));
00157         span_gen.triangle(m_x[1], m_y[1], m_x[2], m_y[2], x2, y2, d);
00158         ras.add_path(span_gen);
00159         agg::render_scanlines_aa(ras, sl, ren_base, span_alloc, span_gen);
00160 
00161 
00162         span_gen.colors(agg::rgba(0,   0,   1,    alpha),
00163                         agg::rgba(1,   0,   0,    alpha),
00164                         agg::rgba(brc, brc, brc,  alpha));
00165         span_gen.triangle(m_x[2], m_y[2], m_x[0], m_y[0], x3, y3, d);
00166         ras.add_path(span_gen);
00167         agg::render_scanlines_aa(ras, sl, ren_base, span_alloc, span_gen);
00168     }
00169 
00170 
00171 
00172 
00173 
00174 
00175 
00176 
00177     virtual void on_draw()
00178     {
00179         typedef agg::renderer_base<pixfmt> base_ren_type;
00180 
00181         pixfmt pf(rbuf_window());
00182         base_ren_type ren_base(pf);
00183         ren_base.clear(agg::rgba(1,1,1));
00184 
00185         agg::scanline_u8 sl;
00186         agg::rasterizer_scanline_aa<> ras;
00187 
00188         render_gouraud(sl, ras);
00189 
00190         ras.gamma(agg::gamma_none());
00191         agg::render_ctrl(ras, sl, ren_base, m_dilation);
00192         agg::render_ctrl(ras, sl, ren_base, m_gamma);
00193         agg::render_ctrl(ras, sl, ren_base, m_alpha);
00194     }
00195 
00196 
00197     virtual void on_mouse_button_down(int x, int y, unsigned flags)
00198     {
00199         unsigned i;
00200         if(flags & agg::mouse_right)
00201         {
00202             agg::scanline_u8 sl;
00203             agg::rasterizer_scanline_aa<> ras;
00204             start_timer();
00205             for(i = 0; i < 100; i++)
00206             {
00207                 render_gouraud(sl, ras);
00208             }
00209             char buf[100];
00210             sprintf(buf, "Time=%2.2f ms", elapsed_time());
00211             message(buf);
00212         }
00213 
00214         if(flags & agg::mouse_left)
00215         {
00216             for (i = 0; i < 3; i++)
00217             {
00218                 if(sqrt( (x-m_x[i]) * (x-m_x[i]) + (y-m_y[i]) * (y-m_y[i]) ) < 10.0)
00219                 {
00220                     m_dx = x - m_x[i];
00221                     m_dy = y - m_y[i];
00222                     m_idx = i;
00223                     break;
00224                 }
00225             }
00226             if(i == 3)
00227             {
00228                 if(agg::point_in_triangle(m_x[0], m_y[0], 
00229                                           m_x[1], m_y[1],
00230                                           m_x[2], m_y[2],
00231                                           x, y))
00232                 {
00233                     m_dx = x - m_x[0];
00234                     m_dy = y - m_y[0];
00235                     m_idx = 3;
00236                 }
00237 
00238             }
00239         }
00240     }
00241 
00242 
00243     virtual void on_mouse_move(int x, int y, unsigned flags)
00244     {
00245         if(flags & agg::mouse_left)
00246         {
00247             if(m_idx == 3)
00248             {
00249                 double dx = x - m_dx;
00250                 double dy = y - m_dy;
00251                 m_x[1] -= m_x[0] - dx;
00252                 m_y[1] -= m_y[0] - dy;
00253                 m_x[2] -= m_x[0] - dx;
00254                 m_y[2] -= m_y[0] - dy;
00255                 m_x[0] = dx;
00256                 m_y[0] = dy;
00257                 force_redraw();
00258                 return;
00259             }
00260 
00261             if(m_idx >= 0)
00262             {
00263                 m_x[m_idx] = x - m_dx;
00264                 m_y[m_idx] = y - m_dy;
00265                 force_redraw();
00266             }
00267         }
00268         else
00269         {
00270             on_mouse_button_up(x, y, flags);
00271         }
00272     }
00273 
00274     virtual void on_mouse_button_up(int x, int y, unsigned flags)
00275     {
00276         m_idx = -1;
00277     }
00278 
00279     
00280     virtual void on_key(int x, int y, unsigned key, unsigned flags)
00281     {
00282         double dx = 0;
00283         double dy = 0;
00284         switch(key)
00285         {
00286         case agg::key_left:  dx = -0.1; break;
00287         case agg::key_right: dx =  0.1; break;
00288         case agg::key_up:    dy =  0.1; break;
00289         case agg::key_down:  dy = -0.1; break;
00290         }
00291         m_x[0] += dx;
00292         m_y[0] += dy;
00293         m_x[1] += dx;
00294         m_y[1] += dy;
00295         force_redraw();
00296     }
00297 
00298 
00299 };
00300 
00301 
00302 int agg_main(int argc, char* argv[])
00303 {
00304     the_application app(pix_format, flip_y);
00305     app.caption("AGG Example. Gouraud Shading");
00306 
00307     if(app.init(400, 320, agg::window_resize))
00308     {
00309         return app.run();
00310     }
00311     return 1;
00312 }
00313 
00314 

© sourcejam.com 2005-2008