Example #1
0
 Node* CameraNode::Clone() const
 {
     CameraNode* node = new CameraNode;
     node->SetCamera(m_camera);
     CloneInternals(node);
     return node;
 }
Example #2
0
int SceneManager::checkNodeVisibility( SceneNode &node, CameraNode &cam, bool checkOcclusion, bool calcLod )
{
	// Note: This function is a bit hacky with all the hard-coded node types
	
	if( node._dirty ) updateNodes();

	// Check occlusion
	if( checkOcclusion && cam._occSet >= 0 )
	{
		if( node.getType() == SceneNodeTypes::Mesh && cam._occSet < (int)((MeshNode *)&node)->_occQueries.size() )
		{
			if( gRDI->getQueryResult( ((MeshNode *)&node)->_occQueries[cam._occSet] ) < 1 )
				return -1;
		}
		else if( node.getType() == SceneNodeTypes::Emitter && cam._occSet < (int)((EmitterNode *)&node)->_occQueries.size() )
		{
			if( gRDI->getQueryResult( ((EmitterNode *)&node)->_occQueries[cam._occSet] ) < 1 )
				return -1;
		}
		else if( node.getType() == SceneNodeTypes::Light && cam._occSet < (int)((LightNode *)&node)->_occQueries.size() )
		{
			if( gRDI->getQueryResult( ((LightNode *)&node)->_occQueries[cam._occSet] ) < 1 )
				return -1;
		}
	}
	
	// Frustum culling
	if( cam.getFrustum().cullBox( node.getBBox() ) )
		return -1;
	else if( calcLod )
		return node.calcLodLevel( cam.getAbsPos() );
	else
		return 0;
}
void StockShapeSelector::MousePressEvent(QMouseEvent* event) {
  // Convert the mouse coordinates into a world-space ray.
  Viewport* viewport = renderer_->GetViewport();
  CameraNode* camera = viewport->GetCamera();
  const QVector3D dir = camera->Unproject(event->x(), event->y()).normalized();
  const QVector3D start = camera->Translation();

  // Cast the ray into the scene to select an object. This query is performed
  // using axis-aligned bounding boxes, which are fast and generally
  // sufficient. The bounding boxes are automatically computed from the scene
  // graph geometry, so we get the tests "for free".
  //
  // If we wanted more precise ray casting, then we could cull the results of
  // the query with a more exact method (e.g., based on a custom collision
  // volume).
  const int64_t selection_mask = 0x1;
  SelectionQuery query(renderer_->GetScene());
  std::vector<QueryResult> qresult = query.CastRay(selection_mask, start, dir);

  if (qresult.empty()) {
    return;
  }

  // Found an object. Pass it on to StockShapeRenderer
  QueryResult& first_result = qresult.front();
  renderer_->NodeSelected(first_result.node);
}
Example #4
0
int main(int argc, char** argv)
{
    ros::init(argc, argv, "camnode", ros::init_options::AnonymousName);
    ros::NodeHandle node;
    ros::NodeHandle node_priv("~");
    DynamicReconfigureCameraConfig config_srv;
    DynamicReconfigureCameraConfig::CallbackType cb;
    CameraNode* cn = new CameraNode(node_priv, argc,argv);
    cb = boost::bind(&CameraNode::config_callback, cn, _1, _2);
    config_srv.setCallback(cb);
    return cn->run();
}
Example #5
0
State::stateResult_t SurfelRenderer::doEnableState(FrameContext & context, Node * node, const RenderParam & rp) {
	State::stateResult_t result = NodeRendererState::doEnableState(context,node,rp);
	if( result == State::STATE_OK ){
		CameraNode* camera = dynamic_cast<CameraNode*>( context.getCamera() );
		if(camera){ // else: an orthographic camera is used; just re-use the previous values.
			cameraOrigin = camera->getWorldOrigin();
			projectionScale = camera->getWidth() / (std::tan((camera->getRightAngle()-camera->getLeftAngle()).rad()*0.5f)*2.0f);
		}
	
	}
	return result;
}
Example #6
0
Viewer::Viewer(QWidget* parent) :
  QMainWindow(parent),
  resources_(ResourceManager::Create()),
  default_scene_(resources_->MakeScene("default_scene")),
  viewport_(new Viewport(resources_, default_scene_, this)) {
  // Add a couple lights
  LightNode* light0 = default_scene_->MakeLight(default_scene_->Root());
  light0->SetDirection(QVector3D(1, 1, -1));
  light0->SetLightType(LightType::kDirectional);
  light0->SetAmbient(0.05);

  // Add a camera to the scene
  CameraNode* camera = default_scene_->MakeCamera(default_scene_->Root());

  // Set the camera perspective projection parameters, and point it somewhere.
  const QVector3D eye(5, 5, -10);
  const QVector3D look_at(0, 0, 0);
  const QVector3D up(0, 0, -1);
  camera->LookAt(eye, look_at, up);
  camera->SetProjectionParams(CameraNode::kPerspective, 50, 0.1, 5000);

  // Assign the camera to the viewport
  viewport_->SetCamera(camera);

  // Add a renderer widget stack
  renderer_widget_stack_ = new RendererWidgetStack(this);

  // Whenever a renderer is added to the viewport, add its widget to
  // the renderer widget stack and a menu entry.
  connect(viewport_, &Viewport::RendererAdded,
      this, &Viewer::OnRendererAdded);

  // Similarly, whenever an input handler is added to the viewport, add
  // a menu entry.
  connect(viewport_, &Viewport::InputHandlerAdded,
      this, &Viewer::OnInputHandlerAdded);
  connect(viewport_, &Viewport::InputHandlerActivated,
      this, &Viewer::OnInputHandlerActivated);

  setCentralWidget(viewport_);

  addDockWidget(Qt::LeftDockWidgetArea, renderer_widget_stack_);

  // Add the input controls dock widget
  input_handler_widget_ = new InputHandlerWidgetStack(viewport_, this);

  addDockWidget(Qt::LeftDockWidgetArea, input_handler_widget_);

  CreateMenus();

  resize(800, 600);
}
		TextureProjectorNode::TextureProjectorNode( Texture* texture, SceneManagerptr sceneManagerPtr, Nodeptr parent )
			:Node(parent , sceneManagerPtr)
		{
			this->texture = texture;
			projectionPolicy = PROJECTION_POLICY_PROJECTOR;
			projectorPosition.x = 15.0f; projectorPosition.y = 16.0f; projectorPosition.z = -12.0f;
			projectorTarget.x = 0.0f; projectorTarget.y = 0.0f; projectorTarget.z = 0.0f;
			projectorUp.x = 0.0f; projectorUp.y =1.0f; projectorUp.z = 0.0f;
			textureProjector = new TextureProjector(sceneManager->getActiveCamera() , projectorPosition, projectorTarget, projectorUp);
			
			projectorUpdator = new ProjectorUpdater(textureProjector);
			
			addAnimator(projectorUpdator);

			projectorTexUnitState = new TextureUnitState(texture);
			projectorTexUnitState->getTextureAttributes()->texture_mode = ETEXM_MODULATE;
			projectorTexUnitState->getTexCoordGeneration()->bEnable = true;
			projectorTexUnitState->getTexCoordGeneration()->texGenMode = ETGM_EYE_LINEAR;
			projectorTexUnitState->getTexCoordGeneration()->texComponentFormat = ETCF_4;
			projectorUpdator->projectorTextureAttributes = projectorTexUnitState->getTextureAttributes();
		    
			Vector3 dir, right, upVector;
			dir.sub( projectorTarget, projectorPosition);
			dir.normalize();
			CameraNode* camera = sceneManager->getActiveCamera();
			float fov = camera->getFOV();
			dir.scale( camera->getNearPlane() );
			Matrix4f& view = textureProjector->getViewMatrix();
			right.x = view.m00; right.y = view.m01;right.z = view.m02; 
			upVector.x = view.m10; upVector.x = view.m11; upVector.x = view.m12;
			float height = 2.0f*camera->getNearPlane()*tan(fov/2.0f);
			float width = height* camera->getAspectRatio();
			width = height = 1.0f;

			n1.x = projectorPosition.x + dir.x + 0.5f*width*right.x + 0.5f*height*upVector.x; 
			n1.y = projectorPosition.y + dir.y + 0.5f*width*right.y + 0.5f*height*upVector.y; 
			n1.z = projectorPosition.z + dir.z + 0.5f*width*right.z + 0.5f*height*upVector.z; 

			n2.x = projectorPosition.x + dir.x + 0.5f*width*right.x - 0.5f*height*upVector.x; 
			n2.y = projectorPosition.y + dir.y + 0.5f*width*right.y - 0.5f*height*upVector.y; 
			n2.z = projectorPosition.z + dir.z + 0.5f*width*right.z - 0.5f*height*upVector.z; 

			n3.x = projectorPosition.x + dir.x - 0.5f*width*right.x + 0.5f*height*upVector.x; 
			n3.y = projectorPosition.y + dir.y - 0.5f*width*right.y + 0.5f*height*upVector.y; 
			n3.z = projectorPosition.z + dir.z - 0.5f*width*right.z + 0.5f*height*upVector.z; 

			n4.x = projectorPosition.x + dir.x - 0.5f*width*right.x - 0.5f*height*upVector.x; 
			n4.y = projectorPosition.y + dir.y - 0.5f*width*right.y - 0.5f*height*upVector.y; 
			n4.z = projectorPosition.z + dir.z - 0.5f*width*right.z - 0.5f*height*upVector.z; 

		}
