From cbce6e6e648ed9c96b5d808ad994260251fa8c3a Mon Sep 17 00:00:00 2001 From: Lynix Date: Sat, 11 Jan 2014 10:21:33 +0100 Subject: [PATCH] Reunited Deferred Point Shader and Spot Shader Former-commit-id: 0a77f57d8af98387690748102f6cdcea5d5514ed --- .../Graphics/DeferredPhongLightingPass.hpp | 5 +- .../Graphics/DeferredPhongLightingPass.cpp | 88 +++++-------------- src/Nazara/Graphics/Light.cpp | 4 +- .../DeferredShading/Shaders/PointLight.frag | 82 ----------------- .../DeferredShading/Shaders/PointLight.frag.h | 1 - .../{SpotLight.frag => PointSpotLight.frag} | 25 ++++-- .../Shaders/PointSpotLight.frag.h | 1 + .../DeferredShading/Shaders/SpotLight.frag.h | 1 - 8 files changed, 47 insertions(+), 160 deletions(-) delete mode 100644 src/Nazara/Graphics/Resources/DeferredShading/Shaders/PointLight.frag delete mode 100644 src/Nazara/Graphics/Resources/DeferredShading/Shaders/PointLight.frag.h rename src/Nazara/Graphics/Resources/DeferredShading/Shaders/{SpotLight.frag => PointSpotLight.frag} (82%) create mode 100644 src/Nazara/Graphics/Resources/DeferredShading/Shaders/PointSpotLight.frag.h delete mode 100644 src/Nazara/Graphics/Resources/DeferredShading/Shaders/SpotLight.frag.h diff --git a/include/Nazara/Graphics/DeferredPhongLightingPass.hpp b/include/Nazara/Graphics/DeferredPhongLightingPass.hpp index e61d8808b..59275fdd9 100644 --- a/include/Nazara/Graphics/DeferredPhongLightingPass.hpp +++ b/include/Nazara/Graphics/DeferredPhongLightingPass.hpp @@ -31,12 +31,13 @@ class NAZARA_API NzDeferredPhongLightingPass : public NzDeferredRenderPass NzMeshRef m_cone; NzMeshRef m_sphere; NzShaderProgramRef m_directionalLightProgram; - NzShaderProgramRef m_pointLightProgram; - NzShaderProgramRef m_spotLightProgram; + NzShaderProgramRef m_pointSpotLightProgram; NzTextureSampler m_pointSampler; NzStaticMesh* m_coneMesh; NzStaticMesh* m_sphereMesh; bool m_lightMeshesDrawing; + int m_pointSpotLightProgramDiscardLocation; + int m_pointSpotLightProgramSpotLightLocation; }; #endif // NAZARA_DEFERREDPHONGLIGHTINGPASS_HPP diff --git a/src/Nazara/Graphics/DeferredPhongLightingPass.cpp b/src/Nazara/Graphics/DeferredPhongLightingPass.cpp index 0ab1410e9..da71f3151 100644 --- a/src/Nazara/Graphics/DeferredPhongLightingPass.cpp +++ b/src/Nazara/Graphics/DeferredPhongLightingPass.cpp @@ -62,57 +62,10 @@ namespace return program.release(); } - NzShaderProgram* BuildPointLightProgram() + NzShaderProgram* BuildPointSpotLightProgram() { const nzUInt8 fragmentSource[] = { - #include - }; - - const char* vertexSource = - "#version 140\n" - - "in vec3 VertexPosition;\n" - - "uniform mat4 WorldViewProjMatrix;\n" - - "void main()\n" - "{\n" - "\t" "gl_Position = WorldViewProjMatrix * vec4(VertexPosition, 1.0);" "\n" - "}\n"; - - ///TODO: Remplacer ça par des ShaderNode - std::unique_ptr program(new NzShaderProgram(nzShaderLanguage_GLSL)); - program->SetPersistent(false); - - if (!program->LoadShader(nzShaderType_Fragment, NzString(reinterpret_cast(fragmentSource), sizeof(fragmentSource)))) - { - NazaraError("Failed to load fragment shader"); - return nullptr; - } - - if (!program->LoadShader(nzShaderType_Vertex, vertexSource)) - { - NazaraError("Failed to load vertex shader"); - return nullptr; - } - - if (!program->Compile()) - { - NazaraError("Failed to compile program"); - return nullptr; - } - - program->SendInteger(program->GetUniformLocation("GBuffer0"), 0); - program->SendInteger(program->GetUniformLocation("GBuffer1"), 1); - program->SendInteger(program->GetUniformLocation("GBuffer2"), 2); - - return program.release(); - } - - NzShaderProgram* BuildSpotLightProgram() - { - const nzUInt8 fragmentSource[] = { - #include + #include }; const char* vertexSource = @@ -161,8 +114,10 @@ NzDeferredPhongLightingPass::NzDeferredPhongLightingPass() : m_lightMeshesDrawing(false) { m_directionalLightProgram = BuildDirectionalLightProgram(); - m_pointLightProgram = BuildPointLightProgram(); - m_spotLightProgram = BuildSpotLightProgram(); + m_pointSpotLightProgram = BuildPointSpotLightProgram(); + + m_pointSpotLightProgramDiscardLocation = m_pointSpotLightProgram->GetUniformLocation("Discard"); + m_pointSpotLightProgramSpotLightLocation = m_pointSpotLightProgram->GetUniformLocation("SpotLight"); m_pointSampler.SetAnisotropyLevel(1); m_pointSampler.SetFilterMode(nzSamplerFilter_Nearest); @@ -252,21 +207,23 @@ bool NzDeferredPhongLightingPass::Process(const NzScene* scene, unsigned int fir NzRenderer::SetRenderStates(lightStates); + NzRenderer::SetShaderProgram(m_pointSpotLightProgram); + m_pointSpotLightProgram->SendColor(m_pointSpotLightProgram->GetUniformLocation(nzShaderUniform_SceneAmbient), scene->GetAmbientColor()); + m_pointSpotLightProgram->SendVector(m_pointSpotLightProgram->GetUniformLocation(nzShaderUniform_EyePosition), scene->GetViewer()->GetEyePosition()); + + NzMatrix4f lightMatrix; + lightMatrix.MakeIdentity(); if (!m_renderQueue->pointLights.empty()) { - NzRenderer::SetShaderProgram(m_pointLightProgram); - m_pointLightProgram->SendColor(m_pointLightProgram->GetUniformLocation(nzShaderUniform_SceneAmbient), scene->GetAmbientColor()); - m_pointLightProgram->SendVector(m_pointLightProgram->GetUniformLocation(nzShaderUniform_EyePosition), scene->GetViewer()->GetEyePosition()); + m_pointSpotLightProgram->SendBoolean(m_pointSpotLightProgramSpotLightLocation, false); const NzIndexBuffer* indexBuffer = m_sphereMesh->GetIndexBuffer(); NzRenderer::SetIndexBuffer(indexBuffer); NzRenderer::SetVertexBuffer(m_sphereMesh->GetVertexBuffer()); - NzMatrix4f lightMatrix; - lightMatrix.MakeIdentity(); for (const NzLight* light : m_renderQueue->pointLights) { - light->Enable(m_pointLightProgram, 0); + light->Enable(m_pointSpotLightProgram, 0); lightMatrix.SetScale(NzVector3f(light->GetRadius()*1.1f)); // Pour corriger les imperfections liées à la sphère lightMatrix.SetTranslation(light->GetPosition()); @@ -278,6 +235,8 @@ bool NzDeferredPhongLightingPass::Process(const NzScene* scene, unsigned int fir NzRenderer::Enable(nzRendererParameter_FaceCulling, false); NzRenderer::SetStencilCompareFunction(nzRendererComparison_Always); + m_pointSpotLightProgram->SendBoolean(m_pointSpotLightProgramDiscardLocation, true); + NzRenderer::DrawIndexedPrimitives(nzPrimitiveMode_TriangleList, 0, indexBuffer->GetIndexCount()); // Rendu de la sphère comme zone d'effet @@ -287,6 +246,8 @@ bool NzDeferredPhongLightingPass::Process(const NzScene* scene, unsigned int fir NzRenderer::SetStencilCompareFunction(nzRendererComparison_NotEqual, nzFaceSide_Back); NzRenderer::SetStencilPassOperation(nzStencilOperation_Zero, nzFaceSide_Back); + m_pointSpotLightProgram->SendBoolean(m_pointSpotLightProgramDiscardLocation, false); + NzRenderer::DrawIndexedPrimitives(nzPrimitiveMode_TriangleList, 0, indexBuffer->GetIndexCount()); } @@ -334,19 +295,15 @@ bool NzDeferredPhongLightingPass::Process(const NzScene* scene, unsigned int fir if (!m_renderQueue->spotLights.empty()) { - NzRenderer::SetShaderProgram(m_spotLightProgram); - m_spotLightProgram->SendColor(m_spotLightProgram->GetUniformLocation(nzShaderUniform_SceneAmbient), scene->GetAmbientColor()); - m_spotLightProgram->SendVector(m_spotLightProgram->GetUniformLocation(nzShaderUniform_EyePosition), scene->GetViewer()->GetEyePosition()); + m_pointSpotLightProgram->SendBoolean(m_pointSpotLightProgramSpotLightLocation, true); const NzIndexBuffer* indexBuffer = m_coneMesh->GetIndexBuffer(); NzRenderer::SetIndexBuffer(indexBuffer); NzRenderer::SetVertexBuffer(m_coneMesh->GetVertexBuffer()); - NzMatrix4f lightMatrix; - lightMatrix.MakeIdentity(); for (const NzLight* light : m_renderQueue->spotLights) { - light->Enable(m_spotLightProgram, 0); + light->Enable(m_pointSpotLightProgram, 0); float radius = light->GetRadius()*std::tan(NzDegreeToRadian(light->GetOuterAngle()))*1.1f; lightMatrix.MakeTransform(light->GetPosition(), light->GetRotation(), NzVector3f(radius, radius, light->GetRadius())); @@ -358,6 +315,8 @@ bool NzDeferredPhongLightingPass::Process(const NzScene* scene, unsigned int fir NzRenderer::Enable(nzRendererParameter_FaceCulling, false); NzRenderer::SetStencilCompareFunction(nzRendererComparison_Always); + m_pointSpotLightProgram->SendBoolean(m_pointSpotLightProgramDiscardLocation, true); + NzRenderer::DrawIndexedPrimitives(nzPrimitiveMode_TriangleList, 0, indexBuffer->GetIndexCount()); // Rendu de la sphère comme zone d'effet @@ -368,6 +327,8 @@ bool NzDeferredPhongLightingPass::Process(const NzScene* scene, unsigned int fir NzRenderer::SetStencilCompareFunction(nzRendererComparison_NotEqual, nzFaceSide_Back); NzRenderer::SetStencilPassOperation(nzStencilOperation_Zero, nzFaceSide_Back); + m_pointSpotLightProgram->SendBoolean(m_pointSpotLightProgramDiscardLocation, false); + NzRenderer::DrawIndexedPrimitives(nzPrimitiveMode_TriangleList, 0, indexBuffer->GetIndexCount()); } @@ -418,4 +379,3 @@ bool NzDeferredPhongLightingPass::Process(const NzScene* scene, unsigned int fir return true; } - diff --git a/src/Nazara/Graphics/Light.cpp b/src/Nazara/Graphics/Light.cpp index a27fa82d2..8ccd1bb5a 100644 --- a/src/Nazara/Graphics/Light.cpp +++ b/src/Nazara/Graphics/Light.cpp @@ -67,7 +67,7 @@ void NzLight::Enable(const NzShaderProgram* program, unsigned int lightUnit) con Point -P1: vec3 position + float attenuation - -P2: float invRadius + -P2: vec3 NON-USED + float invRadius Spot -P1: vec3 position + float attenuation @@ -112,7 +112,7 @@ void NzLight::Enable(const NzShaderProgram* program, unsigned int lightUnit) con case nzLightType_Point: program->SendVector(parameters1Location, NzVector4f(m_derivedPosition, m_attenuation)); - program->SendVector(parameters2Location, NzVector4f(1.f/m_radius, 0.f, 0.f, 0.f)); + program->SendVector(parameters2Location, NzVector4f(0.f, 0.f, 0.f, 1.f/m_radius)); break; case nzLightType_Spot: diff --git a/src/Nazara/Graphics/Resources/DeferredShading/Shaders/PointLight.frag b/src/Nazara/Graphics/Resources/DeferredShading/Shaders/PointLight.frag deleted file mode 100644 index 372b421a5..000000000 --- a/src/Nazara/Graphics/Resources/DeferredShading/Shaders/PointLight.frag +++ /dev/null @@ -1,82 +0,0 @@ -#version 140 - -out vec4 RenderTarget0; - -struct Light -{ - int type; - vec4 ambient; - vec4 color; - vec2 factors; - - vec4 parameters1; - vec4 parameters2; - vec2 parameters3; -}; - -uniform vec3 EyePosition; -uniform Light Lights[1]; - -uniform sampler2D GBuffer0; -uniform sampler2D GBuffer1; -uniform sampler2D GBuffer2; - -uniform mat4 InvViewProjMatrix; -uniform vec2 InvTargetSize; -uniform vec4 SceneAmbient; - -void main() -{ - vec2 texCoord = gl_FragCoord.xy * InvTargetSize; - vec4 gVec0 = textureLod(GBuffer0, texCoord, 0.0); -/* if (gVec0.w == 0.0) - { - RenderTarget0 = vec4(gVec0.xyz, 1.0); - return; - }*/ - - vec4 gVec1 = textureLod(GBuffer1, texCoord, 0.0); - vec4 gVec2 = textureLod(GBuffer2, texCoord, 0.0); - - vec3 diffuseColor = gVec0.xyz; - vec3 normal = gVec1.xyz*2.0 - 1.0; - vec3 specularColor = gVec2.xyz; - float depth = gVec1.w*2.0 - 1.0; - float shininess = (gVec2.w == 0.0) ? 0.0 : exp2(gVec2.w*10.5); - - vec3 viewSpace = vec3(texCoord*2.0 - 1.0, depth); - - vec4 worldPos = InvViewProjMatrix * vec4(viewSpace, 1.0); - worldPos.xyz /= worldPos.w; - - vec3 lightDir = Lights[0].parameters1.xyz - worldPos.xyz; - float lightDirLength = length(lightDir); - lightDir /= lightDirLength; - - float att = max(Lights[0].parameters1.w - Lights[0].parameters2.x*lightDirLength, 0.0); - - // Ambient - vec3 lightAmbient = att * Lights[0].color.rgb * Lights[0].factors.x * (vec3(1.0) + SceneAmbient.rgb); - - // Diffuse - float lambert = max(dot(normal, lightDir), 0.0); - - vec3 lightDiffuse = att * lambert * Lights[0].color.rgb * Lights[0].factors.y; - - // Specular - vec3 lightSpecular = vec3(0.0); - if (shininess > 0.0) - { - vec3 eyeVec = normalize(EyePosition - worldPos.xyz); - vec3 reflection = reflect(-lightDir, normal); - float specularFactor = max(dot(reflection, eyeVec), 0.0); - specularFactor = pow(specularFactor, shininess); - - lightSpecular = att * specularFactor * Lights[0].color.rgb; - } - - lightSpecular *= specularColor; - - vec3 fragmentColor = diffuseColor * (lightAmbient + lightDiffuse + lightSpecular); - RenderTarget0 = vec4(fragmentColor, 1.0); -} \ No newline at end of file diff --git a/src/Nazara/Graphics/Resources/DeferredShading/Shaders/PointLight.frag.h b/src/Nazara/Graphics/Resources/DeferredShading/Shaders/PointLight.frag.h deleted file mode 100644 index ae8c7784c..000000000 --- a/src/Nazara/Graphics/Resources/DeferredShading/Shaders/PointLight.frag.h +++ /dev/null @@ -1 +0,0 @@ -35,118,101,114,115,105,111,110,32,49,52,48,13,10,13,10,111,117,116,32,118,101,99,52,32,82,101,110,100,101,114,84,97,114,103,101,116,48,59,13,10,13,10,115,116,114,117,99,116,32,76,105,103,104,116,13,10,123,13,10,9,105,110,116,32,116,121,112,101,59,13,10,9,118,101,99,52,32,97,109,98,105,101,110,116,59,13,10,9,118,101,99,52,32,99,111,108,111,114,59,13,10,9,118,101,99,50,32,102,97,99,116,111,114,115,59,13,10,13,10,9,118,101,99,52,32,112,97,114,97,109,101,116,101,114,115,49,59,13,10,9,118,101,99,52,32,112,97,114,97,109,101,116,101,114,115,50,59,13,10,9,118,101,99,50,32,112,97,114,97,109,101,116,101,114,115,51,59,13,10,125,59,13,10,13,10,117,110,105,102,111,114,109,32,118,101,99,51,32,69,121,101,80,111,115,105,116,105,111,110,59,13,10,117,110,105,102,111,114,109,32,76,105,103,104,116,32,76,105,103,104,116,115,91,49,93,59,13,10,13,10,117,110,105,102,111,114,109,32,115,97,109,112,108,101,114,50,68,32,71,66,117,102,102,101,114,48,59,13,10,117,110,105,102,111,114,109,32,115,97,109,112,108,101,114,50,68,32,71,66,117,102,102,101,114,49,59,13,10,117,110,105,102,111,114,109,32,115,97,109,112,108,101,114,50,68,32,71,66,117,102,102,101,114,50,59,13,10,13,10,117,110,105,102,111,114,109,32,109,97,116,52,32,73,110,118,86,105,101,119,80,114,111,106,77,97,116,114,105,120,59,13,10,117,110,105,102,111,114,109,32,118,101,99,50,32,73,110,118,84,97,114,103,101,116,83,105,122,101,59,13,10,117,110,105,102,111,114,109,32,118,101,99,52,32,83,99,101,110,101,65,109,98,105,101,110,116,59,13,10,13,10,118,111,105,100,32,109,97,105,110,40,41,13,10,123,13,10,9,118,101,99,50,32,116,101,120,67,111,111,114,100,32,61,32,103,108,95,70,114,97,103,67,111,111,114,100,46,120,121,32,42,32,73,110,118,84,97,114,103,101,116,83,105,122,101,59,13,10,9,118,101,99,52,32,103,86,101,99,48,32,61,32,116,101,120,116,117,114,101,76,111,100,40,71,66,117,102,102,101,114,48,44,32,116,101,120,67,111,111,114,100,44,32,48,46,48,41,59,13,10,47,42,9,105,102,32,40,103,86,101,99,48,46,119,32,61,61,32,48,46,48,41,13,10,9,123,13,10,9,9,82,101,110,100,101,114,84,97,114,103,101,116,48,32,61,32,118,101,99,52,40,103,86,101,99,48,46,120,121,122,44,32,49,46,48,41,59,13,10,9,9,114,101,116,117,114,110,59,13,10,9,125,42,47,13,10,13,10,9,118,101,99,52,32,103,86,101,99,49,32,61,32,116,101,120,116,117,114,101,76,111,100,40,71,66,117,102,102,101,114,49,44,32,116,101,120,67,111,111,114,100,44,32,48,46,48,41,59,13,10,9,118,101,99,52,32,103,86,101,99,50,32,61,32,116,101,120,116,117,114,101,76,111,100,40,71,66,117,102,102,101,114,50,44,32,116,101,120,67,111,111,114,100,44,32,48,46,48,41,59,13,10,13,10,9,118,101,99,51,32,100,105,102,102,117,115,101,67,111,108,111,114,32,61,32,103,86,101,99,48,46,120,121,122,59,13,10,9,118,101,99,51,32,110,111,114,109,97,108,32,61,32,103,86,101,99,49,46,120,121,122,42,50,46,48,32,45,32,49,46,48,59,13,10,9,118,101,99,51,32,115,112,101,99,117,108,97,114,67,111,108,111,114,32,61,32,103,86,101,99,50,46,120,121,122,59,13,10,9,102,108,111,97,116,32,100,101,112,116,104,32,61,32,103,86,101,99,49,46,119,42,50,46,48,32,45,32,49,46,48,59,13,10,9,102,108,111,97,116,32,115,104,105,110,105,110,101,115,115,32,61,32,40,103,86,101,99,50,46,119,32,61,61,32,48,46,48,41,32,63,32,48,46,48,32,58,32,101,120,112,50,40,103,86,101,99,50,46,119,42,49,48,46,53,41,59,13,10,13,10,9,118,101,99,51,32,118,105,101,119,83,112,97,99,101,32,61,32,118,101,99,51,40,116,101,120,67,111,111,114,100,42,50,46,48,32,45,32,49,46,48,44,32,100,101,112,116,104,41,59,13,10,13,10,9,118,101,99,52,32,119,111,114,108,100,80,111,115,32,61,32,73,110,118,86,105,101,119,80,114,111,106,77,97,116,114,105,120,32,42,32,118,101,99,52,40,118,105,101,119,83,112,97,99,101,44,32,49,46,48,41,59,13,10,9,119,111,114,108,100,80,111,115,46,120,121,122,32,47,61,32,119,111,114,108,100,80,111,115,46,119,59,13,10,13,10,9,118,101,99,51,32,108,105,103,104,116,68,105,114,32,61,32,76,105,103,104,116,115,91,48,93,46,112,97,114,97,109,101,116,101,114,115,49,46,120,121,122,32,45,32,119,111,114,108,100,80,111,115,46,120,121,122,59,13,10,9,102,108,111,97,116,32,108,105,103,104,116,68,105,114,76,101,110,103,116,104,32,61,32,108,101,110,103,116,104,40,108,105,103,104,116,68,105,114,41,59,13,10,9,108,105,103,104,116,68,105,114,32,47,61,32,108,105,103,104,116,68,105,114,76,101,110,103,116,104,59,13,10,13,10,9,102,108,111,97,116,32,97,116,116,32,61,32,109,97,120,40,76,105,103,104,116,115,91,48,93,46,112,97,114,97,109,101,116,101,114,115,49,46,119,32,45,32,76,105,103,104,116,115,91,48,93,46,112,97,114,97,109,101,116,101,114,115,50,46,120,42,108,105,103,104,116,68,105,114,76,101,110,103,116,104,44,32,48,46,48,41,59,13,10,13,10,9,47,47,32,65,109,98,105,101,110,116,13,10,9,118,101,99,51,32,108,105,103,104,116,65,109,98,105,101,110,116,32,61,32,97,116,116,32,42,32,76,105,103,104,116,115,91,48,93,46,99,111,108,111,114,46,114,103,98,32,42,32,76,105,103,104,116,115,91,48,93,46,102,97,99,116,111,114,115,46,120,32,42,32,40,118,101,99,51,40,49,46,48,41,32,43,32,83,99,101,110,101,65,109,98,105,101,110,116,46,114,103,98,41,59,13,10,13,10,9,47,47,32,68,105,102,102,117,115,101,13,10,9,102,108,111,97,116,32,108,97,109,98,101,114,116,32,61,32,109,97,120,40,100,111,116,40,110,111,114,109,97,108,44,32,108,105,103,104,116,68,105,114,41,44,32,48,46,48,41,59,13,10,13,10,9,118,101,99,51,32,108,105,103,104,116,68,105,102,102,117,115,101,32,61,32,97,116,116,32,42,32,108,97,109,98,101,114,116,32,42,32,76,105,103,104,116,115,91,48,93,46,99,111,108,111,114,46,114,103,98,32,42,32,76,105,103,104,116,115,91,48,93,46,102,97,99,116,111,114,115,46,121,59,13,10,13,10,9,47,47,32,83,112,101,99,117,108,97,114,13,10,9,118,101,99,51,32,108,105,103,104,116,83,112,101,99,117,108,97,114,32,61,32,118,101,99,51,40,48,46,48,41,59,13,10,9,105,102,32,40,115,104,105,110,105,110,101,115,115,32,62,32,48,46,48,41,13,10,9,123,13,10,9,9,118,101,99,51,32,101,121,101,86,101,99,32,61,32,110,111,114,109,97,108,105,122,101,40,69,121,101,80,111,115,105,116,105,111,110,32,45,32,119,111,114,108,100,80,111,115,46,120,121,122,41,59,13,10,9,9,118,101,99,51,32,114,101,102,108,101,99,116,105,111,110,32,61,32,114,101,102,108,101,99,116,40,45,108,105,103,104,116,68,105,114,44,32,110,111,114,109,97,108,41,59,13,10,9,9,102,108,111,97,116,32,115,112,101,99,117,108,97,114,70,97,99,116,111,114,32,61,32,109,97,120,40,100,111,116,40,114,101,102,108,101,99,116,105,111,110,44,32,101,121,101,86,101,99,41,44,32,48,46,48,41,59,13,10,9,9,115,112,101,99,117,108,97,114,70,97,99,116,111,114,32,61,32,112,111,119,40,115,112,101,99,117,108,97,114,70,97,99,116,111,114,44,32,115,104,105,110,105,110,101,115,115,41,59,13,10,13,10,9,9,108,105,103,104,116,83,112,101,99,117,108,97,114,32,61,32,97,116,116,32,42,32,115,112,101,99,117,108,97,114,70,97,99,116,111,114,32,42,32,76,105,103,104,116,115,91,48,93,46,99,111,108,111,114,46,114,103,98,59,13,10,9,125,13,10,13,10,9,108,105,103,104,116,83,112,101,99,117,108,97,114,32,42,61,32,115,112,101,99,117,108,97,114,67,111,108,111,114,59,13,10,13,10,9,118,101,99,51,32,102,114,97,103,109,101,110,116,67,111,108,111,114,32,61,32,100,105,102,102,117,115,101,67,111,108,111,114,32,42,32,40,108,105,103,104,116,65,109,98,105,101,110,116,32,43,32,108,105,103,104,116,68,105,102,102,117,115,101,32,43,32,108,105,103,104,116,83,112,101,99,117,108,97,114,41,59,13,10,9,82,101,110,100,101,114,84,97,114,103,101,116,48,32,61,32,118,101,99,52,40,102,114,97,103,109,101,110,116,67,111,108,111,114,44,32,49,46,48,41,59,13,10,125, \ No newline at end of file diff --git a/src/Nazara/Graphics/Resources/DeferredShading/Shaders/SpotLight.frag b/src/Nazara/Graphics/Resources/DeferredShading/Shaders/PointSpotLight.frag similarity index 82% rename from src/Nazara/Graphics/Resources/DeferredShading/Shaders/SpotLight.frag rename to src/Nazara/Graphics/Resources/DeferredShading/Shaders/PointSpotLight.frag index dc9fdbc27..1fcbfed79 100644 --- a/src/Nazara/Graphics/Resources/DeferredShading/Shaders/SpotLight.frag +++ b/src/Nazara/Graphics/Resources/DeferredShading/Shaders/PointSpotLight.frag @@ -25,15 +25,21 @@ uniform mat4 InvViewProjMatrix; uniform vec2 InvTargetSize; uniform vec4 SceneAmbient; +uniform bool Discard = false; +uniform bool SpotLight; + void main() { + if (Discard) + return; + vec2 texCoord = gl_FragCoord.xy * InvTargetSize; vec4 gVec0 = textureLod(GBuffer0, texCoord, 0.0); -/* if (gVec0.w == 0.0) + if (gVec0.w == 0.0) { RenderTarget0 = vec4(gVec0.xyz, 1.0); return; - }*/ + } vec4 gVec1 = textureLod(GBuffer1, texCoord, 0.0); vec4 gVec2 = textureLod(GBuffer2, texCoord, 0.0); @@ -58,12 +64,15 @@ void main() // Ambient vec3 lightAmbient = att * Lights[0].color.rgb * Lights[0].factors.x * (vec3(1.0) + SceneAmbient.rgb); - // Modification de l'atténuation pour gérer le spot - float curAngle = dot(Lights[0].parameters2.xyz, -lightDir); - float outerAngle = Lights[0].parameters3.y; - float innerMinusOuterAngle = Lights[0].parameters3.x - outerAngle; - att *= max((curAngle - outerAngle) / innerMinusOuterAngle, 0.0); - + if (SpotLight) + { + // Modification de l'atténuation pour gérer le spot + float curAngle = dot(Lights[0].parameters2.xyz, -lightDir); + float outerAngle = Lights[0].parameters3.y; + float innerMinusOuterAngle = Lights[0].parameters3.x - outerAngle; + att *= max((curAngle - outerAngle) / innerMinusOuterAngle, 0.0); + } + // Diffuse float lambert = max(dot(normal, lightDir), 0.0); diff --git a/src/Nazara/Graphics/Resources/DeferredShading/Shaders/PointSpotLight.frag.h b/src/Nazara/Graphics/Resources/DeferredShading/Shaders/PointSpotLight.frag.h new file mode 100644 index 000000000..6bdaa6b54 --- /dev/null +++ b/src/Nazara/Graphics/Resources/DeferredShading/Shaders/PointSpotLight.frag.h @@ -0,0 +1 @@ +35,118,101,114,115,105,111,110,32,49,52,48,13,10,13,10,111,117,116,32,118,101,99,52,32,82,101,110,100,101,114,84,97,114,103,101,116,48,59,13,10,13,10,115,116,114,117,99,116,32,76,105,103,104,116,13,10,123,13,10,9,105,110,116,32,116,121,112,101,59,13,10,9,118,101,99,52,32,97,109,98,105,101,110,116,59,13,10,9,118,101,99,52,32,99,111,108,111,114,59,13,10,9,118,101,99,50,32,102,97,99,116,111,114,115,59,13,10,13,10,9,118,101,99,52,32,112,97,114,97,109,101,116,101,114,115,49,59,13,10,9,118,101,99,52,32,112,97,114,97,109,101,116,101,114,115,50,59,13,10,9,118,101,99,50,32,112,97,114,97,109,101,116,101,114,115,51,59,13,10,125,59,13,10,13,10,117,110,105,102,111,114,109,32,118,101,99,51,32,69,121,101,80,111,115,105,116,105,111,110,59,13,10,117,110,105,102,111,114,109,32,76,105,103,104,116,32,76,105,103,104,116,115,91,49,93,59,13,10,13,10,117,110,105,102,111,114,109,32,115,97,109,112,108,101,114,50,68,32,71,66,117,102,102,101,114,48,59,13,10,117,110,105,102,111,114,109,32,115,97,109,112,108,101,114,50,68,32,71,66,117,102,102,101,114,49,59,13,10,117,110,105,102,111,114,109,32,115,97,109,112,108,101,114,50,68,32,71,66,117,102,102,101,114,50,59,13,10,13,10,117,110,105,102,111,114,109,32,109,97,116,52,32,73,110,118,86,105,101,119,80,114,111,106,77,97,116,114,105,120,59,13,10,117,110,105,102,111,114,109,32,118,101,99,50,32,73,110,118,84,97,114,103,101,116,83,105,122,101,59,13,10,117,110,105,102,111,114,109,32,118,101,99,52,32,83,99,101,110,101,65,109,98,105,101,110,116,59,13,10,13,10,117,110,105,102,111,114,109,32,98,111,111,108,32,68,105,115,99,97,114,100,32,61,32,102,97,108,115,101,59,13,10,117,110,105,102,111,114,109,32,98,111,111,108,32,83,112,111,116,76,105,103,104,116,59,13,10,13,10,118,111,105,100,32,109,97,105,110,40,41,13,10,123,13,10,9,105,102,32,40,68,105,115,99,97,114,100,41,13,10,9,9,114,101,116,117,114,110,59,13,10,13,10,9,118,101,99,50,32,116,101,120,67,111,111,114,100,32,61,32,103,108,95,70,114,97,103,67,111,111,114,100,46,120,121,32,42,32,73,110,118,84,97,114,103,101,116,83,105,122,101,59,13,10,9,118,101,99,52,32,103,86,101,99,48,32,61,32,116,101,120,116,117,114,101,76,111,100,40,71,66,117,102,102,101,114,48,44,32,116,101,120,67,111,111,114,100,44,32,48,46,48,41,59,13,10,9,105,102,32,40,103,86,101,99,48,46,119,32,61,61,32,48,46,48,41,13,10,9,123,13,10,9,9,82,101,110,100,101,114,84,97,114,103,101,116,48,32,61,32,118,101,99,52,40,103,86,101,99,48,46,120,121,122,44,32,49,46,48,41,59,13,10,9,9,114,101,116,117,114,110,59,13,10,9,125,13,10,13,10,9,118,101,99,52,32,103,86,101,99,49,32,61,32,116,101,120,116,117,114,101,76,111,100,40,71,66,117,102,102,101,114,49,44,32,116,101,120,67,111,111,114,100,44,32,48,46,48,41,59,13,10,9,118,101,99,52,32,103,86,101,99,50,32,61,32,116,101,120,116,117,114,101,76,111,100,40,71,66,117,102,102,101,114,50,44,32,116,101,120,67,111,111,114,100,44,32,48,46,48,41,59,13,10,13,10,9,118,101,99,51,32,100,105,102,102,117,115,101,67,111,108,111,114,32,61,32,103,86,101,99,48,46,120,121,122,59,13,10,9,118,101,99,51,32,110,111,114,109,97,108,32,61,32,103,86,101,99,49,46,120,121,122,42,50,46,48,32,45,32,49,46,48,59,13,10,9,118,101,99,51,32,115,112,101,99,117,108,97,114,67,111,108,111,114,32,61,32,103,86,101,99,50,46,120,121,122,59,13,10,9,102,108,111,97,116,32,100,101,112,116,104,32,61,32,103,86,101,99,49,46,119,42,50,46,48,32,45,32,49,46,48,59,13,10,9,102,108,111,97,116,32,115,104,105,110,105,110,101,115,115,32,61,32,40,103,86,101,99,50,46,119,32,61,61,32,48,46,48,41,32,63,32,48,46,48,32,58,32,101,120,112,50,40,103,86,101,99,50,46,119,42,49,48,46,53,41,59,13,10,13,10,9,118,101,99,51,32,118,105,101,119,83,112,97,99,101,32,61,32,118,101,99,51,40,116,101,120,67,111,111,114,100,42,50,46,48,32,45,32,49,46,48,44,32,100,101,112,116,104,41,59,13,10,13,10,9,118,101,99,52,32,119,111,114,108,100,80,111,115,32,61,32,73,110,118,86,105,101,119,80,114,111,106,77,97,116,114,105,120,32,42,32,118,101,99,52,40,118,105,101,119,83,112,97,99,101,44,32,49,46,48,41,59,13,10,9,119,111,114,108,100,80,111,115,46,120,121,122,32,47,61,32,119,111,114,108,100,80,111,115,46,119,59,13,10,13,10,9,118,101,99,51,32,108,105,103,104,116,68,105,114,32,61,32,76,105,103,104,116,115,91,48,93,46,112,97,114,97,109,101,116,101,114,115,49,46,120,121,122,32,45,32,119,111,114,108,100,80,111,115,46,120,121,122,59,13,10,9,102,108,111,97,116,32,108,105,103,104,116,68,105,114,76,101,110,103,116,104,32,61,32,108,101,110,103,116,104,40,108,105,103,104,116,68,105,114,41,59,13,10,9,108,105,103,104,116,68,105,114,32,47,61,32,108,105,103,104,116,68,105,114,76,101,110,103,116,104,59,13,10,13,10,9,102,108,111,97,116,32,97,116,116,32,61,32,109,97,120,40,76,105,103,104,116,115,91,48,93,46,112,97,114,97,109,101,116,101,114,115,49,46,119,32,45,32,76,105,103,104,116,115,91,48,93,46,112,97,114,97,109,101,116,101,114,115,50,46,119,42,108,105,103,104,116,68,105,114,76,101,110,103,116,104,44,32,48,46,48,41,59,13,10,13,10,9,47,47,32,65,109,98,105,101,110,116,13,10,9,118,101,99,51,32,108,105,103,104,116,65,109,98,105,101,110,116,32,61,32,97,116,116,32,42,32,76,105,103,104,116,115,91,48,93,46,99,111,108,111,114,46,114,103,98,32,42,32,76,105,103,104,116,115,91,48,93,46,102,97,99,116,111,114,115,46,120,32,42,32,40,118,101,99,51,40,49,46,48,41,32,43,32,83,99,101,110,101,65,109,98,105,101,110,116,46,114,103,98,41,59,13,10,13,10,9,105,102,32,40,83,112,111,116,76,105,103,104,116,41,13,10,9,123,13,10,9,9,47,47,32,77,111,100,105,102,105,99,97,116,105,111,110,32,100,101,32,108,39,97,116,116,195,169,110,117,97,116,105,111,110,32,112,111,117,114,32,103,195,169,114,101,114,32,108,101,32,115,112,111,116,13,10,9,9,102,108,111,97,116,32,99,117,114,65,110,103,108,101,32,61,32,100,111,116,40,76,105,103,104,116,115,91,48,93,46,112,97,114,97,109,101,116,101,114,115,50,46,120,121,122,44,32,45,108,105,103,104,116,68,105,114,41,59,13,10,9,9,102,108,111,97,116,32,111,117,116,101,114,65,110,103,108,101,32,61,32,76,105,103,104,116,115,91,48,93,46,112,97,114,97,109,101,116,101,114,115,51,46,121,59,13,10,9,9,102,108,111,97,116,32,105,110,110,101,114,77,105,110,117,115,79,117,116,101,114,65,110,103,108,101,32,61,32,76,105,103,104,116,115,91,48,93,46,112,97,114,97,109,101,116,101,114,115,51,46,120,32,45,32,111,117,116,101,114,65,110,103,108,101,59,13,10,9,9,97,116,116,32,42,61,32,109,97,120,40,40,99,117,114,65,110,103,108,101,32,45,32,111,117,116,101,114,65,110,103,108,101,41,32,47,32,105,110,110,101,114,77,105,110,117,115,79,117,116,101,114,65,110,103,108,101,44,32,48,46,48,41,59,13,10,9,125,13,10,9,13,10,9,47,47,32,68,105,102,102,117,115,101,13,10,9,102,108,111,97,116,32,108,97,109,98,101,114,116,32,61,32,109,97,120,40,100,111,116,40,110,111,114,109,97,108,44,32,108,105,103,104,116,68,105,114,41,44,32,48,46,48,41,59,13,10,13,10,9,118,101,99,51,32,108,105,103,104,116,68,105,102,102,117,115,101,32,61,32,97,116,116,32,42,32,108,97,109,98,101,114,116,32,42,32,76,105,103,104,116,115,91,48,93,46,99,111,108,111,114,46,114,103,98,32,42,32,76,105,103,104,116,115,91,48,93,46,102,97,99,116,111,114,115,46,121,59,13,10,13,10,9,47,47,32,83,112,101,99,117,108,97,114,13,10,9,118,101,99,51,32,108,105,103,104,116,83,112,101,99,117,108,97,114,32,61,32,118,101,99,51,40,48,46,48,41,59,13,10,9,105,102,32,40,115,104,105,110,105,110,101,115,115,32,62,32,48,46,48,41,13,10,9,123,13,10,9,9,118,101,99,51,32,101,121,101,86,101,99,32,61,32,110,111,114,109,97,108,105,122,101,40,69,121,101,80,111,115,105,116,105,111,110,32,45,32,119,111,114,108,100,80,111,115,46,120,121,122,41,59,13,10,9,9,118,101,99,51,32,114,101,102,108,101,99,116,105,111,110,32,61,32,114,101,102,108,101,99,116,40,45,108,105,103,104,116,68,105,114,44,32,110,111,114,109,97,108,41,59,13,10,9,9,102,108,111,97,116,32,115,112,101,99,117,108,97,114,70,97,99,116,111,114,32,61,32,109,97,120,40,100,111,116,40,114,101,102,108,101,99,116,105,111,110,44,32,101,121,101,86,101,99,41,44,32,48,46,48,41,59,13,10,9,9,115,112,101,99,117,108,97,114,70,97,99,116,111,114,32,61,32,112,111,119,40,115,112,101,99,117,108,97,114,70,97,99,116,111,114,44,32,115,104,105,110,105,110,101,115,115,41,59,13,10,13,10,9,9,108,105,103,104,116,83,112,101,99,117,108,97,114,32,61,32,97,116,116,32,42,32,115,112,101,99,117,108,97,114,70,97,99,116,111,114,32,42,32,76,105,103,104,116,115,91,48,93,46,99,111,108,111,114,46,114,103,98,59,13,10,9,125,13,10,13,10,9,108,105,103,104,116,83,112,101,99,117,108,97,114,32,42,61,32,115,112,101,99,117,108,97,114,67,111,108,111,114,59,13,10,13,10,9,118,101,99,51,32,102,114,97,103,109,101,110,116,67,111,108,111,114,32,61,32,100,105,102,102,117,115,101,67,111,108,111,114,32,42,32,40,108,105,103,104,116,65,109,98,105,101,110,116,32,43,32,108,105,103,104,116,68,105,102,102,117,115,101,32,43,32,108,105,103,104,116,83,112,101,99,117,108,97,114,41,59,13,10,9,82,101,110,100,101,114,84,97,114,103,101,116,48,32,61,32,118,101,99,52,40,102,114,97,103,109,101,110,116,67,111,108,111,114,44,32,49,46,48,41,59,13,10,125, \ No newline at end of file diff --git a/src/Nazara/Graphics/Resources/DeferredShading/Shaders/SpotLight.frag.h b/src/Nazara/Graphics/Resources/DeferredShading/Shaders/SpotLight.frag.h deleted file mode 100644 index acaa928f5..000000000 --- a/src/Nazara/Graphics/Resources/DeferredShading/Shaders/SpotLight.frag.h +++ /dev/null @@ -1 +0,0 @@ -35,118,101,114,115,105,111,110,32,49,52,48,13,10,13,10,111,117,116,32,118,101,99,52,32,82,101,110,100,101,114,84,97,114,103,101,116,48,59,13,10,13,10,115,116,114,117,99,116,32,76,105,103,104,116,13,10,123,13,10,9,105,110,116,32,116,121,112,101,59,13,10,9,118,101,99,52,32,97,109,98,105,101,110,116,59,13,10,9,118,101,99,52,32,99,111,108,111,114,59,13,10,9,118,101,99,50,32,102,97,99,116,111,114,115,59,13,10,13,10,9,118,101,99,52,32,112,97,114,97,109,101,116,101,114,115,49,59,13,10,9,118,101,99,52,32,112,97,114,97,109,101,116,101,114,115,50,59,13,10,9,118,101,99,50,32,112,97,114,97,109,101,116,101,114,115,51,59,13,10,125,59,13,10,13,10,117,110,105,102,111,114,109,32,118,101,99,51,32,69,121,101,80,111,115,105,116,105,111,110,59,13,10,117,110,105,102,111,114,109,32,76,105,103,104,116,32,76,105,103,104,116,115,91,49,93,59,13,10,13,10,117,110,105,102,111,114,109,32,115,97,109,112,108,101,114,50,68,32,71,66,117,102,102,101,114,48,59,13,10,117,110,105,102,111,114,109,32,115,97,109,112,108,101,114,50,68,32,71,66,117,102,102,101,114,49,59,13,10,117,110,105,102,111,114,109,32,115,97,109,112,108,101,114,50,68,32,71,66,117,102,102,101,114,50,59,13,10,13,10,117,110,105,102,111,114,109,32,109,97,116,52,32,73,110,118,86,105,101,119,80,114,111,106,77,97,116,114,105,120,59,13,10,117,110,105,102,111,114,109,32,118,101,99,50,32,73,110,118,84,97,114,103,101,116,83,105,122,101,59,13,10,117,110,105,102,111,114,109,32,118,101,99,52,32,83,99,101,110,101,65,109,98,105,101,110,116,59,13,10,13,10,118,111,105,100,32,109,97,105,110,40,41,13,10,123,13,10,9,118,101,99,50,32,116,101,120,67,111,111,114,100,32,61,32,103,108,95,70,114,97,103,67,111,111,114,100,46,120,121,32,42,32,73,110,118,84,97,114,103,101,116,83,105,122,101,59,13,10,9,118,101,99,52,32,103,86,101,99,48,32,61,32,116,101,120,116,117,114,101,76,111,100,40,71,66,117,102,102,101,114,48,44,32,116,101,120,67,111,111,114,100,44,32,48,46,48,41,59,13,10,47,42,9,105,102,32,40,103,86,101,99,48,46,119,32,61,61,32,48,46,48,41,13,10,9,123,13,10,9,9,82,101,110,100,101,114,84,97,114,103,101,116,48,32,61,32,118,101,99,52,40,103,86,101,99,48,46,120,121,122,44,32,49,46,48,41,59,13,10,9,9,114,101,116,117,114,110,59,13,10,9,125,42,47,13,10,13,10,9,118,101,99,52,32,103,86,101,99,49,32,61,32,116,101,120,116,117,114,101,76,111,100,40,71,66,117,102,102,101,114,49,44,32,116,101,120,67,111,111,114,100,44,32,48,46,48,41,59,13,10,9,118,101,99,52,32,103,86,101,99,50,32,61,32,116,101,120,116,117,114,101,76,111,100,40,71,66,117,102,102,101,114,50,44,32,116,101,120,67,111,111,114,100,44,32,48,46,48,41,59,13,10,13,10,9,118,101,99,51,32,100,105,102,102,117,115,101,67,111,108,111,114,32,61,32,103,86,101,99,48,46,120,121,122,59,13,10,9,118,101,99,51,32,110,111,114,109,97,108,32,61,32,103,86,101,99,49,46,120,121,122,42,50,46,48,32,45,32,49,46,48,59,13,10,9,118,101,99,51,32,115,112,101,99,117,108,97,114,67,111,108,111,114,32,61,32,103,86,101,99,50,46,120,121,122,59,13,10,9,102,108,111,97,116,32,100,101,112,116,104,32,61,32,103,86,101,99,49,46,119,42,50,46,48,32,45,32,49,46,48,59,13,10,9,102,108,111,97,116,32,115,104,105,110,105,110,101,115,115,32,61,32,40,103,86,101,99,50,46,119,32,61,61,32,48,46,48,41,32,63,32,48,46,48,32,58,32,101,120,112,50,40,103,86,101,99,50,46,119,42,49,48,46,53,41,59,13,10,13,10,9,118,101,99,51,32,118,105,101,119,83,112,97,99,101,32,61,32,118,101,99,51,40,116,101,120,67,111,111,114,100,42,50,46,48,32,45,32,49,46,48,44,32,100,101,112,116,104,41,59,13,10,13,10,9,118,101,99,52,32,119,111,114,108,100,80,111,115,32,61,32,73,110,118,86,105,101,119,80,114,111,106,77,97,116,114,105,120,32,42,32,118,101,99,52,40,118,105,101,119,83,112,97,99,101,44,32,49,46,48,41,59,13,10,9,119,111,114,108,100,80,111,115,46,120,121,122,32,47,61,32,119,111,114,108,100,80,111,115,46,119,59,13,10,13,10,9,118,101,99,51,32,108,105,103,104,116,68,105,114,32,61,32,76,105,103,104,116,115,91,48,93,46,112,97,114,97,109,101,116,101,114,115,49,46,120,121,122,32,45,32,119,111,114,108,100,80,111,115,46,120,121,122,59,13,10,9,102,108,111,97,116,32,108,105,103,104,116,68,105,114,76,101,110,103,116,104,32,61,32,108,101,110,103,116,104,40,108,105,103,104,116,68,105,114,41,59,13,10,9,108,105,103,104,116,68,105,114,32,47,61,32,108,105,103,104,116,68,105,114,76,101,110,103,116,104,59,13,10,13,10,9,102,108,111,97,116,32,97,116,116,32,61,32,109,97,120,40,76,105,103,104,116,115,91,48,93,46,112,97,114,97,109,101,116,101,114,115,49,46,119,32,45,32,76,105,103,104,116,115,91,48,93,46,112,97,114,97,109,101,116,101,114,115,50,46,119,42,108,105,103,104,116,68,105,114,76,101,110,103,116,104,44,32,48,46,48,41,59,13,10,13,10,9,47,47,32,65,109,98,105,101,110,116,13,10,9,118,101,99,51,32,108,105,103,104,116,65,109,98,105,101,110,116,32,61,32,97,116,116,32,42,32,76,105,103,104,116,115,91,48,93,46,99,111,108,111,114,46,114,103,98,32,42,32,76,105,103,104,116,115,91,48,93,46,102,97,99,116,111,114,115,46,120,32,42,32,40,118,101,99,51,40,49,46,48,41,32,43,32,83,99,101,110,101,65,109,98,105,101,110,116,46,114,103,98,41,59,13,10,13,10,9,47,47,32,77,111,100,105,102,105,99,97,116,105,111,110,32,100,101,32,108,39,97,116,116,195,169,110,117,97,116,105,111,110,32,112,111,117,114,32,103,195,169,114,101,114,32,108,101,32,115,112,111,116,13,10,9,102,108,111,97,116,32,99,117,114,65,110,103,108,101,32,61,32,100,111,116,40,76,105,103,104,116,115,91,48,93,46,112,97,114,97,109,101,116,101,114,115,50,46,120,121,122,44,32,45,108,105,103,104,116,68,105,114,41,59,13,10,9,102,108,111,97,116,32,111,117,116,101,114,65,110,103,108,101,32,61,32,76,105,103,104,116,115,91,48,93,46,112,97,114,97,109,101,116,101,114,115,51,46,121,59,13,10,9,102,108,111,97,116,32,105,110,110,101,114,77,105,110,117,115,79,117,116,101,114,65,110,103,108,101,32,61,32,76,105,103,104,116,115,91,48,93,46,112,97,114,97,109,101,116,101,114,115,51,46,120,32,45,32,111,117,116,101,114,65,110,103,108,101,59,13,10,9,97,116,116,32,42,61,32,109,97,120,40,40,99,117,114,65,110,103,108,101,32,45,32,111,117,116,101,114,65,110,103,108,101,41,32,47,32,105,110,110,101,114,77,105,110,117,115,79,117,116,101,114,65,110,103,108,101,44,32,48,46,48,41,59,13,10,13,10,9,47,47,32,68,105,102,102,117,115,101,13,10,9,102,108,111,97,116,32,108,97,109,98,101,114,116,32,61,32,109,97,120,40,100,111,116,40,110,111,114,109,97,108,44,32,108,105,103,104,116,68,105,114,41,44,32,48,46,48,41,59,13,10,13,10,9,118,101,99,51,32,108,105,103,104,116,68,105,102,102,117,115,101,32,61,32,97,116,116,32,42,32,108,97,109,98,101,114,116,32,42,32,76,105,103,104,116,115,91,48,93,46,99,111,108,111,114,46,114,103,98,32,42,32,76,105,103,104,116,115,91,48,93,46,102,97,99,116,111,114,115,46,121,59,13,10,13,10,9,47,47,32,83,112,101,99,117,108,97,114,13,10,9,118,101,99,51,32,108,105,103,104,116,83,112,101,99,117,108,97,114,32,61,32,118,101,99,51,40,48,46,48,41,59,13,10,9,105,102,32,40,115,104,105,110,105,110,101,115,115,32,62,32,48,46,48,41,13,10,9,123,13,10,9,9,118,101,99,51,32,101,121,101,86,101,99,32,61,32,110,111,114,109,97,108,105,122,101,40,69,121,101,80,111,115,105,116,105,111,110,32,45,32,119,111,114,108,100,80,111,115,46,120,121,122,41,59,13,10,9,9,118,101,99,51,32,114,101,102,108,101,99,116,105,111,110,32,61,32,114,101,102,108,101,99,116,40,45,108,105,103,104,116,68,105,114,44,32,110,111,114,109,97,108,41,59,13,10,9,9,102,108,111,97,116,32,115,112,101,99,117,108,97,114,70,97,99,116,111,114,32,61,32,109,97,120,40,100,111,116,40,114,101,102,108,101,99,116,105,111,110,44,32,101,121,101,86,101,99,41,44,32,48,46,48,41,59,13,10,9,9,115,112,101,99,117,108,97,114,70,97,99,116,111,114,32,61,32,112,111,119,40,115,112,101,99,117,108,97,114,70,97,99,116,111,114,44,32,115,104,105,110,105,110,101,115,115,41,59,13,10,13,10,9,9,108,105,103,104,116,83,112,101,99,117,108,97,114,32,61,32,97,116,116,32,42,32,115,112,101,99,117,108,97,114,70,97,99,116,111,114,32,42,32,76,105,103,104,116,115,91,48,93,46,99,111,108,111,114,46,114,103,98,59,13,10,9,125,13,10,13,10,9,108,105,103,104,116,83,112,101,99,117,108,97,114,32,42,61,32,115,112,101,99,117,108,97,114,67,111,108,111,114,59,13,10,13,10,9,118,101,99,51,32,102,114,97,103,109,101,110,116,67,111,108,111,114,32,61,32,100,105,102,102,117,115,101,67,111,108,111,114,32,42,32,40,108,105,103,104,116,65,109,98,105,101,110,116,32,43,32,108,105,103,104,116,68,105,102,102,117,115,101,32,43,32,108,105,103,104,116,83,112,101,99,117,108,97,114,41,59,13,10,9,82,101,110,100,101,114,84,97,114,103,101,116,48,32,61,32,118,101,99,52,40,102,114,97,103,109,101,110,116,67,111,108,111,114,44,32,49,46,48,41,59,13,10,125, \ No newline at end of file