00001 #include "renderer.h"
00002 #include "application.h"
00003 #include <gctypes.h>
00004 #include <ogc/gx_struct.h>
00005
00006 namespace wit {
00007
00022
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
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 }