From 2c48590a4a4de4dee97bd0a6ebdade2ec73ff05e Mon Sep 17 00:00:00 2001 From: Antoine Pilote Date: Tue, 10 Sep 2024 19:18:29 -0400 Subject: [PATCH] Added shaders for UI and fixed UI renderer --- Editor/src/EditorApplication.cpp | 10 - Editor/src/EditorLayer.cpp | 3 +- Nuake/src/Rendering/Shaders/ShaderManager.cpp | 2 + Nuake/src/Resource/StaticResources.cpp | 493 ++++++++++++++++++ Nuake/src/Resource/StaticResources.h | 6 + Nuake/src/UI/Renderer.cpp | 177 +++---- Nuake/src/UI/Renderer.h | 4 +- Resources/Shaders/ui_panel.shader | 116 +++++ Resources/Shaders/ui_text.shader | 93 ++++ 9 files changed, 799 insertions(+), 105 deletions(-) create mode 100644 Resources/Shaders/ui_text.shader diff --git a/Editor/src/EditorApplication.cpp b/Editor/src/EditorApplication.cpp index bd493e07..1af94228 100644 --- a/Editor/src/EditorApplication.cpp +++ b/Editor/src/EditorApplication.cpp @@ -72,16 +72,6 @@ void EditorApplication::OnInit() Engine::GetCurrentScene()->Save(); } }); - - NuakeUI::CanvasParser parser; - Ref canvas = parser.Parse("test.html"); - - static MyInputManager inputManager(*m_Window); - - canvas->SetInputManager(&inputManager); - canvas->ComputeLayout({1920, 1080}); - canvas->Tick(); - canvas->Draw(); PushLayer(CreateScope()); } diff --git a/Editor/src/EditorLayer.cpp b/Editor/src/EditorLayer.cpp index b65318d6..c1a1cead 100644 --- a/Editor/src/EditorLayer.cpp +++ b/Editor/src/EditorLayer.cpp @@ -57,10 +57,9 @@ void EditorLayer::OnUpdate() { m_GizmoDrawer->DrawGizmos(currentScene, false); } - - } } + sceneFramebuffer->Unbind(); } diff --git a/Nuake/src/Rendering/Shaders/ShaderManager.cpp b/Nuake/src/Rendering/Shaders/ShaderManager.cpp index 2b377eb2..d694501a 100644 --- a/Nuake/src/Rendering/Shaders/ShaderManager.cpp +++ b/Nuake/src/Rendering/Shaders/ShaderManager.cpp @@ -45,6 +45,8 @@ namespace Nuake LoadEmbeddedShader(Resources_Shaders_debugLine_shader); LoadEmbeddedShader(Resources_Shaders_add_shader); LoadEmbeddedShader(Resources_Shaders_display_depth_shader); + LoadEmbeddedShader(Resources_Shaders_ui_panel_shader); + LoadEmbeddedShader(Resources_Shaders_ui_text_shader); } Shader* ShaderManager::GetShader(const std::string& path) diff --git a/Nuake/src/Resource/StaticResources.cpp b/Nuake/src/Resource/StaticResources.cpp index 4157d4e6..d23c1746 100644 --- a/Nuake/src/Resource/StaticResources.cpp +++ b/Nuake/src/Resource/StaticResources.cpp @@ -274912,6 +274912,499 @@ namespace Nuake { }; unsigned int Resources_Shaders_ui_shader_len = sizeof(Resources_Shaders_ui_shader); + // Data for file: Resources_Shaders_ui_panel_shader_path + const std::string Resources_Shaders_ui_panel_shader_path = R"(Resources/Shaders/ui_panel.shader)"; + unsigned char Resources_Shaders_ui_panel_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, 0x36, 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, 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, + 0x3B, 0x0D, 0x0A, 0x0D, 0x0A, 0x75, 0x6E, 0x69, 0x66, 0x6F, 0x72, 0x6D, + 0x20, 0x6D, 0x61, 0x74, 0x34, 0x20, 0x75, 0x5F, 0x4D, 0x6F, 0x64, 0x65, + 0x6C, 0x3B, 0x0D, 0x0A, 0x75, 0x6E, 0x69, 0x66, 0x6F, 0x72, 0x6D, 0x20, + 0x6D, 0x61, 0x74, 0x34, 0x20, 0x75, 0x5F, 0x56, 0x69, 0x65, 0x77, 0x3B, + 0x0D, 0x0A, 0x0D, 0x0A, 0x6F, 0x75, 0x74, 0x20, 0x76, 0x65, 0x63, 0x32, + 0x20, 0x76, 0x5F, 0x55, 0x56, 0x3B, 0x0D, 0x0A, 0x0D, 0x0A, 0x76, 0x6F, + 0x69, 0x64, 0x20, 0x6D, 0x61, 0x69, 0x6E, 0x28, 0x29, 0x20, 0x7B, 0x0D, + 0x0A, 0x09, 0x76, 0x5F, 0x55, 0x56, 0x20, 0x3D, 0x20, 0x55, 0x56, 0x3B, + 0x0D, 0x0A, 0x09, 0x67, 0x6C, 0x5F, 0x50, 0x6F, 0x73, 0x69, 0x74, 0x69, + 0x6F, 0x6E, 0x20, 0x3D, 0x20, 0x75, 0x5F, 0x56, 0x69, 0x65, 0x77, 0x20, + 0x2A, 0x20, 0x75, 0x5F, 0x4D, 0x6F, 0x64, 0x65, 0x6C, 0x20, 0x2A, 0x20, + 0x76, 0x65, 0x63, 0x34, 0x28, 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, 0x36, 0x30, 0x20, 0x63, + 0x6F, 0x72, 0x65, 0x0D, 0x0A, 0x0D, 0x0A, 0x69, 0x6E, 0x20, 0x76, 0x65, + 0x63, 0x32, 0x20, 0x76, 0x5F, 0x55, 0x56, 0x3B, 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, 0x75, 0x6E, 0x69, + 0x66, 0x6F, 0x72, 0x6D, 0x20, 0x76, 0x65, 0x63, 0x32, 0x20, 0x75, 0x5F, + 0x53, 0x69, 0x7A, 0x65, 0x3B, 0x0D, 0x0A, 0x75, 0x6E, 0x69, 0x66, 0x6F, + 0x72, 0x6D, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x75, 0x5F, 0x43, 0x6F, + 0x6C, 0x6F, 0x72, 0x3B, 0x0D, 0x0A, 0x75, 0x6E, 0x69, 0x66, 0x6F, 0x72, + 0x6D, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x75, 0x5F, 0x42, 0x6F, 0x72, + 0x64, 0x65, 0x72, 0x43, 0x6F, 0x6C, 0x6F, 0x72, 0x3B, 0x0D, 0x0A, 0x75, + 0x6E, 0x69, 0x66, 0x6F, 0x72, 0x6D, 0x20, 0x66, 0x6C, 0x6F, 0x61, 0x74, + 0x20, 0x75, 0x5F, 0x42, 0x6F, 0x72, 0x64, 0x65, 0x72, 0x3B, 0x0D, 0x0A, + 0x75, 0x6E, 0x69, 0x66, 0x6F, 0x72, 0x6D, 0x20, 0x66, 0x6C, 0x6F, 0x61, + 0x74, 0x20, 0x75, 0x5F, 0x42, 0x6F, 0x72, 0x64, 0x65, 0x72, 0x52, 0x61, + 0x64, 0x69, 0x75, 0x73, 0x3B, 0x0D, 0x0A, 0x75, 0x6E, 0x69, 0x66, 0x6F, + 0x72, 0x6D, 0x20, 0x73, 0x61, 0x6D, 0x70, 0x6C, 0x65, 0x72, 0x32, 0x44, + 0x20, 0x75, 0x5F, 0x42, 0x61, 0x63, 0x6B, 0x67, 0x72, 0x6F, 0x75, 0x6E, + 0x64, 0x49, 0x6D, 0x61, 0x67, 0x65, 0x3B, 0x0D, 0x0A, 0x75, 0x6E, 0x69, + 0x66, 0x6F, 0x72, 0x6D, 0x20, 0x66, 0x6C, 0x6F, 0x61, 0x74, 0x20, 0x75, + 0x5F, 0x48, 0x61, 0x73, 0x42, 0x61, 0x63, 0x6B, 0x67, 0x72, 0x6F, 0x75, + 0x6E, 0x64, 0x49, 0x6D, 0x61, 0x67, 0x65, 0x3B, 0x0D, 0x0A, 0x0D, 0x0A, + 0x66, 0x6C, 0x6F, 0x61, 0x74, 0x20, 0x53, 0x68, 0x6F, 0x75, 0x6C, 0x64, + 0x44, 0x69, 0x73, 0x63, 0x61, 0x72, 0x64, 0x28, 0x76, 0x65, 0x63, 0x32, + 0x20, 0x63, 0x6F, 0x6F, 0x72, 0x64, 0x73, 0x2C, 0x20, 0x66, 0x6C, 0x6F, + 0x61, 0x74, 0x20, 0x62, 0x6F, 0x72, 0x64, 0x65, 0x72, 0x2C, 0x20, 0x76, + 0x65, 0x63, 0x32, 0x20, 0x64, 0x69, 0x6D, 0x65, 0x6E, 0x73, 0x69, 0x6F, + 0x6E, 0x73, 0x2C, 0x20, 0x66, 0x6C, 0x6F, 0x61, 0x74, 0x20, 0x72, 0x61, + 0x64, 0x69, 0x75, 0x73, 0x29, 0x0D, 0x0A, 0x7B, 0x0D, 0x0A, 0x20, 0x20, + 0x20, 0x20, 0x76, 0x65, 0x63, 0x32, 0x20, 0x63, 0x69, 0x72, 0x63, 0x6C, + 0x65, 0x5F, 0x63, 0x65, 0x6E, 0x74, 0x65, 0x72, 0x20, 0x3D, 0x20, 0x76, + 0x65, 0x63, 0x32, 0x28, 0x72, 0x61, 0x64, 0x69, 0x75, 0x73, 0x20, 0x2B, + 0x20, 0x62, 0x6F, 0x72, 0x64, 0x65, 0x72, 0x2C, 0x20, 0x72, 0x61, 0x64, + 0x69, 0x75, 0x73, 0x20, 0x2B, 0x20, 0x62, 0x6F, 0x72, 0x64, 0x65, 0x72, + 0x29, 0x20, 0x2D, 0x20, 0x76, 0x65, 0x63, 0x32, 0x28, 0x30, 0x2E, 0x35, + 0x2C, 0x20, 0x30, 0x2E, 0x35, 0x29, 0x3B, 0x0D, 0x0A, 0x20, 0x20, 0x20, + 0x20, 0x66, 0x6C, 0x6F, 0x61, 0x74, 0x20, 0x64, 0x73, 0x74, 0x20, 0x3D, + 0x20, 0x6C, 0x65, 0x6E, 0x67, 0x74, 0x68, 0x28, 0x63, 0x6F, 0x6F, 0x72, + 0x64, 0x73, 0x20, 0x2D, 0x20, 0x63, 0x69, 0x72, 0x63, 0x6C, 0x65, 0x5F, + 0x63, 0x65, 0x6E, 0x74, 0x65, 0x72, 0x29, 0x3B, 0x0D, 0x0A, 0x20, 0x20, + 0x20, 0x20, 0x66, 0x6C, 0x6F, 0x61, 0x74, 0x20, 0x64, 0x65, 0x6C, 0x74, + 0x61, 0x20, 0x3D, 0x20, 0x66, 0x77, 0x69, 0x64, 0x74, 0x68, 0x28, 0x64, + 0x73, 0x74, 0x29, 0x3B, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, + 0x20, 0x28, 0x63, 0x6F, 0x6F, 0x72, 0x64, 0x73, 0x2E, 0x78, 0x20, 0x3C, + 0x20, 0x63, 0x69, 0x72, 0x63, 0x6C, 0x65, 0x5F, 0x63, 0x65, 0x6E, 0x74, + 0x65, 0x72, 0x2E, 0x78, 0x20, 0x26, 0x26, 0x20, 0x63, 0x6F, 0x6F, 0x72, + 0x64, 0x73, 0x2E, 0x79, 0x20, 0x3C, 0x20, 0x63, 0x69, 0x72, 0x63, 0x6C, + 0x65, 0x5F, 0x63, 0x65, 0x6E, 0x74, 0x65, 0x72, 0x2E, 0x79, 0x29, 0x20, + 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, + 0x74, 0x75, 0x72, 0x6E, 0x20, 0x31, 0x2E, 0x30, 0x20, 0x2D, 0x20, 0x73, + 0x6D, 0x6F, 0x6F, 0x74, 0x68, 0x73, 0x74, 0x65, 0x70, 0x28, 0x72, 0x61, + 0x64, 0x69, 0x75, 0x73, 0x20, 0x2D, 0x20, 0x64, 0x65, 0x6C, 0x74, 0x61, + 0x2C, 0x20, 0x72, 0x61, 0x64, 0x69, 0x75, 0x73, 0x2C, 0x20, 0x64, 0x73, + 0x74, 0x29, 0x3B, 0x0D, 0x0A, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x63, + 0x69, 0x72, 0x63, 0x6C, 0x65, 0x5F, 0x63, 0x65, 0x6E, 0x74, 0x65, 0x72, + 0x2E, 0x78, 0x20, 0x2B, 0x3D, 0x20, 0x64, 0x69, 0x6D, 0x65, 0x6E, 0x73, + 0x69, 0x6F, 0x6E, 0x73, 0x2E, 0x78, 0x20, 0x2D, 0x20, 0x32, 0x20, 0x2A, + 0x20, 0x28, 0x72, 0x61, 0x64, 0x69, 0x75, 0x73, 0x20, 0x2B, 0x20, 0x62, + 0x6F, 0x72, 0x64, 0x65, 0x72, 0x29, 0x20, 0x2B, 0x20, 0x31, 0x2E, 0x66, + 0x3B, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x64, 0x73, 0x74, 0x20, 0x3D, + 0x20, 0x6C, 0x65, 0x6E, 0x67, 0x74, 0x68, 0x28, 0x63, 0x6F, 0x6F, 0x72, + 0x64, 0x73, 0x20, 0x2D, 0x20, 0x63, 0x69, 0x72, 0x63, 0x6C, 0x65, 0x5F, + 0x63, 0x65, 0x6E, 0x74, 0x65, 0x72, 0x29, 0x3B, 0x0D, 0x0A, 0x20, 0x20, + 0x20, 0x20, 0x64, 0x65, 0x6C, 0x74, 0x61, 0x20, 0x3D, 0x20, 0x66, 0x77, + 0x69, 0x64, 0x74, 0x68, 0x28, 0x64, 0x73, 0x74, 0x29, 0x3B, 0x0D, 0x0A, + 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x63, 0x6F, 0x6F, 0x72, + 0x64, 0x73, 0x2E, 0x78, 0x20, 0x3E, 0x20, 0x63, 0x69, 0x72, 0x63, 0x6C, + 0x65, 0x5F, 0x63, 0x65, 0x6E, 0x74, 0x65, 0x72, 0x2E, 0x78, 0x20, 0x26, + 0x26, 0x20, 0x63, 0x6F, 0x6F, 0x72, 0x64, 0x73, 0x2E, 0x79, 0x20, 0x3C, + 0x20, 0x63, 0x69, 0x72, 0x63, 0x6C, 0x65, 0x5F, 0x63, 0x65, 0x6E, 0x74, + 0x65, 0x72, 0x2E, 0x79, 0x29, 0x20, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6E, 0x20, 0x31, + 0x2E, 0x30, 0x20, 0x2D, 0x20, 0x73, 0x6D, 0x6F, 0x6F, 0x74, 0x68, 0x73, + 0x74, 0x65, 0x70, 0x28, 0x72, 0x61, 0x64, 0x69, 0x75, 0x73, 0x20, 0x2D, + 0x20, 0x64, 0x65, 0x6C, 0x74, 0x61, 0x2C, 0x20, 0x72, 0x61, 0x64, 0x69, + 0x75, 0x73, 0x2C, 0x20, 0x64, 0x73, 0x74, 0x29, 0x3B, 0x0D, 0x0A, 0x0D, + 0x0A, 0x20, 0x20, 0x20, 0x20, 0x63, 0x69, 0x72, 0x63, 0x6C, 0x65, 0x5F, + 0x63, 0x65, 0x6E, 0x74, 0x65, 0x72, 0x2E, 0x79, 0x20, 0x2B, 0x3D, 0x20, + 0x64, 0x69, 0x6D, 0x65, 0x6E, 0x73, 0x69, 0x6F, 0x6E, 0x73, 0x2E, 0x79, + 0x20, 0x2D, 0x20, 0x32, 0x20, 0x2A, 0x20, 0x28, 0x72, 0x61, 0x64, 0x69, + 0x75, 0x73, 0x20, 0x2B, 0x20, 0x62, 0x6F, 0x72, 0x64, 0x65, 0x72, 0x29, + 0x20, 0x2B, 0x20, 0x31, 0x2E, 0x66, 0x3B, 0x0D, 0x0A, 0x20, 0x20, 0x20, + 0x20, 0x64, 0x73, 0x74, 0x20, 0x3D, 0x20, 0x6C, 0x65, 0x6E, 0x67, 0x74, + 0x68, 0x28, 0x63, 0x6F, 0x6F, 0x72, 0x64, 0x73, 0x20, 0x2D, 0x20, 0x63, + 0x69, 0x72, 0x63, 0x6C, 0x65, 0x5F, 0x63, 0x65, 0x6E, 0x74, 0x65, 0x72, + 0x29, 0x3B, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x64, 0x65, 0x6C, 0x74, + 0x61, 0x20, 0x3D, 0x20, 0x66, 0x77, 0x69, 0x64, 0x74, 0x68, 0x28, 0x64, + 0x73, 0x74, 0x29, 0x3B, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, + 0x20, 0x28, 0x63, 0x6F, 0x6F, 0x72, 0x64, 0x73, 0x2E, 0x78, 0x20, 0x3E, + 0x20, 0x63, 0x69, 0x72, 0x63, 0x6C, 0x65, 0x5F, 0x63, 0x65, 0x6E, 0x74, + 0x65, 0x72, 0x2E, 0x78, 0x20, 0x26, 0x26, 0x20, 0x63, 0x6F, 0x6F, 0x72, + 0x64, 0x73, 0x2E, 0x79, 0x20, 0x3E, 0x20, 0x63, 0x69, 0x72, 0x63, 0x6C, + 0x65, 0x5F, 0x63, 0x65, 0x6E, 0x74, 0x65, 0x72, 0x2E, 0x79, 0x29, 0x20, + 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, + 0x74, 0x75, 0x72, 0x6E, 0x20, 0x31, 0x2E, 0x30, 0x20, 0x2D, 0x20, 0x73, + 0x6D, 0x6F, 0x6F, 0x74, 0x68, 0x73, 0x74, 0x65, 0x70, 0x28, 0x72, 0x61, + 0x64, 0x69, 0x75, 0x73, 0x20, 0x2D, 0x20, 0x64, 0x65, 0x6C, 0x74, 0x61, + 0x2C, 0x20, 0x72, 0x61, 0x64, 0x69, 0x75, 0x73, 0x2C, 0x20, 0x64, 0x73, + 0x74, 0x29, 0x3B, 0x20, 0x0D, 0x0A, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, + 0x63, 0x69, 0x72, 0x63, 0x6C, 0x65, 0x5F, 0x63, 0x65, 0x6E, 0x74, 0x65, + 0x72, 0x2E, 0x78, 0x20, 0x2D, 0x3D, 0x20, 0x64, 0x69, 0x6D, 0x65, 0x6E, + 0x73, 0x69, 0x6F, 0x6E, 0x73, 0x2E, 0x78, 0x20, 0x2D, 0x20, 0x32, 0x20, + 0x2A, 0x20, 0x28, 0x72, 0x61, 0x64, 0x69, 0x75, 0x73, 0x20, 0x2B, 0x20, + 0x62, 0x6F, 0x72, 0x64, 0x65, 0x72, 0x29, 0x20, 0x2B, 0x20, 0x31, 0x2E, + 0x66, 0x3B, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x64, 0x73, 0x74, 0x20, + 0x3D, 0x20, 0x6C, 0x65, 0x6E, 0x67, 0x74, 0x68, 0x28, 0x63, 0x6F, 0x6F, + 0x72, 0x64, 0x73, 0x20, 0x2D, 0x20, 0x63, 0x69, 0x72, 0x63, 0x6C, 0x65, + 0x5F, 0x63, 0x65, 0x6E, 0x74, 0x65, 0x72, 0x29, 0x3B, 0x0D, 0x0A, 0x20, + 0x20, 0x20, 0x20, 0x64, 0x65, 0x6C, 0x74, 0x61, 0x20, 0x3D, 0x20, 0x66, + 0x77, 0x69, 0x64, 0x74, 0x68, 0x28, 0x64, 0x73, 0x74, 0x29, 0x3B, 0x0D, + 0x0A, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x63, 0x6F, 0x6F, + 0x72, 0x64, 0x73, 0x2E, 0x78, 0x20, 0x3C, 0x20, 0x63, 0x69, 0x72, 0x63, + 0x6C, 0x65, 0x5F, 0x63, 0x65, 0x6E, 0x74, 0x65, 0x72, 0x2E, 0x78, 0x20, + 0x26, 0x26, 0x20, 0x63, 0x6F, 0x6F, 0x72, 0x64, 0x73, 0x2E, 0x79, 0x20, + 0x3E, 0x20, 0x63, 0x69, 0x72, 0x63, 0x6C, 0x65, 0x5F, 0x63, 0x65, 0x6E, + 0x74, 0x65, 0x72, 0x2E, 0x79, 0x29, 0x20, 0x0D, 0x0A, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6E, 0x20, + 0x31, 0x2E, 0x30, 0x20, 0x2D, 0x20, 0x73, 0x6D, 0x6F, 0x6F, 0x74, 0x68, + 0x73, 0x74, 0x65, 0x70, 0x28, 0x72, 0x61, 0x64, 0x69, 0x75, 0x73, 0x20, + 0x2D, 0x20, 0x64, 0x65, 0x6C, 0x74, 0x61, 0x2C, 0x20, 0x72, 0x61, 0x64, + 0x69, 0x75, 0x73, 0x2C, 0x20, 0x64, 0x73, 0x74, 0x29, 0x3B, 0x0D, 0x0A, + 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6E, + 0x20, 0x31, 0x2E, 0x66, 0x3B, 0x0D, 0x0A, 0x0D, 0x0A, 0x7D, 0x0D, 0x0A, + 0x0D, 0x0A, 0x76, 0x6F, 0x69, 0x64, 0x20, 0x6D, 0x61, 0x69, 0x6E, 0x28, + 0x29, 0x20, 0x7B, 0x20, 0x0D, 0x0A, 0x09, 0x76, 0x65, 0x63, 0x32, 0x20, + 0x63, 0x6F, 0x6F, 0x72, 0x64, 0x73, 0x20, 0x3D, 0x20, 0x76, 0x5F, 0x55, + 0x56, 0x20, 0x2A, 0x20, 0x75, 0x5F, 0x53, 0x69, 0x7A, 0x65, 0x3B, 0x0D, + 0x0A, 0x09, 0x76, 0x65, 0x63, 0x32, 0x20, 0x63, 0x65, 0x6E, 0x74, 0x65, + 0x72, 0x20, 0x3D, 0x20, 0x75, 0x5F, 0x53, 0x69, 0x7A, 0x65, 0x20, 0x2F, + 0x20, 0x32, 0x2E, 0x30, 0x3B, 0x0D, 0x0A, 0x09, 0x76, 0x65, 0x63, 0x34, + 0x20, 0x66, 0x69, 0x6E, 0x61, 0x6C, 0x43, 0x6F, 0x6C, 0x6F, 0x72, 0x20, + 0x3D, 0x20, 0x75, 0x5F, 0x43, 0x6F, 0x6C, 0x6F, 0x72, 0x3B, 0x0D, 0x0A, + 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x74, + 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x43, 0x6F, 0x6C, 0x6F, 0x72, 0x20, + 0x3D, 0x20, 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x28, 0x75, 0x5F, + 0x42, 0x61, 0x63, 0x6B, 0x67, 0x72, 0x6F, 0x75, 0x6E, 0x64, 0x49, 0x6D, + 0x61, 0x67, 0x65, 0x2C, 0x20, 0x76, 0x5F, 0x55, 0x56, 0x29, 0x3B, 0x0D, + 0x0A, 0x09, 0x66, 0x69, 0x6E, 0x61, 0x6C, 0x43, 0x6F, 0x6C, 0x6F, 0x72, + 0x2E, 0x72, 0x67, 0x62, 0x20, 0x3D, 0x20, 0x6D, 0x69, 0x78, 0x28, 0x66, + 0x69, 0x6E, 0x61, 0x6C, 0x43, 0x6F, 0x6C, 0x6F, 0x72, 0x2C, 0x20, 0x74, + 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x43, 0x6F, 0x6C, 0x6F, 0x72, 0x2C, + 0x20, 0x75, 0x5F, 0x48, 0x61, 0x73, 0x42, 0x61, 0x63, 0x6B, 0x67, 0x72, + 0x6F, 0x75, 0x6E, 0x64, 0x49, 0x6D, 0x61, 0x67, 0x65, 0x29, 0x2E, 0x72, + 0x67, 0x62, 0x3B, 0x0D, 0x0A, 0x0D, 0x0A, 0x09, 0x69, 0x66, 0x20, 0x28, + 0x75, 0x5F, 0x48, 0x61, 0x73, 0x42, 0x61, 0x63, 0x6B, 0x67, 0x72, 0x6F, + 0x75, 0x6E, 0x64, 0x49, 0x6D, 0x61, 0x67, 0x65, 0x20, 0x3D, 0x3D, 0x20, + 0x31, 0x2E, 0x30, 0x29, 0x0D, 0x0A, 0x09, 0x7B, 0x0D, 0x0A, 0x09, 0x09, + 0x66, 0x69, 0x6E, 0x61, 0x6C, 0x43, 0x6F, 0x6C, 0x6F, 0x72, 0x2E, 0x61, + 0x20, 0x3D, 0x20, 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x43, 0x6F, + 0x6C, 0x6F, 0x72, 0x2E, 0x61, 0x3B, 0x0D, 0x0A, 0x09, 0x7D, 0x0D, 0x0A, + 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6C, 0x6F, 0x61, 0x74, 0x20, + 0x61, 0x20, 0x3D, 0x20, 0x31, 0x2E, 0x30, 0x66, 0x3B, 0x0D, 0x0A, 0x20, + 0x20, 0x20, 0x20, 0x69, 0x66, 0x28, 0x75, 0x5F, 0x42, 0x6F, 0x72, 0x64, + 0x65, 0x72, 0x52, 0x61, 0x64, 0x69, 0x75, 0x73, 0x20, 0x3E, 0x3D, 0x20, + 0x30, 0x2E, 0x66, 0x29, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x7B, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0D, 0x0A, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x61, 0x20, 0x3D, 0x20, 0x6D, 0x69, 0x6E, + 0x28, 0x53, 0x68, 0x6F, 0x75, 0x6C, 0x64, 0x44, 0x69, 0x73, 0x63, 0x61, + 0x72, 0x64, 0x28, 0x63, 0x6F, 0x6F, 0x72, 0x64, 0x73, 0x2C, 0x20, 0x30, + 0x2C, 0x20, 0x75, 0x5F, 0x53, 0x69, 0x7A, 0x65, 0x2C, 0x20, 0x75, 0x5F, + 0x42, 0x6F, 0x72, 0x64, 0x65, 0x72, 0x52, 0x61, 0x64, 0x69, 0x75, 0x73, + 0x20, 0x2B, 0x20, 0x32, 0x29, 0x2C, 0x20, 0x66, 0x69, 0x6E, 0x61, 0x6C, + 0x43, 0x6F, 0x6C, 0x6F, 0x72, 0x2E, 0x61, 0x29, 0x3B, 0x0D, 0x0A, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x28, 0x61, 0x20, + 0x3D, 0x3D, 0x20, 0x30, 0x2E, 0x66, 0x29, 0x20, 0x0D, 0x0A, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x64, 0x69, + 0x73, 0x63, 0x61, 0x72, 0x64, 0x3B, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, + 0x7D, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x0D, 0x0A, 0x20, 0x20, 0x20, + 0x20, 0x69, 0x66, 0x28, 0x75, 0x5F, 0x42, 0x6F, 0x72, 0x64, 0x65, 0x72, + 0x20, 0x3E, 0x20, 0x30, 0x2E, 0x66, 0x29, 0x0D, 0x0A, 0x20, 0x20, 0x20, + 0x20, 0x7B, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x66, 0x6C, 0x6F, 0x61, 0x74, 0x20, 0x62, 0x6F, 0x72, 0x64, 0x65, 0x72, + 0x41, 0x6C, 0x70, 0x68, 0x61, 0x20, 0x3D, 0x20, 0x53, 0x68, 0x6F, 0x75, + 0x6C, 0x64, 0x44, 0x69, 0x73, 0x63, 0x61, 0x72, 0x64, 0x28, 0x63, 0x6F, + 0x6F, 0x72, 0x64, 0x73, 0x2C, 0x20, 0x75, 0x5F, 0x42, 0x6F, 0x72, 0x64, + 0x65, 0x72, 0x2C, 0x20, 0x75, 0x5F, 0x53, 0x69, 0x7A, 0x65, 0x2C, 0x20, + 0x75, 0x5F, 0x42, 0x6F, 0x72, 0x64, 0x65, 0x72, 0x52, 0x61, 0x64, 0x69, + 0x75, 0x73, 0x29, 0x3B, 0x0D, 0x0A, 0x0D, 0x0A, 0x0D, 0x0A, 0x09, 0x09, + 0x69, 0x66, 0x28, 0x61, 0x20, 0x3D, 0x3D, 0x20, 0x31, 0x2E, 0x66, 0x29, + 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7B, 0x20, + 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x66, 0x69, 0x6E, 0x61, 0x6C, 0x43, 0x6F, + 0x6C, 0x6F, 0x72, 0x20, 0x3D, 0x20, 0x6D, 0x69, 0x78, 0x28, 0x75, 0x5F, + 0x42, 0x6F, 0x72, 0x64, 0x65, 0x72, 0x43, 0x6F, 0x6C, 0x6F, 0x72, 0x2C, + 0x20, 0x66, 0x69, 0x6E, 0x61, 0x6C, 0x43, 0x6F, 0x6C, 0x6F, 0x72, 0x2C, + 0x20, 0x62, 0x6F, 0x72, 0x64, 0x65, 0x72, 0x41, 0x6C, 0x70, 0x68, 0x61, + 0x29, 0x3B, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x28, 0x63, 0x6F, 0x6F, 0x72, 0x64, + 0x73, 0x2E, 0x78, 0x20, 0x3C, 0x20, 0x75, 0x5F, 0x42, 0x6F, 0x72, 0x64, + 0x65, 0x72, 0x20, 0x7C, 0x7C, 0x20, 0x63, 0x6F, 0x6F, 0x72, 0x64, 0x73, + 0x2E, 0x78, 0x20, 0x3E, 0x20, 0x75, 0x5F, 0x53, 0x69, 0x7A, 0x65, 0x2E, + 0x78, 0x20, 0x2D, 0x20, 0x75, 0x5F, 0x42, 0x6F, 0x72, 0x64, 0x65, 0x72, + 0x20, 0x7C, 0x7C, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6F, 0x6F, + 0x72, 0x64, 0x73, 0x2E, 0x79, 0x20, 0x3C, 0x20, 0x75, 0x5F, 0x42, 0x6F, + 0x72, 0x64, 0x65, 0x72, 0x20, 0x7C, 0x7C, 0x20, 0x63, 0x6F, 0x6F, 0x72, + 0x64, 0x73, 0x2E, 0x79, 0x20, 0x3E, 0x20, 0x75, 0x5F, 0x53, 0x69, 0x7A, + 0x65, 0x2E, 0x79, 0x20, 0x2D, 0x20, 0x75, 0x5F, 0x42, 0x6F, 0x72, 0x64, + 0x65, 0x72, 0x29, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7B, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x66, 0x69, 0x6E, 0x61, 0x6C, 0x43, 0x6F, 0x6C, 0x6F, 0x72, 0x20, + 0x3D, 0x20, 0x75, 0x5F, 0x42, 0x6F, 0x72, 0x64, 0x65, 0x72, 0x43, 0x6F, + 0x6C, 0x6F, 0x72, 0x3B, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x09, 0x0D, 0x0A, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7D, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x65, 0x6C, 0x73, 0x65, 0x0D, 0x0A, + 0x09, 0x09, 0x09, 0x7B, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x09, 0x66, 0x69, + 0x6E, 0x61, 0x6C, 0x43, 0x6F, 0x6C, 0x6F, 0x72, 0x2E, 0x61, 0x20, 0x3D, + 0x20, 0x6D, 0x69, 0x78, 0x28, 0x62, 0x6F, 0x72, 0x64, 0x65, 0x72, 0x41, + 0x6C, 0x70, 0x68, 0x61, 0x2C, 0x20, 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, + 0x65, 0x43, 0x6F, 0x6C, 0x6F, 0x72, 0x2E, 0x61, 0x2C, 0x20, 0x75, 0x5F, + 0x48, 0x61, 0x73, 0x42, 0x61, 0x63, 0x6B, 0x67, 0x72, 0x6F, 0x75, 0x6E, + 0x64, 0x49, 0x6D, 0x61, 0x67, 0x65, 0x29, 0x3B, 0x0D, 0x0A, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7D, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x0D, 0x0A, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x46, 0x72, 0x61, 0x67, 0x43, 0x6F, 0x6C, 0x6F, 0x72, 0x20, 0x3D, 0x20, + 0x66, 0x69, 0x6E, 0x61, 0x6C, 0x43, 0x6F, 0x6C, 0x6F, 0x72, 0x3B, 0x20, + 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6E, 0x3B, 0x0D, 0x0A, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7D, 0x0D, 0x0A, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6C, 0x73, 0x65, 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, 0x66, + 0x69, 0x6E, 0x61, 0x6C, 0x43, 0x6F, 0x6C, 0x6F, 0x72, 0x20, 0x3D, 0x20, + 0x75, 0x5F, 0x42, 0x6F, 0x72, 0x64, 0x65, 0x72, 0x43, 0x6F, 0x6C, 0x6F, + 0x72, 0x3B, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x66, 0x69, 0x6E, 0x61, 0x6C, 0x43, 0x6F, 0x6C, + 0x6F, 0x72, 0x2E, 0x61, 0x20, 0x3D, 0x20, 0x6D, 0x61, 0x78, 0x28, 0x61, + 0x2C, 0x20, 0x75, 0x5F, 0x42, 0x6F, 0x72, 0x64, 0x65, 0x72, 0x43, 0x6F, + 0x6C, 0x6F, 0x72, 0x2E, 0x61, 0x29, 0x3B, 0x0D, 0x0A, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x46, 0x72, 0x61, + 0x67, 0x43, 0x6F, 0x6C, 0x6F, 0x72, 0x20, 0x3D, 0x20, 0x66, 0x69, 0x6E, + 0x61, 0x6C, 0x43, 0x6F, 0x6C, 0x6F, 0x72, 0x3B, 0x0D, 0x0A, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, + 0x74, 0x75, 0x72, 0x6E, 0x3B, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7D, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x7D, 0x0D, + 0x0A, 0x20, 0x20, 0x20, 0x20, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x66, + 0x69, 0x6E, 0x61, 0x6C, 0x43, 0x6F, 0x6C, 0x6F, 0x72, 0x2E, 0x61, 0x20, + 0x3D, 0x20, 0x61, 0x3B, 0x0D, 0x0A, 0x09, 0x46, 0x72, 0x61, 0x67, 0x43, + 0x6F, 0x6C, 0x6F, 0x72, 0x20, 0x3D, 0x20, 0x66, 0x69, 0x6E, 0x61, 0x6C, + 0x43, 0x6F, 0x6C, 0x6F, 0x72, 0x3B, 0x20, 0x0D, 0x0A, 0x7D, + }; + unsigned int Resources_Shaders_ui_panel_shader_len = sizeof(Resources_Shaders_ui_panel_shader); + + // Data for file: Resources_Shaders_ui_text_shader_path + const std::string Resources_Shaders_ui_text_shader_path = R"(Resources/Shaders/ui_text.shader)"; + unsigned char Resources_Shaders_ui_text_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, 0x36, 0x30, 0x20, 0x63, 0x6F, 0x72, 0x65, 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, 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, 0x3B, 0x0D, + 0x0A, 0x0D, 0x0A, 0x75, 0x6E, 0x69, 0x66, 0x6F, 0x72, 0x6D, 0x20, 0x6D, + 0x61, 0x74, 0x34, 0x20, 0x75, 0x5F, 0x4D, 0x6F, 0x64, 0x65, 0x6C, 0x3B, + 0x0D, 0x0A, 0x75, 0x6E, 0x69, 0x66, 0x6F, 0x72, 0x6D, 0x20, 0x6D, 0x61, + 0x74, 0x34, 0x20, 0x75, 0x5F, 0x56, 0x69, 0x65, 0x77, 0x3B, 0x0D, 0x0A, + 0x0D, 0x0A, 0x6F, 0x75, 0x74, 0x20, 0x76, 0x65, 0x63, 0x32, 0x20, 0x76, + 0x5F, 0x55, 0x56, 0x3B, 0x0D, 0x0A, 0x0D, 0x0A, 0x76, 0x6F, 0x69, 0x64, + 0x20, 0x6D, 0x61, 0x69, 0x6E, 0x28, 0x29, 0x20, 0x7B, 0x0D, 0x0A, 0x09, + 0x76, 0x5F, 0x55, 0x56, 0x20, 0x3D, 0x20, 0x55, 0x56, 0x3B, 0x0D, 0x0A, + 0x09, 0x66, 0x6C, 0x6F, 0x61, 0x74, 0x20, 0x78, 0x20, 0x3D, 0x20, 0x50, + 0x6F, 0x73, 0x69, 0x74, 0x69, 0x6F, 0x6E, 0x2E, 0x78, 0x3B, 0x0D, 0x0A, + 0x09, 0x66, 0x6C, 0x6F, 0x61, 0x74, 0x20, 0x79, 0x20, 0x3D, 0x20, 0x50, + 0x6F, 0x73, 0x69, 0x74, 0x69, 0x6F, 0x6E, 0x2E, 0x79, 0x3B, 0x0D, 0x0A, + 0x09, 0x66, 0x6C, 0x6F, 0x61, 0x74, 0x20, 0x7A, 0x20, 0x3D, 0x20, 0x50, + 0x6F, 0x73, 0x69, 0x74, 0x69, 0x6F, 0x6E, 0x2E, 0x7A, 0x3B, 0x0D, 0x0A, + 0x0D, 0x0A, 0x09, 0x67, 0x6C, 0x5F, 0x50, 0x6F, 0x73, 0x69, 0x74, 0x69, + 0x6F, 0x6E, 0x20, 0x3D, 0x20, 0x75, 0x5F, 0x56, 0x69, 0x65, 0x77, 0x20, + 0x2A, 0x20, 0x75, 0x5F, 0x4D, 0x6F, 0x64, 0x65, 0x6C, 0x20, 0x2A, 0x20, + 0x76, 0x65, 0x63, 0x34, 0x28, 0x78, 0x2C, 0x20, 0x79, 0x2C, 0x20, 0x7A, + 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, 0x36, 0x30, 0x20, 0x63, 0x6F, + 0x72, 0x65, 0x0D, 0x0A, 0x0D, 0x0A, 0x0D, 0x0A, 0x69, 0x6E, 0x20, 0x73, + 0x61, 0x6D, 0x70, 0x6C, 0x65, 0x20, 0x76, 0x65, 0x63, 0x32, 0x20, 0x76, + 0x5F, 0x55, 0x56, 0x3B, 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, 0x75, 0x6E, 0x69, 0x66, 0x6F, 0x72, 0x6D, + 0x20, 0x73, 0x61, 0x6D, 0x70, 0x6C, 0x65, 0x72, 0x32, 0x44, 0x20, 0x75, + 0x5F, 0x41, 0x74, 0x6C, 0x61, 0x73, 0x3B, 0x0D, 0x0A, 0x75, 0x6E, 0x69, + 0x66, 0x6F, 0x72, 0x6D, 0x20, 0x73, 0x61, 0x6D, 0x70, 0x6C, 0x65, 0x20, + 0x76, 0x65, 0x63, 0x32, 0x20, 0x75, 0x5F, 0x54, 0x65, 0x78, 0x74, 0x75, + 0x72, 0x65, 0x50, 0x6F, 0x73, 0x3B, 0x0D, 0x0A, 0x75, 0x6E, 0x69, 0x66, + 0x6F, 0x72, 0x6D, 0x20, 0x76, 0x65, 0x63, 0x32, 0x20, 0x75, 0x5F, 0x54, + 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x53, 0x63, 0x61, 0x6C, 0x65, 0x3B, + 0x0D, 0x0A, 0x0D, 0x0A, 0x75, 0x6E, 0x69, 0x66, 0x6F, 0x72, 0x6D, 0x20, + 0x76, 0x65, 0x63, 0x34, 0x20, 0x75, 0x5F, 0x46, 0x6F, 0x6E, 0x74, 0x43, + 0x6F, 0x6C, 0x6F, 0x72, 0x3B, 0x0D, 0x0A, 0x0D, 0x0A, 0x75, 0x6E, 0x69, + 0x66, 0x6F, 0x72, 0x6D, 0x20, 0x66, 0x6C, 0x6F, 0x61, 0x74, 0x20, 0x75, + 0x5F, 0x50, 0x78, 0x52, 0x61, 0x6E, 0x67, 0x65, 0x3B, 0x0D, 0x0A, 0x0D, + 0x0A, 0x66, 0x6C, 0x6F, 0x61, 0x74, 0x20, 0x73, 0x63, 0x72, 0x65, 0x65, + 0x6E, 0x50, 0x78, 0x52, 0x61, 0x6E, 0x67, 0x65, 0x28, 0x76, 0x65, 0x63, + 0x32, 0x20, 0x63, 0x6F, 0x6F, 0x72, 0x64, 0x29, 0x20, 0x7B, 0x0D, 0x0A, + 0x20, 0x20, 0x20, 0x20, 0x76, 0x65, 0x63, 0x32, 0x20, 0x75, 0x6E, 0x69, + 0x74, 0x52, 0x61, 0x6E, 0x67, 0x65, 0x20, 0x3D, 0x20, 0x76, 0x65, 0x63, + 0x32, 0x28, 0x75, 0x5F, 0x50, 0x78, 0x52, 0x61, 0x6E, 0x67, 0x65, 0x29, + 0x20, 0x2F, 0x20, 0x76, 0x65, 0x63, 0x32, 0x28, 0x74, 0x65, 0x78, 0x74, + 0x75, 0x72, 0x65, 0x53, 0x69, 0x7A, 0x65, 0x28, 0x75, 0x5F, 0x41, 0x74, + 0x6C, 0x61, 0x73, 0x2C, 0x20, 0x30, 0x29, 0x29, 0x3B, 0x0D, 0x0A, 0x20, + 0x20, 0x20, 0x20, 0x76, 0x65, 0x63, 0x32, 0x20, 0x73, 0x63, 0x72, 0x65, + 0x65, 0x6E, 0x54, 0x65, 0x78, 0x53, 0x69, 0x7A, 0x65, 0x20, 0x3D, 0x20, + 0x76, 0x65, 0x63, 0x32, 0x28, 0x31, 0x2E, 0x30, 0x29, 0x20, 0x2F, 0x20, + 0x66, 0x77, 0x69, 0x64, 0x74, 0x68, 0x28, 0x63, 0x6F, 0x6F, 0x72, 0x64, + 0x29, 0x3B, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6E, 0x20, 0x6D, 0x61, 0x78, 0x28, 0x30, 0x2E, 0x35, 0x20, 0x2A, + 0x20, 0x64, 0x6F, 0x74, 0x28, 0x75, 0x6E, 0x69, 0x74, 0x52, 0x61, 0x6E, + 0x67, 0x65, 0x2C, 0x20, 0x73, 0x63, 0x72, 0x65, 0x65, 0x6E, 0x54, 0x65, + 0x78, 0x53, 0x69, 0x7A, 0x65, 0x29, 0x2C, 0x20, 0x31, 0x2E, 0x30, 0x29, + 0x3B, 0x0D, 0x0A, 0x7D, 0x0D, 0x0A, 0x0D, 0x0A, 0x66, 0x6C, 0x6F, 0x61, + 0x74, 0x20, 0x6D, 0x65, 0x64, 0x69, 0x61, 0x6E, 0x28, 0x66, 0x6C, 0x6F, + 0x61, 0x74, 0x20, 0x72, 0x2C, 0x20, 0x66, 0x6C, 0x6F, 0x61, 0x74, 0x20, + 0x67, 0x2C, 0x20, 0x66, 0x6C, 0x6F, 0x61, 0x74, 0x20, 0x62, 0x29, 0x20, + 0x7B, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6E, 0x20, 0x6D, 0x61, 0x78, 0x28, 0x6D, 0x69, 0x6E, 0x28, 0x72, 0x2C, + 0x20, 0x67, 0x29, 0x2C, 0x20, 0x6D, 0x69, 0x6E, 0x28, 0x6D, 0x61, 0x78, + 0x28, 0x72, 0x2C, 0x20, 0x67, 0x29, 0x2C, 0x20, 0x62, 0x29, 0x29, 0x3B, + 0x0D, 0x0A, 0x7D, 0x0D, 0x0A, 0x0D, 0x0A, 0x66, 0x6C, 0x6F, 0x61, 0x74, + 0x20, 0x6F, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x28, 0x76, 0x65, 0x63, + 0x34, 0x20, 0x73, 0x64, 0x66, 0x53, 0x61, 0x6D, 0x70, 0x6C, 0x65, 0x29, + 0x0D, 0x0A, 0x7B, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6C, 0x6F, + 0x61, 0x74, 0x20, 0x72, 0x20, 0x3D, 0x20, 0x73, 0x64, 0x66, 0x53, 0x61, + 0x6D, 0x70, 0x6C, 0x65, 0x2E, 0x72, 0x3B, 0x0D, 0x0A, 0x20, 0x20, 0x20, + 0x20, 0x66, 0x6C, 0x6F, 0x61, 0x74, 0x20, 0x67, 0x20, 0x3D, 0x20, 0x73, + 0x64, 0x66, 0x53, 0x61, 0x6D, 0x70, 0x6C, 0x65, 0x2E, 0x67, 0x3B, 0x0D, + 0x0A, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6C, 0x6F, 0x61, 0x74, 0x20, 0x62, + 0x20, 0x3D, 0x20, 0x73, 0x64, 0x66, 0x53, 0x61, 0x6D, 0x70, 0x6C, 0x65, + 0x2E, 0x62, 0x3B, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6C, 0x6F, + 0x61, 0x74, 0x20, 0x73, 0x69, 0x67, 0x6E, 0x65, 0x64, 0x5F, 0x64, 0x69, + 0x73, 0x74, 0x20, 0x3D, 0x20, 0x6D, 0x65, 0x64, 0x69, 0x61, 0x6E, 0x28, + 0x72, 0x2C, 0x20, 0x67, 0x2C, 0x20, 0x62, 0x29, 0x20, 0x2D, 0x20, 0x30, + 0x2E, 0x35, 0x3B, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6C, 0x6F, + 0x61, 0x74, 0x20, 0x64, 0x20, 0x3D, 0x20, 0x66, 0x77, 0x69, 0x64, 0x74, + 0x68, 0x28, 0x73, 0x69, 0x67, 0x6E, 0x65, 0x64, 0x5F, 0x64, 0x69, 0x73, + 0x74, 0x29, 0x3B, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6C, 0x6F, + 0x61, 0x74, 0x20, 0x6F, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x20, 0x3D, + 0x20, 0x73, 0x6D, 0x6F, 0x6F, 0x74, 0x68, 0x73, 0x74, 0x65, 0x70, 0x28, + 0x2D, 0x64, 0x2C, 0x20, 0x64, 0x2C, 0x20, 0x73, 0x69, 0x67, 0x6E, 0x65, + 0x64, 0x5F, 0x64, 0x69, 0x73, 0x74, 0x29, 0x3B, 0x0D, 0x0A, 0x20, 0x20, + 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6E, 0x20, 0x6F, 0x70, 0x61, + 0x63, 0x69, 0x74, 0x79, 0x3B, 0x0D, 0x0A, 0x7D, 0x0D, 0x0A, 0x0D, 0x0A, + 0x76, 0x6F, 0x69, 0x64, 0x20, 0x6D, 0x61, 0x69, 0x6E, 0x28, 0x29, 0x20, + 0x7B, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x76, 0x65, 0x63, 0x32, 0x20, + 0x74, 0x65, 0x78, 0x74, 0x53, 0x69, 0x7A, 0x65, 0x20, 0x3D, 0x20, 0x74, + 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x53, 0x69, 0x7A, 0x65, 0x28, 0x75, + 0x5F, 0x41, 0x74, 0x6C, 0x61, 0x73, 0x2C, 0x20, 0x30, 0x29, 0x3B, 0x0D, + 0x0A, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x76, 0x65, 0x63, 0x32, 0x20, + 0x75, 0x76, 0x20, 0x3D, 0x20, 0x76, 0x65, 0x63, 0x32, 0x28, 0x6D, 0x69, + 0x78, 0x28, 0x75, 0x5F, 0x54, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x50, + 0x6F, 0x73, 0x2E, 0x78, 0x20, 0x2F, 0x20, 0x74, 0x65, 0x78, 0x74, 0x53, + 0x69, 0x7A, 0x65, 0x2E, 0x78, 0x2C, 0x20, 0x75, 0x5F, 0x54, 0x65, 0x78, + 0x74, 0x75, 0x72, 0x65, 0x53, 0x63, 0x61, 0x6C, 0x65, 0x2E, 0x78, 0x20, + 0x2F, 0x20, 0x74, 0x65, 0x78, 0x74, 0x53, 0x69, 0x7A, 0x65, 0x2E, 0x78, + 0x2C, 0x20, 0x76, 0x5F, 0x55, 0x56, 0x2E, 0x78, 0x29, 0x2C, 0x0D, 0x0A, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6D, 0x69, 0x78, 0x28, 0x75, + 0x5F, 0x54, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x53, 0x63, 0x61, 0x6C, + 0x65, 0x2E, 0x79, 0x20, 0x2F, 0x20, 0x74, 0x65, 0x78, 0x74, 0x53, 0x69, + 0x7A, 0x65, 0x2E, 0x79, 0x2C, 0x20, 0x75, 0x5F, 0x54, 0x65, 0x78, 0x74, + 0x75, 0x72, 0x65, 0x50, 0x6F, 0x73, 0x2E, 0x79, 0x20, 0x2F, 0x20, 0x74, + 0x65, 0x78, 0x74, 0x53, 0x69, 0x7A, 0x65, 0x2E, 0x79, 0x2C, 0x20, 0x31, + 0x2E, 0x30, 0x20, 0x2D, 0x20, 0x76, 0x5F, 0x55, 0x56, 0x2E, 0x79, 0x29, + 0x29, 0x3B, 0x0D, 0x0A, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6F, + 0x6E, 0x73, 0x74, 0x20, 0x66, 0x6C, 0x6F, 0x61, 0x74, 0x20, 0x73, 0x75, + 0x62, 0x50, 0x69, 0x78, 0x65, 0x6C, 0x41, 0x6D, 0x6F, 0x75, 0x6E, 0x74, + 0x20, 0x3D, 0x20, 0x31, 0x2E, 0x33, 0x33, 0x33, 0x3B, 0x0D, 0x0A, 0x20, + 0x20, 0x20, 0x20, 0x76, 0x65, 0x63, 0x32, 0x20, 0x75, 0x6E, 0x69, 0x74, + 0x52, 0x61, 0x6E, 0x67, 0x65, 0x20, 0x3D, 0x20, 0x31, 0x2E, 0x30, 0x20, + 0x2F, 0x20, 0x74, 0x65, 0x78, 0x74, 0x53, 0x69, 0x7A, 0x65, 0x3B, 0x0D, + 0x0A, 0x20, 0x20, 0x20, 0x20, 0x76, 0x65, 0x63, 0x32, 0x20, 0x75, 0x76, + 0x4C, 0x65, 0x66, 0x74, 0x20, 0x3D, 0x20, 0x75, 0x76, 0x20, 0x2D, 0x20, + 0x76, 0x65, 0x63, 0x32, 0x28, 0x75, 0x6E, 0x69, 0x74, 0x52, 0x61, 0x6E, + 0x67, 0x65, 0x2E, 0x78, 0x20, 0x2A, 0x20, 0x73, 0x75, 0x62, 0x50, 0x69, + 0x78, 0x65, 0x6C, 0x41, 0x6D, 0x6F, 0x75, 0x6E, 0x74, 0x2C, 0x20, 0x30, + 0x29, 0x3B, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x76, 0x65, 0x63, 0x32, + 0x20, 0x75, 0x76, 0x52, 0x69, 0x67, 0x68, 0x74, 0x20, 0x3D, 0x20, 0x75, + 0x76, 0x20, 0x2B, 0x20, 0x76, 0x65, 0x63, 0x32, 0x28, 0x75, 0x6E, 0x69, + 0x74, 0x52, 0x61, 0x6E, 0x67, 0x65, 0x2E, 0x78, 0x20, 0x2A, 0x20, 0x73, + 0x75, 0x62, 0x50, 0x69, 0x78, 0x65, 0x6C, 0x41, 0x6D, 0x6F, 0x75, 0x6E, + 0x74, 0x2C, 0x20, 0x30, 0x29, 0x3B, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, + 0x76, 0x65, 0x63, 0x32, 0x20, 0x75, 0x76, 0x55, 0x70, 0x20, 0x3D, 0x20, + 0x75, 0x76, 0x20, 0x2B, 0x20, 0x76, 0x65, 0x63, 0x32, 0x28, 0x30, 0x2C, + 0x20, 0x75, 0x6E, 0x69, 0x74, 0x52, 0x61, 0x6E, 0x67, 0x65, 0x2E, 0x79, + 0x20, 0x2A, 0x20, 0x73, 0x75, 0x62, 0x50, 0x69, 0x78, 0x65, 0x6C, 0x41, + 0x6D, 0x6F, 0x75, 0x6E, 0x74, 0x29, 0x3B, 0x0D, 0x0A, 0x20, 0x20, 0x20, + 0x20, 0x66, 0x6C, 0x6F, 0x61, 0x74, 0x20, 0x6D, 0x69, 0x64, 0x64, 0x6C, + 0x65, 0x20, 0x3D, 0x20, 0x6F, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x28, + 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x28, 0x75, 0x5F, 0x41, 0x74, + 0x6C, 0x61, 0x73, 0x2C, 0x20, 0x75, 0x76, 0x29, 0x29, 0x3B, 0x0D, 0x0A, + 0x20, 0x20, 0x20, 0x20, 0x66, 0x6C, 0x6F, 0x61, 0x74, 0x20, 0x6C, 0x65, + 0x66, 0x74, 0x20, 0x3D, 0x20, 0x6F, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, + 0x28, 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x28, 0x75, 0x5F, 0x41, + 0x74, 0x6C, 0x61, 0x73, 0x2C, 0x20, 0x75, 0x76, 0x4C, 0x65, 0x66, 0x74, + 0x29, 0x29, 0x3B, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6C, 0x6F, + 0x61, 0x74, 0x20, 0x72, 0x69, 0x67, 0x68, 0x74, 0x20, 0x3D, 0x20, 0x6F, + 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x28, 0x74, 0x65, 0x78, 0x74, 0x75, + 0x72, 0x65, 0x28, 0x75, 0x5F, 0x41, 0x74, 0x6C, 0x61, 0x73, 0x2C, 0x20, + 0x75, 0x76, 0x52, 0x69, 0x67, 0x68, 0x74, 0x29, 0x29, 0x3B, 0x0D, 0x0A, + 0x20, 0x20, 0x20, 0x20, 0x66, 0x6C, 0x6F, 0x61, 0x74, 0x20, 0x75, 0x70, + 0x20, 0x3D, 0x20, 0x6F, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x28, 0x74, + 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x28, 0x75, 0x5F, 0x41, 0x74, 0x6C, + 0x61, 0x73, 0x2C, 0x20, 0x75, 0x76, 0x55, 0x70, 0x29, 0x29, 0x3B, 0x0D, + 0x0A, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, + 0x63, 0x6F, 0x6C, 0x6F, 0x72, 0x20, 0x3D, 0x20, 0x75, 0x5F, 0x46, 0x6F, + 0x6E, 0x74, 0x43, 0x6F, 0x6C, 0x6F, 0x72, 0x2E, 0x72, 0x67, 0x62, 0x3B, + 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x62, 0x6F, 0x6F, 0x6C, 0x20, 0x64, + 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x20, 0x3D, 0x20, 0x66, + 0x61, 0x6C, 0x73, 0x65, 0x3B, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x0D, 0x0A, + 0x20, 0x20, 0x20, 0x20, 0x63, 0x6F, 0x6E, 0x73, 0x74, 0x20, 0x66, 0x6C, + 0x6F, 0x61, 0x74, 0x20, 0x72, 0x61, 0x74, 0x69, 0x6F, 0x20, 0x3D, 0x20, + 0x31, 0x2E, 0x36, 0x36, 0x36, 0x36, 0x3B, 0x0D, 0x0A, 0x20, 0x20, 0x20, + 0x20, 0x63, 0x6F, 0x6E, 0x73, 0x74, 0x20, 0x66, 0x6C, 0x6F, 0x61, 0x74, + 0x20, 0x63, 0x75, 0x72, 0x76, 0x65, 0x5F, 0x74, 0x6F, 0x6C, 0x65, 0x72, + 0x61, 0x6E, 0x63, 0x65, 0x20, 0x3D, 0x20, 0x31, 0x2E, 0x30, 0x3B, 0x0D, + 0x0A, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6F, 0x6E, 0x73, 0x74, 0x20, 0x66, + 0x6C, 0x6F, 0x61, 0x74, 0x20, 0x68, 0x5F, 0x74, 0x6F, 0x6C, 0x65, 0x72, + 0x61, 0x6E, 0x63, 0x65, 0x20, 0x3D, 0x20, 0x30, 0x3B, 0x0D, 0x0A, 0x20, + 0x20, 0x20, 0x20, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6F, 0x6E, + 0x73, 0x74, 0x20, 0x62, 0x6F, 0x6F, 0x6C, 0x20, 0x73, 0x75, 0x62, 0x70, + 0x69, 0x78, 0x65, 0x6C, 0x20, 0x3D, 0x20, 0x66, 0x61, 0x6C, 0x73, 0x65, + 0x3B, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6F, 0x6E, 0x73, 0x74, + 0x20, 0x66, 0x6C, 0x6F, 0x61, 0x74, 0x20, 0x73, 0x75, 0x62, 0x70, 0x69, + 0x78, 0x65, 0x6C, 0x5F, 0x74, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6F, 0x6C, + 0x64, 0x20, 0x3D, 0x20, 0x31, 0x3B, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, + 0x66, 0x6C, 0x6F, 0x61, 0x74, 0x20, 0x63, 0x75, 0x72, 0x76, 0x65, 0x41, + 0x6D, 0x6F, 0x75, 0x6E, 0x74, 0x20, 0x3D, 0x20, 0x75, 0x70, 0x20, 0x2D, + 0x20, 0x6D, 0x69, 0x64, 0x64, 0x6C, 0x65, 0x3B, 0x0D, 0x0A, 0x20, 0x20, + 0x20, 0x20, 0x62, 0x6F, 0x6F, 0x6C, 0x20, 0x6D, 0x69, 0x64, 0x20, 0x3D, + 0x20, 0x6D, 0x69, 0x64, 0x64, 0x6C, 0x65, 0x20, 0x3C, 0x20, 0x28, 0x73, + 0x75, 0x62, 0x70, 0x69, 0x78, 0x65, 0x6C, 0x5F, 0x74, 0x68, 0x72, 0x65, + 0x73, 0x68, 0x6F, 0x6C, 0x64, 0x29, 0x3B, 0x0D, 0x0A, 0x20, 0x20, 0x20, + 0x20, 0x62, 0x6F, 0x6F, 0x6C, 0x20, 0x6C, 0x65, 0x66, 0x74, 0x74, 0x20, + 0x3D, 0x20, 0x6C, 0x65, 0x66, 0x74, 0x20, 0x3C, 0x20, 0x73, 0x75, 0x62, + 0x70, 0x69, 0x78, 0x65, 0x6C, 0x5F, 0x74, 0x68, 0x72, 0x65, 0x73, 0x68, + 0x6F, 0x6C, 0x64, 0x3B, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x62, 0x6F, + 0x6F, 0x6C, 0x20, 0x72, 0x69, 0x67, 0x68, 0x74, 0x74, 0x20, 0x3D, 0x20, + 0x72, 0x69, 0x67, 0x68, 0x74, 0x20, 0x3C, 0x20, 0x73, 0x75, 0x62, 0x70, + 0x69, 0x78, 0x65, 0x6C, 0x5F, 0x74, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6F, + 0x6C, 0x64, 0x3B, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x28, + 0x73, 0x75, 0x62, 0x70, 0x69, 0x78, 0x65, 0x6C, 0x20, 0x26, 0x26, 0x28, + 0x6D, 0x69, 0x64, 0x64, 0x6C, 0x65, 0x20, 0x3C, 0x20, 0x73, 0x75, 0x62, + 0x70, 0x69, 0x78, 0x65, 0x6C, 0x5F, 0x74, 0x68, 0x72, 0x65, 0x73, 0x68, + 0x6F, 0x6C, 0x64, 0x29, 0x20, 0x26, 0x26, 0x20, 0x63, 0x75, 0x72, 0x76, + 0x65, 0x41, 0x6D, 0x6F, 0x75, 0x6E, 0x74, 0x20, 0x3C, 0x20, 0x63, 0x75, + 0x72, 0x76, 0x65, 0x5F, 0x74, 0x6F, 0x6C, 0x65, 0x72, 0x61, 0x6E, 0x63, + 0x65, 0x29, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x7B, 0x0D, 0x0A, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6F, 0x6C, 0x6F, 0x72, + 0x2E, 0x72, 0x20, 0x3D, 0x20, 0x6C, 0x65, 0x66, 0x74, 0x3B, 0x0D, 0x0A, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6F, 0x6C, 0x6F, + 0x72, 0x2E, 0x67, 0x20, 0x3D, 0x20, 0x6D, 0x69, 0x64, 0x64, 0x6C, 0x65, + 0x3B, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, + 0x6F, 0x6C, 0x6F, 0x72, 0x2E, 0x62, 0x20, 0x3D, 0x20, 0x72, 0x69, 0x67, + 0x68, 0x74, 0x3B, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x7D, 0x0D, 0x0A, + 0x20, 0x20, 0x20, 0x20, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x46, 0x72, + 0x61, 0x67, 0x43, 0x6F, 0x6C, 0x6F, 0x72, 0x20, 0x3D, 0x20, 0x76, 0x65, + 0x63, 0x34, 0x28, 0x63, 0x6F, 0x6C, 0x6F, 0x72, 0x2E, 0x72, 0x67, 0x62, + 0x2C, 0x20, 0x6D, 0x69, 0x64, 0x64, 0x6C, 0x65, 0x29, 0x3B, 0x0D, 0x0A, + 0x7D, + }; + unsigned int Resources_Shaders_ui_text_shader_len = sizeof(Resources_Shaders_ui_text_shader); + // Data for file: Resources_Shaders_vignette_shader_path const std::string Resources_Shaders_vignette_shader_path = R"(Resources/Shaders/vignette.shader)"; unsigned char Resources_Shaders_vignette_shader[] = { diff --git a/Nuake/src/Resource/StaticResources.h b/Nuake/src/Resource/StaticResources.h index 3f3c329c..a5420b00 100644 --- a/Nuake/src/Resource/StaticResources.h +++ b/Nuake/src/Resource/StaticResources.h @@ -233,6 +233,12 @@ namespace Nuake { extern const std::string Resources_Shaders_ui_shader_path; extern unsigned int Resources_Shaders_ui_shader_len; extern unsigned char Resources_Shaders_ui_shader[]; + extern const std::string Resources_Shaders_ui_panel_shader_path; + extern unsigned int Resources_Shaders_ui_panel_shader_len; + extern unsigned char Resources_Shaders_ui_panel_shader[]; + extern const std::string Resources_Shaders_ui_text_shader_path; + extern unsigned int Resources_Shaders_ui_text_shader_len; + extern unsigned char Resources_Shaders_ui_text_shader[]; extern const std::string Resources_Shaders_vignette_shader_path; extern unsigned int Resources_Shaders_vignette_shader_len; extern unsigned char Resources_Shaders_vignette_shader[]; diff --git a/Nuake/src/UI/Renderer.cpp b/Nuake/src/UI/Renderer.cpp index 22476ea1..88a1cc33 100644 --- a/Nuake/src/UI/Renderer.cpp +++ b/Nuake/src/UI/Renderer.cpp @@ -7,9 +7,13 @@ #include "FileSystem.h" +#include +#include + namespace NuakeUI { - struct Vertex { + struct Vertex + { Vector3 Position; Vector2 UV; }; @@ -45,15 +49,8 @@ namespace NuakeUI void Renderer::ReloadShaders() { - // Rectangle Shader - std::string vertexSource = FileSystem::ReadFile("../resources/panel.vert.glsl"); - std::string fragSource = FileSystem::ReadFile("../resources/panel.frag.glsl"); - mShader = std::make_shared(vertexSource, fragSource); - - // SDF Shader - vertexSource = FileSystem::ReadFile("../resources/text.vert.glsl"); - fragSource = FileSystem::ReadFile("../resources/text.frag.glsl"); - mSDFShader = std::make_shared(vertexSource, fragSource); + mShader = ShaderManager::GetShader("Resources/Shaders/ui_panel.shader"); + mSDFShader = ShaderManager::GetShader("Resources/Shaders/ui_text.shader"); } void Renderer::SetViewportSize(const Vector2& size) @@ -66,12 +63,12 @@ namespace NuakeUI { int viewportW = (int)mSize.x; int viewportH = (int)mSize.y; - //glViewport(0, 0, viewportW, viewportH); + glViewport(0, 0, viewportW, viewportH); } void Renderer::DrawNode(std::shared_ptr node, int z) { - //glEnable(GL_DEPTH_TEST); + glDisable(GL_DEPTH_TEST); float parentScroll = 0.f; float parentPaddingRight = 0.f; @@ -115,92 +112,90 @@ namespace NuakeUI } mShader->Bind(); - //mShader->SetUniforms({ - // { "u_Model", transform }, - // { "u_Size", Vector2(width, height) }, - // { "u_View", mView }, - // { "u_Color", node->ComputedStyle.BackgroundColor }, - // { "u_Border", node->ComputedStyle.BorderSize }, - // { "u_BorderRadius", node->ComputedStyle.BorderRadius }, - // { "u_BorderColor", node->ComputedStyle.BorderColor }, - // { "u_BackgroundImage", 0 }, - // { "u_HasBackgroundImage", hasBackgroundImage ? 1.f : 0.f} - //}); + mShader->SetUniforms({ + { "u_Model", transform }, + { "u_Size", Vector2(width, height) }, + { "u_View", mView }, + { "u_Color", node->ComputedStyle.BackgroundColor }, + { "u_Border", node->ComputedStyle.BorderSize }, + { "u_BorderRadius", node->ComputedStyle.BorderRadius }, + { "u_BorderColor", node->ComputedStyle.BorderColor }, + { "u_BackgroundImage", 0 }, + { "u_HasBackgroundImage", hasBackgroundImage ? 1.f : 0.f} + }); - - //bool hideOverflow = node->Parent != nullptr && node->Parent->ComputedStyle.Overflow == OverflowType::Hidden; - //if (hideOverflow) - //{ - // glEnable(GL_SCISSOR_TEST); - // Vector2 parentPosition = node->Parent->ComputedPosition; - // Vector2 parentSize = node->Parent->ComputedSize; - // int scissorX = (int)parentPosition.x; - // int scissorY = 1080 - (int)(parentPosition.y - parentSize.y); - // int scissorW = (int)parentSize.x; - // int scissorH = (int)parentSize.y; - // glScissor(scissorX, scissorY, scissorW, scissorH); - //} + bool hideOverflow = node->Parent != nullptr && node->Parent->ComputedStyle.Overflow == OverflowType::Hidden; + if (hideOverflow) + { + glEnable(GL_SCISSOR_TEST); + Vector2 parentPosition = node->Parent->ComputedPosition; + Vector2 parentSize = node->Parent->ComputedSize; + int scissorX = (int)parentPosition.x; + int scissorY = 1080 - (int)(parentPosition.y - parentSize.y); + int scissorW = (int)parentSize.x; + int scissorH = (int)parentSize.y; + glScissor(scissorX, scissorY, scissorW, scissorH); + } // TODO: Keep overflow until we get out of here - //mVertexArray->Bind(); - //glDrawArrays(GL_TRIANGLES, 0, 6); - //mVertexArray->Unbind(); - //mShader->Unbind(); - // - //if (hideOverflow) - // glDisable(GL_SCISSOR_TEST); - + mVertexArray->Bind(); + glDrawArrays(GL_TRIANGLES, 0, 6); + mVertexArray->Unbind(); + mShader->Unbind(); + + if (hideOverflow) + glDisable(GL_SCISSOR_TEST); } void Renderer::DrawString(const std::string& string, NodeStyle& nodeStyle, std::shared_ptr font, Vector3 position) { - //const float fontSize = nodeStyle.FontSize / 64.f; - //glEnable(GL_BLEND); - //glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); - //mSDFShader->Bind(); - //font->mAtlas->Bind(5); - //mSDFShader->SetUniforms({ - // { "u_View", mView }, - // { "u_Atlas", 5 }, - // { "u_Scale", 1.0f}, - // { "u_SDF_BorderSize", 0.0f}, - // { "u_FontColor", nodeStyle.FontColor }, - // { "u_PxRange", fontSize }, - // { "u_SDF_BorderSize", {1.0, 1.0}} - //}); - // - //mVertexArray->Bind(); - // - //float advance = 0.0f; - //for (char const& c : string) - //{ - // Char letter = font->GetChar((int)c); - // - // // Move the cursor - // Matrix4 model = Matrix4(1.f); - // model = glm::translate(model, position); - // model = glm::translate(model, Vector3(advance * fontSize, (-(letter.PlaneBounds.top) + (font->LineHeight)) * fontSize, 0)); - // - // advance += (letter.Advance); - // - // // Scaling of the quad - // float scaleX = (float)(letter.PlaneBounds.right - letter.PlaneBounds.left); - // float scaleY = (float)(letter.PlaneBounds.top - letter.PlaneBounds.bottom); - // model = glm::scale(model, Vector3(scaleX * fontSize, scaleY * fontSize, 1.f)); - // - // // Set Uniforms - // mSDFShader->SetUniforms({ - // { "u_Model", model }, - // { "u_TexturePos", Vector2(letter.AtlasBounds.Pos.x, letter.AtlasBounds.Pos.y) }, - // { "u_TextureScale", Vector2(letter.AtlasBounds.Size.x, letter.AtlasBounds.Size.y) }, - // }); - // - // - // glDrawArrays(GL_TRIANGLES, 0, 6); - //} - // - // - //mVertexArray->Unbind(); + const float fontSize = nodeStyle.FontSize / 64.f; + glEnable(GL_BLEND); + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + mSDFShader->Bind(); + font->mAtlas->Bind(5); + mSDFShader->SetUniforms({ + { "u_View", mView }, + { "u_Atlas", 5 }, + { "u_Scale", 1.0f}, + { "u_SDF_BorderSize", 0.0f}, + { "u_FontColor", nodeStyle.FontColor }, + { "u_PxRange", fontSize }, + { "u_SDF_BorderSize", {1.0, 1.0}} + }); + + mVertexArray->Bind(); + + float advance = 0.0f; + for (char const& c : string) + { + Char letter = font->GetChar((int)c); + + // Move the cursor + Matrix4 model = Matrix4(1.f); + model = glm::translate(model, position); + model = glm::translate(model, Vector3(advance * fontSize, (-(letter.PlaneBounds.top) + (font->LineHeight)) * fontSize, 0)); + + advance += (letter.Advance); + + // Scaling of the quad + float scaleX = (float)(letter.PlaneBounds.right - letter.PlaneBounds.left); + float scaleY = (float)(letter.PlaneBounds.top - letter.PlaneBounds.bottom); + model = glm::scale(model, Vector3(scaleX * fontSize, scaleY * fontSize, 1.f)); + + // Set Uniforms + mSDFShader->SetUniforms({ + { "u_Model", model }, + { "u_TexturePos", Vector2(letter.AtlasBounds.Pos.x, letter.AtlasBounds.Pos.y) }, + { "u_TextureScale", Vector2(letter.AtlasBounds.Size.x, letter.AtlasBounds.Size.y) }, + }); + + + glDrawArrays(GL_TRIANGLES, 0, 6); + } + + + mVertexArray->Unbind(); } } \ No newline at end of file diff --git a/Nuake/src/UI/Renderer.h b/Nuake/src/UI/Renderer.h index 2e08d5ec..1030e118 100644 --- a/Nuake/src/UI/Renderer.h +++ b/Nuake/src/UI/Renderer.h @@ -39,8 +39,8 @@ namespace NuakeUI Renderer(); ~Renderer() = default; - std::shared_ptr mShader; - std::shared_ptr mSDFShader; + Shader* mShader; + Shader* mSDFShader; std::shared_ptr mVertexArray; std::shared_ptr mVertexBuffer; }; diff --git a/Resources/Shaders/ui_panel.shader b/Resources/Shaders/ui_panel.shader index e69de29b..0a383256 100644 --- a/Resources/Shaders/ui_panel.shader +++ b/Resources/Shaders/ui_panel.shader @@ -0,0 +1,116 @@ +#shader vertex +#version 460 core + +layout(location = 0) in vec3 Position; +layout(location = 1) in vec2 UV; + +uniform mat4 u_Model; +uniform mat4 u_View; + +out vec2 v_UV; + +void main() { + v_UV = UV; + gl_Position = u_View * u_Model * vec4(Position, 1.0f); +} + +#shader fragment +#version 460 core + +in vec2 v_UV; +out vec4 FragColor; + +uniform vec2 u_Size; +uniform vec4 u_Color; +uniform vec4 u_BorderColor; +uniform float u_Border; +uniform float u_BorderRadius; +uniform sampler2D u_BackgroundImage; +uniform float u_HasBackgroundImage; + +float ShouldDiscard(vec2 coords, float border, vec2 dimensions, float radius) +{ + vec2 circle_center = vec2(radius + border, radius + border) - vec2(0.5, 0.5); + float dst = length(coords - circle_center); + float delta = fwidth(dst); + if (coords.x < circle_center.x && coords.y < circle_center.y) + return 1.0 - smoothstep(radius - delta, radius, dst); + + circle_center.x += dimensions.x - 2 * (radius + border) + 1.f; + dst = length(coords - circle_center); + delta = fwidth(dst); + if (coords.x > circle_center.x && coords.y < circle_center.y) + return 1.0 - smoothstep(radius - delta, radius, dst); + + circle_center.y += dimensions.y - 2 * (radius + border) + 1.f; + dst = length(coords - circle_center); + delta = fwidth(dst); + if (coords.x > circle_center.x && coords.y > circle_center.y) + return 1.0 - smoothstep(radius - delta, radius, dst); + + circle_center.x -= dimensions.x - 2 * (radius + border) + 1.f; + dst = length(coords - circle_center); + delta = fwidth(dst); + if (coords.x < circle_center.x && coords.y > circle_center.y) + return 1.0 - smoothstep(radius - delta, radius, dst); + + return 1.f; + +} + +void main() { + vec2 coords = v_UV * u_Size; + vec2 center = u_Size / 2.0; + vec4 finalColor = u_Color; + + vec4 textureColor = texture(u_BackgroundImage, v_UV); + finalColor.rgb = mix(finalColor, textureColor, u_HasBackgroundImage).rgb; + + if (u_HasBackgroundImage == 1.0) + { + finalColor.a = textureColor.a; + } + + float a = 1.0f; + if(u_BorderRadius >= 0.f) + { + a = min(ShouldDiscard(coords, 0, u_Size, u_BorderRadius + 2), finalColor.a); + if(a == 0.f) + discard; + } + + if(u_Border > 0.f) + { + float borderAlpha = ShouldDiscard(coords, u_Border, u_Size, u_BorderRadius); + + + if(a == 1.f) + { + finalColor = mix(u_BorderColor, finalColor, borderAlpha); + if(coords.x < u_Border || coords.x > u_Size.x - u_Border || + coords.y < u_Border || coords.y > u_Size.y - u_Border) + { + finalColor = u_BorderColor; + + } + else + { + finalColor.a = mix(borderAlpha, textureColor.a, u_HasBackgroundImage); + + } + + FragColor = finalColor; + return; + } + else + { + finalColor = u_BorderColor; + finalColor.a = max(a, u_BorderColor.a); + FragColor = finalColor; + return; + } + } + + finalColor.a = a; + FragColor = finalColor; +} \ No newline at end of file diff --git a/Resources/Shaders/ui_text.shader b/Resources/Shaders/ui_text.shader new file mode 100644 index 00000000..681a0ec7 --- /dev/null +++ b/Resources/Shaders/ui_text.shader @@ -0,0 +1,93 @@ +#shader vertex +#version 460 core +layout(location = 0) in vec3 Position; +layout(location = 1) in vec2 UV; + +uniform mat4 u_Model; +uniform mat4 u_View; + +out vec2 v_UV; + +void main() { + v_UV = UV; + float x = Position.x; + float y = Position.y; + float z = Position.z; + + gl_Position = u_View * u_Model * vec4(x, y, z, 1.0f); +} + +#shader fragment +#version 460 core + + +in sample vec2 v_UV; +out vec4 FragColor; + +uniform sampler2D u_Atlas; +uniform sample vec2 u_TexturePos; +uniform vec2 u_TextureScale; + +uniform vec4 u_FontColor; + +uniform float u_PxRange; + +float screenPxRange(vec2 coord) { + vec2 unitRange = vec2(u_PxRange) / vec2(textureSize(u_Atlas, 0)); + vec2 screenTexSize = vec2(1.0) / fwidth(coord); + return max(0.5 * dot(unitRange, screenTexSize), 1.0); +} + +float median(float r, float g, float b) { + return max(min(r, g), min(max(r, g), b)); +} + +float opacity(vec4 sdfSample) +{ + float r = sdfSample.r; + float g = sdfSample.g; + float b = sdfSample.b; + float signed_dist = median(r, g, b) - 0.5; + float d = fwidth(signed_dist); + float opacity = smoothstep(-d, d, signed_dist); + return opacity; +} + +void main() { + vec2 textSize = textureSize(u_Atlas, 0); + + vec2 uv = vec2(mix(u_TexturePos.x / textSize.x, u_TextureScale.x / textSize.x, v_UV.x), + mix(u_TextureScale.y / textSize.y, u_TexturePos.y / textSize.y, 1.0 - v_UV.y)); + + const float subPixelAmount = 1.333; + vec2 unitRange = 1.0 / textSize; + vec2 uvLeft = uv - vec2(unitRange.x * subPixelAmount, 0); + vec2 uvRight = uv + vec2(unitRange.x * subPixelAmount, 0); + vec2 uvUp = uv + vec2(0, unitRange.y * subPixelAmount); + float middle = opacity(texture(u_Atlas, uv)); + float left = opacity(texture(u_Atlas, uvLeft)); + float right = opacity(texture(u_Atlas, uvRight)); + float up = opacity(texture(u_Atlas, uvUp)); + + vec3 color = u_FontColor.rgb; + bool direction = false; + + const float ratio = 1.6666; + const float curve_tolerance = 1.0; + const float h_tolerance = 0; + + const bool subpixel = false; + const float subpixel_threshold = 1; + float curveAmount = up - middle; + bool mid = middle < (subpixel_threshold); + bool leftt = left < subpixel_threshold; + bool rightt = right < subpixel_threshold; + if(subpixel &&(middle < subpixel_threshold) && curveAmount < curve_tolerance) + { + color.r = left; + color.g = middle; + color.b = right; + } + + FragColor = vec4(color.rgb, middle); +} \ No newline at end of file