• Main Page
  • Namespaces
  • Classes
  • Files
  • File List

renderer.cpp

Go to the documentation of this file.
00001 #include "renderer.h"
00002 #include "application.h"
00003 #include <gctypes.h>
00004 #include <ogc/gx_struct.h>
00005 
00006 namespace wit {
00007 
00022 // doubly-linked list for faster deletes
00023 struct RendererPrivate {
00024     RendererPrivate* prev;
00025     Renderer* renderer;
00026     float scale, transx, transy; 
00027     RendererPrivate* next;
00028 };
00029 
00030 static RendererPrivate* wit_render_list = 0;
00031 
00033 void wit_render_all()
00034 {
00035     RendererPrivate* node = wit_render_list;
00036     while(node) {
00037         node->renderer->render();
00038         node = node->next;
00039     }
00040     node = wit_render_list;
00041     while(node) {
00042         node->renderer->waitForRendering();
00043         node = node->next;
00044     }
00045 }
00046 
00050 Renderer::Renderer()
00051 {
00052     d = new RendererPrivate;
00053     d->prev = 0;
00054     d->renderer = this;
00055     d->scale = 1.0;
00056     d->transx = d->transy = 0.0;
00057     d->next = wit_render_list;
00058     wit_render_list = d;
00059 }
00060 
00064 Renderer::~Renderer()
00065 {
00066     if(d->prev) 
00067         d->prev->next = d->next;
00068     if(d->next)
00069         d->next->prev = d->prev;
00070     delete d;
00071 }
00072 
00089 void Renderer::waitForRendering()
00090 {
00091     // do nothing
00092 }
00093 
00094 static void wit_renderer_transform(RendererPrivate* d)
00095 {
00096     static int width = wit::Application::instance()->screenWidth() / 2;
00097 
00098     Mtx44 perspective;
00099     float xmin = width + d->transx - (width / d->scale);
00100     float xmax = width + d->transx + (width / d->scale) - 1;
00101     float ymin = 240 + d->transy - (240 / d->scale);
00102     float ymax = 240 + d->transy + (240 / d->scale) - 1;
00103     guOrtho(perspective, ymin, ymax, xmin, xmax, 0, 300);
00104     GX_LoadProjectionMtx(perspective, GX_ORTHOGRAPHIC);
00105 }
00106 
00107 static void wit_renderer_setup(RendererPrivate* d)
00108 {
00109     wit_renderer_transform(d);
00110 
00111     GX_SetNumChans(1);
00112     GX_SetNumTexGens(0);
00113     GX_SetTevOrder(GX_TEVSTAGE0, GX_TEXCOORDNULL, GX_TEXMAP_NULL, GX_COLOR0A0);
00114     GX_SetTevOp(GX_TEVSTAGE0, GX_PASSCLR);
00115 
00116     GX_ClearVtxDesc();
00117     GX_SetVtxDesc(GX_VA_POS, GX_DIRECT);
00118     GX_SetVtxDesc(GX_VA_CLR0, GX_DIRECT);
00119     GX_SetVtxDesc(GX_VA_TEX0, GX_NONE);
00120 }
00121 
00127 float Renderer::scale() const
00128 {
00129     return d->scale;
00130 }
00131 
00139 void Renderer::setScale(float mag)
00140 {
00141     d->scale = mag;
00142 }
00143 
00149 float Renderer::translateX() const 
00150 {
00151     return d->transx;
00152 }
00153 
00159 float Renderer::translateY() const
00160 {
00161     return d->transy;
00162 }
00163 
00171 void Renderer::setTranslation(float x, float y)
00172 {
00173     d->transx = x;
00174     d->transy = y;
00175 }
00176 
00180 void Renderer::drawPoint(float x, float y, const GXColor& color)
00181 {
00182     wit_renderer_setup(d);
00183 
00184     GX_Begin(GX_POINTS, GX_VTXFMT7, 1);
00185     GX_Position2f32(x, y);
00186     GX_Color4u8(color.r, color.g, color.b, color.a);
00187     GX_End();
00188 }
00189 
00195 void Renderer::drawPoint(const Point& p, const GXColor& color)
00196 {
00197     drawPoint(p.x, p.y, color);
00198 }
00199 
00203 void Renderer::drawLine(float x1, float y1, float x2, float y2, const GXColor& color)
00204 {
00205     wit_renderer_setup(d);
00206 
00207     GX_Begin(GX_LINES, GX_VTXFMT7, 2);
00208     GX_Position2f32(x1, y1);
00209     GX_Color4u8(color.r, color.g, color.b, color.a);
00210     GX_Position2f32(x2, y2);
00211     GX_Color4u8(color.r, color.g, color.b, color.a);
00212     GX_End();
00213 }
00214 
00220 void Renderer::drawLine(const Point& p1, const Point& p2, const GXColor& color)
00221 {
00222     drawLine(p1.x, p1.y, p2.x, p2.y, color);
00223 }
00224 
00228 void Renderer::drawRect(const Rect& rect, const GXColor& color)
00229 {
00230     wit_renderer_setup(d);
00231 
00232     GX_Begin(GX_LINESTRIP, GX_VTXFMT7, 5);
00233     GX_Position2f32(rect.x1, rect.y1);
00234     GX_Color4u8(color.r, color.g, color.b, color.a);
00235     GX_Position2f32(rect.x2, rect.y1);
00236     GX_Color4u8(color.r, color.g, color.b, color.a);
00237     GX_Position2f32(rect.x2, rect.y2);
00238     GX_Color4u8(color.r, color.g, color.b, color.a);
00239     GX_Position2f32(rect.x1, rect.y2);
00240     GX_Color4u8(color.r, color.g, color.b, color.a);
00241     GX_Position2f32(rect.x1, rect.y1);
00242     GX_Color4u8(color.r, color.g, color.b, color.a);
00243     GX_End();
00244 }
00245 
00249 void Renderer::fillRect(const Rect& rect, const GXColor& color)
00250 {
00251     wit_renderer_setup(d);
00252 
00253     GX_Begin(GX_QUADS, GX_VTXFMT7, 4);
00254     GX_Position2f32(rect.x1, rect.y1);
00255     GX_Color4u8(color.r, color.g, color.b, color.a);
00256     GX_Position2f32(rect.x2, rect.y1);
00257     GX_Color4u8(color.r, color.g, color.b, color.a);
00258     GX_Position2f32(rect.x2, rect.y2);
00259     GX_Color4u8(color.r, color.g, color.b, color.a);
00260     GX_Position2f32(rect.x1, rect.y2);
00261     GX_Color4u8(color.r, color.g, color.b, color.a);
00262     GX_End();
00263 }
00264 
00268 void Renderer::drawPoints(const Polygon& poly, const GXColor& color)
00269 {
00270     wit_renderer_setup(d);
00271 
00272     int ct = poly.count();
00273     Point* points = poly.points();
00274 
00275     GX_Begin(GX_POINTS, GX_VTXFMT7, ct);
00276     for(int i = 0; i < ct; i++) {
00277         GX_Position2f32(points[i].x, points[i].y);
00278         GX_Color4u8(color.r, color.g, color.b, color.a);
00279     }
00280     GX_End();
00281 }
00282 
00286 void Renderer::drawPolygon(const Polygon& poly, const GXColor& color)
00287 {
00288     wit_renderer_setup(d);
00289 
00290     int ct = poly.count();
00291     Point* points = poly.points();
00292 
00293     GX_Begin(GX_LINESTRIP, GX_VTXFMT7, ct+1);
00294     for(int i = 0; i < ct; i++) {
00295         GX_Position2f32(points[i].x, points[i].y);
00296         GX_Color4u8(color.r, color.g, color.b, color.a);
00297     }
00298     GX_Position2f32(points[0].x, points[0].y);
00299     GX_Color4u8(color.r, color.g, color.b, color.a);
00300     GX_End();
00301 }
00302 
00309 void Renderer::fillPolygon(const Polygon& poly, const GXColor& color)
00310 {
00311     wit_renderer_setup(d);
00312 
00313     int ct = poly.count();
00314     Point* points = poly.points();
00315 
00316     GX_Begin(GX_TRIANGLEFAN, GX_VTXFMT7, ct+1);
00317     for(int i = 0; i < ct; i++) {
00318         GX_Position2f32(points[i].x, points[i].y);
00319         GX_Color4u8(color.r, color.g, color.b, color.a);
00320     }
00321     GX_Position2f32(points[0].x, points[0].y);
00322     GX_Color4u8(color.r, color.g, color.b, color.a);
00323     GX_End();
00324 }
00325 
00326 }

Generated on Sat Sep 3 2011 10:25:00 for wit by  doxygen 1.7.2