Example #1
0
	void postInitialize()
	{
		DEBUGLOG->log("Loading some objects");
		DEBUGLOG->indent();
		
			DEBUGLOG->log("Loading test room dae file");
			DEBUGLOG->indent();
				std::vector< Object* > testRoom=  m_resourceManager.loadObjectsFromFile( RESOURCES_PATH "/testRoom.dae" );
			DEBUGLOG->outdent();

			DEBUGLOG->log("Loading overlapping geometry file");
			DEBUGLOG->indent();
				std::vector< Object* > overlappingGeometry =  m_resourceManager.loadObjectsFromFile( RESOURCES_PATH "/overlappingGeometry.dae" );
			DEBUGLOG->outdent();

		DEBUGLOG->log("Loading some objects complete");
		DEBUGLOG->outdent();

		DEBUGLOG->log("Adding objects to a scene instance");
		DEBUGLOG->indent();
			Scene* scene = new Scene();
			scene->addObjects( testRoom );
			scene->addObjects( overlappingGeometry );

			DEBUGLOG->log("Creating scene graph nodes");
			DEBUGLOG->indent();

//				DEBUGLOG->log("Creating node tree for rotating node");
//				Node* positionNode = new Node(scene->getSceneGraph()->getRootNode());
//				positionNode->translate( glm::vec3(0.0f, 0.0f, 0.0f) );

//				RotatingNode* yAxisRotationNode = new RotatingNode(positionNode);
//				yAxisRotationNode->setAngle(0.005f);
//				yAxisRotationNode->setRotationAxis( glm::vec3( 0.0f, 1.0f, 0.0f ) );
//
//				RotatingNode* rotatingNode = new RotatingNode(yAxisRotationNode);
//				rotatingNode->setRotationAxis(glm::vec3 ( 1.0f, 1.0f, 0.1f));
//				rotatingNode->setAngle(0.01f);

//				DEBUGLOG->log("Adding updatable rotation nodes to scene");
//				scene->addUpdatable(yAxisRotationNode);
//				scene->addUpdatable(rotatingNode);

//				DEBUGLOG->log("Creating renderable node for overlapping geometry attached to rotating node");
//				RenderableNode* overlappingGeometryNode = new RenderableNode(rotatingNode);

				Node* sceneNode = new Node(scene->getSceneGraph()->getRootNode() );

				RenderableNode* overlappingGeometryNode = new RenderableNode( sceneNode );
				overlappingGeometryNode->setObject(overlappingGeometry[0]);

				DEBUGLOG->log("Creating renderable node for test room");
				RenderableNode* testRoomNode = new RenderableNode( sceneNode );
				testRoomNode->scale( glm::vec3(0.56f, 0.56f, 0.56f) );
				testRoomNode->setObject(testRoom[0]);

				DEBUGLOG->log("Creating camera parent node");
				Node* 		cameraParentNode = new Node( scene->getSceneGraph()->getRootNode() );

			DEBUGLOG->outdent();
		DEBUGLOG->outdent();
		
		DEBUGLOG->log("Setting scene instance as active scene ");
		m_sceneManager.setActiveScene(scene);	

		DEBUGLOG->log("Configuring Rendering");
		DEBUGLOG->indent();

			DEBUGLOG->log("Creating phong renderpass");
			DEBUGLOG->indent();
				Shader* phongOrtho = new Shader(SHADERS_PATH "/myShader/phong.vert", SHADERS_PATH "/myShader/phong_backfaceCulling_ortho.frag");
				FramebufferObject* fbo = new FramebufferObject(512,512);
				fbo->addColorAttachments(1);

				CameraRenderPass* phongOrthoRenderPass = new CameraRenderPass(phongOrtho, fbo);
				phongOrthoRenderPass->setViewport(0,0,512,512);
				phongOrthoRenderPass->setClearColor( 0.1f, 0.1f, 0.1f, 1.0f );
				phongOrthoRenderPass->addEnable(GL_DEPTH_TEST);
				phongOrthoRenderPass->addClearBit(GL_DEPTH_BUFFER_BIT);
				phongOrthoRenderPass->addClearBit(GL_COLOR_BUFFER_BIT);

				CameraNode* orthographicCamera = new CameraNode(cameraParentNode);
				orthographicCamera->setProjectionMatrix(glm::ortho(-5.0f, 5.0f, -5.0f, 5.0f, 0.0f, 20.0f));
				orthographicCamera->setPosition(0.0f,0.0f,5.0f);
				phongOrthoRenderPass->setCamera(orthographicCamera);
			DEBUGLOG->outdent();

			DEBUGLOG->log("Creating perspective phong renderpass");
			DEBUGLOG->indent();
				Shader* phongPersp= new Shader(SHADERS_PATH "/myShader/phong.vert", SHADERS_PATH "/myShader/phong_backfaceCulling_persp.frag");
				FramebufferObject* fbo2 = new FramebufferObject(512,512);
				fbo2->addColorAttachments(1);

				CameraRenderPass* phongPerspectiveRenderPass = new CameraRenderPass(phongPersp, fbo2);
				phongPerspectiveRenderPass->setViewport(0,0,512,512);
				phongPerspectiveRenderPass->setClearColor( 0.1f, 0.1f, 0.1f, 1.0f );
				phongPerspectiveRenderPass->addEnable(GL_DEPTH_TEST);
				phongPerspectiveRenderPass->addClearBit(GL_DEPTH_BUFFER_BIT);
				phongPerspectiveRenderPass->addClearBit(GL_COLOR_BUFFER_BIT);

				CameraNode* perspectiveCamera = new CameraNode(cameraParentNode);
				perspectiveCamera->setProjectionMatrix(glm::perspective(60.0f, 1.0f, 0.1f, 100.0f));
				perspectiveCamera->setPosition(0.0f,0.0f,5.0f);
				phongPerspectiveRenderPass->setCamera(perspectiveCamera);
			DEBUGLOG->outdent();

			DEBUGLOG->log("Creating grid overlay renderpasses");
			DEBUGLOG->indent();
				Shader* gridPersp= new Shader(SHADERS_PATH "/grid/simpleVertex.vert", SHADERS_PATH "/grid/simpleColor.frag");

				GridRenderPass* gridPerspectiveRenderPass = new GridRenderPass(gridPersp, fbo2);	// just render on top of that other render pass
				gridPerspectiveRenderPass->setViewport(0,0,512,512);
				gridPerspectiveRenderPass->addEnable(GL_DEPTH_TEST);
				gridPerspectiveRenderPass->addEnable(GL_BLEND);

				gridPerspectiveRenderPass->setCamera(perspectiveCamera);

				GridRenderPass* gridOrthoRenderPass = new GridRenderPass(gridPersp, fbo);	// just render on top of that other render pass
				gridOrthoRenderPass->setViewport(0,0,512,512);
				gridOrthoRenderPass->addEnable(GL_DEPTH_TEST);
				gridOrthoRenderPass->addEnable(GL_BLEND);

				gridOrthoRenderPass->setCamera(orthographicCamera);

			DEBUGLOG->outdent();

			DEBUGLOG->log("Adding objects to perspective phong render pass");
			phongPerspectiveRenderPass->addRenderable(overlappingGeometryNode);
			phongPerspectiveRenderPass->addRenderable(testRoomNode);

			DEBUGLOG->log("Adding objects to ortho phong render pass");
			phongOrthoRenderPass->addRenderable(overlappingGeometryNode);
			phongOrthoRenderPass->addRenderable(testRoomNode);

			DEBUGLOG->log("Adding renderpasses to application");
			m_renderManager.addRenderPass(phongPerspectiveRenderPass);
			m_renderManager.addRenderPass(phongOrthoRenderPass);
			m_renderManager.addRenderPass(gridPerspectiveRenderPass);
			m_renderManager.addRenderPass(gridOrthoRenderPass);

			DEBUGLOG->log("Creating screen filling triangle render passes");
			DEBUGLOG->indent();
				Shader* showTexture = new Shader(SHADERS_PATH "/screenspace/screenFill.vert" ,SHADERS_PATH "/screenspace/simpleTexture.frag");
				DEBUGLOG->indent();
					DEBUGLOG->log("Creating screen filling triangle rendering on screen for ortho phong render pass");
					TriangleRenderPass* showRenderPass = new TriangleRenderPass(showTexture, 0, m_resourceManager.getScreenFillingTriangle());
					showRenderPass->setViewport(0,0,512,512);
					showRenderPass->addClearBit(GL_COLOR_BUFFER_BIT);

					Texture* renderPassTexture = new Texture();
					renderPassTexture->setTextureHandle(phongOrthoRenderPass->getFramebufferObject()->getColorAttachmentTextureHandle(GL_COLOR_ATTACHMENT0));
					showRenderPass->addUniformTexture(renderPassTexture, "uniformTexture");

					m_renderManager.addRenderPass(showRenderPass);
				DEBUGLOG->outdent();

				DEBUGLOG->indent();
				DEBUGLOG->log("Creating screen filling triangle rendering for perspective phong render pass");
					TriangleRenderPass* showRenderPassPerspective = new TriangleRenderPass(showTexture, 0, m_resourceManager.getScreenFillingTriangle());
					showRenderPassPerspective->setViewport(512,0,512,512);

					Texture* renderPassPerspectiveTexture = new Texture();
					renderPassPerspectiveTexture->setTextureHandle(phongPerspectiveRenderPass->getFramebufferObject()->getColorAttachmentTextureHandle(GL_COLOR_ATTACHMENT0));
					showRenderPassPerspective->addUniformTexture(renderPassPerspectiveTexture, "uniformTexture");

					m_renderManager.addRenderPass(showRenderPassPerspective);
				DEBUGLOG->outdent();
			DEBUGLOG->outdent();
		DEBUGLOG->outdent();

		/**************************************************************************************
		 * 								VOXELGRID SETUP
		 **************************************************************************************/

		DEBUGLOG->log("Configuring voxel grid");
		DEBUGLOG->indent();
			DEBUGLOG->log("Creating voxel grid object");
			DEBUGLOG->indent();
				Grid::AxisAlignedVoxelGrid* axisAlignedVoxelGrid = new Grid::AxisAlignedVoxelGrid(-5.0f, -5.0f, -5.0f, 20, 20, 20, 0.5f);
				DEBUGLOG->log("Grid width    : ", axisAlignedVoxelGrid->getWidth());
				DEBUGLOG->log("Grid height   : ", axisAlignedVoxelGrid->getHeight());
				DEBUGLOG->log("Grid depth    : ", axisAlignedVoxelGrid->getDepth());
				DEBUGLOG->log("Grid cell size: ", axisAlignedVoxelGrid->getCellSize());
			DEBUGLOG->outdent();

			DEBUGLOG->log("Creating parent node for voxel grid related geometry");
			Node* voxelGridNode = new Node( scene->getSceneGraph()->getRootNode() );
		DEBUGLOG->outdent();

		/**************************************************************************************
		 * 								VOXELIZATION
		 **************************************************************************************/
		DEBUGLOG->log("Voxelizing scene");
		DEBUGLOG->indent();
			DEBUGLOG->log("Creating voxelizer object");
			DEBUGLOG->indent();
				// objects to be voxelized
				std::vector<Object* > objects = scene->getObjects();
				std::vector<RenderPass* > gridCellRenderPasses;
				gridCellRenderPasses.push_back( gridOrthoRenderPass );
				gridCellRenderPasses.push_back( gridPerspectiveRenderPass );
				// create voxelizer
				CPUVoxelizer* voxelizer = new CPUVoxelizer(axisAlignedVoxelGrid, scene, &m_resourceManager, objects, voxelGridNode, gridCellRenderPasses);

				// configure display of cells
				m_resourceManager.getCube()->getMaterial()->setAttribute("uniformRed", 0.5f);
				m_resourceManager.getCube()->getMaterial()->setAttribute("uniformGreen", 0.1f);
				m_resourceManager.getCube()->getMaterial()->setAttribute("uniformBlue", 0.1f);
				m_resourceManager.getCube()->getMaterial()->setAttribute("uniformAlpha", 0.6f);

				// call voxelizer once
				DEBUGLOG->log("Executing voxelization");
				DEBUGLOG->indent();
					voxelizer->call();
				DEBUGLOG->outdent();
			DEBUGLOG->outdent();
		DEBUGLOG->outdent();

			DEBUGLOG->log("Creating voxel grid model");
			Model* gridModel = m_resourceManager.generateVoxelGridModel(axisAlignedVoxelGrid->getWidth(), axisAlignedVoxelGrid->getHeight(), axisAlignedVoxelGrid->getDepth(), axisAlignedVoxelGrid->getCellSize());
			axisAlignedVoxelGrid->setModel(gridModel);
			axisAlignedVoxelGrid->getMaterial()->setAttribute("uniformRed",   0.7f);
			axisAlignedVoxelGrid->getMaterial()->setAttribute("uniformGreen", 0.7f);
			axisAlignedVoxelGrid->getMaterial()->setAttribute("uniformBlue",  0.7f);
			axisAlignedVoxelGrid->getMaterial()->setAttribute("uniformAlpha", 0.1f);

			DEBUGLOG->log("Creating renderable node voxel grid object");
			RenderableNode* axisAlignedVoxelGridNode = new RenderableNode( voxelGridNode );
			axisAlignedVoxelGridNode->setObject(axisAlignedVoxelGrid);
			axisAlignedVoxelGridNode->translate( glm::vec3(axisAlignedVoxelGrid->getX(), axisAlignedVoxelGrid->getY(), axisAlignedVoxelGrid->getZ() ) );

//			DEBUGLOG->log("Adding voxel grid object to render passes");
//			gridPerspectiveRenderPass->addRenderable(axisAlignedVoxelGridNode);
//			gridOrthoRenderPass->addRenderable(axisAlignedVoxelGridNode);

		DEBUGLOG->outdent();

		DEBUGLOG->log("Configuring Input");
		DEBUGLOG->indent();
			DEBUGLOG->log("Configuring camera movement");
			Camera* movableCam = phongOrthoRenderPass->getCamera();
			Camera* movableCamClone = phongPerspectiveRenderPass->getCamera();

			SimpleScene::configureSimpleCameraMovement( movableCam , this, 2.5);
			SimpleScene::configureSimpleCameraMovement( movableCamClone, this , 2.5);

			// voxelize on key press : V
			m_inputManager.attachListenerOnKeyPress( voxelizer, GLFW_KEY_V, GLFW_PRESS);

			// restore on key press  : R
			m_inputManager.attachListenerOnKeyPress( new SimpleScene::SceneGraphState( scene->getSceneGraph() ), GLFW_KEY_R, GLFW_PRESS);

			DEBUGLOG->log("Configuring Turntable for scene node");
			Turntable* turntable = SimpleScene::configureTurnTable(sceneNode, this, 0.05f, GLFW_MOUSE_BUTTON_LEFT);
			Turntable* turntableCamera = SimpleScene::configureTurnTable(cameraParentNode, this, 0.05f, GLFW_MOUSE_BUTTON_RIGHT);

		DEBUGLOG->outdent();

	}