コード例 #1
0
///Displays
void display(){
    ///--- Clears the color buffer so that we don't display garbage
    glViewport(0,0,windowDimension,windowDimension);
        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

        ///--- Upload viewing matrices externally
        GLuint pid = quad.getProgramID();
        glUseProgram(pid);
            mat4 MODEL = mat4::Identity();
            glUniformMatrix4fv(glGetUniformLocation(pid, "MODEL"), 1, GL_FALSE, MODEL.data());

            float theta_rad = M_PI/180.0*theta;
            //vec3 camera_pos( camX, camY, 2*sin(theta_rad));
            camX = camX + rateX;
            camY = camY + rateY;
            camZ = camZ + rateZ;
            vec3 camera_pos(camX,camY,camZ);
            mat4 VIEW = Eigen::lookAt( camera_pos, vec3(lookX,lookY,lookZ), vec3(0,0,1) ); //< "z" up on screen
            glUniformMatrix4fv(glGetUniformLocation(pid, "VIEW"), 1, GL_FALSE, VIEW.data());

            mat4 PROJ = Eigen::perspective(75.0f, windowDimension/(float)windowDimension, 0.1f, 10.0f);
            glUniformMatrix4fv(glGetUniformLocation(pid, "PROJ"), 1, GL_FALSE, PROJ.data());
        glUseProgram(pid);
    ///--- calls the quad.draw() method which displays the terrain quad (?takes in the ModelViewProjection matrices?)
    quad.draw();
}
コード例 #2
0
ファイル: HeightField.cpp プロジェクト: JeffOwOSun/Trace
Scene *readHeights(char* fn) {
	int width, height;
	unsigned char *height_map;
	height_map = readBMP(fn, width, height);
	if (!height_map)
	{
		fl_alert("Error loading height map\n");
		return false;
	}

	Scene * ret = new Scene();
	//TODO: customize mat
	Material * mat = new Material();
	mat->kd = vec3f(1.0, 1.0, 1.0);
	//extract the points
	Trimesh * trimesh = new Trimesh(ret, mat, &ret->transformRoot);

	for (int y = 0; y < height; ++y) {
		for (int x = 0; x < width; ++x) {
			int pos = y * width + x;
			unsigned char pixel[3];
			memcpy(pixel, height_map + pos * 3, 3);
			double height = double(pixel[0] + pixel[1] + pixel[2]) / 3 / 128;
			vec3f point(x, y, height);
			trimesh->addVertex(point);
			if (x > 0 && y > 0) { //link the points
				trimesh->addFace(pos, pos - 1, pos - 1 - width);
				trimesh->addFace(pos, pos - 1 - width, pos - width);
			}
		}
	}
	
	char *error;
	if (error = trimesh->doubleCheck())
		throw ParseError(error);

	//add a trimesh
	ret->add(trimesh);

	//add a pointlight
	PointLight* point_light = new PointLight(ret, vec3f(width, height, 10), vec3f(1.0, 1.0, 1.0));
	ret->add(point_light);

	//set the camerea
	//TODO: calculate the correct viewing distance;
	vec3f map_center((double)width / 2 - 0.5, (double)height / 2 - 0.5, 0.5);
	double camera_distance = (double)width + 3.0;
	vec3f camera_pos(0, -camera_distance, 2 * camera_distance);
	camera_pos += map_center;
	ret->getCamera()->setEye(camera_pos);
	ret->getCamera()->setLook((map_center - camera_pos).normalize(), vec3f(0, 0, 1).normalize());

	return ret;
}
	void RenderSystem::PreRender(void)
	{
		// prepare renderer,
		m_spRenderer->PreRender();

		m_spRenderer->m_spShaderProgram->Enable();

		// view: camera position.
		glm::vec3 camera_pos(m_Scene.GetCamera().GetPositionVec3());
		m_spRenderer->m_spShaderProgram->SetParameter<glm::vec3>("CameraPosition", camera_pos);

		// TODO TEMP HERE UNTIL SUMMER BREAK REFACTOR.
		m_LightManager.SetupLights(m_spRenderer->m_spShaderProgram);
	}
