diff -r 5d043eeb09d9 -r 7079dcc3bd74 ccdemos/realtime_dragon.cc --- a/ccdemos/realtime_dragon.cc Fri Dec 14 10:34:31 2007 +0100 +++ b/ccdemos/realtime_dragon.cc Fri Dec 14 16:51:22 2007 +0100 @@ -1,148 +1,16 @@ -#include - #include "raytracer.h" #include "octree.h" -#include -#include -int w = 320; -int h = 200; -Float *render_buffer; - -Raytracer rt; -Camera cam; - -void load_ply(const char *filename, Material *mat, Float scale) -{ - vector vertices; - vector normals; - vector vertex_face_num; - ifstream f(filename); - string token = "a"; - if (!f.is_open()) - { - cout << "File not found: " << filename <> token; - if (token == "element") - { - f >> token; - if (token == "vertex") - f >> vertex_num; - if (token == "face") - f >> face_num; - } - } - - // read vertices - Vector3 P; - for (int i = 0; i < vertex_num; i++) - { - f >> P.x >> P.y >> P.z; - P.x = -scale*P.x; - P.y = scale*P.y - 3.6; - P.z = -scale*P.z; - vertices.push_back(new NormalVertex(P)); - normals.push_back(Vector3()); - vertex_face_num.push_back(0); - } - - // read faces - Triangle *face; - int v1, v2, v3; - for (int i = 0; i < face_num; i++) - { - f >> num; - if (num != 3) - { - printf("ply error: faces of %d vertices not supported", num); - return; - } - f >> v1 >> v2 >> v3; - face = new Triangle(vertices.at(v1), vertices.at(v2), vertices.at(v3), mat); - rt.addshape(face); - face->setSmooth(); - - normals.at(v1) += face->getNormal(); - vertex_face_num.at(v1)++; - normals.at(v2) += face->getNormal(); - vertex_face_num.at(v2)++; - normals.at(v3) += face->getNormal(); - vertex_face_num.at(v3)++; - } - - for (int i = 0; i < vertex_num; i++) - { - normals.at(i) /= vertex_face_num.at(i); - normals.at(i).normalize(); - vertices.at(i)->N = normals.at(i); - } - - f.close(); -} - -void update(SDL_Surface *screen) -{ - rt.render(w, h, render_buffer); - - if (SDL_MUSTLOCK(screen)) - if (SDL_LockSurface(screen) < 0) - return; - - 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" +#include "common_ply.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(0); - - Octree top; rt.setTop(&top); Light light1(Vector3(-5.0, 2.0, 8.0), Colour(0.9, 0.3, 0.6)); @@ -154,83 +22,12 @@ //rt.addlight(&light2); Material mat(Colour(0.9, 0.9, 0.9)); - load_ply("../models/dragon/dragon_vrip.ply", &mat, 29); + load_ply(rt, "../models/dragon/dragon_vrip.ply", &mat, Vector3(-29,29,-29), Vector3(0,-3.6,0)); rt.setCamera(&cam); cam.setEye(Vector3(0,0,10)); 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); }