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
00018 #define AGG_BGR24
00019
00020
00021
00022
00023
00024
00025
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
00100
00101
00102
00103
00104
00105
00106
00107
00108
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