Exemplo n.º 1
0
void NzScene::Draw()
{
	#if NAZARA_GRAPHICS_SAFE
	if (!m_impl->viewer)
	{
		NazaraError("No viewer");
		return;
	}
	#endif

	m_impl->viewer->ApplyView();

	try
	{
		NzErrorFlags errFlags(nzErrorFlag_ThrowException);
		m_impl->renderTechnique->Clear(this);
		m_impl->renderTechnique->Draw(this);
	}
	catch (const std::exception& e)
	{
        NazaraUnused(e);
		NzString oldName = m_impl->renderTechnique->GetName();

		if (m_impl->renderTechniqueRanking > 0)
		{
			m_impl->renderTechnique.reset(NzRenderTechniques::GetByRanking(m_impl->renderTechniqueRanking-1, &m_impl->renderTechniqueRanking));
			NazaraError("Render technique \"" + oldName + "\" failed, fallback to \"" + m_impl->renderTechnique->GetName() + '"');
		}
		else
		{
			NzErrorFlags errFlags(nzErrorFlag_ThrowException);
			NazaraError("Render technique \"" + oldName + "\" failed and no fallback is available");
		}

		return;
	}
}
bool NzDeferredRenderTechnique::Resize(const NzVector2ui& dimensions) const
{
    try
    {
        NzErrorFlags errFlags(nzErrorFlag_ThrowException);

        for (auto& passIt : m_passes)
            for (auto& passIt2 : passIt.second)
                passIt2.second->Resize(dimensions);

        m_GBufferSize = dimensions;

        return true;
    }
    catch (const std::exception& e)
    {
        NazaraError("Failed to create work RTT/G-Buffer");
        return false;
    }
}
Exemplo n.º 3
0
	void LuaAPI::RegisterClasses(Nz::LuaState& state)
	{
		Nz::ErrorFlags errFlags(Nz::ErrorFlag_ThrowException, true);
		GetBinding()->RegisterClasses(state);
	}
Exemplo n.º 4
0
	bool Sdk::Initialize()
	{
		if (s_referenceCounter++ > 0)
			return true; // Already initialized

		try
		{
			Nz::ErrorFlags errFlags(Nz::ErrorFlag_ThrowException, true);

			// Initialize the engine first

			// Shared modules
			Nz::Lua::Initialize();
			Nz::Noise::Initialize();
			Nz::Physics::Initialize();
			Nz::Utility::Initialize();

			#ifndef NDK_SERVER
			// Client modules
			Nz::Audio::Initialize();
			Nz::Graphics::Initialize();
			#endif

			// SDK Initialization

			// Components
			BaseComponent::Initialize();

			// Shared components
			InitializeComponent<CollisionComponent>("NdkColli");
			InitializeComponent<NodeComponent>("NdkNode");
			InitializeComponent<PhysicsComponent>("NdkPhys");
			InitializeComponent<VelocityComponent>("NdkVeloc");

			#ifndef NDK_SERVER
			// Client components
			InitializeComponent<CameraComponent>("NdkCam");
			InitializeComponent<LightComponent>("NdkLight");
			InitializeComponent<ListenerComponent>("NdkList");
			InitializeComponent<GraphicsComponent>("NdkGfx");
			#endif

			// Systems

			BaseSystem::Initialize();

			// Shared systems
			InitializeSystem<PhysicsSystem>();
			InitializeSystem<VelocitySystem>();

			#ifndef NDK_SERVER
			// Client systems
			InitializeSystem<ListenerSystem>();
			InitializeSystem<RenderSystem>();
			#endif

			NazaraNotice("Initialized: SDK");
			return true;
		}
		catch (const std::exception& e)
		{
			NazaraError("Failed to initialize NDK: " + Nz::String(e.what()));

			return false;
		}
	}
