ccdemos/realtime.cc
branchpyrit
changeset 39 7079dcc3bd74
parent 37 5f954c0d34fc
child 40 929aad02c5f2
--- 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 <SDL.h>
-
 #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);
 }