Пример #1
0
bool SceneObjectCartPole::create() {
	assert(getScene() != nullptr);

	// Rendering
	std::shared_ptr<pge::Asset> asset;

	if (!getScene()->getAssetManager("MOBJ", pge::StaticModelOBJ::assetFactory)->getAsset("resources/models/Cart.obj", asset))
		return false;

	_pCartModel = static_cast<pge::StaticModelOBJ*>(asset.get());

	if (!getScene()->getAssetManager("MOBJ", pge::StaticModelOBJ::assetFactory)->getAsset("resources/models/Pole.obj", asset))
		return false;

	_pPoleModel = static_cast<pge::StaticModelOBJ*>(asset.get());

	// Get reference to physics world
	_physicsWorld = getScene()->getNamedCheckQueue("physWrld");

	reset();

	_capture = false;

	_capBytes = std::make_shared<std::vector<char>>(getRenderScene()->_gBuffer.getWidth() * getRenderScene()->_gBuffer.getHeight() * 3, 0);

	_show = getRenderScene()->_renderingEnabled;

	_socket = std::make_shared<sf::TcpSocket>();

	_socket->connect(sf::IpAddress::LocalHost, _port, sf::seconds(5.0f));

	_doneLastFrame = false;

	return true;
}
Пример #2
0
bool SceneObjectSurf::create() {
	assert(getScene() != nullptr);

	_size = 5;
	_numStartBlocks = 5;

	// Rendering
	std::shared_ptr<pge::Asset> asset;

	if (!getScene()->getAssetManager("MOBJ", pge::StaticModelOBJ::assetFactory)->getAsset("resources/models/block.obj", asset))
		return false;

	_pBlockModel = static_cast<pge::StaticModelOBJ*>(asset.get());

	if (!getScene()->getAssetManager("MOBJ", pge::StaticModelOBJ::assetFactory)->getAsset("resources/models/bot.obj", asset))
		return false;

	_pAgentModel = static_cast<pge::StaticModelOBJ*>(asset.get());

	reset();

	_capture = false;

	_capBytes = std::make_shared<std::vector<char>>(getRenderScene()->_gBuffer.getWidth() * getRenderScene()->_gBuffer.getHeight() * 3, 0);

	_show = getRenderScene()->_renderingEnabled;

	_socket = std::make_shared<sf::TcpSocket>();

	_socket->connect(sf::IpAddress::LocalHost, _port);

	return true;
}
Пример #3
0
void SceneObjectOrbitCamera::update(float dt) {
	pge::SceneObjectBufferedInput* pBufferedInput = static_cast<pge::SceneObjectBufferedInput*>(_input.get());

	_angle += dt * _angularVelocity;

	pge::Vec3f pos = _focusPoint + pge::Vec3f(cosf(_angle) * _distance, sinf(_tilt) * _distance, sinf(_angle) * _distance);

	pge::Quaternion lookDir = pge::Quaternion::getFromMatrix(pge::Matrix4x4f::cameraDirectionMatrix((_focusPoint - pos).normalized(), pge::Vec3f(0.0f, 1.0f, 0.0f)));

	getRenderScene()->_logicCamera._position = pos;
	getRenderScene()->_logicCamera._rotation = lookDir;
}
Пример #4
0
void SceneObjectPlayer::synchronousUpdate(float dt) {
	SceneObjectGUI* pGUI = static_cast<SceneObjectGUI*>(_gui.get());

	pGUI->_enabled = !_acceptingInput;

	getRenderScene()->getRenderWindow()->setMouseCursorVisible(!_acceptingInput);
}
Пример #5
0
void SceneObjectCartPole::postRender() {
	// Get data from effect buffer
	glReadBuffer(GL_FRONT);

	glReadPixels(0, 0, getRenderScene()->_gBuffer.getWidth(), getRenderScene()->_gBuffer.getHeight(), GL_RGB, GL_UNSIGNED_BYTE, _capBytes->data());
}
Пример #6
0
void SceneObjectCartPole::synchronousUpdate(float dt) {
	if (_ticks >= _ticksPerAction || !getRenderScene()->_renderingEnabled) {
		_ticks = 0;

		std::array<char, _maxBatchSize> buffer;

		std::array<char, 1 + 4 + 4> msg;

		size_t received = 0;
		size_t totalReceived = 0;

		while (totalReceived < msg.size()) {
			_socket->receive(buffer.data(), msg.size() - totalReceived, received);

			for (int i = 0; i < received; i++)
				msg[totalReceived + i] = buffer[i];

			totalReceived += received;
		}

		if (msg[0] == 'A') { // Action
			_action = pge::Vec2f(*reinterpret_cast<float*>(&msg[1]), *reinterpret_cast<float*>(&msg[5]));
		}
		else if (msg[0] == 'R') { // Reset
			_action = pge::Vec2f(*reinterpret_cast<float*>(&msg[1]), *reinterpret_cast<float*>(&msg[5]));

			reset();
		}
		else if (msg[0] == 'C') { // Capture + action
			_action = pge::Vec2f(*reinterpret_cast<float*>(&msg[1]), *reinterpret_cast<float*>(&msg[5]));

			_capture = true;

			if (!getRenderScene()->_renderingEnabled) {
				getRenderScene()->getRenderWindow()->setFramerateLimit(60);
				getRenderScene()->getRenderWindow()->setVerticalSyncEnabled(true);
			}

			getRenderScene()->_renderingEnabled = true;
		}
		else if (msg[0] == 'S') { // Stop capture + action
			_action = pge::Vec2f(*reinterpret_cast<float*>(&msg[1]), *reinterpret_cast<float*>(&msg[5]));

			_capture = false;

			if (!_show) {
				if (getRenderScene()->_renderingEnabled) {
					getRenderScene()->getRenderWindow()->setFramerateLimit(0);
					getRenderScene()->getRenderWindow()->setVerticalSyncEnabled(false);
				}

				getRenderScene()->_renderingEnabled = false;
			}
		}
		else if (msg[0] == 'X') { // Exit
			getRenderScene()->_close = true;
		}

		_action.x = std::min(1.0f, std::max(-1.0f, _action.x));
		_action.y = std::min(1.0f, std::max(-1.0f, _action.y));
		
		act();

		// Give state and reward (+ capture if is on)

		// Observation (8 values)
		std::vector<float> obs(8);

		btVector3 pos = _pRigidBodyCart->getWorldTransform().getOrigin();
		btVector3 vel = _pRigidBodyCart->getLinearVelocity();
		btQuaternion rot = _pRigidBodyPole->getWorldTransform().getRotation();
		btVector3 angleVel = _pRigidBodyPole->getAngularVelocity();

		pge::Quaternion rotC = cons(rot);
		pge::Vec3f rotE = rotC.getEulerAngles();

		obs[0] = pos.getX();
		obs[1] = pos.getZ();
		obs[2] = vel.getX();
		obs[3] = vel.getZ();
		obs[4] = rotE.x;
		obs[5] = rotE.z;
		obs[6] = angleVel.getX();
		obs[7] = angleVel.getZ();

		// First add reward
		int index = 0;

		*reinterpret_cast<float*>(&buffer[index]) = _reward;

		index += sizeof(float);

		for (int i = 0; i < obs.size(); i++) {
			*reinterpret_cast<float*>(&buffer[index]) = obs[i];

			index += sizeof(float);
		}

		// Reset flag
		*reinterpret_cast<int*>(&buffer[index]) = static_cast<int>(_doneLastFrame);

		_doneLastFrame = false;

		index += sizeof(int);

		// Submit number of batches of _maxBatchSize
		int numBatches = _capBytes->size() / _maxBatchSize + ((_capBytes->size() % _maxBatchSize) == 0 ? 0 : 1);

		// No batches if not capturing
		if (!_capture)
			numBatches = 0;

		*reinterpret_cast<int*>(&buffer[index]) = numBatches;

		index += sizeof(int);

		_socket->send(buffer.data(), index);

		if (_capture) {
			std::vector<char> reorganized(_capBytes->size());

			int reorgIndex = 0;

			for (int y = 0; y < getRenderScene()->_gBuffer.getHeight(); y++)
				for (int x = 0; x < getRenderScene()->_gBuffer.getWidth(); x++) {
					int start = 3 * (x + (getRenderScene()->_gBuffer.getHeight() - 1 - y) * getRenderScene()->_gBuffer.getWidth());

					reorganized[reorgIndex++] = (*_capBytes)[start + 0];
					reorganized[reorgIndex++] = (*_capBytes)[start + 1];
					reorganized[reorgIndex++] = (*_capBytes)[start + 2];
				}

			int total = 0;

			for (int i = 0; i < numBatches; i++) {
				// Submit batch
				size_t count = 0;

				for (int j = 0; j < _maxBatchSize && total < _capBytes->size(); j++) {
					buffer[j] = reorganized[total++];

					count++;
				}

				_socket->send(buffer.data(), count);
			}
		}
	}
	else
		_ticks++;
}
Пример #7
0
void SceneObjectPlayer::update(float dt) {
	pge::SceneObjectBufferedInput* pBufferedInput = static_cast<pge::SceneObjectBufferedInput*>(_input.get());

	if (pBufferedInput->isKeyPressed(sf::Keyboard::Escape)) {
		_acceptingInput = !_acceptingInput;
		
		if (_acceptingInput) {
			_lastMousePosition = sf::Mouse::getPosition(*getRenderScene()->getRenderWindow());

			sf::Mouse::setPosition(sf::Vector2i(128, 128), *getRenderScene()->getRenderWindow());
		}
		else
			sf::Mouse::setPosition(_lastMousePosition, *getRenderScene()->getRenderWindow());
	}

	if (_acceptingInput) {
		sf::Vector2i mousePosition = sf::Mouse::getPosition(*getRenderScene()->getRenderWindow()) - sf::Vector2i(128, 128);
		sf::Mouse::setPosition(sf::Vector2i(128, 128), *getRenderScene()->getRenderWindow());
		
		_angleX -= mousePosition.x * _sensitivity;
		_angleY -= mousePosition.y * _sensitivity;

		_angleX = std::fmodf(_angleX, pge::_piTimes2);

		if (_angleY < -pge::_piOver2)
			_angleY = -pge::_piOver2;
		else if (_angleY > pge::_piOver2)
			_angleY = pge::_piOver2;

		getRenderScene()->_logicCamera._rotation = pge::Quaternion(_angleX, pge::Vec3f(0.0f, 1.0f, 0.0f)) * pge::Quaternion(_angleY, pge::Vec3f(1.0f, 0.0f, 0.0f));

		if (_allowNoclipChange)
		if (pBufferedInput->isKeyPressed(sf::Keyboard::N))
			setNoClip(_characterController != nullptr);

		if (_characterController == nullptr) {
			float accel = sf::Keyboard::isKeyPressed(sf::Keyboard::LShift) ? _noClipAcceleration * _noClipRunMultiplier : _noClipAcceleration;

			if (sf::Keyboard::isKeyPressed(sf::Keyboard::W))
				_noClipVelocity += getRenderScene()->_logicCamera._rotation * pge::Vec3f(0.0f, 0.0f, -accel * dt);
			else if (sf::Keyboard::isKeyPressed(sf::Keyboard::S))
				_noClipVelocity += getRenderScene()->_logicCamera._rotation * pge::Vec3f(0.0f, 0.0f, accel * dt);

			if (sf::Keyboard::isKeyPressed(sf::Keyboard::D))
				_noClipVelocity += getRenderScene()->_logicCamera._rotation * pge::Vec3f(accel * dt, 0.0f, 0.0f);
			else if (sf::Keyboard::isKeyPressed(sf::Keyboard::A))
				_noClipVelocity += getRenderScene()->_logicCamera._rotation * pge::Vec3f(-accel * dt, 0.0f, 0.0f);

			_noClipVelocity += -_noClipDeceleration * _noClipVelocity * dt;

			getRenderScene()->_logicCamera._position += _noClipVelocity * dt;
		}
		else {
			float accel = sf::Keyboard::isKeyPressed(sf::Keyboard::LShift) ? _acceleration * _runMultiplier : _acceleration;

			if (sf::Keyboard::isKeyPressed(sf::Keyboard::W))
				_characterController->walk(getRenderScene()->_logicCamera._rotation * pge::Vec3f(0.0f, 0.0f, -accel * dt));
			else if (sf::Keyboard::isKeyPressed(sf::Keyboard::S))
				_characterController->walk(getRenderScene()->_logicCamera._rotation * pge::Vec3f(0.0f, 0.0f, accel * dt));

			if (sf::Keyboard::isKeyPressed(sf::Keyboard::D))
				_characterController->walk(getRenderScene()->_logicCamera._rotation * pge::Vec3f(accel * dt, 0.0f, 0.0f));
			else if (sf::Keyboard::isKeyPressed(sf::Keyboard::A))
				_characterController->walk(getRenderScene()->_logicCamera._rotation * pge::Vec3f(-accel * dt, 0.0f, 0.0f));

			if (sf::Keyboard::isKeyPressed(sf::Keyboard::Space))
				_characterController->jump();

			_characterController->_deceleration = _deceleration;

			_characterController->update(dt);

			getRenderScene()->_logicCamera._position = _characterController->getPosition() + pge::Vec3f(0.0f, _cameraHeightOffset, 0.0f);
		}
	}
}
Пример #8
0
void SceneObjectSurf::synchronousUpdate(float dt) {
	if (_ticks >= _ticksPerAction || !getRenderScene()->_renderingEnabled) {
		_ticks = 0;

		std::array<char, _maxBatchSize> buffer;

		// Receive 1 byte
		size_t received = 0;

		_socket->receive(buffer.data(), 1 + 4, received);

		if (buffer[0] == 'A') { // Action
			_action = *reinterpret_cast<int*>(&buffer[1]);
		}
		else if (buffer[0] == 'R') { // Reset
			reset();
		}
		else if (buffer[0] == 'C') { // Capture + action
			_action = *reinterpret_cast<int*>(&buffer[1]);

			_capture = true;

			getRenderScene()->_renderingEnabled = true;
		}
		else if (buffer[0] == 'S') { // Stop capture + action
			_action = *reinterpret_cast<int*>(&buffer[1]);

			_capture = false;

			if (!_show) {
				getRenderScene()->_renderingEnabled = false;
			}
		}
		else if (buffer[0] == 'X') { // Exit
			getRenderScene()->_close = true;
		}

		act();

		// Give state and reward (+ capture if is on)

		// Observation (values of 9 fields around agent)
		std::vector<int> obs(9);

		int obsIndex = 0;

		int agentX = _agentPosition % _size;
		int agentY = _agentPosition / _size;

		for (int dx = -1; dx <= 1; dx++)
			for (int dy = -1; dy <= 1; dy++) {
				int tx = agentX + dx;
				int ty = agentY + dy;

				if (tx >= 0 && ty >= 0 && tx < _size && ty < _size) {
					obs[obsIndex++] = _blocks[tx + ty * _size];
				}
				else
					obs[obsIndex++] = -1; // -1 for wall
			}

		// First add reward
		int index = 0;

		*reinterpret_cast<float*>(&buffer[index]) = _reward;

		index += sizeof(float);

		for (int i = 0; i < obs.size(); i++) {
			*reinterpret_cast<int*>(&buffer[index]) = obs[i];

			index += sizeof(int);
		}

		// Submit number of batches of _maxBatchSize
		int numBatches = _capBytes->size() / _maxBatchSize + ((_capBytes->size() % _maxBatchSize) == 0 ? 0 : 1);

		// No batches if not capturing
		if (!_capture)
			numBatches = 0;

		*reinterpret_cast<int*>(&buffer[index]) = numBatches;

		index += sizeof(int);

		_socket->send(buffer.data(), index);

		if (_capture) {
			std::vector<char> reorganized(_capBytes->size());

			int reorgIndex = 0;

			for (int y = 0; y < getRenderScene()->_gBuffer.getHeight(); y++)
				for (int x = 0; x < getRenderScene()->_gBuffer.getWidth(); x++) {
					int start = 3 * (x + (getRenderScene()->_gBuffer.getHeight() - 1 - y) * getRenderScene()->_gBuffer.getWidth());

					reorganized[reorgIndex++] = (*_capBytes)[start + 0];
					reorganized[reorgIndex++] = (*_capBytes)[start + 1];
					reorganized[reorgIndex++] = (*_capBytes)[start + 2];
				}

			int total = 0;

			for (int i = 0; i < numBatches; i++) {
				// Submit batch
				size_t count = 0;

				for (int j = 0; j < _maxBatchSize && total < _capBytes->size(); j++) {
					buffer[j] = reorganized[total++];

					count++;
				}

				_socket->send(buffer.data(), count);
			}
		}
	}
	else
		_ticks++;
}
Пример #9
0
void SceneObjectEntryPointSurf::onAdd() {
	// Physics

	std::shared_ptr<pge::SceneObjectPhysicsWorld> physicsWorld(new pge::SceneObjectPhysicsWorld());

	getRenderScene()->addNamed(physicsWorld, "physWrld");

	pge::SceneObjectRef lighting = getScene()->getNamed("lighting");

	pge::SceneObjectLighting* pLighting = static_cast<pge::SceneObjectLighting*>(lighting.get());

	pLighting->_ambientLight = pge::Vec3f(0.01f, 0.01f, 0.01f);

	/*std::shared_ptr<pge::SceneObjectDirectionalLightShadowed> light(new pge::SceneObjectDirectionalLightShadowed());

	getRenderScene()->add(light);

	light->create(pLighting, 2, 2048, 0.5f, 100.0f, 0.6f);

	light->setDirection(pge::Vec3f(-0.4f, -1.0f, 0.6f).normalized());

	light->setColor(pge::Vec3f(1.0f, 1.0f, 1.0f));*/

	// GUI

	/*std::shared_ptr<SceneObjectGUI> gui(new SceneObjectGUI());

	getRenderScene()->addNamed(gui, "gui", false);

	gui->_layer = 2.0f;*/

	// Control

	std::shared_ptr<SceneObjectOrbitCamera> camera(new SceneObjectOrbitCamera());

	getRenderScene()->add(camera, false);

	// Map

	/*std::shared_ptr<pge::Map3DWS> map(new pge::Map3DWS());

	map->_settings._pScene = getScene();

	map->createAsset("resources/maps/horrorMap.3dw");

	pge::addMapLights(*map, getScene());*/

	std::shared_ptr<SceneObjectProp> prop(new SceneObjectProp());

	getScene()->add(prop, true);

	prop->create("resources/models/BlockGame.obj");

	prop->calculateAABB();

	std::shared_ptr<SceneObjectSurf> cartPole(new SceneObjectSurf());

	getRenderScene()->add(cartPole, false);

	cartPole->create();

	cartPole->_layer = 100.0f;

	std::shared_ptr<SceneObjectProp> sky(new SceneObjectProp());

	getScene()->add(sky, true);

	sky->create("resources/models/skybox1.obj");

	sky->_transform = pge::Matrix4x4f::scaleMatrix(pge::Vec3f(100.0f, 100.0f, 100.0f));

	sky->calculateAABB();

	std::shared_ptr<pge::SceneObjectDirectionalLightShadowed> directionalLight(new pge::SceneObjectDirectionalLightShadowed());

	getScene()->add(directionalLight);

	directionalLight->create(pLighting, 3, 2048, 0.2f, 100.0f, 0.6f);

	directionalLight->setDirection(pge::Vec3f(-0.2523f, -0.9423f, -0.424f).normalized());

	directionalLight->setColor(pge::Vec3f(0.7f, 0.7f, 0.7f));

	// ------------------------------------------- Image Effects -------------------------------------------

	std::shared_ptr<pge::SceneObjectEffectBuffer> effectBuffer(new pge::SceneObjectEffectBuffer());

	getRenderScene()->addNamed(effectBuffer, "ebuf", false);

	effectBuffer->create(0.5f);

	std::shared_ptr<pge::Asset> assetBlurHorizontal;

	getScene()->getAssetManager("shader", pge::Shader::assetFactory)->getAsset("NONE resources/shaders/noTransformVertex.vert resources/shaders/blurHorizontal.frag", assetBlurHorizontal);

	std::shared_ptr<pge::Shader> blurShaderHorizontal = std::static_pointer_cast<pge::Shader>(assetBlurHorizontal);

	std::shared_ptr<pge::Asset> assetBlurVertical;

	getScene()->getAssetManager("shader", pge::Shader::assetFactory)->getAsset("NONE resources/shaders/noTransformVertex.vert resources/shaders/blurVertical.frag", assetBlurVertical);

	std::shared_ptr<pge::Shader> blurShaderVertical = std::static_pointer_cast<pge::Shader>(assetBlurVertical);

	std::shared_ptr<pge::Asset> assetRenderImage;

	getScene()->getAssetManager("shader", pge::Shader::assetFactory)->getAsset("NONE resources/shaders/noTransformVertex.vert resources/shaders/renderImage.frag", assetRenderImage);

	std::shared_ptr<pge::Shader> renderImageShader = std::static_pointer_cast<pge::Shader>(assetRenderImage);

	std::shared_ptr<pge::Asset> assetRenderMultImage;

	getScene()->getAssetManager("shader", pge::Shader::assetFactory)->getAsset("NONE resources/shaders/noTransformVertex.vert resources/shaders/renderImageMult.frag", assetRenderMultImage);

	std::shared_ptr<pge::Shader> renderImageMultShader = std::static_pointer_cast<pge::Shader>(assetRenderMultImage);

	std::shared_ptr<pge::Asset> assetNoise;

	getScene()->getAssetManager("tex2D", pge::Texture2D::assetFactory)->getAsset("resources/textures/noise.bmp", assetNoise);

	std::shared_ptr<pge::Texture2D> noiseMap = std::static_pointer_cast<pge::Texture2D>(assetNoise);

	noiseMap->bind();

	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);

	std::shared_ptr<pge::Asset> assetBlurHorizontalEdgeAware;

	getScene()->getAssetManager("shader", pge::Shader::assetFactory)->getAsset("NONE resources/shaders/noTransformVertex.vert resources/shaders/blurHorizontalEdgeAware.frag", assetBlurHorizontalEdgeAware);

	std::shared_ptr<pge::Shader> blurShaderHorizontalEdgeAware = std::static_pointer_cast<pge::Shader>(assetBlurHorizontalEdgeAware);

	std::shared_ptr<pge::Asset> assetBlurVerticalEdgeAware;

	getScene()->getAssetManager("shader", pge::Shader::assetFactory)->getAsset("NONE resources/shaders/noTransformVertex.vert resources/shaders/blurVerticalEdgeAware.frag", assetBlurVerticalEdgeAware);

	std::shared_ptr<pge::Shader> blurShaderVerticalEdgeAware = std::static_pointer_cast<pge::Shader>(assetBlurVerticalEdgeAware);

	// SSAO

	/*std::shared_ptr<pge::Shader> ssaoShader(new pge::Shader());

	ssaoShader->createAsset("NONE resources/shaders/noTransformVertex.vert resources/shaders/imageeffects/ssao.frag");

	std::shared_ptr<pge::SceneObjectSSAO> ssao(new pge::SceneObjectSSAO());

	getRenderScene()->add(ssao, false);

	ssao->create(blurShaderHorizontal, blurShaderVertical, ssaoShader, renderImageShader, noiseMap);

	ssao->_ssaoRadius = 0.1f;
	ssao->_ssaoStrength = 1.0f;
	ssao->_blurRadius = 0.002f;
	ssao->_numBlurPasses = 1;*/

	// SSR

	std::shared_ptr<pge::TextureCube> cubeMap(new pge::TextureCube());

	cubeMap->createAsset(
		"resources/environmentmaps/skybox1/CloudyLightRaysLeft2048.png "
		"resources/environmentmaps/skybox1/CloudyLightRaysRight2048.png "
		"resources/environmentmaps/skybox1/CloudyLightRaysBack2048.png "
		"resources/environmentmaps/skybox1/CloudyLightRaysFront2048.png "
		"resources/environmentmaps/skybox1/CloudyLightRaysDown2048.png "
		"resources/environmentmaps/skybox1/CloudyLightRaysUp2048.png "
		);

	std::shared_ptr<pge::Shader> ssrShader(new pge::Shader());

	ssrShader->createAsset("NONE resources/shaders/noTransformVertex.vert resources/shaders/imageeffects/ssr.frag");

	std::shared_ptr<pge::SceneObjectSSR> ssr(new pge::SceneObjectSSR());

	getRenderScene()->add(ssr, false);

	ssr->create(blurShaderHorizontalEdgeAware, blurShaderVerticalEdgeAware, ssrShader, renderImageShader, cubeMap, noiseMap);

	ssr->_layer = 1.0f;

	// Light Scattering

	/*std::shared_ptr<pge::Shader> lightScatteringShader(new pge::Shader());

	lightScatteringShader->createAsset("NONE resources/shaders/noTransformVertex.vert resources/shaders/imageeffects/lightScattering.frag");

	std::shared_ptr<pge::SceneObjectLightScattering> lightScattering(new pge::SceneObjectLightScattering());

	getRenderScene()->add(lightScattering, false);

	lightScattering->create(blurShaderHorizontal, blurShaderVertical, lightScatteringShader, renderImageShader);

	lightScattering->_layer = 1.5f;

	lightScattering->_lightSourcePosition = -light->getDirection() * 200.0f;
	lightScattering->_lightSourceColor = pge::Vec3f(1.0f, 0.9f, 0.8f) * 0.5f;*/

	// Depth of field

	/*std::shared_ptr<pge::Shader> depthOfFieldBlurShaderHorizontal(new pge::Shader());

	depthOfFieldBlurShaderHorizontal->createAsset("NONE resources/shaders/noTransformVertex.vert resources/shaders/imageeffects/depthOfFieldBlurHorizontal.frag");

	std::shared_ptr<pge::Shader> depthOfFieldBlurShaderVertical(new pge::Shader());

	depthOfFieldBlurShaderVertical->createAsset("NONE resources/shaders/noTransformVertex.vert resources/shaders/imageeffects/depthOfFieldBlurVertical.frag");

	std::shared_ptr<pge::SceneObjectDepthOfField> depthOfField(new pge::SceneObjectDepthOfField());

	getRenderScene()->add(depthOfField, false);

	depthOfField->create(depthOfFieldBlurShaderHorizontal, depthOfFieldBlurShaderVertical, renderImageShader);

	depthOfField->_layer = 1.5f;

	depthOfField->_focalDistance = 9.0f;
	depthOfField->_focalRange = 0.4f;
	depthOfField->_blurRadius = 0.002f;
	depthOfField->_numBlurPasses = 1;*/

	// FXAA

	std::shared_ptr<pge::Shader> lumaShader(new pge::Shader());

	lumaShader->createAsset("NONE resources/shaders/noTransformVertex.vert resources/shaders/imageeffects/lumaRender.frag");

	std::shared_ptr<pge::Shader> fxaaShader(new pge::Shader());

	fxaaShader->createAsset("NONE resources/shaders/noTransformVertex.vert resources/shaders/imageeffects/fxaa.frag");

	std::shared_ptr<pge::SceneObjectFXAA> fxaa(new pge::SceneObjectFXAA());

	getRenderScene()->add(fxaa, false);

	fxaa->create(fxaaShader, lumaShader);

	destroy();
}