#include "raster.h" int running; Matrix modelviewMat, projectionMat; Canvas *canvas; Texture *curtex; Vector4 vertices[] = { { -0.5f, 0.5f, -0.5f, 1.0f }, { -0.5f, -0.5f, -0.5f, 1.0f }, { -0.5f, 0.5f, 0.5f, 1.0f }, { -0.5f, -0.5f, -0.5f, 1.0f }, { -0.5f, 0.5f, 0.5f, 1.0f }, { -0.5f, -0.5f, 0.5f, 1.0f }, { 0.5f, 0.5f, -0.5f, 1.0f }, { 0.5f, -0.5f, -0.5f, 1.0f }, { 0.5f, 0.5f, 0.5f, 1.0f }, { 0.5f, -0.5f, -0.5f, 1.0f }, { 0.5f, 0.5f, 0.5f, 1.0f }, { 0.5f, -0.5f, 0.5f, 1.0f }, }; Color colors[] = { { 0, 255, 0, 255 }, { 0, 0, 0, 255 }, { 0, 255, 255, 255 }, { 0, 0, 0, 255 }, { 0, 255, 255, 255 }, { 0, 0, 255, 255 }, { 255, 255, 0, 255 }, { 255, 0, 0, 255 }, { 255, 255, 255, 255 }, { 255, 0, 0, 255 }, { 255, 255, 255, 255 }, { 255, 0, 255, 255 }, }; Vector2 texcoords[] = { { 0.0f, 0.0f }, { 0.0f, 4.0f }, { 4.0f, 0.0f }, { 0.0f, 4.0f }, { 4.0f, 0.0f }, { 4.0f, 4.0f }, { 0.0f, 0.0f }, { 0.0f, 4.0f }, { 4.0f, 0.0f }, { 0.0f, 4.0f }, { 4.0f, 0.0f }, { 4.0f, 4.0f }, }; void drawCube(Canvas *canvas) { int i, j; Vertex p[3]; Matrix mat = mulmat(projectionMat, modelviewMat); for(i = 0; i < 4; i++){ for(j = 0; j < 3; j++){ Vector4 v = mulmatvec(mat, vertices[i*3+j]); v.x /= v.w; v.y /= v.w; v.z /= v.w; v.z = (-v.z+1.0f)/2.0f; p[j].v.x = canvas->w*(v.x+1)/2.0f; p[j].v.y = canvas->h*(-v.y+1)/2.0f; p[j].z = 16777216*v.z; p[j].oneoverz = 1.0f/v.w; p[j].c.r = colors[i*3+j].r << 14; p[j].c.g = colors[i*3+j].g << 14; p[j].c.b = colors[i*3+j].b << 14; p[j].c.a = colors[i*3+j].a << 14; p[j].st.s = texcoords[i*3+j].s*p[j].oneoverz; p[j].st.t = texcoords[i*3+j].t*p[j].oneoverz; } //if(i != 3) // continue; drawTriangle(canvas, p[0], p[1], p[2]); } } int foo = 0, bar = 0; void draw(Canvas *canvas) { doBlend = 0; clearcanvas(canvas); // drawRect(canvas, (Point3){0,0,0}, (Point3){159, 119, 0}, // (Color){128, 128, 128, 255}); drawRect(canvas, (Point3){0,0,0}, (Point3){640, 480, 0}, (Color){128, 128, 128, 255}); doZ = 1; drawCube(canvas); doZ = 0; /* Color c = { 0, 0, 0, 255 }; drawLine(canvas, (Point3){25, 25, 0}, (Point3){25, 0, 0}, c); drawLine(canvas, (Point3){25, 25, 0}, (Point3){25, 50, 0}, c); drawLine(canvas, (Point3){25, 25, 0}, (Point3){0, 0, 0}, c); drawLine(canvas, (Point3){25, 25, 0}, (Point3){0, 10, 0}, c); drawLine(canvas, (Point3){25, 25, 0}, (Point3){50, 0, 0}, c); drawLine(canvas, (Point3){25, 25, 0}, (Point3){50, 10, 0}, c); drawLine(canvas, (Point3){25, 25, 0}, (Point3){50, 50, 0}, c); drawLine(canvas, (Point3){25, 25, 0}, (Point3){50, 30, 0}, c); drawLine(canvas, (Point3){25, 25, 0}, (Point3){0, 50, 0}, c); drawLine(canvas, (Point3){25, 25, 0}, (Point3){0, 30, 0}, c); drawWireTri(canvas, (Point3){100, 100, 0}, (Point3){150, 120, 0}, (Point3){80, 50, 0}, (Color){255, 255, 255, 255}); */ /* drawRect(canvas, (Point3){1, 1, 0}, (Point3){51, 51, 0}, (Color){0,255,0,255}); drawTriangle(canvas, (Vertex){{1, 1, 0}, 0, 1.0f, {0, 0, 255<<14, 255<<14}, {0,0}}, (Vertex){{1, 51, 0}, 0, 1.0f, {0, 0, 255<<14, 255<<14}, {0,0}}, (Vertex){{51, 1, 0}, 0, 1.0f, {0, 0, 255<<14, 255<<14}, {0,0}}); drawTriangle(canvas, (Vertex){{51, 51, 0}, 0, 1.0f, {255<<14, 0, 0, 255<<14}, {0,0}}, (Vertex){{1, 51, 0}, 0, 1.0f, {255<<14, 0, 0, 255<<14}, {0,0}}, (Vertex){{51, 1, 0}, 0, 1.0f, {255<<14, 0, 0, 255<<14}, {0,0}}); drawRect(canvas, (Point3){108, 1, 0}, (Point3){158, 51, 0}, (Color){0,255,0,255}); drawTriangle(canvas, (Vertex){{158, 1, 0}, 0, 1.0f, {255<<14, 0, 0, 255<<14}, {0,0}}, (Vertex){{158, 51, 0}, 0, 1.0f, {255<<14, 0, 0, 255<<14}, {0,0}}, (Vertex){{108, 1, 0}, 0, 1.0f, {255<<14, 0, 0, 255<<14}, {0,0}}); drawTriangle(canvas, (Vertex){{108, 51, 0}, 0, 1.0f, {0, 0, 255<<14, 255<<14}, {0,0}}, (Vertex){{158, 51, 0}, 0, 1.0f, {0, 0, 255<<14, 255<<14}, {0,0}}, (Vertex){{108, 1, 0}, 0, 1.0f, {0, 0, 255<<14, 255<<14}, {0,0}}); */ /* doBlend = 1; drawTriangle(canvas, (Vertex){{1, 1, 0}, 0, 1.0f, {0, 0, 255<<14, 255<<14}, {0, 0}}, (Vertex){{1, 10, 0}, 0, 1.0f, {0, 0, 255<<14, 255<<14}, {0, 0}}, (Vertex){{10, 1, 0}, 0, 1.0f, {0, 0, 255<<14, 255<<14}, {0, 0}}); drawTriangle(canvas, (Vertex){{1, 1, 0}, 0, 1.0f, {255<<14, 0, 0, 128<<14}, {0, 0}}, (Vertex){{1, 10, 0}, 0, 1.0f, {255<<14, 0, 0, 128<<14}, {0, 0}}, (Vertex){{10, 10, 0}, 0, 1.0f, {255<<14, 0, 0, 128<<14}, {0, 0}}); drawTriangle(canvas, (Vertex){{21, 1, 0}, 0, 1.0f, {0, 0, 255<<14, 255<<14}, {0, 0}}, (Vertex){{30, 10, 0}, 0, 1.0f, {0, 0, 255<<14, 255<<14}, {0, 0}}, (Vertex){{30, 1, 0}, 0, 1.0f, {0, 0, 255<<14, 255<<14}, {0, 0}}); drawTriangle(canvas, (Vertex){{30, 1, 0}, 0, 1.0f, {255<<14, 0, 0, 128<<14}, {0, 0}}, (Vertex){{21, 10, 0}, 0, 1.0f, {255<<14, 0, 0, 128<<14}, {0, 0}}, (Vertex){{30, 10, 0}, 0, 1.0f, {255<<14, 0, 0, 128<<14}, {0, 0}}); doBlend = 0; */ /* drawTriangle(canvas, (Vertex){{1, 11, 0}, 0, 1.0f, {255<<14, 0, 0, 255<<14}, {0, 0}}, (Vertex){{50, 1, 0}, 0, 1.0f, {255<<14, 255<<14, 0, 255<<14}, {1, 0}}, (Vertex){{19+bar, 20+foo, 0}, 0, 1.0f, {0, 0, 0, 255<<14}, {0, 1}}); */ } void blitcanvas(Canvas *canvas, SDL_Surface *surf) { int x, y; u8 *canvcol; u32 color; SDL_PixelFormat *fmt; fmt = surf->format; for(y = 0; y < canvas->h; y++) for(x = 0; x < canvas->w; x++){ canvcol = &canvas->fb[(y*canvas->w + x)*4]; color = SDL_MapRGB(fmt, canvcol[3], canvcol[2], canvcol[1]); *(u32*)((u8*)surf->pixels + y*surf->pitch + x*fmt->BytesPerPixel)=color; } } void blitcanvasdebug(Canvas *canvas, SDL_Surface *surf, int s) { int x, y; int sx, sy; int w, h; int i, j; u8 *canvcol; u32 color; SDL_PixelFormat *fmt; #define PX(x, y) ((u32*)((u8*)surf->pixels + (y)*surf->pitch + (x)*fmt->BytesPerPixel)) w = surf->w / (s+1) - 1; h = surf->h / (s+1) - 1; fmt = surf->format; for(sy = y = 0; y < h; y++){ for(i = 0; i < s; i++){ for(sx = x = 0; x < w; x++){ canvcol = &canvas->fb[(y*canvas->w + x)*4]; color = SDL_MapRGB(fmt, canvcol[3], canvcol[2], canvcol[1]); for(j = 0; j < s; j++){ *PX(sx,sy)=color; sx++; } *PX(sx,sy)=0; sx++; } sy++; } for(sx = x = 0; x < w; x++){ for(j = 0; j < s; j++){ *PX(sx,sy)=0; sx++; } *PX(sx,sy)=0; sx++; } sy++; } #undef PX } int pause = 0; void keydown(SDL_keysym keysym) { switch(keysym.sym){ case 'q': case SDLK_ESCAPE: running = 0; break; case 'p': pause = !pause; break; case 'h': bar--; break; case 'j': foo++; break; case 'k': foo--; break; case 'l': bar++; break; default: break; } } int main(void) { SDL_Surface *screen; SDL_Event event; u32 *p; canvas = makecanvas(640, 480); if(SDL_Init(SDL_INIT_VIDEO) < 0) return 1; screen = SDL_SetVideoMode(canvas->w, canvas->h, 32, SDL_HWSURFACE); if(screen == nil) return 1; projectionMat = perspective(60, (float)640/480, 0.1f, 100.0f); modelviewMat = mulmat(translation(0.0f, 0.0f, -3.0f), rotationY(1.0f)); curtex = maketexture(2, 2); p = (u32*)curtex->pixels; p[0] = 0xFF000000; p[1] = 0xFFFFFFFF; p[2] = 0xFFFFFFFF; p[3] = 0xFF000000; running = 1; while(running){ while(SDL_PollEvent(&event)) switch(event.type){ case SDL_QUIT: running = 0; break; case SDL_KEYDOWN: keydown(event.key.keysym); break; } SDL_LockSurface(screen); if(!pause) modelviewMat = mulmat(modelviewMat, rotationY(0.005f)); // modelviewMat = mulmat(modelviewMat, rotationY(0.02f)); draw(canvas); blitcanvas(canvas, screen); // blitcanvasdebug(canvas, screen, 3); // blitcanvasdebug(canvas, screen, 10); SDL_UnlockSurface(screen); SDL_UpdateRect(screen, 0, 0, 0, 0); } SDL_Quit(); return 0; }