Added lens dirt, posterization and pixelization postfx

This commit is contained in:
antopilo
2024-12-01 02:07:55 -05:00
parent b33bfcab57
commit f1b4aaad76
11 changed files with 641 additions and 269 deletions

View File

@@ -12,6 +12,17 @@ namespace Nuake
m_Iteration = iteration;
}
void Bloom::SetLensDirt(Ref<Texture> texture)
{
m_LensDirt = texture;
m_HasLensDirt = true;
}
void Bloom::ClearLensDirt()
{
m_HasLensDirt = false;
}
void Bloom::SetSource(Ref<Texture> source)
{
if (m_Source == source)
@@ -164,8 +175,17 @@ namespace Nuake
shader->SetUniform("u_Stage", 5);
shader->SetUniform("u_Source", 1);
shader->SetUniform("u_Source2", 2);
shader->SetUniform("u_HasLensDirt", m_HasLensDirt);
shader->SetUniform("u_LensDirt", 3);
if (m_LensDirt)
{
m_LensDirt->Bind(3);
shader->SetUniform("u_LensDirtIntensity", m_LensDirtIntensity);
}
m_UpSampleFB[m_Iteration - 1]->GetTexture()->Bind(1);
m_Source->Bind(2);
Renderer::DrawQuad(Matrix4());
}

View File

@@ -20,10 +20,15 @@ namespace Nuake {
private:
float m_Threshold = 2.3f;
float m_BlurAmount = 12.0f;
float m_LensDirtIntensity = 1.0f;
uint32_t m_Iteration = 4;
Vector2 m_Size = Vector2();
Ref<Texture> m_Source;
bool m_HasLensDirt = false;
Ref<Texture> m_LensDirt;
Ref<FrameBuffer> m_FinalFB;
Ref<FrameBuffer> m_ThresholdFB;
std::vector<Ref<FrameBuffer>> m_DownSampleFB;
@@ -34,6 +39,13 @@ namespace Nuake {
Bloom() {}
Bloom(unsigned int iteration = 4);
Ref<Texture> GetLensDirt() { return m_LensDirt; }
void SetLensDirt(Ref<Texture> texture);
void ClearLensDirt();
float GetLensDirtIntensity() const { return m_LensDirtIntensity; }
void SetLensDirtIntensity(float intensity) { m_LensDirtIntensity = intensity; }
void Init();
void Draw();

View File

@@ -46,6 +46,11 @@ namespace Nuake
};
}();
SceneRenderer::SceneRenderer()
{
Init();
}
void SceneRenderer::Init()
{
const auto defaultResolution = Vector2(1920, 1080);
@@ -232,7 +237,7 @@ namespace Nuake
}
}
if(renderUI)
if (renderUI)
{
mTempFrameBuffer->QueueResize(framebuffer.GetSize());
}
@@ -524,13 +529,26 @@ namespace Nuake
}
mVignetteBuffer->Unbind();
framebuffer.Bind();
{
RenderCommand::Clear();
Shader* shader = ShaderManager::GetShader("Resources/Shaders/copy.shader");
shader->Bind();
shader->SetUniform("u_Source", mVignetteBuffer->GetTexture().get(), 0);
if (sceneEnv->PosterizationEnabled)
{
Shader* shader = ShaderManager::GetShader("Resources/Shaders/posterization.shader");
shader->Bind();
shader->SetUniform("u_Source", mVignetteBuffer->GetTexture().get(), 0);
shader->SetUniform("u_Levels", sceneEnv->PosterizationLevels);
}
else
{
Shader* shader = ShaderManager::GetShader("Resources/Shaders/copy.shader");
shader->Bind();
shader->SetUniform("u_Source", mVignetteBuffer->GetTexture().get(), 0);
}
Renderer::DrawQuad();
}
framebuffer.Unbind();
@@ -546,6 +564,33 @@ namespace Nuake
}
mTempFrameBuffer->Unbind();
if (sceneEnv->PixelizationEnabled)
{
framebuffer.Bind();
{
RenderCommand::Clear();
Shader* shader = ShaderManager::GetShader("Resources/Shaders/pixelization.shader");
shader->Bind();
shader->SetUniform("u_Source", mTempFrameBuffer->GetTexture().get(), 0);
shader->SetUniform("u_SourceSize", framebufferResolution);
shader->SetUniform("u_PixelSize", sceneEnv->PixelSize);
Renderer::DrawQuad();
}
framebuffer.Unbind();
mTempFrameBuffer->Bind();
{
RenderCommand::Clear();
Shader* shader = ShaderManager::GetShader("Resources/Shaders/copy.shader");
shader->Bind();
shader->SetUniform("u_Source", framebuffer.GetTexture().get(), 0);
Renderer::DrawQuad();
}
mTempFrameBuffer->Unbind();
}
//ImGui::Begin("SDF Params");
//{
// static auto renderer = NuakeUI::Renderer::Get();

View File

@@ -48,6 +48,8 @@ namespace Nuake
};
public:
SceneRenderer();
void Init();
void Cleanup();

View File

@@ -48,6 +48,8 @@ namespace Nuake
LoadEmbeddedShader(Resources_Shaders_ui_panel_shader);
LoadEmbeddedShader(Resources_Shaders_ui_text_shader);
LoadEmbeddedShader(Resources_Shaders_displayVelocity_shader);
LoadEmbeddedShader(Resources_Shaders_posterization_shader);
LoadEmbeddedShader(Resources_Shaders_pixelization_shader);
}
Shader* ShaderManager::GetShader(const std::string& path)

View File

