ccdemos/spheres_shadow.cc
author Radek Brich <radek.brich@devl.cz>
Fri, 02 May 2008 13:27:47 +0200
branchpyrit
changeset 91 9d66d323c354
parent 88 f7edb3b90816
child 92 9af5c039b678
permissions -rw-r--r--
packetize Phong shader new scons config options: simd=(yes|no) - allow/suppress explicit SSE force_flags=(yes|no) - force use of specified flags instead of autodetected profile=(yes|no) - enable gcc's profiling (-pg option) check for pthread.h header, don't try to build without it add fourth Vector3 component for better memory aligning rename Vector3 to Vector partialy SSE-ize Vector class (only fully vertical operations) build static lib and python module in distinctive directories to avoid collision of library file names on some platforms

#include "raytracer.h"
#include "octree.h"

#include "common_sdl.h"

Camera cam;
Light light(Vector(-2.0, 10.0, -2.0), Colour(0.9, 0.9, 0.9));

Float lx, ly, lz, cf;

void update_callback(Float*)
{
	if (lx != 0.0)
		light.pos.x += lx;
	if (ly != 0.0)
		light.pos.y += ly;
	if (lz != 0.0)
		light.pos.z += lz;
	if (cf != 0.0)
		cam.F += cf;
}

void key_callback(int key, int down)
{
	switch (key)
	{
		case SDLK_r:
			lx = -0.1 * down;
			break;
		case SDLK_t:
			lx = +0.1 * down;
			break;
		case SDLK_f:
			ly = -0.1 * down;
			break;
		case SDLK_g:
			ly = +0.1 * down;
			break;
		case SDLK_v:
			lz = -0.1 * down;
			break;
		case SDLK_b:
			lz = +0.1 * down;
			break;

		case SDLK_z:
			cf = -0.02 * down;
			break;
		case SDLK_x:
			cf = +0.02 * down;
			break;
	}
}

int main(int argc, char **argv)
{
	Raytracer rt;

	Octree top;
	rt.setTop(&top);

	rt.addLight(&light);

	//Light light2;
	//light2.colour = Colour(0.7, 0.3, 0.6);
	//rt.addLight(&light2);

	Material mat0a(Colour(0.7, 0.7, 0.7));
	mat0a. setReflectivity(0.0);
	Box box(Vector(-10.0, -1.2, -20.0), Vector(10.0, -1.0, 0.0), &mat0a);
	rt.addShape(&box);

	Material mat0b(Colour(0.1, 0.7, 0.8));
	mat0b.setReflectivity(0.7);
	Box box2(Vector(-10.0, -1.2, -20.0), Vector(10.0, 10.0, -20.2), &mat0b);
	rt.addShape(&box2);

	Material mat1(Colour(1.0, 0.0, 0.0));
	Sphere bigsphere(Vector(3.0, 2.0, -7.0), 3.0, &mat1);
	rt.addShape(&bigsphere);

	Material mat2(Colour(0.0, 1.0, 0.0));
	Sphere smallsphere(Vector(-5.5, 1.5, -8.0), 2.0, &mat2);
	rt.addShape(&smallsphere);

	Material mat3(Colour(0.0, 0.0, 1.0));
	mat3.setReflectivity(0.1);
	mat3.setTransmissivity(0.8, 1.5);
	Sphere tinysphere(Vector(-1.2, 0.0, -2.0), 0.7, &mat3);
	rt.addShape(&tinysphere);

	top.optimize();

	cam.setEye(Vector(-2.28908, 4.30992, 12.3051));
	cam.p = Vector(0.0988566, -0.139543, -0.985269);
	cam.u = Vector(-0.995004, 0, -0.0998334);
	cam.v = Vector(0.0139311, 0.990216, -0.138846);
	rt.setCamera(&cam);

	w = 800;
	h = 600;

	/* run interactive mode */
	loop_sdl(rt, cam, update_callback, key_callback);

	/* render image */
	if (argc == 2 && !strcmp(argv[1], "-r"))
	{
		pyrit_verbosity = 2;
		DefaultSampler sampler(w, h);
		sampler.setOversample(2);
		rt.setSampler(&sampler);
		rt.render();
		sampler.getPixmap().writePNG("spheres_shadow.png");
	}
}