コード例 #4
0
ファイル: main.cpp プロジェクト: amitahire/icg
void display(){
    opengp::update_title_fps("Intro. to Computer Graphics");   
    glViewport(0,0,window_width,window_height);    
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    
    ///--- Upload viewing matrices externally
    GLuint pid = mesh.getProgramID();
    glUseProgram(pid);
        mat4 MODEL = mat4::Identity();
        glUniformMatrix4fv(glGetUniformLocation(pid, "MODEL"), 1, GL_FALSE, MODEL.data());

        float theta_rad = M_PI/180.0*theta;
        vec3 camera_pos( 0, -2*cos(theta_rad), 2*sin(theta_rad));
        mat4 VIEW = Eigen::lookAt( camera_pos, vec3(0,0,0), vec3(0,0,1) ); //< "z" up on screen
        glUniformMatrix4fv(glGetUniformLocation(pid, "VIEW"), 1, GL_FALSE, VIEW.data());
        
        mat4 PROJ = Eigen::perspective(75.0f, window_width/(float)window_height, 0.1f, 10.0f);
        glUniformMatrix4fv(glGetUniformLocation(pid, "PROJ"), 1, GL_FALSE, PROJ.data());
    glUseProgram(pid);
    
    mesh.draw();
}
コード例 #5
0
ファイル: seal.c プロジェクト: gfphoenix/seal2d
void seal_start_game() {
    gettimeofday(&_lastUpdate, NULL);
    
    lua_State *L = GAME->lstate;
    assert(lua_gettop(L) == 0);
    lua_pushcfunction(L, traceback);

    lua_getfield(L, LUA_REGISTRYINDEX, GAME_INIT);
    seal_call(L, 0, 1);

    struct sprite* root = lua_touserdata(L, -1);
    GAME->root = root;
    lua_pop(L, 1);

    lua_getfield(L, LUA_REGISTRYINDEX, GAME_UPDATE);
    lua_getfield(L, LUA_REGISTRYINDEX, GAME_DRAW);
    lua_getfield(L, LUA_REGISTRYINDEX, GAME_PAUSE);
    lua_getfield(L, LUA_REGISTRYINDEX, GAME_RESUME);
    lua_getfield(L, LUA_REGISTRYINDEX, GAME_EVENT);
    
    camera_pos(GAME->global_camera,
               GAME->config.window_width/2,
               GAME->config.window_height/2);
}
コード例 #6
0
ファイル: view.cpp プロジェクト: nobbk/copo
/// render
void view::render() {

	// Clear Screen And Depth Buffer
	glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

	glEnable(GL_LIGHTING);
	glEnable(GL_LIGHT0);

	if (!m_world) {
		return;
	}

	if(ortho_sh)
	{
		glClearColor(0,0,0,1);
		modifiedmesh_drawable->set_render_faces(true);
		modifiedmesh_drawable->set_render_edges(false);
		modifiedmesh_drawable->set_render_normals(false);
		modifiedmesh_drawable->set_render_vertices(false);
		modifiedmesh_drawable->render();
		glFlush();
		int size = w()*h()*3;

		unsigned char *data = new unsigned char[size];
		glReadPixels(0,0, w(), h(),GL_RGB,GL_UNSIGNED_BYTE,data);

		ilInit();
		iluInit();
		ilutInit();

		ILuint ImageName;
		ilGenImages(1, &ImageName);
		ilBindImage(ImageName);
		ilTexImage(w(),h(),1,3,IL_RGB,IL_UNSIGNED_BYTE,data);

		//iluFlipImage();
		ilEnable(IL_FILE_OVERWRITE);

#ifdef _WIN32
		// Did not compile in linux:
		ilSaveImage(reinterpret_cast<const wchar_t *>(filename_screenshot.c_str()));
#else
		ilSaveImage(filename_screenshot.c_str());
#endif

		delete[] data;
		glClearColor(0.80f, 0.80f, 0.90f, 1.0f);
	}
	else
	{
		// Reset Modelview:
		glMatrixMode(GL_MODELVIEW);
		glLoadIdentity();
		glEnable(GL_BLEND);
		glEnable(GL_DEPTH_TEST);

		// Set modelviewmatrix
		m =	translate_44(0.0f, 0.0f, -cam_distance)
				* rotate_x_44(cam_polar)
				* rotate_y_44(cam_azimut)
				* translate_44(-cam_target.x(), -cam_target.y(), -cam_target.z() );

		// Transpose (here: invert) matrix:
		Mat44f mat_trans = transpose(m);

		point3f camera_pos(0.0, 0.0, 0.0);
		camera_pos = invert(m) * camera_pos;

		glLoadMatrixf( &mat_trans(0,0) );

		// Create light components
		GLfloat ambientLight[]	= { 0.0f, 0.0f, 0.0f, 1.0f };
		GLfloat diffuseLight[]	= { 1.0f, 1.0f, 1.0f, 1.0f };
		GLfloat specularLight[] = { 1.0f, 1.0f, 1.0f, 1.0f };
		GLfloat position[]		= { 1.0f, 1.0f, 1.0f, 0.0f };

		GLfloat globalAmbient[] = { 0.2f, 0.2f, 0.2f, 1.0f};
		glLightModelfv(GL_LIGHT_MODEL_AMBIENT, globalAmbient);

		// Assign created components to GL_LIGHT1
		glLightfv(GL_LIGHT0, GL_AMBIENT, ambientLight);
		glLightfv(GL_LIGHT0, GL_DIFFUSE, diffuseLight);
		glLightfv(GL_LIGHT0, GL_SPECULAR, specularLight);
		glLightfv(GL_LIGHT0, GL_POSITION, position);

		Rendering::RenderingInfo info( camera_pos, m_noise_tex );

		/* render the world */
		m_world->render( info );

		renderCoordinateSystem();

		//render_noise_texture();
	}
}
コード例 #7
0
ファイル: render_dx10.cpp プロジェクト: as2120/ZNginx
void RenderFrameDX10(void)
{
	Vector4 vClearColor(0.4f, 0.4f, 0.4f, 1.0f);

	// frame buffer
	ID3D10RenderTargetView *pRenderTargetView = GutGetDX10RenderTargetView(); 
	// depth/stencil buffer
	ID3D10DepthStencilView *pDepthStencilView = GutGetDX10DepthStencilView(); 
	// front/back buffer
	IDXGISwapChain *pSwapChain = GutGetDX10SwapChain(); 

	// `清除顏色`
	g_pDevice->ClearRenderTargetView(pRenderTargetView, (float *)&vClearColor);
	// `清除`Depth/Stencil buffer
	g_pDevice->ClearDepthStencilView(pDepthStencilView, D3D10_CLEAR_DEPTH | D3D10_CLEAR_STENCIL, 1.0f, 0);

	Vector4 camera_lookat(0.0f, 0.0f, 0.0f);
	int w, h;
	GutGetWindowSize(w, h);

	Matrix4x4 view_matrix;
	Matrix4x4 ortho_proj = GutMatrixOrthoRH_DirectX(20.0f, 20.0f, 0.1f, 100.0f);

	// `前視圖`
	{
		D3D10_VIEWPORT vp = {0, 0, w/2, h/2, 0.0f, 1.0f};
		g_pDevice->RSSetViewports(1, &vp);
		// view matrix
		Vector4 camera_pos(0.0f, -20.0f, 0.0f);
		Vector4 camera_up(0.0f, 0.0f, 1.0f);
		view_matrix = GutMatrixLookAtRH(camera_pos, camera_lookat, camera_up);
		// render objects
		RenderSolarSystemDX10(view_matrix, ortho_proj);
	}
	// `上視圖`
	{
		D3D10_VIEWPORT vp = {w/2, 0, w/2, h/2, 0.0f, 1.0f};
		g_pDevice->RSSetViewports(1, &vp);
		// view matrix
		Vector4 camera_pos(0.0f, 0.0f, 20.0f);
		Vector4 camera_up(0.0f, 1.0f, 0.0f);
		view_matrix = GutMatrixLookAtRH(camera_pos, camera_lookat, camera_up);
		// render objects
		RenderSolarSystemDX10(view_matrix, ortho_proj);
	}
	// `右視圖`
	{
		D3D10_VIEWPORT vp = {0, h/2, w/2, h/2, 0.0f, 1.0f};
		g_pDevice->RSSetViewports(1, &vp);
		// view matrix
		Vector4 camera_pos(20.0f, 0.0f, 0.0f);
		Vector4 camera_up(0.0f, 0.0f, 1.0f);
		view_matrix = GutMatrixLookAtRH(camera_pos, camera_lookat, camera_up);
		// render objects
		RenderSolarSystemDX10(view_matrix, ortho_proj);
	}
	// `使用者視角`
	{
		D3D10_VIEWPORT vp = {w/2, h/2, w/2, h/2, 0.0f, 1.0f};
		g_pDevice->RSSetViewports(1, &vp);
		// view matrix
		Matrix4x4 view_matrix = g_Control.GetViewMatrix();
		Matrix4x4 object_matrix = g_Control.GetObjectMatrix();
		view_matrix = object_matrix * view_matrix;
		// render objects
		RenderSolarSystemDX10(view_matrix, g_proj_matrix);
	}
	// `畫邊線`
	{
		UINT stride = sizeof(Vertex_VC);
		UINT offset = 0;

		D3D10_VIEWPORT vp = {0, 0, w, h, 0.0f, 1.0f};
		g_pDevice->RSSetViewports(1, &vp);

		// `設定`vertex shader
		g_pDevice->VSSetShader(g_pVertexShader);
		// `設定`pixel shader
		g_pDevice->PSSetShader(g_pPixelShader);
		// `設定vertex shader讀取參數的記憶體位置`
		g_pDevice->VSSetConstantBuffers(0, 1, &g_pConstantBuffer);

		Matrix4x4 *pConstData;
		g_pConstantBuffer->Map( D3D10_MAP_WRITE_DISCARD, NULL, (void **) &pConstData );
		pConstData->Identity();
		g_pConstantBuffer->Unmap();

		g_pDevice->IASetPrimitiveTopology(D3D10_PRIMITIVE_TOPOLOGY_LINELIST);
		g_pDevice->IASetVertexBuffers(0, 1, &g_pBorderVertexBuffer, &stride, &offset);
		g_pDevice->Draw(4, 0);
	}
	// `等待硬體掃結束, 然後才更新畫面.`
	pSwapChain->Present(1, 0);
}
コード例 #8
0
ファイル: main.cpp プロジェクト: DiogoDantas/GraphicPipeline
//-----------------------------------------------------------------------------
void MyGlDraw(void)
{

	clearScreen();
	//*************************************************************************
	// Chame aqui as funções do mygl.h
	//*************************************************************************

	objData = new objLoader();			// cria o objeto que carrega o modelo
	objData->load("models/monkey_head2.obj");	// a carga do modelo é indicada atraves do nome do arquivo.
						// Neste caso, deve ser sempre do tipo OBJ.

	/**************creating the list of all vertexs**********************/
	std::vector<glm::vec4> vertex_list;
	std::vector<Vertex> my_list;
	obj_vector* vector;
	obj_face* faces;

	//std::cout<<"object vertex list"<<std::endl;
	for (int i = 0; i < objData->vertexCount; ++i)
	{
		vector =  objData->vertexList[i];
		glm::vec4 aux(vector->e[0], vector->e[1], vector->e[2], 1.0);
		//PrintVec4(aux);
		vertex_list.push_back(aux);
	}

	/******OBJECT SPACE TO UNIVERSE SPACE******/
	glm::mat4 Scale = glm::mat4(2.0);
	Scale[3].w = 1.0;

	glm::mat4 Trans = glm::mat4(1.0);
	glm::vec4 v(1.0,1.0, 1.0, 1.0);
	Trans[3] = v;

	glm::mat4 Rotate = glm::mat4(1.0);
    Rotate[0].x = cos(angle +=1 * PI/180.0);
    Rotate[2].x = sin(angle +=1 * PI/180.0);
    Rotate[0].z = - sin(angle +=1 * PI/180.0);
    Rotate[2].z = cos(angle +=1 * PI/180.0);
    Rotate[3].w = 1.0;

	glm::mat4 M_Model = Rotate * Scale;

	/******OBJECT SPACE TO UNIVERSE SPACE******/

	/******UNIVERSE SPACE TO CAMERA SPACE******/

	glm::vec3 camera_pos(0.0,0.0,5.0);
	glm::vec3 look_at(0.0,0.0,0.0);
	glm::vec3 camera_up(0.0,1.0,0.0);

	glm::vec3 camera_dir = look_at - camera_pos;


	glm::vec3 z_camera = -normalize(camera_dir);
	glm::vec3 x_camera = normalize(cross(camera_up, z_camera));
	glm::vec3 y_camera = normalize(cross(z_camera, x_camera));


	glm::vec4 homog(0.0,0.0,0.0,1.0);

	glm::mat4 B = glm::mat4(1.0);

	B[0]= glm::vec4 (x_camera,0.0);
	B[1]= glm::vec4 (y_camera,0.0);
	B[2]= glm::vec4 (z_camera,0.0);
	B[3]=homog;

	glm::mat4 trans = glm::mat4(1.0);
	trans[3] = glm::vec4 (-camera_pos, 1.0);

	glm::mat4 M_View = transpose(B) * trans;

	glm::mat4 Model_View = M_View * M_Model;

	/******UNIVERSE SPACE TO CAMERA SPACE******/

	/******CAMERA SPACE TO PROJECTION SPACE (CLIPPING)******/

	double d=1.0;

	glm::mat4 M_Projection = glm::mat4(1.0);
	M_Projection[2] = glm::vec4(0.0, 0.0, 1.0, -1.0/d);
	M_Projection[3] = glm::vec4(0.0, 0.0, d, 0.0);


	glm::mat4 M_ModelViewProjection = M_Projection * Model_View;



	/******CAMERA SPACE TO PROJECTION SPACE (CLIPPING)******/

	/******PROJECTION SPACE (CLIPPING) TO CANONICAL SPACE******/
	//std::cout<<"PRINTING"<<std::endl;

	for (int i = 0; i < objData->vertexCount; ++i)
	{
		vertex_list[i]=M_ModelViewProjection*vertex_list[i];
		vertex_list[i].x=vertex_list[i].x/vertex_list[i].w;
		vertex_list[i].y=vertex_list[i].y/vertex_list[i].w;
		vertex_list[i].z=vertex_list[i].z/vertex_list[i].w;
		vertex_list[i].w=vertex_list[i].w/vertex_list[i].w;
	}

	/******PROJECTION SPACE (CLIPPING) TO CANONICAL SPACE******/

	/******CANONICAL SPACE TO SCREEN SPACE******/
	glm::mat4 Translation_Screen = glm::mat4(1.0);
	Translation_Screen[3] = glm::vec4((IMAGE_WIDTH -1)/2, (IMAGE_HEIGHT -1)/2, 0.0, 1.0);

	glm::mat4 Scale_Screen = glm::mat4(1.0);
	Scale_Screen[0].x = IMAGE_WIDTH/2;
	Scale_Screen[1].y = IMAGE_HEIGHT/2;

	glm::mat4 InvertY_Screen = glm::mat4(1.0);
	InvertY_Screen[1].y = -1.0;

	glm::mat4 Final_Matrix = glm::mat4(1.0);
	//Final_Matrix = InvertY_Screen * Scale_Screen * Translation_Screen;
	Final_Matrix = Translation_Screen * Scale_Screen * InvertY_Screen;
	//PrintMatrix(Final_Matrix);

	for (int i = 0; i < objData->vertexCount; ++i)
	{
		vertex_list[i] = Final_Matrix * vertex_list[i];
		//PrintVec4(vertex_list[i]);
	}

	/******CANONICAL SPACE TO SCREEN SPACE******/


	//std::cout<<"object vertex list"<<std::endl;
	for (int i = 0; i < objData->vertexCount; ++i)
	{
		Vertex tmp;

		tmp.setX(round(vertex_list[i].x));
		tmp.setY(round(vertex_list[i].y));
		tmp.setZ(round(vertex_list[i].z));
		tmp.setW(round(vertex_list[i].w));

		my_list.push_back(tmp);
	}


	for (int i = 0; i < objData->faceCount; ++i)
	{
		faces = objData->faceList[i];
		my_list[faces->vertex_index[0]].DrawTriangle(my_list[faces->vertex_index[1]], my_list[faces->vertex_index[2]]);
	}






}
コード例 #9
0
ファイル: render_opengl.cpp プロジェクト: chenbk85/3dlearn
// 使用OpenGL來繪圖
void RenderFrameOpenGL(void)
{
	// `取得視窗大小`
	int w, h;
	GutGetWindowSize(w, h);
	// `清除畫面`
	glClearColor(0.4f, 0.4f, 0.4f, 1.0f);
	glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

	Vector4 camera_lookat(0.0f, 0.0f, 0.0f);
	Matrix4x4 ortho_proj = GutMatrixOrthoRH_OpenGL(20.0f, 20.0f, 0.1f, 100.0f);

	{
		// `前視圖`
		glViewport(0, h/2, w/2, h/2);
		// view matrix
		Vector4 camera_pos(0.0f, -20.0f, 0.0f);
		Vector4 camera_up(0.0f, 0.0f, 1.0f);
		g_view_matrix = GutMatrixLookAtRH(camera_pos, camera_lookat, camera_up);
		// projection matrix
		glMatrixMode(GL_PROJECTION);
		glLoadMatrixf(&ortho_proj[0][0]);
		// render objects
		RenderSolarSystemOpenGL();
	}
	{
		// `上視圖`
		glViewport(w/2, h/2, w/2, h/2);
		// view matrix
		Vector4 camera_pos(0.0f, 0.0f, 20.0f);
		Vector4 camera_up(0.0f, 1.0f, 0.0f);
		g_view_matrix = GutMatrixLookAtRH(camera_pos, camera_lookat, camera_up);
		// projection matrix
		glMatrixMode(GL_PROJECTION);
		glLoadMatrixf(&ortho_proj[0][0]);
		// render objects
		RenderSolarSystemOpenGL();
	}
	{
		// `右視圖`
		glViewport(0, 0, w/2, h/2);
		// view matrix
		Vector4 camera_pos(20.0f, 0.0f, 0.0f);
		Vector4 camera_up(0.0f, 0.0f, 1.0f);
		g_view_matrix = GutMatrixLookAtRH(camera_pos, camera_lookat, camera_up);
		// projection matrix
		glMatrixMode(GL_PROJECTION);
		glLoadMatrixf(&ortho_proj[0][0]);
		// render objects
		RenderSolarSystemOpenGL();
	}
	{
		// `使用者視角`
		glViewport(w/2, 0, w/2, h/2);
		// object * view matrix
		Matrix4x4 object_matrix = g_Control.GetObjectMatrix();
		Matrix4x4 view_matrix = g_Control.GetViewMatrix();
		g_view_matrix = object_matrix * view_matrix;
		// projection matrix
		glMatrixMode(GL_PROJECTION);
		glLoadMatrixf(&g_projection_matrix[0][0]);
		// render objects
		RenderSolarSystemOpenGL();
	}
	{
		// `畫出viewport的邊界`
		glViewport(0, 0, w, h);

		glPushClientAttrib(GL_CLIENT_VERTEX_ARRAY_BIT);

		glEnableClientState(GL_VERTEX_ARRAY);
		// projection matrix
		glMatrixMode(GL_PROJECTION);
		glLoadIdentity();
		// worldview matrix
		glMatrixMode(GL_MODELVIEW);
		glLoadIdentity();
		// `畫邊界`
		glColor4f(1.0f, 1.0f, 1.0f, 1.0f);
		glVertexPointer(3, GL_FLOAT, sizeof(Vertex_VC), g_Border);
		glDrawArrays(GL_LINES, 0, 4);

		glPopClientAttrib();
	}
	// `把背景backbuffer的畫面呈現出來`
	GutSwapBuffersOpenGL();
}
コード例 #10
0
ファイル: raytracer.cpp プロジェクト: ootz0rz/Raytracer-1
void wmonkey_scene_2()
{
    printf("WOODEN MONKEY SCENE : 2 (path tracing) ----------------------------------\n\n");
    Raytracer rt;
    int width = 16 * 20 * 2;
    int height = 12 * 20 * 2;

    // room dimensions
    double wDiameter = 20;
    double wRadius = wDiameter / 2;
    double wallSize[] = {wDiameter + DBL_EPSILON, wDiameter + DBL_EPSILON, wDiameter + DBL_EPSILON};

    // Camera parameters.
    Point3D camera_pos(0, 0, 1);
    Vector3D camera_target(0, 0, -1);
    Vector3D up(0, 1, 0);
    double fov = 65;

    double l0c = .9;
    PointLight * light0 = new PointLight(
        //			Point3D(-wDiameter - roomRad + (roomRad / 2), 50 * 2, 50 * 2),
        Point3D(0, wRadius - 5, 0),
        Colour(l0c, l0c, l0c),
        0.2);
    rt.addLightSource(light0);

    // http://en.wikipedia.org/wiki/Cornell_Box
    // http://www.kevinbeason.com/smallpt/#moreinfo
    Material matLight(
        Colour(1, 1, 1) 			// ambient
        , Colour(1, 1, 1)			// diffuse
        , Colour(1, 1, 1)			// spec
        , 0, 0, 0, 0
    );

    Material matMirror(
        Colour(0.3, 0.3, 0.3) 			// ambient
        , Colour(0.1, 0.1, 0.1)		// diffuse
        , Colour(0.628281, 0.555802, 0.366065)		// spec
        , 51.2, 1.0
    );

    Material matGlass(
        Colour(0, 0, 0) 			// ambient
        , Colour(0.1, 0.1, 0.1)			// diffuse
        , Colour(1.0, 1.0, 1.0)		// spec
        , 100, 0.0, 1.01, 0.9
    );

    Material matBeige(
        Colour(0.607843, 0.549019, 0.372549) 			// ambient
        , Colour(0.741176, 0.686274, 0.525490)		// diffuse
        , Colour(0.933333, 0.901960, 0.807843)		// spec
        , 12.8
    );

    Material matReddishWall(
        Colour(.25, .25, .25) 			// ambient
        , Colour(.75, .25, .25)		// diffuse
        , Colour(.3, .3, .3)		// spec
        , 2, 0, 0, 0
    );

    Material matBluishWall(
        Colour(.25, .25, .25) 			// ambient
        , Colour(.25, .25, .75)		// diffuse
        , Colour(.3, .3, .3)		// spec
        , 2, 0, 0, 0
    );

    Material matGreenishWall(
        Colour(.25, .25, .25) 			// ambient
        , Colour(.25, .75, .25)		// diffuse
        , Colour(.3, .3, .3)		// spec
        , 2, 0, 0, 0
    );

    Material matBaseWall(
        Colour(.25, .25, .25) 			// ambient
        , Colour(.25, .25, .25)		// diffuse
        , Colour(.6, .6, .6)		// spec
        , 2, 0, 0, 0
    );

    // create and position the box
    SceneDagNode* wallLeft = rt.addObject( new UnitSquare(), &matReddishWall );
    SceneDagNode* wallRight = rt.addObject( new UnitSquare(), &matBluishWall );
    SceneDagNode* wallFront = rt.addObject( new UnitSquare(), &matBaseWall );
    SceneDagNode* wallTop = rt.addObject( new UnitSquare(), &matLight );
    SceneDagNode* wallBot = rt.addObject( new UnitSquare(), &matGreenishWall );

    rt.translate(wallFront, Vector3D(0, 0, -wDiameter - wRadius + DBL_EPSILON));
    rt.scale(wallFront, Point3D(0, 0, 0), wallSize);

    rt.translate(wallRight, Vector3D(wRadius, 0, -wDiameter + DBL_EPSILON));
    rt.rotate(wallRight, 'y', -90);
    rt.scale(wallRight, Point3D(0, 0, 0), wallSize);

    rt.translate(wallLeft, Vector3D(-wRadius, 0, -wDiameter + DBL_EPSILON));
    rt.rotate(wallLeft, 'y', 90);
    rt.scale(wallLeft, Point3D(0, 0, 0), wallSize);

    rt.translate(wallTop, Vector3D(0, wRadius, -wDiameter + DBL_EPSILON));
    rt.rotate(wallTop, 'x', 90);
    rt.scale(wallTop, Point3D(0, 0, 0), wallSize);

    rt.translate(wallBot, Vector3D(0, -wRadius, -wDiameter + DBL_EPSILON));
    rt.rotate(wallBot, 'x', -90);
    rt.scale(wallBot, Point3D(0, 0, 0), wallSize);

    // create some objects within the box...
    SceneDagNode* sphere_chrome = rt.addObject( new UnitSphere(), &matGlass );
    double _sChrome_size = 2;
    double _sChrome[] = {_sChrome_size, _sChrome_size, _sChrome_size};
    rt.translate(sphere_chrome,
                 Vector3D(wRadius / 3 * 2,
                          -wRadius + (_sChrome_size),
                          -wDiameter + (wRadius / 3)));
    rt.scale(sphere_chrome, Point3D(0, 0, 0), _sChrome);

    SceneDagNode* sphere_glass = rt.addObject( new UnitSphere(), &matMirror );
    double _sGlass_size = 2.5;
    double _sGlass[] = {_sGlass_size, _sGlass_size, _sGlass_size};
    rt.translate(sphere_glass,
                 Vector3D(-wRadius / 3 * 2,
                          -wRadius + (_sGlass_size),
                          -wDiameter - (wRadius / 3)));
    rt.scale(sphere_glass, Point3D(0, 0, 0), _sGlass);

    SceneDagNode* sphere_beige = rt.addObject( new UnitSphere(), &matBeige );
    double _sBeige_size = 3.5;
    double _sBeige[] = {_sBeige_size, _sBeige_size, _sBeige_size};
    rt.translate(sphere_beige,
                 Vector3D(wRadius / 3 * 2,
                          -wRadius + (_sGlass_size * 2),
                          -wDiameter - (wRadius / 3)));
    rt.scale(sphere_beige, Point3D(0, 0, 0), _sBeige);

    rt.setAAMode(Raytracer::AA_SUPER_SAMPLING);
    rt.setAAMode(Raytracer::NONE);
    rt.setShadingMode(Raytracer::SCENE_MODE_DIFFUSE);
    rt.setShadows(Raytracer::SHADOW_CAST);
    rt.setEnvMapMode(Raytracer::ENV_MAP_CUBE_SKYBOX);
    //	rt.setColorSpaceMode(Raytracer::COLOR_ENC_SRGB_GAMMA_CORRECT);
    rt.setReflDepth(4);

    // refraction if it's turned on
    if (REFRACTION_FLAG) {
        rt.setRefractionMode(REFRACTION_FLAG);
    }

    if ( rt.getEnvMapMode() != Raytracer::NONE ) {
        // load images
        EnvMap env;
        if ( _DEBUG ) {
            env = EnvMap(
                      "EnvMaps/DebugMaps/posx.bmp",
                      "EnvMaps/DebugMaps/posy.bmp",
                      "EnvMaps/DebugMaps/posz.bmp",
                      "EnvMaps/DebugMaps/negx.bmp",
                      "EnvMaps/DebugMaps/negy.bmp",
                      "EnvMaps/DebugMaps/negz.bmp"
                  );
        } else {
            env = EnvMap(
                      "EnvMaps/SaintLazarusChurch/posx.bmp",
                      "EnvMaps/SaintLazarusChurch/posy.bmp",
                      "EnvMaps/SaintLazarusChurch/posz.bmp",
                      "EnvMaps/SaintLazarusChurch/negx.bmp",
                      "EnvMaps/SaintLazarusChurch/negy.bmp",
                      "EnvMaps/SaintLazarusChurch/negz.bmp"
                  );
        }

        rt.setEnvMap(env);
    }

    printf("WOODEN MONKEY SCENE : 2 :: Rendering...\n");
    rt.render(width, height, camera_pos, camera_target, up, fov, "wmonkey_2.bmp");
    printf("WOODEN MONKEY SCENE : 2 :: Done!\n");
}