@@ -268054,300 +268054,327 @@ namespace Nuake {
0x72, 0x63, 0x65, 0x32, 0x3B, 0x0D, 0x0A, 0x75, 0x6E, 0x69, 0x66, 0x6F,
0x72, 0x6D, 0x20, 0x76, 0x65, 0x63, 0x32, 0x20, 0x75, 0x5F, 0x53, 0x6F,
0x75, 0x72, 0x63, 0x65, 0x32, 0x53, 0x69, 0x7A, 0x65, 0x3B, 0x0D, 0x0A,
0x0D, 0x0A, 0x75, 0x6E, 0x69, 0x66, 0x6F, 0x72, 0x6D, 0x20, 0x66, 0x6C,
0x6F, 0x61, 0x74, 0x20, 0x75, 0x5F, 0x54, 0x68, 0x72, 0x65, 0x73, 0x68,
0x6F, 0x6C, 0x64, 0x3B, 0x0D, 0x0A, 0x75, 0x6E, 0x69, 0x66, 0x6F, 0x72,
0x6D, 0x20, 0x66, 0x6C, 0x6F, 0x61, 0x74, 0x20, 0x75, 0x5F, 0x42, 0x6C,
0x75, 0x72, 0x41, 0x6D, 0x6F, 0x75, 0x6E, 0x74, 0x3B, 0x0D, 0x0A, 0x75,
0x6E, 0x69, 0x66, 0x6F, 0x72, 0x6D, 0x20, 0x76, 0x65, 0x63, 0x32, 0x20,
0x75, 0x5F, 0x42, 0x6C, 0x75, 0x72, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74,
0x69, 0x6F, 0x6E, 0x3B, 0x0D, 0x0A, 0x0D, 0x0A, 0x69, 0x6E, 0x20, 0x76,
0x65, 0x63, 0x32, 0x20, 0x55, 0x56, 0x3B, 0x0D, 0x0A, 0x0D, 0x0A, 0x6F,
0x75, 0x74, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x46, 0x72, 0x61, 0x67,
0x43, 0x6F, 0x6C, 0x6F, 0x72, 0x3B, 0x0D, 0x0A, 0x0D, 0x0A, 0x76, 0x65,
0x63, 0x34, 0x20, 0x54, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6F, 0x6C, 0x64,
0x28, 0x76, 0x65, 0x63, 0x34, 0x20, 0x63, 0x6F, 0x6C, 0x6F, 0x72, 0x2C,
0x20, 0x76, 0x65, 0x63, 0x32, 0x20, 0x75, 0x76, 0x29, 0x0D, 0x0A, 0x7B,
0x75, 0x6E, 0x69, 0x66, 0x6F, 0x72, 0x6D, 0x20, 0x69, 0x6E, 0x74, 0x20,
0x75, 0x5F, 0x48, 0x61, 0x73, 0x4C, 0x65, 0x6E, 0x73, 0x44, 0x69, 0x72,
0x74, 0x3B, 0x0D, 0x0A, 0x75, 0x6E, 0x69, 0x66, 0x6F, 0x72, 0x6D, 0x20,
0x73, 0x61, 0x6D, 0x70, 0x6C, 0x65, 0x72, 0x32, 0x44, 0x20, 0x75, 0x5F,
0x4C, 0x65, 0x6E, 0x73, 0x44, 0x69, 0x72, 0x74, 0x3B, 0x0D, 0x0A, 0x75,
0x6E, 0x69, 0x66, 0x6F, 0x72, 0x6D, 0x20, 0x66, 0x6C, 0x6F, 0x61, 0x74,
0x20, 0x75, 0x5F, 0x4C, 0x65, 0x6E, 0x73, 0x44, 0x69, 0x72, 0x74, 0x49,
0x6E, 0x74, 0x65, 0x6E, 0x73, 0x69, 0x74, 0x79, 0x3B, 0x0D, 0x0A, 0x0D,
0x0A, 0x75, 0x6E, 0x69, 0x66, 0x6F, 0x72, 0x6D, 0x20, 0x66, 0x6C, 0x6F,
0x61, 0x74, 0x20, 0x75, 0x5F, 0x54, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6F,
0x6C, 0x64, 0x3B, 0x0D, 0x0A, 0x75, 0x6E, 0x69, 0x66, 0x6F, 0x72, 0x6D,
0x20, 0x66, 0x6C, 0x6F, 0x61, 0x74, 0x20, 0x75, 0x5F, 0x42, 0x6C, 0x75,
0x72, 0x41, 0x6D, 0x6F, 0x75, 0x6E, 0x74, 0x3B, 0x0D, 0x0A, 0x75, 0x6E,
0x69, 0x66, 0x6F, 0x72, 0x6D, 0x20, 0x76, 0x65, 0x63, 0x32, 0x20, 0x75,
0x5F, 0x42, 0x6C, 0x75, 0x72, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69,
0x6F, 0x6E, 0x3B, 0x0D, 0x0A, 0x0D, 0x0A, 0x69, 0x6E, 0x20, 0x76, 0x65,
0x63, 0x32, 0x20, 0x55, 0x56, 0x3B, 0x0D, 0x0A, 0x0D, 0x0A, 0x6F, 0x75,
0x74, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x46, 0x72, 0x61, 0x67, 0x43,
0x6F, 0x6C, 0x6F, 0x72, 0x3B, 0x0D, 0x0A, 0x0D, 0x0A, 0x76, 0x65, 0x63,
0x34, 0x20, 0x54, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6F, 0x6C, 0x64, 0x28,
0x76, 0x65, 0x63, 0x34, 0x20, 0x63, 0x6F, 0x6C, 0x6F, 0x72, 0x2C, 0x20,
0x76, 0x65, 0x63, 0x32, 0x20, 0x75, 0x76, 0x29, 0x0D, 0x0A, 0x7B, 0x0D,
0x0A, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6C, 0x6F, 0x61, 0x74, 0x20, 0x62,
0x72, 0x69, 0x67, 0x68, 0x74, 0x6E, 0x65, 0x73, 0x73, 0x20, 0x3D, 0x20,
0x6D, 0x61, 0x78, 0x28, 0x63, 0x6F, 0x6C, 0x6F, 0x72, 0x2E, 0x72, 0x2C,
0x20, 0x6D, 0x61, 0x78, 0x28, 0x63, 0x6F, 0x6C, 0x6F, 0x72, 0x2E, 0x67,
0x2C, 0x20, 0x63, 0x6F, 0x6C, 0x6F, 0x72, 0x2E, 0x62, 0x29, 0x29, 0x3B,
0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6C, 0x6F, 0x61, 0x74, 0x20,
0x62, 0x72, 0x69, 0x67, 0x68, 0x74, 0x6E, 0x65, 0x73, 0x73, 0x20, 0x3D,
0x20, 0x6D, 0x61, 0x78, 0x28, 0x63, 0x6F, 0x6C, 0x6F, 0x72, 0x2E, 0x72,
0x2C, 0x20, 0x6D, 0x61, 0x78, 0x28, 0x63, 0x6F, 0x6C, 0x6F, 0x72, 0x2E,
0x67, 0x2C, 0x20, 0x63, 0x6F, 0x6C, 0x6F, 0x72, 0x2E, 0x62, 0x29, 0x29,
0x3B, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6C, 0x6F, 0x61, 0x74,
0x20, 0x63, 0x6F, 0x6E, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x69, 0x6F,
0x6E, 0x20, 0x3D, 0x20, 0x6D, 0x61, 0x78, 0x28, 0x30, 0x2C, 0x20, 0x62,
0x72, 0x69, 0x67, 0x68, 0x74, 0x6E, 0x65, 0x73, 0x73, 0x20, 0x2D, 0x20,
0x75, 0x5F, 0x54, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6F, 0x6C, 0x64, 0x29,
0x3B, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6F, 0x6E, 0x74, 0x72,
0x69, 0x62, 0x75, 0x74, 0x69, 0x6F, 0x6E, 0x20, 0x2F, 0x3D, 0x20, 0x6D,
0x61, 0x78, 0x28, 0x62, 0x72, 0x69, 0x67, 0x68, 0x74, 0x6E, 0x65, 0x73,
0x73, 0x2C, 0x20, 0x30, 0x2E, 0x30, 0x30, 0x30, 0x30, 0x31, 0x29, 0x3B,
0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6E,
0x20, 0x63, 0x6F, 0x6C, 0x6F, 0x72, 0x20, 0x2A, 0x20, 0x63, 0x6F, 0x6E,
0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x69, 0x6F, 0x6E, 0x3B, 0x0D, 0x0A,
0x7D, 0x0D, 0x0A, 0x0D, 0x0A, 0x76, 0x65, 0x63, 0x34, 0x20, 0x44, 0x6F,
0x77, 0x6E, 0x73, 0x61, 0x6D, 0x70, 0x6C, 0x65, 0x42, 0x6F, 0x78, 0x31,
0x33, 0x54, 0x61, 0x70, 0x28, 0x76, 0x65, 0x63, 0x32, 0x20, 0x75, 0x76,
0x29, 0x0D, 0x0A, 0x7B, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x76, 0x65,
0x63, 0x32, 0x20, 0x74, 0x65, 0x78, 0x65, 0x6C, 0x53, 0x69, 0x7A, 0x65,
0x20, 0x3D, 0x20, 0x31, 0x2E, 0x30, 0x20, 0x2F, 0x20, 0x75, 0x5F, 0x53,
0x6F, 0x75, 0x72, 0x63, 0x65, 0x53, 0x69, 0x7A, 0x65, 0x3B, 0x0D, 0x0A,
0x20, 0x20, 0x20, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x41, 0x20, 0x3D,
0x20, 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x28, 0x75, 0x5F, 0x53,
0x6F, 0x75, 0x72, 0x63, 0x65, 0x2C, 0x20, 0x75, 0x76, 0x20, 0x2B, 0x20,
0x74, 0x65, 0x78, 0x65, 0x6C, 0x53, 0x69, 0x7A, 0x65, 0x20, 0x2A, 0x20,
0x76, 0x65, 0x63, 0x32, 0x28, 0x2D, 0x31, 0x2E, 0x30, 0x2C, 0x20, 0x2D,
0x31, 0x2E, 0x30, 0x29, 0x29, 0x3B, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20,
0x76, 0x65, 0x63, 0x34, 0x20, 0x42, 0x20, 0x3D, 0x20, 0x74, 0x65, 0x78,
0x74, 0x75, 0x72, 0x65, 0x28, 0x75, 0x5F, 0x53, 0x6F, 0x75, 0x72, 0x63,
0x65, 0x2C, 0x20, 0x75, 0x76, 0x20, 0x2B, 0x20, 0x74, 0x65, 0x78, 0x65,
0x6C, 0x53, 0x69, 0x7A, 0x65, 0x20, 0x2A, 0x20, 0x76, 0x65, 0x63, 0x32,
0x28, 0x30, 0x2E, 0x30, 0x2C, 0x20, 0x2D, 0x31, 0x2E, 0x30, 0x29, 0x29,
0x3B, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20,
0x43, 0x20, 0x3D, 0x20, 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x28,
0x75, 0x5F, 0x53, 0x6F, 0x75, 0x72, 0x63, 0x65, 0x2C, 0x20, 0x75, 0x76,
0x20, 0x2B, 0x20, 0x74, 0x65, 0x78, 0x65, 0x6C, 0x53, 0x69, 0x7A, 0x65,
0x20, 0x2A, 0x20, 0x76, 0x65, 0x63, 0x32, 0x28, 0x31, 0x2E, 0x30, 0x2C,
0x20, 0x2D, 0x31, 0x2E, 0x30, 0x29, 0x29, 0x3B, 0x0D, 0x0A, 0x20, 0x20,
0x20, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x44, 0x20, 0x3D, 0x20, 0x74,
0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x28, 0x75, 0x5F, 0x53, 0x6F, 0x75,
0x72, 0x63, 0x65, 0x2C, 0x20, 0x75, 0x76, 0x20, 0x2B, 0x20, 0x74, 0x65,
0x78, 0x65, 0x6C, 0x53, 0x69, 0x7A, 0x65, 0x20, 0x2A, 0x20, 0x76, 0x65,
0x63, 0x32, 0x28, 0x2D, 0x30, 0x2E, 0x35, 0x2C, 0x20, 0x2D, 0x30, 0x2E,
0x35, 0x29, 0x29, 0x3B, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x76, 0x65,
0x63, 0x34, 0x20, 0x45, 0x20, 0x3D, 0x20, 0x74, 0x65, 0x78, 0x74, 0x75,
0x72, 0x65, 0x28, 0x75, 0x5F, 0x53, 0x6F, 0x75, 0x72, 0x63, 0x65, 0x2C,
0x20, 0x75, 0x76, 0x20, 0x2B, 0x20, 0x74, 0x65, 0x78, 0x65, 0x6C, 0x53,
0x69, 0x7A, 0x65, 0x20, 0x2A, 0x20, 0x76, 0x65, 0x63, 0x32, 0x28, 0x30,
0x2E, 0x35, 0x2C, 0x20, 0x2D, 0x30, 0x2E, 0x35, 0x29, 0x29, 0x3B, 0x0D,
0x0A, 0x20, 0x20, 0x20, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x46, 0x20,
0x3D, 0x20, 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x28, 0x75, 0x5F,
0x53, 0x6F, 0x75, 0x72, 0x63, 0x65, 0x2C, 0x20, 0x75, 0x76, 0x20, 0x2B,
0x20, 0x74, 0x65, 0x78, 0x65, 0x6C, 0x53, 0x69, 0x7A, 0x65, 0x20, 0x2A,
0x20, 0x76, 0x65, 0x63, 0x32, 0x28, 0x2D, 0x31, 0x2E, 0x30, 0x2C, 0x20,
0x30, 0x2E, 0x30, 0x29, 0x29, 0x3B, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20,
0x76, 0x65, 0x63, 0x34, 0x20, 0x47, 0x20, 0x3D, 0x20, 0x74, 0x65, 0x78,
0x74, 0x75, 0x72, 0x65, 0x28, 0x75, 0x5F, 0x53, 0x6F, 0x75, 0x72, 0x63,
0x65, 0x2C, 0x20, 0x75, 0x76, 0x29, 0x3B, 0x0D, 0x0A, 0x20, 0x20, 0x20,
0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x48, 0x20, 0x3D, 0x20, 0x74, 0x65,
0x78, 0x74, 0x75, 0x72, 0x65, 0x28, 0x75, 0x5F, 0x53, 0x6F, 0x75, 0x72,
0x63, 0x65, 0x2C, 0x20, 0x75, 0x76, 0x20, 0x2B, 0x20, 0x74, 0x65, 0x78,
0x65, 0x6C, 0x53, 0x69, 0x7A, 0x65, 0x20, 0x2A, 0x20, 0x76, 0x65, 0x63,
0x32, 0x28, 0x31, 0x2E, 0x30, 0x2C, 0x20, 0x30, 0x2E, 0x30, 0x29, 0x29,
0x3B, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20,
0x49, 0x20, 0x3D, 0x20, 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x28,
0x75, 0x5F, 0x53, 0x6F, 0x75, 0x72, 0x63, 0x65, 0x2C, 0x20, 0x75, 0x76,
0x20, 0x2B, 0x20, 0x74, 0x65, 0x78, 0x65, 0x6C, 0x53, 0x69, 0x7A, 0x65,
0x20, 0x2A, 0x20, 0x76, 0x65, 0x63, 0x32, 0x28, 0x2D, 0x30, 0x2E, 0x35,
0x2C, 0x20, 0x30, 0x2E, 0x35, 0x29, 0x29, 0x3B, 0x0D, 0x0A, 0x20, 0x20,
0x20, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x4A, 0x20, 0x3D, 0x20, 0x74,
0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x28, 0x75, 0x5F, 0x53, 0x6F, 0x75,
0x72, 0x63, 0x65, 0x2C, 0x20, 0x75, 0x76, 0x20, 0x2B, 0x20, 0x74, 0x65,
0x78, 0x65, 0x6C, 0x53, 0x69, 0x7A, 0x65, 0x20, 0x2A, 0x20, 0x76, 0x65,
0x63, 0x32, 0x28, 0x30, 0x2E, 0x35, 0x2C, 0x20, 0x30, 0x2E, 0x35, 0x29,
0x29, 0x3B, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x76, 0x65, 0x63, 0x34,
0x20, 0x4B, 0x20, 0x3D, 0x20, 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65,
0x28, 0x75, 0x5F, 0x53, 0x6F, 0x75, 0x72, 0x63, 0x65, 0x2C, 0x20, 0x75,
0x76, 0x20, 0x2B, 0x20, 0x74, 0x65, 0x78, 0x65, 0x6C, 0x53, 0x69, 0x7A,
0x65, 0x20, 0x2A, 0x20, 0x76, 0x65, 0x63, 0x32, 0x28, 0x2D, 0x31, 0x2E,
0x30, 0x2C, 0x20, 0x31, 0x2E, 0x30, 0x29, 0x29, 0x3B, 0x0D, 0x0A, 0x20,
0x20, 0x20, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x4C, 0x20, 0x3D, 0x20,
0x63, 0x6F, 0x6E, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x69, 0x6F, 0x6E,
0x20, 0x3D, 0x20, 0x6D, 0x61, 0x78, 0x28, 0x30, 0x2C, 0x20, 0x62, 0x72,
0x69, 0x67, 0x68, 0x74, 0x6E, 0x65, 0x73, 0x73, 0x20, 0x2D, 0x20, 0x75,
0x5F, 0x54, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6F, 0x6C, 0x64, 0x29, 0x3B,
0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6F, 0x6E, 0x74, 0x72, 0x69,
0x62, 0x75, 0x74, 0x69, 0x6F, 0x6E, 0x20, 0x2F, 0x3D, 0x20, 0x6D, 0x61,
0x78, 0x28, 0x62, 0x72, 0x69, 0x67, 0x68, 0x74, 0x6E, 0x65, 0x73, 0x73,
0x2C, 0x20, 0x30, 0x2E, 0x30, 0x30, 0x30, 0x30, 0x31, 0x29, 0x3B, 0x0D,
0x0A, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6E, 0x20,
0x63, 0x6F, 0x6C, 0x6F, 0x72, 0x20, 0x2A, 0x20, 0x63, 0x6F, 0x6E, 0x74,
0x72, 0x69, 0x62, 0x75, 0x74, 0x69, 0x6F, 0x6E, 0x3B, 0x0D, 0x0A, 0x7D,
0x0D, 0x0A, 0x0D, 0x0A, 0x76, 0x65, 0x63, 0x34, 0x20, 0x44, 0x6F, 0x77,
0x6E, 0x73, 0x61, 0x6D, 0x70, 0x6C, 0x65, 0x42, 0x6F, 0x78, 0x31, 0x33,
0x54, 0x61, 0x70, 0x28, 0x76, 0x65, 0x63, 0x32, 0x20, 0x75, 0x76, 0x29,
0x0D, 0x0A, 0x7B, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x76, 0x65, 0x63,
0x32, 0x20, 0x74, 0x65, 0x78, 0x65, 0x6C, 0x53, 0x69, 0x7A, 0x65, 0x20,
0x3D, 0x20, 0x31, 0x2E, 0x30, 0x20, 0x2F, 0x20, 0x75, 0x5F, 0x53, 0x6F,
0x75, 0x72, 0x63, 0x65, 0x53, 0x69, 0x7A, 0x65, 0x3B, 0x0D, 0x0A, 0x20,
0x20, 0x20, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x41, 0x20, 0x3D, 0x20,
0x74, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x28, 0x75, 0x5F, 0x53, 0x6F,
0x75, 0x72, 0x63, 0x65, 0x2C, 0x20, 0x75, 0x76, 0x20, 0x2B, 0x20, 0x74,
0x65, 0x78, 0x65, 0x6C, 0x53, 0x69, 0x7A, 0x65, 0x20, 0x2A, 0x20, 0x76,
0x65, 0x63, 0x32, 0x28, 0x30, 0x2E, 0x30, 0x2C, 0x20, 0x31, 0x2E, 0x30,
0x65, 0x63, 0x32, 0x28, 0x2D, 0x31, 0x2E, 0x30, 0x2C, 0x20, 0x2D, 0x31,
0x2E, 0x30, 0x29, 0x29, 0x3B, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x76,
0x65, 0x63, 0x34, 0x20, 0x42, 0x20, 0x3D, 0x20, 0x74, 0x65, 0x78, 0x74,
0x75, 0x72, 0x65, 0x28, 0x75, 0x5F, 0x53, 0x6F, 0x75, 0x72, 0x63, 0x65,
0x2C, 0x20, 0x75, 0x76, 0x20, 0x2B, 0x20, 0x74, 0x65, 0x78, 0x65, 0x6C,
0x53, 0x69, 0x7A, 0x65, 0x20, 0x2A, 0x20, 0x76, 0x65, 0x63, 0x32, 0x28,
0x30, 0x2E, 0x30, 0x2C, 0x20, 0x2D, 0x31, 0x2E, 0x30, 0x29, 0x29, 0x3B,
0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x43,
0x20, 0x3D, 0x20, 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x28, 0x75,
0x5F, 0x53, 0x6F, 0x75, 0x72, 0x63, 0x65, 0x2C, 0x20, 0x75, 0x76, 0x20,
0x2B, 0x20, 0x74, 0x65, 0x78, 0x65, 0x6C, 0x53, 0x69, 0x7A, 0x65, 0x20,
0x2A, 0x20, 0x76, 0x65, 0x63, 0x32, 0x28, 0x31, 0x2E, 0x30, 0x2C, 0x20,
0x2D, 0x31, 0x2E, 0x30, 0x29, 0x29, 0x3B, 0x0D, 0x0A, 0x20, 0x20, 0x20,
0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x44, 0x20, 0x3D, 0x20, 0x74, 0x65,
0x78, 0x74, 0x75, 0x72, 0x65, 0x28, 0x75, 0x5F, 0x53, 0x6F, 0x75, 0x72,
0x63, 0x65, 0x2C, 0x20, 0x75, 0x76, 0x20, 0x2B, 0x20, 0x74, 0x65, 0x78,
0x65, 0x6C, 0x53, 0x69, 0x7A, 0x65, 0x20, 0x2A, 0x20, 0x76, 0x65, 0x63,
0x32, 0x28, 0x2D, 0x30, 0x2E, 0x35, 0x2C, 0x20, 0x2D, 0x30, 0x2E, 0x35,
0x29, 0x29, 0x3B, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x76, 0x65, 0x63,
0x34, 0x20, 0x4D, 0x20, 0x3D, 0x20, 0x74, 0x65, 0x78, 0x74, 0x75, 0x72,
0x34, 0x20, 0x45, 0x20, 0x3D, 0x20, 0x74, 0x65, 0x78, 0x74, 0x75, 0x72,
0x65, 0x28, 0x75, 0x5F, 0x53, 0x6F, 0x75, 0x72, 0x63, 0x65, 0x2C, 0x20,
0x75, 0x76, 0x20, 0x2B, 0x20, 0x74, 0x65, 0x78, 0x65, 0x6C, 0x53, 0x69,
0x7A, 0x65, 0x20, 0x2A, 0x20, 0x76, 0x65, 0x63, 0x32, 0x28, 0x31, 0x2E,
0x30, 0x2C, 0x20, 0x31, 0x2E, 0x30, 0x29, 0x29, 0x3B, 0x0D, 0x0A, 0x0D,
0x0A, 0x20, 0x20, 0x20, 0x20, 0x76, 0x65, 0x63, 0x32, 0x20, 0x64, 0x69,
0x76, 0x20, 0x3D, 0x20, 0x28, 0x31, 0x2E, 0x30, 0x20, 0x2F, 0x20, 0x34,
0x2E, 0x30, 0x29, 0x20, 0x2A, 0x20, 0x76, 0x65, 0x63, 0x32, 0x28, 0x30,
0x2E, 0x35, 0x2C, 0x20, 0x30, 0x2E, 0x31, 0x32, 0x35, 0x29, 0x3B, 0x0D,
0x0A, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20,
0x6F, 0x20, 0x3D, 0x20, 0x28, 0x44, 0x20, 0x2B, 0x20, 0x45, 0x20, 0x2B,
0x20, 0x49, 0x20, 0x2B, 0x20, 0x4A, 0x29, 0x20, 0x2A, 0x20, 0x64, 0x69,
0x76, 0x2E, 0x78, 0x3B, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x6F, 0x20,
0x2B, 0x3D, 0x20, 0x28, 0x41, 0x20, 0x2B, 0x20, 0x42, 0x20, 0x2B, 0x20,
0x47, 0x20, 0x2B, 0x20, 0x46, 0x29, 0x20, 0x2A, 0x20, 0x64, 0x69, 0x76,
0x2E, 0x79, 0x3B, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x6F, 0x20, 0x2B,
0x3D, 0x20, 0x28, 0x42, 0x20, 0x2B, 0x20, 0x43, 0x20, 0x2B, 0x20, 0x48,
0x20, 0x2B, 0x20, 0x47, 0x29, 0x20, 0x2A, 0x20, 0x64, 0x69, 0x76, 0x2E,
0x79, 0x3B, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x6F, 0x20, 0x2B, 0x3D,
0x20, 0x28, 0x46, 0x20, 0x2B, 0x20, 0x47, 0x20, 0x2B, 0x20, 0x4C, 0x20,
0x2B, 0x20, 0x4B, 0x29, 0x20, 0x2A, 0x20, 0x64, 0x69, 0x76, 0x2E, 0x79,
0x3B, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x6F, 0x20, 0x2B, 0x3D, 0x20,
0x28, 0x47, 0x20, 0x2B, 0x20, 0x48, 0x20, 0x2B, 0x20, 0x4D, 0x20, 0x2B,
0x20, 0x4C, 0x29, 0x20, 0x2A, 0x20, 0x64, 0x69, 0x76, 0x2E, 0x79, 0x3B,
0x0D, 0x0A, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75,
0x72, 0x6E, 0x20, 0x6F, 0x3B, 0x0D, 0x0A, 0x7D, 0x0D, 0x0A, 0x0D, 0x0A,
0x76, 0x65, 0x63, 0x34, 0x20, 0x55, 0x70, 0x73, 0x61, 0x6D, 0x70, 0x6C,
0x65, 0x28, 0x76, 0x65, 0x63, 0x32, 0x20, 0x75, 0x76, 0x29, 0x0D, 0x0A,
0x7B, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20,
0x64, 0x20, 0x3D, 0x20, 0x28, 0x31, 0x2E, 0x30, 0x20, 0x2F, 0x20, 0x75,
0x5F, 0x53, 0x6F, 0x75, 0x72, 0x63, 0x65, 0x32, 0x53, 0x69, 0x7A, 0x65,
0x2E, 0x78, 0x79, 0x78, 0x79, 0x29, 0x20, 0x2A, 0x20, 0x76, 0x65, 0x63,
0x34, 0x28, 0x31, 0x2E, 0x30, 0x2C, 0x20, 0x31, 0x2E, 0x30, 0x2C, 0x20,
0x2D, 0x31, 0x2E, 0x30, 0x2C, 0x20, 0x30, 0x2E, 0x30, 0x29, 0x20, 0x3B,
0x0D, 0x0A, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x76, 0x65, 0x63, 0x34,
0x20, 0x73, 0x3B, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x73, 0x20, 0x3D,
0x7A, 0x65, 0x20, 0x2A, 0x20, 0x76, 0x65, 0x63, 0x32, 0x28, 0x30, 0x2E,
0x35, 0x2C, 0x20, 0x2D, 0x30, 0x2E, 0x35, 0x29, 0x29, 0x3B, 0x0D, 0x0A,
0x20, 0x20, 0x20, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x46, 0x20, 0x3D,
0x20, 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x28, 0x75, 0x5F, 0x53,
0x6F, 0x75, 0x72, 0x63, 0x65, 0x32, 0x2C, 0x20, 0x75, 0x76, 0x20, 0x2D,
0x20, 0x64, 0x2E, 0x78, 0x79, 0x29, 0x3B, 0x0D, 0x0A, 0x20, 0x20, 0x20,
0x20, 0x73, 0x20, 0x2B, 0x3D, 0x20, 0x74, 0x65, 0x78, 0x74, 0x75, 0x72,
0x65, 0x28, 0x75, 0x5F, 0x53, 0x6F, 0x75, 0x72, 0x63, 0x65, 0x32, 0x2C,
0x20, 0x75, 0x76, 0x20, 0x2D, 0x20, 0x64, 0x2E, 0x77, 0x79, 0x29, 0x20,
0x2A, 0x20, 0x32, 0x2E, 0x30, 0x3B, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20,
0x6F, 0x75, 0x72, 0x63, 0x65, 0x2C, 0x20, 0x75, 0x76, 0x20, 0x2B, 0x20,
0x74, 0x65, 0x78, 0x65, 0x6C, 0x53, 0x69, 0x7A, 0x65, 0x20, 0x2A, 0x20,
0x76, 0x65, 0x63, 0x32, 0x28, 0x2D, 0x31, 0x2E, 0x30, 0x2C, 0x20, 0x30,
0x2E, 0x30, 0x29, 0x29, 0x3B, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x76,
0x65, 0x63, 0x34, 0x20, 0x47, 0x20, 0x3D, 0x20, 0x74, 0x65, 0x78, 0x74,
0x75, 0x72, 0x65, 0x28, 0x75, 0x5F, 0x53, 0x6F, 0x75, 0x72, 0x63, 0x65,
0x2C, 0x20, 0x75, 0x76, 0x29, 0x3B, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20,
0x76, 0x65, 0x63, 0x34, 0x20, 0x48, 0x20, 0x3D, 0x20, 0x74, 0x65, 0x78,
0x74, 0x75, 0x72, 0x65, 0x28, 0x75, 0x5F, 0x53, 0x6F, 0x75, 0x72, 0x63,
0x65, 0x2C, 0x20, 0x75, 0x76, 0x20, 0x2B, 0x20, 0x74, 0x65, 0x78, 0x65,
0x6C, 0x53, 0x69, 0x7A, 0x65, 0x20, 0x2A, 0x20, 0x76, 0x65, 0x63, 0x32,
0x28, 0x31, 0x2E, 0x30, 0x2C, 0x20, 0x30, 0x2E, 0x30, 0x29, 0x29, 0x3B,
0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x49,
0x20, 0x3D, 0x20, 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x28, 0x75,
0x5F, 0x53, 0x6F, 0x75, 0x72, 0x63, 0x65, 0x2C, 0x20, 0x75, 0x76, 0x20,
0x2B, 0x20, 0x74, 0x65, 0x78, 0x65, 0x6C, 0x53, 0x69, 0x7A, 0x65, 0x20,
0x2A, 0x20, 0x76, 0x65, 0x63, 0x32, 0x28, 0x2D, 0x30, 0x2E, 0x35, 0x2C,
0x20, 0x30, 0x2E, 0x35, 0x29, 0x29, 0x3B, 0x0D, 0x0A, 0x20, 0x20, 0x20,
0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x4A, 0x20, 0x3D, 0x20, 0x74, 0x65,
0x78, 0x74, 0x75, 0x72, 0x65, 0x28, 0x75, 0x5F, 0x53, 0x6F, 0x75, 0x72,
0x63, 0x65, 0x2C, 0x20, 0x75, 0x76, 0x20, 0x2B, 0x20, 0x74, 0x65, 0x78,
0x65, 0x6C, 0x53, 0x69, 0x7A, 0x65, 0x20, 0x2A, 0x20, 0x76, 0x65, 0x63,
0x32, 0x28, 0x30, 0x2E, 0x35, 0x2C, 0x20, 0x30, 0x2E, 0x35, 0x29, 0x29,
0x3B, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20,
0x4B, 0x20, 0x3D, 0x20, 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x28,
0x75, 0x5F, 0x53, 0x6F, 0x75, 0x72, 0x63, 0x65, 0x2C, 0x20, 0x75, 0x76,
0x20, 0x2B, 0x20, 0x74, 0x65, 0x78, 0x65, 0x6C, 0x53, 0x69, 0x7A, 0x65,
0x20, 0x2A, 0x20, 0x76, 0x65, 0x63, 0x32, 0x28, 0x2D, 0x31, 0x2E, 0x30,
0x2C, 0x20, 0x31, 0x2E, 0x30, 0x29, 0x29, 0x3B, 0x0D, 0x0A, 0x20, 0x20,
0x20, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x4C, 0x20, 0x3D, 0x20, 0x74,
0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x28, 0x75, 0x5F, 0x53, 0x6F, 0x75,
0x72, 0x63, 0x65, 0x2C, 0x20, 0x75, 0x76, 0x20, 0x2B, 0x20, 0x74, 0x65,
0x78, 0x65, 0x6C, 0x53, 0x69, 0x7A, 0x65, 0x20, 0x2A, 0x20, 0x76, 0x65,
0x63, 0x32, 0x28, 0x30, 0x2E, 0x30, 0x2C, 0x20, 0x31, 0x2E, 0x30, 0x29,
0x29, 0x3B, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x76, 0x65, 0x63, 0x34,
0x20, 0x4D, 0x20, 0x3D, 0x20, 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65,
0x28, 0x75, 0x5F, 0x53, 0x6F, 0x75, 0x72, 0x63, 0x65, 0x2C, 0x20, 0x75,
0x76, 0x20, 0x2B, 0x20, 0x74, 0x65, 0x78, 0x65, 0x6C, 0x53, 0x69, 0x7A,
0x65, 0x20, 0x2A, 0x20, 0x76, 0x65, 0x63, 0x32, 0x28, 0x31, 0x2E, 0x30,
0x2C, 0x20, 0x31, 0x2E, 0x30, 0x29, 0x29, 0x3B, 0x0D, 0x0A, 0x0D, 0x0A,
0x20, 0x20, 0x20, 0x20, 0x76, 0x65, 0x63, 0x32, 0x20, 0x64, 0x69, 0x76,
0x20, 0x3D, 0x20, 0x28, 0x31, 0x2E, 0x30, 0x20, 0x2F, 0x20, 0x34, 0x2E,
0x30, 0x29, 0x20, 0x2A, 0x20, 0x76, 0x65, 0x63, 0x32, 0x28, 0x30, 0x2E,
0x35, 0x2C, 0x20, 0x30, 0x2E, 0x31, 0x32, 0x35, 0x29, 0x3B, 0x0D, 0x0A,
0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x6F,
0x20, 0x3D, 0x20, 0x28, 0x44, 0x20, 0x2B, 0x20, 0x45, 0x20, 0x2B, 0x20,
0x49, 0x20, 0x2B, 0x20, 0x4A, 0x29, 0x20, 0x2A, 0x20, 0x64, 0x69, 0x76,
0x2E, 0x78, 0x3B, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x6F, 0x20, 0x2B,
0x3D, 0x20, 0x28, 0x41, 0x20, 0x2B, 0x20, 0x42, 0x20, 0x2B, 0x20, 0x47,
0x20, 0x2B, 0x20, 0x46, 0x29, 0x20, 0x2A, 0x20, 0x64, 0x69, 0x76, 0x2E,
0x79, 0x3B, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x6F, 0x20, 0x2B, 0x3D,
0x20, 0x28, 0x42, 0x20, 0x2B, 0x20, 0x43, 0x20, 0x2B, 0x20, 0x48, 0x20,
0x2B, 0x20, 0x47, 0x29, 0x20, 0x2A, 0x20, 0x64, 0x69, 0x76, 0x2E, 0x79,
0x3B, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x6F, 0x20, 0x2B, 0x3D, 0x20,
0x28, 0x46, 0x20, 0x2B, 0x20, 0x47, 0x20, 0x2B, 0x20, 0x4C, 0x20, 0x2B,
0x20, 0x4B, 0x29, 0x20, 0x2A, 0x20, 0x64, 0x69, 0x76, 0x2E, 0x79, 0x3B,
0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x6F, 0x20, 0x2B, 0x3D, 0x20, 0x28,
0x47, 0x20, 0x2B, 0x20, 0x48, 0x20, 0x2B, 0x20, 0x4D, 0x20, 0x2B, 0x20,
0x4C, 0x29, 0x20, 0x2A, 0x20, 0x64, 0x69, 0x76, 0x2E, 0x79, 0x3B, 0x0D,
0x0A, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72,
0x6E, 0x20, 0x6F, 0x3B, 0x0D, 0x0A, 0x7D, 0x0D, 0x0A, 0x0D, 0x0A, 0x76,
0x65, 0x63, 0x34, 0x20, 0x55, 0x70, 0x73, 0x61, 0x6D, 0x70, 0x6C, 0x65,
0x28, 0x76, 0x65, 0x63, 0x32, 0x20, 0x75, 0x76, 0x29, 0x0D, 0x0A, 0x7B,
0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x64,
0x20, 0x3D, 0x20, 0x28, 0x31, 0x2E, 0x30, 0x20, 0x2F, 0x20, 0x75, 0x5F,
0x53, 0x6F, 0x75, 0x72, 0x63, 0x65, 0x32, 0x53, 0x69, 0x7A, 0x65, 0x2E,
0x78, 0x79, 0x78, 0x79, 0x29, 0x20, 0x2A, 0x20, 0x76, 0x65, 0x63, 0x34,
0x28, 0x31, 0x2E, 0x30, 0x2C, 0x20, 0x31, 0x2E, 0x30, 0x2C, 0x20, 0x2D,
0x31, 0x2E, 0x30, 0x2C, 0x20, 0x30, 0x2E, 0x30, 0x29, 0x20, 0x3B, 0x0D,
0x0A, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20,
0x73, 0x3B, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x73, 0x20, 0x3D, 0x20,
0x74, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x28, 0x75, 0x5F, 0x53, 0x6F,
0x75, 0x72, 0x63, 0x65, 0x32, 0x2C, 0x20, 0x75, 0x76, 0x20, 0x2D, 0x20,
0x64, 0x2E, 0x78, 0x79, 0x29, 0x3B, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20,
0x73, 0x20, 0x2B, 0x3D, 0x20, 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65,
0x28, 0x75, 0x5F, 0x53, 0x6F, 0x75, 0x72, 0x63, 0x65, 0x32, 0x2C, 0x20,
0x75, 0x76, 0x20, 0x2D, 0x20, 0x64, 0x2E, 0x7A, 0x79, 0x29, 0x3B, 0x0D,
0x0A, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x73, 0x20, 0x2B, 0x3D, 0x20,
0x74, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x28, 0x75, 0x5F, 0x53, 0x6F,
0x75, 0x72, 0x63, 0x65, 0x32, 0x2C, 0x20, 0x75, 0x76, 0x20, 0x2B, 0x20,
0x64, 0x2E, 0x7A, 0x77, 0x29, 0x20, 0x2A, 0x20, 0x32, 0x2E, 0x30, 0x3B,
0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x73, 0x20, 0x2B, 0x3D, 0x20, 0x74,
0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x28, 0x75, 0x5F, 0x53, 0x6F, 0x75,
0x72, 0x63, 0x65, 0x32, 0x2C, 0x20, 0x75, 0x76, 0x29, 0x20, 0x2A, 0x20,
0x34, 0x2E, 0x30, 0x3B, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x73, 0x20,
0x2B, 0x3D, 0x20, 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x28, 0x75,
0x5F, 0x53, 0x6F, 0x75, 0x72, 0x63, 0x65, 0x32, 0x2C, 0x20, 0x75, 0x76,
0x20, 0x2B, 0x20, 0x64, 0x2E, 0x78, 0x77, 0x29, 0x20, 0x2A, 0x20, 0x32,
0x2E, 0x30, 0x3B, 0x0D, 0x0A, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x73,
0x75, 0x76, 0x20, 0x2D, 0x20, 0x64, 0x2E, 0x77, 0x79, 0x29, 0x20, 0x2A,
0x20, 0x32, 0x2E, 0x30, 0x3B, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x73,
0x20, 0x2B, 0x3D, 0x20, 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x28,
0x75, 0x5F, 0x53, 0x6F, 0x75, 0x72, 0x63, 0x65, 0x32, 0x2C, 0x20, 0x75,
0x76, 0x20, 0x2B, 0x20, 0x64, 0x2E, 0x7A, 0x79, 0x29, 0x3B, 0x0D, 0x0A,
0x20, 0x20, 0x20, 0x20, 0x73, 0x20, 0x2B, 0x3D, 0x20, 0x74, 0x65, 0x78,
0x74, 0x75, 0x72, 0x65, 0x28, 0x75, 0x5F, 0x53, 0x6F, 0x75, 0x72, 0x63,
0x65, 0x32, 0x2C, 0x20, 0x75, 0x76, 0x20, 0x2B, 0x20, 0x64, 0x2E, 0x77,
0x79, 0x29, 0x20, 0x2A, 0x20, 0x32, 0x2E, 0x30, 0x3B, 0x0D, 0x0A, 0x20,
0x76, 0x20, 0x2D, 0x20, 0x64, 0x2E, 0x7A, 0x79, 0x29, 0x3B, 0x0D, 0x0A,
0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x73, 0x20, 0x2B, 0x3D, 0x20, 0x74,
0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x28, 0x75, 0x5F, 0x53, 0x6F, 0x75,
0x72, 0x63, 0x65, 0x32, 0x2C, 0x20, 0x75, 0x76, 0x20, 0x2B, 0x20, 0x64,
0x2E, 0x7A, 0x77, 0x29, 0x20, 0x2A, 0x20, 0x32, 0x2E, 0x30, 0x3B, 0x0D,
0x0A, 0x20, 0x20, 0x20, 0x20, 0x73, 0x20, 0x2B, 0x3D, 0x20, 0x74, 0x65,
0x78, 0x74, 0x75, 0x72, 0x65, 0x28, 0x75, 0x5F, 0x53, 0x6F, 0x75, 0x72,
0x63, 0x65, 0x32, 0x2C, 0x20, 0x75, 0x76, 0x29, 0x20, 0x2A, 0x20, 0x34,
0x2E, 0x30, 0x3B, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x73, 0x20, 0x2B,
0x3D, 0x20, 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x28, 0x75, 0x5F,
0x53, 0x6F, 0x75, 0x72, 0x63, 0x65, 0x32, 0x2C, 0x20, 0x75, 0x76, 0x20,
0x2B, 0x20, 0x64, 0x2E, 0x78, 0x77, 0x29, 0x20, 0x2A, 0x20, 0x32, 0x2E,
0x30, 0x3B, 0x0D, 0x0A, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x73, 0x20,
0x2B, 0x3D, 0x20, 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x28, 0x75,
0x5F, 0x53, 0x6F, 0x75, 0x72, 0x63, 0x65, 0x32, 0x2C, 0x20, 0x75, 0x76,
0x20, 0x2B, 0x20, 0x64, 0x2E, 0x7A, 0x79, 0x29, 0x3B, 0x0D, 0x0A, 0x20,
0x20, 0x20, 0x20, 0x73, 0x20, 0x2B, 0x3D, 0x20, 0x74, 0x65, 0x78, 0x74,
0x75, 0x72, 0x65, 0x28, 0x75, 0x5F, 0x53, 0x6F, 0x75, 0x72, 0x63, 0x65,
0x32, 0x2C, 0x20, 0x75, 0x76, 0x20, 0x2B, 0x20, 0x64, 0x2E, 0x78, 0x79,
0x29, 0x3B, 0x0D, 0x0A, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65,
0x74, 0x75, 0x72, 0x6E, 0x20, 0x73, 0x20, 0x2A, 0x20, 0x28, 0x31, 0x2E,
0x30, 0x20, 0x2F, 0x20, 0x31, 0x36, 0x2E, 0x30, 0x29, 0x3B, 0x0D, 0x0A,
0x7D, 0x0D, 0x0A, 0x0D, 0x0A, 0x76, 0x65, 0x63, 0x34, 0x20, 0x62, 0x6C,
0x75, 0x72, 0x39, 0x28, 0x73, 0x61, 0x6D, 0x70, 0x6C, 0x65, 0x72, 0x32,
0x44, 0x20, 0x69, 0x6D, 0x61, 0x67, 0x65, 0x2C, 0x20, 0x76, 0x65, 0x63,
0x32, 0x20, 0x75, 0x76, 0x2C, 0x20, 0x76, 0x65, 0x63, 0x32, 0x20, 0x72,
0x65, 0x73, 0x6F, 0x6C, 0x75, 0x74, 0x69, 0x6F, 0x6E, 0x2C, 0x20, 0x76,
0x65, 0x63, 0x32, 0x20, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F,
0x6E, 0x29, 0x20, 0x7B, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x76, 0x65,
0x63, 0x34, 0x20, 0x63, 0x6F, 0x6C, 0x6F, 0x72, 0x20, 0x3D, 0x20, 0x76,
0x65, 0x63, 0x34, 0x28, 0x30, 0x2E, 0x30, 0x29, 0x3B, 0x0D, 0x0A, 0x20,
0x20, 0x20, 0x20, 0x76, 0x65, 0x63, 0x32, 0x20, 0x6F, 0x66, 0x66, 0x31,
0x20, 0x3D, 0x20, 0x76, 0x65, 0x63, 0x32, 0x28, 0x31, 0x2E, 0x33, 0x38,
0x34, 0x36, 0x31, 0x35, 0x33, 0x38, 0x34, 0x36, 0x29, 0x20, 0x2A, 0x20,
0x32, 0x2C, 0x20, 0x75, 0x76, 0x20, 0x2B, 0x20, 0x64, 0x2E, 0x77, 0x79,
0x29, 0x20, 0x2A, 0x20, 0x32, 0x2E, 0x30, 0x3B, 0x0D, 0x0A, 0x20, 0x20,
0x20, 0x20, 0x73, 0x20, 0x2B, 0x3D, 0x20, 0x74, 0x65, 0x78, 0x74, 0x75,
0x72, 0x65, 0x28, 0x75, 0x5F, 0x53, 0x6F, 0x75, 0x72, 0x63, 0x65, 0x32,
0x2C, 0x20, 0x75, 0x76, 0x20, 0x2B, 0x20, 0x64, 0x2E, 0x78, 0x79, 0x29,
0x3B, 0x0D, 0x0A, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74,
0x75, 0x72, 0x6E, 0x20, 0x73, 0x20, 0x2A, 0x20, 0x28, 0x31, 0x2E, 0x30,
0x20, 0x2F, 0x20, 0x31, 0x36, 0x2E, 0x30, 0x29, 0x3B, 0x0D, 0x0A, 0x7D,
0x0D, 0x0A, 0x0D, 0x0A, 0x76, 0x65, 0x63, 0x34, 0x20, 0x62, 0x6C, 0x75,
0x72, 0x39, 0x28, 0x73, 0x61, 0x6D, 0x70, 0x6C, 0x65, 0x72, 0x32, 0x44,
0x20, 0x69, 0x6D, 0x61, 0x67, 0x65, 0x2C, 0x20, 0x76, 0x65, 0x63, 0x32,
0x20, 0x75, 0x76, 0x2C, 0x20, 0x76, 0x65, 0x63, 0x32, 0x20, 0x72, 0x65,
0x73, 0x6F, 0x6C, 0x75, 0x74, 0x69, 0x6F, 0x6E, 0x2C, 0x20, 0x76, 0x65,
0x63, 0x32, 0x20, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E,
0x29, 0x20, 0x7B, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x76, 0x65, 0x63,
0x34, 0x20, 0x63, 0x6F, 0x6C, 0x6F, 0x72, 0x20, 0x3D, 0x20, 0x76, 0x65,
0x63, 0x34, 0x28, 0x30, 0x2E, 0x30, 0x29, 0x3B, 0x0D, 0x0A, 0x20, 0x20,
0x20, 0x20, 0x76, 0x65, 0x63, 0x32, 0x20, 0x6F, 0x66, 0x66, 0x31, 0x20,
0x3D, 0x20, 0x76, 0x65, 0x63, 0x32, 0x28, 0x31, 0x2E, 0x33, 0x38, 0x34,
0x36, 0x31, 0x35, 0x33, 0x38, 0x34, 0x36, 0x29, 0x20, 0x2A, 0x20, 0x64,
0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3B, 0x0D, 0x0A, 0x20,
0x20, 0x20, 0x20, 0x76, 0x65, 0x63, 0x32, 0x20, 0x6F, 0x66, 0x66, 0x32,
0x20, 0x3D, 0x20, 0x76, 0x65, 0x63, 0x32, 0x28, 0x33, 0x2E, 0x32, 0x33,
0x30, 0x37, 0x36, 0x39, 0x32, 0x33, 0x30, 0x38, 0x29, 0x20, 0x2A, 0x20,
0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3B, 0x0D, 0x0A,
0x20, 0x20, 0x20, 0x20, 0x76, 0x65, 0x63, 0x32, 0x20, 0x6F, 0x66, 0x66,
0x32, 0x20, 0x3D, 0x20, 0x76, 0x65, 0x63, 0x32, 0x28, 0x33, 0x2E, 0x32,
0x33, 0x30, 0x37, 0x36, 0x39, 0x32, 0x33, 0x30, 0x38, 0x29, 0x20, 0x2A,
0x20, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3B, 0x0D,
0x20, 0x20, 0x20, 0x20, 0x63, 0x6F, 0x6C, 0x6F, 0x72, 0x20, 0x2B, 0x3D,
0x20, 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x28, 0x69, 0x6D, 0x61,
0x67, 0x65, 0x2C, 0x20, 0x75, 0x76, 0x29, 0x20, 0x2A, 0x20, 0x30, 0x2E,
0x32, 0x32, 0x37, 0x30, 0x32, 0x37, 0x30, 0x32, 0x37, 0x30, 0x3B, 0x0D,
0x0A, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6F, 0x6C, 0x6F, 0x72, 0x20, 0x2B,
0x3D, 0x20, 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x28, 0x69, 0x6D,
0x61, 0x67, 0x65, 0x2C, 0x20, 0x75, 0x76, 0x29, 0x20, 0x2A, 0x20, 0x30,
0x2E, 0x32, 0x32, 0x37, 0x30, 0x32, 0x37, 0x30, 0x32, 0x37, 0x30, 0x3B,
0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6F, 0x6C, 0x6F, 0x72, 0x20,
0x2B, 0x3D, 0x20, 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x28, 0x69,
0x6D, 0x61, 0x67, 0x65, 0x2C, 0x20, 0x75, 0x76, 0x20, 0x2B, 0x20, 0x28,
0x6F, 0x66, 0x66, 0x31, 0x20, 0x2F, 0x20, 0x72, 0x65, 0x73, 0x6F, 0x6C,
0x75, 0x74, 0x69, 0x6F, 0x6E, 0x29, 0x29, 0x20, 0x2A, 0x20, 0x30, 0x2E,
0x33, 0x31, 0x36, 0x32, 0x31, 0x36, 0x32, 0x31, 0x36, 0x32, 0x3B, 0x0D,
0x0A, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6F, 0x6C, 0x6F, 0x72, 0x20, 0x2B,
0x3D, 0x20, 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x28, 0x69, 0x6D,
0x61, 0x67, 0x65, 0x2C, 0x20, 0x75, 0x76, 0x20, 0x2D, 0x20, 0x28, 0x6F,
0x61, 0x67, 0x65, 0x2C, 0x20, 0x75, 0x76, 0x20, 0x2B, 0x20, 0x28, 0x6F,
0x66, 0x66, 0x31, 0x20, 0x2F, 0x20, 0x72, 0x65, 0x73, 0x6F, 0x6C, 0x75,
0x74, 0x69, 0x6F, 0x6E, 0x29, 0x29, 0x20, 0x2A, 0x20, 0x30, 0x2E, 0x33,
0x31, 0x36, 0x32, 0x31, 0x36, 0x32, 0x31, 0x36, 0x32, 0x3B, 0x0D, 0x0A,
0x20, 0x20, 0x20, 0x20, 0x63, 0x6F, 0x6C, 0x6F, 0x72, 0x20, 0x2B, 0x3D,
0x20, 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x28, 0x69, 0x6D, 0x61,
0x67, 0x65, 0x2C, 0x20, 0x75, 0x76, 0x20, 0x2B, 0x20, 0x28, 0x6F, 0x66,
0x66, 0x32, 0x20, 0x2F, 0x20, 0x72, 0x65, 0x73, 0x6F, 0x6C, 0x75, 0x74,
0x69, 0x6F, 0x6E, 0x29, 0x29, 0x20, 0x2A, 0x20, 0x30, 0x2E, 0x30, 0x37,
0x30, 0x32, 0x37, 0x30, 0x32, 0x37, 0x30, 0x33, 0x3B, 0x0D, 0x0A, 0x20,
0x67, 0x65, 0x2C, 0x20, 0x75, 0x76, 0x20, 0x2D, 0x20, 0x28, 0x6F, 0x66,
0x66, 0x31, 0x20, 0x2F, 0x20, 0x72, 0x65, 0x73, 0x6F, 0x6C, 0x75, 0x74,
0x69, 0x6F, 0x6E, 0x29, 0x29, 0x20, 0x2A, 0x20, 0x30, 0x2E, 0x33, 0x31,
0x36, 0x32, 0x31, 0x36, 0x32, 0x31, 0x36, 0x32, 0x3B, 0x0D, 0x0A, 0x20,
0x20, 0x20, 0x20, 0x63, 0x6F, 0x6C, 0x6F, 0x72, 0x20, 0x2B, 0x3D, 0x20,
0x74, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x28, 0x69, 0x6D, 0x61, 0x67,
0x65, 0x2C, 0x20, 0x75, 0x76, 0x20, 0x2D, 0x20, 0x28, 0x6F, 0x66, 0x66,
0x65, 0x2C, 0x20, 0x75, 0x76, 0x20, 0x2B, 0x20, 0x28, 0x6F, 0x66, 0x66,
0x32, 0x20, 0x2F, 0x20, 0x72, 0x65, 0x73, 0x6F, 0x6C, 0x75, 0x74, 0x69,
0x6F, 0x6E, 0x29, 0x29, 0x20, 0x2A, 0x20, 0x30, 0x2E, 0x30, 0x37, 0x30,
0x32, 0x37, 0x30, 0x32, 0x37, 0x30, 0x33, 0x3B, 0x0D, 0x0A, 0x20, 0x20,
0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6E, 0x20, 0x63, 0x6F, 0x6C,
0x6F, 0x72, 0x3B, 0x0D, 0x0A, 0x7D, 0x0D, 0x0A, 0x0D, 0x0A, 0x0D, 0x0A,
0x0D, 0x0A, 0x76, 0x6F, 0x69, 0x64, 0x20, 0x6D, 0x61, 0x69, 0x6E, 0x28,
0x29, 0x0D, 0x0A, 0x7B, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x76, 0x65,
0x63, 0x34, 0x20, 0x6F, 0x75, 0x74, 0x70, 0x75, 0x74, 0x43, 0x6F, 0x6C,
0x6F, 0x72, 0x20, 0x3D, 0x20, 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65,
0x28, 0x75, 0x5F, 0x53, 0x6F, 0x75, 0x72, 0x63, 0x65, 0x2C, 0x20, 0x55,
0x56, 0x29, 0x2E, 0x72, 0x67, 0x62, 0x61, 0x3B, 0x0D, 0x0A, 0x20, 0x20,
0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x75, 0x5F, 0x53, 0x74, 0x61, 0x67,
0x65, 0x20, 0x3D, 0x3D, 0x20, 0x30, 0x29, 0x20, 0x2F, 0x2F, 0x20, 0x54,
0x68, 0x72, 0x65, 0x73, 0x68, 0x6F, 0x6C, 0x64, 0x0D, 0x0A, 0x20, 0x20,
0x20, 0x20, 0x7B, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x6F, 0x75, 0x74, 0x70, 0x75, 0x74, 0x43, 0x6F, 0x6C, 0x6F, 0x72,
0x20, 0x3D, 0x20, 0x54, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6F, 0x6C, 0x64,
0x28, 0x6F, 0x75, 0x74, 0x70, 0x75, 0x74, 0x43, 0x6F, 0x6C, 0x6F, 0x72,
0x2C, 0x20, 0x55, 0x56, 0x29, 0x3B, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20,
0x7D, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6C, 0x73, 0x65, 0x20,
0x69, 0x66, 0x20, 0x28, 0x75, 0x5F, 0x53, 0x74, 0x61, 0x67, 0x65, 0x20,
0x3D, 0x3D, 0x20, 0x31, 0x29, 0x20, 0x2F, 0x2F, 0x20, 0x44, 0x6F, 0x77,
0x6E, 0x73, 0x61, 0x6D, 0x70, 0x6C, 0x69, 0x6E, 0x67, 0x0D, 0x0A, 0x20,
0x20, 0x20, 0x20, 0x7B, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x6F, 0x75, 0x74, 0x70, 0x75, 0x74, 0x43, 0x6F, 0x6C, 0x6F,
0x72, 0x20, 0x3D, 0x20, 0x44, 0x6F, 0x77, 0x6E, 0x73, 0x61, 0x6D, 0x70,
0x6C, 0x65, 0x42, 0x6F, 0x78, 0x31, 0x33, 0x54, 0x61, 0x70, 0x28, 0x55,
0x56, 0x29, 0x3B, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x7D, 0x0D, 0x0A,
0x20, 0x20, 0x20, 0x20, 0x65, 0x6C, 0x73, 0x65, 0x20, 0x69, 0x66, 0x20,
0x28, 0x75, 0x5F, 0x53, 0x74, 0x61, 0x67, 0x65, 0x20, 0x3D, 0x3D, 0x20,
0x32, 0x29, 0x20, 0x2F, 0x2F, 0x20, 0x42, 0x6C, 0x75, 0x72, 0x0D, 0x0A,
0x20, 0x20, 0x20, 0x20, 0x7B, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x6F, 0x75, 0x74, 0x70, 0x75, 0x74, 0x43, 0x6F, 0x6C,
0x6F, 0x72, 0x20, 0x3D, 0x20, 0x62, 0x6C, 0x75, 0x72, 0x39, 0x28, 0x75,
0x5F, 0x53, 0x6F, 0x75, 0x72, 0x63, 0x65, 0x2C, 0x20, 0x55, 0x56, 0x2C,
0x20, 0x75, 0x5F, 0x53, 0x6F, 0x75, 0x72, 0x63, 0x65, 0x53, 0x69, 0x7A,
0x65, 0x2C, 0x20, 0x75, 0x5F, 0x42, 0x6C, 0x75, 0x72, 0x44, 0x69, 0x72,
0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x29, 0x3B, 0x0D, 0x0A, 0x20, 0x20,
0x20, 0x20, 0x7D, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6C, 0x73,
0x65, 0x20, 0x69, 0x66, 0x20, 0x28, 0x75, 0x5F, 0x53, 0x74, 0x61, 0x67,
0x65, 0x20, 0x3D, 0x3D, 0x20, 0x33, 0x29, 0x20, 0x2F, 0x2F, 0x20, 0x43,
0x6F, 0x70, 0x79, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x7B, 0x0D, 0x0A,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6F, 0x75, 0x74, 0x70,
0x75, 0x74, 0x43, 0x6F, 0x6C, 0x6F, 0x72, 0x20, 0x3D, 0x20, 0x74, 0x65,
0x78, 0x74, 0x75, 0x72, 0x65, 0x28, 0x75, 0x5F, 0x53, 0x6F, 0x75, 0x72,
0x63, 0x65, 0x2C, 0x20, 0x55, 0x56, 0x29, 0x3B, 0x0D, 0x0A, 0x20, 0x20,
0x20, 0x20, 0x7D, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6C, 0x73,
0x65, 0x20, 0x69, 0x66, 0x20, 0x28, 0x75, 0x5F, 0x53, 0x74, 0x61, 0x67,
0x65, 0x20, 0x3D, 0x3D, 0x20, 0x34, 0x29, 0x20, 0x2F, 0x2F, 0x20, 0x55,
0x70, 0x73, 0x61, 0x6D, 0x70, 0x6C, 0x69, 0x6E, 0x67, 0x20, 0x2B, 0x20,
0x63, 0x6F, 0x6D, 0x62, 0x69, 0x6E, 0x65, 0x0D, 0x0A, 0x20, 0x20, 0x20,
0x20, 0x20, 0x63, 0x6F, 0x6C, 0x6F, 0x72, 0x20, 0x2B, 0x3D, 0x20, 0x74,
0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x28, 0x69, 0x6D, 0x61, 0x67, 0x65,
0x2C, 0x20, 0x75, 0x76, 0x20, 0x2D, 0x20, 0x28, 0x6F, 0x66, 0x66, 0x32,
0x20, 0x2F, 0x20, 0x72, 0x65, 0x73, 0x6F, 0x6C, 0x75, 0x74, 0x69, 0x6F,
0x6E, 0x29, 0x29, 0x20, 0x2A, 0x20, 0x30, 0x2E, 0x30, 0x37, 0x30, 0x32,
0x37, 0x30, 0x32, 0x37, 0x30, 0x33, 0x3B, 0x0D, 0x0A, 0x20, 0x20, 0x20,
0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6E, 0x20, 0x63, 0x6F, 0x6C, 0x6F,
0x72, 0x3B, 0x0D, 0x0A, 0x7D, 0x0D, 0x0A, 0x0D, 0x0A, 0x0D, 0x0A, 0x0D,
0x0A, 0x76, 0x6F, 0x69, 0x64, 0x20, 0x6D, 0x61, 0x69, 0x6E, 0x28, 0x29,
0x0D, 0x0A, 0x7B, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x76, 0x65, 0x63,
0x34, 0x20, 0x6F, 0x75, 0x74, 0x70, 0x75, 0x74, 0x43, 0x6F, 0x6C, 0x6F,
0x72, 0x20, 0x3D, 0x20, 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x28,
0x75, 0x5F, 0x53, 0x6F, 0x75, 0x72, 0x63, 0x65, 0x2C, 0x20, 0x55, 0x56,
0x29, 0x2E, 0x72, 0x67, 0x62, 0x61, 0x3B, 0x0D, 0x0A, 0x20, 0x20, 0x20,
0x20, 0x69, 0x66, 0x20, 0x28, 0x75, 0x5F, 0x53, 0x74, 0x61, 0x67, 0x65,
0x20, 0x3D, 0x3D, 0x20, 0x30, 0x29, 0x20, 0x2F, 0x2F, 0x20, 0x54, 0x68,
0x72, 0x65, 0x73, 0x68, 0x6F, 0x6C, 0x64, 0x0D, 0x0A, 0x20, 0x20, 0x20,
0x20, 0x7B, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x6F, 0x75, 0x74, 0x70, 0x75, 0x74, 0x43, 0x6F, 0x6C, 0x6F, 0x72, 0x20,
0x2B, 0x3D, 0x20, 0x55, 0x70, 0x73, 0x61, 0x6D, 0x70, 0x6C, 0x65, 0x28,
0x55, 0x56, 0x29, 0x20, 0x2F, 0x20, 0x32, 0x2E, 0x30, 0x3B, 0x0D, 0x0A,
0x20, 0x20, 0x20, 0x20, 0x7D, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x65,
0x6C, 0x73, 0x65, 0x20, 0x69, 0x66, 0x20, 0x28, 0x75, 0x5F, 0x53, 0x74,
0x61, 0x67, 0x65, 0x20, 0x3D, 0x3D, 0x20, 0x35, 0x29, 0x20, 0x2F, 0x2F,
0x20, 0x46, 0x69, 0x6E, 0x61, 0x6C, 0x20, 0x63, 0x6F, 0x6D, 0x62, 0x69,
0x6E, 0x65, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x7B, 0x0D, 0x0A, 0x20,
0x3D, 0x20, 0x54, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6F, 0x6C, 0x64, 0x28,
0x6F, 0x75, 0x74, 0x70, 0x75, 0x74, 0x43, 0x6F, 0x6C, 0x6F, 0x72, 0x2C,
0x20, 0x55, 0x56, 0x29, 0x3B, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x7D,
0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6C, 0x73, 0x65, 0x20, 0x69,
0x66, 0x20, 0x28, 0x75, 0x5F, 0x53, 0x74, 0x61, 0x67, 0x65, 0x20, 0x3D,
0x3D, 0x20, 0x31, 0x29, 0x20, 0x2F, 0x2F, 0x20, 0x44, 0x6F, 0x77, 0x6E,
0x73, 0x61, 0x6D, 0x70, 0x6C, 0x69, 0x6E, 0x67, 0x0D, 0x0A, 0x20, 0x20,
0x20, 0x20, 0x7B, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x6F, 0x75, 0x74, 0x70, 0x75, 0x74, 0x43, 0x6F, 0x6C, 0x6F, 0x72,
0x20, 0x3D, 0x20, 0x44, 0x6F, 0x77, 0x6E, 0x73, 0x61, 0x6D, 0x70, 0x6C,
0x65, 0x42, 0x6F, 0x78, 0x31, 0x33, 0x54, 0x61, 0x70, 0x28, 0x55, 0x56,
0x29, 0x3B, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x7D, 0x0D, 0x0A, 0x20,
0x20, 0x20, 0x20, 0x65, 0x6C, 0x73, 0x65, 0x20, 0x69, 0x66, 0x20, 0x28,
0x75, 0x5F, 0x53, 0x74, 0x61, 0x67, 0x65, 0x20, 0x3D, 0x3D, 0x20, 0x32,
0x29, 0x20, 0x2F, 0x2F, 0x20, 0x42, 0x6C, 0x75, 0x72, 0x0D, 0x0A, 0x20,
0x20, 0x20, 0x20, 0x7B, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x6F, 0x75, 0x74, 0x70, 0x75, 0x74, 0x43, 0x6F, 0x6C, 0x6F,
0x72, 0x20, 0x3D, 0x20, 0x62, 0x6C, 0x75, 0x72, 0x39, 0x28, 0x75, 0x5F,
0x53, 0x6F, 0x75, 0x72, 0x63, 0x65, 0x2C, 0x20, 0x55, 0x56, 0x2C, 0x20,
0x75, 0x5F, 0x53, 0x6F, 0x75, 0x72, 0x63, 0x65, 0x53, 0x69, 0x7A, 0x65,
0x2C, 0x20, 0x75, 0x5F, 0x42, 0x6C, 0x75, 0x72, 0x44, 0x69, 0x72, 0x65,
0x63, 0x74, 0x69, 0x6F, 0x6E, 0x29, 0x3B, 0x0D, 0x0A, 0x20, 0x20, 0x20,
0x20, 0x7D, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6C, 0x73, 0x65,
0x20, 0x69, 0x66, 0x20, 0x28, 0x75, 0x5F, 0x53, 0x74, 0x61, 0x67, 0x65,
0x20, 0x3D, 0x3D, 0x20, 0x33, 0x29, 0x20, 0x2F, 0x2F, 0x20, 0x43, 0x6F,
0x70, 0x79, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x7B, 0x0D, 0x0A, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6F, 0x75, 0x74, 0x70, 0x75,
0x74, 0x43, 0x6F, 0x6C, 0x6F, 0x72, 0x20, 0x2B, 0x3D, 0x20, 0x74, 0x65,
0x78, 0x74, 0x75, 0x72, 0x65, 0x28, 0x75, 0x5F, 0x53, 0x6F, 0x75, 0x72,
0x63, 0x65, 0x32, 0x2C, 0x20, 0x55, 0x56, 0x29, 0x3B, 0x0D, 0x0A, 0x0D,
0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x76, 0x65, 0x63,
0x33, 0x20, 0x63, 0x6F, 0x6C, 0x6F, 0x72, 0x20, 0x3D, 0x20, 0x6F, 0x75,
0x74, 0x70, 0x75, 0x74, 0x43, 0x6F, 0x6C, 0x6F, 0x72, 0x2E, 0x72, 0x67,
0x62, 0x3B, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x6F, 0x75, 0x74, 0x70, 0x75, 0x74, 0x43, 0x6F, 0x6C, 0x6F, 0x72, 0x20,
0x3D, 0x20, 0x76, 0x65, 0x63, 0x34, 0x28, 0x63, 0x6F, 0x6C, 0x6F, 0x72,
0x2C, 0x20, 0x31, 0x2E, 0x30, 0x29, 0x3B, 0x2F, 0x2F, 0x76, 0x65, 0x63,
0x34, 0x28, 0x61, 0x63, 0x65, 0x73, 0x4F, 0x70, 0x65, 0x72, 0x61, 0x74,
0x6F, 0x72, 0x28, 0x6F, 0x75, 0x74, 0x70, 0x75, 0x74, 0x43, 0x6F, 0x6C,
0x6F, 0x72, 0x2E, 0x72, 0x67, 0x62, 0x29, 0x2C, 0x20, 0x31, 0x2E, 0x30,
0x66, 0x29, 0x3B, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x7D, 0x0D, 0x0A,
0x20, 0x20, 0x20, 0x20, 0x46, 0x72, 0x61, 0x67, 0x43, 0x6F, 0x6C, 0x6F,
0x72, 0x20, 0x3D, 0x20, 0x6F, 0x75, 0x74, 0x70, 0x75, 0x74, 0x43, 0x6F,
0x6C, 0x6F, 0x72, 0x3B, 0x0D, 0x0A, 0x7D,
0x74, 0x43, 0x6F, 0x6C, 0x6F, 0x72, 0x20, 0x3D, 0x20, 0x74, 0x65, 0x78,
0x74, 0x75, 0x72, 0x65, 0x28, 0x75, 0x5F, 0x53, 0x6F, 0x75, 0x72, 0x63,
0x65, 0x2C, 0x20, 0x55, 0x56, 0x29, 0x3B, 0x0D, 0x0A, 0x20, 0x20, 0x20,
0x20, 0x7D, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6C, 0x73, 0x65,
0x20, 0x69, 0x66, 0x20, 0x28, 0x75, 0x5F, 0x53, 0x74, 0x61, 0x67, 0x65,
0x20, 0x3D, 0x3D, 0x20, 0x34, 0x29, 0x20, 0x2F, 0x2F, 0x20, 0x55, 0x70,
0x73, 0x61, 0x6D, 0x70, 0x6C, 0x69, 0x6E, 0x67, 0x20, 0x2B, 0x20, 0x63,
0x6F, 0x6D, 0x62, 0x69, 0x6E, 0x65, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20,
0x7B, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6F,
0x75, 0x74, 0x70, 0x75, 0x74, 0x43, 0x6F, 0x6C, 0x6F, 0x72, 0x20, 0x2B,
0x3D, 0x20, 0x55, 0x70, 0x73, 0x61, 0x6D, 0x70, 0x6C, 0x65, 0x28, 0x55,
0x56, 0x29, 0x20, 0x2F, 0x20, 0x32, 0x2E, 0x30, 0x3B, 0x0D, 0x0A, 0x20,
0x20, 0x20, 0x20, 0x7D, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6C,
0x73, 0x65, 0x20, 0x69, 0x66, 0x20, 0x28, 0x75, 0x5F, 0x53, 0x74, 0x61,
0x67, 0x65, 0x20, 0x3D, 0x3D, 0x20, 0x35, 0x29, 0x20, 0x2F, 0x2F, 0x20,
0x46, 0x69, 0x6E, 0x61, 0x6C, 0x20, 0x63, 0x6F, 0x6D, 0x62, 0x69, 0x6E,
0x65, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x7B, 0x0D, 0x0A, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x6C,
0x65, 0x6E, 0x73, 0x44, 0x69, 0x72, 0x74, 0x20, 0x3D, 0x20, 0x76, 0x65,
0x63, 0x34, 0x28, 0x30, 0x2E, 0x30, 0x66, 0x29, 0x3B, 0x0D, 0x0A, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x28, 0x75, 0x5F,
0x48, 0x61, 0x73, 0x4C, 0x65, 0x6E, 0x73, 0x44, 0x69, 0x72, 0x74, 0x20,
0x3D, 0x3D, 0x20, 0x31, 0x29, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x7B, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6C, 0x65, 0x6E, 0x73, 0x44, 0x69,
0x72, 0x74, 0x20, 0x3D, 0x20, 0x6D, 0x61, 0x78, 0x28, 0x74, 0x65, 0x78,
0x74, 0x75, 0x72, 0x65, 0x28, 0x75, 0x5F, 0x4C, 0x65, 0x6E, 0x73, 0x44,
0x69, 0x72, 0x74, 0x2C, 0x20, 0x55, 0x56, 0x29, 0x20, 0x2A, 0x20, 0x75,
0x5F, 0x4C, 0x65, 0x6E, 0x73, 0x44, 0x69, 0x72, 0x74, 0x49, 0x6E, 0x74,
0x65, 0x6E, 0x73, 0x69, 0x74, 0x79, 0x2C, 0x20, 0x31, 0x2E, 0x30, 0x20,
0x2D, 0x20, 0x75, 0x5F, 0x4C, 0x65, 0x6E, 0x73, 0x44, 0x69, 0x72, 0x74,
0x49, 0x6E, 0x74, 0x65, 0x6E, 0x73, 0x69, 0x74, 0x79, 0x29, 0x3B, 0x0D,
0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7D, 0x0D, 0x0A,
0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6F, 0x75,
0x74, 0x70, 0x75, 0x74, 0x43, 0x6F, 0x6C, 0x6F, 0x72, 0x20, 0x2A, 0x3D,
0x20, 0x6C, 0x65, 0x6E, 0x73, 0x44, 0x69, 0x72, 0x74, 0x3B, 0x0D, 0x0A,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6F, 0x75, 0x74, 0x70,
0x75, 0x74, 0x43, 0x6F, 0x6C, 0x6F, 0x72, 0x20, 0x2B, 0x3D, 0x20, 0x74,
0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x28, 0x75, 0x5F, 0x53, 0x6F, 0x75,
0x72, 0x63, 0x65, 0x32, 0x2C, 0x20, 0x55, 0x56, 0x29, 0x3B, 0x0D, 0x0A,
0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x76, 0x65,
0x63, 0x33, 0x20, 0x63, 0x6F, 0x6C, 0x6F, 0x72, 0x20, 0x3D, 0x20, 0x6F,
0x75, 0x74, 0x70, 0x75, 0x74, 0x43, 0x6F, 0x6C, 0x6F, 0x72, 0x2E, 0x72,
0x67, 0x62, 0x3B, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x6F, 0x75, 0x74, 0x70, 0x75, 0x74, 0x43, 0x6F, 0x6C, 0x6F, 0x72,
0x20, 0x3D, 0x20, 0x76, 0x65, 0x63, 0x34, 0x28, 0x63, 0x6F, 0x6C, 0x6F,
0x72, 0x2C, 0x20, 0x31, 0x2E, 0x30, 0x29, 0x3B, 0x2F, 0x2F, 0x76, 0x65,
0x63, 0x34, 0x28, 0x61, 0x63, 0x65, 0x73, 0x4F, 0x70, 0x65, 0x72, 0x61,
0x74, 0x6F, 0x72, 0x28, 0x6F, 0x75, 0x74, 0x70, 0x75, 0x74, 0x43, 0x6F,
0x6C, 0x6F, 0x72, 0x2E, 0x72, 0x67, 0x62, 0x29, 0x2C, 0x20, 0x31, 0x2E,
0x30, 0x66, 0x29, 0x3B, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x7D, 0x0D,
0x0A, 0x20, 0x20, 0x20, 0x20, 0x46, 0x72, 0x61, 0x67, 0x43, 0x6F, 0x6C,
0x6F, 0x72, 0x20, 0x3D, 0x20, 0x6F, 0x75, 0x74, 0x70, 0x75, 0x74, 0x43,
0x6F, 0x6C, 0x6F, 0x72, 0x3B, 0x0D, 0x0A, 0x7D,
};
unsigned int Resources_Shaders_bloom_shader_len = sizeof(Resources_Shaders_bloom_shader);
@@ -273714,6 +273741,172 @@ namespace Nuake {
};
unsigned int Resources_Shaders_pbr_shader_len = sizeof(Resources_Shaders_pbr_shader);
// Data for file: Resources_Shaders_pixelization_shader_path
const std::string Resources_Shaders_pixelization_shader_path = R"(Resources/Shaders/pixelization.shader)";
unsigned char Resources_Shaders_pixelization_shader[] = {
0x23, 0x73, 0x68, 0x61, 0x64, 0x65, 0x72, 0x20, 0x76, 0x65, 0x72, 0x74,
0x65, 0x78, 0x0D, 0x0A, 0x23, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6F, 0x6E,
0x20, 0x34, 0x34, 0x30, 0x20, 0x63, 0x6F, 0x72, 0x65, 0x0D, 0x0A, 0x0D,
0x0A, 0x6C, 0x61, 0x79, 0x6F, 0x75, 0x74, 0x28, 0x6C, 0x6F, 0x63, 0x61,
0x74, 0x69, 0x6F, 0x6E, 0x20, 0x3D, 0x20, 0x30, 0x29, 0x20, 0x69, 0x6E,
0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x56, 0x65, 0x72, 0x74, 0x65, 0x78,
0x50, 0x6F, 0x73, 0x69, 0x74, 0x69, 0x6F, 0x6E, 0x3B, 0x0D, 0x0A, 0x6C,
0x61, 0x79, 0x6F, 0x75, 0x74, 0x28, 0x6C, 0x6F, 0x63, 0x61, 0x74, 0x69,
0x6F, 0x6E, 0x20, 0x3D, 0x20, 0x31, 0x29, 0x20, 0x69, 0x6E, 0x20, 0x76,
0x65, 0x63, 0x32, 0x20, 0x55, 0x56, 0x50, 0x6F, 0x73, 0x69, 0x74, 0x69,
0x6F, 0x6E, 0x3B, 0x0D, 0x0A, 0x0D, 0x0A, 0x6F, 0x75, 0x74, 0x20, 0x66,
0x6C, 0x61, 0x74, 0x20, 0x76, 0x65, 0x63, 0x32, 0x20, 0x55, 0x56, 0x3B,
0x0D, 0x0A, 0x0D, 0x0A, 0x76, 0x6F, 0x69, 0x64, 0x20, 0x6D, 0x61, 0x69,
0x6E, 0x28, 0x29, 0x0D, 0x0A, 0x7B, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20,
0x55, 0x56, 0x20, 0x3D, 0x20, 0x55, 0x56, 0x50, 0x6F, 0x73, 0x69, 0x74,
0x69, 0x6F, 0x6E, 0x3B, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x67, 0x6C,
0x5F, 0x50, 0x6F, 0x73, 0x69, 0x74, 0x69, 0x6F, 0x6E, 0x20, 0x3D, 0x20,
0x76, 0x65, 0x63, 0x34, 0x28, 0x56, 0x65, 0x72, 0x74, 0x65, 0x78, 0x50,
0x6F, 0x73, 0x69, 0x74, 0x69, 0x6F, 0x6E, 0x2C, 0x20, 0x31, 0x2E, 0x30,
0x66, 0x29, 0x3B, 0x0D, 0x0A, 0x7D, 0x0D, 0x0A, 0x0D, 0x0A, 0x23, 0x73,
0x68, 0x61, 0x64, 0x65, 0x72, 0x20, 0x66, 0x72, 0x61, 0x67, 0x6D, 0x65,
0x6E, 0x74, 0x0D, 0x0A, 0x23, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6F, 0x6E,
0x20, 0x34, 0x34, 0x30, 0x20, 0x63, 0x6F, 0x72, 0x65, 0x0D, 0x0A, 0x0D,
0x0A, 0x75, 0x6E, 0x69, 0x66, 0x6F, 0x72, 0x6D, 0x20, 0x69, 0x6E, 0x74,
0x20, 0x75, 0x5F, 0x50, 0x69, 0x78, 0x65, 0x6C, 0x53, 0x69, 0x7A, 0x65,
0x20, 0x3D, 0x20, 0x34, 0x3B, 0x0D, 0x0A, 0x0D, 0x0A, 0x75, 0x6E, 0x69,
0x66, 0x6F, 0x72, 0x6D, 0x20, 0x73, 0x61, 0x6D, 0x70, 0x6C, 0x65, 0x72,
0x32, 0x44, 0x20, 0x75, 0x5F, 0x53, 0x6F, 0x75, 0x72, 0x63, 0x65, 0x3B,
0x0D, 0x0A, 0x75, 0x6E, 0x69, 0x66, 0x6F, 0x72, 0x6D, 0x20, 0x76, 0x65,
0x63, 0x32, 0x20, 0x75, 0x5F, 0x53, 0x6F, 0x75, 0x72, 0x63, 0x65, 0x53,
0x69, 0x7A, 0x65, 0x3B, 0x0D, 0x0A, 0x0D, 0x0A, 0x69, 0x6E, 0x20, 0x76,
0x65, 0x63, 0x32, 0x20, 0x55, 0x56, 0x3B, 0x0D, 0x0A, 0x0D, 0x0A, 0x6F,
0x75, 0x74, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x46, 0x72, 0x61, 0x67,
0x43, 0x6F, 0x6C, 0x6F, 0x72, 0x3B, 0x0D, 0x0A, 0x0D, 0x0A, 0x2F, 0x2F,
0x20, 0x49, 0x6D, 0x70, 0x6C, 0x65, 0x6D, 0x65, 0x6E, 0x74, 0x61, 0x74,
0x69, 0x6F, 0x6E, 0x20, 0x66, 0x72, 0x6F, 0x6D, 0x3A, 0x20, 0x68, 0x74,
0x74, 0x70, 0x73, 0x3A, 0x2F, 0x2F, 0x6C, 0x65, 0x74, 0x74, 0x69, 0x65,
0x72, 0x2E, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2E, 0x69, 0x6F, 0x2F,
0x33, 0x64, 0x2D, 0x67, 0x61, 0x6D, 0x65, 0x2D, 0x73, 0x68, 0x61, 0x64,
0x65, 0x72, 0x73, 0x2D, 0x66, 0x6F, 0x72, 0x2D, 0x62, 0x65, 0x67, 0x69,
0x6E, 0x6E, 0x65, 0x72, 0x73, 0x2F, 0x70, 0x69, 0x78, 0x65, 0x6C, 0x69,
0x7A, 0x61, 0x74, 0x69, 0x6F, 0x6E, 0x2E, 0x68, 0x74, 0x6D, 0x6C, 0x0D,
0x0A, 0x76, 0x6F, 0x69, 0x64, 0x20, 0x6D, 0x61, 0x69, 0x6E, 0x28, 0x29,
0x0D, 0x0A, 0x7B, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x76, 0x65, 0x63,
0x32, 0x20, 0x70, 0x69, 0x78, 0x65, 0x6C, 0x43, 0x6F, 0x6F, 0x72, 0x64,
0x20, 0x3D, 0x20, 0x55, 0x56, 0x20, 0x2A, 0x20, 0x75, 0x5F, 0x53, 0x6F,
0x75, 0x72, 0x63, 0x65, 0x53, 0x69, 0x7A, 0x65, 0x3B, 0x0D, 0x0A, 0x20,
0x20, 0x20, 0x20, 0x66, 0x6C, 0x6F, 0x61, 0x74, 0x20, 0x78, 0x20, 0x3D,
0x20, 0x69, 0x6E, 0x74, 0x28, 0x70, 0x69, 0x78, 0x65, 0x6C, 0x43, 0x6F,
0x6F, 0x72, 0x64, 0x2E, 0x78, 0x29, 0x20, 0x25, 0x20, 0x75, 0x5F, 0x50,
0x69, 0x78, 0x65, 0x6C, 0x53, 0x69, 0x7A, 0x65, 0x3B, 0x0D, 0x0A, 0x20,
0x20, 0x20, 0x20, 0x66, 0x6C, 0x6F, 0x61, 0x74, 0x20, 0x79, 0x20, 0x3D,
0x20, 0x69, 0x6E, 0x74, 0x28, 0x70, 0x69, 0x78, 0x65, 0x6C, 0x43, 0x6F,
0x6F, 0x72, 0x64, 0x2E, 0x79, 0x29, 0x20, 0x25, 0x20, 0x75, 0x5F, 0x50,
0x69, 0x78, 0x65, 0x6C, 0x53, 0x69, 0x7A, 0x65, 0x3B, 0x0D, 0x0A, 0x0D,
0x0A, 0x20, 0x20, 0x20, 0x20, 0x78, 0x20, 0x3D, 0x20, 0x66, 0x6C, 0x6F,
0x6F, 0x72, 0x28, 0x75, 0x5F, 0x50, 0x69, 0x78, 0x65, 0x6C, 0x53, 0x69,
0x7A, 0x65, 0x20, 0x2F, 0x20, 0x32, 0x2E, 0x30, 0x29, 0x20, 0x2D, 0x20,
0x78, 0x3B, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x79, 0x20, 0x3D, 0x20,
0x66, 0x6C, 0x6F, 0x6F, 0x72, 0x28, 0x75, 0x5F, 0x50, 0x69, 0x78, 0x65,
0x6C, 0x53, 0x69, 0x7A, 0x65, 0x20, 0x2F, 0x20, 0x32, 0x2E, 0x30, 0x29,
0x20, 0x2D, 0x20, 0x79, 0x3B, 0x0D, 0x0A, 0x0D, 0x0A, 0x20, 0x20, 0x20,
0x20, 0x78, 0x20, 0x3D, 0x20, 0x70, 0x69, 0x78, 0x65, 0x6C, 0x43, 0x6F,
0x6F, 0x72, 0x64, 0x2E, 0x78, 0x20, 0x2B, 0x20, 0x78, 0x3B, 0x0D, 0x0A,
0x20, 0x20, 0x20, 0x20, 0x79, 0x20, 0x3D, 0x20, 0x70, 0x69, 0x78, 0x65,
0x6C, 0x43, 0x6F, 0x6F, 0x72, 0x64, 0x2E, 0x79, 0x20, 0x2B, 0x20, 0x79,
0x3B, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x46, 0x72, 0x61, 0x67, 0x43,
0x6F, 0x6C, 0x6F, 0x72, 0x20, 0x3D, 0x20, 0x74, 0x65, 0x78, 0x74, 0x75,
0x72, 0x65, 0x28, 0x75, 0x5F, 0x53, 0x6F, 0x75, 0x72, 0x63, 0x65, 0x2C,
0x20, 0x76, 0x65, 0x63, 0x32, 0x28, 0x78, 0x2C, 0x20, 0x79, 0x29, 0x20,
0x2F, 0x20, 0x75, 0x5F, 0x53, 0x6F, 0x75, 0x72, 0x63, 0x65, 0x53, 0x69,
0x7A, 0x65, 0x29, 0x3B, 0x0D, 0x0A, 0x7D,
};
unsigned int Resources_Shaders_pixelization_shader_len = sizeof(Resources_Shaders_pixelization_shader);
// Data for file: Resources_Shaders_posterization_shader_path
const std::string Resources_Shaders_posterization_shader_path = R"(Resources/Shaders/posterization.shader)";
unsigned char Resources_Shaders_posterization_shader[] = {
0x23, 0x73, 0x68, 0x61, 0x64, 0x65, 0x72, 0x20, 0x76, 0x65, 0x72, 0x74,
0x65, 0x78, 0x0D, 0x0A, 0x23, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6F, 0x6E,
0x20, 0x34, 0x34, 0x30, 0x20, 0x63, 0x6F, 0x72, 0x65, 0x0D, 0x0A, 0x0D,
0x0A, 0x6C, 0x61, 0x79, 0x6F, 0x75, 0x74, 0x28, 0x6C, 0x6F, 0x63, 0x61,
0x74, 0x69, 0x6F, 0x6E, 0x20, 0x3D, 0x20, 0x30, 0x29, 0x20, 0x69, 0x6E,
0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x56, 0x65, 0x72, 0x74, 0x65, 0x78,
0x50, 0x6F, 0x73, 0x69, 0x74, 0x69, 0x6F, 0x6E, 0x3B, 0x0D, 0x0A, 0x6C,
0x61, 0x79, 0x6F, 0x75, 0x74, 0x28, 0x6C, 0x6F, 0x63, 0x61, 0x74, 0x69,
0x6F, 0x6E, 0x20, 0x3D, 0x20, 0x31, 0x29, 0x20, 0x69, 0x6E, 0x20, 0x76,
0x65, 0x63, 0x32, 0x20, 0x55, 0x56, 0x50, 0x6F, 0x73, 0x69, 0x74, 0x69,
0x6F, 0x6E, 0x3B, 0x0D, 0x0A, 0x0D, 0x0A, 0x6F, 0x75, 0x74, 0x20, 0x66,
0x6C, 0x61, 0x74, 0x20, 0x76, 0x65, 0x63, 0x32, 0x20, 0x55, 0x56, 0x3B,
0x0D, 0x0A, 0x0D, 0x0A, 0x76, 0x6F, 0x69, 0x64, 0x20, 0x6D, 0x61, 0x69,
0x6E, 0x28, 0x29, 0x0D, 0x0A, 0x7B, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20,
0x55, 0x56, 0x20, 0x3D, 0x20, 0x55, 0x56, 0x50, 0x6F, 0x73, 0x69, 0x74,
0x69, 0x6F, 0x6E, 0x3B, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x67, 0x6C,
0x5F, 0x50, 0x6F, 0x73, 0x69, 0x74, 0x69, 0x6F, 0x6E, 0x20, 0x3D, 0x20,
0x76, 0x65, 0x63, 0x34, 0x28, 0x56, 0x65, 0x72, 0x74, 0x65, 0x78, 0x50,
0x6F, 0x73, 0x69, 0x74, 0x69, 0x6F, 0x6E, 0x2C, 0x20, 0x31, 0x2E, 0x30,
0x66, 0x29, 0x3B, 0x0D, 0x0A, 0x7D, 0x0D, 0x0A, 0x0D, 0x0A, 0x23, 0x73,
0x68, 0x61, 0x64, 0x65, 0x72, 0x20, 0x66, 0x72, 0x61, 0x67, 0x6D, 0x65,
0x6E, 0x74, 0x0D, 0x0A, 0x23, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6F, 0x6E,
0x20, 0x34, 0x34, 0x30, 0x20, 0x63, 0x6F, 0x72, 0x65, 0x0D, 0x0A, 0x0D,
0x0A, 0x75, 0x6E, 0x69, 0x66, 0x6F, 0x72, 0x6D, 0x20, 0x73, 0x61, 0x6D,
0x70, 0x6C, 0x65, 0x72, 0x32, 0x44, 0x20, 0x75, 0x5F, 0x53, 0x6F, 0x75,
0x72, 0x63, 0x65, 0x3B, 0x0D, 0x0A, 0x75, 0x6E, 0x69, 0x66, 0x6F, 0x72,
0x6D, 0x20, 0x69, 0x6E, 0x74, 0x20, 0x75, 0x5F, 0x4C, 0x65, 0x76, 0x65,
0x6C, 0x73, 0x20, 0x3D, 0x20, 0x31, 0x30, 0x3B, 0x0D, 0x0A, 0x69, 0x6E,
0x20, 0x76, 0x65, 0x63, 0x32, 0x20, 0x55, 0x56, 0x3B, 0x0D, 0x0A, 0x0D,
0x0A, 0x6F, 0x75, 0x74, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x46, 0x72,
0x61, 0x67, 0x43, 0x6F, 0x6C, 0x6F, 0x72, 0x3B, 0x0D, 0x0A, 0x0D, 0x0A,
0x2F, 0x2F, 0x20, 0x49, 0x6D, 0x70, 0x6C, 0x65, 0x6D, 0x65, 0x6E, 0x74,
0x61, 0x74, 0x69, 0x6F, 0x6E, 0x20, 0x66, 0x72, 0x6F, 0x6D, 0x3A, 0x20,
0x68, 0x74, 0x74, 0x70, 0x73, 0x3A, 0x2F, 0x2F, 0x6C, 0x65, 0x74, 0x74,
0x69, 0x65, 0x72, 0x2E, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2E, 0x69,
0x6F, 0x2F, 0x33, 0x64, 0x2D, 0x67, 0x61, 0x6D, 0x65, 0x2D, 0x73, 0x68,
0x61, 0x64, 0x65, 0x72, 0x73, 0x2D, 0x66, 0x6F, 0x72, 0x2D, 0x62, 0x65,
0x67, 0x69, 0x6E, 0x6E, 0x65, 0x72, 0x73, 0x2F, 0x70, 0x6F, 0x73, 0x74,
0x65, 0x72, 0x69, 0x7A, 0x61, 0x74, 0x69, 0x6F, 0x6E, 0x2E, 0x68, 0x74,
0x6D, 0x6C, 0x0D, 0x0A, 0x76, 0x6F, 0x69, 0x64, 0x20, 0x6D, 0x61, 0x69,
0x6E, 0x28, 0x29, 0x0D, 0x0A, 0x7B, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20,
0x76, 0x65, 0x63, 0x34, 0x20, 0x66, 0x72, 0x61, 0x6D, 0x65, 0x43, 0x6F,
0x6C, 0x6F, 0x72, 0x20, 0x3D, 0x20, 0x74, 0x65, 0x78, 0x74, 0x75, 0x72,
0x65, 0x28, 0x75, 0x5F, 0x53, 0x6F, 0x75, 0x72, 0x63, 0x65, 0x2C, 0x20,
0x55, 0x56, 0x29, 0x3B, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6C,
0x6F, 0x61, 0x74, 0x20, 0x67, 0x72, 0x65, 0x79, 0x73, 0x63, 0x61, 0x6C,
0x65, 0x20, 0x3D, 0x20, 0x6D, 0x61, 0x78, 0x28, 0x66, 0x72, 0x61, 0x6D,
0x65, 0x43, 0x6F, 0x6C, 0x6F, 0x72, 0x2E, 0x72, 0x2C, 0x20, 0x6D, 0x61,
0x78, 0x28, 0x66, 0x72, 0x61, 0x6D, 0x65, 0x43, 0x6F, 0x6C, 0x6F, 0x72,
0x2E, 0x67, 0x2C, 0x20, 0x66, 0x72, 0x61, 0x6D, 0x65, 0x43, 0x6F, 0x6C,
0x6F, 0x72, 0x2E, 0x62, 0x29, 0x29, 0x3B, 0x0D, 0x0A, 0x20, 0x20, 0x20,
0x20, 0x66, 0x6C, 0x6F, 0x61, 0x74, 0x20, 0x6C, 0x6F, 0x77, 0x65, 0x72,
0x20, 0x3D, 0x20, 0x66, 0x6C, 0x6F, 0x6F, 0x72, 0x28, 0x67, 0x72, 0x65,
0x79, 0x73, 0x63, 0x61, 0x6C, 0x65, 0x20, 0x2A, 0x20, 0x75, 0x5F, 0x4C,
0x65, 0x76, 0x65, 0x6C, 0x73, 0x29, 0x20, 0x2F, 0x20, 0x75, 0x5F, 0x4C,
0x65, 0x76, 0x65, 0x6C, 0x73, 0x3B, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20,
0x66, 0x6C, 0x6F, 0x61, 0x74, 0x20, 0x6C, 0x6F, 0x77, 0x65, 0x72, 0x44,
0x69, 0x66, 0x66, 0x20, 0x3D, 0x20, 0x61, 0x62, 0x73, 0x28, 0x67, 0x72,
0x65, 0x79, 0x73, 0x63, 0x61, 0x6C, 0x65, 0x20, 0x2D, 0x20, 0x6C, 0x6F,
0x77, 0x65, 0x72, 0x29, 0x3B, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x66,
0x6C, 0x6F, 0x61, 0x74, 0x20, 0x75, 0x70, 0x70, 0x65, 0x72, 0x20, 0x20,
0x20, 0x20, 0x20, 0x3D, 0x20, 0x63, 0x65, 0x69, 0x6C, 0x28, 0x67, 0x72,
0x65, 0x79, 0x73, 0x63, 0x61, 0x6C, 0x65, 0x20, 0x2A, 0x20, 0x75, 0x5F,
0x4C, 0x65, 0x76, 0x65, 0x6C, 0x73, 0x29, 0x20, 0x2F, 0x20, 0x75, 0x5F,
0x4C, 0x65, 0x76, 0x65, 0x6C, 0x73, 0x3B, 0x0D, 0x0A, 0x20, 0x20, 0x20,
0x20, 0x66, 0x6C, 0x6F, 0x61, 0x74, 0x20, 0x75, 0x70, 0x70, 0x65, 0x72,
0x44, 0x69, 0x66, 0x66, 0x20, 0x3D, 0x20, 0x61, 0x62, 0x73, 0x28, 0x75,
0x70, 0x70, 0x65, 0x72, 0x20, 0x2D, 0x20, 0x67, 0x72, 0x65, 0x79, 0x73,
0x63, 0x61, 0x6C, 0x65, 0x29, 0x3B, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20,
0x66, 0x6C, 0x6F, 0x61, 0x74, 0x20, 0x6C, 0x65, 0x76, 0x65, 0x6C, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x3D, 0x20, 0x6C, 0x6F, 0x77, 0x65, 0x72,
0x44, 0x69, 0x66, 0x66, 0x20, 0x3C, 0x3D, 0x20, 0x75, 0x70, 0x70, 0x65,
0x72, 0x44, 0x69, 0x66, 0x66, 0x20, 0x3F, 0x20, 0x6C, 0x6F, 0x77, 0x65,
0x72, 0x20, 0x3A, 0x20, 0x75, 0x70, 0x70, 0x65, 0x72, 0x3B, 0x0D, 0x0A,
0x20, 0x20, 0x20, 0x20, 0x66, 0x6C, 0x6F, 0x61, 0x74, 0x20, 0x61, 0x64,
0x6A, 0x75, 0x73, 0x74, 0x6D, 0x65, 0x6E, 0x74, 0x20, 0x3D, 0x20, 0x6C,
0x65, 0x76, 0x65, 0x6C, 0x20, 0x2F, 0x20, 0x67, 0x72, 0x65, 0x79, 0x73,
0x63, 0x61, 0x6C, 0x65, 0x3B, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x46,
0x72, 0x61, 0x67, 0x43, 0x6F, 0x6C, 0x6F, 0x72, 0x20, 0x3D, 0x20, 0x66,
0x72, 0x61, 0x6D, 0x65, 0x43, 0x6F, 0x6C, 0x6F, 0x72, 0x20, 0x2A, 0x20,
0x61, 0x64, 0x6A, 0x75, 0x73, 0x74, 0x6D, 0x65, 0x6E, 0x74, 0x3B, 0x0D,
0x0A, 0x7D,
};
unsigned int Resources_Shaders_posterization_shader_len = sizeof(Resources_Shaders_posterization_shader);
// Data for file: Resources_Shaders_sdf_text_shader_path
const std::string Resources_Shaders_sdf_text_shader_path = R"(Resources/Shaders/sdf_text.shader)";
unsigned char Resources_Shaders_sdf_text_shader[] = {

View File

@@ -236,6 +236,12 @@ namespace Nuake {
extern const std::string Resources_Shaders_pbr_shader_path;
extern unsigned int Resources_Shaders_pbr_shader_len;
extern unsigned char Resources_Shaders_pbr_shader[];
extern const std::string Resources_Shaders_pixelization_shader_path;
extern unsigned int Resources_Shaders_pixelization_shader_len;
extern unsigned char Resources_Shaders_pixelization_shader[];
extern const std::string Resources_Shaders_posterization_shader_path;
extern unsigned int Resources_Shaders_posterization_shader_len;
extern unsigned char Resources_Shaders_posterization_shader[];
extern const std::string Resources_Shaders_sdf_text_shader_path;
extern unsigned int Resources_Shaders_sdf_text_shader_len;
extern unsigned char Resources_Shaders_sdf_text_shader[];

View File

@@ -79,6 +79,12 @@ namespace Nuake
float VignetteIntensity = 15.0f;
float VignetteExtend = 0.5f;
bool PosterizationEnabled = false;
int PosterizationLevels = 10;
bool PixelizationEnabled = false;
int PixelSize = 4;
Vector3 ClearColor;
glm::vec4 m_AmbientColor;

View File

@@ -23,6 +23,9 @@ uniform float u_Exposure;
uniform float u_Gamma;
uniform sampler2D u_Source2;
uniform vec2 u_Source2Size;
uniform int u_HasLensDirt;
uniform sampler2D u_LensDirt;
uniform float u_LensDirtIntensity;
uniform float u_Threshold;
uniform float u_BlurAmount;
@@ -127,6 +130,13 @@ void main()
}
else if (u_Stage == 5) // Final combine
{
vec4 lensDirt = vec4(0.0f);
if(u_HasLensDirt == 1)
{
lensDirt = max(texture(u_LensDirt, UV) * u_LensDirtIntensity, 1.0 - u_LensDirtIntensity);
}
outputColor *= lensDirt;
outputColor += texture(u_Source2, UV);
vec3 color = outputColor.rgb;

View File

@@ -0,0 +1,40 @@
#shader vertex
#version 440 core
layout(location = 0) in vec3 VertexPosition;
layout(location = 1) in vec2 UVPosition;
out flat vec2 UV;
void main()
{
UV = UVPosition;
gl_Position = vec4(VertexPosition, 1.0f);
}
#shader fragment
#version 440 core
uniform int u_PixelSize = 4;
uniform sampler2D u_Source;
uniform vec2 u_SourceSize;
in vec2 UV;
out vec4 FragColor;
// Implementation from: https://lettier.github.io/3d-game-shaders-for-beginners/pixelization.html
void main()
{
vec2 pixelCoord = UV * u_SourceSize;
float x = int(pixelCoord.x) % u_PixelSize;
float y = int(pixelCoord.y) % u_PixelSize;
x = floor(u_PixelSize / 2.0) - x;
y = floor(u_PixelSize / 2.0) - y;
x = pixelCoord.x + x;
y = pixelCoord.y + y;
FragColor = texture(u_Source, vec2(x, y) / u_SourceSize);
}

View File

@@ -0,0 +1,36 @@
#shader vertex
#version 440 core
layout(location = 0) in vec3 VertexPosition;
layout(location = 1) in vec2 UVPosition;
out flat vec2 UV;
void main()
{
UV = UVPosition;
gl_Position = vec4(VertexPosition, 1.0f);
}
#shader fragment
#version 440 core
uniform sampler2D u_Source;
uniform int u_Levels = 10;
in vec2 UV;
out vec4 FragColor;
// Implementation from: https://lettier.github.io/3d-game-shaders-for-beginners/posterization.html
void main()
{
vec4 frameColor = texture(u_Source, UV);
float greyscale = max(frameColor.r, max(frameColor.g, frameColor.b));
float lower = floor(greyscale * u_Levels) / u_Levels;
float lowerDiff = abs(greyscale - lower);
float upper = ceil(greyscale * u_Levels) / u_Levels;
float upperDiff = abs(upper - greyscale);
float level = lowerDiff <= upperDiff ? lower : upper;
float adjustment = level / greyscale;
FragColor = frameColor * adjustment;
}