void ModelNode::geometryPass(SceneManager* manager) {
	if (mesh != NULL) {
		CameraNode* camera = manager->getCameraNode();
		ShaderProgram* shaderProgram = manager->getGeometryProgram();
		
		glm::mat4 mv = camera->getView() * getTransform().getTransformation();
		//glm::mat3 normalMatrix = glm::inverseTranspose(glm::mat3(getTransform().getTransformation()));
		glm::mat4 mvp = camera->getProjection() * mv;
		
		shaderProgram->setUniformMatrix4fv("mvp", 1, false, glm::value_ptr(mvp));
		//shaderProgram->setUniformMatrix3fv("normalMatrix", 1, false, glm::value_ptr(normalMatrix));
		mesh->draw(shaderProgram);
	}
}
Example #9
0
//----------------------------------------------------------------------------
void UI::OnEvent(Event *ent)
{
	if (GraphicsES::IsEqual(ent, GraphicsES::AddObject))
	{
		AddObjectData data = ent->GetData<AddObjectData>();
		CameraNode *camNode = DynamicCast<CameraNode>(data.Obj);
		if (camNode)
		{
			UI *ui = camNode->GetFirstParentDerivedFromType<UI>();
			if (ui)
			{
				ui->AddCamera(camNode->GetCamera());
			}
		}
	}
}
bool CameraNode::sEqual(const RepoNode &other) const
{
	if (other.getTypeAsEnum() != NodeType::CAMERA || other.getParentIDs().size() != getParentIDs().size())
	{
		return false;
	}

	const CameraNode otherCam = CameraNode(other);


	std::vector<float> mat = getCameraMatrix();
	std::vector<float> otherMat = otherCam.getCameraMatrix();


	return !memcmp(mat.data(), otherMat.data(), mat.size() *sizeof(*mat.data()));

}
//----------------------------------------------------------------------------
void EU_CanvasStage::_UpdateCameraCanvas()
{
	int numObjscts = PX2_SELECTM_E->GetNumObjects();
	if (1 == numObjscts)
	{
		Object *firstSelObj = PX2_SELECTM_E->GetFirstObject();
		CameraNode *camNode = DynamicCast<CameraNode>(firstSelObj);
		if (camNode)
		{
			if (mCameraCanvasView)
			{
				Scene *scene = PX2_PROJ.GetScene();

				mCameraCanvasView->SetOverCamera(camNode->GetCamera());
				mCameraCanvasView->SetRenderNode(scene);
				mCameraCanvasView->Show(true);
			}
		}
		else
		{
			if (mCameraCanvasView)
			{
				mCameraCanvasView->SetOverCamera(0);
				mCameraCanvasView->SetRenderNode(0);
				mCameraCanvasView->Show(false);
			}
		}
	}
	else
	{
		if (mCameraCanvasView)
		{
			mCameraCanvasView->SetOverCamera(0);
			mCameraCanvasView->SetRenderNode(0);
			mCameraCanvasView->Show(false);
		}
	}
}
Example #12
0
void GroupNode::CopyAsChildren(Scene* scene, GroupNode* root) {
  const std::vector<SceneNode*>& tocopy_children = root->Children();
  std::deque<SceneNode*>
    to_process(tocopy_children.begin(), tocopy_children.end());

  SetTranslation(root->Translation());
  SetRotation(root->Rotation());
  SetScale(root->Scale());
  SetVisible(root->Visible());

  while (!to_process.empty()) {
    SceneNode* to_copy = to_process.front();
    to_process.pop_front();
    SceneNode* node_copy = nullptr;

    switch (to_copy->NodeType()) {
      case SceneNodeType::kGroupNode:
        {
          GroupNode* child = scene->MakeGroup(this, Scene::kAutoName);
          GroupNode* group_to_copy =
            dynamic_cast<GroupNode*>(to_copy);
          child->CopyAsChildren(scene, group_to_copy);
          node_copy = child;
        }
        break;
      case SceneNodeType::kCameraNode:
        {
          CameraNode* child = scene->MakeCamera(this, Scene::kAutoName);
          const CameraNode* camera_to_copy =
            dynamic_cast<const CameraNode*>(to_copy);
          child->CopyFrom(*camera_to_copy);
          node_copy = child;
        }
        break;
      case SceneNodeType::kLightNode:
        {
          LightNode* child = scene->MakeLight(this, Scene::kAutoName);
          const LightNode* light_to_copy =
            dynamic_cast<const LightNode*>(to_copy);
//          *child = *light_to_copy;
          (void)light_to_copy;
          node_copy = child;
        }
        break;
      case SceneNodeType::kDrawNode:
        {
          DrawNode* node_to_copy =
            dynamic_cast<DrawNode*>(to_copy);
          DrawNode* child = scene->MakeDrawNode(this, Scene::kAutoName);
          for (const Drawable::Ptr& item : node_to_copy->Drawables()) {
            child->Add(item);
          }
          node_copy = child;
        }
        break;
    }

    node_copy->SetTranslation(to_copy->Translation());
    node_copy->SetRotation(to_copy->Rotation());
    node_copy->SetScale(to_copy->Scale());
    node_copy->SetVisible(to_copy->Visible());
  }
}
Example #13
0
int test_large_scene(Util::UI::Window * window, Util::UI::EventContext & eventContext) {
	// texture registry
	std::map<std::string, Util::Reference<Rendering::Texture> > textures;

	std::cout << "Create FrameContext...\n";
	FrameContext fc;

	unsigned int renderingFlags = /*BOUNDING_BOXES|SHOW_META_OBJECTS|*/FRUSTUM_CULLING/*|SHOW_COORD_SYSTEM*/;//|SHOW_COORD_SYSTEM;


	std::cout << "Create scene graph...\n";
	Util::Reference<GroupNode> root = new MinSG::ListNode();


	/// Skybox
	SkyboxState * sb = SkyboxState::createSkybox("Data/texture/?.bmp");
	root->addState(sb);


	/// Some shperes...
	{
		std::default_random_engine engine;
		std::uniform_real_distribution<float> coordinateDist(0.0f, 200.0f);
		
		std::vector<Util::Reference<Rendering::Mesh> > spheres;
		Util::Reference<Rendering::Mesh> icosahedron = Rendering::MeshUtils::PlatonicSolids::createIcosahedron();
		for(int i=0;i<6;++i)
			spheres.push_back(Rendering::MeshUtils::PlatonicSolids::createEdgeSubdivisionSphere(icosahedron.get(), i)); // 6... 81920 triangles each

		for (int i = 0; i < 1000; i++) {
			// create a real clone inclusive internal data!
			MinSG::GeometryNode * gn = new GeometryNode(spheres[std::uniform_int_distribution<std::size_t>(0, spheres.size() - 1)(engine)]->clone());
			gn->moveRel(Geometry::Vec3(coordinateDist(engine), coordinateDist(engine), coordinateDist(engine)));
			root->addChild(gn);
			gn->scale(0.1 + std::uniform_real_distribution<float>(0.0f, 1000.0f)(engine) / 400.0);
		}
	}

	/// Camera
	Node * schwein = loadModel(Util::FileName("Data/model/Schwein.low.t.ply"), MESH_AUTO_CENTER | MESH_AUTO_SCALE);

	ListNode * camera = new ListNode();
	CameraNode * camNode = new CameraNode();
	camNode->setViewport(Geometry::Rect_i(0, 0, 1024, 768));
	camNode->setNearFar(0.1, 2000);
	camNode->applyVerticalAngle(80);
	camNode->moveRel(Geometry::Vec3(0, 4, 10));
	camera->addChild(camNode);
	camera->addChild(schwein);
	schwein->moveRel(Geometry::Vec3(0, 0, 0));
	schwein->rotateLocal_deg(180, Geometry::Vec3(0, 1, 0));

	LightNode * myHeadLight = LightNode::createPointLight();
	myHeadLight->scale(1);
	myHeadLight->moveRel(Geometry::Vec3(0, 0, 0));
	camera->addChild(myHeadLight);
	LightingState * lightState = new LightingState;
	lightState->setLight(myHeadLight);
	root->addState(lightState);

	root->addChild(camera);


	/// Eventhandler
	MoveNodeHandler * eh = new MoveNodeHandler();
	MoveNodeHandler::initClaudius(eh, camera);


	// ---------------------------------------------------------------------------------------------

	Rendering::RenderingContext::clearScreen(Util::Color4f(0.5f, 0.5f, 0.5f, 0.5f));

	// ----
	GET_GL_ERROR();

	uint32_t fpsFrameCounter = 0;
	Util::Timer fpsTimer;

	std::cout << "\nEntering main loop...\n";


	// program main loop
	bool done = false;
	while (!done) {
		++fpsFrameCounter;
		double seconds = fpsTimer.getSeconds();
		if (seconds > 1.0) {
			double fps = static_cast<double> (fpsFrameCounter) / seconds;
			std::cout << "\r " << fps << " fps    ";
			std::cout.flush();
			fpsTimer.reset();
			fpsFrameCounter = 0;
		}

		// message processing loop
		eventContext.getEventQueue().process();
		while (eventContext.getEventQueue().getNumEventsAvailable() > 0) {
			Util::UI::Event event = eventContext.getEventQueue().popEvent();
			// check for messages
			switch (event.type) {
				// exit if the window is closed
				case Util::UI::EVENT_QUIT:
					done = true;
					break;


					// check for keypresses
				case Util::UI::EVENT_KEYBOARD: {
					if(event.keyboard.pressed && event.keyboard.key == Util::UI::KEY_ESCAPE) {
						done = true;
					}
					break;
				}

			} // end switch
		} // end of message processing

		// apply translation
		eh->execute();


		// clear screen
		Rendering::RenderingContext::clearScreen(Util::Color4f(0.0f, 0.0f, 0.0f, 1.0f));


		// enable Camera
		fc.setCamera(camNode);


		// render Scene
		root->display(fc, renderingFlags);

		window->swapBuffers();
		GET_GL_ERROR();
	} // end main loop


	// destroy scene graph
	MinSG::destroy(root.get());
	root = nullptr;

	// all is well ;)
	std::cout << "Exited cleanly\n";
	//system("pause");
	return EXIT_SUCCESS;
}
Example #14
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();

	}
