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; } }
void LuaAPI::RegisterClasses(Nz::LuaState& state) { Nz::ErrorFlags errFlags(Nz::ErrorFlag_ThrowException, true); GetBinding()->RegisterClasses(state); }
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; }
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())); } }