diff -r 5d043eeb09d9 -r 7079dcc3bd74 ccdemos/realtime.cc --- a/ccdemos/realtime.cc Fri Dec 14 10:34:31 2007 +0100 +++ b/ccdemos/realtime.cc Fri Dec 14 16:51:22 2007 +0100 @@ -1,72 +1,15 @@ -#include - #include "raytracer.h" -#include "kdtree.h" - -int w = 480; -int h = 288; -Float *render_buffer; - -Raytracer rt; -Camera cam; - -void update(SDL_Surface *screen) -{ - rt.render(w, h, render_buffer); - - if (SDL_MUSTLOCK(screen)) - if (SDL_LockSurface(screen) < 0) - return; +#include "octree.h" - Uint32 *bufp = (Uint32 *)screen->pixels; - unsigned char c[3]; - for (Float *fd = render_buffer; fd != render_buffer + w*h*3; fd += 3) - { - for (int i = 0; i < 3; i++) - { - if (fd[i] > 1.0) - c[i] = 255; - else - c[i] = (unsigned char)(fd[i] * 255.0); - } - *bufp = SDL_MapRGB(screen->format, c[0], c[1], c[2]); - bufp++; - } - - if (SDL_MUSTLOCK(screen)) - SDL_UnlockSurface(screen); - - if (screen->flags & SDL_DOUBLEBUF) - SDL_Flip(screen); - else - SDL_UpdateRect(screen, 0, 0, w, h); -} +#include "common_sdl.h" int main() { - /* initialize SDL */ - SDL_Surface *screen; - - if( SDL_Init(SDL_INIT_VIDEO) < 0 ) { - fprintf(stderr, "Couldn't initialize SDL: %s\n", SDL_GetError()); - exit(1); - } - - atexit(SDL_Quit); + Raytracer rt; + Octree top; + Camera cam; - screen = SDL_SetVideoMode(w, h, 32, SDL_SWSURFACE|SDL_DOUBLEBUF|SDL_RESIZABLE); - if ( screen == NULL ) { - fprintf(stderr, "Unable to set video mode: %s\n", SDL_GetError()); - exit(1); - } - - /* initialize raytracer and prepare scene */ - render_buffer = (Float *) malloc(w*h*3*sizeof(Float)); - - rt.setThreads(2); rt.setMaxDepth(3); - - KdTree top; rt.setTop(&top); Light light1(Vector3(2.0, -5.0, -5.0), Colour(0.7, 0.3, 0.6)); @@ -85,80 +28,7 @@ rt.setCamera(&cam); cam.setEye(Vector3(0,0,10)); - /* build kd-tree */ - top.setMaxDepth(100); top.optimize(); - /* loop... */ - SDL_Event event; - bool quit = false; - Float roty = 0.0, rotx = 0.0, move = 0.0; - while (!quit) - { - while (SDL_PollEvent(&event)) - { - switch (event.type) { - case SDL_VIDEORESIZE: - w = event.resize.w; - h = event.resize.h; - render_buffer = (Float *) realloc(render_buffer, w*h*3*sizeof(Float)); - screen = SDL_SetVideoMode(w, h, 32, SDL_HWSURFACE|SDL_DOUBLEBUF|SDL_RESIZABLE); - break; - case SDL_KEYDOWN: - if (event.key.keysym.sym == SDLK_ESCAPE) { - quit = true; - break; - } - if (event.key.keysym.sym == SDLK_LEFT) { - roty = -0.01; - break; - } - if (event.key.keysym.sym == SDLK_RIGHT) { - roty = +0.01; - break; - } - if (event.key.keysym.sym == SDLK_DOWN) { - rotx = +0.01; - break; - } - if (event.key.keysym.sym == SDLK_UP) { - rotx = -0.01; - break; - } - if (event.key.keysym.sym == SDLK_w) { - move = +0.5; - break; - } - if (event.key.keysym.sym == SDLK_s) { - move = -0.5; - break; - } - break; - case SDL_KEYUP: - if (event.key.keysym.sym == SDLK_LEFT || event.key.keysym.sym == SDLK_RIGHT) { - roty = 0.0; - break; - } - if (event.key.keysym.sym == SDLK_UP || event.key.keysym.sym == SDLK_DOWN) { - rotx = 0.0; - break; - } - if (event.key.keysym.sym == SDLK_w || event.key.keysym.sym == SDLK_s) { - move = 0.0; - break; - } - break; - case SDL_QUIT: - quit = true; - } - } - cam.rotate(Quaternion(cos(roty),0,sin(roty),0).normalize()); - cam.rotate(Quaternion(cos(rotx),cam.u[0]*sin(rotx),0,cam.u[2]*sin(rotx)).normalize()); - cam.u.y = 0; - cam.u.normalize(); - cam.move(move,0,0); - update(screen); - } - - free(render_buffer); + loop_sdl(rt, cam); }