TEST(RepoBSONFactoryTest, MakeCameraNodeTest)
{
	float aspectRatio = 1.0;
	float fCP = 10;
	float nCP = 100;
	float fov = 500;
	repo_vector_t lookAt = { 1.0, 2.0, 3.0 };
	repo_vector_t position = { 3.1, 2.2, 3.5 };
	repo_vector_t up = { 4.1, 12.2, 23.5 };

	std::string name = "CamTest";

	CameraNode camera = RepoBSONFactory::makeCameraNode(aspectRatio, fCP, nCP, fov, lookAt, position, up, name);

	EXPECT_FALSE(camera.isEmpty());
	EXPECT_EQ(aspectRatio, camera.getAspectRatio());
	EXPECT_EQ(fCP, camera.getFarClippingPlane());
	EXPECT_EQ(nCP, camera.getNearClippingPlane());
	EXPECT_EQ(fov, camera.getFieldOfView());

	EXPECT_TRUE(compareVectors(lookAt, camera.getLookAt()));
	EXPECT_TRUE(compareVectors(position, camera.getPosition()));
	EXPECT_TRUE(compareVectors(up, camera.getUp()));

	EXPECT_EQ(name, camera.getName());

	EXPECT_EQ(camera.getTypeAsEnum(), NodeType::CAMERA);
}