void generateRenderableNodes() { DEBUGLOG->log("Generating renderable nodes from filled cells"); for ( unsigned int i = 0; i < m_filledGridCells.size(); i++) { RenderableNode* filledCell = new RenderableNode( p_parentNode ); filledCell->scale( glm::vec3(p_axisAlignedVoxelGrid->getCellSize() ) ); // filledCell->translate( p_axisAlignedVoxelGrid->getGridCellCenter( m_filledGridCells[i].second) ); filledCell->translate( m_filledGridCells[i].second ); filledCell->setObject( p_resourceManager->getCube( ) ); m_renderableNodes.push_back(filledCell); } }
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(); }