NzDeferredRenderTechnique::NzDeferredRenderTechnique() :
m_renderQueue(static_cast<NzForwardRenderQueue*>(m_forwardTechnique.GetRenderQueue())),
m_GBufferSize(0U)
{
	m_depthStencilBuffer = new NzRenderBuffer;
	m_depthStencilBuffer->SetPersistent(false);

	for (unsigned int i = 0; i < 2; ++i)
	{
		m_workTextures[i] = new NzTexture;
		m_workTextures[i]->SetPersistent(false);
	}

	for (unsigned int i = 0; i < 3; ++i)
	{
		m_GBuffer[i] = new NzTexture;
		m_GBuffer[i]->SetPersistent(false);
	}

	try
	{
		NzErrorFlags errFlags(nzErrorFlag_ThrowException);

		ResetPass(nzRenderPassType_Final, 0);
		ResetPass(nzRenderPassType_Geometry, 0);
		ResetPass(nzRenderPassType_Lighting, 0);
	}
	catch (const std::exception& e)
	{
        NazaraUnused(e);

		NzErrorFlags errFlags(nzErrorFlag_ThrowExceptionDisabled);

		NazaraError("Failed to add geometry and/or phong lighting pass");
		throw;
	}

	try
	{
		NzErrorFlags errFlags(nzErrorFlag_ThrowException);
		ResetPass(nzRenderPassType_AA, 0);
	}
	catch (const std::exception& e)
	{
        NazaraUnused(e);
		NazaraWarning("Failed to add FXAA pass");
	}

	try
	{
		NzErrorFlags errFlags(nzErrorFlag_ThrowException);
		ResetPass(nzRenderPassType_Bloom, 0);
	}
	catch (const std::exception& e)
	{
        NazaraUnused(e);
		NazaraWarning("Failed to add bloom pass");
	}

	try
	{
		NzErrorFlags errFlags(nzErrorFlag_ThrowException);

		NzDeferredRenderPass* dofPass = ResetPass(nzRenderPassType_DOF, 0);
		dofPass->Enable(false);
	}
	catch (const std::exception& e)
	{
        NazaraUnused(e);
		NazaraWarning("Failed to add DOF pass");
	}

	try
	{
		NzErrorFlags errFlags(nzErrorFlag_ThrowException);

		NzDeferredRenderPass* fogPass = ResetPass(nzRenderPassType_Fog, 0);
		fogPass->Enable(false);
	}
	catch (const std::exception& e)
	{
        NazaraUnused(e);
		NazaraWarning("Failed to add fog pass");
	}

	try
	{
		NzErrorFlags errFlags(nzErrorFlag_ThrowException);
		ResetPass(nzRenderPassType_Forward, 0);
	}
	catch (const std::exception& e)
	{
        NazaraUnused(e);
		NazaraWarning("Failed to add forward pass");
	}

	try
	{
		NzErrorFlags errFlags(nzErrorFlag_ThrowException);
		ResetPass(nzRenderPassType_SSAO, 0);
	}
	catch (const std::exception& e)
	{
        NazaraUnused(e);
		NazaraWarning("Failed to add SSAO pass");
	}
}
NzUberShaderInstance* NzUberShaderPreprocessor::Get(const NzParameterList& parameters) const
{
	// Première étape, transformer les paramètres en un flag
	nzUInt32 flags = 0;
	for (auto it = m_flags.begin(); it != m_flags.end(); ++it)
	{
		if (parameters.HasParameter(it->first))
		{
			bool value;
			if (parameters.GetBooleanParameter(it->first, &value) && value)
				flags |= it->second;
		}
	}

	// Le shader fait-il partie du cache ?
	auto shaderIt = m_cache.find(flags);

	// Si non, il nous faut le construire
	if (shaderIt == m_cache.end())
	{
		try
		{
			// Une exception sera lancée à la moindre erreur et celle-ci ne sera pas enregistrée dans le log (car traitée dans le bloc catch)
			NzErrorFlags errFlags(nzErrorFlag_Silent | nzErrorFlag_ThrowException, true);

			NzShaderRef shader = NzShader::New();
			shader->Create();

			for (unsigned int i = 0; i <= nzShaderStage_Max; ++i)
			{
				const Shader& shaderStage = m_shaders[i];

				// Le shader stage est-il activé dans cette version du shader ?
				if (shaderStage.present && (flags & shaderStage.requiredFlags) == shaderStage.requiredFlags)
				{
					nzUInt32 stageFlags = 0;
					for (auto it = shaderStage.flags.begin(); it != shaderStage.flags.end(); ++it)
					{
						if (parameters.HasParameter(it->first))
						{
							bool value;
							if (parameters.GetBooleanParameter(it->first, &value) && value)
								stageFlags |= it->second;
						}
					}

					auto stageIt = shaderStage.cache.find(stageFlags);
					if (stageIt == shaderStage.cache.end())
					{
						NzShaderStage stage;
						stage.Create(static_cast<nzShaderStage>(i));

						unsigned int glslVersion = NzOpenGL::GetGLSLVersion();

						NzStringStream code;
						code << "#version " << glslVersion << "\n\n";

						code << "#define GLSL_VERSION " << glslVersion << "\n\n";

						code << "#define EARLY_FRAGMENT_TEST " << (glslVersion >= 420 || NzOpenGL::IsSupported(nzOpenGLExtension_Shader_ImageLoadStore)) << "\n\n";

						for (auto it = shaderStage.flags.begin(); it != shaderStage.flags.end(); ++it)
							code << "#define " << it->first << ' ' << ((stageFlags & it->second) ? '1' : '0') << '\n';

						code << "\n#line 1\n"; // Pour que les éventuelles erreurs du shader se réfèrent à la bonne ligne
						code << shaderStage.source;

						stage.SetSource(code);
						stage.Compile();

						stageIt = shaderStage.cache.emplace(flags, std::move(stage)).first;
					}

					shader->AttachStage(static_cast<nzShaderStage>(i), stageIt->second);
				}
			}

			shader->Link();

			// On construit l'instant
			shaderIt = m_cache.emplace(flags, shader.Get()).first;
		}
		catch (const std::exception&)
		{
			NzErrorFlags errFlags(nzErrorFlag_ThrowExceptionDisabled);

			NazaraError("Failed to build UberShader instance: " + NzError::GetLastError());
			throw;
		}
	}

	return &shaderIt->second;
}
Exemplo n.º 7
0
	DeferredRenderTechnique::DeferredRenderTechnique() :
	m_renderQueue(static_cast<ForwardRenderQueue*>(m_forwardTechnique.GetRenderQueue())),
	m_GBufferSize(0U)
	{
		m_depthStencilTexture = Texture::New();

		for (unsigned int i = 0; i < 2; ++i)
			m_workTextures[i] = Texture::New();

		for (unsigned int i = 0; i < 3; ++i)
			m_GBuffer[i] = Texture::New();
			
		try
		{
			ErrorFlags errFlags(ErrorFlag_ThrowException);

			ResetPass(RenderPassType_Final, 0);
			ResetPass(RenderPassType_Geometry, 0);
			ResetPass(RenderPassType_Lighting, 0);
		}
		catch (const std::exception& e)
		{
			ErrorFlags errFlags(ErrorFlag_ThrowExceptionDisabled);

			NazaraError("Failed to add geometry and/or phong lighting pass: "******"Failed to add FXAA pass: "******"Failed to add bloom pass: "******"Failed to add DOF pass: "******"Failed to add fog pass: "******"Failed to add forward pass: "******"Failed to add SSAO pass: " + String(e.what()));
		}
	}