From 1e8a36f4dbc118c1a7d865b6257862433d8b97a2 Mon Sep 17 00:00:00 2001 From: Michael Pacheco Date: Fri, 17 Nov 2023 00:41:51 -0300 Subject: [PATCH 001/129] feat(linux): add development environment setup --- .clang-format | 11 ++++++++ .editorconfig | 11 ++++++++ .gitignore | 8 +++--- .husky/pre-commit | 11 ++++++++ CMakeLists.txt | 68 +++++++++++++++++++++++++++++++++++++++++++++++ README.md | 61 ++++++++++++++++++++++++------------------ package.json | 9 +++++++ src/main.cpp | 36 +++++++++++++++++++++++++ 8 files changed, 186 insertions(+), 29 deletions(-) create mode 100644 .clang-format create mode 100644 .editorconfig create mode 100644 .husky/pre-commit create mode 100644 CMakeLists.txt create mode 100644 package.json create mode 100644 src/main.cpp diff --git a/.clang-format b/.clang-format new file mode 100644 index 0000000..ee0508a --- /dev/null +++ b/.clang-format @@ -0,0 +1,11 @@ +--- +Language: Cpp +BasedOnStyle: Google +SeparateDefinitionBlocks: Leave +ColumnLimit: 80 +MaxEmptyLinesToKeep: 2 +PackConstructorInitializers: CurrentLine +BinPackArguments: false +BinPackParameters: false +AlignAfterOpenBracket: 'BlockIndent' +PenaltyIndentedWhitespace: 1 diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..dd60685 --- /dev/null +++ b/.editorconfig @@ -0,0 +1,11 @@ +root = true + +[*] +charset = utf-8 +end_of_line = lf +insert_final_newline = true +trim_trailing_whitespace = true + +[{CMakeLists.txt,*.cmake,*.rst}] +indent_size = 2 +indent_style = space diff --git a/.gitignore b/.gitignore index c0cd8bf..bd42be2 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,5 @@ -* -!LICENSE -!README.md +.idea/ +.vscode/ +cmake-build*/ +node_modules/ +*lock* diff --git a/.husky/pre-commit b/.husky/pre-commit new file mode 100644 index 0000000..d76eb81 --- /dev/null +++ b/.husky/pre-commit @@ -0,0 +1,11 @@ +#!/usr/bin/env sh +. "$(dirname -- "$0")/_/husky.sh" + + +FILES=$(git diff --cached --name-only --diff-filter=ACMR | grep -E '(src|include)/.+\.(cpp|h|cxx|hxx|hpp|c|inl)$') +[ -z "$FILES" ] && exit 0 + +echo "$FILES" | xargs clang-format -i +echo "$FILES" | xargs git add + +exit 0 diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 0000000..e112f8a --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,68 @@ +cmake_minimum_required(VERSION 3.22) +project(KhronosVulkanTutorialHpp CXX) + +set(CMAKE_CXX_STANDARD 17) +set(VULKAN_SDK_DIR "$ENV{VULKAN_SDK}") +set(SOURCES src/main.cpp) + +add_compile_definitions(GLFW_VULKAN_STATIC) + +add_executable(KhronosVulkanTutorialHpp ${SOURCES}) + +############################ External dependencies ############################# +include(FetchContent) + +#################################### Vulkan #################################### +find_package(Vulkan REQUIRED) +target_include_directories(KhronosVulkanTutorialHpp + PRIVATE + $ENV{VULKAN_SDK}/include +) + +##################################### GLFW ##################################### +option(GLFW_BUILD_EXAMPLES "Build the GLFW example programs" OFF) +option(GLFW_BUILD_TESTS "Build the GLFW test programs" OFF) +option(GLFW_BUILD_DOCS "Build the GLFW documentation" OFF) +option(GLFW_INSTALL "Generate installation target" OFF) + +FetchContent_Declare( + GLFW + GIT_REPOSITORY https://github.com/glfw/glfw.git + GIT_TAG 3.3.8 +) + +FetchContent_GetProperties(GLFW) +if (NOT GLFW_POPULATED) + FetchContent_Populate(GLFW) + add_subdirectory(${glfw_SOURCE_DIR} ${glfw_BINARY_DIR}) +endif () + +##################################### GLM ###################################### +FetchContent_Declare( + GLM + GIT_REPOSITORY https://github.com/g-truc/glm.git + GIT_TAG 0.9.9.8 +) + +FetchContent_GetProperties(GLM) +if (NOT GLM_POPULATED) + FetchContent_Populate(GLM) + add_subdirectory(${glm_SOURCE_DIR} ${glm_BINARY_DIR}) +endif () + +target_include_directories(KhronosVulkanTutorialHpp PRIVATE ${glm_SOURCE_DIR}) + +target_link_libraries(KhronosVulkanTutorialHpp + PRIVATE + Vulkan::Vulkan + glfw + dl + pthread + X11 + Xxf86vm + Xrandr + Xi +) + +# Install targets +install(TARGETS KhronosVulkanTutorialHpp DESTINATION bin) diff --git a/README.md b/README.md index b0ba5a4..8268a92 100644 --- a/README.md +++ b/README.md @@ -1,40 +1,49 @@ -# Khronos Tutorial for C++ +# C++ Khronos Tutorial for Linux Reimplementation of the original [C tutorial](https://docs.vulkan.org/tutorial/latest/00_Introduction.html) using the [Vulkan-Hpp](https://github.com/KhronosGroup/Vulkan-Hpp) binding. -For the sake of simplicity and compatibility with the original version, this -tutorial will not use unique handles nor RAII handles. -All resources will be created/released by hand. +General information [here](https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/blob/main/README.md). -**Each [chapter](https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp#chapters) will be developed in a separated -branch**. -Thus, it will be easier to find a specific change from one chapter to another, and we'll not pollute the code with a -bunch of macros. -I also separated branches for each platform. -The tutorial guide for linux wil be in a branch named `linux/...`. -**Those branches will never be merged into `main` due to platform differences**. +# Requirements -> [!IMPORTANT] -> Use the main branch only as a guidance. -> The actual implementations will be in separated branches for each platform for each chapter. +- C++17 compiler. I used the `Ubuntu clang version 17.0.5 (++20231114093837+98bfdac5ce82-1~exp1~20231114093938.66)` but + 16 should work fine. +- CMake 3.22 or higher. I used `3.26.4`. +- A build system. I'm using [Ninja](https://ninja-build.org/), but you can use Unix Makefiles if you want. -I did the entire tutorial on linux, thus I'll only implement for the linux branch, but you probably will be able to -build for other platforms without much effort. -Feel free to send PRs for other platforms. +# Setup -Probably I'll make some adjustments on the original code to keep the code readable. -Putting everything in a single class is not a good practice, and you will probably find it difficult to see the -relationship between Vulkan objects this way. -All adjustments will be pointed on its section in the README.md file. +The original tutorial installs dependencies using development library packages. +This is a quick start, but you lose control over your dependency versions. +I decided to manage the dependencies explicitly, but automatically, using CMake. -# Chapters +To set up your development environment, follow these steps: -## Development environment +1. Download and extract the [Vulkan SDK](https://vulkan.lunarg.com). I used version `1.3.268.0`. +2. Follow the SDK [installation steps](https://vulkan.lunarg.com/doc/sdk/1.3.268.0/linux/getting_started.html). +3. `git clone https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp` +4. `cd khronos-vulkan-tutorial-cpp` +5. (Optional) `bun install` or npm, pnpm, yarn, etc. + This will configure git hooks to automatically format the source code before commits. +6. Build the project: +```shell +# Generate build files +mkdir build && cd build -Original tutorial link: https://docs.vulkan.org/tutorial/latest/02_Development_environment.html +# This will download all dependencies to build/_deps directory +cmake -DCMAKE_MAKE_PROGRAM=ninja -DCMAKE_CXX_COMPILER=clang++-17 -G "Ninja Multi-Config" -S .. -B . -### Branches +# Build +cmake --build . --target KhronosVulkanTutorialHpp --config Debug -j 4 # Replace 4 with your CPU core count -- [Linux](https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/tree/linux/01-development-environment) +# Run +./Debug/KhronosVulkanTutorialHpp +``` + +If you did set up the SDK correctly, you'll see a message: + +``` +VULKAN_SDK found at +``` diff --git a/package.json b/package.json new file mode 100644 index 0000000..eccdd48 --- /dev/null +++ b/package.json @@ -0,0 +1,9 @@ +{ + "name": "khronos-tutorial-hpp", + "devDependencies": { + "husky": "^8.0.0" + }, + "scripts": { + "prepare": "husky install" + } +} diff --git a/src/main.cpp b/src/main.cpp new file mode 100644 index 0000000..e99bdc1 --- /dev/null +++ b/src/main.cpp @@ -0,0 +1,36 @@ +#define GLFW_INCLUDE_VULKAN +#include +#include + +#define GLM_FORCE_RADIANS +#define GLM_FORCE_DEPTH_ZERO_TO_ONE +#include +#include + +#include + +int main() { + glfwInit(); + + glfwWindowHint(GLFW_CLIENT_API, GLFW_NO_API); + GLFWwindow* window = glfwCreateWindow(800, 600, "Vulkan window", nullptr, nullptr); + + uint32_t extensionCount = 0; + vkEnumerateInstanceExtensionProperties(nullptr, &extensionCount, nullptr); + + std::cout << extensionCount << " extensions supported\n"; + + glm::mat4 matrix; + glm::vec4 vec; + auto test = matrix * vec; + + while(!glfwWindowShouldClose(window)) { + glfwPollEvents(); + } + + glfwDestroyWindow(window); + + glfwTerminate(); + + return 0; +} From 7b3324002e9371b31a987ff7335b2e80145887ca Mon Sep 17 00:00:00 2001 From: Michael Pacheco Date: Fri, 17 Nov 2023 00:56:58 -0300 Subject: [PATCH 002/129] refactor(linux): translate code to c++ with adjustments --- CMakeLists.txt | 5 +++++ src/main.cpp | 19 ++++++++----------- 2 files changed, 13 insertions(+), 11 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index e112f8a..1c6e19e 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -38,6 +38,11 @@ if (NOT GLFW_POPULATED) endif () ##################################### GLM ###################################### +add_compile_definitions( + GLM_FORCE_DEPTH_ZERO_TO_ONE + GLM_FORCE_RADIANS +) + FetchContent_Declare( GLM GIT_REPOSITORY https://github.com/g-truc/glm.git diff --git a/src/main.cpp b/src/main.cpp index e99bdc1..6090ac3 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -1,30 +1,27 @@ -#define GLFW_INCLUDE_VULKAN #include -#include -#define GLM_FORCE_RADIANS -#define GLM_FORCE_DEPTH_ZERO_TO_ONE -#include #include - +#include #include +#include int main() { glfwInit(); glfwWindowHint(GLFW_CLIENT_API, GLFW_NO_API); - GLFWwindow* window = glfwCreateWindow(800, 600, "Vulkan window", nullptr, nullptr); + GLFWwindow* window = + glfwCreateWindow(800, 600, "Vulkan window", nullptr, nullptr); - uint32_t extensionCount = 0; - vkEnumerateInstanceExtensionProperties(nullptr, &extensionCount, nullptr); + const std::vector properties = + vk::enumerateInstanceExtensionProperties(); - std::cout << extensionCount << " extensions supported\n"; + std::cout << properties.size() << " extensions supported\n"; glm::mat4 matrix; glm::vec4 vec; auto test = matrix * vec; - while(!glfwWindowShouldClose(window)) { + while (!glfwWindowShouldClose(window)) { glfwPollEvents(); } From ea4c13c752bc62a305ce55bd82866f64dd182c4d Mon Sep 17 00:00:00 2001 From: Michael Pacheco Date: Fri, 17 Nov 2023 01:07:14 -0300 Subject: [PATCH 003/129] docs(linux): add adjustments section to README.md --- README.md | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/README.md b/README.md index 8268a92..ffca074 100644 --- a/README.md +++ b/README.md @@ -28,6 +28,7 @@ To set up your development environment, follow these steps: 5. (Optional) `bun install` or npm, pnpm, yarn, etc. This will configure git hooks to automatically format the source code before commits. 6. Build the project: + ```shell # Generate build files mkdir build && cd build @@ -47,3 +48,10 @@ If you did set up the SDK correctly, you'll see a message: ``` VULKAN_SDK found at ``` + +# Adjustments + +- Moved `GLM_FORCE_RADIANS` and `GLM_FORCE_DEPTH_ZERO_TO_ONE` includes to + https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/blob/7b3324002e9371b31a987ff7335b2e80145887ca/CMakeLists.txt#L41 + +- Deleted `#define GLFW_INCLUDE_VULKAN` since it imports the `vulkan.h` and we are now using `vulkan.hpp` From bbfd4768f472c4c9915edec2d2d5d5a7da526ebc Mon Sep 17 00:00:00 2001 From: Michael Pacheco Date: Fri, 17 Nov 2023 13:59:48 -0300 Subject: [PATCH 004/129] docs(linux): add navigation to development environment step branch --- README.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/README.md b/README.md index ffca074..960cc3b 100644 --- a/README.md +++ b/README.md @@ -55,3 +55,9 @@ VULKAN_SDK found at https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/blob/7b3324002e9371b31a987ff7335b2e80145887ca/CMakeLists.txt#L41 - Deleted `#define GLFW_INCLUDE_VULKAN` since it imports the `vulkan.h` and we are now using `vulkan.hpp` + +# Navigation + +[🌐 Original tutorial](https://docs.vulkan.org/tutorial/latest/02_Development_environment.html) + +[⏭ Drawing a triangle / Setup / Base Code](https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/tree/linux/02-drawing-triangle/01-setup/01-base-code) From fed4f77447bd8453bbd291e2b54aa5658755fd3c Mon Sep 17 00:00:00 2001 From: Michael Pacheco Date: Fri, 17 Nov 2023 23:11:52 -0300 Subject: [PATCH 005/129] docs(linux): add table of content for linux implementations --- README.md | 41 ++++++----------------------------------- 1 file changed, 6 insertions(+), 35 deletions(-) diff --git a/README.md b/README.md index b0ba5a4..d66b33f 100644 --- a/README.md +++ b/README.md @@ -1,40 +1,11 @@ -# Khronos Tutorial for C++ +# C++ Khronos Tutorial for Linux Reimplementation of the original [C tutorial](https://docs.vulkan.org/tutorial/latest/00_Introduction.html) using the [Vulkan-Hpp](https://github.com/KhronosGroup/Vulkan-Hpp) binding. -For the sake of simplicity and compatibility with the original version, this -tutorial will not use unique handles nor RAII handles. -All resources will be created/released by hand. - -**Each [chapter](https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp#chapters) will be developed in a separated -branch**. -Thus, it will be easier to find a specific change from one chapter to another, and we'll not pollute the code with a -bunch of macros. -I also separated branches for each platform. -The tutorial guide for linux wil be in a branch named `linux/...`. -**Those branches will never be merged into `main` due to platform differences**. - -> [!IMPORTANT] -> Use the main branch only as a guidance. -> The actual implementations will be in separated branches for each platform for each chapter. - -I did the entire tutorial on linux, thus I'll only implement for the linux branch, but you probably will be able to -build for other platforms without much effort. -Feel free to send PRs for other platforms. - -Probably I'll make some adjustments on the original code to keep the code readable. -Putting everything in a single class is not a good practice, and you will probably find it difficult to see the -relationship between Vulkan objects this way. -All adjustments will be pointed on its section in the README.md file. - -# Chapters - -## Development environment - -Original tutorial link: https://docs.vulkan.org/tutorial/latest/02_Development_environment.html - -### Branches - -- [Linux](https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/tree/linux/01-development-environment) +* [Development environment](https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/tree/linux/01-development-environment) +* Setup + * [Base code](https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/tree/linux/02-drawing-triangle/01-setup/01-base-code) + * [Instance](https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/tree/linux/02-drawing-triangle/01-setup/02-instance) + * [Validation layers](https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/tree/linux/02-drawing-triangle/01-setup/03-validation-layers) From b0cbd8d7ae99eed54532e25152abeb01b4cbf168 Mon Sep 17 00:00:00 2001 From: Michael Pacheco Date: Sat, 18 Nov 2023 01:23:40 -0300 Subject: [PATCH 006/129] docs(linux): add link to physical devices and queue families branch --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index d66b33f..e66ea58 100644 --- a/README.md +++ b/README.md @@ -9,3 +9,4 @@ using the [Vulkan-Hpp](https://github.com/KhronosGroup/Vulkan-Hpp) binding. * [Base code](https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/tree/linux/02-drawing-triangle/01-setup/01-base-code) * [Instance](https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/tree/linux/02-drawing-triangle/01-setup/02-instance) * [Validation layers](https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/tree/linux/02-drawing-triangle/01-setup/03-validation-layers) + * [Physical devices and queue families](https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/tree/linux/02-drawing-triangle/01-setup/04-physical-devices-and-queue-families) From 41b31e98a9a2b1ec37ca489aaa4f05f6db3a4629 Mon Sep 17 00:00:00 2001 From: Michael Pacheco Date: Sat, 18 Nov 2023 02:26:41 -0300 Subject: [PATCH 007/129] docs(linux): add link to logical device and queues branch --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index e66ea58..b353070 100644 --- a/README.md +++ b/README.md @@ -10,3 +10,4 @@ using the [Vulkan-Hpp](https://github.com/KhronosGroup/Vulkan-Hpp) binding. * [Instance](https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/tree/linux/02-drawing-triangle/01-setup/02-instance) * [Validation layers](https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/tree/linux/02-drawing-triangle/01-setup/03-validation-layers) * [Physical devices and queue families](https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/tree/linux/02-drawing-triangle/01-setup/04-physical-devices-and-queue-families) + * [Logical device and queues](https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/tree/linux/02-drawing-triangle/01-setup/05-logical-device-and-queues) From a2331db4e54633bbe01cfa57a6b7376b08f5a476 Mon Sep 17 00:00:00 2001 From: Michael Pacheco Date: Sat, 18 Nov 2023 02:36:45 -0300 Subject: [PATCH 008/129] docs(linux): simplify README.md for development environment step --- README.md | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index 960cc3b..18384cc 100644 --- a/README.md +++ b/README.md @@ -1,10 +1,6 @@ -# C++ Khronos Tutorial for Linux +# Linux ❘ Development environment -Reimplementation of the original -[C tutorial](https://docs.vulkan.org/tutorial/latest/00_Introduction.html) -using the [Vulkan-Hpp](https://github.com/KhronosGroup/Vulkan-Hpp) binding. - -General information [here](https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/blob/main/README.md). +Summary [here](https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/tree/linux-summary). # Requirements From 5314d551e2f483d18ef569cf9076ecb49fd0d349 Mon Sep 17 00:00:00 2001 From: Michael Pacheco Date: Fri, 17 Nov 2023 12:30:58 -0300 Subject: [PATCH 009/129] feat(linux): create window and organize classes --- .clang-format | 2 +- CMakeLists.txt | 9 ++++++++- Makefile | 10 ++++++++++ src/Application.cpp | 26 ++++++++++++++++++++++++++ src/Application.hpp | 16 ++++++++++++++++ src/Config.hpp | 9 +++++++++ src/Window.cpp | 31 +++++++++++++++++++++++++++++++ src/Window.hpp | 19 +++++++++++++++++++ src/main.cpp | 35 +++++++++-------------------------- 9 files changed, 129 insertions(+), 28 deletions(-) create mode 100644 Makefile create mode 100644 src/Application.cpp create mode 100644 src/Application.hpp create mode 100644 src/Config.hpp create mode 100644 src/Window.cpp create mode 100644 src/Window.hpp diff --git a/.clang-format b/.clang-format index ee0508a..89d75e9 100644 --- a/.clang-format +++ b/.clang-format @@ -1,7 +1,7 @@ --- Language: Cpp BasedOnStyle: Google -SeparateDefinitionBlocks: Leave +SeparateDefinitionBlocks: Always ColumnLimit: 80 MaxEmptyLinesToKeep: 2 PackConstructorInitializers: CurrentLine diff --git a/CMakeLists.txt b/CMakeLists.txt index 1c6e19e..4ca7ccb 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -3,7 +3,14 @@ project(KhronosVulkanTutorialHpp CXX) set(CMAKE_CXX_STANDARD 17) set(VULKAN_SDK_DIR "$ENV{VULKAN_SDK}") -set(SOURCES src/main.cpp) +set(SOURCES + src/main.cpp + src/Application.cpp + src/Application.hpp + src/Window.cpp + src/Window.hpp + src/Config.hpp +) add_compile_definitions(GLFW_VULKAN_STATIC) diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..5c55cf8 --- /dev/null +++ b/Makefile @@ -0,0 +1,10 @@ +.PHONY: $(MAKECMDGOALS) + +clean: + rm -rf build* + +format: + find src -type f \ + -name "CMakeLists.txt" -o \ + -name "*.cpp" -o \ + -name "*.hpp" | xargs clang-format -i diff --git a/src/Application.cpp b/src/Application.cpp new file mode 100644 index 0000000..541ae01 --- /dev/null +++ b/src/Application.cpp @@ -0,0 +1,26 @@ +#include "Application.hpp" + +#include "Config.hpp" + +void Application::run() { + initWindow(); + initVulkan(); + mainLoop(); + cleanup(); +} + +void Application::initWindow() { + m_window.create( + Config::WINDOW_WIDTH, Config::WINDOW_HEIGHT, Config::WINDOW_TITLE + ); +} + +void Application::initVulkan() {} + +void Application::mainLoop() { + while (!m_window.shouldClose()) { + m_window.pollEvents(); + } +} + +void Application::cleanup() {} diff --git a/src/Application.hpp b/src/Application.hpp new file mode 100644 index 0000000..9425664 --- /dev/null +++ b/src/Application.hpp @@ -0,0 +1,16 @@ +#pragma once + +#include "Window.hpp" + +class Application { + public: + void run(); + + private: + Window m_window; + + void initWindow(); + void initVulkan(); + void mainLoop(); + void cleanup(); +}; diff --git a/src/Config.hpp b/src/Config.hpp new file mode 100644 index 0000000..0ddced3 --- /dev/null +++ b/src/Config.hpp @@ -0,0 +1,9 @@ +#pragma once + +#include + +struct Config { + static constexpr uint16_t WINDOW_WIDTH = 800; + static constexpr uint16_t WINDOW_HEIGHT = 600; + static constexpr char WINDOW_TITLE[] = "Vulkan"; +}; diff --git a/src/Window.cpp b/src/Window.cpp new file mode 100644 index 0000000..14ad8ad --- /dev/null +++ b/src/Window.cpp @@ -0,0 +1,31 @@ +#include "Window.hpp" + +Window::Window(uint16_t width, uint16_t height, const std::string& title) { + create(width, height, title); +} + +Window::~Window() { + if (m_window) { + glfwDestroyWindow(m_window); + } + + glfwTerminate(); +} + +void Window::create(uint16_t width, uint16_t height, const std::string& title) { + if (m_window) { + return; + } + + glfwInit(); + glfwWindowHint(GLFW_CLIENT_API, GLFW_NO_API); + glfwWindowHint(GLFW_RESIZABLE, GLFW_FALSE); + + m_window = glfwCreateWindow(width, height, title.c_str(), nullptr, nullptr); +} + +bool Window::shouldClose() { return glfwWindowShouldClose(m_window); } + +void Window::pollEvents() { // NOLINT(*-convert-member-functions-to-static) + glfwPollEvents(); +} diff --git a/src/Window.hpp b/src/Window.hpp new file mode 100644 index 0000000..1cd5359 --- /dev/null +++ b/src/Window.hpp @@ -0,0 +1,19 @@ +#pragma once + +#include + +#include + +class Window { + public: + Window() = default; + Window(uint16_t width, uint16_t height, const std::string& title); + ~Window(); + + void create(uint16_t width, uint16_t height, const std::string& title); + bool shouldClose(); + void pollEvents(); + + private: + GLFWwindow* m_window = nullptr; +}; diff --git a/src/main.cpp b/src/main.cpp index 6090ac3..84df1fd 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -1,33 +1,16 @@ -#include - -#include -#include #include -#include - -int main() { - glfwInit(); - - glfwWindowHint(GLFW_CLIENT_API, GLFW_NO_API); - GLFWwindow* window = - glfwCreateWindow(800, 600, "Vulkan window", nullptr, nullptr); - const std::vector properties = - vk::enumerateInstanceExtensionProperties(); +#include "Application.hpp" - std::cout << properties.size() << " extensions supported\n"; - - glm::mat4 matrix; - glm::vec4 vec; - auto test = matrix * vec; +int main() { + Application app; - while (!glfwWindowShouldClose(window)) { - glfwPollEvents(); + try { + app.run(); + } catch (const std::exception& e) { + std::cerr << e.what() << std::endl; + return EXIT_FAILURE; } - glfwDestroyWindow(window); - - glfwTerminate(); - - return 0; + return EXIT_SUCCESS; } From 7ee605d0954c515c6bf89720ec6c480080307afe Mon Sep 17 00:00:00 2001 From: Michael Pacheco Date: Fri, 17 Nov 2023 13:54:46 -0300 Subject: [PATCH 010/129] docs(linux): add navigation to base code step branch --- README.md | 66 ++++++++++++++++--------------------------------------- 1 file changed, 19 insertions(+), 47 deletions(-) diff --git a/README.md b/README.md index 18384cc..15f2de0 100644 --- a/README.md +++ b/README.md @@ -2,58 +2,30 @@ Summary [here](https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/tree/linux-summary). -# Requirements - -- C++17 compiler. I used the `Ubuntu clang version 17.0.5 (++20231114093837+98bfdac5ce82-1~exp1~20231114093938.66)` but - 16 should work fine. -- CMake 3.22 or higher. I used `3.26.4`. -- A build system. I'm using [Ninja](https://ninja-build.org/), but you can use Unix Makefiles if you want. - -# Setup - -The original tutorial installs dependencies using development library packages. -This is a quick start, but you lose control over your dependency versions. -I decided to manage the dependencies explicitly, but automatically, using CMake. - -To set up your development environment, follow these steps: - -1. Download and extract the [Vulkan SDK](https://vulkan.lunarg.com). I used version `1.3.268.0`. -2. Follow the SDK [installation steps](https://vulkan.lunarg.com/doc/sdk/1.3.268.0/linux/getting_started.html). -3. `git clone https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp` -4. `cd khronos-vulkan-tutorial-cpp` -5. (Optional) `bun install` or npm, pnpm, yarn, etc. - This will configure git hooks to automatically format the source code before commits. -6. Build the project: - -```shell -# Generate build files -mkdir build && cd build - -# This will download all dependencies to build/_deps directory -cmake -DCMAKE_MAKE_PROGRAM=ninja -DCMAKE_CXX_COMPILER=clang++-17 -G "Ninja Multi-Config" -S .. -B . - -# Build -cmake --build . --target KhronosVulkanTutorialHpp --config Debug -j 4 # Replace 4 with your CPU core count - -# Run -./Debug/KhronosVulkanTutorialHpp -``` +# Adjustments -If you did set up the SDK correctly, you'll see a message: +- Renamed class `HelloTriangleApplication` to `Application` since in the future this code will render much more + complex geometry than triangles. -``` -VULKAN_SDK found at -``` +- Moved code related to GLFW window management to a separate class. + I did this because it is very likely you will want to change the window management library in the future, + e.g. [Dear ImGUI](https://github.com/ocornut/imgui). + Thus, when you change window management library it will be a lot easier since there will be less code to change, + and it will be organized. -# Adjustments +- All classes have separated definition and implementation. Benefits of doing this: + - The code is encapsulated. Implementation details are separate from the API interface. + If in the future you decide to extract parts of the application to a library it will be much easier to do. + - Compilation time is reduced. + - Visibility of dependency usages. When you put everything on a single class, there will be lots of `#include` + macros, and you will likely get lost on who depends on who. -- Moved `GLM_FORCE_RADIANS` and `GLM_FORCE_DEPTH_ZERO_TO_ONE` includes to - https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/blob/7b3324002e9371b31a987ff7335b2e80145887ca/CMakeLists.txt#L41 +# Navigation -- Deleted `#define GLFW_INCLUDE_VULKAN` since it imports the `vulkan.h` and we are now using `vulkan.hpp` +[🌐 Original tutorial](https://docs.vulkan.org/tutorial/latest/03_Drawing_a_triangle/00_Setup/00_Base_code.html) -# Navigation +[⏮ Development environment](https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/tree/linux/01-development-environment) -[🌐 Original tutorial](https://docs.vulkan.org/tutorial/latest/02_Development_environment.html) +[⏭ Next step](https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/tree/linux/02-drawing-triangle/01-setup/02-instance) -[⏭ Drawing a triangle / Setup / Base Code](https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/tree/linux/02-drawing-triangle/01-setup/01-base-code) +[🔄 Diff from previous step](https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/compare/linux/01-development-environment...linux/02-drawing-triangle/01-setup/01-base-code) From cb497eaad5e02e1889f5df5d40e126f6686f4b51 Mon Sep 17 00:00:00 2001 From: Michael Pacheco Date: Fri, 17 Nov 2023 17:59:54 -0300 Subject: [PATCH 011/129] docs(linux): update next step link --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 15f2de0..08eb699 100644 --- a/README.md +++ b/README.md @@ -26,6 +26,6 @@ Summary [here](https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/tree/lin [⏮ Development environment](https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/tree/linux/01-development-environment) -[⏭ Next step](https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/tree/linux/02-drawing-triangle/01-setup/02-instance) +[⏭ Drawing a triangle / Setup / Instance](https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/tree/linux/02-drawing-triangle/01-setup/02-instance) [🔄 Diff from previous step](https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/compare/linux/01-development-environment...linux/02-drawing-triangle/01-setup/01-base-code) From 1ec2b026b07221a9428567087c6e01c58413b216 Mon Sep 17 00:00:00 2001 From: Michael Pacheco Date: Sat, 18 Nov 2023 02:39:26 -0300 Subject: [PATCH 012/129] docs(linux): simplify README.md for base code step --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 08eb699..2e19639 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# Linux ❘ Development environment +# Linux ❘ Setup ❘ Base code Summary [here](https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/tree/linux-summary). From e432d031271bfa77faa22342c9cfe9459046f99c Mon Sep 17 00:00:00 2001 From: Michael Pacheco Date: Fri, 17 Nov 2023 13:54:46 -0300 Subject: [PATCH 013/129] docs(linux): add navigation to base code step branch --- README.md | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 2e19639..60e6103 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,10 @@ -# Linux ❘ Setup ❘ Base code +# C++ Khronos Tutorial for Linux -Summary [here](https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/tree/linux-summary). +Reimplementation of the original +[C tutorial](https://docs.vulkan.org/tutorial/latest/00_Introduction.html) +using the [Vulkan-Hpp](https://github.com/KhronosGroup/Vulkan-Hpp) binding. + +General information [here](https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/blob/main/README.md). # Adjustments @@ -26,6 +30,6 @@ Summary [here](https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/tree/lin [⏮ Development environment](https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/tree/linux/01-development-environment) -[⏭ Drawing a triangle / Setup / Instance](https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/tree/linux/02-drawing-triangle/01-setup/02-instance) +[⏭ Next step](https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/tree/linux/02-drawing-triangle/01-setup/02-instance) [🔄 Diff from previous step](https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/compare/linux/01-development-environment...linux/02-drawing-triangle/01-setup/01-base-code) From 7920d7023ae5de2819589955bb8f3760d61c6c4f Mon Sep 17 00:00:00 2001 From: Michael Pacheco Date: Fri, 17 Nov 2023 17:27:25 -0300 Subject: [PATCH 014/129] feat(linux): create vk::Instance --- CMakeLists.txt | 2 ++ README.md | 61 +++++++++++++++++++++++++++++++-------------- src/Application.cpp | 26 +++++++++++++++++-- src/Application.hpp | 5 ++++ src/Config.hpp | 1 + src/Utils.cpp | 10 ++++++++ src/Utils.hpp | 7 ++++++ 7 files changed, 91 insertions(+), 21 deletions(-) create mode 100644 src/Utils.cpp create mode 100644 src/Utils.hpp diff --git a/CMakeLists.txt b/CMakeLists.txt index 4ca7ccb..0f87f99 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -10,6 +10,8 @@ set(SOURCES src/Window.cpp src/Window.hpp src/Config.hpp + src/Utils.cpp + src/Utils.hpp ) add_compile_definitions(GLFW_VULKAN_STATIC) diff --git a/README.md b/README.md index 60e6103..bd54c76 100644 --- a/README.md +++ b/README.md @@ -8,28 +8,51 @@ General information [here](https://github.com/Pacheco95/khronos-vulkan-tutorial- # Adjustments -- Renamed class `HelloTriangleApplication` to `Application` since in the future this code will render much more - complex geometry than triangles. - -- Moved code related to GLFW window management to a separate class. - I did this because it is very likely you will want to change the window management library in the future, - e.g. [Dear ImGUI](https://github.com/ocornut/imgui). - Thus, when you change window management library it will be a lot easier since there will be less code to change, - and it will be organized. - -- All classes have separated definition and implementation. Benefits of doing this: - - The code is encapsulated. Implementation details are separate from the API interface. - If in the future you decide to extract parts of the application to a library it will be much easier to do. - - Compilation time is reduced. - - Visibility of dependency usages. When you put everything on a single class, there will be lots of `#include` - macros, and you will likely get lost on who depends on who. +- Replaced all `VkType` to `vk::Type`. All C structs and enums will be replaced to their counterpart under `vk` + namespace. +- We'll not set the `sType` for structs anymore. `Vulkan-Hpp` does this for us in a typesafe way. +- Replaced the deprecated `VK_MAKE_VERSION` macro to `VK_MAKE_API_VERSION`. Pay attention to the first new parameter. +- There's no need to use list initialization anymore since all types have default constructors. + `VkApplicationInfo appInfo{};` becomes `vk::ApplicationInfo appInfo;` +- On some occasions, I'll use the type constructor to reduce lines of code like this: + + ```c++ + // Note the first parameter initialization with the default using with list initialization syntax + // See https://en.cppreference.com/w/cpp/language/list_initialization + vk::InstanceCreateInfo createInfo({}, &appInfo); + + // Instead of + vk::InstanceCreateInfo createInfo; + createInfo.pApplicationInfo = &appInfo; + ``` + + I advise you to take this approach very carefully since, in some cases, it can reduce the code legibility a lot. +- I will also use the fluent initialization of objects like this: + ```c++ + auto appInfo = + vk::ApplicationInfo() + .setPApplicationName(Config::APP_NAME) + .setApplicationVersion(VK_MAKE_API_VERSION(0, 1, 0, 0)) + .setPEngineName("No Engine") + .setEngineVersion(VK_MAKE_API_VERSION(0, 1, 0, 0)) + .setApiVersion(VK_API_VERSION_1_0); + ``` + It makes the code easier to read and avoid setting attributes on wrong objects. +- Vulkan-Hpp has exceptions enabled by default. + So, there is no need to check the results of **most** function calls that returns a `vk::Result`. + See https://github.com/KhronosGroup/Vulkan-Hpp#return-values-error-codes--exceptions. +- In Vulkan-Hpp, cleanup is done using the respective object's `destroy()` method. +- As you can see, there is no `m_window.destroy()` method in `cleanup()` for two reasons: + 1. `m_window` is an instance of our custom `Window` class and there's no such method. + 2. In C++ member variables are cleaned up using the first in, last out, aka. stack algorithm. And since `m_window` + is the first declared class variable, it will be the last to clean up. # Navigation -[🌐 Original tutorial](https://docs.vulkan.org/tutorial/latest/03_Drawing_a_triangle/00_Setup/00_Base_code.html) +[🌐 Original tutorial](https://docs.vulkan.org/tutorial/latest/03_Drawing_a_triangle/00_Setup/01_Instance.html) -[⏮ Development environment](https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/tree/linux/01-development-environment) +[⏮ Drawing a triangle / Setup / Base code](https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/tree/linux/02-drawing-triangle/01-setup/01-base-code) -[⏭ Next step](https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/tree/linux/02-drawing-triangle/01-setup/02-instance) +[⏭ Drawing a triangle / Setup / Validation layers](https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/tree/linux/02-drawing-triangle/01-setup/03-validation-layers) -[🔄 Diff from previous step](https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/compare/linux/01-development-environment...linux/02-drawing-triangle/01-setup/01-base-code) +[🔄 Diff from previous step](https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/compare/linux/02-drawing-triangle/01-setup/01-base-code...linux/02-drawing-triangle/01-setup/02-instance) diff --git a/src/Application.cpp b/src/Application.cpp index 541ae01..8b7935c 100644 --- a/src/Application.cpp +++ b/src/Application.cpp @@ -1,6 +1,7 @@ #include "Application.hpp" #include "Config.hpp" +#include "Utils.hpp" void Application::run() { initWindow(); @@ -15,7 +16,7 @@ void Application::initWindow() { ); } -void Application::initVulkan() {} +void Application::initVulkan() { createInstance(); } void Application::mainLoop() { while (!m_window.shouldClose()) { @@ -23,4 +24,25 @@ void Application::mainLoop() { } } -void Application::cleanup() {} +void Application::cleanup() { + m_instance.destroy(); +} + +void Application::createInstance() { + vk::ApplicationInfo appInfo = + vk::ApplicationInfo() + .setPApplicationName(Config::APP_NAME) + .setApplicationVersion(VK_MAKE_API_VERSION(0, 1, 0, 0)) + .setPEngineName("No Engine") + .setEngineVersion(VK_MAKE_API_VERSION(0, 1, 0, 0)) + .setApiVersion(VK_API_VERSION_1_0); + + std::vector extension = Utils::getGlfwRequiredInstanceExtensions(); + + vk::InstanceCreateInfo instanceInfo = + vk::InstanceCreateInfo() + .setPApplicationInfo(&appInfo) + .setPEnabledExtensionNames(extension); + + m_instance = vk::createInstance(instanceInfo); +} diff --git a/src/Application.hpp b/src/Application.hpp index 9425664..614e795 100644 --- a/src/Application.hpp +++ b/src/Application.hpp @@ -1,5 +1,7 @@ #pragma once +#include + #include "Window.hpp" class Application { @@ -8,9 +10,12 @@ class Application { private: Window m_window; + vk::Instance m_instance; void initWindow(); void initVulkan(); void mainLoop(); void cleanup(); + + void createInstance(); }; diff --git a/src/Config.hpp b/src/Config.hpp index 0ddced3..9143b2a 100644 --- a/src/Config.hpp +++ b/src/Config.hpp @@ -6,4 +6,5 @@ struct Config { static constexpr uint16_t WINDOW_WIDTH = 800; static constexpr uint16_t WINDOW_HEIGHT = 600; static constexpr char WINDOW_TITLE[] = "Vulkan"; + static constexpr char APP_NAME[] = "Vulkan Engine"; }; diff --git a/src/Utils.cpp b/src/Utils.cpp new file mode 100644 index 0000000..635decd --- /dev/null +++ b/src/Utils.cpp @@ -0,0 +1,10 @@ +#include "Utils.hpp" + +#include + +std::vector Utils::getGlfwRequiredInstanceExtensions() { + uint32_t count = 0; + const char** glfwExtensions = glfwGetRequiredInstanceExtensions(&count); + std::vector extensions(glfwExtensions, glfwExtensions + count); + return extensions; +} diff --git a/src/Utils.hpp b/src/Utils.hpp new file mode 100644 index 0000000..cb6c605 --- /dev/null +++ b/src/Utils.hpp @@ -0,0 +1,7 @@ +#pragma once + +#include + +struct Utils { + static std::vector getGlfwRequiredInstanceExtensions(); +}; From 731b3080df8d117e93ceb79cfd3bcdca2983435d Mon Sep 17 00:00:00 2001 From: Michael Pacheco Date: Sat, 18 Nov 2023 02:41:37 -0300 Subject: [PATCH 015/129] docs(linux): simplify README.md for instance step --- README.md | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index bd54c76..11f5e0a 100644 --- a/README.md +++ b/README.md @@ -1,10 +1,6 @@ -# C++ Khronos Tutorial for Linux +# Linux ❘ Setup ❘ Instance -Reimplementation of the original -[C tutorial](https://docs.vulkan.org/tutorial/latest/00_Introduction.html) -using the [Vulkan-Hpp](https://github.com/KhronosGroup/Vulkan-Hpp) binding. - -General information [here](https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/blob/main/README.md). +Summary [here](https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/tree/linux-summary). # Adjustments From c747e90b399907bd844744ea4903111460b30544 Mon Sep 17 00:00:00 2001 From: Michael Pacheco Date: Fri, 17 Nov 2023 13:54:46 -0300 Subject: [PATCH 016/129] docs(linux): add navigation to base code step branch --- README.md | 69 ++++++++++++++++++++----------------------------------- 1 file changed, 25 insertions(+), 44 deletions(-) diff --git a/README.md b/README.md index 11f5e0a..60e6103 100644 --- a/README.md +++ b/README.md @@ -1,54 +1,35 @@ -# Linux ❘ Setup ❘ Instance +# C++ Khronos Tutorial for Linux -Summary [here](https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/tree/linux-summary). +Reimplementation of the original +[C tutorial](https://docs.vulkan.org/tutorial/latest/00_Introduction.html) +using the [Vulkan-Hpp](https://github.com/KhronosGroup/Vulkan-Hpp) binding. + +General information [here](https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/blob/main/README.md). # Adjustments -- Replaced all `VkType` to `vk::Type`. All C structs and enums will be replaced to their counterpart under `vk` - namespace. -- We'll not set the `sType` for structs anymore. `Vulkan-Hpp` does this for us in a typesafe way. -- Replaced the deprecated `VK_MAKE_VERSION` macro to `VK_MAKE_API_VERSION`. Pay attention to the first new parameter. -- There's no need to use list initialization anymore since all types have default constructors. - `VkApplicationInfo appInfo{};` becomes `vk::ApplicationInfo appInfo;` -- On some occasions, I'll use the type constructor to reduce lines of code like this: - - ```c++ - // Note the first parameter initialization with the default using with list initialization syntax - // See https://en.cppreference.com/w/cpp/language/list_initialization - vk::InstanceCreateInfo createInfo({}, &appInfo); - - // Instead of - vk::InstanceCreateInfo createInfo; - createInfo.pApplicationInfo = &appInfo; - ``` - - I advise you to take this approach very carefully since, in some cases, it can reduce the code legibility a lot. -- I will also use the fluent initialization of objects like this: - ```c++ - auto appInfo = - vk::ApplicationInfo() - .setPApplicationName(Config::APP_NAME) - .setApplicationVersion(VK_MAKE_API_VERSION(0, 1, 0, 0)) - .setPEngineName("No Engine") - .setEngineVersion(VK_MAKE_API_VERSION(0, 1, 0, 0)) - .setApiVersion(VK_API_VERSION_1_0); - ``` - It makes the code easier to read and avoid setting attributes on wrong objects. -- Vulkan-Hpp has exceptions enabled by default. - So, there is no need to check the results of **most** function calls that returns a `vk::Result`. - See https://github.com/KhronosGroup/Vulkan-Hpp#return-values-error-codes--exceptions. -- In Vulkan-Hpp, cleanup is done using the respective object's `destroy()` method. -- As you can see, there is no `m_window.destroy()` method in `cleanup()` for two reasons: - 1. `m_window` is an instance of our custom `Window` class and there's no such method. - 2. In C++ member variables are cleaned up using the first in, last out, aka. stack algorithm. And since `m_window` - is the first declared class variable, it will be the last to clean up. +- Renamed class `HelloTriangleApplication` to `Application` since in the future this code will render much more + complex geometry than triangles. + +- Moved code related to GLFW window management to a separate class. + I did this because it is very likely you will want to change the window management library in the future, + e.g. [Dear ImGUI](https://github.com/ocornut/imgui). + Thus, when you change window management library it will be a lot easier since there will be less code to change, + and it will be organized. + +- All classes have separated definition and implementation. Benefits of doing this: + - The code is encapsulated. Implementation details are separate from the API interface. + If in the future you decide to extract parts of the application to a library it will be much easier to do. + - Compilation time is reduced. + - Visibility of dependency usages. When you put everything on a single class, there will be lots of `#include` + macros, and you will likely get lost on who depends on who. # Navigation -[🌐 Original tutorial](https://docs.vulkan.org/tutorial/latest/03_Drawing_a_triangle/00_Setup/01_Instance.html) +[🌐 Original tutorial](https://docs.vulkan.org/tutorial/latest/03_Drawing_a_triangle/00_Setup/00_Base_code.html) -[⏮ Drawing a triangle / Setup / Base code](https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/tree/linux/02-drawing-triangle/01-setup/01-base-code) +[⏮ Development environment](https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/tree/linux/01-development-environment) -[⏭ Drawing a triangle / Setup / Validation layers](https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/tree/linux/02-drawing-triangle/01-setup/03-validation-layers) +[⏭ Next step](https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/tree/linux/02-drawing-triangle/01-setup/02-instance) -[🔄 Diff from previous step](https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/compare/linux/02-drawing-triangle/01-setup/01-base-code...linux/02-drawing-triangle/01-setup/02-instance) +[🔄 Diff from previous step](https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/compare/linux/01-development-environment...linux/02-drawing-triangle/01-setup/01-base-code) From ee48d130e5ac834e758a472568c11ee158af0f17 Mon Sep 17 00:00:00 2001 From: Michael Pacheco Date: Fri, 17 Nov 2023 17:27:25 -0300 Subject: [PATCH 017/129] feat(linux): create vk::Instance --- README.md | 61 ++++++++++++++++++++++++++++++++++++++----------------- 1 file changed, 42 insertions(+), 19 deletions(-) diff --git a/README.md b/README.md index 60e6103..bd54c76 100644 --- a/README.md +++ b/README.md @@ -8,28 +8,51 @@ General information [here](https://github.com/Pacheco95/khronos-vulkan-tutorial- # Adjustments -- Renamed class `HelloTriangleApplication` to `Application` since in the future this code will render much more - complex geometry than triangles. - -- Moved code related to GLFW window management to a separate class. - I did this because it is very likely you will want to change the window management library in the future, - e.g. [Dear ImGUI](https://github.com/ocornut/imgui). - Thus, when you change window management library it will be a lot easier since there will be less code to change, - and it will be organized. - -- All classes have separated definition and implementation. Benefits of doing this: - - The code is encapsulated. Implementation details are separate from the API interface. - If in the future you decide to extract parts of the application to a library it will be much easier to do. - - Compilation time is reduced. - - Visibility of dependency usages. When you put everything on a single class, there will be lots of `#include` - macros, and you will likely get lost on who depends on who. +- Replaced all `VkType` to `vk::Type`. All C structs and enums will be replaced to their counterpart under `vk` + namespace. +- We'll not set the `sType` for structs anymore. `Vulkan-Hpp` does this for us in a typesafe way. +- Replaced the deprecated `VK_MAKE_VERSION` macro to `VK_MAKE_API_VERSION`. Pay attention to the first new parameter. +- There's no need to use list initialization anymore since all types have default constructors. + `VkApplicationInfo appInfo{};` becomes `vk::ApplicationInfo appInfo;` +- On some occasions, I'll use the type constructor to reduce lines of code like this: + + ```c++ + // Note the first parameter initialization with the default using with list initialization syntax + // See https://en.cppreference.com/w/cpp/language/list_initialization + vk::InstanceCreateInfo createInfo({}, &appInfo); + + // Instead of + vk::InstanceCreateInfo createInfo; + createInfo.pApplicationInfo = &appInfo; + ``` + + I advise you to take this approach very carefully since, in some cases, it can reduce the code legibility a lot. +- I will also use the fluent initialization of objects like this: + ```c++ + auto appInfo = + vk::ApplicationInfo() + .setPApplicationName(Config::APP_NAME) + .setApplicationVersion(VK_MAKE_API_VERSION(0, 1, 0, 0)) + .setPEngineName("No Engine") + .setEngineVersion(VK_MAKE_API_VERSION(0, 1, 0, 0)) + .setApiVersion(VK_API_VERSION_1_0); + ``` + It makes the code easier to read and avoid setting attributes on wrong objects. +- Vulkan-Hpp has exceptions enabled by default. + So, there is no need to check the results of **most** function calls that returns a `vk::Result`. + See https://github.com/KhronosGroup/Vulkan-Hpp#return-values-error-codes--exceptions. +- In Vulkan-Hpp, cleanup is done using the respective object's `destroy()` method. +- As you can see, there is no `m_window.destroy()` method in `cleanup()` for two reasons: + 1. `m_window` is an instance of our custom `Window` class and there's no such method. + 2. In C++ member variables are cleaned up using the first in, last out, aka. stack algorithm. And since `m_window` + is the first declared class variable, it will be the last to clean up. # Navigation -[🌐 Original tutorial](https://docs.vulkan.org/tutorial/latest/03_Drawing_a_triangle/00_Setup/00_Base_code.html) +[🌐 Original tutorial](https://docs.vulkan.org/tutorial/latest/03_Drawing_a_triangle/00_Setup/01_Instance.html) -[⏮ Development environment](https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/tree/linux/01-development-environment) +[⏮ Drawing a triangle / Setup / Base code](https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/tree/linux/02-drawing-triangle/01-setup/01-base-code) -[⏭ Next step](https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/tree/linux/02-drawing-triangle/01-setup/02-instance) +[⏭ Drawing a triangle / Setup / Validation layers](https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/tree/linux/02-drawing-triangle/01-setup/03-validation-layers) -[🔄 Diff from previous step](https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/compare/linux/01-development-environment...linux/02-drawing-triangle/01-setup/01-base-code) +[🔄 Diff from previous step](https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/compare/linux/02-drawing-triangle/01-setup/01-base-code...linux/02-drawing-triangle/01-setup/02-instance) From 87b702ecb5402a080454bed49d8d8b1aeac958c7 Mon Sep 17 00:00:00 2001 From: Michael Pacheco Date: Fri, 17 Nov 2023 22:38:42 -0300 Subject: [PATCH 018/129] feat(linux): add validation layer --- CMakeLists.txt | 3 ++ README.md | 54 ++++++--------------- src/Application.cpp | 37 +++++++++++++- src/Application.hpp | 2 + src/Config.cpp | 7 +++ src/Config.hpp | 18 +++++++ src/Utils.cpp | 9 +++- src/Utils.hpp | 2 +- src/ValidationLayer.cpp | 104 ++++++++++++++++++++++++++++++++++++++++ src/ValidationLayer.hpp | 22 +++++++++ 10 files changed, 215 insertions(+), 43 deletions(-) create mode 100644 src/Config.cpp create mode 100644 src/ValidationLayer.cpp create mode 100644 src/ValidationLayer.hpp diff --git a/CMakeLists.txt b/CMakeLists.txt index 0f87f99..48b615b 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -9,9 +9,12 @@ set(SOURCES src/Application.hpp src/Window.cpp src/Window.hpp + src/Config.cpp src/Config.hpp src/Utils.cpp src/Utils.hpp + src/ValidationLayer.cpp + src/ValidationLayer.hpp ) add_compile_definitions(GLFW_VULKAN_STATIC) diff --git a/README.md b/README.md index bd54c76..2366e19 100644 --- a/README.md +++ b/README.md @@ -8,51 +8,27 @@ General information [here](https://github.com/Pacheco95/khronos-vulkan-tutorial- # Adjustments -- Replaced all `VkType` to `vk::Type`. All C structs and enums will be replaced to their counterpart under `vk` - namespace. -- We'll not set the `sType` for structs anymore. `Vulkan-Hpp` does this for us in a typesafe way. -- Replaced the deprecated `VK_MAKE_VERSION` macro to `VK_MAKE_API_VERSION`. Pay attention to the first new parameter. -- There's no need to use list initialization anymore since all types have default constructors. - `VkApplicationInfo appInfo{};` becomes `vk::ApplicationInfo appInfo;` -- On some occasions, I'll use the type constructor to reduce lines of code like this: - +- All validation layer related code was moved to `ValidationLayer` class. +- `Config::IS_VALIDATION_LAYERS_ENABLED` was declared as `const` instead of `constexpr` and defined in `Config.cpp` + instead of `Config.hpp` to avoid compiler warnings saying that expression like this can be (erroneously) simplified: ```c++ - // Note the first parameter initialization with the default using with list initialization syntax - // See https://en.cppreference.com/w/cpp/language/list_initialization - vk::InstanceCreateInfo createInfo({}, &appInfo); - - // Instead of - vk::InstanceCreateInfo createInfo; - createInfo.pApplicationInfo = &appInfo; + if (Config::IS_VALIDATION_LAYERS_ENABLED) { + // The compiler is warning because Config::IS_VALIDATION_LAYERS_ENABLED is a constexpr + // and will always evaluate to true or false depending on your build target (Debug / Release) + } ``` +- `vkDestroyDebugUtilsMessengerEXT` is now loaded right after the `vk::Instance` creation instead of in `cleanup()` - I advise you to take this approach very carefully since, in some cases, it can reduce the code legibility a lot. -- I will also use the fluent initialization of objects like this: - ```c++ - auto appInfo = - vk::ApplicationInfo() - .setPApplicationName(Config::APP_NAME) - .setApplicationVersion(VK_MAKE_API_VERSION(0, 1, 0, 0)) - .setPEngineName("No Engine") - .setEngineVersion(VK_MAKE_API_VERSION(0, 1, 0, 0)) - .setApiVersion(VK_API_VERSION_1_0); - ``` - It makes the code easier to read and avoid setting attributes on wrong objects. -- Vulkan-Hpp has exceptions enabled by default. - So, there is no need to check the results of **most** function calls that returns a `vk::Result`. - See https://github.com/KhronosGroup/Vulkan-Hpp#return-values-error-codes--exceptions. -- In Vulkan-Hpp, cleanup is done using the respective object's `destroy()` method. -- As you can see, there is no `m_window.destroy()` method in `cleanup()` for two reasons: - 1. `m_window` is an instance of our custom `Window` class and there's no such method. - 2. In C++ member variables are cleaned up using the first in, last out, aka. stack algorithm. And since `m_window` - is the first declared class variable, it will be the last to clean up. +> [!TIP] +> At this point, you can clearly see the effect of our organization. +> The original formatted code has 231 lines and our `Application.cpp` only has 82. This is ≈ 64% less code! # Navigation -[🌐 Original tutorial](https://docs.vulkan.org/tutorial/latest/03_Drawing_a_triangle/00_Setup/01_Instance.html) +[🌐 Original tutorial](https://docs.vulkan.org/tutorial/latest/03_Drawing_a_triangle/00_Setup/02_Validation_layers.html) -[⏮ Drawing a triangle / Setup / Base code](https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/tree/linux/02-drawing-triangle/01-setup/01-base-code) +[⏮ Drawing a triangle / Setup / Instance](https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/tree/linux/02-drawing-triangle/01-setup/02-instance) -[⏭ Drawing a triangle / Setup / Validation layers](https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/tree/linux/02-drawing-triangle/01-setup/03-validation-layers) +[⏭ Drawing a triangle / Setup / Physical devices and queue families](https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/tree/linux/02-drawing-triangle/01-setup/04-physical-devices-and-queue-families) -[🔄 Diff from previous step](https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/compare/linux/02-drawing-triangle/01-setup/01-base-code...linux/02-drawing-triangle/01-setup/02-instance) +[🔄 Diff from previous step](https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/compare/linux/02-drawing-triangle/01-setup/02-instance...linux/02-drawing-triangle/01-setup/03-validation-layers) diff --git a/src/Application.cpp b/src/Application.cpp index 8b7935c..abae7a0 100644 --- a/src/Application.cpp +++ b/src/Application.cpp @@ -2,6 +2,7 @@ #include "Config.hpp" #include "Utils.hpp" +#include "ValidationLayer.hpp" void Application::run() { initWindow(); @@ -16,7 +17,10 @@ void Application::initWindow() { ); } -void Application::initVulkan() { createInstance(); } +void Application::initVulkan() { + createInstance(); + setupDebugMessenger(); +} void Application::mainLoop() { while (!m_window.shouldClose()) { @@ -25,10 +29,17 @@ void Application::mainLoop() { } void Application::cleanup() { + m_instance.destroy(m_debugMessenger); m_instance.destroy(); } void Application::createInstance() { + if (Config::IS_VALIDATION_LAYERS_ENABLED) { + if (!ValidationLayer::checkValidationLayerSupport()) { + throw std::runtime_error("Validation layers requested, but unavailable"); + } + } + vk::ApplicationInfo appInfo = vk::ApplicationInfo() .setPApplicationName(Config::APP_NAME) @@ -37,12 +48,34 @@ void Application::createInstance() { .setEngineVersion(VK_MAKE_API_VERSION(0, 1, 0, 0)) .setApiVersion(VK_API_VERSION_1_0); - std::vector extension = Utils::getGlfwRequiredInstanceExtensions(); + std::vector extension = Utils::getRequiredInstanceExtensions(); vk::InstanceCreateInfo instanceInfo = vk::InstanceCreateInfo() .setPApplicationInfo(&appInfo) .setPEnabledExtensionNames(extension); + vk::DebugUtilsMessengerCreateInfoEXT debugCreateInfo; + + if (Config::IS_VALIDATION_LAYERS_ENABLED) { + debugCreateInfo = ValidationLayer::getDebugUtilsMessengerCreateInfoEXT(); + + instanceInfo.pNext = &debugCreateInfo; + instanceInfo.setPEnabledLayerNames(Config::VALIDATION_LAYERS); + } + m_instance = vk::createInstance(instanceInfo); } + +void Application::setupDebugMessenger() { + if (!Config::IS_VALIDATION_LAYERS_ENABLED) { + return; + } + + ValidationLayer::loadDebugUtilsMessengerFunctions(m_instance); + + vk::DebugUtilsMessengerCreateInfoEXT createInfo = + ValidationLayer::getDebugUtilsMessengerCreateInfoEXT(); + + m_debugMessenger = m_instance.createDebugUtilsMessengerEXT(createInfo); +} diff --git a/src/Application.hpp b/src/Application.hpp index 614e795..a62a9e9 100644 --- a/src/Application.hpp +++ b/src/Application.hpp @@ -11,6 +11,7 @@ class Application { private: Window m_window; vk::Instance m_instance; + vk::DebugUtilsMessengerEXT m_debugMessenger; void initWindow(); void initVulkan(); @@ -18,4 +19,5 @@ class Application { void cleanup(); void createInstance(); + void setupDebugMessenger(); }; diff --git a/src/Config.cpp b/src/Config.cpp new file mode 100644 index 0000000..193cbdd --- /dev/null +++ b/src/Config.cpp @@ -0,0 +1,7 @@ +#include "Config.hpp" + +#ifdef NDEBUG +const bool Config::IS_VALIDATION_LAYERS_ENABLED = false; +#else +const bool Config::IS_VALIDATION_LAYERS_ENABLED = true; +#endif diff --git a/src/Config.hpp b/src/Config.hpp index 9143b2a..63c41c8 100644 --- a/src/Config.hpp +++ b/src/Config.hpp @@ -1,10 +1,28 @@ #pragma once #include +#include struct Config { static constexpr uint16_t WINDOW_WIDTH = 800; + static constexpr uint16_t WINDOW_HEIGHT = 600; + static constexpr char WINDOW_TITLE[] = "Vulkan"; + static constexpr char APP_NAME[] = "Vulkan Engine"; + + static constexpr std::array VALIDATION_LAYERS = { + "VK_LAYER_KHRONOS_validation"}; + + static const bool IS_VALIDATION_LAYERS_ENABLED; + + static constexpr auto DEBUG_MESSENGER_SEVERITY = + vk::DebugUtilsMessageSeverityFlagBitsEXT::eWarning | + vk::DebugUtilsMessageSeverityFlagBitsEXT::eError; + + static constexpr auto DEBUG_MESSAGE_TYPE = + vk::DebugUtilsMessageTypeFlagBitsEXT::eGeneral | + vk::DebugUtilsMessageTypeFlagBitsEXT::ePerformance | + vk::DebugUtilsMessageTypeFlagBitsEXT::eValidation; }; diff --git a/src/Utils.cpp b/src/Utils.cpp index 635decd..fab9cfe 100644 --- a/src/Utils.cpp +++ b/src/Utils.cpp @@ -2,9 +2,16 @@ #include -std::vector Utils::getGlfwRequiredInstanceExtensions() { +#include "Config.hpp" + +std::vector Utils::getRequiredInstanceExtensions() { uint32_t count = 0; const char** glfwExtensions = glfwGetRequiredInstanceExtensions(&count); std::vector extensions(glfwExtensions, glfwExtensions + count); + + if (Config::IS_VALIDATION_LAYERS_ENABLED) { + extensions.emplace_back(VK_EXT_DEBUG_UTILS_EXTENSION_NAME); + } + return extensions; } diff --git a/src/Utils.hpp b/src/Utils.hpp index cb6c605..e73a492 100644 --- a/src/Utils.hpp +++ b/src/Utils.hpp @@ -3,5 +3,5 @@ #include struct Utils { - static std::vector getGlfwRequiredInstanceExtensions(); + static std::vector getRequiredInstanceExtensions(); }; diff --git a/src/ValidationLayer.cpp b/src/ValidationLayer.cpp new file mode 100644 index 0000000..2cd261e --- /dev/null +++ b/src/ValidationLayer.cpp @@ -0,0 +1,104 @@ +#include "ValidationLayer.hpp" + +#include + +/** + * These functions are not automatically loaded by the Vulkan loader. + * That's why we created + * @code + * ValidationLayer::loadDebugUtilsMessengerFunctions(const vk::Instance&) + * @endcode + */ +PFN_vkCreateDebugUtilsMessengerEXT pfnVkCreateDebugUtilsMessengerEXT; +PFN_vkDestroyDebugUtilsMessengerEXT pfnVkDestroyDebugUtilsMessengerEXT; + +[[maybe_unused]] VKAPI_ATTR VkResult VKAPI_CALL vkCreateDebugUtilsMessengerEXT( + VkInstance instance, + const VkDebugUtilsMessengerCreateInfoEXT* pCreateInfo, + const VkAllocationCallbacks* pAllocator, + VkDebugUtilsMessengerEXT* pMessenger +) { + return pfnVkCreateDebugUtilsMessengerEXT( + instance, pCreateInfo, pAllocator, pMessenger + ); +} + +[[maybe_unused]] VKAPI_ATTR void VKAPI_CALL vkDestroyDebugUtilsMessengerEXT( + VkInstance instance, + VkDebugUtilsMessengerEXT messenger, + VkAllocationCallbacks const* pAllocator +) { + return pfnVkDestroyDebugUtilsMessengerEXT(instance, messenger, pAllocator); +} + +bool ValidationLayer::checkValidationLayerSupport() { + const std::vector& availableLayers = + vk::enumerateInstanceLayerProperties(); + + for (const auto& requestedLayerName : Config::VALIDATION_LAYERS) { + bool layerFound = false; + + for (const auto& layerProperties : availableLayers) { + if (strcmp(requestedLayerName, layerProperties.layerName) == 0) { + layerFound = true; + break; + } + } + + if (!layerFound) { + return false; + } + } + + return true; +} + +VkBool32 ValidationLayer::debugCallback( + [[maybe_unused]] VkDebugUtilsMessageSeverityFlagBitsEXT messageSeverity, + [[maybe_unused]] VkDebugUtilsMessageTypeFlagsEXT messageType, + const VkDebugUtilsMessengerCallbackDataEXT* pCallbackData, + [[maybe_unused]] void* pUserData +) { + std::cerr << "Validation layer: " << pCallbackData->pMessage << std::endl; + + return VK_FALSE; +} + +void ValidationLayer::loadDebugUtilsMessengerFunctions( + const vk::Instance& instance +) { + pfnVkCreateDebugUtilsMessengerEXT = + reinterpret_cast( + instance.getProcAddr("vkCreateDebugUtilsMessengerEXT") + ); + + if (!pfnVkCreateDebugUtilsMessengerEXT) { + throw std::runtime_error( + "GetInstanceProcAddr: Unable to find " + "pfnVkCreateDebugUtilsMessengerEXT function." + ); + } + + pfnVkDestroyDebugUtilsMessengerEXT = + reinterpret_cast( + instance.getProcAddr("vkDestroyDebugUtilsMessengerEXT") + ); + + if (!pfnVkDestroyDebugUtilsMessengerEXT) { + throw std::runtime_error( + "GetInstanceProcAddr: Unable to find " + "pfnVkDestroyDebugUtilsMessengerEXT function." + ); + } +} + +vk::DebugUtilsMessengerCreateInfoEXT +ValidationLayer::getDebugUtilsMessengerCreateInfoEXT() { + vk::DebugUtilsMessengerCreateInfoEXT createInfo = + vk::DebugUtilsMessengerCreateInfoEXT() + .setMessageSeverity(Config::DEBUG_MESSENGER_SEVERITY) + .setMessageType(Config::DEBUG_MESSAGE_TYPE) + .setPfnUserCallback(ValidationLayer::debugCallback); + + return createInfo; +} diff --git a/src/ValidationLayer.hpp b/src/ValidationLayer.hpp new file mode 100644 index 0000000..9f93e2c --- /dev/null +++ b/src/ValidationLayer.hpp @@ -0,0 +1,22 @@ +#pragma once + +#include + +#include "Config.hpp" + +class ValidationLayer { + public: + static bool checkValidationLayerSupport(); + + static VKAPI_ATTR VkBool32 VKAPI_CALL debugCallback( + [[maybe_unused]] VkDebugUtilsMessageSeverityFlagBitsEXT messageSeverity, + [[maybe_unused]] VkDebugUtilsMessageTypeFlagsEXT messageType, + const VkDebugUtilsMessengerCallbackDataEXT* pCallbackData, + [[maybe_unused]] void* pUserData + ); + + static void loadDebugUtilsMessengerFunctions(const vk::Instance& instance); + + static vk::DebugUtilsMessengerCreateInfoEXT + getDebugUtilsMessengerCreateInfoEXT(); +}; From debae036be785a700db233c94aee8538fbe33175 Mon Sep 17 00:00:00 2001 From: Michael Pacheco Date: Sat, 18 Nov 2023 02:44:17 -0300 Subject: [PATCH 019/129] docs(linux): simplify README.md for validation layers step --- README.md | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index 2366e19..adf8dcd 100644 --- a/README.md +++ b/README.md @@ -1,10 +1,6 @@ -# C++ Khronos Tutorial for Linux +# Linux ❘ Setup ❘ Validation layers -Reimplementation of the original -[C tutorial](https://docs.vulkan.org/tutorial/latest/00_Introduction.html) -using the [Vulkan-Hpp](https://github.com/KhronosGroup/Vulkan-Hpp) binding. - -General information [here](https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/blob/main/README.md). +Summary [here](https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/tree/linux-summary). # Adjustments From 250460a6d9978f962b5c09ff73276336f0f2f764 Mon Sep 17 00:00:00 2001 From: Michael Pacheco Date: Sat, 18 Nov 2023 00:36:52 -0300 Subject: [PATCH 020/129] feat(linux): pick physical device --- CMakeLists.txt | 2 ++ README.md | 15 +-------------- src/Application.cpp | 25 +++++++++++++++++++++++++ src/Application.hpp | 3 +++ src/QueueFamily.cpp | 23 +++++++++++++++++++++++ src/QueueFamily.hpp | 14 ++++++++++++++ 6 files changed, 68 insertions(+), 14 deletions(-) create mode 100644 src/QueueFamily.cpp create mode 100644 src/QueueFamily.hpp diff --git a/CMakeLists.txt b/CMakeLists.txt index 48b615b..c6df25c 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -15,6 +15,8 @@ set(SOURCES src/Utils.hpp src/ValidationLayer.cpp src/ValidationLayer.hpp + src/QueueFamily.cpp + src/QueueFamily.hpp ) add_compile_definitions(GLFW_VULKAN_STATIC) diff --git a/README.md b/README.md index adf8dcd..5addba6 100644 --- a/README.md +++ b/README.md @@ -4,20 +4,7 @@ Summary [here](https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/tree/lin # Adjustments -- All validation layer related code was moved to `ValidationLayer` class. -- `Config::IS_VALIDATION_LAYERS_ENABLED` was declared as `const` instead of `constexpr` and defined in `Config.cpp` - instead of `Config.hpp` to avoid compiler warnings saying that expression like this can be (erroneously) simplified: - ```c++ - if (Config::IS_VALIDATION_LAYERS_ENABLED) { - // The compiler is warning because Config::IS_VALIDATION_LAYERS_ENABLED is a constexpr - // and will always evaluate to true or false depending on your build target (Debug / Release) - } - ``` -- `vkDestroyDebugUtilsMessengerEXT` is now loaded right after the `vk::Instance` creation instead of in `cleanup()` - -> [!TIP] -> At this point, you can clearly see the effect of our organization. -> The original formatted code has 231 lines and our `Application.cpp` only has 82. This is ≈ 64% less code! +- # Navigation diff --git a/src/Application.cpp b/src/Application.cpp index abae7a0..239297d 100644 --- a/src/Application.cpp +++ b/src/Application.cpp @@ -1,6 +1,7 @@ #include "Application.hpp" #include "Config.hpp" +#include "QueueFamily.hpp" #include "Utils.hpp" #include "ValidationLayer.hpp" @@ -20,6 +21,7 @@ void Application::initWindow() { void Application::initVulkan() { createInstance(); setupDebugMessenger(); + pickPhysicalDevice(); } void Application::mainLoop() { @@ -79,3 +81,26 @@ void Application::setupDebugMessenger() { m_debugMessenger = m_instance.createDebugUtilsMessengerEXT(createInfo); } + +void Application::pickPhysicalDevice() { + using namespace std; + + const vector& devices = + m_instance.enumeratePhysicalDevices(); + + if (devices.empty()) { + throw runtime_error("Failed to findOrNull devices with Vulkan support"); + } + + auto it = find_if(devices.begin(), devices.end(), isDeviceSuitable); + + if (it == devices.end()) { + throw runtime_error("Failed to find a suitable GPU"); + } + + m_physicalDevice = *it; +} + +bool Application::isDeviceSuitable(const vk::PhysicalDevice& device) { + return QueueFamily::findIndices(device).isComplete(); +} diff --git a/src/Application.hpp b/src/Application.hpp index a62a9e9..dcb40b0 100644 --- a/src/Application.hpp +++ b/src/Application.hpp @@ -12,6 +12,7 @@ class Application { Window m_window; vk::Instance m_instance; vk::DebugUtilsMessengerEXT m_debugMessenger; + vk::PhysicalDevice m_physicalDevice; void initWindow(); void initVulkan(); @@ -20,4 +21,6 @@ class Application { void createInstance(); void setupDebugMessenger(); + void pickPhysicalDevice(); + static bool isDeviceSuitable(const vk::PhysicalDevice& device); }; diff --git a/src/QueueFamily.cpp b/src/QueueFamily.cpp new file mode 100644 index 0000000..d479b99 --- /dev/null +++ b/src/QueueFamily.cpp @@ -0,0 +1,23 @@ +#include "QueueFamily.hpp" + +using Indices = QueueFamily::Indices; + +bool Indices::isComplete() const { return graphicsFamily.has_value(); } + +Indices QueueFamily::findIndices(const vk::PhysicalDevice& device) { + Indices indices; + + const auto& queueFamilies = device.getQueueFamilyProperties(); + + for (uint32_t i = 0; i < queueFamilies.size(); i++) { + if (queueFamilies[i].queueFlags & vk::QueueFlagBits::eGraphics) { + indices.graphicsFamily = i; + } + + if (indices.isComplete()) { + break; + } + } + + return indices; +} diff --git a/src/QueueFamily.hpp b/src/QueueFamily.hpp new file mode 100644 index 0000000..9431604 --- /dev/null +++ b/src/QueueFamily.hpp @@ -0,0 +1,14 @@ +#pragma once + +#include +#include + +struct QueueFamily { + struct Indices { + std::optional graphicsFamily; + + [[nodiscard]] bool isComplete() const; + }; + + static Indices findIndices(const vk::PhysicalDevice& device); +}; From de048dd6dc1b037d72e4ebe289e2739ae2dda5b3 Mon Sep 17 00:00:00 2001 From: Michael Pacheco Date: Sat, 18 Nov 2023 01:20:35 -0300 Subject: [PATCH 021/129] docs(linux): document physical devices and queue families step --- README.md | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 5addba6..37072f7 100644 --- a/README.md +++ b/README.md @@ -4,14 +4,16 @@ Summary [here](https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/tree/lin # Adjustments -- +- Moved queue family related code to `QueueFamily` class. +- Used STL `std::find_if` to find a suitable GPU: + https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/blob/b70ae0e1b4f93d075de42c9c391de5afdfb6cf2a/src/Application.cpp#L95 # Navigation -[🌐 Original tutorial](https://docs.vulkan.org/tutorial/latest/03_Drawing_a_triangle/00_Setup/02_Validation_layers.html) +[🌐 Original tutorial](https://docs.vulkan.org/tutorial/latest/03_Drawing_a_triangle/00_Setup/03_Physical_devices_and_queue_families.html) -[⏮ Drawing a triangle / Setup / Instance](https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/tree/linux/02-drawing-triangle/01-setup/02-instance) +[⏮ Drawing a triangle / Setup / Validation layers](https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/tree/linux/02-drawing-triangle/01-setup/03-validation-layers) -[⏭ Drawing a triangle / Setup / Physical devices and queue families](https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/tree/linux/02-drawing-triangle/01-setup/04-physical-devices-and-queue-families) +[⏭ Drawing a triangle / Setup / Logical device and queues](https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/tree/linux/02-drawing-triangle/01-setup/05-logical-device-and-queues) -[🔄 Diff from previous step](https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/compare/linux/02-drawing-triangle/01-setup/02-instance...linux/02-drawing-triangle/01-setup/03-validation-layers) +[🔄 Diff from previous step](https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/compare/linux/02-drawing-triangle/01-setup/03-validation-layers...linux/02-drawing-triangle/01-setup/04-physical-devices-and-queue-families) From ce02d80b7b35444d8f824ccdc0a619f839dc13ac Mon Sep 17 00:00:00 2001 From: Michael Pacheco Date: Sat, 18 Nov 2023 02:58:40 -0300 Subject: [PATCH 022/129] docs(linux): add proper title of README.md for physical devices and queue families --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 37072f7..bc557e8 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# Linux ❘ Setup ❘ Validation layers +# Linux ❘ Setup ❘ Physical devices and queue families Summary [here](https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/tree/linux-summary). From b1bc16566e4e2310904f2f75bf07401ff83a0fa6 Mon Sep 17 00:00:00 2001 From: Michael Pacheco Date: Sat, 18 Nov 2023 02:23:44 -0300 Subject: [PATCH 023/129] feat(linux): setup logical device and graphics queue --- README.md | 19 ++++++++++++------- src/Application.cpp | 22 ++++++++++++++++++++++ src/Application.hpp | 6 +++++- 3 files changed, 39 insertions(+), 8 deletions(-) diff --git a/README.md b/README.md index bc557e8..1ce768e 100644 --- a/README.md +++ b/README.md @@ -4,16 +4,21 @@ Summary [here](https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/tree/lin # Adjustments -- Moved queue family related code to `QueueFamily` class. -- Used STL `std::find_if` to find a suitable GPU: - https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/blob/b70ae0e1b4f93d075de42c9c391de5afdfb6cf2a/src/Application.cpp#L95 +- We did not set up device-specific validation layers because it was deprecated a long time ago, and the documentation + states: + > [At the time of deprecation there were no known device-only layers and no compelling reason to create one.]( + > https://registry.khronos.org/vulkan/specs/1.3-extensions/html/chap46.html#extendingvulkan-layers-devicelayerdeprecation) # Navigation -[🌐 Original tutorial](https://docs.vulkan.org/tutorial/latest/03_Drawing_a_triangle/00_Setup/03_Physical_devices_and_queue_families.html) +[🌐 Original tutorial]( +https://docs.vulkan.org/tutorial/latest/03_Drawing_a_triangle/00_Setup/04_Logical_device_and_queues.html) -[⏮ Drawing a triangle / Setup / Validation layers](https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/tree/linux/02-drawing-triangle/01-setup/03-validation-layers) +[⏮ Drawing a triangle / Setup / Physical devices and queue families]( +https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/tree/linux/02-drawing-triangle/01-setup/04-physical-devices-and-queue-families) -[⏭ Drawing a triangle / Setup / Logical device and queues](https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/tree/linux/02-drawing-triangle/01-setup/05-logical-device-and-queues) +[⏭ Drawing a triangle / Setup / Logical device and queues]( +https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/tree/linux/02-drawing-triangle/01-setup/06-logical-device-and-queues) -[🔄 Diff from previous step](https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/compare/linux/02-drawing-triangle/01-setup/03-validation-layers...linux/02-drawing-triangle/01-setup/04-physical-devices-and-queue-families) +[🔄 Diff from previous step]( +https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/compare/linux/02-drawing-triangle/01-setup/04-physical-devices-and-queue-families...linux/02-drawing-triangle/01-setup/05-logical-device-and-queues) diff --git a/src/Application.cpp b/src/Application.cpp index 239297d..6adcfe9 100644 --- a/src/Application.cpp +++ b/src/Application.cpp @@ -22,6 +22,7 @@ void Application::initVulkan() { createInstance(); setupDebugMessenger(); pickPhysicalDevice(); + createLogicalDevice(); } void Application::mainLoop() { @@ -31,6 +32,7 @@ void Application::mainLoop() { } void Application::cleanup() { + m_device.destroy(); m_instance.destroy(m_debugMessenger); m_instance.destroy(); } @@ -101,6 +103,26 @@ void Application::pickPhysicalDevice() { m_physicalDevice = *it; } +void Application::createLogicalDevice() { + const auto& indices = QueueFamily::findIndices(m_physicalDevice); + const auto queuePriorities = {1.0f}; + vk::PhysicalDeviceFeatures deviceFeatures; + + auto queueCreateInfos = { + vk::DeviceQueueCreateInfo() + .setQueueFamilyIndex(indices.graphicsFamily.value()) + .setQueueCount(1) + .setQueuePriorities(queuePriorities)}; + + const auto& deviceCreateInfo = + vk::DeviceCreateInfo() + .setQueueCreateInfos(queueCreateInfos) + .setPEnabledFeatures(&deviceFeatures); + + m_device = m_physicalDevice.createDevice(deviceCreateInfo); + m_graphicsQueue = m_device.getQueue(indices.graphicsFamily.value(), 0); +} + bool Application::isDeviceSuitable(const vk::PhysicalDevice& device) { return QueueFamily::findIndices(device).isComplete(); } diff --git a/src/Application.hpp b/src/Application.hpp index dcb40b0..fcc698a 100644 --- a/src/Application.hpp +++ b/src/Application.hpp @@ -13,14 +13,18 @@ class Application { vk::Instance m_instance; vk::DebugUtilsMessengerEXT m_debugMessenger; vk::PhysicalDevice m_physicalDevice; + vk::Device m_device; + vk::Queue m_graphicsQueue; // Automatically destroyed void initWindow(); void initVulkan(); void mainLoop(); - void cleanup(); + void cleanup(); void createInstance(); void setupDebugMessenger(); void pickPhysicalDevice(); + void createLogicalDevice(); + static bool isDeviceSuitable(const vk::PhysicalDevice& device); }; From 7c3a054eae03e1908bcad37dcda2edec8893a451 Mon Sep 17 00:00:00 2001 From: Michael Pacheco Date: Sat, 18 Nov 2023 02:59:28 -0300 Subject: [PATCH 024/129] docs(linux): add proper title of README.md for logical device and queues branch --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 1ce768e..c7a4c06 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# Linux ❘ Setup ❘ Physical devices and queue families +# Linux ❘ Setup ❘ Logical device and queues Summary [here](https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/tree/linux-summary). From 130d138a84b9f3800350014ffced1941319a04a8 Mon Sep 17 00:00:00 2001 From: Michael Pacheco Date: Sat, 18 Nov 2023 12:27:00 -0300 Subject: [PATCH 025/129] docs(linux): add guidance to linux summary branch --- README.md | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index b353070..d045330 100644 --- a/README.md +++ b/README.md @@ -1,9 +1,19 @@ # C++ Khronos Tutorial for Linux -Reimplementation of the original +Reimplementation for Linux of the original [C tutorial](https://docs.vulkan.org/tutorial/latest/00_Introduction.html) using the [Vulkan-Hpp](https://github.com/KhronosGroup/Vulkan-Hpp) binding. +This branch contains all the commits. +Everytime a new chapter is implemented, it is merged here. +You can check the implementation until a given step using the table of contents below. +Each branch contains navigation links for previous/next steps and also a useful link to check the git diff between last +and current step. + +> [!IMPORTANT] +> If a bug was found during the development of the current branch, the fix **will not be applied to previous branches**. +> Instead, the next branch that fixes the bug will have a bugfix notice in the table of content below. + * [Development environment](https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/tree/linux/01-development-environment) * Setup * [Base code](https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/tree/linux/02-drawing-triangle/01-setup/01-base-code) From 496d45b94a2498b40bb7588692daf4288406999f Mon Sep 17 00:00:00 2001 From: Michael Pacheco Date: Sat, 18 Nov 2023 16:29:20 -0300 Subject: [PATCH 026/129] docs(linux): update navigation links --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index c7a4c06..e1391ba 100644 --- a/README.md +++ b/README.md @@ -18,7 +18,7 @@ https://docs.vulkan.org/tutorial/latest/03_Drawing_a_triangle/00_Setup/04_Logica https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/tree/linux/02-drawing-triangle/01-setup/04-physical-devices-and-queue-families) [⏭ Drawing a triangle / Setup / Logical device and queues]( -https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/tree/linux/02-drawing-triangle/01-setup/06-logical-device-and-queues) +https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/tree/linux/02-drawing-triangle/02-presentation/01-window-surface) [🔄 Diff from previous step]( https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/compare/linux/02-drawing-triangle/01-setup/04-physical-devices-and-queue-families...linux/02-drawing-triangle/01-setup/05-logical-device-and-queues) From fdf52d6dd3b098472a706f30b9a1e5b480825cb5 Mon Sep 17 00:00:00 2001 From: Michael Pacheco Date: Sat, 18 Nov 2023 18:25:58 -0300 Subject: [PATCH 027/129] feat(linux): create window surface and queues --- src/Application.cpp | 30 +++++++++++++++++------------- src/Application.hpp | 5 ++++- src/QueueFamily.cpp | 40 ++++++++++++++++++++++++++++++++++------ src/QueueFamily.hpp | 10 +++++++++- src/Window.cpp | 11 +++++++++++ src/Window.hpp | 3 +++ 6 files changed, 78 insertions(+), 21 deletions(-) diff --git a/src/Application.cpp b/src/Application.cpp index 6adcfe9..fdc3d69 100644 --- a/src/Application.cpp +++ b/src/Application.cpp @@ -21,6 +21,7 @@ void Application::initWindow() { void Application::initVulkan() { createInstance(); setupDebugMessenger(); + createSurface(); pickPhysicalDevice(); createLogicalDevice(); } @@ -33,6 +34,7 @@ void Application::mainLoop() { void Application::cleanup() { m_device.destroy(); + m_instance.destroy(m_surface); m_instance.destroy(m_debugMessenger); m_instance.destroy(); } @@ -94,35 +96,37 @@ void Application::pickPhysicalDevice() { throw runtime_error("Failed to findOrNull devices with Vulkan support"); } - auto it = find_if(devices.begin(), devices.end(), isDeviceSuitable); + for (const auto& device : devices) { + if (isDeviceSuitable(device)) { + m_physicalDevice = device; + } + } - if (it == devices.end()) { + if (!m_physicalDevice) { throw runtime_error("Failed to find a suitable GPU"); } - - m_physicalDevice = *it; } void Application::createLogicalDevice() { - const auto& indices = QueueFamily::findIndices(m_physicalDevice); - const auto queuePriorities = {1.0f}; + const auto& indices = QueueFamily::findIndices(m_physicalDevice, m_surface); + const auto& queueCreateInfos = indices.getQueueCreateInfos(); vk::PhysicalDeviceFeatures deviceFeatures; - auto queueCreateInfos = { - vk::DeviceQueueCreateInfo() - .setQueueFamilyIndex(indices.graphicsFamily.value()) - .setQueueCount(1) - .setQueuePriorities(queuePriorities)}; - const auto& deviceCreateInfo = vk::DeviceCreateInfo() .setQueueCreateInfos(queueCreateInfos) .setPEnabledFeatures(&deviceFeatures); m_device = m_physicalDevice.createDevice(deviceCreateInfo); + m_graphicsQueue = m_device.getQueue(indices.graphicsFamily.value(), 0); + m_presentQueue = m_device.getQueue(indices.presentFamily.value(), 0); +} + +void Application::createSurface() { + m_surface = m_window.createSurface(m_instance); } bool Application::isDeviceSuitable(const vk::PhysicalDevice& device) { - return QueueFamily::findIndices(device).isComplete(); + return QueueFamily::findIndices(device, m_surface).isComplete(); } diff --git a/src/Application.hpp b/src/Application.hpp index fcc698a..87b7723 100644 --- a/src/Application.hpp +++ b/src/Application.hpp @@ -12,9 +12,11 @@ class Application { Window m_window; vk::Instance m_instance; vk::DebugUtilsMessengerEXT m_debugMessenger; + vk::SurfaceKHR m_surface; vk::PhysicalDevice m_physicalDevice; vk::Device m_device; vk::Queue m_graphicsQueue; // Automatically destroyed + vk::Queue m_presentQueue; // Automatically destroyed void initWindow(); void initVulkan(); @@ -25,6 +27,7 @@ class Application { void setupDebugMessenger(); void pickPhysicalDevice(); void createLogicalDevice(); + void createSurface(); - static bool isDeviceSuitable(const vk::PhysicalDevice& device); + bool isDeviceSuitable(const vk::PhysicalDevice& device); }; diff --git a/src/QueueFamily.cpp b/src/QueueFamily.cpp index d479b99..fd8501f 100644 --- a/src/QueueFamily.cpp +++ b/src/QueueFamily.cpp @@ -2,16 +2,44 @@ using Indices = QueueFamily::Indices; -bool Indices::isComplete() const { return graphicsFamily.has_value(); } +bool Indices::isComplete() const { + return graphicsFamily.has_value() && presentFamily.has_value(); +} + +Indices::QueueCreateInfos QueueFamily::Indices::getQueueCreateInfos() const { + std::set uniqueFamilies = { + graphicsFamily.value(), presentFamily.value()}; + + float queuePriority = 1.0f; + QueueCreateInfos queueCreateInfos; + + for (uint32_t queueFamilyIndex : uniqueFamilies) { + const auto& queueCreateInfo = + vk::DeviceQueueCreateInfo() + .setQueueFamilyIndex(queueFamilyIndex) + .setQueueCount(1) + .setPQueuePriorities(&queuePriority); + + queueCreateInfos.emplace_back(queueCreateInfo); + } + + return queueCreateInfos; +} -Indices QueueFamily::findIndices(const vk::PhysicalDevice& device) { +Indices QueueFamily::findIndices( + const vk::PhysicalDevice& device, const vk::SurfaceKHR& surface +) { Indices indices; - const auto& queueFamilies = device.getQueueFamilyProperties(); + const auto& families = device.getQueueFamilyProperties(); + + for (uint32_t familyIndex = 0; familyIndex < families.size(); ++familyIndex) { + if (families[familyIndex].queueFlags & vk::QueueFlagBits::eGraphics) { + indices.graphicsFamily = familyIndex; + } - for (uint32_t i = 0; i < queueFamilies.size(); i++) { - if (queueFamilies[i].queueFlags & vk::QueueFlagBits::eGraphics) { - indices.graphicsFamily = i; + if (device.getSurfaceSupportKHR(familyIndex, surface)) { + indices.presentFamily = familyIndex; } if (indices.isComplete()) { diff --git a/src/QueueFamily.hpp b/src/QueueFamily.hpp index 9431604..c4ea9b3 100644 --- a/src/QueueFamily.hpp +++ b/src/QueueFamily.hpp @@ -1,14 +1,22 @@ #pragma once #include +#include #include struct QueueFamily { struct Indices { + typedef std::vector QueueCreateInfos; + std::optional graphicsFamily; + std::optional presentFamily; [[nodiscard]] bool isComplete() const; + + [[nodiscard]] QueueCreateInfos getQueueCreateInfos() const; }; - static Indices findIndices(const vk::PhysicalDevice& device); + static Indices findIndices( + const vk::PhysicalDevice& device, const vk::SurfaceKHR& surface + ); }; diff --git a/src/Window.cpp b/src/Window.cpp index 14ad8ad..45b2bf4 100644 --- a/src/Window.cpp +++ b/src/Window.cpp @@ -29,3 +29,14 @@ bool Window::shouldClose() { return glfwWindowShouldClose(m_window); } void Window::pollEvents() { // NOLINT(*-convert-member-functions-to-static) glfwPollEvents(); } + +vk::SurfaceKHR Window::createSurface(const vk::Instance& instance) { + VkSurfaceKHR surface; + + if (glfwCreateWindowSurface(instance, m_window, nullptr, &surface) != + VK_SUCCESS) { + throw std::runtime_error("Failed to create window surface"); + } + + return surface; +} diff --git a/src/Window.hpp b/src/Window.hpp index 1cd5359..ba22691 100644 --- a/src/Window.hpp +++ b/src/Window.hpp @@ -1,8 +1,10 @@ #pragma once +#define GLFW_INCLUDE_VULKAN #include #include +#include class Window { public: @@ -13,6 +15,7 @@ class Window { void create(uint16_t width, uint16_t height, const std::string& title); bool shouldClose(); void pollEvents(); + vk::SurfaceKHR createSurface(const vk::Instance& instance); private: GLFWwindow* m_window = nullptr; From aafc49426486489326652c82c149e8c9baf442d9 Mon Sep 17 00:00:00 2001 From: Michael Pacheco Date: Sat, 18 Nov 2023 18:47:21 -0300 Subject: [PATCH 028/129] docs(linux): update navigation links for widow surface branch --- README.md | 20 +++++++++----------- 1 file changed, 9 insertions(+), 11 deletions(-) diff --git a/README.md b/README.md index e1391ba..4421baa 100644 --- a/README.md +++ b/README.md @@ -1,24 +1,22 @@ -# Linux ❘ Setup ❘ Logical device and queues +# Linux ❘ Presentation ❘ Window surface Summary [here](https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/tree/linux-summary). # Adjustments -- We did not set up device-specific validation layers because it was deprecated a long time ago, and the documentation - states: - > [At the time of deprecation there were no known device-only layers and no compelling reason to create one.]( - > https://registry.khronos.org/vulkan/specs/1.3-extensions/html/chap46.html#extendingvulkan-layers-devicelayerdeprecation) +- Moved `vector` creation to `QueueFamily::Indices::getQueueCreateInfos()` + https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/blob/fdf52d6dd3b098472a706f30b9a1e5b480825cb5/src/QueueFamily.cpp#L9 # Navigation [🌐 Original tutorial]( -https://docs.vulkan.org/tutorial/latest/03_Drawing_a_triangle/00_Setup/04_Logical_device_and_queues.html) +https://docs.vulkan.org/tutorial/latest/03_Drawing_a_triangle/01_Presentation/00_Window_surface.html) -[⏮ Drawing a triangle / Setup / Physical devices and queue families]( -https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/tree/linux/02-drawing-triangle/01-setup/04-physical-devices-and-queue-families) +[⏮ Drawing a triangle / Setup / Logical device and queues]( +https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/tree/linux/02-drawing-triangle/01-setup/05-logical-device-and-queues) -[⏭ Drawing a triangle / Setup / Logical device and queues]( -https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/tree/linux/02-drawing-triangle/02-presentation/01-window-surface) +[⏭ Drawing a triangle / Presentation / Swap chain]( +https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/tree/linux/02-drawing-triangle/02-presentation/02-swapchain) [🔄 Diff from previous step]( -https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/compare/linux/02-drawing-triangle/01-setup/04-physical-devices-and-queue-families...linux/02-drawing-triangle/01-setup/05-logical-device-and-queues) +https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/compare/linux/02-drawing-triangle/01-setup/05-logical-device-and-queues...linux/02-drawing-triangle/02-presentation/01-window-surface) From e4cbf1bb38619457f2f5e068ed0d2266e15c5d10 Mon Sep 17 00:00:00 2001 From: Michael Pacheco Date: Sat, 18 Nov 2023 18:50:38 -0300 Subject: [PATCH 029/129] docs(linux): update navigation links for linux summary branch --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index d045330..726681c 100644 --- a/README.md +++ b/README.md @@ -21,3 +21,5 @@ and current step. * [Validation layers](https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/tree/linux/02-drawing-triangle/01-setup/03-validation-layers) * [Physical devices and queue families](https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/tree/linux/02-drawing-triangle/01-setup/04-physical-devices-and-queue-families) * [Logical device and queues](https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/tree/linux/02-drawing-triangle/01-setup/05-logical-device-and-queues) +* Presentation + * [Window surface](https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/tree/linux/02-drawing-triangle/02-presentation/01-window-surface) From e43611c47489b26538e6759978fc63fdaa70fcda Mon Sep 17 00:00:00 2001 From: Michael Pacheco Date: Sat, 18 Nov 2023 19:00:50 -0300 Subject: [PATCH 030/129] docs(linux): fix navigation links for device and queues branch --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index e1391ba..8a2cb28 100644 --- a/README.md +++ b/README.md @@ -17,7 +17,7 @@ https://docs.vulkan.org/tutorial/latest/03_Drawing_a_triangle/00_Setup/04_Logica [⏮ Drawing a triangle / Setup / Physical devices and queue families]( https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/tree/linux/02-drawing-triangle/01-setup/04-physical-devices-and-queue-families) -[⏭ Drawing a triangle / Setup / Logical device and queues]( +[⏭ Drawing a triangle / Presentation / Window surface]( https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/tree/linux/02-drawing-triangle/02-presentation/01-window-surface) [🔄 Diff from previous step]( From d7ddbfad363e384a8925b0cb4efb5b84297acbcf Mon Sep 17 00:00:00 2001 From: Michael Pacheco Date: Sat, 18 Nov 2023 18:25:58 -0300 Subject: [PATCH 031/129] feat(linux): create window surface and queues --- src/Application.cpp | 30 +++++++++++++++++------------- src/Application.hpp | 5 ++++- src/QueueFamily.cpp | 40 ++++++++++++++++++++++++++++++++++------ src/QueueFamily.hpp | 10 +++++++++- src/Window.cpp | 11 +++++++++++ src/Window.hpp | 3 +++ 6 files changed, 78 insertions(+), 21 deletions(-) diff --git a/src/Application.cpp b/src/Application.cpp index 6adcfe9..fdc3d69 100644 --- a/src/Application.cpp +++ b/src/Application.cpp @@ -21,6 +21,7 @@ void Application::initWindow() { void Application::initVulkan() { createInstance(); setupDebugMessenger(); + createSurface(); pickPhysicalDevice(); createLogicalDevice(); } @@ -33,6 +34,7 @@ void Application::mainLoop() { void Application::cleanup() { m_device.destroy(); + m_instance.destroy(m_surface); m_instance.destroy(m_debugMessenger); m_instance.destroy(); } @@ -94,35 +96,37 @@ void Application::pickPhysicalDevice() { throw runtime_error("Failed to findOrNull devices with Vulkan support"); } - auto it = find_if(devices.begin(), devices.end(), isDeviceSuitable); + for (const auto& device : devices) { + if (isDeviceSuitable(device)) { + m_physicalDevice = device; + } + } - if (it == devices.end()) { + if (!m_physicalDevice) { throw runtime_error("Failed to find a suitable GPU"); } - - m_physicalDevice = *it; } void Application::createLogicalDevice() { - const auto& indices = QueueFamily::findIndices(m_physicalDevice); - const auto queuePriorities = {1.0f}; + const auto& indices = QueueFamily::findIndices(m_physicalDevice, m_surface); + const auto& queueCreateInfos = indices.getQueueCreateInfos(); vk::PhysicalDeviceFeatures deviceFeatures; - auto queueCreateInfos = { - vk::DeviceQueueCreateInfo() - .setQueueFamilyIndex(indices.graphicsFamily.value()) - .setQueueCount(1) - .setQueuePriorities(queuePriorities)}; - const auto& deviceCreateInfo = vk::DeviceCreateInfo() .setQueueCreateInfos(queueCreateInfos) .setPEnabledFeatures(&deviceFeatures); m_device = m_physicalDevice.createDevice(deviceCreateInfo); + m_graphicsQueue = m_device.getQueue(indices.graphicsFamily.value(), 0); + m_presentQueue = m_device.getQueue(indices.presentFamily.value(), 0); +} + +void Application::createSurface() { + m_surface = m_window.createSurface(m_instance); } bool Application::isDeviceSuitable(const vk::PhysicalDevice& device) { - return QueueFamily::findIndices(device).isComplete(); + return QueueFamily::findIndices(device, m_surface).isComplete(); } diff --git a/src/Application.hpp b/src/Application.hpp index fcc698a..87b7723 100644 --- a/src/Application.hpp +++ b/src/Application.hpp @@ -12,9 +12,11 @@ class Application { Window m_window; vk::Instance m_instance; vk::DebugUtilsMessengerEXT m_debugMessenger; + vk::SurfaceKHR m_surface; vk::PhysicalDevice m_physicalDevice; vk::Device m_device; vk::Queue m_graphicsQueue; // Automatically destroyed + vk::Queue m_presentQueue; // Automatically destroyed void initWindow(); void initVulkan(); @@ -25,6 +27,7 @@ class Application { void setupDebugMessenger(); void pickPhysicalDevice(); void createLogicalDevice(); + void createSurface(); - static bool isDeviceSuitable(const vk::PhysicalDevice& device); + bool isDeviceSuitable(const vk::PhysicalDevice& device); }; diff --git a/src/QueueFamily.cpp b/src/QueueFamily.cpp index d479b99..fd8501f 100644 --- a/src/QueueFamily.cpp +++ b/src/QueueFamily.cpp @@ -2,16 +2,44 @@ using Indices = QueueFamily::Indices; -bool Indices::isComplete() const { return graphicsFamily.has_value(); } +bool Indices::isComplete() const { + return graphicsFamily.has_value() && presentFamily.has_value(); +} + +Indices::QueueCreateInfos QueueFamily::Indices::getQueueCreateInfos() const { + std::set uniqueFamilies = { + graphicsFamily.value(), presentFamily.value()}; + + float queuePriority = 1.0f; + QueueCreateInfos queueCreateInfos; + + for (uint32_t queueFamilyIndex : uniqueFamilies) { + const auto& queueCreateInfo = + vk::DeviceQueueCreateInfo() + .setQueueFamilyIndex(queueFamilyIndex) + .setQueueCount(1) + .setPQueuePriorities(&queuePriority); + + queueCreateInfos.emplace_back(queueCreateInfo); + } + + return queueCreateInfos; +} -Indices QueueFamily::findIndices(const vk::PhysicalDevice& device) { +Indices QueueFamily::findIndices( + const vk::PhysicalDevice& device, const vk::SurfaceKHR& surface +) { Indices indices; - const auto& queueFamilies = device.getQueueFamilyProperties(); + const auto& families = device.getQueueFamilyProperties(); + + for (uint32_t familyIndex = 0; familyIndex < families.size(); ++familyIndex) { + if (families[familyIndex].queueFlags & vk::QueueFlagBits::eGraphics) { + indices.graphicsFamily = familyIndex; + } - for (uint32_t i = 0; i < queueFamilies.size(); i++) { - if (queueFamilies[i].queueFlags & vk::QueueFlagBits::eGraphics) { - indices.graphicsFamily = i; + if (device.getSurfaceSupportKHR(familyIndex, surface)) { + indices.presentFamily = familyIndex; } if (indices.isComplete()) { diff --git a/src/QueueFamily.hpp b/src/QueueFamily.hpp index 9431604..c4ea9b3 100644 --- a/src/QueueFamily.hpp +++ b/src/QueueFamily.hpp @@ -1,14 +1,22 @@ #pragma once #include +#include #include struct QueueFamily { struct Indices { + typedef std::vector QueueCreateInfos; + std::optional graphicsFamily; + std::optional presentFamily; [[nodiscard]] bool isComplete() const; + + [[nodiscard]] QueueCreateInfos getQueueCreateInfos() const; }; - static Indices findIndices(const vk::PhysicalDevice& device); + static Indices findIndices( + const vk::PhysicalDevice& device, const vk::SurfaceKHR& surface + ); }; diff --git a/src/Window.cpp b/src/Window.cpp index 14ad8ad..45b2bf4 100644 --- a/src/Window.cpp +++ b/src/Window.cpp @@ -29,3 +29,14 @@ bool Window::shouldClose() { return glfwWindowShouldClose(m_window); } void Window::pollEvents() { // NOLINT(*-convert-member-functions-to-static) glfwPollEvents(); } + +vk::SurfaceKHR Window::createSurface(const vk::Instance& instance) { + VkSurfaceKHR surface; + + if (glfwCreateWindowSurface(instance, m_window, nullptr, &surface) != + VK_SUCCESS) { + throw std::runtime_error("Failed to create window surface"); + } + + return surface; +} diff --git a/src/Window.hpp b/src/Window.hpp index 1cd5359..ba22691 100644 --- a/src/Window.hpp +++ b/src/Window.hpp @@ -1,8 +1,10 @@ #pragma once +#define GLFW_INCLUDE_VULKAN #include #include +#include class Window { public: @@ -13,6 +15,7 @@ class Window { void create(uint16_t width, uint16_t height, const std::string& title); bool shouldClose(); void pollEvents(); + vk::SurfaceKHR createSurface(const vk::Instance& instance); private: GLFWwindow* m_window = nullptr; From 05b2ce1260d9ef419ed822fef82c76590382dc40 Mon Sep 17 00:00:00 2001 From: Michael Pacheco Date: Sat, 18 Nov 2023 18:47:21 -0300 Subject: [PATCH 032/129] docs(linux): update navigation links for widow surface branch --- README.md | 20 +++++++++----------- 1 file changed, 9 insertions(+), 11 deletions(-) diff --git a/README.md b/README.md index 8a2cb28..4421baa 100644 --- a/README.md +++ b/README.md @@ -1,24 +1,22 @@ -# Linux ❘ Setup ❘ Logical device and queues +# Linux ❘ Presentation ❘ Window surface Summary [here](https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/tree/linux-summary). # Adjustments -- We did not set up device-specific validation layers because it was deprecated a long time ago, and the documentation - states: - > [At the time of deprecation there were no known device-only layers and no compelling reason to create one.]( - > https://registry.khronos.org/vulkan/specs/1.3-extensions/html/chap46.html#extendingvulkan-layers-devicelayerdeprecation) +- Moved `vector` creation to `QueueFamily::Indices::getQueueCreateInfos()` + https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/blob/fdf52d6dd3b098472a706f30b9a1e5b480825cb5/src/QueueFamily.cpp#L9 # Navigation [🌐 Original tutorial]( -https://docs.vulkan.org/tutorial/latest/03_Drawing_a_triangle/00_Setup/04_Logical_device_and_queues.html) +https://docs.vulkan.org/tutorial/latest/03_Drawing_a_triangle/01_Presentation/00_Window_surface.html) -[⏮ Drawing a triangle / Setup / Physical devices and queue families]( -https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/tree/linux/02-drawing-triangle/01-setup/04-physical-devices-and-queue-families) +[⏮ Drawing a triangle / Setup / Logical device and queues]( +https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/tree/linux/02-drawing-triangle/01-setup/05-logical-device-and-queues) -[⏭ Drawing a triangle / Presentation / Window surface]( -https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/tree/linux/02-drawing-triangle/02-presentation/01-window-surface) +[⏭ Drawing a triangle / Presentation / Swap chain]( +https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/tree/linux/02-drawing-triangle/02-presentation/02-swapchain) [🔄 Diff from previous step]( -https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/compare/linux/02-drawing-triangle/01-setup/04-physical-devices-and-queue-families...linux/02-drawing-triangle/01-setup/05-logical-device-and-queues) +https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/compare/linux/02-drawing-triangle/01-setup/05-logical-device-and-queues...linux/02-drawing-triangle/02-presentation/01-window-surface) From dc361778e3c571d7b25a3e6d73a18c8f025d6b92 Mon Sep 17 00:00:00 2001 From: Michael Pacheco Date: Sat, 18 Nov 2023 19:10:23 -0300 Subject: [PATCH 033/129] docs(linux): update navigation links for swap chain branch --- README.md | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/README.md b/README.md index 4421baa..4defb7e 100644 --- a/README.md +++ b/README.md @@ -1,22 +1,21 @@ -# Linux ❘ Presentation ❘ Window surface +# Linux ❘ Presentation ❘ Swap chain Summary [here](https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/tree/linux-summary). # Adjustments -- Moved `vector` creation to `QueueFamily::Indices::getQueueCreateInfos()` - https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/blob/fdf52d6dd3b098472a706f30b9a1e5b480825cb5/src/QueueFamily.cpp#L9 + # Navigation [🌐 Original tutorial]( -https://docs.vulkan.org/tutorial/latest/03_Drawing_a_triangle/01_Presentation/00_Window_surface.html) +https://docs.vulkan.org/tutorial/latest/03_Drawing_a_triangle/01_Presentation/01_Swap_chain.html) -[⏮ Drawing a triangle / Setup / Logical device and queues]( -https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/tree/linux/02-drawing-triangle/01-setup/05-logical-device-and-queues) +[⏮ Drawing a triangle / Presentation / Window surface]( +https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/tree/linux/02-drawing-triangle/02-presentation/01-window-surface) [⏭ Drawing a triangle / Presentation / Swap chain]( -https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/tree/linux/02-drawing-triangle/02-presentation/02-swapchain) +https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/tree/linux/02-drawing-triangle/02-presentation/03-image-views) [🔄 Diff from previous step]( -https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/compare/linux/02-drawing-triangle/01-setup/05-logical-device-and-queues...linux/02-drawing-triangle/02-presentation/01-window-surface) +https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/compare/linux/02-drawing-triangle/02-presentation/01-window-surface...linux/02-drawing-triangle/02-presentation/02-swapchain) From e9b7aa1bc97ad21ce2462df8cd9f22dc1c2c3b63 Mon Sep 17 00:00:00 2001 From: Michael Pacheco Date: Sat, 18 Nov 2023 22:51:18 -0300 Subject: [PATCH 034/129] feat(linux): create swap chain --- .husky/pre-commit | 0 src/Application.cpp | 160 ++++++++++++++++++++++++++++++++++++++++++-- src/Application.hpp | 27 ++++++-- src/Config.cpp | 3 + src/Config.hpp | 2 + src/QueueFamily.cpp | 26 +++---- src/Utils.hpp | 5 ++ src/Window.cpp | 10 +++ src/Window.hpp | 1 + 9 files changed, 211 insertions(+), 23 deletions(-) mode change 100644 => 100755 .husky/pre-commit diff --git a/.husky/pre-commit b/.husky/pre-commit old mode 100644 new mode 100755 diff --git a/src/Application.cpp b/src/Application.cpp index fdc3d69..ecd6424 100644 --- a/src/Application.cpp +++ b/src/Application.cpp @@ -1,10 +1,24 @@ #include "Application.hpp" +#include + #include "Config.hpp" #include "QueueFamily.hpp" #include "Utils.hpp" #include "ValidationLayer.hpp" +struct SwapChainSupportDetails { + vk::SurfaceCapabilitiesKHR capabilities; + std::vector formats; + std::vector presentModes; + + SwapChainSupportDetails(vk::PhysicalDevice device, vk::SurfaceKHR surface) { + capabilities = device.getSurfaceCapabilitiesKHR(surface); + formats = device.getSurfaceFormatsKHR(surface); + presentModes = device.getSurfacePresentModesKHR(surface); + } +}; + void Application::run() { initWindow(); initVulkan(); @@ -24,6 +38,7 @@ void Application::initVulkan() { createSurface(); pickPhysicalDevice(); createLogicalDevice(); + createSwapChain(); } void Application::mainLoop() { @@ -33,6 +48,7 @@ void Application::mainLoop() { } void Application::cleanup() { + m_device.destroy(m_swapChain); m_device.destroy(); m_instance.destroy(m_surface); m_instance.destroy(m_debugMessenger); @@ -54,12 +70,12 @@ void Application::createInstance() { .setEngineVersion(VK_MAKE_API_VERSION(0, 1, 0, 0)) .setApiVersion(VK_API_VERSION_1_0); - std::vector extension = Utils::getRequiredInstanceExtensions(); + std::vector extensions = Utils::getRequiredInstanceExtensions(); vk::InstanceCreateInfo instanceInfo = vk::InstanceCreateInfo() .setPApplicationInfo(&appInfo) - .setPEnabledExtensionNames(extension); + .setPEnabledExtensionNames(extensions); vk::DebugUtilsMessengerCreateInfoEXT debugCreateInfo; @@ -86,6 +102,10 @@ void Application::setupDebugMessenger() { m_debugMessenger = m_instance.createDebugUtilsMessengerEXT(createInfo); } +void Application::createSurface() { + m_surface = m_window.createSurface(m_instance); +} + void Application::pickPhysicalDevice() { using namespace std; @@ -115,7 +135,8 @@ void Application::createLogicalDevice() { const auto& deviceCreateInfo = vk::DeviceCreateInfo() .setQueueCreateInfos(queueCreateInfos) - .setPEnabledFeatures(&deviceFeatures); + .setPEnabledFeatures(&deviceFeatures) + .setPEnabledExtensionNames(Config::DEVICE_EXTENSIONS); m_device = m_physicalDevice.createDevice(deviceCreateInfo); @@ -123,10 +144,137 @@ void Application::createLogicalDevice() { m_presentQueue = m_device.getQueue(indices.presentFamily.value(), 0); } -void Application::createSurface() { - m_surface = m_window.createSurface(m_instance); +void Application::createSwapChain() { + SwapChainSupportDetails swapChainSupport{m_physicalDevice, m_surface}; + + const vk::SurfaceFormatKHR& surfaceFormat = + chooseSwapSurfaceFormat(swapChainSupport.formats); + + const vk::PresentModeKHR& presentMode = + chooseSwapPresentMode(swapChainSupport.presentModes); + + const vk::Extent2D& extent = chooseSwapExtent(swapChainSupport.capabilities); + + uint32_t requestImageCount = swapChainSupport.capabilities.minImageCount + 1; + uint32_t maxImageCount = swapChainSupport.capabilities.maxImageCount; + + bool hasLimitedImageCount = maxImageCount > 0; + + if (hasLimitedImageCount && requestImageCount > maxImageCount) { + requestImageCount = maxImageCount; + } + + auto createInfo = + vk::SwapchainCreateInfoKHR() + .setSurface(m_surface) + .setMinImageCount(requestImageCount) + .setImageFormat(surfaceFormat.format) + .setImageColorSpace(surfaceFormat.colorSpace) + .setImageExtent(extent) + .setImageArrayLayers(1) + .setImageUsage(vk::ImageUsageFlagBits::eColorAttachment) + .setPreTransform(swapChainSupport.capabilities.currentTransform) + .setCompositeAlpha(vk::CompositeAlphaFlagBitsKHR::eOpaque) + .setPresentMode(presentMode) + .setClipped(vk::True); + + const auto& indices = QueueFamily::findIndices(m_physicalDevice, m_surface); + + uint32_t queueFamilyIndices[] = { + indices.graphicsFamily.value(), indices.presentFamily.value()}; + + if (indices.graphicsFamily == indices.presentFamily) { + createInfo.imageSharingMode = vk::SharingMode::eExclusive; + } else { + createInfo.imageSharingMode = vk::SharingMode::eConcurrent; + createInfo.setQueueFamilyIndices(queueFamilyIndices); + } + + m_swapChain = m_device.createSwapchainKHR(createInfo); + m_swapChainImages = m_device.getSwapchainImagesKHR(m_swapChain); + m_swapChainImageFormat = surfaceFormat.format; + m_swapChainExtent = extent; } bool Application::isDeviceSuitable(const vk::PhysicalDevice& device) { - return QueueFamily::findIndices(device, m_surface).isComplete(); + const auto& indices = QueueFamily::findIndices(device, m_surface); + bool extensionsSupported = checkDeviceExtensionSupport(device); + + bool suitableSwapChain; + + if (extensionsSupported) { + SwapChainSupportDetails swapChainSupport = + SwapChainSupportDetails(device, m_surface); + + suitableSwapChain = Utils::noneOf( + swapChainSupport.formats.empty(), swapChainSupport.presentModes.empty() + ); + } + + return indices.isComplete() && extensionsSupported && suitableSwapChain; +} + +bool Application::checkDeviceExtensionSupport(const vk::PhysicalDevice& device +) { + std::vector availableExtensions = + device.enumerateDeviceExtensionProperties(); + + std::set requiredExtensions( + Config::DEVICE_EXTENSIONS.begin(), Config::DEVICE_EXTENSIONS.end() + ); + + for (const vk::ExtensionProperties& extension : availableExtensions) { + requiredExtensions.erase(extension.extensionName); + } + + return requiredExtensions.empty(); +} + +vk::SurfaceFormatKHR Application::chooseSwapSurfaceFormat( + const std::vector& availableFormats +) { + for (const auto& availableFormat : availableFormats) { + if (availableFormat.format == vk::Format::eB8G8R8A8Srgb && + availableFormat.colorSpace == vk::ColorSpaceKHR::eSrgbNonlinear) { + return availableFormat; + } + } + + return availableFormats[0]; +} + +vk::PresentModeKHR Application::chooseSwapPresentMode( + const std::vector& availablePresentModes +) { + for (const auto& availablePresentMode : availablePresentModes) { + if (availablePresentMode == vk::PresentModeKHR::eMailbox) { + return availablePresentMode; + } + } + + return vk::PresentModeKHR::eFifo; +} + +vk::Extent2D Application::chooseSwapExtent( + const vk::SurfaceCapabilitiesKHR& capabilities +) { + if (capabilities.currentExtent.width != + std::numeric_limits::max()) { + return capabilities.currentExtent; + } + + vk::Extent2D actualExtent = m_window.getExtent(); + + actualExtent.width = std::clamp( + actualExtent.width, + capabilities.minImageExtent.width, + capabilities.maxImageExtent.width + ); + actualExtent.height = std::clamp( + actualExtent.height, + capabilities.minImageExtent.height, + capabilities.maxImageExtent.height + ); + + return actualExtent; } diff --git a/src/Application.hpp b/src/Application.hpp index 87b7723..b824926 100644 --- a/src/Application.hpp +++ b/src/Application.hpp @@ -15,19 +15,38 @@ class Application { vk::SurfaceKHR m_surface; vk::PhysicalDevice m_physicalDevice; vk::Device m_device; - vk::Queue m_graphicsQueue; // Automatically destroyed - vk::Queue m_presentQueue; // Automatically destroyed + vk::Queue m_graphicsQueue; // Destroyed by logical device + vk::Queue m_presentQueue; // Destroyed by logical device + vk::SwapchainKHR m_swapChain; + std::vector m_swapChainImages; // Destroyed by swap chain + vk::Format m_swapChainImageFormat; + vk::Extent2D m_swapChainExtent; void initWindow(); void initVulkan(); void mainLoop(); - void cleanup(); + void createInstance(); void setupDebugMessenger(); + void createSurface(); void pickPhysicalDevice(); void createLogicalDevice(); - void createSurface(); + void createSwapChain(); bool isDeviceSuitable(const vk::PhysicalDevice& device); + + [[nodiscard]] static bool checkDeviceExtensionSupport( + const vk::PhysicalDevice& device + ); + + static vk::SurfaceFormatKHR chooseSwapSurfaceFormat( + const std::vector& availableFormats + ); + + static vk::PresentModeKHR chooseSwapPresentMode( + const std::vector& availablePresentModes + ); + + vk::Extent2D chooseSwapExtent(const vk::SurfaceCapabilitiesKHR& capabilities); }; diff --git a/src/Config.cpp b/src/Config.cpp index 193cbdd..620a963 100644 --- a/src/Config.cpp +++ b/src/Config.cpp @@ -5,3 +5,6 @@ const bool Config::IS_VALIDATION_LAYERS_ENABLED = false; #else const bool Config::IS_VALIDATION_LAYERS_ENABLED = true; #endif + +const std::vector Config::DEVICE_EXTENSIONS{ + VK_KHR_SWAPCHAIN_EXTENSION_NAME}; diff --git a/src/Config.hpp b/src/Config.hpp index 63c41c8..cdf332c 100644 --- a/src/Config.hpp +++ b/src/Config.hpp @@ -25,4 +25,6 @@ struct Config { vk::DebugUtilsMessageTypeFlagBitsEXT::eGeneral | vk::DebugUtilsMessageTypeFlagBitsEXT::ePerformance | vk::DebugUtilsMessageTypeFlagBitsEXT::eValidation; + + static const std::vector DEVICE_EXTENSIONS; }; diff --git a/src/QueueFamily.cpp b/src/QueueFamily.cpp index fd8501f..a6887b1 100644 --- a/src/QueueFamily.cpp +++ b/src/QueueFamily.cpp @@ -7,23 +7,23 @@ bool Indices::isComplete() const { } Indices::QueueCreateInfos QueueFamily::Indices::getQueueCreateInfos() const { - std::set uniqueFamilies = { - graphicsFamily.value(), presentFamily.value()}; + std::set uniqueFamilies = { + graphicsFamily.value(), presentFamily.value()}; - float queuePriority = 1.0f; - QueueCreateInfos queueCreateInfos; + float queuePriority = 1.0f; + QueueCreateInfos queueCreateInfos; - for (uint32_t queueFamilyIndex : uniqueFamilies) { - const auto& queueCreateInfo = - vk::DeviceQueueCreateInfo() - .setQueueFamilyIndex(queueFamilyIndex) - .setQueueCount(1) - .setPQueuePriorities(&queuePriority); + for (uint32_t queueFamilyIndex : uniqueFamilies) { + const auto& queueCreateInfo = + vk::DeviceQueueCreateInfo() + .setQueueFamilyIndex(queueFamilyIndex) + .setQueueCount(1) + .setPQueuePriorities(&queuePriority); - queueCreateInfos.emplace_back(queueCreateInfo); - } + queueCreateInfos.emplace_back(queueCreateInfo); + } - return queueCreateInfos; + return queueCreateInfos; } Indices QueueFamily::findIndices( diff --git a/src/Utils.hpp b/src/Utils.hpp index e73a492..e82022c 100644 --- a/src/Utils.hpp +++ b/src/Utils.hpp @@ -4,4 +4,9 @@ struct Utils { static std::vector getRequiredInstanceExtensions(); + + template + static bool noneOf(Args... args) { + return (... || !args); + } }; diff --git a/src/Window.cpp b/src/Window.cpp index 45b2bf4..6728a0d 100644 --- a/src/Window.cpp +++ b/src/Window.cpp @@ -40,3 +40,13 @@ vk::SurfaceKHR Window::createSurface(const vk::Instance& instance) { return surface; } + +vk::Extent2D Window::getExtent() { + int width, height; + glfwGetFramebufferSize(m_window, &width, &height); + + vk::Extent2D actualExtent = { + static_cast(width), static_cast(height)}; + + return actualExtent; +} diff --git a/src/Window.hpp b/src/Window.hpp index ba22691..be74acd 100644 --- a/src/Window.hpp +++ b/src/Window.hpp @@ -16,6 +16,7 @@ class Window { bool shouldClose(); void pollEvents(); vk::SurfaceKHR createSurface(const vk::Instance& instance); + vk::Extent2D getExtent(); private: GLFWwindow* m_window = nullptr; From aa019e3e0ecb460e4bbb96f41de342b345bc93b6 Mon Sep 17 00:00:00 2001 From: Michael Pacheco Date: Sat, 18 Nov 2023 23:12:55 -0300 Subject: [PATCH 035/129] refactor(linux): improve methods constness and remove unused code --- src/Application.cpp | 4 ++-- src/Application.hpp | 10 ++++++---- src/Window.cpp | 10 +++------- src/Window.hpp | 12 ++++++++---- 4 files changed, 19 insertions(+), 17 deletions(-) diff --git a/src/Application.cpp b/src/Application.cpp index ecd6424..893a7ea 100644 --- a/src/Application.cpp +++ b/src/Application.cpp @@ -196,7 +196,7 @@ void Application::createSwapChain() { m_swapChainExtent = extent; } -bool Application::isDeviceSuitable(const vk::PhysicalDevice& device) { +bool Application::isDeviceSuitable(const vk::PhysicalDevice& device) const { const auto& indices = QueueFamily::findIndices(device, m_surface); bool extensionsSupported = checkDeviceExtensionSupport(device); @@ -257,7 +257,7 @@ vk::PresentModeKHR Application::chooseSwapPresentMode( vk::Extent2D Application::chooseSwapExtent( const vk::SurfaceCapabilitiesKHR& capabilities -) { +) const { if (capabilities.currentExtent.width != std::numeric_limits::max()) { return capabilities.currentExtent; diff --git a/src/Application.hpp b/src/Application.hpp index b824926..295b01c 100644 --- a/src/Application.hpp +++ b/src/Application.hpp @@ -34,19 +34,21 @@ class Application { void createLogicalDevice(); void createSwapChain(); - bool isDeviceSuitable(const vk::PhysicalDevice& device); + [[nodiscard]] bool isDeviceSuitable(const vk::PhysicalDevice& device) const; [[nodiscard]] static bool checkDeviceExtensionSupport( const vk::PhysicalDevice& device ); - static vk::SurfaceFormatKHR chooseSwapSurfaceFormat( + [[nodiscard]] static vk::SurfaceFormatKHR chooseSwapSurfaceFormat( const std::vector& availableFormats ); - static vk::PresentModeKHR chooseSwapPresentMode( + [[nodiscard]] static vk::PresentModeKHR chooseSwapPresentMode( const std::vector& availablePresentModes ); - vk::Extent2D chooseSwapExtent(const vk::SurfaceCapabilitiesKHR& capabilities); + [[nodiscard]] vk::Extent2D chooseSwapExtent( + const vk::SurfaceCapabilitiesKHR& capabilities + ) const; }; diff --git a/src/Window.cpp b/src/Window.cpp index 6728a0d..93f1efe 100644 --- a/src/Window.cpp +++ b/src/Window.cpp @@ -1,9 +1,5 @@ #include "Window.hpp" -Window::Window(uint16_t width, uint16_t height, const std::string& title) { - create(width, height, title); -} - Window::~Window() { if (m_window) { glfwDestroyWindow(m_window); @@ -24,13 +20,13 @@ void Window::create(uint16_t width, uint16_t height, const std::string& title) { m_window = glfwCreateWindow(width, height, title.c_str(), nullptr, nullptr); } -bool Window::shouldClose() { return glfwWindowShouldClose(m_window); } +bool Window::shouldClose() const { return glfwWindowShouldClose(m_window); } void Window::pollEvents() { // NOLINT(*-convert-member-functions-to-static) glfwPollEvents(); } -vk::SurfaceKHR Window::createSurface(const vk::Instance& instance) { +vk::SurfaceKHR Window::createSurface(const vk::Instance& instance) const { VkSurfaceKHR surface; if (glfwCreateWindowSurface(instance, m_window, nullptr, &surface) != @@ -41,7 +37,7 @@ vk::SurfaceKHR Window::createSurface(const vk::Instance& instance) { return surface; } -vk::Extent2D Window::getExtent() { +vk::Extent2D Window::getExtent() const { int width, height; glfwGetFramebufferSize(m_window, &width, &height); diff --git a/src/Window.hpp b/src/Window.hpp index be74acd..040ec68 100644 --- a/src/Window.hpp +++ b/src/Window.hpp @@ -9,14 +9,18 @@ class Window { public: Window() = default; - Window(uint16_t width, uint16_t height, const std::string& title); ~Window(); void create(uint16_t width, uint16_t height, const std::string& title); - bool shouldClose(); + + [[nodiscard]] bool shouldClose() const; + void pollEvents(); - vk::SurfaceKHR createSurface(const vk::Instance& instance); - vk::Extent2D getExtent(); + + [[nodiscard]] vk::SurfaceKHR createSurface(const vk::Instance& instance + ) const; + + [[nodiscard]] vk::Extent2D getExtent() const; private: GLFWwindow* m_window = nullptr; From 7d52b21760f3fc6cddb03ae28abfbf1be3405b07 Mon Sep 17 00:00:00 2001 From: Michael Pacheco Date: Sat, 18 Nov 2023 23:25:08 -0300 Subject: [PATCH 036/129] refactor(linux): extract `getSuitableImageCount()` function --- src/Application.cpp | 37 ++++++++++++++++--------------------- src/Application.hpp | 16 ++++++++++++++++ 2 files changed, 32 insertions(+), 21 deletions(-) diff --git a/src/Application.cpp b/src/Application.cpp index 893a7ea..6933e68 100644 --- a/src/Application.cpp +++ b/src/Application.cpp @@ -7,18 +7,6 @@ #include "Utils.hpp" #include "ValidationLayer.hpp" -struct SwapChainSupportDetails { - vk::SurfaceCapabilitiesKHR capabilities; - std::vector formats; - std::vector presentModes; - - SwapChainSupportDetails(vk::PhysicalDevice device, vk::SurfaceKHR surface) { - capabilities = device.getSurfaceCapabilitiesKHR(surface); - formats = device.getSurfaceFormatsKHR(surface); - presentModes = device.getSurfacePresentModesKHR(surface); - } -}; - void Application::run() { initWindow(); initVulkan(); @@ -155,19 +143,12 @@ void Application::createSwapChain() { const vk::Extent2D& extent = chooseSwapExtent(swapChainSupport.capabilities); - uint32_t requestImageCount = swapChainSupport.capabilities.minImageCount + 1; - uint32_t maxImageCount = swapChainSupport.capabilities.maxImageCount; - - bool hasLimitedImageCount = maxImageCount > 0; - - if (hasLimitedImageCount && requestImageCount > maxImageCount) { - requestImageCount = maxImageCount; - } + uint32_t imageCount = getSuitableImageCount(swapChainSupport); auto createInfo = vk::SwapchainCreateInfoKHR() .setSurface(m_surface) - .setMinImageCount(requestImageCount) + .setMinImageCount(imageCount) .setImageFormat(surfaceFormat.format) .setImageColorSpace(surfaceFormat.colorSpace) .setImageExtent(extent) @@ -196,6 +177,20 @@ void Application::createSwapChain() { m_swapChainExtent = extent; } +uint32_t Application::getSuitableImageCount( + const SwapChainSupportDetails& swapChainSupport +) { + uint32_t requestImageCount = swapChainSupport.capabilities.minImageCount + 1; + uint32_t maxImageCount = swapChainSupport.capabilities.maxImageCount; + + bool hasLimitedImageCount = maxImageCount > 0; + + if (hasLimitedImageCount && requestImageCount > maxImageCount) { + requestImageCount = maxImageCount; + } + return requestImageCount; +} + bool Application::isDeviceSuitable(const vk::PhysicalDevice& device) const { const auto& indices = QueueFamily::findIndices(device, m_surface); bool extensionsSupported = checkDeviceExtensionSupport(device); diff --git a/src/Application.hpp b/src/Application.hpp index 295b01c..eaa966a 100644 --- a/src/Application.hpp +++ b/src/Application.hpp @@ -5,6 +5,18 @@ #include "Window.hpp" class Application { + struct SwapChainSupportDetails { + vk::SurfaceCapabilitiesKHR capabilities; + std::vector formats; + std::vector presentModes; + + SwapChainSupportDetails(vk::PhysicalDevice device, vk::SurfaceKHR surface) { + capabilities = device.getSurfaceCapabilitiesKHR(surface); + formats = device.getSurfaceFormatsKHR(surface); + presentModes = device.getSurfacePresentModesKHR(surface); + } + }; + public: void run(); @@ -51,4 +63,8 @@ class Application { [[nodiscard]] vk::Extent2D chooseSwapExtent( const vk::SurfaceCapabilitiesKHR& capabilities ) const; + + [[nodiscard]] static uint32_t getSuitableImageCount( + const SwapChainSupportDetails& swapChainSupport + ); }; From f2f257737944dc8ecd6bb6f026be81071be6b9fe Mon Sep 17 00:00:00 2001 From: Michael Pacheco Date: Sat, 18 Nov 2023 23:56:07 -0300 Subject: [PATCH 037/129] docs(linux): add adjustments section to swap chain branch --- .husky/pre-commit | 2 +- README.md | 10 ++++++++-- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/.husky/pre-commit b/.husky/pre-commit index d76eb81..98397a2 100755 --- a/.husky/pre-commit +++ b/.husky/pre-commit @@ -3,7 +3,7 @@ FILES=$(git diff --cached --name-only --diff-filter=ACMR | grep -E '(src|include)/.+\.(cpp|h|cxx|hxx|hpp|c|inl)$') -[ -z "$FILES" ] && exit 0 +[ -z "$FILES" ] && (exit 0) echo "$FILES" | xargs clang-format -i echo "$FILES" | xargs git add diff --git a/README.md b/README.md index 4defb7e..1455f70 100644 --- a/README.md +++ b/README.md @@ -4,7 +4,13 @@ Summary [here](https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/tree/lin # Adjustments - +- Moved struct `SwapChainSupportDetails` to `Application` class and added constructor for convenience. +- Improved methods constness and added `[[nodiscard]]` attributes. +- Moved device extensions vector to `Config` class. +- Created `noneOf` template utility function to make code cleaner. +- Removed unused `Window` constructor. +- Extracted extent related code at `chooseSwapExtent()` to `Window::getExtent()`. +- Formatted `QueueFamily::Indices::getQueueCreateInfos()` method. # Navigation @@ -14,7 +20,7 @@ https://docs.vulkan.org/tutorial/latest/03_Drawing_a_triangle/01_Presentation/01 [⏮ Drawing a triangle / Presentation / Window surface]( https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/tree/linux/02-drawing-triangle/02-presentation/01-window-surface) -[⏭ Drawing a triangle / Presentation / Swap chain]( +[⏭ Drawing a triangle / Presentation / Image views]( https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/tree/linux/02-drawing-triangle/02-presentation/03-image-views) [🔄 Diff from previous step]( From 6f34d0ad19055185105986d1380e84c9ae174492 Mon Sep 17 00:00:00 2001 From: Michael Pacheco Date: Sat, 18 Nov 2023 23:57:38 -0300 Subject: [PATCH 038/129] chore(linux): update pre-commit hook failing when there is no source code changed --- .husky/pre-commit | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/.husky/pre-commit b/.husky/pre-commit index 98397a2..f85f553 100755 --- a/.husky/pre-commit +++ b/.husky/pre-commit @@ -2,8 +2,13 @@ . "$(dirname -- "$0")/_/husky.sh" -FILES=$(git diff --cached --name-only --diff-filter=ACMR | grep -E '(src|include)/.+\.(cpp|h|cxx|hxx|hpp|c|inl)$') -[ -z "$FILES" ] && (exit 0) +FILES=$( + git diff --cached --name-only --diff-filter=ACMR | + grep -E '(src|include)/.+\.(cpp|h|cxx|hxx|hpp|c|inl)$' | + true +) + +[ -z "$FILES" ] && exit 0 echo "$FILES" | xargs clang-format -i echo "$FILES" | xargs git add From 3998446a5456e1420520d2e407e9f22f504b6ec6 Mon Sep 17 00:00:00 2001 From: Michael Pacheco Date: Sun, 19 Nov 2023 00:08:05 -0300 Subject: [PATCH 039/129] docs(linux): add swap chain navigation link to linux summary branch --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 726681c..665fb3e 100644 --- a/README.md +++ b/README.md @@ -23,3 +23,4 @@ and current step. * [Logical device and queues](https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/tree/linux/02-drawing-triangle/01-setup/05-logical-device-and-queues) * Presentation * [Window surface](https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/tree/linux/02-drawing-triangle/02-presentation/01-window-surface) + * [Swap chain](https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/tree/linux/02-drawing-triangle/02-presentation/02-swapchain) From d326e193f8c5ab3fced284e91024e78346fcc5d8 Mon Sep 17 00:00:00 2001 From: Michael Pacheco Date: Sun, 19 Nov 2023 09:40:10 -0300 Subject: [PATCH 040/129] refactor(linux): sort methods in `Application.cpp` to match `Application.hpp` --- src/Application.cpp | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/src/Application.cpp b/src/Application.cpp index 6933e68..93b4f32 100644 --- a/src/Application.cpp +++ b/src/Application.cpp @@ -177,20 +177,6 @@ void Application::createSwapChain() { m_swapChainExtent = extent; } -uint32_t Application::getSuitableImageCount( - const SwapChainSupportDetails& swapChainSupport -) { - uint32_t requestImageCount = swapChainSupport.capabilities.minImageCount + 1; - uint32_t maxImageCount = swapChainSupport.capabilities.maxImageCount; - - bool hasLimitedImageCount = maxImageCount > 0; - - if (hasLimitedImageCount && requestImageCount > maxImageCount) { - requestImageCount = maxImageCount; - } - return requestImageCount; -} - bool Application::isDeviceSuitable(const vk::PhysicalDevice& device) const { const auto& indices = QueueFamily::findIndices(device, m_surface); bool extensionsSupported = checkDeviceExtensionSupport(device); @@ -273,3 +259,17 @@ vk::Extent2D Application::chooseSwapExtent( return actualExtent; } + +uint32_t Application::getSuitableImageCount( + const SwapChainSupportDetails& swapChainSupport +) { + uint32_t requestImageCount = swapChainSupport.capabilities.minImageCount + 1; + uint32_t maxImageCount = swapChainSupport.capabilities.maxImageCount; + + bool hasLimitedImageCount = maxImageCount > 0; + + if (hasLimitedImageCount && requestImageCount > maxImageCount) { + requestImageCount = maxImageCount; + } + return requestImageCount; +} From e45e0a9b191837198f533392367614bbc4660e89 Mon Sep 17 00:00:00 2001 From: Michael Pacheco Date: Sun, 19 Nov 2023 12:14:48 -0300 Subject: [PATCH 041/129] feat(linux): create image views --- README.md | 28 +++++++++++++------------- src/Application.cpp | 48 ++++++++++++++++++++++++++++++++++----------- src/Application.hpp | 2 ++ 3 files changed, 53 insertions(+), 25 deletions(-) diff --git a/README.md b/README.md index 1455f70..0d8960c 100644 --- a/README.md +++ b/README.md @@ -1,27 +1,27 @@ -# Linux ❘ Presentation ❘ Swap chain +# Linux ❘ Presentation ❘ Image Views Summary [here](https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/tree/linux-summary). # Adjustments -- Moved struct `SwapChainSupportDetails` to `Application` class and added constructor for convenience. -- Improved methods constness and added `[[nodiscard]]` attributes. -- Moved device extensions vector to `Config` class. -- Created `noneOf` template utility function to make code cleaner. -- Removed unused `Window` constructor. -- Extracted extent related code at `chooseSwapExtent()` to `Window::getExtent()`. -- Formatted `QueueFamily::Indices::getQueueCreateInfos()` method. +- `ImageViewCreateInfo::setComponents()` already set all RGBA members to `vk::ComponentSwizzle::eIdentity`, so, there's + no need to be redundant here. +- Changed `m_swapChainImageViews.resize()` to `m_swapChainImageViews.reserve()` at `createImageViews()` since `resize()` + instantiates new elements. + Thus, we need to use `vector::push_back` or `vector::emplace_back` instead of indexed assignment. + See https://cplusplus.com/reference/vector/vector/resize/ +- Reordered `Application::getSuitableImageCount()` to match `Application.hpp` declaration order. # Navigation [🌐 Original tutorial]( -https://docs.vulkan.org/tutorial/latest/03_Drawing_a_triangle/01_Presentation/01_Swap_chain.html) +https://docs.vulkan.org/tutorial/latest/03_Drawing_a_triangle/01_Presentation/02_Image_views.html) -[⏮ Drawing a triangle / Presentation / Window surface]( -https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/tree/linux/02-drawing-triangle/02-presentation/01-window-surface) +[⏮ Drawing a triangle / Presentation / Swap chain]( +https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/tree/linux/02-drawing-triangle/02-presentation/02-swapchain) -[⏭ Drawing a triangle / Presentation / Image views]( -https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/tree/linux/02-drawing-triangle/02-presentation/03-image-views) +[⏭ Drawing a triangle / Graphics pipeline basics / Shader modules]( +https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/tree/linux/02-drawing-triangle/03-graphics-pipeline-basics/02-shader-modules) [🔄 Diff from previous step]( -https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/compare/linux/02-drawing-triangle/02-presentation/01-window-surface...linux/02-drawing-triangle/02-presentation/02-swapchain) +https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/compare/linux/02-drawing-triangle/02-presentation/02-swapchain...linux/02-drawing-triangle/02-presentation/03-image-views) diff --git a/src/Application.cpp b/src/Application.cpp index 6933e68..3c99829 100644 --- a/src/Application.cpp +++ b/src/Application.cpp @@ -27,6 +27,7 @@ void Application::initVulkan() { pickPhysicalDevice(); createLogicalDevice(); createSwapChain(); + createImageViews(); } void Application::mainLoop() { @@ -36,6 +37,9 @@ void Application::mainLoop() { } void Application::cleanup() { + for (auto imageView : m_swapChainImageViews) { + m_device.destroy(imageView); + } m_device.destroy(m_swapChain); m_device.destroy(); m_instance.destroy(m_surface); @@ -177,18 +181,26 @@ void Application::createSwapChain() { m_swapChainExtent = extent; } -uint32_t Application::getSuitableImageCount( - const SwapChainSupportDetails& swapChainSupport -) { - uint32_t requestImageCount = swapChainSupport.capabilities.minImageCount + 1; - uint32_t maxImageCount = swapChainSupport.capabilities.maxImageCount; - - bool hasLimitedImageCount = maxImageCount > 0; - - if (hasLimitedImageCount && requestImageCount > maxImageCount) { - requestImageCount = maxImageCount; +void Application::createImageViews() { + m_swapChainImageViews.reserve(m_swapChainImages.size()); + + for (const auto& m_swapChainImage : m_swapChainImages) { + const auto& createInfo = + vk::ImageViewCreateInfo() + .setImage(m_swapChainImage) + .setViewType(vk::ImageViewType::e2D) + .setFormat(m_swapChainImageFormat) + .setSubresourceRange( + vk::ImageSubresourceRange() + .setAspectMask(vk::ImageAspectFlagBits::eColor) + .setBaseMipLevel(0) + .setLevelCount(1) + .setBaseArrayLayer(0) + .setLayerCount(1) + ); + + m_swapChainImageViews.emplace_back(m_device.createImageView(createInfo)); } - return requestImageCount; } bool Application::isDeviceSuitable(const vk::PhysicalDevice& device) const { @@ -273,3 +285,17 @@ vk::Extent2D Application::chooseSwapExtent( return actualExtent; } + +uint32_t Application::getSuitableImageCount( + const SwapChainSupportDetails& swapChainSupport +) { + uint32_t requestImageCount = swapChainSupport.capabilities.minImageCount + 1; + uint32_t maxImageCount = swapChainSupport.capabilities.maxImageCount; + + bool hasLimitedImageCount = maxImageCount > 0; + + if (hasLimitedImageCount && requestImageCount > maxImageCount) { + requestImageCount = maxImageCount; + } + return requestImageCount; +} diff --git a/src/Application.hpp b/src/Application.hpp index eaa966a..6737ad7 100644 --- a/src/Application.hpp +++ b/src/Application.hpp @@ -33,6 +33,7 @@ class Application { std::vector m_swapChainImages; // Destroyed by swap chain vk::Format m_swapChainImageFormat; vk::Extent2D m_swapChainExtent; + std::vector m_swapChainImageViews; void initWindow(); void initVulkan(); @@ -45,6 +46,7 @@ class Application { void pickPhysicalDevice(); void createLogicalDevice(); void createSwapChain(); + void createImageViews(); [[nodiscard]] bool isDeviceSuitable(const vk::PhysicalDevice& device) const; From 798a32b1a37b6740610e0c4714c1c859983d277f Mon Sep 17 00:00:00 2001 From: Michael Pacheco Date: Sun, 19 Nov 2023 12:22:47 -0300 Subject: [PATCH 042/129] docs(linux): update navigation links for image views branch --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 665fb3e..0cbec54 100644 --- a/README.md +++ b/README.md @@ -24,3 +24,4 @@ and current step. * Presentation * [Window surface](https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/tree/linux/02-drawing-triangle/02-presentation/01-window-surface) * [Swap chain](https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/tree/linux/02-drawing-triangle/02-presentation/02-swapchain) + * [Image views](https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/tree/linux/02-drawing-triangle/02-presentation/03-image-views) From e0dafccdc7f6c8ff3b82f090df7d3f5fd062b0bd Mon Sep 17 00:00:00 2001 From: Michael Pacheco Date: Sun, 19 Nov 2023 16:01:18 -0300 Subject: [PATCH 043/129] feat(linux): add shader modules step --- .gitignore | 1 + CMakeLists.txt | 30 +++++++++++++++++++++++++++++- Makefile | 2 +- README.md | 34 ++++++++++++++++++++-------------- res/shaders/CMakeLists.txt | 22 ++++++++++++++++++++++ res/shaders/shader.frag | 9 +++++++++ res/shaders/shader.vert | 20 ++++++++++++++++++++ src/Application.cpp | 37 +++++++++++++++++++++++++++++++++++++ src/Application.hpp | 5 +++++ src/BinaryLoader.cpp | 27 +++++++++++++++++++++++++++ src/BinaryLoader.hpp | 11 +++++++++++ src/main.cpp | 5 +++++ 12 files changed, 187 insertions(+), 16 deletions(-) create mode 100644 res/shaders/CMakeLists.txt create mode 100644 res/shaders/shader.frag create mode 100644 res/shaders/shader.vert create mode 100644 src/BinaryLoader.cpp create mode 100644 src/BinaryLoader.hpp diff --git a/.gitignore b/.gitignore index bd42be2..f1f03f8 100644 --- a/.gitignore +++ b/.gitignore @@ -3,3 +3,4 @@ cmake-build*/ node_modules/ *lock* +*.spv diff --git a/CMakeLists.txt b/CMakeLists.txt index c6df25c..4a4fd3b 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -17,6 +17,8 @@ set(SOURCES src/ValidationLayer.hpp src/QueueFamily.cpp src/QueueFamily.hpp + src/BinaryLoader.cpp + src/BinaryLoader.hpp ) add_compile_definitions(GLFW_VULKAN_STATIC) @@ -71,10 +73,33 @@ endif () target_include_directories(KhronosVulkanTutorialHpp PRIVATE ${glm_SOURCE_DIR}) + +################################### SPDLog ##################################### +if (CMAKE_BUILD_TYPE STREQUAL "Release") + add_compile_definitions(SPDLOG_ACTIVE_LEVEL=SPDLOG_LEVEL_WARN) +else () + add_compile_definitions(SPDLOG_ACTIVE_LEVEL=SPDLOG_LEVEL_TRACE) +endif () + +FetchContent_Declare( + spdlog + GIT_REPOSITORY https://github.com/gabime/spdlog.git + GIT_TAG v1.12.0 +) + +FetchContent_GetProperties(spdlog) +if (NOT spdlog_POPULATED) + FetchContent_Populate(spdlog) + add_subdirectory(${spdlog_SOURCE_DIR} ${spdlog_BINARY_DIR}) +endif () + +############################ End of dependencies ############################### + target_link_libraries(KhronosVulkanTutorialHpp PRIVATE Vulkan::Vulkan glfw + spdlog dl pthread X11 @@ -83,5 +108,8 @@ target_link_libraries(KhronosVulkanTutorialHpp Xi ) -# Install targets +add_subdirectory(res/shaders) + +add_dependencies(KhronosVulkanTutorialHpp Shaders) + install(TARGETS KhronosVulkanTutorialHpp DESTINATION bin) diff --git a/Makefile b/Makefile index 5c55cf8..166bf90 100644 --- a/Makefile +++ b/Makefile @@ -1,7 +1,7 @@ .PHONY: $(MAKECMDGOALS) clean: - rm -rf build* + rm -rf cmake-build* format: find src -type f \ diff --git a/README.md b/README.md index 0d8960c..206c698 100644 --- a/README.md +++ b/README.md @@ -1,27 +1,33 @@ -# Linux ❘ Presentation ❘ Image Views +# Linux ❘ Graphics pipeline basics ❘ Shader modules Summary [here](https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/tree/linux-summary). # Adjustments -- `ImageViewCreateInfo::setComponents()` already set all RGBA members to `vk::ComponentSwizzle::eIdentity`, so, there's - no need to be redundant here. -- Changed `m_swapChainImageViews.resize()` to `m_swapChainImageViews.reserve()` at `createImageViews()` since `resize()` - instantiates new elements. - Thus, we need to use `vector::push_back` or `vector::emplace_back` instead of indexed assignment. - See https://cplusplus.com/reference/vector/vector/resize/ -- Reordered `Application::getSuitableImageCount()` to match `Application.hpp` declaration order. +- Moved all shader compilation related code to a separate [CMakeLists.txt](res/shaders/CMakeLists.txt). + This configuration compiles the shaders automatically only if not already compiled or the source code was changed. + It will generate the respective `.spv` bytecodes in the same **source directory**. + Since these `.spv` files can be generated at anytime, we will ignore them at `.gitignore`. + > [!IMPORTANT] + > Be sure to set the working directory to the project root directory to correctly load the shaders +- Created a `BinaryLoader` class to read our compiled `.spv` shader bytecodes. +- Added `[spdlog](https://github.com/gabime/spdlog)` as a dependency to help us log useful information during + development phase. + `spdlog` also brings `[fmt](https://github.com/fmtlib/fmt)` as a transitive dependency + which is very handy for handling string interpolation. +- Also added some code at `main.cpp` to configure the logger based on `SPDLOG_ACTIVE_LEVEL` compiler definition. + `SPDLOG_ACTIVE_LEVEL` is set to `warning` in release builds. # Navigation [🌐 Original tutorial]( -https://docs.vulkan.org/tutorial/latest/03_Drawing_a_triangle/01_Presentation/02_Image_views.html) +https://docs.vulkan.org/tutorial/latest/03_Drawing_a_triangle/02_Graphics_pipeline_basics/01_Shader_modules.html) -[⏮ Drawing a triangle / Presentation / Swap chain]( -https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/tree/linux/02-drawing-triangle/02-presentation/02-swapchain) +[⏮ Drawing a triangle / Presentation / Image views]( +https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/tree/linux/02-drawing-triangle/02-presentation/03-image-views) -[⏭ Drawing a triangle / Graphics pipeline basics / Shader modules]( -https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/tree/linux/02-drawing-triangle/03-graphics-pipeline-basics/02-shader-modules) +[⏭ Drawing a triangle / Graphics pipeline basics / Fixed functions]( +https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/tree/linux/02-drawing-triangle/03-graphics-pipeline-basics/03-fixed-functions) [🔄 Diff from previous step]( -https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/compare/linux/02-drawing-triangle/02-presentation/02-swapchain...linux/02-drawing-triangle/02-presentation/03-image-views) +https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/compare/linux/02-drawing-triangle/02-presentation/03-image-views...linux/02-drawing-triangle/03-graphics-pipeline-basics/02-shader-modules) diff --git a/res/shaders/CMakeLists.txt b/res/shaders/CMakeLists.txt new file mode 100644 index 0000000..cdd7b19 --- /dev/null +++ b/res/shaders/CMakeLists.txt @@ -0,0 +1,22 @@ +set(SHADERS_SRC_DIR ${CMAKE_CURRENT_SOURCE_DIR}) +set(SHADERS_OUT_DIR ${CMAKE_CURRENT_SOURCE_DIR}) + +file(GLOB_RECURSE SHADER_FILES + "${SHADERS_SRC_DIR}/*.frag" + "${SHADERS_SRC_DIR}/*.vert" +) + +foreach (GLSL ${SHADER_FILES}) + get_filename_component(FILE_NAME ${GLSL} NAME) + set(SPIRV "${SHADERS_OUT_DIR}/${FILE_NAME}.spv") + add_custom_command( + OUTPUT ${SPIRV} + COMMAND glslc ${GLSL} -o ${SPIRV} + DEPENDS ${GLSL}) + list(APPEND SPIRV_BINARY_FILES ${SPIRV}) +endforeach (GLSL) + +add_custom_target( + Shaders + DEPENDS ${SPIRV_BINARY_FILES} +) diff --git a/res/shaders/shader.frag b/res/shaders/shader.frag new file mode 100644 index 0000000..9a7d092 --- /dev/null +++ b/res/shaders/shader.frag @@ -0,0 +1,9 @@ +#version 450 + +layout (location = 0) in vec3 fragColor; + +layout (location = 0) out vec4 outColor; + +void main() { + outColor = vec4(fragColor, 1.0); +} diff --git a/res/shaders/shader.vert b/res/shaders/shader.vert new file mode 100644 index 0000000..6d69e42 --- /dev/null +++ b/res/shaders/shader.vert @@ -0,0 +1,20 @@ +#version 450 + +layout (location = 0) out vec3 fragColor; + +vec2 positions[3] = vec2[]( + vec2(0.0, -0.5), + vec2(0.5, 0.5), + vec2(-0.5, 0.5) +); + +vec3 colors[3] = vec3[]( + vec3(1.0, 0.0, 0.0), + vec3(0.0, 1.0, 0.0), + vec3(0.0, 0.0, 1.0) +); + +void main() { + gl_Position = vec4(positions[gl_VertexIndex], 0.0, 1.0); + fragColor = colors[gl_VertexIndex]; +} diff --git a/src/Application.cpp b/src/Application.cpp index 3c99829..72f373d 100644 --- a/src/Application.cpp +++ b/src/Application.cpp @@ -2,6 +2,7 @@ #include +#include "BinaryLoader.hpp" #include "Config.hpp" #include "QueueFamily.hpp" #include "Utils.hpp" @@ -28,6 +29,7 @@ void Application::initVulkan() { createLogicalDevice(); createSwapChain(); createImageViews(); + createGraphicsPipeline(); } void Application::mainLoop() { @@ -299,3 +301,38 @@ uint32_t Application::getSuitableImageCount( } return requestImageCount; } + +void Application::createGraphicsPipeline() { + auto vertShaderCode = BinaryLoader::load("res/shaders/shader.vert.spv"); + auto fragShaderCode = BinaryLoader::load("res/shaders/shader.frag.spv"); + + vk::ShaderModule vertShaderModule = createShaderModule(vertShaderCode); + vk::ShaderModule fragShaderModule = createShaderModule(fragShaderCode); + + const auto& vertShaderStageInfo = + vk::PipelineShaderStageCreateInfo() + .setStage(vk::ShaderStageFlagBits::eVertex) + .setModule(vertShaderModule) + .setPName("main"); + + const auto& fragShaderStageInfo = + vk::PipelineShaderStageCreateInfo() + .setStage(vk::ShaderStageFlagBits::eFragment) + .setModule(fragShaderModule) + .setPName("main"); + + vk::PipelineShaderStageCreateInfo shaderStages[]{ + vertShaderStageInfo, fragShaderStageInfo}; + + m_device.destroy(vertShaderModule); + m_device.destroy(fragShaderModule); +} + +vk::ShaderModule Application::createShaderModule(const std::vector& code +) const { + vk::ShaderModuleCreateInfo createInfo; + createInfo.codeSize = code.size(); + createInfo.pCode = reinterpret_cast(code.data()); + vk::ShaderModule shaderModule = m_device.createShaderModule(createInfo); + return shaderModule; +} diff --git a/src/Application.hpp b/src/Application.hpp index 6737ad7..f3eb164 100644 --- a/src/Application.hpp +++ b/src/Application.hpp @@ -47,6 +47,7 @@ class Application { void createLogicalDevice(); void createSwapChain(); void createImageViews(); + void createGraphicsPipeline(); [[nodiscard]] bool isDeviceSuitable(const vk::PhysicalDevice& device) const; @@ -69,4 +70,8 @@ class Application { [[nodiscard]] static uint32_t getSuitableImageCount( const SwapChainSupportDetails& swapChainSupport ); + + [[nodiscard]] vk::ShaderModule createShaderModule( + const std::vector& code + ) const; }; diff --git a/src/BinaryLoader.cpp b/src/BinaryLoader.cpp new file mode 100644 index 0000000..cea2243 --- /dev/null +++ b/src/BinaryLoader.cpp @@ -0,0 +1,27 @@ +#include "BinaryLoader.hpp" + +#include + +#include + +BinaryLoader::Buffer BinaryLoader::load(const std::string &filePath) { + std::ifstream file(filePath, std::ios::ate | std::ios::binary); + + if (!file.is_open()) { + throw std::runtime_error( + fmt::format("Failed to open binary file {}", filePath) + ); + } + + auto fileSize = file.tellg(); + std::vector buffer(static_cast::size_type>(fileSize)); + + file.seekg(0); + file.read(buffer.data(), fileSize); + + file.close(); + + SPDLOG_DEBUG("Binary file loaded {} ({}B)", filePath, fileSize); + + return buffer; +} diff --git a/src/BinaryLoader.hpp b/src/BinaryLoader.hpp new file mode 100644 index 0000000..c2a63ed --- /dev/null +++ b/src/BinaryLoader.hpp @@ -0,0 +1,11 @@ +#pragma once + +#include +#include + +class BinaryLoader { + public: + typedef std::vector Buffer; + + static Buffer load(const std::string& filePath); +}; diff --git a/src/main.cpp b/src/main.cpp index 84df1fd..89bbc1f 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -1,8 +1,13 @@ +#include + #include #include "Application.hpp" int main() { + auto level = static_cast(SPDLOG_ACTIVE_LEVEL); + spdlog::set_level(level); + Application app; try { From 7df370157c0190bfdce8ecca7e3e6cfd1daf3bef Mon Sep 17 00:00:00 2001 From: Michael Pacheco Date: Sun, 19 Nov 2023 16:08:06 -0300 Subject: [PATCH 044/129] docs(linux): add link to `SPDLOG_ACTIVE_LEVEL` config location --- README.md | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 206c698..eda776c 100644 --- a/README.md +++ b/README.md @@ -8,8 +8,10 @@ Summary [here](https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/tree/lin This configuration compiles the shaders automatically only if not already compiled or the source code was changed. It will generate the respective `.spv` bytecodes in the same **source directory**. Since these `.spv` files can be generated at anytime, we will ignore them at `.gitignore`. - > [!IMPORTANT] - > Be sure to set the working directory to the project root directory to correctly load the shaders + +> [!IMPORTANT] +> Be sure to set the working directory to the project root directory to correctly load the shaders + - Created a `BinaryLoader` class to read our compiled `.spv` shader bytecodes. - Added `[spdlog](https://github.com/gabime/spdlog)` as a dependency to help us log useful information during development phase. @@ -17,6 +19,7 @@ Summary [here](https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/tree/lin which is very handy for handling string interpolation. - Also added some code at `main.cpp` to configure the logger based on `SPDLOG_ACTIVE_LEVEL` compiler definition. `SPDLOG_ACTIVE_LEVEL` is set to `warning` in release builds. + https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/blob/e0dafccdc7f6c8ff3b82f090df7d3f5fd062b0bd/CMakeLists.txt#L78 # Navigation From 207707e4554306e2ecd1c5c9c5c13d328b3c7472 Mon Sep 17 00:00:00 2001 From: Michael Pacheco Date: Sun, 19 Nov 2023 16:17:20 -0300 Subject: [PATCH 045/129] docs(linux): add shader modules navigation link to linux summary branch --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index 0cbec54..12b626b 100644 --- a/README.md +++ b/README.md @@ -25,3 +25,5 @@ and current step. * [Window surface](https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/tree/linux/02-drawing-triangle/02-presentation/01-window-surface) * [Swap chain](https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/tree/linux/02-drawing-triangle/02-presentation/02-swapchain) * [Image views](https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/tree/linux/02-drawing-triangle/02-presentation/03-image-views) +* Graphics pipeline basics + * [Shader modules](https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/tree/linux/02-drawing-triangle/03-graphics-pipeline-basics/02-shader-modules) From 2252066b225e9aa90248d55188c8868ba873eda5 Mon Sep 17 00:00:00 2001 From: Michael Pacheco Date: Sun, 19 Nov 2023 19:55:55 -0300 Subject: [PATCH 046/129] feat(linux): create pipeline layout info --- src/Application.cpp | 56 ++++++++++++++++++++++++++++++++++++++++++++- src/Application.hpp | 1 + 2 files changed, 56 insertions(+), 1 deletion(-) diff --git a/src/Application.cpp b/src/Application.cpp index 72f373d..ca1b6ae 100644 --- a/src/Application.cpp +++ b/src/Application.cpp @@ -39,7 +39,8 @@ void Application::mainLoop() { } void Application::cleanup() { - for (auto imageView : m_swapChainImageViews) { + m_device.destroy(m_pipelineLayout); + for (const auto& imageView : m_swapChainImageViews) { m_device.destroy(imageView); } m_device.destroy(m_swapChain); @@ -324,6 +325,59 @@ void Application::createGraphicsPipeline() { vk::PipelineShaderStageCreateInfo shaderStages[]{ vertShaderStageInfo, fragShaderStageInfo}; + vk::PipelineVertexInputStateCreateInfo vertexInputInfo{}; + vertexInputInfo.vertexBindingDescriptionCount = 0; + vertexInputInfo.vertexAttributeDescriptionCount = 0; + + vk::PipelineInputAssemblyStateCreateInfo inputAssembly{}; + inputAssembly.topology = vk::PrimitiveTopology::eTriangleList; + inputAssembly.primitiveRestartEnable = vk::False; + + vk::PipelineViewportStateCreateInfo viewportState{}; + viewportState.viewportCount = 1; + viewportState.scissorCount = 1; + + vk::PipelineRasterizationStateCreateInfo rasterizer{}; + rasterizer.depthClampEnable = vk::False; + rasterizer.rasterizerDiscardEnable = vk::False; + rasterizer.polygonMode = vk::PolygonMode::eFill; + rasterizer.lineWidth = 1.0f; + rasterizer.cullMode = vk::CullModeFlagBits::eBack; + rasterizer.frontFace = vk::FrontFace::eClockwise; + rasterizer.depthBiasEnable = vk::False; + + vk::PipelineMultisampleStateCreateInfo multisampling{}; + multisampling.sampleShadingEnable = vk::False; + multisampling.rasterizationSamples = vk::SampleCountFlagBits::e1; + + vk::PipelineColorBlendAttachmentState colorBlendAttachment{}; + colorBlendAttachment.colorWriteMask = + vk::ColorComponentFlagBits::eR | vk::ColorComponentFlagBits::eG | + vk::ColorComponentFlagBits::eB | vk::ColorComponentFlagBits::eA; + colorBlendAttachment.blendEnable = vk::False; + + vk::PipelineColorBlendStateCreateInfo colorBlending{}; + colorBlending.logicOpEnable = vk::False; + colorBlending.logicOp = vk::LogicOp::eCopy; + colorBlending.attachmentCount = 1; + colorBlending.pAttachments = &colorBlendAttachment; + colorBlending.blendConstants[0] = 0.0f; + colorBlending.blendConstants[1] = 0.0f; + colorBlending.blendConstants[2] = 0.0f; + colorBlending.blendConstants[3] = 0.0f; + + std::vector dynamicStates = { + vk::DynamicState::eViewport, vk::DynamicState::eScissor}; + vk::PipelineDynamicStateCreateInfo dynamicState{}; + dynamicState.dynamicStateCount = static_cast(dynamicStates.size()); + dynamicState.pDynamicStates = dynamicStates.data(); + + vk::PipelineLayoutCreateInfo pipelineLayoutInfo{}; + pipelineLayoutInfo.setLayoutCount = 0; + pipelineLayoutInfo.pushConstantRangeCount = 0; + + m_pipelineLayout = m_device.createPipelineLayout(pipelineLayoutInfo); + m_device.destroy(vertShaderModule); m_device.destroy(fragShaderModule); } diff --git a/src/Application.hpp b/src/Application.hpp index f3eb164..2a7cb99 100644 --- a/src/Application.hpp +++ b/src/Application.hpp @@ -34,6 +34,7 @@ class Application { vk::Format m_swapChainImageFormat; vk::Extent2D m_swapChainExtent; std::vector m_swapChainImageViews; + vk::PipelineLayout m_pipelineLayout; void initWindow(); void initVulkan(); From ac6665bf2241e2fa506a47acf6d65e4206d497d4 Mon Sep 17 00:00:00 2001 From: Michael Pacheco Date: Sun, 19 Nov 2023 20:07:42 -0300 Subject: [PATCH 047/129] feat(linux): replace attribute assignments by method chaining calls --- src/Application.cpp | 100 ++++++++++++++++++++++++-------------------- 1 file changed, 54 insertions(+), 46 deletions(-) diff --git a/src/Application.cpp b/src/Application.cpp index ca1b6ae..827a8fd 100644 --- a/src/Application.cpp +++ b/src/Application.cpp @@ -325,56 +325,64 @@ void Application::createGraphicsPipeline() { vk::PipelineShaderStageCreateInfo shaderStages[]{ vertShaderStageInfo, fragShaderStageInfo}; - vk::PipelineVertexInputStateCreateInfo vertexInputInfo{}; - vertexInputInfo.vertexBindingDescriptionCount = 0; - vertexInputInfo.vertexAttributeDescriptionCount = 0; - - vk::PipelineInputAssemblyStateCreateInfo inputAssembly{}; - inputAssembly.topology = vk::PrimitiveTopology::eTriangleList; - inputAssembly.primitiveRestartEnable = vk::False; - - vk::PipelineViewportStateCreateInfo viewportState{}; - viewportState.viewportCount = 1; - viewportState.scissorCount = 1; - - vk::PipelineRasterizationStateCreateInfo rasterizer{}; - rasterizer.depthClampEnable = vk::False; - rasterizer.rasterizerDiscardEnable = vk::False; - rasterizer.polygonMode = vk::PolygonMode::eFill; - rasterizer.lineWidth = 1.0f; - rasterizer.cullMode = vk::CullModeFlagBits::eBack; - rasterizer.frontFace = vk::FrontFace::eClockwise; - rasterizer.depthBiasEnable = vk::False; - - vk::PipelineMultisampleStateCreateInfo multisampling{}; - multisampling.sampleShadingEnable = vk::False; - multisampling.rasterizationSamples = vk::SampleCountFlagBits::e1; - - vk::PipelineColorBlendAttachmentState colorBlendAttachment{}; - colorBlendAttachment.colorWriteMask = - vk::ColorComponentFlagBits::eR | vk::ColorComponentFlagBits::eG | - vk::ColorComponentFlagBits::eB | vk::ColorComponentFlagBits::eA; - colorBlendAttachment.blendEnable = vk::False; - - vk::PipelineColorBlendStateCreateInfo colorBlending{}; - colorBlending.logicOpEnable = vk::False; - colorBlending.logicOp = vk::LogicOp::eCopy; - colorBlending.attachmentCount = 1; - colorBlending.pAttachments = &colorBlendAttachment; - colorBlending.blendConstants[0] = 0.0f; - colorBlending.blendConstants[1] = 0.0f; - colorBlending.blendConstants[2] = 0.0f; - colorBlending.blendConstants[3] = 0.0f; + const auto& vertexInputInfo = + vk::PipelineVertexInputStateCreateInfo() + .setVertexBindingDescriptionCount(0) + .setVertexAttributeDescriptionCount(0); + + const auto& inputAssembly = + vk::PipelineInputAssemblyStateCreateInfo() + .setTopology(vk::PrimitiveTopology::eTriangleList) + .setPrimitiveRestartEnable(vk::False); + + const auto& viewportState = + vk::PipelineViewportStateCreateInfo().setViewportCount(1).setScissorCount( + 1 + ); + + const auto& rasterizer = + vk::PipelineRasterizationStateCreateInfo() + .setDepthClampEnable(vk::False) + .setRasterizerDiscardEnable(vk::False) + .setPolygonMode(vk::PolygonMode::eFill) + .setLineWidth(1.0f) + .setCullMode(vk::CullModeFlagBits::eBack) + .setFrontFace(vk::FrontFace::eClockwise) + .setDepthBiasEnable(vk::False); + + const auto& multisampling = + vk::PipelineMultisampleStateCreateInfo() + .setSampleShadingEnable(vk::False) + .setRasterizationSamples(vk::SampleCountFlagBits::e1); + + const auto& colorBlendAttachment = + vk::PipelineColorBlendAttachmentState() + .setColorWriteMask( + vk::ColorComponentFlagBits::eR | vk::ColorComponentFlagBits::eG | + vk::ColorComponentFlagBits::eB | vk::ColorComponentFlagBits::eA + ) + .setBlendEnable(vk::False); + + const auto& colorBlending = + vk::PipelineColorBlendStateCreateInfo() + .setLogicOpEnable(vk::False) + .setLogicOp(vk::LogicOp::eCopy) + .setAttachmentCount(1) + .setPAttachments(&colorBlendAttachment) + .setBlendConstants({0.0f, 0.0f, 0.0f, 0.0f}); std::vector dynamicStates = { vk::DynamicState::eViewport, vk::DynamicState::eScissor}; - vk::PipelineDynamicStateCreateInfo dynamicState{}; - dynamicState.dynamicStateCount = static_cast(dynamicStates.size()); - dynamicState.pDynamicStates = dynamicStates.data(); - vk::PipelineLayoutCreateInfo pipelineLayoutInfo{}; - pipelineLayoutInfo.setLayoutCount = 0; - pipelineLayoutInfo.pushConstantRangeCount = 0; + const auto& dynamicState = + vk::PipelineDynamicStateCreateInfo() + .setDynamicStateCount(static_cast(dynamicStates.size())) + .setPDynamicStates(dynamicStates.data()); + + const auto& pipelineLayoutInfo = + vk::PipelineLayoutCreateInfo() + .setSetLayoutCount(0) + .setPushConstantRangeCount(0); m_pipelineLayout = m_device.createPipelineLayout(pipelineLayoutInfo); From 39a27c217bc6ba23bd2941e21f393c28f6398e1e Mon Sep 17 00:00:00 2001 From: Michael Pacheco Date: Sun, 19 Nov 2023 20:36:12 -0300 Subject: [PATCH 048/129] docs(linux): update navigation links of fixed functions branch --- README.md | 26 ++++++-------------------- 1 file changed, 6 insertions(+), 20 deletions(-) diff --git a/README.md b/README.md index eda776c..24e0c5f 100644 --- a/README.md +++ b/README.md @@ -1,36 +1,22 @@ -# Linux ❘ Graphics pipeline basics ❘ Shader modules +# Linux ❘ Graphics pipeline basics ❘ Fixed functions Summary [here](https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/tree/linux-summary). # Adjustments -- Moved all shader compilation related code to a separate [CMakeLists.txt](res/shaders/CMakeLists.txt). - This configuration compiles the shaders automatically only if not already compiled or the source code was changed. - It will generate the respective `.spv` bytecodes in the same **source directory**. - Since these `.spv` files can be generated at anytime, we will ignore them at `.gitignore`. - -> [!IMPORTANT] -> Be sure to set the working directory to the project root directory to correctly load the shaders - -- Created a `BinaryLoader` class to read our compiled `.spv` shader bytecodes. -- Added `[spdlog](https://github.com/gabime/spdlog)` as a dependency to help us log useful information during - development phase. - `spdlog` also brings `[fmt](https://github.com/fmtlib/fmt)` as a transitive dependency - which is very handy for handling string interpolation. -- Also added some code at `main.cpp` to configure the logger based on `SPDLOG_ACTIVE_LEVEL` compiler definition. - `SPDLOG_ACTIVE_LEVEL` is set to `warning` in release builds. - https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/blob/e0dafccdc7f6c8ff3b82f090df7d3f5fd062b0bd/CMakeLists.txt#L78 +This time it was basically a copy/paste of the original code. +I just replaced struct member assignments by fluent api calls (`.setX().setY()...`). # Navigation [🌐 Original tutorial]( -https://docs.vulkan.org/tutorial/latest/03_Drawing_a_triangle/02_Graphics_pipeline_basics/01_Shader_modules.html) +https://docs.vulkan.org/tutorial/latest/03_Drawing_a_triangle/02_Graphics_pipeline_basics/02_Fixed_functions.html) [⏮ Drawing a triangle / Presentation / Image views]( https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/tree/linux/02-drawing-triangle/02-presentation/03-image-views) [⏭ Drawing a triangle / Graphics pipeline basics / Fixed functions]( -https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/tree/linux/02-drawing-triangle/03-graphics-pipeline-basics/03-fixed-functions) +https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/tree/linux/02-drawing-triangle/03-graphics-pipeline-basics/04-render-passes) [🔄 Diff from previous step]( -https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/compare/linux/02-drawing-triangle/02-presentation/03-image-views...linux/02-drawing-triangle/03-graphics-pipeline-basics/02-shader-modules) +https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/compare/linux/02-drawing-triangle/03-graphics-pipeline-basics/02-shader-modules...linux/02-drawing-triangle/03-graphics-pipeline-basics/03-fixed-functions) From fde41e381ed98a89475f556f0c29934e511116c6 Mon Sep 17 00:00:00 2001 From: Michael Pacheco Date: Sun, 19 Nov 2023 20:43:35 -0300 Subject: [PATCH 049/129] docs(linux): add fixed functions navigation link to linux summary branch --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 12b626b..1a3f4f9 100644 --- a/README.md +++ b/README.md @@ -27,3 +27,4 @@ and current step. * [Image views](https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/tree/linux/02-drawing-triangle/02-presentation/03-image-views) * Graphics pipeline basics * [Shader modules](https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/tree/linux/02-drawing-triangle/03-graphics-pipeline-basics/02-shader-modules) + * [Fixed functions](https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/tree/linux/02-drawing-triangle/03-graphics-pipeline-basics/03-fixed-functions) From bb0c16788921f8c0bf2c7d211271a0f1d7abbedb Mon Sep 17 00:00:00 2001 From: Michael Pacheco Date: Sun, 19 Nov 2023 20:53:04 -0300 Subject: [PATCH 050/129] refactor(linux): move `createGraphicsPipeline()` to correct position to match declaration order --- src/Application.cpp | 174 ++++++++++++++++++++++---------------------- 1 file changed, 87 insertions(+), 87 deletions(-) diff --git a/src/Application.cpp b/src/Application.cpp index 827a8fd..191b3a2 100644 --- a/src/Application.cpp +++ b/src/Application.cpp @@ -206,6 +206,93 @@ void Application::createImageViews() { } } +void Application::createGraphicsPipeline() { + auto vertShaderCode = BinaryLoader::load("res/shaders/shader.vert.spv"); + auto fragShaderCode = BinaryLoader::load("res/shaders/shader.frag.spv"); + + vk::ShaderModule vertShaderModule = createShaderModule(vertShaderCode); + vk::ShaderModule fragShaderModule = createShaderModule(fragShaderCode); + + const auto& vertShaderStageInfo = + vk::PipelineShaderStageCreateInfo() + .setStage(vk::ShaderStageFlagBits::eVertex) + .setModule(vertShaderModule) + .setPName("main"); + + const auto& fragShaderStageInfo = + vk::PipelineShaderStageCreateInfo() + .setStage(vk::ShaderStageFlagBits::eFragment) + .setModule(fragShaderModule) + .setPName("main"); + + vk::PipelineShaderStageCreateInfo shaderStages[]{ + vertShaderStageInfo, fragShaderStageInfo}; + + const auto& vertexInputInfo = + vk::PipelineVertexInputStateCreateInfo() + .setVertexBindingDescriptionCount(0) + .setVertexAttributeDescriptionCount(0); + + const auto& inputAssembly = + vk::PipelineInputAssemblyStateCreateInfo() + .setTopology(vk::PrimitiveTopology::eTriangleList) + .setPrimitiveRestartEnable(vk::False); + + const auto& viewportState = + vk::PipelineViewportStateCreateInfo().setViewportCount(1).setScissorCount( + 1 + ); + + const auto& rasterizer = + vk::PipelineRasterizationStateCreateInfo() + .setDepthClampEnable(vk::False) + .setRasterizerDiscardEnable(vk::False) + .setPolygonMode(vk::PolygonMode::eFill) + .setLineWidth(1.0f) + .setCullMode(vk::CullModeFlagBits::eBack) + .setFrontFace(vk::FrontFace::eClockwise) + .setDepthBiasEnable(vk::False); + + const auto& multisampling = + vk::PipelineMultisampleStateCreateInfo() + .setSampleShadingEnable(vk::False) + .setRasterizationSamples(vk::SampleCountFlagBits::e1); + + const auto& colorBlendAttachment = + vk::PipelineColorBlendAttachmentState() + .setColorWriteMask( + vk::ColorComponentFlagBits::eR | vk::ColorComponentFlagBits::eG | + vk::ColorComponentFlagBits::eB | vk::ColorComponentFlagBits::eA + ) + .setBlendEnable(vk::False); + + const auto& colorBlending = + vk::PipelineColorBlendStateCreateInfo() + .setLogicOpEnable(vk::False) + .setLogicOp(vk::LogicOp::eCopy) + .setAttachmentCount(1) + .setPAttachments(&colorBlendAttachment) + .setBlendConstants({0.0f, 0.0f, 0.0f, 0.0f}); + + std::vector dynamicStates = { + vk::DynamicState::eViewport, vk::DynamicState::eScissor}; + + const auto& dynamicState = + vk::PipelineDynamicStateCreateInfo() + .setDynamicStateCount(static_cast(dynamicStates.size())) + .setPDynamicStates(dynamicStates.data()); + + const auto& pipelineLayoutInfo = + vk::PipelineLayoutCreateInfo() + .setSetLayoutCount(0) + .setPushConstantRangeCount(0); + + m_pipelineLayout = m_device.createPipelineLayout(pipelineLayoutInfo); + + m_device.destroy(vertShaderModule); + m_device.destroy(fragShaderModule); +} + bool Application::isDeviceSuitable(const vk::PhysicalDevice& device) const { const auto& indices = QueueFamily::findIndices(device, m_surface); bool extensionsSupported = checkDeviceExtensionSupport(device); @@ -303,93 +390,6 @@ uint32_t Application::getSuitableImageCount( return requestImageCount; } -void Application::createGraphicsPipeline() { - auto vertShaderCode = BinaryLoader::load("res/shaders/shader.vert.spv"); - auto fragShaderCode = BinaryLoader::load("res/shaders/shader.frag.spv"); - - vk::ShaderModule vertShaderModule = createShaderModule(vertShaderCode); - vk::ShaderModule fragShaderModule = createShaderModule(fragShaderCode); - - const auto& vertShaderStageInfo = - vk::PipelineShaderStageCreateInfo() - .setStage(vk::ShaderStageFlagBits::eVertex) - .setModule(vertShaderModule) - .setPName("main"); - - const auto& fragShaderStageInfo = - vk::PipelineShaderStageCreateInfo() - .setStage(vk::ShaderStageFlagBits::eFragment) - .setModule(fragShaderModule) - .setPName("main"); - - vk::PipelineShaderStageCreateInfo shaderStages[]{ - vertShaderStageInfo, fragShaderStageInfo}; - - const auto& vertexInputInfo = - vk::PipelineVertexInputStateCreateInfo() - .setVertexBindingDescriptionCount(0) - .setVertexAttributeDescriptionCount(0); - - const auto& inputAssembly = - vk::PipelineInputAssemblyStateCreateInfo() - .setTopology(vk::PrimitiveTopology::eTriangleList) - .setPrimitiveRestartEnable(vk::False); - - const auto& viewportState = - vk::PipelineViewportStateCreateInfo().setViewportCount(1).setScissorCount( - 1 - ); - - const auto& rasterizer = - vk::PipelineRasterizationStateCreateInfo() - .setDepthClampEnable(vk::False) - .setRasterizerDiscardEnable(vk::False) - .setPolygonMode(vk::PolygonMode::eFill) - .setLineWidth(1.0f) - .setCullMode(vk::CullModeFlagBits::eBack) - .setFrontFace(vk::FrontFace::eClockwise) - .setDepthBiasEnable(vk::False); - - const auto& multisampling = - vk::PipelineMultisampleStateCreateInfo() - .setSampleShadingEnable(vk::False) - .setRasterizationSamples(vk::SampleCountFlagBits::e1); - - const auto& colorBlendAttachment = - vk::PipelineColorBlendAttachmentState() - .setColorWriteMask( - vk::ColorComponentFlagBits::eR | vk::ColorComponentFlagBits::eG | - vk::ColorComponentFlagBits::eB | vk::ColorComponentFlagBits::eA - ) - .setBlendEnable(vk::False); - - const auto& colorBlending = - vk::PipelineColorBlendStateCreateInfo() - .setLogicOpEnable(vk::False) - .setLogicOp(vk::LogicOp::eCopy) - .setAttachmentCount(1) - .setPAttachments(&colorBlendAttachment) - .setBlendConstants({0.0f, 0.0f, 0.0f, 0.0f}); - - std::vector dynamicStates = { - vk::DynamicState::eViewport, vk::DynamicState::eScissor}; - - const auto& dynamicState = - vk::PipelineDynamicStateCreateInfo() - .setDynamicStateCount(static_cast(dynamicStates.size())) - .setPDynamicStates(dynamicStates.data()); - - const auto& pipelineLayoutInfo = - vk::PipelineLayoutCreateInfo() - .setSetLayoutCount(0) - .setPushConstantRangeCount(0); - - m_pipelineLayout = m_device.createPipelineLayout(pipelineLayoutInfo); - - m_device.destroy(vertShaderModule); - m_device.destroy(fragShaderModule); -} - vk::ShaderModule Application::createShaderModule(const std::vector& code ) const { vk::ShaderModuleCreateInfo createInfo; From 8070291dc578c908808d4ccceb2ac820ace9f0fd Mon Sep 17 00:00:00 2001 From: Michael Pacheco Date: Sun, 19 Nov 2023 22:10:38 -0300 Subject: [PATCH 051/129] docs(linux): fix navigation links for fixed functions branch --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 24e0c5f..684829b 100644 --- a/README.md +++ b/README.md @@ -15,7 +15,7 @@ https://docs.vulkan.org/tutorial/latest/03_Drawing_a_triangle/02_Graphics_pipeli [⏮ Drawing a triangle / Presentation / Image views]( https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/tree/linux/02-drawing-triangle/02-presentation/03-image-views) -[⏭ Drawing a triangle / Graphics pipeline basics / Fixed functions]( +[⏭ Drawing a triangle / Graphics pipeline basics / Render passes]( https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/tree/linux/02-drawing-triangle/03-graphics-pipeline-basics/04-render-passes) [🔄 Diff from previous step]( From 991fd5a0ddf62a7cad0b16377f373f193be352d9 Mon Sep 17 00:00:00 2001 From: Michael Pacheco Date: Sun, 19 Nov 2023 22:09:13 -0300 Subject: [PATCH 052/129] feat(linux): create render pass --- README.md | 27 ++++++++++++++++++--------- src/Application.cpp | 38 ++++++++++++++++++++++++++++++++++---- src/Application.hpp | 2 ++ 3 files changed, 54 insertions(+), 13 deletions(-) diff --git a/README.md b/README.md index 684829b..d3270f7 100644 --- a/README.md +++ b/README.md @@ -1,22 +1,31 @@ -# Linux ❘ Graphics pipeline basics ❘ Fixed functions +# Linux ❘ Graphics pipeline basics ❘ Render passes Summary [here](https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/tree/linux-summary). # Adjustments -This time it was basically a copy/paste of the original code. -I just replaced struct member assignments by fluent api calls (`.setX().setY()...`). +- Used `Vulkan-hpp` helper methods to set count/pointer functions. + Instead of using + ```c++ + info.setColorAttachmentCount(count) + .setPColorAttachment(&attachment) + ``` + We use + ```c++ + info.setColorAttachments(attachment) + ``` + It will automatically cast attachment to a single element container if attachment was not already a container. # Navigation [🌐 Original tutorial]( -https://docs.vulkan.org/tutorial/latest/03_Drawing_a_triangle/02_Graphics_pipeline_basics/02_Fixed_functions.html) +https://docs.vulkan.org/tutorial/latest/03_Drawing_a_triangle/02_Graphics_pipeline_basics/03_Render_passes.html) -[⏮ Drawing a triangle / Presentation / Image views]( -https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/tree/linux/02-drawing-triangle/02-presentation/03-image-views) +[⏮ Drawing a triangle / Presentation / Fixed functions]( +https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/tree/linux/02-drawing-triangle/03-graphics-pipeline-basics/03-fixed-functions) -[⏭ Drawing a triangle / Graphics pipeline basics / Render passes]( -https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/tree/linux/02-drawing-triangle/03-graphics-pipeline-basics/04-render-passes) +[⏭ Drawing a triangle / Graphics pipeline basics / Conclusion]( +https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/tree/linux/02-drawing-triangle/03-graphics-pipeline-basics/05-conclusion) [🔄 Diff from previous step]( -https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/compare/linux/02-drawing-triangle/03-graphics-pipeline-basics/02-shader-modules...linux/02-drawing-triangle/03-graphics-pipeline-basics/03-fixed-functions) +https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/compare/linux/02-drawing-triangle/03-graphics-pipeline-basics/03-fixed-functions...linux/02-drawing-triangle/03-graphics-pipeline-basics/04-render-passes) diff --git a/src/Application.cpp b/src/Application.cpp index 191b3a2..81d4659 100644 --- a/src/Application.cpp +++ b/src/Application.cpp @@ -29,6 +29,7 @@ void Application::initVulkan() { createLogicalDevice(); createSwapChain(); createImageViews(); + createRenderPass(); createGraphicsPipeline(); } @@ -40,6 +41,7 @@ void Application::mainLoop() { void Application::cleanup() { m_device.destroy(m_pipelineLayout); + m_device.destroy(m_renderPass); for (const auto& imageView : m_swapChainImageViews) { m_device.destroy(imageView); } @@ -206,6 +208,36 @@ void Application::createImageViews() { } } +void Application::createRenderPass() { + const auto& colorAttachment = + vk::AttachmentDescription() + .setFormat(m_swapChainImageFormat) + .setSamples(vk::SampleCountFlagBits::e1) + .setLoadOp(vk::AttachmentLoadOp::eClear) + .setStoreOp(vk::AttachmentStoreOp::eStore) + .setStencilLoadOp(vk::AttachmentLoadOp::eDontCare) + .setStencilStoreOp(vk::AttachmentStoreOp::eDontCare) + .setInitialLayout(vk::ImageLayout::eUndefined) + .setFinalLayout(vk::ImageLayout::ePresentSrcKHR); + + const auto& colorAttachmentRef = + vk::AttachmentReference().setAttachment(0).setLayout( + vk::ImageLayout::eColorAttachmentOptimal + ); + + const auto& subPass = + vk::SubpassDescription() + .setPipelineBindPoint(vk::PipelineBindPoint::eGraphics) + .setColorAttachments(colorAttachmentRef); + + const auto& renderPassInfo = + vk::RenderPassCreateInfo() + .setAttachments(colorAttachment) + .setSubpasses(subPass); + + m_renderPass = m_device.createRenderPass(renderPassInfo); +} + void Application::createGraphicsPipeline() { auto vertShaderCode = BinaryLoader::load("res/shaders/shader.vert.spv"); auto fragShaderCode = BinaryLoader::load("res/shaders/shader.frag.spv"); @@ -270,8 +302,7 @@ void Application::createGraphicsPipeline() { vk::PipelineColorBlendStateCreateInfo() .setLogicOpEnable(vk::False) .setLogicOp(vk::LogicOp::eCopy) - .setAttachmentCount(1) - .setPAttachments(&colorBlendAttachment) + .setAttachments(colorBlendAttachment) .setBlendConstants({0.0f, 0.0f, 0.0f, 0.0f}); std::vector dynamicStates = { @@ -279,8 +310,7 @@ void Application::createGraphicsPipeline() { const auto& dynamicState = vk::PipelineDynamicStateCreateInfo() - .setDynamicStateCount(static_cast(dynamicStates.size())) - .setPDynamicStates(dynamicStates.data()); + .setDynamicStates(dynamicStates); const auto& pipelineLayoutInfo = vk::PipelineLayoutCreateInfo() diff --git a/src/Application.hpp b/src/Application.hpp index 2a7cb99..7770591 100644 --- a/src/Application.hpp +++ b/src/Application.hpp @@ -34,6 +34,7 @@ class Application { vk::Format m_swapChainImageFormat; vk::Extent2D m_swapChainExtent; std::vector m_swapChainImageViews; + vk::RenderPass m_renderPass; vk::PipelineLayout m_pipelineLayout; void initWindow(); @@ -48,6 +49,7 @@ class Application { void createLogicalDevice(); void createSwapChain(); void createImageViews(); + void createRenderPass(); void createGraphicsPipeline(); [[nodiscard]] bool isDeviceSuitable(const vk::PhysicalDevice& device) const; From 90525c824d11aba3a885f1269b51e433298c0783 Mon Sep 17 00:00:00 2001 From: Michael Pacheco Date: Sun, 19 Nov 2023 22:21:58 -0300 Subject: [PATCH 053/129] docs(linux): add render passes navigation link to linux summary branch --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 1a3f4f9..479c77d 100644 --- a/README.md +++ b/README.md @@ -28,3 +28,4 @@ and current step. * Graphics pipeline basics * [Shader modules](https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/tree/linux/02-drawing-triangle/03-graphics-pipeline-basics/02-shader-modules) * [Fixed functions](https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/tree/linux/02-drawing-triangle/03-graphics-pipeline-basics/03-fixed-functions) + * [Render passes](https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/tree/linux/02-drawing-triangle/03-graphics-pipeline-basics/04-render-passes) From 4ea7362bb86e3311db104a6c8ed11ed4a52f30ad Mon Sep 17 00:00:00 2001 From: Michael Pacheco Date: Sun, 19 Nov 2023 23:03:22 -0300 Subject: [PATCH 054/129] feat(linux): create graphics pipeline --- README.md | 31 +++++++++++++++---------------- src/Application.cpp | 26 ++++++++++++++++++++++++-- src/Application.hpp | 1 + 3 files changed, 40 insertions(+), 18 deletions(-) diff --git a/README.md b/README.md index d3270f7..f02998d 100644 --- a/README.md +++ b/README.md @@ -1,31 +1,30 @@ -# Linux ❘ Graphics pipeline basics ❘ Render passes +# Linux ❘ Graphics pipeline basics ❘ Conclusion Summary [here](https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/tree/linux-summary). # Adjustments -- Used `Vulkan-hpp` helper methods to set count/pointer functions. - Instead of using - ```c++ - info.setColorAttachmentCount(count) - .setPColorAttachment(&attachment) - ``` - We use +- The `vk::Device::createGraphicsPipeline()` returns a `vk::ResultValue`, so we can use `std::tie()` to + extract the result and the pipeline. + In cases like this, use the `vk::checkResult()` function to validate that the operation succeeded. + ```c++ - info.setColorAttachments(attachment) + vk::Result createPipelineResult; + vk::Pipeline pipeline; + std::tie(createPipelineResult, pipeline) = device.createGraphicsPipeline({}, pipelineInfo); + vk::resultCheck(createPipelineResult, "Failed to create graphics pipeline"); ``` - It will automatically cast attachment to a single element container if attachment was not already a container. # Navigation [🌐 Original tutorial]( -https://docs.vulkan.org/tutorial/latest/03_Drawing_a_triangle/02_Graphics_pipeline_basics/03_Render_passes.html) +https://docs.vulkan.org/tutorial/latest/03_Drawing_a_triangle/02_Graphics_pipeline_basics/04_Conclusion.html) -[⏮ Drawing a triangle / Presentation / Fixed functions]( -https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/tree/linux/02-drawing-triangle/03-graphics-pipeline-basics/03-fixed-functions) +[⏮ Drawing a triangle / Presentation / Render passes]( +https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/tree/linux/02-drawing-triangle/03-graphics-pipeline-basics/04-render-passes) -[⏭ Drawing a triangle / Graphics pipeline basics / Conclusion]( -https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/tree/linux/02-drawing-triangle/03-graphics-pipeline-basics/05-conclusion) +[⏭ Drawing a triangle / Drawing / Frame buffers]( +https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/tree/linux/02-drawing-triangle/04-drawing/01-frame-buffers) [🔄 Diff from previous step]( -https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/compare/linux/02-drawing-triangle/03-graphics-pipeline-basics/03-fixed-functions...linux/02-drawing-triangle/03-graphics-pipeline-basics/04-render-passes) +https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/compare/linux/02-drawing-triangle/03-graphics-pipeline-basics/04-render-passes...linux/02-drawing-triangle/03-graphics-pipeline-basics/05-conclusion) diff --git a/src/Application.cpp b/src/Application.cpp index 81d4659..ffa8e1e 100644 --- a/src/Application.cpp +++ b/src/Application.cpp @@ -40,6 +40,7 @@ void Application::mainLoop() { } void Application::cleanup() { + m_device.destroy(m_graphicsPipeline); m_device.destroy(m_pipelineLayout); m_device.destroy(m_renderPass); for (const auto& imageView : m_swapChainImageViews) { @@ -309,8 +310,7 @@ void Application::createGraphicsPipeline() { vk::DynamicState::eViewport, vk::DynamicState::eScissor}; const auto& dynamicState = - vk::PipelineDynamicStateCreateInfo() - .setDynamicStates(dynamicStates); + vk::PipelineDynamicStateCreateInfo().setDynamicStates(dynamicStates); const auto& pipelineLayoutInfo = vk::PipelineLayoutCreateInfo() @@ -319,6 +319,28 @@ void Application::createGraphicsPipeline() { m_pipelineLayout = m_device.createPipelineLayout(pipelineLayoutInfo); + const auto& pipelineInfo = + vk::GraphicsPipelineCreateInfo() + .setStages(shaderStages) + .setPVertexInputState(&vertexInputInfo) + .setPInputAssemblyState(&inputAssembly) + .setPViewportState(&viewportState) + .setPRasterizationState(&rasterizer) + .setPMultisampleState(&multisampling) + .setPColorBlendState(&colorBlending) + .setPDynamicState(&dynamicState) + .setLayout(m_pipelineLayout) + .setRenderPass(m_renderPass) + .setSubpass(0) + .setBasePipelineHandle(VK_NULL_HANDLE); + + vk::Result createPipelineResult; + + std::tie(createPipelineResult, m_graphicsPipeline) = + m_device.createGraphicsPipeline({}, pipelineInfo); + + vk::resultCheck(createPipelineResult, "Failed to create graphics pipeline"); + m_device.destroy(vertShaderModule); m_device.destroy(fragShaderModule); } diff --git a/src/Application.hpp b/src/Application.hpp index 7770591..357a633 100644 --- a/src/Application.hpp +++ b/src/Application.hpp @@ -36,6 +36,7 @@ class Application { std::vector m_swapChainImageViews; vk::RenderPass m_renderPass; vk::PipelineLayout m_pipelineLayout; + vk::Pipeline m_graphicsPipeline; void initWindow(); void initVulkan(); From 1c8885527eef02514224c685d15278ae51a17c95 Mon Sep 17 00:00:00 2001 From: Michael Pacheco Date: Sun, 19 Nov 2023 23:05:38 -0300 Subject: [PATCH 055/129] docs(linux): add graphics pipeline conclusion navigation link to linux summary branch --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 479c77d..7ee022c 100644 --- a/README.md +++ b/README.md @@ -29,3 +29,4 @@ and current step. * [Shader modules](https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/tree/linux/02-drawing-triangle/03-graphics-pipeline-basics/02-shader-modules) * [Fixed functions](https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/tree/linux/02-drawing-triangle/03-graphics-pipeline-basics/03-fixed-functions) * [Render passes](https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/tree/linux/02-drawing-triangle/03-graphics-pipeline-basics/04-render-passes) + * [Conclusion](https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/tree/linux/02-drawing-triangle/03-graphics-pipeline-basics/05-conclusion) From c8858fd89ecada6c3939c432df8bd495d63af793 Mon Sep 17 00:00:00 2001 From: Michael Pacheco Date: Mon, 20 Nov 2023 01:48:58 -0300 Subject: [PATCH 056/129] docs(linux): fix navigation links to conclusion branch --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index f02998d..aff8587 100644 --- a/README.md +++ b/README.md @@ -20,7 +20,7 @@ Summary [here](https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/tree/lin [🌐 Original tutorial]( https://docs.vulkan.org/tutorial/latest/03_Drawing_a_triangle/02_Graphics_pipeline_basics/04_Conclusion.html) -[⏮ Drawing a triangle / Presentation / Render passes]( +[⏮ Drawing a triangle / Graphics pipeline basics / Render passes]( https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/tree/linux/02-drawing-triangle/03-graphics-pipeline-basics/04-render-passes) [⏭ Drawing a triangle / Drawing / Frame buffers]( From b27db3c492841ee7b4e33768264ed9f33276f483 Mon Sep 17 00:00:00 2001 From: Michael Pacheco Date: Mon, 20 Nov 2023 01:20:56 -0300 Subject: [PATCH 057/129] feat(linux): add frame buffers --- README.md | 25 ++++++++----------------- src/Application.cpp | 21 +++++++++++++++++++++ src/Application.hpp | 2 ++ 3 files changed, 31 insertions(+), 17 deletions(-) diff --git a/README.md b/README.md index aff8587..6a435de 100644 --- a/README.md +++ b/README.md @@ -1,30 +1,21 @@ -# Linux ❘ Graphics pipeline basics ❘ Conclusion +# Linux ❘ Drawing ❘ Frame buffers Summary [here](https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/tree/linux-summary). # Adjustments -- The `vk::Device::createGraphicsPipeline()` returns a `vk::ResultValue`, so we can use `std::tie()` to - extract the result and the pipeline. - In cases like this, use the `vk::checkResult()` function to validate that the operation succeeded. - - ```c++ - vk::Result createPipelineResult; - vk::Pipeline pipeline; - std::tie(createPipelineResult, pipeline) = device.createGraphicsPipeline({}, pipelineInfo); - vk::resultCheck(createPipelineResult, "Failed to create graphics pipeline"); - ``` +None. # Navigation [🌐 Original tutorial]( -https://docs.vulkan.org/tutorial/latest/03_Drawing_a_triangle/02_Graphics_pipeline_basics/04_Conclusion.html) +https://docs.vulkan.org/tutorial/latest/03_Drawing_a_triangle/03_Drawing/00_Framebuffers.html) -[⏮ Drawing a triangle / Graphics pipeline basics / Render passes]( -https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/tree/linux/02-drawing-triangle/03-graphics-pipeline-basics/04-render-passes) +[⏮ Drawing a triangle / Graphics pipeline basics / Conclusion]( +https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/tree/linux/02-drawing-triangle/03-graphics-pipeline-basics/05-conclusion) -[⏭ Drawing a triangle / Drawing / Frame buffers]( -https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/tree/linux/02-drawing-triangle/04-drawing/01-frame-buffers) +[⏭ Drawing a triangle / Drawing / Command buffers]( +https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/tree/linux/02-drawing-triangle/04-drawing/01-command-buffers) [🔄 Diff from previous step]( -https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/compare/linux/02-drawing-triangle/03-graphics-pipeline-basics/04-render-passes...linux/02-drawing-triangle/03-graphics-pipeline-basics/05-conclusion) +https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/compare/linux/02-drawing-triangle/03-graphics-pipeline-basics/05-conclusion...linux/02-drawing-triangle/04-drawing/01-frame-buffers) diff --git a/src/Application.cpp b/src/Application.cpp index ffa8e1e..392b0f0 100644 --- a/src/Application.cpp +++ b/src/Application.cpp @@ -31,6 +31,7 @@ void Application::initVulkan() { createImageViews(); createRenderPass(); createGraphicsPipeline(); + createFrameBuffers(); } void Application::mainLoop() { @@ -40,6 +41,9 @@ void Application::mainLoop() { } void Application::cleanup() { + for (const auto& frameBuffer : m_swapChainFrameBuffers) { + m_device.destroy(frameBuffer); + } m_device.destroy(m_graphicsPipeline); m_device.destroy(m_pipelineLayout); m_device.destroy(m_renderPass); @@ -345,6 +349,23 @@ void Application::createGraphicsPipeline() { m_device.destroy(fragShaderModule); } +void Application::createFrameBuffers() { + m_swapChainFrameBuffers.resize(m_swapChainImageViews.size()); + + for (size_t i = 0; i < m_swapChainImageViews.size(); ++i) { + + const auto& framebufferInfo = + vk::FramebufferCreateInfo() + .setRenderPass(m_renderPass) + .setAttachments(m_swapChainImageViews[i]) + .setWidth(m_swapChainExtent.width) + .setHeight(m_swapChainExtent.height) + .setLayers(1); + + m_swapChainFrameBuffers[i] = m_device.createFramebuffer(framebufferInfo); + } +} + bool Application::isDeviceSuitable(const vk::PhysicalDevice& device) const { const auto& indices = QueueFamily::findIndices(device, m_surface); bool extensionsSupported = checkDeviceExtensionSupport(device); diff --git a/src/Application.hpp b/src/Application.hpp index 357a633..7b64c8c 100644 --- a/src/Application.hpp +++ b/src/Application.hpp @@ -37,6 +37,7 @@ class Application { vk::RenderPass m_renderPass; vk::PipelineLayout m_pipelineLayout; vk::Pipeline m_graphicsPipeline; + std::vector m_swapChainFrameBuffers; void initWindow(); void initVulkan(); @@ -52,6 +53,7 @@ class Application { void createImageViews(); void createRenderPass(); void createGraphicsPipeline(); + void createFrameBuffers(); [[nodiscard]] bool isDeviceSuitable(const vk::PhysicalDevice& device) const; From 6f3e1f8873ce37e4a573afbede902b8ec7bb79ad Mon Sep 17 00:00:00 2001 From: Michael Pacheco Date: Mon, 20 Nov 2023 02:05:11 -0300 Subject: [PATCH 058/129] docs(linux): add drawing frame buffers navigation link to linux summary branch --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index 7ee022c..a2e5649 100644 --- a/README.md +++ b/README.md @@ -30,3 +30,5 @@ and current step. * [Fixed functions](https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/tree/linux/02-drawing-triangle/03-graphics-pipeline-basics/03-fixed-functions) * [Render passes](https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/tree/linux/02-drawing-triangle/03-graphics-pipeline-basics/04-render-passes) * [Conclusion](https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/tree/linux/02-drawing-triangle/03-graphics-pipeline-basics/05-conclusion) +* Drawing + * [Frame buffers](https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/tree/linux/02-drawing-triangle/04-drawing/01-frame-buffers) From 89dc1b7e3df6da5b4fff036811a0057496438cc1 Mon Sep 17 00:00:00 2001 From: Michael Pacheco Date: Mon, 20 Nov 2023 03:19:11 -0300 Subject: [PATCH 059/129] feat(linux): create command pool --- README.md | 14 ++++----- src/Application.cpp | 69 ++++++++++++++++++++++++++++++++++++++++++++- src/Application.hpp | 8 ++++++ 3 files changed, 83 insertions(+), 8 deletions(-) diff --git a/README.md b/README.md index 6a435de..58cd6c5 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# Linux ❘ Drawing ❘ Frame buffers +# Linux ❘ Drawing ❘ Command buffers Summary [here](https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/tree/linux-summary). @@ -9,13 +9,13 @@ None. # Navigation [🌐 Original tutorial]( -https://docs.vulkan.org/tutorial/latest/03_Drawing_a_triangle/03_Drawing/00_Framebuffers.html) +https://docs.vulkan.org/tutorial/latest/03_Drawing_a_triangle/03_Drawing/01_Command_buffers.html) -[⏮ Drawing a triangle / Graphics pipeline basics / Conclusion]( -https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/tree/linux/02-drawing-triangle/03-graphics-pipeline-basics/05-conclusion) +[⏮ Drawing a triangle / Drawing / Frame buffers]( +https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/tree/linux/02-drawing-triangle/04-drawing/01-frame-buffers) -[⏭ Drawing a triangle / Drawing / Command buffers]( -https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/tree/linux/02-drawing-triangle/04-drawing/01-command-buffers) +[⏭ Drawing a triangle / Drawing / Rendering and presentation]( +https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/tree/linux/02-drawing-triangle/04-drawing/03-rendering-and-presentation) [🔄 Diff from previous step]( -https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/compare/linux/02-drawing-triangle/03-graphics-pipeline-basics/05-conclusion...linux/02-drawing-triangle/04-drawing/01-frame-buffers) +https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/compare/linux/02-drawing-triangle/04-drawing/01-frame-buffers...linux/02-drawing-triangle/04-drawing/02-command-buffers) diff --git a/src/Application.cpp b/src/Application.cpp index 392b0f0..32abdc8 100644 --- a/src/Application.cpp +++ b/src/Application.cpp @@ -32,6 +32,8 @@ void Application::initVulkan() { createRenderPass(); createGraphicsPipeline(); createFrameBuffers(); + createCommandPool(); + createCommandBuffer(); } void Application::mainLoop() { @@ -41,6 +43,7 @@ void Application::mainLoop() { } void Application::cleanup() { + m_device.destroy(m_commandPool); for (const auto& frameBuffer : m_swapChainFrameBuffers) { m_device.destroy(frameBuffer); } @@ -353,7 +356,6 @@ void Application::createFrameBuffers() { m_swapChainFrameBuffers.resize(m_swapChainImageViews.size()); for (size_t i = 0; i < m_swapChainImageViews.size(); ++i) { - const auto& framebufferInfo = vk::FramebufferCreateInfo() .setRenderPass(m_renderPass) @@ -366,6 +368,28 @@ void Application::createFrameBuffers() { } } +void Application::createCommandPool() { + const QueueFamily::Indices& queueFamilyIndices = + QueueFamily::findIndices(m_physicalDevice, m_surface); + + const auto& poolInfo = + vk::CommandPoolCreateInfo() + .setFlags(vk::CommandPoolCreateFlagBits::eResetCommandBuffer) + .setQueueFamilyIndex(queueFamilyIndices.graphicsFamily.value()); + + m_commandPool = m_device.createCommandPool(poolInfo); +} + +void Application::createCommandBuffer() { + const auto& allocInfo = + vk::CommandBufferAllocateInfo() + .setCommandPool(m_commandPool) + .setLevel(vk::CommandBufferLevel::ePrimary) + .setCommandBufferCount(1); + + m_commandBuffer = m_device.allocateCommandBuffers(allocInfo).front(); +} + bool Application::isDeviceSuitable(const vk::PhysicalDevice& device) const { const auto& indices = QueueFamily::findIndices(device, m_surface); bool extensionsSupported = checkDeviceExtensionSupport(device); @@ -471,3 +495,46 @@ vk::ShaderModule Application::createShaderModule(const std::vector& code vk::ShaderModule shaderModule = m_device.createShaderModule(createInfo); return shaderModule; } + +void Application::recordCommandBuffer( + const vk::CommandBuffer& commandBuffer, uint32_t imageIndex +) { + vk::CommandBufferBeginInfo beginInfo; + + commandBuffer.begin(beginInfo); + + vk::ClearValue clearColor{{0.0f, 0.0f, 0.0f, 1.0f}}; + vk::Offset2D zeroOffset{0, 0}; + + const auto& renderPassInfo = + vk::RenderPassBeginInfo() + .setRenderPass(m_renderPass) + .setFramebuffer(m_swapChainFrameBuffers[imageIndex]) + .setRenderArea({zeroOffset, m_swapChainExtent}) + .setClearValueCount(1) + .setClearValues(clearColor); + + commandBuffer.beginRenderPass(renderPassInfo, vk::SubpassContents::eInline); + + commandBuffer.bindPipeline( + vk::PipelineBindPoint::eGraphics, m_graphicsPipeline + ); + + const auto& viewport = + vk::Viewport() + .setX(0.0f) + .setY(0.0f) + .setWidth((float)m_swapChainExtent.width) + .setHeight((float)m_swapChainExtent.height) + .setMinDepth(0.0f) + .setMaxDepth(1.0f); + + commandBuffer.setViewport(0, viewport); + + vk::Rect2D scissor = {zeroOffset, m_swapChainExtent}; + + commandBuffer.setScissor(0, scissor); + commandBuffer.draw(3, 1, 0, 0); + commandBuffer.endRenderPass(); + commandBuffer.end(); +} diff --git a/src/Application.hpp b/src/Application.hpp index 7b64c8c..3142e6a 100644 --- a/src/Application.hpp +++ b/src/Application.hpp @@ -38,6 +38,8 @@ class Application { vk::PipelineLayout m_pipelineLayout; vk::Pipeline m_graphicsPipeline; std::vector m_swapChainFrameBuffers; + vk::CommandPool m_commandPool; + vk::CommandBuffer m_commandBuffer; // Destroyed by command pool void initWindow(); void initVulkan(); @@ -54,6 +56,8 @@ class Application { void createRenderPass(); void createGraphicsPipeline(); void createFrameBuffers(); + void createCommandPool(); + void createCommandBuffer(); [[nodiscard]] bool isDeviceSuitable(const vk::PhysicalDevice& device) const; @@ -80,4 +84,8 @@ class Application { [[nodiscard]] vk::ShaderModule createShaderModule( const std::vector& code ) const; + + void recordCommandBuffer( + const vk::CommandBuffer& commandBuffer, uint32_t imageIndex + ); }; From 5ad73fe2cb8d7230268f16bc388b92ade2a1b6f5 Mon Sep 17 00:00:00 2001 From: Michael Pacheco Date: Mon, 20 Nov 2023 03:26:03 -0300 Subject: [PATCH 060/129] docs(linux): add drawing command buffers navigation link to linux summary branch --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index a2e5649..a5336e4 100644 --- a/README.md +++ b/README.md @@ -32,3 +32,4 @@ and current step. * [Conclusion](https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/tree/linux/02-drawing-triangle/03-graphics-pipeline-basics/05-conclusion) * Drawing * [Frame buffers](https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/tree/linux/02-drawing-triangle/04-drawing/01-frame-buffers) + * [Command buffers](https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/tree/linux/02-drawing-triangle/04-drawing/02-command-buffers) From ca4dc8707375fbe71a06ba57ad35094ec71cb65b Mon Sep 17 00:00:00 2001 From: Michael Pacheco Date: Mon, 20 Nov 2023 13:43:23 -0300 Subject: [PATCH 061/129] docs(linux): update rendering and presentation README.md --- README.md | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/README.md b/README.md index 58cd6c5..bd0b542 100644 --- a/README.md +++ b/README.md @@ -1,21 +1,19 @@ -# Linux ❘ Drawing ❘ Command buffers +# Linux ❘ Drawing ❘ Rendering and presentation Summary [here](https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/tree/linux-summary). # Adjustments -None. - # Navigation [🌐 Original tutorial]( https://docs.vulkan.org/tutorial/latest/03_Drawing_a_triangle/03_Drawing/01_Command_buffers.html) -[⏮ Drawing a triangle / Drawing / Frame buffers]( -https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/tree/linux/02-drawing-triangle/04-drawing/01-frame-buffers) +[⏮ Drawing a triangle / Drawing / Command buffers]( +https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/tree/linux/02-drawing-triangle/04-drawing/02-command-buffers) -[⏭ Drawing a triangle / Drawing / Rendering and presentation]( -https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/tree/linux/02-drawing-triangle/04-drawing/03-rendering-and-presentation) +[⏭ Drawing a triangle / Drawing / Frames in flight]( +https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/tree/linux/02-drawing-triangle/04-drawing/04-frames-in-flight) [🔄 Diff from previous step]( -https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/compare/linux/02-drawing-triangle/04-drawing/01-frame-buffers...linux/02-drawing-triangle/04-drawing/02-command-buffers) +https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/compare/linux/02-drawing-triangle/04-drawing/02-command-buffers...linux/02-drawing-triangle/04-drawing/03-rendering-and-presentation) From 8324fb87dcb5e1238f1370993e21c04a3e95e63c Mon Sep 17 00:00:00 2001 From: Michael Pacheco Date: Mon, 20 Nov 2023 14:24:17 -0300 Subject: [PATCH 062/129] refactor(linux): add code quality & performance refinements --- src/Application.cpp | 9 +++++---- src/Application.hpp | 4 +++- src/QueueFamily.cpp | 2 ++ src/QueueFamily.hpp | 1 - src/ValidationLayer.cpp | 2 ++ src/ValidationLayer.hpp | 2 -- 6 files changed, 12 insertions(+), 8 deletions(-) diff --git a/src/Application.cpp b/src/Application.cpp index 32abdc8..9f03f9d 100644 --- a/src/Application.cpp +++ b/src/Application.cpp @@ -1,6 +1,7 @@ #include "Application.hpp" #include +#include #include "BinaryLoader.hpp" #include "Config.hpp" @@ -313,7 +314,7 @@ void Application::createGraphicsPipeline() { .setAttachments(colorBlendAttachment) .setBlendConstants({0.0f, 0.0f, 0.0f, 0.0f}); - std::vector dynamicStates = { + std::vector dynamicStates = { vk::DynamicState::eViewport, vk::DynamicState::eScissor}; const auto& dynamicState = @@ -394,7 +395,7 @@ bool Application::isDeviceSuitable(const vk::PhysicalDevice& device) const { const auto& indices = QueueFamily::findIndices(device, m_surface); bool extensionsSupported = checkDeviceExtensionSupport(device); - bool suitableSwapChain; + bool suitableSwapChain = false; if (extensionsSupported) { SwapChainSupportDetails swapChainSupport = @@ -524,8 +525,8 @@ void Application::recordCommandBuffer( vk::Viewport() .setX(0.0f) .setY(0.0f) - .setWidth((float)m_swapChainExtent.width) - .setHeight((float)m_swapChainExtent.height) + .setWidth(static_cast(m_swapChainExtent.width)) + .setHeight(static_cast(m_swapChainExtent.height)) .setMinDepth(0.0f) .setMaxDepth(1.0f); diff --git a/src/Application.hpp b/src/Application.hpp index 3142e6a..4ec2931 100644 --- a/src/Application.hpp +++ b/src/Application.hpp @@ -10,7 +10,9 @@ class Application { std::vector formats; std::vector presentModes; - SwapChainSupportDetails(vk::PhysicalDevice device, vk::SurfaceKHR surface) { + SwapChainSupportDetails( + const vk::PhysicalDevice& device, const vk::SurfaceKHR& surface + ) { capabilities = device.getSurfaceCapabilitiesKHR(surface); formats = device.getSurfaceFormatsKHR(surface); presentModes = device.getSurfacePresentModesKHR(surface); diff --git a/src/QueueFamily.cpp b/src/QueueFamily.cpp index a6887b1..374763b 100644 --- a/src/QueueFamily.cpp +++ b/src/QueueFamily.cpp @@ -1,5 +1,7 @@ #include "QueueFamily.hpp" +#include + using Indices = QueueFamily::Indices; bool Indices::isComplete() const { diff --git a/src/QueueFamily.hpp b/src/QueueFamily.hpp index c4ea9b3..d8cdfe6 100644 --- a/src/QueueFamily.hpp +++ b/src/QueueFamily.hpp @@ -1,7 +1,6 @@ #pragma once #include -#include #include struct QueueFamily { diff --git a/src/ValidationLayer.cpp b/src/ValidationLayer.cpp index 2cd261e..b4173a5 100644 --- a/src/ValidationLayer.cpp +++ b/src/ValidationLayer.cpp @@ -2,6 +2,8 @@ #include +#include "Config.hpp" + /** * These functions are not automatically loaded by the Vulkan loader. * That's why we created diff --git a/src/ValidationLayer.hpp b/src/ValidationLayer.hpp index 9f93e2c..6e2fd8d 100644 --- a/src/ValidationLayer.hpp +++ b/src/ValidationLayer.hpp @@ -2,8 +2,6 @@ #include -#include "Config.hpp" - class ValidationLayer { public: static bool checkValidationLayerSupport(); From 11c760000fc6d69b108485f2ae6690c6cc803a8a Mon Sep 17 00:00:00 2001 From: Michael Pacheco Date: Mon, 20 Nov 2023 21:46:53 -0300 Subject: [PATCH 063/129] feat(linux): render triangle --- src/Application.cpp | 64 ++++++++++++++++++++++++++++++++++++++++++++- src/Application.hpp | 5 ++++ 2 files changed, 68 insertions(+), 1 deletion(-) diff --git a/src/Application.cpp b/src/Application.cpp index 9f03f9d..1028d48 100644 --- a/src/Application.cpp +++ b/src/Application.cpp @@ -9,6 +9,8 @@ #include "Utils.hpp" #include "ValidationLayer.hpp" +constexpr auto NO_TIMEOUT = std::numeric_limits::max(); + void Application::run() { initWindow(); initVulkan(); @@ -35,15 +37,59 @@ void Application::initVulkan() { createFrameBuffers(); createCommandPool(); createCommandBuffer(); + createSyncObjects(); } void Application::mainLoop() { while (!m_window.shouldClose()) { m_window.pollEvents(); + drawFrame(); } + + m_device.waitIdle(); +} + +void Application::drawFrame() { + (void)m_device.waitForFences(m_inFlightFence, vk::True, NO_TIMEOUT); + m_device.resetFences(m_inFlightFence); + + + vk::ResultValue acquireResult = m_device.acquireNextImageKHR( + m_swapChain, NO_TIMEOUT, m_imageAvailableSemaphore + ); + + uint32_t imageIndex = acquireResult.value; + + m_commandBuffer.reset(); + recordCommandBuffer(m_commandBuffer, imageIndex); + + const vk::PipelineStageFlags waitStages{ + vk::PipelineStageFlagBits::eColorAttachmentOutput}; + + const auto signalSemaphores = {m_renderFinishedSemaphore}; + + const auto& submitInfo = + vk::SubmitInfo() + .setWaitSemaphores(m_imageAvailableSemaphore) + .setWaitDstStageMask(waitStages) + .setCommandBuffers(m_commandBuffer) + .setSignalSemaphores(signalSemaphores); + + m_graphicsQueue.submit(submitInfo, m_inFlightFence); + + const auto& presentInfo = + vk::PresentInfoKHR() + .setWaitSemaphores(signalSemaphores) + .setSwapchains(m_swapChain) + .setImageIndices(imageIndex); + + (void)m_presentQueue.presentKHR(presentInfo); } void Application::cleanup() { + m_device.destroy(m_inFlightFence); + m_device.destroy(m_renderFinishedSemaphore); + m_device.destroy(m_imageAvailableSemaphore); m_device.destroy(m_commandPool); for (const auto& frameBuffer : m_swapChainFrameBuffers) { m_device.destroy(frameBuffer); @@ -239,10 +285,20 @@ void Application::createRenderPass() { .setPipelineBindPoint(vk::PipelineBindPoint::eGraphics) .setColorAttachments(colorAttachmentRef); + const auto& dependency = + vk::SubpassDependency() + .setSrcSubpass(vk::SubpassExternal) + .setDstSubpass(0) + .setSrcStageMask(vk::PipelineStageFlagBits::eColorAttachmentOutput) + .setSrcAccessMask({}) + .setDstStageMask(vk::PipelineStageFlagBits::eColorAttachmentOutput) + .setDstAccessMask(vk::AccessFlagBits::eColorAttachmentWrite); + const auto& renderPassInfo = vk::RenderPassCreateInfo() .setAttachments(colorAttachment) - .setSubpasses(subPass); + .setSubpasses(subPass) + .setDependencies(dependency); m_renderPass = m_device.createRenderPass(renderPassInfo); } @@ -391,6 +447,12 @@ void Application::createCommandBuffer() { m_commandBuffer = m_device.allocateCommandBuffers(allocInfo).front(); } +void Application::createSyncObjects() { + m_imageAvailableSemaphore = m_device.createSemaphore({}); + m_renderFinishedSemaphore = m_device.createSemaphore({}); + m_inFlightFence = m_device.createFence({vk::FenceCreateFlagBits::eSignaled}); +} + bool Application::isDeviceSuitable(const vk::PhysicalDevice& device) const { const auto& indices = QueueFamily::findIndices(device, m_surface); bool extensionsSupported = checkDeviceExtensionSupport(device); diff --git a/src/Application.hpp b/src/Application.hpp index 4ec2931..00076ae 100644 --- a/src/Application.hpp +++ b/src/Application.hpp @@ -42,10 +42,14 @@ class Application { std::vector m_swapChainFrameBuffers; vk::CommandPool m_commandPool; vk::CommandBuffer m_commandBuffer; // Destroyed by command pool + vk::Semaphore m_imageAvailableSemaphore; + vk::Semaphore m_renderFinishedSemaphore; + vk::Fence m_inFlightFence; void initWindow(); void initVulkan(); void mainLoop(); + void drawFrame(); void cleanup(); void createInstance(); @@ -60,6 +64,7 @@ class Application { void createFrameBuffers(); void createCommandPool(); void createCommandBuffer(); + void createSyncObjects(); [[nodiscard]] bool isDeviceSuitable(const vk::PhysicalDevice& device) const; From d6cb64bbe238e569b42b028b31ebc314a51690e5 Mon Sep 17 00:00:00 2001 From: Michael Pacheco Date: Mon, 20 Nov 2023 22:03:48 -0300 Subject: [PATCH 064/129] docs(linux): add adjustments section to render triangle README.md --- README.md | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index bd0b542..086b7d1 100644 --- a/README.md +++ b/README.md @@ -4,10 +4,16 @@ Summary [here](https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/tree/lin # Adjustments +- Created `NO_TIMEOUT` constant to represent disabled timeouts and avoid magic numbers. +- Used the enhanced `Vulkan-Hpp` functions to automatically handle error results. + You can see that our version of `Application::createSyncObjects()` is way simpler than the original. + This works for us because we didn't set defined the `VULKAN_HPP_DISABLE_ENHANCED_MODE` macro. + If we did this, we would have to check the results by ourselves. + # Navigation [🌐 Original tutorial]( -https://docs.vulkan.org/tutorial/latest/03_Drawing_a_triangle/03_Drawing/01_Command_buffers.html) +https://docs.vulkan.org/tutorial/latest/03_Drawing_a_triangle/03_Drawing/02_Rendering_and_presentation.html) [⏮ Drawing a triangle / Drawing / Command buffers]( https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/tree/linux/02-drawing-triangle/04-drawing/02-command-buffers) From 0a88db34fa95495f73390791b21ea63cc5f6c316 Mon Sep 17 00:00:00 2001 From: Michael Pacheco Date: Mon, 20 Nov 2023 22:07:33 -0300 Subject: [PATCH 065/129] docs(linux): add rendering and presentation navigation link to linux summary branch --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index a5336e4..90bffd8 100644 --- a/README.md +++ b/README.md @@ -33,3 +33,4 @@ and current step. * Drawing * [Frame buffers](https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/tree/linux/02-drawing-triangle/04-drawing/01-frame-buffers) * [Command buffers](https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/tree/linux/02-drawing-triangle/04-drawing/02-command-buffers) + * [Rendering and presentation](https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/tree/linux/02-drawing-triangle/04-drawing/03-rendering-and-presentation) From f22dac0bda650b1eae104c0f1b605d62db83d57e Mon Sep 17 00:00:00 2001 From: Michael Pacheco Date: Tue, 21 Nov 2023 15:56:12 -0300 Subject: [PATCH 066/129] docs(linux): update frames in flight step navigation links --- README.md | 20 +++++++------------- 1 file changed, 7 insertions(+), 13 deletions(-) diff --git a/README.md b/README.md index 086b7d1..5a78927 100644 --- a/README.md +++ b/README.md @@ -1,25 +1,19 @@ -# Linux ❘ Drawing ❘ Rendering and presentation +# Linux ❘ Drawing ❘ Frames in flight Summary [here](https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/tree/linux-summary). # Adjustments -- Created `NO_TIMEOUT` constant to represent disabled timeouts and avoid magic numbers. -- Used the enhanced `Vulkan-Hpp` functions to automatically handle error results. - You can see that our version of `Application::createSyncObjects()` is way simpler than the original. - This works for us because we didn't set defined the `VULKAN_HPP_DISABLE_ENHANCED_MODE` macro. - If we did this, we would have to check the results by ourselves. - # Navigation [🌐 Original tutorial]( -https://docs.vulkan.org/tutorial/latest/03_Drawing_a_triangle/03_Drawing/02_Rendering_and_presentation.html) +https://docs.vulkan.org/tutorial/latest/03_Drawing_a_triangle/03_Drawing/03_Frames_in_flight.html) -[⏮ Drawing a triangle / Drawing / Command buffers]( -https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/tree/linux/02-drawing-triangle/04-drawing/02-command-buffers) +[⏮ Drawing a triangle / Drawing / Rendering and presentation]( +https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/tree/linux/02-drawing-triangle/04-drawing/03-rendering-and-presentation) -[⏭ Drawing a triangle / Drawing / Frames in flight]( -https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/tree/linux/02-drawing-triangle/04-drawing/04-frames-in-flight) +[⏭ Drawing a triangle / Swap chain recreation]( +https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/tree/linux/02-drawing-triangle/05-rendering-and-presentation) [🔄 Diff from previous step]( -https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/compare/linux/02-drawing-triangle/04-drawing/02-command-buffers...linux/02-drawing-triangle/04-drawing/03-rendering-and-presentation) +https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/compare/linux/02-drawing-triangle/04-drawing/03-rendering-and-presentation...linux/02-drawing-triangle/04-drawing/04-frames-in-flight) From 32404da3025c53139ac6366656da9643d395141d Mon Sep 17 00:00:00 2001 From: Michael Pacheco Date: Tue, 21 Nov 2023 17:33:24 -0300 Subject: [PATCH 067/129] feat(linux): use in-flight frames --- .husky/pre-commit | 17 ++++++++------ README.md | 2 ++ src/Application.cpp | 57 ++++++++++++++++++++++++++++++--------------- src/Application.hpp | 11 +++++---- src/Config.hpp | 2 ++ 5 files changed, 58 insertions(+), 31 deletions(-) diff --git a/.husky/pre-commit b/.husky/pre-commit index f85f553..12d6ecf 100755 --- a/.husky/pre-commit +++ b/.husky/pre-commit @@ -2,15 +2,18 @@ . "$(dirname -- "$0")/_/husky.sh" -FILES=$( - git diff --cached --name-only --diff-filter=ACMR | - grep -E '(src|include)/.+\.(cpp|h|cxx|hxx|hpp|c|inl)$' | - true -) +FILES=$(git diff --cached --name-only --diff-filter=ACMR) -[ -z "$FILES" ] && exit 0 +if [ -z "$FILES" ]; then + exit 0 +fi + +SRC_FILES=$(echo "$FILES" | grep -E '(src|include)/.+\.(hpp|cpp|h|cxx|hxx|c|inl)$' || true) + +if ! [ -z "$SRC_FILES" ]; then + echo "$SRC_FILES" | xargs clang-format -i +fi -echo "$FILES" | xargs clang-format -i echo "$FILES" | xargs git add exit 0 diff --git a/README.md b/README.md index 5a78927..91bb533 100644 --- a/README.md +++ b/README.md @@ -4,6 +4,8 @@ Summary [here](https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/tree/lin # Adjustments +- Fixed a bug in the pre-commit hook which was failing in some scenarios and preventing finish commits. + # Navigation [🌐 Original tutorial]( diff --git a/src/Application.cpp b/src/Application.cpp index 1028d48..b17db67 100644 --- a/src/Application.cpp +++ b/src/Application.cpp @@ -36,7 +36,7 @@ void Application::initVulkan() { createGraphicsPipeline(); createFrameBuffers(); createCommandPool(); - createCommandBuffer(); + createCommandBuffers(); createSyncObjects(); } @@ -44,38 +44,45 @@ void Application::mainLoop() { while (!m_window.shouldClose()) { m_window.pollEvents(); drawFrame(); + m_currentFrame = (m_currentFrame + 1) % Config::MAX_FRAMES_IN_FLIGHT; } m_device.waitIdle(); } void Application::drawFrame() { - (void)m_device.waitForFences(m_inFlightFence, vk::True, NO_TIMEOUT); - m_device.resetFences(m_inFlightFence); + vk::Fence& inFlightFence = m_inFlightFences[m_currentFrame]; + vk::CommandBuffer& commandBuffer = m_commandBuffers[m_currentFrame]; + vk::Semaphore& imageAvailableSemaphore = + m_imageAvailableSemaphores[m_currentFrame]; + vk::Semaphore& renderFinishedSemaphore = + m_renderFinishedSemaphores[m_currentFrame]; + (void)m_device.waitForFences(inFlightFence, vk::True, NO_TIMEOUT); + m_device.resetFences(inFlightFence); vk::ResultValue acquireResult = m_device.acquireNextImageKHR( - m_swapChain, NO_TIMEOUT, m_imageAvailableSemaphore + m_swapChain, NO_TIMEOUT, imageAvailableSemaphore ); uint32_t imageIndex = acquireResult.value; - m_commandBuffer.reset(); - recordCommandBuffer(m_commandBuffer, imageIndex); + commandBuffer.reset(); + recordCommandBuffer(commandBuffer, imageIndex); const vk::PipelineStageFlags waitStages{ vk::PipelineStageFlagBits::eColorAttachmentOutput}; - const auto signalSemaphores = {m_renderFinishedSemaphore}; + const auto signalSemaphores = {renderFinishedSemaphore}; const auto& submitInfo = vk::SubmitInfo() - .setWaitSemaphores(m_imageAvailableSemaphore) + .setWaitSemaphores(imageAvailableSemaphore) .setWaitDstStageMask(waitStages) - .setCommandBuffers(m_commandBuffer) + .setCommandBuffers(commandBuffer) .setSignalSemaphores(signalSemaphores); - m_graphicsQueue.submit(submitInfo, m_inFlightFence); + m_graphicsQueue.submit(submitInfo, inFlightFence); const auto& presentInfo = vk::PresentInfoKHR() @@ -87,9 +94,11 @@ void Application::drawFrame() { } void Application::cleanup() { - m_device.destroy(m_inFlightFence); - m_device.destroy(m_renderFinishedSemaphore); - m_device.destroy(m_imageAvailableSemaphore); + for (size_t i = 0; i < Config::MAX_FRAMES_IN_FLIGHT; ++i) { + m_device.destroy(m_inFlightFences[i]); + m_device.destroy(m_renderFinishedSemaphores[i]); + m_device.destroy(m_imageAvailableSemaphores[i]); + } m_device.destroy(m_commandPool); for (const auto& frameBuffer : m_swapChainFrameBuffers) { m_device.destroy(frameBuffer); @@ -437,20 +446,30 @@ void Application::createCommandPool() { m_commandPool = m_device.createCommandPool(poolInfo); } -void Application::createCommandBuffer() { +void Application::createCommandBuffers() { + m_commandBuffers.resize(Config::MAX_FRAMES_IN_FLIGHT); + const auto& allocInfo = vk::CommandBufferAllocateInfo() .setCommandPool(m_commandPool) .setLevel(vk::CommandBufferLevel::ePrimary) - .setCommandBufferCount(1); + .setCommandBufferCount(Config::MAX_FRAMES_IN_FLIGHT); - m_commandBuffer = m_device.allocateCommandBuffers(allocInfo).front(); + m_commandBuffers = m_device.allocateCommandBuffers(allocInfo); } void Application::createSyncObjects() { - m_imageAvailableSemaphore = m_device.createSemaphore({}); - m_renderFinishedSemaphore = m_device.createSemaphore({}); - m_inFlightFence = m_device.createFence({vk::FenceCreateFlagBits::eSignaled}); + m_imageAvailableSemaphores.resize(Config::MAX_FRAMES_IN_FLIGHT); + m_renderFinishedSemaphores.resize(Config::MAX_FRAMES_IN_FLIGHT); + m_inFlightFences.resize(Config::MAX_FRAMES_IN_FLIGHT); + + vk::FenceCreateFlagBits fenceFlags = vk::FenceCreateFlagBits::eSignaled; + + for (size_t i = 0; i < Config::MAX_FRAMES_IN_FLIGHT; ++i) { + m_imageAvailableSemaphores[i] = m_device.createSemaphore({}); + m_renderFinishedSemaphores[i] = m_device.createSemaphore({}); + m_inFlightFences[i] = m_device.createFence({fenceFlags}); + } } bool Application::isDeviceSuitable(const vk::PhysicalDevice& device) const { diff --git a/src/Application.hpp b/src/Application.hpp index 00076ae..6c7f0f8 100644 --- a/src/Application.hpp +++ b/src/Application.hpp @@ -41,10 +41,11 @@ class Application { vk::Pipeline m_graphicsPipeline; std::vector m_swapChainFrameBuffers; vk::CommandPool m_commandPool; - vk::CommandBuffer m_commandBuffer; // Destroyed by command pool - vk::Semaphore m_imageAvailableSemaphore; - vk::Semaphore m_renderFinishedSemaphore; - vk::Fence m_inFlightFence; + std::vector m_commandBuffers; // Destroyed by command pool + std::vector m_imageAvailableSemaphores; + std::vector m_renderFinishedSemaphores; + std::vector m_inFlightFences; + uint32_t m_currentFrame = 0; void initWindow(); void initVulkan(); @@ -63,7 +64,7 @@ class Application { void createGraphicsPipeline(); void createFrameBuffers(); void createCommandPool(); - void createCommandBuffer(); + void createCommandBuffers(); void createSyncObjects(); [[nodiscard]] bool isDeviceSuitable(const vk::PhysicalDevice& device) const; diff --git a/src/Config.hpp b/src/Config.hpp index cdf332c..3cba292 100644 --- a/src/Config.hpp +++ b/src/Config.hpp @@ -27,4 +27,6 @@ struct Config { vk::DebugUtilsMessageTypeFlagBitsEXT::eValidation; static const std::vector DEVICE_EXTENSIONS; + + static constexpr uint8_t MAX_FRAMES_IN_FLIGHT = 2; }; From e127aea2debaf8c71fd445a88f208adc23ffbb38 Mon Sep 17 00:00:00 2001 From: Michael Pacheco Date: Tue, 21 Nov 2023 18:07:35 -0300 Subject: [PATCH 068/129] docs(linux): add frames in flight navigation link to linux summary branch --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 90bffd8..e00d43d 100644 --- a/README.md +++ b/README.md @@ -34,3 +34,4 @@ and current step. * [Frame buffers](https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/tree/linux/02-drawing-triangle/04-drawing/01-frame-buffers) * [Command buffers](https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/tree/linux/02-drawing-triangle/04-drawing/02-command-buffers) * [Rendering and presentation](https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/tree/linux/02-drawing-triangle/04-drawing/03-rendering-and-presentation) + * [Frames in flight](https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/tree/linux/02-drawing-triangle/04-drawing/04-frames-in-flight) From 583971a6a3c073d25a4742d34a0dddeaff0fd317 Mon Sep 17 00:00:00 2001 From: Michael Pacheco Date: Tue, 21 Nov 2023 18:38:47 -0300 Subject: [PATCH 069/129] docs(linux): update frames in flight next step link --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 91bb533..1e602e9 100644 --- a/README.md +++ b/README.md @@ -15,7 +15,7 @@ https://docs.vulkan.org/tutorial/latest/03_Drawing_a_triangle/03_Drawing/03_Fram https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/tree/linux/02-drawing-triangle/04-drawing/03-rendering-and-presentation) [⏭ Drawing a triangle / Swap chain recreation]( -https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/tree/linux/02-drawing-triangle/05-rendering-and-presentation) +https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/tree/linux/02-drawing-triangle/05-swapchain-recreation) [🔄 Diff from previous step]( https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/compare/linux/02-drawing-triangle/04-drawing/03-rendering-and-presentation...linux/02-drawing-triangle/04-drawing/04-frames-in-flight) From 6df9f55ab4346b9347ecbab2570be889f0d8eee2 Mon Sep 17 00:00:00 2001 From: Michael Pacheco Date: Tue, 21 Nov 2023 21:09:34 -0300 Subject: [PATCH 070/129] feat(linux): handle window resize --- README.md | 15 ++++---- src/Application.cpp | 84 +++++++++++++++++++++++++++++++++++---------- src/Application.hpp | 3 ++ src/Window.cpp | 25 ++++++++++++-- src/Window.hpp | 15 +++++++- 5 files changed, 113 insertions(+), 29 deletions(-) diff --git a/README.md b/README.md index 1e602e9..415a3c6 100644 --- a/README.md +++ b/README.md @@ -1,21 +1,20 @@ -# Linux ❘ Drawing ❘ Frames in flight +# Linux ❘ Drawing ❘ Swap chain recreation Summary [here](https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/tree/linux-summary). # Adjustments -- Fixed a bug in the pre-commit hook which was failing in some scenarios and preventing finish commits. # Navigation [🌐 Original tutorial]( -https://docs.vulkan.org/tutorial/latest/03_Drawing_a_triangle/03_Drawing/03_Frames_in_flight.html) +https://docs.vulkan.org/tutorial/latest/03_Drawing_a_triangle/04_Swap_chain_recreation.html) -[⏮ Drawing a triangle / Drawing / Rendering and presentation]( -https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/tree/linux/02-drawing-triangle/04-drawing/03-rendering-and-presentation) +[⏮ Drawing a triangle / Drawing / Frames in flight]( +https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/tree/linux/02-drawing-triangle/04-drawing/04-frames-in-flight) -[⏭ Drawing a triangle / Swap chain recreation]( -https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/tree/linux/02-drawing-triangle/05-swapchain-recreation) +[⏭ Vertex buffers / Vertex input description]( +https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/tree/linux/03-vertex-buffers/01-vertex-input-description) [🔄 Diff from previous step]( -https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/compare/linux/02-drawing-triangle/04-drawing/03-rendering-and-presentation...linux/02-drawing-triangle/04-drawing/04-frames-in-flight) +https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/compare/linux/02-drawing-triangle/04-drawing/04-frames-in-flight...linux/02-drawing-triangle/05-swapchain-recreation) diff --git a/src/Application.cpp b/src/Application.cpp index b17db67..8241f44 100644 --- a/src/Application.cpp +++ b/src/Application.cpp @@ -1,5 +1,6 @@ #include "Application.hpp" +#include #include #include @@ -19,8 +20,15 @@ void Application::run() { } void Application::initWindow() { + const auto& resizeCallback = [this](int width, int height) { + m_framebufferResized = true; + }; + m_window.create( - Config::WINDOW_WIDTH, Config::WINDOW_HEIGHT, Config::WINDOW_TITLE + Config::WINDOW_WIDTH, + Config::WINDOW_HEIGHT, + Config::WINDOW_TITLE, + resizeCallback ); } @@ -43,8 +51,10 @@ void Application::initVulkan() { void Application::mainLoop() { while (!m_window.shouldClose()) { m_window.pollEvents(); - drawFrame(); - m_currentFrame = (m_currentFrame + 1) % Config::MAX_FRAMES_IN_FLIGHT; + + if (!m_window.isMinimized()) { + drawFrame(); + } } m_device.waitIdle(); @@ -59,13 +69,24 @@ void Application::drawFrame() { m_renderFinishedSemaphores[m_currentFrame]; (void)m_device.waitForFences(inFlightFence, vk::True, NO_TIMEOUT); - m_device.resetFences(inFlightFence); - vk::ResultValue acquireResult = m_device.acquireNextImageKHR( + uint32_t imageIndex; + vk::Result result; + + std::tie(result, imageIndex) = m_device.acquireNextImageKHR( m_swapChain, NO_TIMEOUT, imageAvailableSemaphore ); - uint32_t imageIndex = acquireResult.value; + if (result == vk::Result::eErrorOutOfDateKHR) { + recreateSwapChain(); + return; + } + + if (result != vk::Result::eSuccess && result != vk::Result::eSuboptimalKHR) { + vk::resultCheck(result, "Failed to acquire swap chain image"); + } + + m_device.resetFences(inFlightFence); commandBuffer.reset(); recordCommandBuffer(commandBuffer, imageIndex); @@ -90,26 +111,31 @@ void Application::drawFrame() { .setSwapchains(m_swapChain) .setImageIndices(imageIndex); - (void)m_presentQueue.presentKHR(presentInfo); + result = m_presentQueue.presentKHR(presentInfo); + + if (result == vk::Result::eErrorOutOfDateKHR || + result == vk::Result::eSuboptimalKHR || m_framebufferResized) { + m_framebufferResized = false; + recreateSwapChain(); + } + + vk::resultCheck(result, "Failed to present swap chain image"); + + m_currentFrame = (m_currentFrame + 1) % Config::MAX_FRAMES_IN_FLIGHT; } void Application::cleanup() { + cleanupSwapChain(); + for (size_t i = 0; i < Config::MAX_FRAMES_IN_FLIGHT; ++i) { m_device.destroy(m_inFlightFences[i]); m_device.destroy(m_renderFinishedSemaphores[i]); m_device.destroy(m_imageAvailableSemaphores[i]); } m_device.destroy(m_commandPool); - for (const auto& frameBuffer : m_swapChainFrameBuffers) { - m_device.destroy(frameBuffer); - } m_device.destroy(m_graphicsPipeline); m_device.destroy(m_pipelineLayout); m_device.destroy(m_renderPass); - for (const auto& imageView : m_swapChainImageViews) { - m_device.destroy(imageView); - } - m_device.destroy(m_swapChain); m_device.destroy(); m_instance.destroy(m_surface); m_instance.destroy(m_debugMessenger); @@ -250,13 +276,35 @@ void Application::createSwapChain() { m_swapChainExtent = extent; } +void Application::recreateSwapChain() { + m_device.waitIdle(); + + cleanupSwapChain(); + + createSwapChain(); + createImageViews(); + createFrameBuffers(); +} + +void Application::cleanupSwapChain() { + for (const auto& frameBuffer : m_swapChainFrameBuffers) { + m_device.destroy(frameBuffer); + } + + for (const auto& imageView : m_swapChainImageViews) { + m_device.destroy(imageView); + } + + m_device.destroy(m_swapChain); +} + void Application::createImageViews() { - m_swapChainImageViews.reserve(m_swapChainImages.size()); + m_swapChainImageViews.resize(m_swapChainImages.size()); - for (const auto& m_swapChainImage : m_swapChainImages) { + for (int i = 0; i < m_swapChainImages.size(); ++i) { const auto& createInfo = vk::ImageViewCreateInfo() - .setImage(m_swapChainImage) + .setImage(m_swapChainImages[i]) .setViewType(vk::ImageViewType::e2D) .setFormat(m_swapChainImageFormat) .setSubresourceRange( @@ -268,7 +316,7 @@ void Application::createImageViews() { .setLayerCount(1) ); - m_swapChainImageViews.emplace_back(m_device.createImageView(createInfo)); + m_swapChainImageViews[i] = m_device.createImageView(createInfo); } } diff --git a/src/Application.hpp b/src/Application.hpp index 6c7f0f8..ee85eb6 100644 --- a/src/Application.hpp +++ b/src/Application.hpp @@ -46,6 +46,7 @@ class Application { std::vector m_renderFinishedSemaphores; std::vector m_inFlightFences; uint32_t m_currentFrame = 0; + bool m_framebufferResized = false; void initWindow(); void initVulkan(); @@ -59,6 +60,8 @@ class Application { void pickPhysicalDevice(); void createLogicalDevice(); void createSwapChain(); + void recreateSwapChain(); + void cleanupSwapChain(); void createImageViews(); void createRenderPass(); void createGraphicsPipeline(); diff --git a/src/Window.cpp b/src/Window.cpp index 93f1efe..64f0324 100644 --- a/src/Window.cpp +++ b/src/Window.cpp @@ -8,16 +8,24 @@ Window::~Window() { glfwTerminate(); } -void Window::create(uint16_t width, uint16_t height, const std::string& title) { +void Window::create( + uint16_t width, + uint16_t height, + const std::string& title, + const ResizeCallback& resizeCallback +) { if (m_window) { return; } glfwInit(); glfwWindowHint(GLFW_CLIENT_API, GLFW_NO_API); - glfwWindowHint(GLFW_RESIZABLE, GLFW_FALSE); m_window = glfwCreateWindow(width, height, title.c_str(), nullptr, nullptr); + m_resizeCallback = resizeCallback; + + glfwSetWindowUserPointer(m_window, this); + glfwSetFramebufferSizeCallback(m_window, onFramebufferResize); } bool Window::shouldClose() const { return glfwWindowShouldClose(m_window); } @@ -46,3 +54,16 @@ vk::Extent2D Window::getExtent() const { return actualExtent; } + +bool Window::isMinimized() const { + return glfwGetWindowAttrib(m_window, GLFW_ICONIFIED) == GLFW_TRUE; +} + +void Window::onFramebufferResize(GLFWwindow* window, int width, int height) { + const auto instance = + reinterpret_cast(glfwGetWindowUserPointer(window)); + + if (instance->m_resizeCallback) { + instance->m_resizeCallback(width, height); + } +} diff --git a/src/Window.hpp b/src/Window.hpp index 040ec68..0b540e0 100644 --- a/src/Window.hpp +++ b/src/Window.hpp @@ -3,15 +3,23 @@ #define GLFW_INCLUDE_VULKAN #include +#include #include #include class Window { public: + typedef std::function ResizeCallback; + Window() = default; ~Window(); - void create(uint16_t width, uint16_t height, const std::string& title); + void create( + uint16_t width, + uint16_t height, + const std::string& title, + const ResizeCallback& resizeCallback = {} + ); [[nodiscard]] bool shouldClose() const; @@ -22,6 +30,11 @@ class Window { [[nodiscard]] vk::Extent2D getExtent() const; + [[nodiscard]] bool isMinimized() const; + private: GLFWwindow* m_window = nullptr; + ResizeCallback m_resizeCallback{}; + + static void onFramebufferResize(GLFWwindow* window, int width, int height); }; From c507cad9da8d33f99181822afc35773a9b4dc9bf Mon Sep 17 00:00:00 2001 From: Michael Pacheco Date: Tue, 21 Nov 2023 21:38:45 -0300 Subject: [PATCH 071/129] docs(linux): add adjustments notes to swap chain recreation branch --- README.md | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/README.md b/README.md index 415a3c6..a14b138 100644 --- a/README.md +++ b/README.md @@ -4,6 +4,17 @@ Summary [here](https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/tree/lin # Adjustments +We did a couple changes in this step: + +- Moved all new GLFW calls to our `Window` class and passed a lambda function to `Window::create()` as a callback + handler for resizes. +- Used `glfwGetWindowAttrib(m_window, GLFW_ICONIFIED) == GLFW_TRUE` instead of calling `glfwGetFramebufferSize()` to + check if the window is minimized. +- Skip the `renderFrame()` function call instead of "pausing" the game loop. + I did this because you probably will extend the code in the future to do other things in the main loop that should + happen even if the window is minimized. +- Again, we used `vk::resultCheck(res, errorMessage)` to handle errors instead of manually checking the error enum and + throwing exceptions. # Navigation From 71b7eac919a5f4d6c08c01a2f34c94c3de072359 Mon Sep 17 00:00:00 2001 From: Michael Pacheco Date: Tue, 21 Nov 2023 21:44:23 -0300 Subject: [PATCH 072/129] docs(linux): add swap chain recreation navigation link to linux summary branch --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index e00d43d..772cf35 100644 --- a/README.md +++ b/README.md @@ -35,3 +35,4 @@ and current step. * [Command buffers](https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/tree/linux/02-drawing-triangle/04-drawing/02-command-buffers) * [Rendering and presentation](https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/tree/linux/02-drawing-triangle/04-drawing/03-rendering-and-presentation) * [Frames in flight](https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/tree/linux/02-drawing-triangle/04-drawing/04-frames-in-flight) + * [Swap chain recreation](https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/tree/linux/02-drawing-triangle/05-swapchain-recreation) From 49d752f31d6561ed6091be74a371e46fdee6f0e6 Mon Sep 17 00:00:00 2001 From: Michael Pacheco Date: Wed, 22 Nov 2023 13:37:07 -0300 Subject: [PATCH 073/129] fix(linux): remove uses of temporary bound to function calls --- README.md | 34 ++++++++++++------------- src/Application.cpp | 62 ++++++++++++++++++++++----------------------- src/QueueFamily.cpp | 4 +-- 3 files changed, 49 insertions(+), 51 deletions(-) diff --git a/README.md b/README.md index a14b138..711b684 100644 --- a/README.md +++ b/README.md @@ -1,31 +1,29 @@ -# Linux ❘ Drawing ❘ Swap chain recreation +# Linux ❘ Vertex buffers ❘ Vertex input description Summary [here](https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/tree/linux-summary). # Adjustments -We did a couple changes in this step: - -- Moved all new GLFW calls to our `Window` class and passed a lambda function to `Window::create()` as a callback - handler for resizes. -- Used `glfwGetWindowAttrib(m_window, GLFW_ICONIFIED) == GLFW_TRUE` instead of calling `glfwGetFramebufferSize()` to - check if the window is minimized. -- Skip the `renderFrame()` function call instead of "pausing" the game loop. - I did this because you probably will extend the code in the future to do other things in the main loop that should - happen even if the window is minimized. -- Again, we used `vk::resultCheck(res, errorMessage)` to handle errors instead of manually checking the error enum and - throwing exceptions. +> ![CAUTION] +> All usages of temporary bound to function calls (`const auto& = func()`) were removed. +> Since I was compiling the code with `CLang 17`, everything was working just fine. +> When I tried to compile with `GCC 11.4.0` the application crashed with segmentation faults. +> Debugging the code, I realized that the reference lifetime was ending right before the assignment and the reference +> became invalid, so I removed all of them and used the copy assignments to prevent this error. +> See +> * https://github.com/KhronosGroup/Vulkan-Hpp/issues/1736 +> * https://stackoverflow.com/questions/17362673/temporary-lifetime-extension # Navigation [🌐 Original tutorial]( -https://docs.vulkan.org/tutorial/latest/03_Drawing_a_triangle/04_Swap_chain_recreation.html) +https://docs.vulkan.org/tutorial/latest/04_Vertex_buffers/00_Vertex_input_description.html) -[⏮ Drawing a triangle / Drawing / Frames in flight]( -https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/tree/linux/02-drawing-triangle/04-drawing/04-frames-in-flight) +[⏮ Drawing a triangle / Swap chain recreation]( +https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/tree/linux/02-drawing-triangle/05-swapchain-recreation) -[⏭ Vertex buffers / Vertex input description]( -https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/tree/linux/03-vertex-buffers/01-vertex-input-description) +[⏭ Vertex buffers / Vertex buffer creation]( +https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/tree/linux/03-vertex-buffers/02-vertex-buffer-creation) [🔄 Diff from previous step]( -https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/compare/linux/02-drawing-triangle/04-drawing/04-frames-in-flight...linux/02-drawing-triangle/05-swapchain-recreation) +https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/compare/linux/02-drawing-triangle/05-swapchain-recreation...linux/03-vertex-buffers/01-vertex-input-description) diff --git a/src/Application.cpp b/src/Application.cpp index 8241f44..3f860f3 100644 --- a/src/Application.cpp +++ b/src/Application.cpp @@ -20,7 +20,7 @@ void Application::run() { } void Application::initWindow() { - const auto& resizeCallback = [this](int width, int height) { + const auto resizeCallback = [this](int width, int height) { m_framebufferResized = true; }; @@ -96,7 +96,7 @@ void Application::drawFrame() { const auto signalSemaphores = {renderFinishedSemaphore}; - const auto& submitInfo = + const auto submitInfo = vk::SubmitInfo() .setWaitSemaphores(imageAvailableSemaphore) .setWaitDstStageMask(waitStages) @@ -105,7 +105,7 @@ void Application::drawFrame() { m_graphicsQueue.submit(submitInfo, inFlightFence); - const auto& presentInfo = + const auto presentInfo = vk::PresentInfoKHR() .setWaitSemaphores(signalSemaphores) .setSwapchains(m_swapChain) @@ -215,11 +215,11 @@ void Application::pickPhysicalDevice() { } void Application::createLogicalDevice() { - const auto& indices = QueueFamily::findIndices(m_physicalDevice, m_surface); - const auto& queueCreateInfos = indices.getQueueCreateInfos(); + const auto indices = QueueFamily::findIndices(m_physicalDevice, m_surface); + const auto queueCreateInfos = indices.getQueueCreateInfos(); vk::PhysicalDeviceFeatures deviceFeatures; - const auto& deviceCreateInfo = + const auto deviceCreateInfo = vk::DeviceCreateInfo() .setQueueCreateInfos(queueCreateInfos) .setPEnabledFeatures(&deviceFeatures) @@ -258,7 +258,7 @@ void Application::createSwapChain() { .setPresentMode(presentMode) .setClipped(vk::True); - const auto& indices = QueueFamily::findIndices(m_physicalDevice, m_surface); + const auto indices = QueueFamily::findIndices(m_physicalDevice, m_surface); uint32_t queueFamilyIndices[] = { indices.graphicsFamily.value(), indices.presentFamily.value()}; @@ -302,7 +302,7 @@ void Application::createImageViews() { m_swapChainImageViews.resize(m_swapChainImages.size()); for (int i = 0; i < m_swapChainImages.size(); ++i) { - const auto& createInfo = + const auto createInfo = vk::ImageViewCreateInfo() .setImage(m_swapChainImages[i]) .setViewType(vk::ImageViewType::e2D) @@ -321,7 +321,7 @@ void Application::createImageViews() { } void Application::createRenderPass() { - const auto& colorAttachment = + const auto colorAttachment = vk::AttachmentDescription() .setFormat(m_swapChainImageFormat) .setSamples(vk::SampleCountFlagBits::e1) @@ -332,17 +332,17 @@ void Application::createRenderPass() { .setInitialLayout(vk::ImageLayout::eUndefined) .setFinalLayout(vk::ImageLayout::ePresentSrcKHR); - const auto& colorAttachmentRef = + const auto colorAttachmentRef = vk::AttachmentReference().setAttachment(0).setLayout( vk::ImageLayout::eColorAttachmentOptimal ); - const auto& subPass = + const auto subPass = vk::SubpassDescription() .setPipelineBindPoint(vk::PipelineBindPoint::eGraphics) .setColorAttachments(colorAttachmentRef); - const auto& dependency = + const auto dependency = vk::SubpassDependency() .setSrcSubpass(vk::SubpassExternal) .setDstSubpass(0) @@ -351,7 +351,7 @@ void Application::createRenderPass() { .setDstStageMask(vk::PipelineStageFlagBits::eColorAttachmentOutput) .setDstAccessMask(vk::AccessFlagBits::eColorAttachmentWrite); - const auto& renderPassInfo = + const auto renderPassInfo = vk::RenderPassCreateInfo() .setAttachments(colorAttachment) .setSubpasses(subPass) @@ -367,13 +367,13 @@ void Application::createGraphicsPipeline() { vk::ShaderModule vertShaderModule = createShaderModule(vertShaderCode); vk::ShaderModule fragShaderModule = createShaderModule(fragShaderCode); - const auto& vertShaderStageInfo = + const auto vertShaderStageInfo = vk::PipelineShaderStageCreateInfo() .setStage(vk::ShaderStageFlagBits::eVertex) .setModule(vertShaderModule) .setPName("main"); - const auto& fragShaderStageInfo = + const auto fragShaderStageInfo = vk::PipelineShaderStageCreateInfo() .setStage(vk::ShaderStageFlagBits::eFragment) .setModule(fragShaderModule) @@ -382,22 +382,22 @@ void Application::createGraphicsPipeline() { vk::PipelineShaderStageCreateInfo shaderStages[]{ vertShaderStageInfo, fragShaderStageInfo}; - const auto& vertexInputInfo = + const auto vertexInputInfo = vk::PipelineVertexInputStateCreateInfo() .setVertexBindingDescriptionCount(0) .setVertexAttributeDescriptionCount(0); - const auto& inputAssembly = + const auto inputAssembly = vk::PipelineInputAssemblyStateCreateInfo() .setTopology(vk::PrimitiveTopology::eTriangleList) .setPrimitiveRestartEnable(vk::False); - const auto& viewportState = + const auto viewportState = vk::PipelineViewportStateCreateInfo().setViewportCount(1).setScissorCount( 1 ); - const auto& rasterizer = + const auto rasterizer = vk::PipelineRasterizationStateCreateInfo() .setDepthClampEnable(vk::False) .setRasterizerDiscardEnable(vk::False) @@ -407,12 +407,12 @@ void Application::createGraphicsPipeline() { .setFrontFace(vk::FrontFace::eClockwise) .setDepthBiasEnable(vk::False); - const auto& multisampling = + const auto multisampling = vk::PipelineMultisampleStateCreateInfo() .setSampleShadingEnable(vk::False) .setRasterizationSamples(vk::SampleCountFlagBits::e1); - const auto& colorBlendAttachment = + const auto colorBlendAttachment = vk::PipelineColorBlendAttachmentState() .setColorWriteMask( vk::ColorComponentFlagBits::eR | vk::ColorComponentFlagBits::eG | @@ -420,7 +420,7 @@ void Application::createGraphicsPipeline() { ) .setBlendEnable(vk::False); - const auto& colorBlending = + const auto colorBlending = vk::PipelineColorBlendStateCreateInfo() .setLogicOpEnable(vk::False) .setLogicOp(vk::LogicOp::eCopy) @@ -430,17 +430,17 @@ void Application::createGraphicsPipeline() { std::vector dynamicStates = { vk::DynamicState::eViewport, vk::DynamicState::eScissor}; - const auto& dynamicState = + const auto dynamicState = vk::PipelineDynamicStateCreateInfo().setDynamicStates(dynamicStates); - const auto& pipelineLayoutInfo = + const auto pipelineLayoutInfo = vk::PipelineLayoutCreateInfo() .setSetLayoutCount(0) .setPushConstantRangeCount(0); m_pipelineLayout = m_device.createPipelineLayout(pipelineLayoutInfo); - const auto& pipelineInfo = + const auto pipelineInfo = vk::GraphicsPipelineCreateInfo() .setStages(shaderStages) .setPVertexInputState(&vertexInputInfo) @@ -470,7 +470,7 @@ void Application::createFrameBuffers() { m_swapChainFrameBuffers.resize(m_swapChainImageViews.size()); for (size_t i = 0; i < m_swapChainImageViews.size(); ++i) { - const auto& framebufferInfo = + const auto framebufferInfo = vk::FramebufferCreateInfo() .setRenderPass(m_renderPass) .setAttachments(m_swapChainImageViews[i]) @@ -486,7 +486,7 @@ void Application::createCommandPool() { const QueueFamily::Indices& queueFamilyIndices = QueueFamily::findIndices(m_physicalDevice, m_surface); - const auto& poolInfo = + const auto poolInfo = vk::CommandPoolCreateInfo() .setFlags(vk::CommandPoolCreateFlagBits::eResetCommandBuffer) .setQueueFamilyIndex(queueFamilyIndices.graphicsFamily.value()); @@ -497,7 +497,7 @@ void Application::createCommandPool() { void Application::createCommandBuffers() { m_commandBuffers.resize(Config::MAX_FRAMES_IN_FLIGHT); - const auto& allocInfo = + const auto allocInfo = vk::CommandBufferAllocateInfo() .setCommandPool(m_commandPool) .setLevel(vk::CommandBufferLevel::ePrimary) @@ -521,7 +521,7 @@ void Application::createSyncObjects() { } bool Application::isDeviceSuitable(const vk::PhysicalDevice& device) const { - const auto& indices = QueueFamily::findIndices(device, m_surface); + const auto indices = QueueFamily::findIndices(device, m_surface); bool extensionsSupported = checkDeviceExtensionSupport(device); bool suitableSwapChain = false; @@ -636,7 +636,7 @@ void Application::recordCommandBuffer( vk::ClearValue clearColor{{0.0f, 0.0f, 0.0f, 1.0f}}; vk::Offset2D zeroOffset{0, 0}; - const auto& renderPassInfo = + const auto renderPassInfo = vk::RenderPassBeginInfo() .setRenderPass(m_renderPass) .setFramebuffer(m_swapChainFrameBuffers[imageIndex]) @@ -650,7 +650,7 @@ void Application::recordCommandBuffer( vk::PipelineBindPoint::eGraphics, m_graphicsPipeline ); - const auto& viewport = + const auto viewport = vk::Viewport() .setX(0.0f) .setY(0.0f) diff --git a/src/QueueFamily.cpp b/src/QueueFamily.cpp index 374763b..2c9786e 100644 --- a/src/QueueFamily.cpp +++ b/src/QueueFamily.cpp @@ -16,7 +16,7 @@ Indices::QueueCreateInfos QueueFamily::Indices::getQueueCreateInfos() const { QueueCreateInfos queueCreateInfos; for (uint32_t queueFamilyIndex : uniqueFamilies) { - const auto& queueCreateInfo = + const auto queueCreateInfo = vk::DeviceQueueCreateInfo() .setQueueFamilyIndex(queueFamilyIndex) .setQueueCount(1) @@ -33,7 +33,7 @@ Indices QueueFamily::findIndices( ) { Indices indices; - const auto& families = device.getQueueFamilyProperties(); + const auto families = device.getQueueFamilyProperties(); for (uint32_t familyIndex = 0; familyIndex < families.size(); ++familyIndex) { if (families[familyIndex].queueFlags & vk::QueueFlagBits::eGraphics) { From 770c37f3f32b0df234bdc65a8e867b7a31f9d3bb Mon Sep 17 00:00:00 2001 From: Michael Pacheco Date: Wed, 22 Nov 2023 13:37:53 -0300 Subject: [PATCH 074/129] fix(linux): fix compiler warnings --- CMakeLists.txt | 5 +++++ README.md | 5 ++++- src/Application.cpp | 9 +++++---- 3 files changed, 14 insertions(+), 5 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 4a4fd3b..5d0bfb7 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -25,6 +25,11 @@ add_compile_definitions(GLFW_VULKAN_STATIC) add_executable(KhronosVulkanTutorialHpp ${SOURCES}) +target_compile_options(KhronosVulkanTutorialHpp PRIVATE + $<$:/W4 /WX> + $<$>:-Wall -Wextra -Wpedantic> +) + ############################ External dependencies ############################# include(FetchContent) diff --git a/README.md b/README.md index 711b684..615ec39 100644 --- a/README.md +++ b/README.md @@ -4,7 +4,7 @@ Summary [here](https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/tree/lin # Adjustments -> ![CAUTION] +> [!CAUTION] > All usages of temporary bound to function calls (`const auto& = func()`) were removed. > Since I was compiling the code with `CLang 17`, everything was working just fine. > When I tried to compile with `GCC 11.4.0` the application crashed with segmentation faults. @@ -14,6 +14,9 @@ Summary [here](https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/tree/lin > * https://github.com/KhronosGroup/Vulkan-Hpp/issues/1736 > * https://stackoverflow.com/questions/17362673/temporary-lifetime-extension +- Added extra warning & error compiler flags. +- Fixed compiler warnings. + # Navigation [🌐 Original tutorial]( diff --git a/src/Application.cpp b/src/Application.cpp index 3f860f3..6b7282e 100644 --- a/src/Application.cpp +++ b/src/Application.cpp @@ -20,9 +20,10 @@ void Application::run() { } void Application::initWindow() { - const auto resizeCallback = [this](int width, int height) { - m_framebufferResized = true; - }; + const auto resizeCallback = + [this]([[maybe_unused]] int width, [[maybe_unused]] int height) { + m_framebufferResized = true; + }; m_window.create( Config::WINDOW_WIDTH, @@ -301,7 +302,7 @@ void Application::cleanupSwapChain() { void Application::createImageViews() { m_swapChainImageViews.resize(m_swapChainImages.size()); - for (int i = 0; i < m_swapChainImages.size(); ++i) { + for (size_t i = 0; i < m_swapChainImages.size(); ++i) { const auto createInfo = vk::ImageViewCreateInfo() .setImage(m_swapChainImages[i]) From cb3b416dd36be27910e43f13237ca94844e0df89 Mon Sep 17 00:00:00 2001 From: Michael Pacheco Date: Wed, 22 Nov 2023 16:09:08 -0300 Subject: [PATCH 075/129] feat(linux): add vertex class --- CMakeLists.txt | 2 ++ README.md | 2 +- res/shaders/shader.vert | 19 +++++-------------- src/Application.cpp | 13 +++++++++++-- src/Vertex.cpp | 26 ++++++++++++++++++++++++++ src/Vertex.hpp | 15 +++++++++++++++ 6 files changed, 60 insertions(+), 17 deletions(-) create mode 100644 src/Vertex.cpp create mode 100644 src/Vertex.hpp diff --git a/CMakeLists.txt b/CMakeLists.txt index 5d0bfb7..f2a2408 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -19,6 +19,8 @@ set(SOURCES src/QueueFamily.hpp src/BinaryLoader.cpp src/BinaryLoader.hpp + src/Vertex.cpp + src/Vertex.hpp ) add_compile_definitions(GLFW_VULKAN_STATIC) diff --git a/README.md b/README.md index 615ec39..99762e0 100644 --- a/README.md +++ b/README.md @@ -5,7 +5,7 @@ Summary [here](https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/tree/lin # Adjustments > [!CAUTION] -> All usages of temporary bound to function calls (`const auto& = func()`) were removed. +> All usages of temporary bound to function calls (`const auto& var = func()`) were removed. > Since I was compiling the code with `CLang 17`, everything was working just fine. > When I tried to compile with `GCC 11.4.0` the application crashed with segmentation faults. > Debugging the code, I realized that the reference lifetime was ending right before the assignment and the reference diff --git a/res/shaders/shader.vert b/res/shaders/shader.vert index 6d69e42..9f27f54 100644 --- a/res/shaders/shader.vert +++ b/res/shaders/shader.vert @@ -1,20 +1,11 @@ #version 450 -layout (location = 0) out vec3 fragColor; +layout(location = 0) in vec2 inPosition; +layout(location = 1) in vec3 inColor; -vec2 positions[3] = vec2[]( - vec2(0.0, -0.5), - vec2(0.5, 0.5), - vec2(-0.5, 0.5) -); - -vec3 colors[3] = vec3[]( - vec3(1.0, 0.0, 0.0), - vec3(0.0, 1.0, 0.0), - vec3(0.0, 0.0, 1.0) -); +layout(location = 0) out vec3 fragColor; void main() { - gl_Position = vec4(positions[gl_VertexIndex], 0.0, 1.0); - fragColor = colors[gl_VertexIndex]; + gl_Position = vec4(inPosition, 0.0, 1.0); + fragColor = inColor; } diff --git a/src/Application.cpp b/src/Application.cpp index 6b7282e..0b422f0 100644 --- a/src/Application.cpp +++ b/src/Application.cpp @@ -9,9 +9,15 @@ #include "QueueFamily.hpp" #include "Utils.hpp" #include "ValidationLayer.hpp" +#include "Vertex.hpp" constexpr auto NO_TIMEOUT = std::numeric_limits::max(); +const std::vector VERTICES = { + {{0.0f, -0.5f}, {1.0f, 0.0f, 0.0f}}, + {{0.5f, 0.5f}, {0.0f, 1.0f, 0.0f}}, + {{-0.5f, 0.5f}, {0.0f, 0.0f, 1.0f}}}; + void Application::run() { initWindow(); initVulkan(); @@ -383,10 +389,13 @@ void Application::createGraphicsPipeline() { vk::PipelineShaderStageCreateInfo shaderStages[]{ vertShaderStageInfo, fragShaderStageInfo}; + auto bindingDescription = Vertex::getBindingDescription(); + auto attributeDescriptions = Vertex::getAttributeDescriptions(); + const auto vertexInputInfo = vk::PipelineVertexInputStateCreateInfo() - .setVertexBindingDescriptionCount(0) - .setVertexAttributeDescriptionCount(0); + .setVertexBindingDescriptions(bindingDescription) + .setVertexAttributeDescriptions(attributeDescriptions); const auto inputAssembly = vk::PipelineInputAssemblyStateCreateInfo() diff --git a/src/Vertex.cpp b/src/Vertex.cpp new file mode 100644 index 0000000..5a3f687 --- /dev/null +++ b/src/Vertex.cpp @@ -0,0 +1,26 @@ +#include "Vertex.hpp" + +vk::VertexInputBindingDescription Vertex::getBindingDescription() { + vk::VertexInputBindingDescription bindingDescription{}; + bindingDescription.binding = 0; + bindingDescription.stride = sizeof(Vertex); + bindingDescription.inputRate = vk::VertexInputRate::eVertex; + return bindingDescription; +} + +std::array +Vertex::getAttributeDescriptions() { + std::array attributeDescriptions{}; + + attributeDescriptions[0].binding = 0; + attributeDescriptions[0].location = 0; + attributeDescriptions[0].format = vk::Format::eR32G32Sfloat; + attributeDescriptions[0].offset = offsetof(Vertex, pos); + + attributeDescriptions[1].binding = 0; + attributeDescriptions[1].location = 1; + attributeDescriptions[1].format = vk::Format::eR32G32B32Sfloat; + attributeDescriptions[1].offset = offsetof(Vertex, color); + + return attributeDescriptions; +} diff --git a/src/Vertex.hpp b/src/Vertex.hpp new file mode 100644 index 0000000..05f3891 --- /dev/null +++ b/src/Vertex.hpp @@ -0,0 +1,15 @@ +#pragma once + +#include +#include +#include + +struct Vertex { + glm::vec2 pos; + glm::vec3 color; + + static vk::VertexInputBindingDescription getBindingDescription(); + + static std::array + getAttributeDescriptions(); +}; From 368fc84749a929c76ffbe188b6bddd28f6b8c088 Mon Sep 17 00:00:00 2001 From: Michael Pacheco Date: Wed, 22 Nov 2023 17:59:41 -0300 Subject: [PATCH 076/129] docs(linux): add vertex input description navigation link to linux summary branch indicating bugfix --- README.md | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index 772cf35..ab85f59 100644 --- a/README.md +++ b/README.md @@ -12,7 +12,7 @@ and current step. > [!IMPORTANT] > If a bug was found during the development of the current branch, the fix **will not be applied to previous branches**. -> Instead, the next branch that fixes the bug will have a bugfix notice in the table of content below. +> Instead, the next branch that fixes the bug will have a bugfix notice (🐞) in the table of contents below. * [Development environment](https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/tree/linux/01-development-environment) * Setup @@ -31,8 +31,11 @@ and current step. * [Render passes](https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/tree/linux/02-drawing-triangle/03-graphics-pipeline-basics/04-render-passes) * [Conclusion](https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/tree/linux/02-drawing-triangle/03-graphics-pipeline-basics/05-conclusion) * Drawing - * [Frame buffers](https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/tree/linux/02-drawing-triangle/04-drawing/01-frame-buffers) - * [Command buffers](https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/tree/linux/02-drawing-triangle/04-drawing/02-command-buffers) - * [Rendering and presentation](https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/tree/linux/02-drawing-triangle/04-drawing/03-rendering-and-presentation) - * [Frames in flight](https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/tree/linux/02-drawing-triangle/04-drawing/04-frames-in-flight) - * [Swap chain recreation](https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/tree/linux/02-drawing-triangle/05-swapchain-recreation) + * [Frame buffers](https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/tree/linux/02-drawing-triangle/04-drawing/01-frame-buffers) + * [Command buffers](https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/tree/linux/02-drawing-triangle/04-drawing/02-command-buffers) + * [Rendering and presentation](https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/tree/linux/02-drawing-triangle/04-drawing/03-rendering-and-presentation) + * [Frames in flight](https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/tree/linux/02-drawing-triangle/04-drawing/04-frames-in-flight) + * [Swap chain recreation](https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/tree/linux/02-drawing-triangle/05-swapchain-recreation) +* Vertex buffers + * [Vertex input description](https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/tree/linux/03-vertex-buffers/01-vertex-input-description) + 🐞 From 61b0bee77a74b92f4fd890db9ce837c42fa8ade0 Mon Sep 17 00:00:00 2001 From: Michael Pacheco Date: Wed, 22 Nov 2023 19:48:47 -0300 Subject: [PATCH 077/129] feat(linux): create vertex buffer --- README.md | 27 +++++++----------------- src/Application.cpp | 50 ++++++++++++++++++++++++++++++++++++++++++++- src/Application.hpp | 7 +++++++ 3 files changed, 63 insertions(+), 21 deletions(-) diff --git a/README.md b/README.md index 99762e0..a7b3573 100644 --- a/README.md +++ b/README.md @@ -1,32 +1,19 @@ -# Linux ❘ Vertex buffers ❘ Vertex input description +# Linux ❘ Vertex buffers ❘ Vertex buffer creation Summary [here](https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/tree/linux-summary). # Adjustments -> [!CAUTION] -> All usages of temporary bound to function calls (`const auto& var = func()`) were removed. -> Since I was compiling the code with `CLang 17`, everything was working just fine. -> When I tried to compile with `GCC 11.4.0` the application crashed with segmentation faults. -> Debugging the code, I realized that the reference lifetime was ending right before the assignment and the reference -> became invalid, so I removed all of them and used the copy assignments to prevent this error. -> See -> * https://github.com/KhronosGroup/Vulkan-Hpp/issues/1736 -> * https://stackoverflow.com/questions/17362673/temporary-lifetime-extension - -- Added extra warning & error compiler flags. -- Fixed compiler warnings. - # Navigation [🌐 Original tutorial]( -https://docs.vulkan.org/tutorial/latest/04_Vertex_buffers/00_Vertex_input_description.html) +https://docs.vulkan.org/tutorial/latest/04_Vertex_buffers/01_Vertex_buffer_creation.html) -[⏮ Drawing a triangle / Swap chain recreation]( -https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/tree/linux/02-drawing-triangle/05-swapchain-recreation) +[⏮ Vertex buffers / Vertex input description]( +https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/tree/linux/03-vertex-buffers/01-vertex-input-description) -[⏭ Vertex buffers / Vertex buffer creation]( -https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/tree/linux/03-vertex-buffers/02-vertex-buffer-creation) +[⏭ Vertex buffers / Staging buffer]( +https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/tree/linux/03-vertex-buffers/03-staging-buffer) [🔄 Diff from previous step]( -https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/compare/linux/02-drawing-triangle/05-swapchain-recreation...linux/03-vertex-buffers/01-vertex-input-description) +https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/compare/linux/03-vertex-buffers/01-vertex-input-description...linux/03-vertex-buffers/02-vertex-buffer-creation) diff --git a/src/Application.cpp b/src/Application.cpp index 0b422f0..9af9731 100644 --- a/src/Application.cpp +++ b/src/Application.cpp @@ -51,6 +51,7 @@ void Application::initVulkan() { createGraphicsPipeline(); createFrameBuffers(); createCommandPool(); + createVertexBuffer(); createCommandBuffers(); createSyncObjects(); } @@ -139,6 +140,8 @@ void Application::cleanup() { m_device.destroy(m_renderFinishedSemaphores[i]); m_device.destroy(m_imageAvailableSemaphores[i]); } + m_device.destroy(m_vertexBuffer); + m_device.free(m_vertexBufferMemory); m_device.destroy(m_commandPool); m_device.destroy(m_graphicsPipeline); m_device.destroy(m_pipelineLayout); @@ -504,6 +507,34 @@ void Application::createCommandPool() { m_commandPool = m_device.createCommandPool(poolInfo); } +void Application::createVertexBuffer() { + vk::BufferCreateInfo bufferInfo; + bufferInfo.setSize(sizeof(VERTICES[0]) * VERTICES.size()) + .setUsage(vk::BufferUsageFlagBits::eVertexBuffer) + .setSharingMode(vk::SharingMode::eExclusive); + + m_vertexBuffer = m_device.createBuffer(bufferInfo); + + vk::MemoryRequirements memRequirements = + m_device.getBufferMemoryRequirements(m_vertexBuffer); + + vk::MemoryAllocateInfo allocInfo; + allocInfo.setAllocationSize(memRequirements.size) + .setMemoryTypeIndex(findMemoryType( + memRequirements.memoryTypeBits, + vk::MemoryPropertyFlagBits::eHostVisible | + vk::MemoryPropertyFlagBits::eHostCoherent + )); + + m_vertexBufferMemory = m_device.allocateMemory(allocInfo); + + m_device.bindBufferMemory(m_vertexBuffer, m_vertexBufferMemory, 0); + + void* data = m_device.mapMemory(m_vertexBufferMemory, 0, bufferInfo.size); + memcpy(data, VERTICES.data(), static_cast(bufferInfo.size)); + m_device.unmapMemory(m_vertexBufferMemory); +} + void Application::createCommandBuffers() { m_commandBuffers.resize(Config::MAX_FRAMES_IN_FLIGHT); @@ -674,7 +705,24 @@ void Application::recordCommandBuffer( vk::Rect2D scissor = {zeroOffset, m_swapChainExtent}; commandBuffer.setScissor(0, scissor); - commandBuffer.draw(3, 1, 0, 0); + commandBuffer.bindVertexBuffers(0, m_vertexBuffer, {0}); + commandBuffer.draw(static_cast(VERTICES.size()), 1, 0, 0); commandBuffer.endRenderPass(); commandBuffer.end(); } + +uint32_t Application::findMemoryType( + uint32_t typeFilter, const vk::MemoryPropertyFlags& properties +) { + vk::PhysicalDeviceMemoryProperties memProperties = + m_physicalDevice.getMemoryProperties(); + + for (uint32_t i = 0; i < memProperties.memoryTypeCount; ++i) { + if ((typeFilter & (1 << i)) && (memProperties.memoryTypes[i].propertyFlags & + properties) == properties) { + return i; + } + } + + throw std::runtime_error("failed to find suitable memory type!"); +} diff --git a/src/Application.hpp b/src/Application.hpp index ee85eb6..5396adf 100644 --- a/src/Application.hpp +++ b/src/Application.hpp @@ -41,6 +41,8 @@ class Application { vk::Pipeline m_graphicsPipeline; std::vector m_swapChainFrameBuffers; vk::CommandPool m_commandPool; + vk::Buffer m_vertexBuffer; + vk::DeviceMemory m_vertexBufferMemory; std::vector m_commandBuffers; // Destroyed by command pool std::vector m_imageAvailableSemaphores; std::vector m_renderFinishedSemaphores; @@ -67,6 +69,7 @@ class Application { void createGraphicsPipeline(); void createFrameBuffers(); void createCommandPool(); + void createVertexBuffer(); void createCommandBuffers(); void createSyncObjects(); @@ -99,4 +102,8 @@ class Application { void recordCommandBuffer( const vk::CommandBuffer& commandBuffer, uint32_t imageIndex ); + + uint32_t findMemoryType( + uint32_t typeFilter, const vk::MemoryPropertyFlags& properties + ); }; From fc9eeb1d0e5f19dc4e8b4203be22ade32bee7575 Mon Sep 17 00:00:00 2001 From: Michael Pacheco Date: Wed, 22 Nov 2023 20:01:03 -0300 Subject: [PATCH 078/129] docs(linux): add vertex buffer creation navigation link to linux summary branch --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index ab85f59..eff48c6 100644 --- a/README.md +++ b/README.md @@ -39,3 +39,4 @@ and current step. * Vertex buffers * [Vertex input description](https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/tree/linux/03-vertex-buffers/01-vertex-input-description) 🐞 + * [Vertex buffer creation](https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/tree/linux/03-vertex-buffers/02-vertex-buffer-creation) From c190f0b268e539a8c5df3a74c3ed49f398bc8031 Mon Sep 17 00:00:00 2001 From: Michael Pacheco Date: Wed, 22 Nov 2023 22:24:58 -0300 Subject: [PATCH 079/129] docs(linux): add staging buffer README.md --- README.md | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index a7b3573..0ce03df 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# Linux ❘ Vertex buffers ❘ Vertex buffer creation +# Linux ❘ Vertex buffers ❘ Staging buffer Summary [here](https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/tree/linux-summary). @@ -7,13 +7,13 @@ Summary [here](https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/tree/lin # Navigation [🌐 Original tutorial]( -https://docs.vulkan.org/tutorial/latest/04_Vertex_buffers/01_Vertex_buffer_creation.html) +https://docs.vulkan.org/tutorial/latest/04_Vertex_buffers/02_Staging_buffer.html) -[⏮ Vertex buffers / Vertex input description]( -https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/tree/linux/03-vertex-buffers/01-vertex-input-description) +[⏮ Vertex buffers / Vertex buffer creation]( +https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/tree/linux/03-vertex-buffers/02-vertex-buffer-creation) -[⏭ Vertex buffers / Staging buffer]( -https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/tree/linux/03-vertex-buffers/03-staging-buffer) +[⏭ Vertex buffers / Index buffer]( +https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/tree/linux/03-vertex-buffers/04-index-buffer) [🔄 Diff from previous step]( -https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/compare/linux/03-vertex-buffers/01-vertex-input-description...linux/03-vertex-buffers/02-vertex-buffer-creation) +https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/compare/linux/03-vertex-buffers/02-vertex-buffer-creation...linux/03-vertex-buffers/03-staging-buffer) From 558a0610fe8d15139a97d9836fc7b8a709982366 Mon Sep 17 00:00:00 2001 From: Michael Pacheco Date: Wed, 22 Nov 2023 23:13:52 -0300 Subject: [PATCH 080/129] feat(linux): create staging buffer --- src/Application.cpp | 115 +++++++++++++++++++++++++++++++++++--------- src/Application.hpp | 14 ++++++ 2 files changed, 105 insertions(+), 24 deletions(-) diff --git a/src/Application.cpp b/src/Application.cpp index 9af9731..4a152f0 100644 --- a/src/Application.cpp +++ b/src/Application.cpp @@ -210,7 +210,7 @@ void Application::pickPhysicalDevice() { m_instance.enumeratePhysicalDevices(); if (devices.empty()) { - throw runtime_error("Failed to findOrNull devices with Vulkan support"); + throw runtime_error("Failed to find devices with Vulkan support"); } for (const auto& device : devices) { @@ -508,31 +508,37 @@ void Application::createCommandPool() { } void Application::createVertexBuffer() { - vk::BufferCreateInfo bufferInfo; - bufferInfo.setSize(sizeof(VERTICES[0]) * VERTICES.size()) - .setUsage(vk::BufferUsageFlagBits::eVertexBuffer) - .setSharingMode(vk::SharingMode::eExclusive); - - m_vertexBuffer = m_device.createBuffer(bufferInfo); - - vk::MemoryRequirements memRequirements = - m_device.getBufferMemoryRequirements(m_vertexBuffer); - - vk::MemoryAllocateInfo allocInfo; - allocInfo.setAllocationSize(memRequirements.size) - .setMemoryTypeIndex(findMemoryType( - memRequirements.memoryTypeBits, - vk::MemoryPropertyFlagBits::eHostVisible | - vk::MemoryPropertyFlagBits::eHostCoherent - )); + size_t bufferSize = sizeof(VERTICES[0]) * VERTICES.size(); + + vk::Buffer stagingBuffer; + vk::DeviceMemory stagingBufferMemory; + + createBuffer( + bufferSize, + vk::BufferUsageFlagBits::eTransferSrc, + vk::MemoryPropertyFlagBits::eHostVisible | + vk::MemoryPropertyFlagBits::eHostCoherent, + stagingBuffer, + stagingBufferMemory + ); - m_vertexBufferMemory = m_device.allocateMemory(allocInfo); + void* data = m_device.mapMemory(stagingBufferMemory, 0, bufferSize); + memcpy(data, VERTICES.data(), static_cast(bufferSize)); + m_device.unmapMemory(stagingBufferMemory); + + createBuffer( + bufferSize, + vk::BufferUsageFlagBits::eTransferDst | + vk::BufferUsageFlagBits::eVertexBuffer, + vk::MemoryPropertyFlagBits::eDeviceLocal, + m_vertexBuffer, + m_vertexBufferMemory + ); - m_device.bindBufferMemory(m_vertexBuffer, m_vertexBufferMemory, 0); + copyBuffer(stagingBuffer, m_vertexBuffer, bufferSize); - void* data = m_device.mapMemory(m_vertexBufferMemory, 0, bufferInfo.size); - memcpy(data, VERTICES.data(), static_cast(bufferInfo.size)); - m_device.unmapMemory(m_vertexBufferMemory); + m_device.destroy(stagingBuffer); + m_device.free(stagingBufferMemory); } void Application::createCommandBuffers() { @@ -724,5 +730,66 @@ uint32_t Application::findMemoryType( } } - throw std::runtime_error("failed to find suitable memory type!"); + throw std::runtime_error("Failed to find suitable memory type"); +} + +void Application::createBuffer( + const vk::DeviceSize& size, + const vk::BufferUsageFlags& usage, + const vk::MemoryPropertyFlags& properties, + vk::Buffer& buffer, + vk::DeviceMemory& bufferMemory +) { + vk::BufferCreateInfo bufferInfo; + bufferInfo.size = size; + bufferInfo.usage = usage; + bufferInfo.sharingMode = vk::SharingMode::eExclusive; + + buffer = m_device.createBuffer(bufferInfo); + + vk::MemoryRequirements memoryRequirements = + m_device.getBufferMemoryRequirements(buffer); + + vk::MemoryAllocateInfo allocInfo; + allocInfo.allocationSize = memoryRequirements.size; + allocInfo.memoryTypeIndex = + findMemoryType(memoryRequirements.memoryTypeBits, properties); + + bufferMemory = m_device.allocateMemory(allocInfo); + + m_device.bindBufferMemory(buffer, bufferMemory, 0); +} + +void Application::copyBuffer( + const vk::Buffer& srcBuffer, + vk::Buffer& dstBuffer, + const vk::DeviceSize& size +) { + vk::CommandBufferAllocateInfo allocInfo; + allocInfo.level = vk::CommandBufferLevel::ePrimary; + allocInfo.commandPool = m_commandPool; + allocInfo.commandBufferCount = 1; + + vk::CommandBuffer commandBuffer; + commandBuffer = m_device.allocateCommandBuffers(allocInfo)[0]; + + vk::CommandBufferBeginInfo beginInfo; + beginInfo.flags = vk::CommandBufferUsageFlagBits::eOneTimeSubmit; + + commandBuffer.begin(beginInfo); + + vk::BufferCopy copyRegion; + copyRegion.size = size; + + commandBuffer.copyBuffer(srcBuffer, dstBuffer, 1, ©Region); + + commandBuffer.end(); + + vk::SubmitInfo submitInfo; + submitInfo.setCommandBuffers(commandBuffer); + + m_graphicsQueue.submit(submitInfo, nullptr); + m_graphicsQueue.waitIdle(); + + m_device.freeCommandBuffers(m_commandPool, commandBuffer); } diff --git a/src/Application.hpp b/src/Application.hpp index 5396adf..5624187 100644 --- a/src/Application.hpp +++ b/src/Application.hpp @@ -106,4 +106,18 @@ class Application { uint32_t findMemoryType( uint32_t typeFilter, const vk::MemoryPropertyFlags& properties ); + + void createBuffer( + const vk::DeviceSize& size, + const vk::BufferUsageFlags& usage, + const vk::MemoryPropertyFlags& properties, + vk::Buffer& buffer, + vk::DeviceMemory& bufferMemory + ); + + void copyBuffer( + const vk::Buffer& srcBuffer, + vk::Buffer& dstBuffer, + const vk::DeviceSize& size + ); }; From 67ea8af30f55169f0b8effb6717a5f8dadf26896 Mon Sep 17 00:00:00 2001 From: Michael Pacheco Date: Thu, 23 Nov 2023 18:10:56 -0300 Subject: [PATCH 081/129] docs(linux): add staging buffer navigation link to linux summary branch --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index eff48c6..6dff36a 100644 --- a/README.md +++ b/README.md @@ -40,3 +40,4 @@ and current step. * [Vertex input description](https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/tree/linux/03-vertex-buffers/01-vertex-input-description) 🐞 * [Vertex buffer creation](https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/tree/linux/03-vertex-buffers/02-vertex-buffer-creation) + * [Staging buffer](https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/tree/linux/03-vertex-buffers/03-staging-buffer) From a416e01bdbe90703c465e6ffc6d18903bf2c83c7 Mon Sep 17 00:00:00 2001 From: Michael Pacheco Date: Thu, 23 Nov 2023 18:15:24 -0300 Subject: [PATCH 082/129] docs(linux): update index buffer README.md navigation links --- README.md | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index 0ce03df..6d01d06 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# Linux ❘ Vertex buffers ❘ Staging buffer +# Linux ❘ Vertex buffers ❘ Index buffer Summary [here](https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/tree/linux-summary). @@ -7,13 +7,13 @@ Summary [here](https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/tree/lin # Navigation [🌐 Original tutorial]( -https://docs.vulkan.org/tutorial/latest/04_Vertex_buffers/02_Staging_buffer.html) +https://docs.vulkan.org/tutorial/latest/04_Vertex_buffers/03_Index_buffer.html) -[⏮ Vertex buffers / Vertex buffer creation]( -https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/tree/linux/03-vertex-buffers/02-vertex-buffer-creation) +[⏮ Vertex buffers / Staging buffer]( +https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/tree/linux/03-vertex-buffers/03-staging-buffer) -[⏭ Vertex buffers / Index buffer]( -https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/tree/linux/03-vertex-buffers/04-index-buffer) +[⏭ Uniform buffers / Descriptor layout and buffer]( +https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/tree/linux/04-uniform-buffers/01-descriptor-layout-and-buffer) [🔄 Diff from previous step]( -https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/compare/linux/03-vertex-buffers/02-vertex-buffer-creation...linux/03-vertex-buffers/03-staging-buffer) +https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/compare/linux/03-vertex-buffers/03-staging-buffer...linux/03-vertex-buffers/04-index-buffer) From 9031a781b7445a8bb0d0b7d9e075669973644fd2 Mon Sep 17 00:00:00 2001 From: Michael Pacheco Date: Thu, 23 Nov 2023 18:29:55 -0300 Subject: [PATCH 083/129] docs(linux): draw indexed geometry --- src/Application.cpp | 52 +++++++++++++++++++++++++++++++++++++++++---- src/Application.hpp | 3 +++ 2 files changed, 51 insertions(+), 4 deletions(-) diff --git a/src/Application.cpp b/src/Application.cpp index 4a152f0..dcd79a5 100644 --- a/src/Application.cpp +++ b/src/Application.cpp @@ -14,9 +14,12 @@ constexpr auto NO_TIMEOUT = std::numeric_limits::max(); const std::vector VERTICES = { - {{0.0f, -0.5f}, {1.0f, 0.0f, 0.0f}}, - {{0.5f, 0.5f}, {0.0f, 1.0f, 0.0f}}, - {{-0.5f, 0.5f}, {0.0f, 0.0f, 1.0f}}}; + {{-0.5f, -0.5f}, {1.0f, 0.0f, 0.0f}}, + {{0.5f, -0.5f}, {0.0f, 1.0f, 0.0f}}, + {{0.5f, 0.5f}, {0.0f, 0.0f, 1.0f}}, + {{-0.5f, 0.5f}, {1.0f, 1.0f, 1.0f}}}; + +const std::vector INDICES = {0, 1, 2, 2, 3, 0}; void Application::run() { initWindow(); @@ -52,6 +55,7 @@ void Application::initVulkan() { createFrameBuffers(); createCommandPool(); createVertexBuffer(); + createIndexBuffer(); createCommandBuffers(); createSyncObjects(); } @@ -140,8 +144,13 @@ void Application::cleanup() { m_device.destroy(m_renderFinishedSemaphores[i]); m_device.destroy(m_imageAvailableSemaphores[i]); } + + m_device.destroy(m_indexBuffer); + m_device.free(m_indexBufferMemory); + m_device.destroy(m_vertexBuffer); m_device.free(m_vertexBufferMemory); + m_device.destroy(m_commandPool); m_device.destroy(m_graphicsPipeline); m_device.destroy(m_pipelineLayout); @@ -541,6 +550,40 @@ void Application::createVertexBuffer() { m_device.free(stagingBufferMemory); } +void Application::createIndexBuffer() { + vk::DeviceSize bufferSize = sizeof(INDICES[0]) * INDICES.size(); + + vk::Buffer stagingBuffer; + vk::DeviceMemory stagingBufferMemory; + + createBuffer( + bufferSize, + vk::BufferUsageFlagBits::eTransferSrc, + vk::MemoryPropertyFlagBits::eHostVisible | + vk::MemoryPropertyFlagBits::eHostCoherent, + stagingBuffer, + stagingBufferMemory + ); + + void* data = m_device.mapMemory(stagingBufferMemory, 0, bufferSize, {}); + memcpy(data, INDICES.data(), static_cast(bufferSize)); + m_device.unmapMemory(stagingBufferMemory); + + createBuffer( + bufferSize, + vk::BufferUsageFlagBits::eTransferDst | + vk::BufferUsageFlagBits::eIndexBuffer, + vk::MemoryPropertyFlagBits::eDeviceLocal, + m_indexBuffer, + m_indexBufferMemory + ); + + copyBuffer(stagingBuffer, m_indexBuffer, bufferSize); + + m_device.destroy(stagingBuffer, nullptr); + m_device.free(stagingBufferMemory, nullptr); +} + void Application::createCommandBuffers() { m_commandBuffers.resize(Config::MAX_FRAMES_IN_FLIGHT); @@ -712,7 +755,8 @@ void Application::recordCommandBuffer( commandBuffer.setScissor(0, scissor); commandBuffer.bindVertexBuffers(0, m_vertexBuffer, {0}); - commandBuffer.draw(static_cast(VERTICES.size()), 1, 0, 0); + commandBuffer.bindIndexBuffer(m_indexBuffer, 0, vk::IndexType::eUint16); + commandBuffer.drawIndexed(static_cast(INDICES.size()), 1, 0, 0, 0); commandBuffer.endRenderPass(); commandBuffer.end(); } diff --git a/src/Application.hpp b/src/Application.hpp index 5624187..408a0c6 100644 --- a/src/Application.hpp +++ b/src/Application.hpp @@ -43,6 +43,8 @@ class Application { vk::CommandPool m_commandPool; vk::Buffer m_vertexBuffer; vk::DeviceMemory m_vertexBufferMemory; + vk::Buffer m_indexBuffer; + vk::DeviceMemory m_indexBufferMemory; std::vector m_commandBuffers; // Destroyed by command pool std::vector m_imageAvailableSemaphores; std::vector m_renderFinishedSemaphores; @@ -70,6 +72,7 @@ class Application { void createFrameBuffers(); void createCommandPool(); void createVertexBuffer(); + void createIndexBuffer(); void createCommandBuffers(); void createSyncObjects(); From e696404373d950f43fb55e6fdcdede697fd5df9d Mon Sep 17 00:00:00 2001 From: Michael Pacheco Date: Thu, 23 Nov 2023 18:31:34 -0300 Subject: [PATCH 084/129] docs(linux): add index buffer navigation link to linux summary branch --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 6dff36a..003bd80 100644 --- a/README.md +++ b/README.md @@ -41,3 +41,4 @@ and current step. 🐞 * [Vertex buffer creation](https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/tree/linux/03-vertex-buffers/02-vertex-buffer-creation) * [Staging buffer](https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/tree/linux/03-vertex-buffers/03-staging-buffer) + * [Index buffer](https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/tree/linux/03-vertex-buffers/04-index-buffer) From 472a2ab7593eac7a4ce43c00e2ed81750e16aaac Mon Sep 17 00:00:00 2001 From: Michael Pacheco Date: Thu, 23 Nov 2023 21:21:53 -0300 Subject: [PATCH 085/129] feat(linux): add descriptor layout and buffer --- README.md | 14 +++---- res/shaders/shader.vert | 14 +++++-- src/Application.cpp | 82 +++++++++++++++++++++++++++++++++++++++-- src/Application.hpp | 17 +++++++++ 4 files changed, 113 insertions(+), 14 deletions(-) diff --git a/README.md b/README.md index 6d01d06..0f328f2 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# Linux ❘ Vertex buffers ❘ Index buffer +# Linux ❘ Uniform buffers ❘ Descriptor layout and buffer Summary [here](https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/tree/linux-summary). @@ -7,13 +7,13 @@ Summary [here](https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/tree/lin # Navigation [🌐 Original tutorial]( -https://docs.vulkan.org/tutorial/latest/04_Vertex_buffers/03_Index_buffer.html) +https://docs.vulkan.org/tutorial/latest/05_Uniform_buffers/00_Descriptor_set_layout_and_buffer.html#_updating_uniform_data) -[⏮ Vertex buffers / Staging buffer]( -https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/tree/linux/03-vertex-buffers/03-staging-buffer) +[⏮ Vertex buffers / Index buffer]( +https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/tree/linux/03-vertex-buffers/04-index-buffer) -[⏭ Uniform buffers / Descriptor layout and buffer]( -https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/tree/linux/04-uniform-buffers/01-descriptor-layout-and-buffer) +[⏭ Uniform buffers / Descriptor pool and sets]( +https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/tree/linux/04-uniform-buffers/02-descriptor-pool-and-sets) [🔄 Diff from previous step]( -https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/compare/linux/03-vertex-buffers/03-staging-buffer...linux/03-vertex-buffers/04-index-buffer) +https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/compare/linux/03-vertex-buffers/04-index-buffer...linux/04-uniform-buffers/01-descriptor-layout-and-buffer) diff --git a/res/shaders/shader.vert b/res/shaders/shader.vert index 9f27f54..f931ea1 100644 --- a/res/shaders/shader.vert +++ b/res/shaders/shader.vert @@ -1,11 +1,17 @@ #version 450 -layout(location = 0) in vec2 inPosition; -layout(location = 1) in vec3 inColor; +layout (binding = 0) uniform UniformBufferObject { + mat4 model; + mat4 view; + mat4 proj; +} ubo; -layout(location = 0) out vec3 fragColor; +layout (location = 0) in vec2 inPosition; +layout (location = 1) in vec3 inColor; + +layout (location = 0) out vec3 fragColor; void main() { - gl_Position = vec4(inPosition, 0.0, 1.0); + gl_Position = ubo.proj * ubo.view * ubo.model * vec4(inPosition, 0.0, 1.0); fragColor = inColor; } diff --git a/src/Application.cpp b/src/Application.cpp index dcd79a5..81973db 100644 --- a/src/Application.cpp +++ b/src/Application.cpp @@ -1,6 +1,8 @@ #include "Application.hpp" +#include #include +#include #include #include @@ -51,11 +53,13 @@ void Application::initVulkan() { createSwapChain(); createImageViews(); createRenderPass(); + createDescriptorSetLayout(); createGraphicsPipeline(); createFrameBuffers(); createCommandPool(); createVertexBuffer(); createIndexBuffer(); + createUniformBuffers(); createCommandBuffers(); createSyncObjects(); } @@ -98,6 +102,8 @@ void Application::drawFrame() { vk::resultCheck(result, "Failed to acquire swap chain image"); } + updateUniformBuffer(m_currentFrame); + m_device.resetFences(inFlightFence); commandBuffer.reset(); @@ -145,6 +151,11 @@ void Application::cleanup() { m_device.destroy(m_imageAvailableSemaphores[i]); } + for (size_t i = 0; i < Config::MAX_FRAMES_IN_FLIGHT; ++i) { + m_device.destroy(m_uniformBuffers[i]); + m_device.free(m_uniformBuffersMemory[i]); + } + m_device.destroy(m_indexBuffer); m_device.free(m_indexBufferMemory); @@ -154,6 +165,7 @@ void Application::cleanup() { m_device.destroy(m_commandPool); m_device.destroy(m_graphicsPipeline); m_device.destroy(m_pipelineLayout); + m_device.destroy(m_descriptorSetLayout); m_device.destroy(m_renderPass); m_device.destroy(); m_instance.destroy(m_surface); @@ -379,6 +391,20 @@ void Application::createRenderPass() { m_renderPass = m_device.createRenderPass(renderPassInfo); } +void Application::createDescriptorSetLayout() { + const auto uboLayoutBinding = + vk::DescriptorSetLayoutBinding() + .setBinding(0) + .setDescriptorCount(1) + .setDescriptorType(vk::DescriptorType::eUniformBuffer) + .setStageFlags(vk::ShaderStageFlagBits::eVertex); + + vk::DescriptorSetLayoutCreateInfo layoutInfo; + layoutInfo.setBindings(uboLayoutBinding); + + m_descriptorSetLayout = m_device.createDescriptorSetLayout(layoutInfo); +} + void Application::createGraphicsPipeline() { auto vertShaderCode = BinaryLoader::load("res/shaders/shader.vert.spv"); auto fragShaderCode = BinaryLoader::load("res/shaders/shader.frag.spv"); @@ -456,9 +482,7 @@ void Application::createGraphicsPipeline() { vk::PipelineDynamicStateCreateInfo().setDynamicStates(dynamicStates); const auto pipelineLayoutInfo = - vk::PipelineLayoutCreateInfo() - .setSetLayoutCount(0) - .setPushConstantRangeCount(0); + vk::PipelineLayoutCreateInfo().setSetLayouts(m_descriptorSetLayout); m_pipelineLayout = m_device.createPipelineLayout(pipelineLayoutInfo); @@ -584,6 +608,28 @@ void Application::createIndexBuffer() { m_device.free(stagingBufferMemory, nullptr); } +void Application::createUniformBuffers() { + vk::DeviceSize bufferSize = sizeof(UniformBufferObject); + + m_uniformBuffers.resize(Config::MAX_FRAMES_IN_FLIGHT); + m_uniformBuffersMemory.resize(Config::MAX_FRAMES_IN_FLIGHT); + m_uniformBuffersMapped.resize(Config::MAX_FRAMES_IN_FLIGHT); + + for (size_t i = 0; i < Config::MAX_FRAMES_IN_FLIGHT; i++) { + createBuffer( + bufferSize, + vk::BufferUsageFlagBits::eUniformBuffer, + vk::MemoryPropertyFlagBits::eHostVisible | + vk::MemoryPropertyFlagBits::eHostCoherent, + m_uniformBuffers[i], + m_uniformBuffersMemory[i] + ); + + m_uniformBuffersMapped[i] = + m_device.mapMemory(m_uniformBuffersMemory[i], 0, bufferSize); + } +} + void Application::createCommandBuffers() { m_commandBuffers.resize(Config::MAX_FRAMES_IN_FLIGHT); @@ -837,3 +883,33 @@ void Application::copyBuffer( m_device.freeCommandBuffers(m_commandPool, commandBuffer); } + +void Application::updateUniformBuffer(uint32_t currentImage) { + using namespace std::chrono; + using period = seconds::period; + + static auto startTime = high_resolution_clock::now(); + + auto currentTime = high_resolution_clock::now(); + float time = duration(currentTime - startTime).count(); + + UniformBufferObject ubo; + + ubo.model = glm::rotate( + glm::mat4(1.0f), time * glm::radians(90.0f), glm::vec3(0.0f, 0.0f, 1.0f) + ); + + ubo.view = glm::lookAt( + glm::vec3(2.0f, 2.0f, 2.0f), + glm::vec3(0.0f, 0.0f, 0.0f), + glm::vec3(0.0f, 0.0f, 1.0f) + ); + + float aspect = static_cast(m_swapChainExtent.width) / + static_cast(m_swapChainExtent.height); + + ubo.proj = glm::perspective(glm::radians(45.0f), aspect, 0.1f, 10.0f); + ubo.proj[1][1] *= -1; + + std::memcpy(m_uniformBuffersMapped[currentImage], &ubo, sizeof(ubo)); +} diff --git a/src/Application.hpp b/src/Application.hpp index 408a0c6..d82be49 100644 --- a/src/Application.hpp +++ b/src/Application.hpp @@ -1,5 +1,6 @@ #pragma once +#include #include #include "Window.hpp" @@ -19,6 +20,12 @@ class Application { } }; + struct UniformBufferObject { + glm::mat4 model{}; + glm::mat4 view{}; + glm::mat4 proj{}; + }; + public: void run(); @@ -37,6 +44,7 @@ class Application { vk::Extent2D m_swapChainExtent; std::vector m_swapChainImageViews; vk::RenderPass m_renderPass; + vk::DescriptorSetLayout m_descriptorSetLayout; vk::PipelineLayout m_pipelineLayout; vk::Pipeline m_graphicsPipeline; std::vector m_swapChainFrameBuffers; @@ -45,6 +53,11 @@ class Application { vk::DeviceMemory m_vertexBufferMemory; vk::Buffer m_indexBuffer; vk::DeviceMemory m_indexBufferMemory; + + std::vector m_uniformBuffers; + std::vector m_uniformBuffersMemory; + std::vector m_uniformBuffersMapped; + std::vector m_commandBuffers; // Destroyed by command pool std::vector m_imageAvailableSemaphores; std::vector m_renderFinishedSemaphores; @@ -68,11 +81,13 @@ class Application { void cleanupSwapChain(); void createImageViews(); void createRenderPass(); + void createDescriptorSetLayout(); void createGraphicsPipeline(); void createFrameBuffers(); void createCommandPool(); void createVertexBuffer(); void createIndexBuffer(); + void createUniformBuffers(); void createCommandBuffers(); void createSyncObjects(); @@ -123,4 +138,6 @@ class Application { vk::Buffer& dstBuffer, const vk::DeviceSize& size ); + + void updateUniformBuffer(uint32_t currentImage); }; From 1d4adef1a6522eb2bd3ee5cd36689dcd14e658ea Mon Sep 17 00:00:00 2001 From: Michael Pacheco Date: Thu, 23 Nov 2023 21:23:04 -0300 Subject: [PATCH 086/129] docs(linux): add descriptor layout and buffer navigation link to linux summary branch --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 003bd80..2c8439a 100644 --- a/README.md +++ b/README.md @@ -42,3 +42,4 @@ and current step. * [Vertex buffer creation](https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/tree/linux/03-vertex-buffers/02-vertex-buffer-creation) * [Staging buffer](https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/tree/linux/03-vertex-buffers/03-staging-buffer) * [Index buffer](https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/tree/linux/03-vertex-buffers/04-index-buffer) + * [Descriptor layout and buffer](https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/tree/linux/04-uniform-buffers/01-descriptor-layout-and-buffer) From 8b6a545d98ac120fc24e371a9f4c9f6f6855f947 Mon Sep 17 00:00:00 2001 From: Michael Pacheco Date: Thu, 23 Nov 2023 21:21:53 -0300 Subject: [PATCH 087/129] feat(linux): add descriptor layout and buffer --- README.md | 14 +++---- res/shaders/shader.vert | 14 +++++-- src/Application.cpp | 82 +++++++++++++++++++++++++++++++++++++++-- src/Application.hpp | 17 +++++++++ 4 files changed, 113 insertions(+), 14 deletions(-) diff --git a/README.md b/README.md index 6d01d06..0a7495a 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# Linux ❘ Vertex buffers ❘ Index buffer +# Linux ❘ Uniform buffers ❘ Descriptor layout and buffer Summary [here](https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/tree/linux-summary). @@ -7,13 +7,13 @@ Summary [here](https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/tree/lin # Navigation [🌐 Original tutorial]( -https://docs.vulkan.org/tutorial/latest/04_Vertex_buffers/03_Index_buffer.html) +https://docs.vulkan.org/tutorial/latest/05_Uniform_buffers/00_Descriptor_set_layout_and_buffer.html) -[⏮ Vertex buffers / Staging buffer]( -https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/tree/linux/03-vertex-buffers/03-staging-buffer) +[⏮ Vertex buffers / Index buffer]( +https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/tree/linux/03-vertex-buffers/04-index-buffer) -[⏭ Uniform buffers / Descriptor layout and buffer]( -https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/tree/linux/04-uniform-buffers/01-descriptor-layout-and-buffer) +[⏭ Uniform buffers / Descriptor pool and sets]( +https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/tree/linux/04-uniform-buffers/02-descriptor-pool-and-sets) [🔄 Diff from previous step]( -https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/compare/linux/03-vertex-buffers/03-staging-buffer...linux/03-vertex-buffers/04-index-buffer) +https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/compare/linux/03-vertex-buffers/04-index-buffer...linux/04-uniform-buffers/01-descriptor-layout-and-buffer) diff --git a/res/shaders/shader.vert b/res/shaders/shader.vert index 9f27f54..f931ea1 100644 --- a/res/shaders/shader.vert +++ b/res/shaders/shader.vert @@ -1,11 +1,17 @@ #version 450 -layout(location = 0) in vec2 inPosition; -layout(location = 1) in vec3 inColor; +layout (binding = 0) uniform UniformBufferObject { + mat4 model; + mat4 view; + mat4 proj; +} ubo; -layout(location = 0) out vec3 fragColor; +layout (location = 0) in vec2 inPosition; +layout (location = 1) in vec3 inColor; + +layout (location = 0) out vec3 fragColor; void main() { - gl_Position = vec4(inPosition, 0.0, 1.0); + gl_Position = ubo.proj * ubo.view * ubo.model * vec4(inPosition, 0.0, 1.0); fragColor = inColor; } diff --git a/src/Application.cpp b/src/Application.cpp index dcd79a5..81973db 100644 --- a/src/Application.cpp +++ b/src/Application.cpp @@ -1,6 +1,8 @@ #include "Application.hpp" +#include #include +#include #include #include @@ -51,11 +53,13 @@ void Application::initVulkan() { createSwapChain(); createImageViews(); createRenderPass(); + createDescriptorSetLayout(); createGraphicsPipeline(); createFrameBuffers(); createCommandPool(); createVertexBuffer(); createIndexBuffer(); + createUniformBuffers(); createCommandBuffers(); createSyncObjects(); } @@ -98,6 +102,8 @@ void Application::drawFrame() { vk::resultCheck(result, "Failed to acquire swap chain image"); } + updateUniformBuffer(m_currentFrame); + m_device.resetFences(inFlightFence); commandBuffer.reset(); @@ -145,6 +151,11 @@ void Application::cleanup() { m_device.destroy(m_imageAvailableSemaphores[i]); } + for (size_t i = 0; i < Config::MAX_FRAMES_IN_FLIGHT; ++i) { + m_device.destroy(m_uniformBuffers[i]); + m_device.free(m_uniformBuffersMemory[i]); + } + m_device.destroy(m_indexBuffer); m_device.free(m_indexBufferMemory); @@ -154,6 +165,7 @@ void Application::cleanup() { m_device.destroy(m_commandPool); m_device.destroy(m_graphicsPipeline); m_device.destroy(m_pipelineLayout); + m_device.destroy(m_descriptorSetLayout); m_device.destroy(m_renderPass); m_device.destroy(); m_instance.destroy(m_surface); @@ -379,6 +391,20 @@ void Application::createRenderPass() { m_renderPass = m_device.createRenderPass(renderPassInfo); } +void Application::createDescriptorSetLayout() { + const auto uboLayoutBinding = + vk::DescriptorSetLayoutBinding() + .setBinding(0) + .setDescriptorCount(1) + .setDescriptorType(vk::DescriptorType::eUniformBuffer) + .setStageFlags(vk::ShaderStageFlagBits::eVertex); + + vk::DescriptorSetLayoutCreateInfo layoutInfo; + layoutInfo.setBindings(uboLayoutBinding); + + m_descriptorSetLayout = m_device.createDescriptorSetLayout(layoutInfo); +} + void Application::createGraphicsPipeline() { auto vertShaderCode = BinaryLoader::load("res/shaders/shader.vert.spv"); auto fragShaderCode = BinaryLoader::load("res/shaders/shader.frag.spv"); @@ -456,9 +482,7 @@ void Application::createGraphicsPipeline() { vk::PipelineDynamicStateCreateInfo().setDynamicStates(dynamicStates); const auto pipelineLayoutInfo = - vk::PipelineLayoutCreateInfo() - .setSetLayoutCount(0) - .setPushConstantRangeCount(0); + vk::PipelineLayoutCreateInfo().setSetLayouts(m_descriptorSetLayout); m_pipelineLayout = m_device.createPipelineLayout(pipelineLayoutInfo); @@ -584,6 +608,28 @@ void Application::createIndexBuffer() { m_device.free(stagingBufferMemory, nullptr); } +void Application::createUniformBuffers() { + vk::DeviceSize bufferSize = sizeof(UniformBufferObject); + + m_uniformBuffers.resize(Config::MAX_FRAMES_IN_FLIGHT); + m_uniformBuffersMemory.resize(Config::MAX_FRAMES_IN_FLIGHT); + m_uniformBuffersMapped.resize(Config::MAX_FRAMES_IN_FLIGHT); + + for (size_t i = 0; i < Config::MAX_FRAMES_IN_FLIGHT; i++) { + createBuffer( + bufferSize, + vk::BufferUsageFlagBits::eUniformBuffer, + vk::MemoryPropertyFlagBits::eHostVisible | + vk::MemoryPropertyFlagBits::eHostCoherent, + m_uniformBuffers[i], + m_uniformBuffersMemory[i] + ); + + m_uniformBuffersMapped[i] = + m_device.mapMemory(m_uniformBuffersMemory[i], 0, bufferSize); + } +} + void Application::createCommandBuffers() { m_commandBuffers.resize(Config::MAX_FRAMES_IN_FLIGHT); @@ -837,3 +883,33 @@ void Application::copyBuffer( m_device.freeCommandBuffers(m_commandPool, commandBuffer); } + +void Application::updateUniformBuffer(uint32_t currentImage) { + using namespace std::chrono; + using period = seconds::period; + + static auto startTime = high_resolution_clock::now(); + + auto currentTime = high_resolution_clock::now(); + float time = duration(currentTime - startTime).count(); + + UniformBufferObject ubo; + + ubo.model = glm::rotate( + glm::mat4(1.0f), time * glm::radians(90.0f), glm::vec3(0.0f, 0.0f, 1.0f) + ); + + ubo.view = glm::lookAt( + glm::vec3(2.0f, 2.0f, 2.0f), + glm::vec3(0.0f, 0.0f, 0.0f), + glm::vec3(0.0f, 0.0f, 1.0f) + ); + + float aspect = static_cast(m_swapChainExtent.width) / + static_cast(m_swapChainExtent.height); + + ubo.proj = glm::perspective(glm::radians(45.0f), aspect, 0.1f, 10.0f); + ubo.proj[1][1] *= -1; + + std::memcpy(m_uniformBuffersMapped[currentImage], &ubo, sizeof(ubo)); +} diff --git a/src/Application.hpp b/src/Application.hpp index 408a0c6..d82be49 100644 --- a/src/Application.hpp +++ b/src/Application.hpp @@ -1,5 +1,6 @@ #pragma once +#include #include #include "Window.hpp" @@ -19,6 +20,12 @@ class Application { } }; + struct UniformBufferObject { + glm::mat4 model{}; + glm::mat4 view{}; + glm::mat4 proj{}; + }; + public: void run(); @@ -37,6 +44,7 @@ class Application { vk::Extent2D m_swapChainExtent; std::vector m_swapChainImageViews; vk::RenderPass m_renderPass; + vk::DescriptorSetLayout m_descriptorSetLayout; vk::PipelineLayout m_pipelineLayout; vk::Pipeline m_graphicsPipeline; std::vector m_swapChainFrameBuffers; @@ -45,6 +53,11 @@ class Application { vk::DeviceMemory m_vertexBufferMemory; vk::Buffer m_indexBuffer; vk::DeviceMemory m_indexBufferMemory; + + std::vector m_uniformBuffers; + std::vector m_uniformBuffersMemory; + std::vector m_uniformBuffersMapped; + std::vector m_commandBuffers; // Destroyed by command pool std::vector m_imageAvailableSemaphores; std::vector m_renderFinishedSemaphores; @@ -68,11 +81,13 @@ class Application { void cleanupSwapChain(); void createImageViews(); void createRenderPass(); + void createDescriptorSetLayout(); void createGraphicsPipeline(); void createFrameBuffers(); void createCommandPool(); void createVertexBuffer(); void createIndexBuffer(); + void createUniformBuffers(); void createCommandBuffers(); void createSyncObjects(); @@ -123,4 +138,6 @@ class Application { vk::Buffer& dstBuffer, const vk::DeviceSize& size ); + + void updateUniformBuffer(uint32_t currentImage); }; From 8e24c003997899c355e3b93ca1566e1c8a296560 Mon Sep 17 00:00:00 2001 From: Michael Pacheco Date: Fri, 24 Nov 2023 12:40:09 -0300 Subject: [PATCH 088/129] docs(linux): create descriptor pool and sets README.md --- README.md | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index 0a7495a..1c84526 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# Linux ❘ Uniform buffers ❘ Descriptor layout and buffer +# Linux ❘ Uniform buffers ❘ Descriptor pool and sets Summary [here](https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/tree/linux-summary). @@ -7,13 +7,13 @@ Summary [here](https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/tree/lin # Navigation [🌐 Original tutorial]( -https://docs.vulkan.org/tutorial/latest/05_Uniform_buffers/00_Descriptor_set_layout_and_buffer.html) +https://docs.vulkan.org/tutorial/latest/05_Uniform_buffers/01_Descriptor_pool_and_sets.html) -[⏮ Vertex buffers / Index buffer]( -https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/tree/linux/03-vertex-buffers/04-index-buffer) +[⏮ Uniform buffers / Descriptor layout and buffer]( +https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/tree/linux/04-uniform-buffers/01-descriptor-layout-and-buffer) -[⏭ Uniform buffers / Descriptor pool and sets]( -https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/tree/linux/04-uniform-buffers/02-descriptor-pool-and-sets) +[⏭ Texture mapping / Images]( +https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/tree/linux/05-texture-mapping/01-images) [🔄 Diff from previous step]( -https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/compare/linux/03-vertex-buffers/04-index-buffer...linux/04-uniform-buffers/01-descriptor-layout-and-buffer) +https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/compare/linux/04-uniform-buffers/01-descriptor-layout-and-buffer...linux/04-uniform-buffers/02-descriptor-pool-and-sets) From aa34ca5564011f3ced2671c96b3b51076680fb41 Mon Sep 17 00:00:00 2001 From: Michael Pacheco Date: Fri, 24 Nov 2023 13:20:10 -0300 Subject: [PATCH 089/129] feat(linux): create descriptor pool and sets --- src/Application.cpp | 59 +++++++++++++++++++++++++++++++++++++++++++-- src/Application.hpp | 11 ++++++--- 2 files changed, 65 insertions(+), 5 deletions(-) diff --git a/src/Application.cpp b/src/Application.cpp index 81973db..06c220d 100644 --- a/src/Application.cpp +++ b/src/Application.cpp @@ -60,6 +60,8 @@ void Application::initVulkan() { createVertexBuffer(); createIndexBuffer(); createUniformBuffers(); + createDescriptorPool(); + createDescriptorSets(); createCommandBuffers(); createSyncObjects(); } @@ -145,6 +147,8 @@ void Application::drawFrame() { void Application::cleanup() { cleanupSwapChain(); + m_device.destroy(m_descriptorPool); + for (size_t i = 0; i < Config::MAX_FRAMES_IN_FLIGHT; ++i) { m_device.destroy(m_inFlightFences[i]); m_device.destroy(m_renderFinishedSemaphores[i]); @@ -452,7 +456,7 @@ void Application::createGraphicsPipeline() { .setPolygonMode(vk::PolygonMode::eFill) .setLineWidth(1.0f) .setCullMode(vk::CullModeFlagBits::eBack) - .setFrontFace(vk::FrontFace::eClockwise) + .setFrontFace(vk::FrontFace::eCounterClockwise) .setDepthBiasEnable(vk::False); const auto multisampling = @@ -615,7 +619,7 @@ void Application::createUniformBuffers() { m_uniformBuffersMemory.resize(Config::MAX_FRAMES_IN_FLIGHT); m_uniformBuffersMapped.resize(Config::MAX_FRAMES_IN_FLIGHT); - for (size_t i = 0; i < Config::MAX_FRAMES_IN_FLIGHT; i++) { + for (size_t i = 0; i < Config::MAX_FRAMES_IN_FLIGHT; ++i) { createBuffer( bufferSize, vk::BufferUsageFlagBits::eUniformBuffer, @@ -630,6 +634,50 @@ void Application::createUniformBuffers() { } } +void Application::createDescriptorPool() { + vk::DescriptorPoolSize poolSize; + poolSize.type = vk::DescriptorType::eUniformBuffer; + poolSize.descriptorCount = + static_cast(Config::MAX_FRAMES_IN_FLIGHT); + + vk::DescriptorPoolCreateInfo poolInfo; + poolInfo.setPoolSizes(poolSize); + poolInfo.maxSets = static_cast(Config::MAX_FRAMES_IN_FLIGHT); + + m_descriptorPool = m_device.createDescriptorPool(poolInfo); +} + +void Application::createDescriptorSets() { + const uint8_t framesInFlight = Config::MAX_FRAMES_IN_FLIGHT; + + std::vector layouts( + framesInFlight, m_descriptorSetLayout + ); + + vk::DescriptorSetAllocateInfo allocInfo; + allocInfo.descriptorPool = m_descriptorPool; + allocInfo.setSetLayouts(layouts); + + m_descriptorSets = m_device.allocateDescriptorSets(allocInfo); + + for (size_t i = 0; i < framesInFlight; ++i) { + vk::DescriptorBufferInfo bufferInfo; + bufferInfo.buffer = m_uniformBuffers[i]; + bufferInfo.offset = 0; + bufferInfo.range = sizeof(UniformBufferObject); + + vk::WriteDescriptorSet descriptorWrite; + descriptorWrite.dstSet = m_descriptorSets[i]; + descriptorWrite.dstBinding = 0; + descriptorWrite.dstArrayElement = 0; + descriptorWrite.descriptorType = vk::DescriptorType::eUniformBuffer; + descriptorWrite.descriptorCount = 1; + descriptorWrite.setBufferInfo(bufferInfo); + + m_device.updateDescriptorSets(descriptorWrite, {}); + } +} + void Application::createCommandBuffers() { m_commandBuffers.resize(Config::MAX_FRAMES_IN_FLIGHT); @@ -802,6 +850,13 @@ void Application::recordCommandBuffer( commandBuffer.setScissor(0, scissor); commandBuffer.bindVertexBuffers(0, m_vertexBuffer, {0}); commandBuffer.bindIndexBuffer(m_indexBuffer, 0, vk::IndexType::eUint16); + commandBuffer.bindDescriptorSets( + vk::PipelineBindPoint::eGraphics, + m_pipelineLayout, + 0, + m_descriptorSets[m_currentFrame], + {} + ); commandBuffer.drawIndexed(static_cast(INDICES.size()), 1, 0, 0, 0); commandBuffer.endRenderPass(); commandBuffer.end(); diff --git a/src/Application.hpp b/src/Application.hpp index d82be49..94e3803 100644 --- a/src/Application.hpp +++ b/src/Application.hpp @@ -21,9 +21,9 @@ class Application { }; struct UniformBufferObject { - glm::mat4 model{}; - glm::mat4 view{}; - glm::mat4 proj{}; + alignas(16) glm::mat4 model{}; + alignas(16) glm::mat4 view{}; + alignas(16) glm::mat4 proj{}; }; public: @@ -58,6 +58,9 @@ class Application { std::vector m_uniformBuffersMemory; std::vector m_uniformBuffersMapped; + vk::DescriptorPool m_descriptorPool; + std::vector m_descriptorSets; + std::vector m_commandBuffers; // Destroyed by command pool std::vector m_imageAvailableSemaphores; std::vector m_renderFinishedSemaphores; @@ -88,6 +91,8 @@ class Application { void createVertexBuffer(); void createIndexBuffer(); void createUniformBuffers(); + void createDescriptorPool(); + void createDescriptorSets(); void createCommandBuffers(); void createSyncObjects(); From 3d4278ccba4de9e3e975ba17450999e66120067a Mon Sep 17 00:00:00 2001 From: Michael Pacheco Date: Fri, 24 Nov 2023 13:26:26 -0300 Subject: [PATCH 090/129] docs(linux): add descriptor pool and sets navigation link to linux summary branch --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 2c8439a..48967bf 100644 --- a/README.md +++ b/README.md @@ -43,3 +43,4 @@ and current step. * [Staging buffer](https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/tree/linux/03-vertex-buffers/03-staging-buffer) * [Index buffer](https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/tree/linux/03-vertex-buffers/04-index-buffer) * [Descriptor layout and buffer](https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/tree/linux/04-uniform-buffers/01-descriptor-layout-and-buffer) + * [Descriptor pool and sets](https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/tree/linux/04-uniform-buffers/02-descriptor-pool-and-sets) From 50add820c16c17f9aebd328f5b9c2ef2a0035169 Mon Sep 17 00:00:00 2001 From: Michael Pacheco Date: Fri, 24 Nov 2023 18:55:19 -0300 Subject: [PATCH 091/129] feat(linux): load texture image --- CMakeLists.txt | 16 +++ README.md | 14 +-- res/textures/texture.jpg | Bin 0 -> 77120 bytes src/Application.cpp | 238 +++++++++++++++++++++++++++++++++++---- src/Application.hpp | 31 +++++ 5 files changed, 271 insertions(+), 28 deletions(-) create mode 100644 res/textures/texture.jpg diff --git a/CMakeLists.txt b/CMakeLists.txt index f2a2408..2ec4b47 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -100,6 +100,22 @@ if (NOT spdlog_POPULATED) add_subdirectory(${spdlog_SOURCE_DIR} ${spdlog_BINARY_DIR}) endif () +##################################### STB ###################################### +FetchContent_Declare( + stb + GIT_REPOSITORY https://github.com/nothings/stb.git + GIT_TAG master +) + +add_compile_definitions(STB_IMAGE_IMPLEMENTATION) + +FetchContent_GetProperties(stb) +if (NOT stb_POPULATED) + FetchContent_Populate(stb) +endif () + +target_include_directories(KhronosVulkanTutorialHpp PRIVATE ${stb_SOURCE_DIR}) + ############################ End of dependencies ############################### target_link_libraries(KhronosVulkanTutorialHpp diff --git a/README.md b/README.md index 1c84526..4f50de8 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# Linux ❘ Uniform buffers ❘ Descriptor pool and sets +# Linux ❘ Texture mapping ❘ Images Summary [here](https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/tree/linux-summary). @@ -7,13 +7,13 @@ Summary [here](https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/tree/lin # Navigation [🌐 Original tutorial]( -https://docs.vulkan.org/tutorial/latest/05_Uniform_buffers/01_Descriptor_pool_and_sets.html) +https://docs.vulkan.org/tutorial/latest/06_Texture_mapping/00_Images.html) -[⏮ Uniform buffers / Descriptor layout and buffer]( -https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/tree/linux/04-uniform-buffers/01-descriptor-layout-and-buffer) +[⏮ Uniform buffers / Descriptor pool and sets]( +https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/tree/linux/04-uniform-buffers/02-descriptor-pool-and-sets) -[⏭ Texture mapping / Images]( -https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/tree/linux/05-texture-mapping/01-images) +[⏭ Texture mapping / Image view and sampler]( +https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/tree/linux/05-texture-mapping/02-image-view-and-sampler) [🔄 Diff from previous step]( -https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/compare/linux/04-uniform-buffers/01-descriptor-layout-and-buffer...linux/04-uniform-buffers/02-descriptor-pool-and-sets) +https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/compare/linux/04-uniform-buffers/02-descriptor-pool-and-sets...linux/05-texture-mapping/01-images) diff --git a/res/textures/texture.jpg b/res/textures/texture.jpg new file mode 100644 index 0000000000000000000000000000000000000000..975e3380e5a5068c05cb7dd1f168667bd9b69c0a GIT binary patch literal 77120 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

4a`?w~g ziFTZhzP|M1^ELtc8X3H{!u4v)7BqP`4=tNJ7darVGlPInsiVY} z&8&D?m6?`C7*iP=vPWI4F`VRJkBaRGn^6E=E30Y&MWj>zc{0bidVF|f06u;#eN>EmE_tgCzhf!W}4Dx z>p{^Pb{@~Zm|C0X^HIE3rf0l=Q)N(Z%8%7}S!KfsYG_Njd7MiD-oe_XL zR5CphNs5K$sX8Ma2Q%WKc`33<%|i0ws&0;$z;umKyqwcodWGf1NxWdqK-Bd$6CtM# z1y<)QqF7U!ky|xg9-fEgs#_SeSW}Ets{DFYaB)&lWhnP8B%7*5YznHfZK+mF&|xT+ zQcP5-B~=n+RIy3MD!Ghh63}XTwN_WDcU2imC54lkl_bqo4b43y#RgJ}E-cji)kT|{ zl^=BnJgJrhn5QFDNi8b398hNBOdpQ47viJeNLbKMDjq;~+TV4!KT7=w(C=eU3FtQv z+WEKg+ed9~*C1^DsyOxEz-_VEpgIC|->jdB4dYym%i{*o;*^>M!nXex;k+3teYa zxRUa1QT2Fov1Y(+QWOIrFoNT5{I=pV!NY9aI+(9pO4641%d^=uL1T_fr@W2Tff!N| z$WnwI{{S%Ak%dsIxEeN*ZzRyzUs}6c?mJ|;WLXJDA9h|DNB{r_EuE!~a5}4PH&4)Q zgqIGo-(5-OfYGe09!X$OWP~6cp?Q220|(_llT?+D=%bv9%TUy(x0=S*+7`at=)~K! zyZ&NjSD60uA(M@yfD{}66mt@I!L*yw*0-11mAl(X0G$o}mA{$`Czm`iZ-L|vvJ>VZ zP^Wh13;bo6i_5wDgaMww?@@3+B>c zk5*-kEp6_se$@@Ga0^7M^ELx*G7uTc1Gp(BoMgFf%G~8)Tb~4YavO&6HKviH%d$Al zq%g^Oc8MRCxq?mQ`5<|qm0TcTLble&mj2ON=Zv)71l(ELO{D2i%7g9KHW!x=OpM66 zjC}D)DLWS`%eUtF3BWzCk8N(efA-Z+9meggTtjUf7R({?R#yR}i^z$jo=h}ohEI@i zS(j>+;=UsIX5&rp{F*+Mef_0lq99mrWq^65nUR*_=M5n;7E^*_P3_LoK?8W(ce$lB z?sNVD@m0Qw;~gscO-}M?H4BB7817{;4bQoLNEyG@Dcl3@Rt>Q7GN;(C^~v|5ExNTy~5xH$(fx=5tTqx5V;`% zY?8z{)4WqQd))6ePZis1TBOij9WU)x=X{oJbgbD3q%d}J!lU<=bUhANTg`j zYW&AJ89a{I{VUXpxt+@(F;KW+#wipnybl{HkaLg+T=k`9WI)?kj^k}V$yq?h-uJE4 zI+M&aJ4rIJ%7i%sHD*^?;$_@-5x%&SATBRPLbM~2Sm3GG) zWB|pBq0a1#4W&pt@(3X3IRjo>8T(7@W%$1Bd_SQ*^t+~OH)h=6;Z%aBJ5=CpCnPC2 z&H+3e8`ReI3)`JPM%J{wKIS$O?}FhknmH6nn2a)VyN<#bw|?Jrb{e&_YC2@m#MbX5 z$W!;jD0u2X#(6%YgT;B>kBaPK)FamP+y4OV1-d`k6EsjFyb=xGUz+&bK~SS1lmZ&n^ASGG?GVeeQ1d!8R3KZDmMoKv4DWEByuY*-qt-*(j8;_ zO2bstJh2M>s>{d$8*(n?UBEbCc9!f^;QY9^bsvd*Nvy+rZ+UAC)v0xmtEx>S#>6yc zC77<$86c{%eeOuBS|7uxb?Izm)h&MAB#|E>VU00s0-y_>vN3Ut5DPKD;FFMfCn+|R zQ`5iv0mdt4WzXVWW5Tyinv6P@p3cTUHVEZthddleT0D{I8W2J1I_&A1*1dKkRi8_~ zhEKb3v&+xai3lgZ0DEV*p?oL(owcuwx@C>UzOmumF2~IqZ?&nJBb7l4RybonXkekE zC5n{Gugo$t`W^cpe!zbS{3qax9a(%oXX0&oHs21hcW_?TM^eZ?0;tD001yW);;nYiQo2@>)=PUEeX@(jw_AwL z2q5oAZ!8W8Bm>4l1CuoTNX(-3j9T;m0D*7F`7Bq3SrvEtxXPdSU+B|67VcJCLy04i zI0xn!;-G7c`q%81ui?)I{C&}Pf5f9*vx;MF<{|;NXr3!3P8y`%DiO zWmvSGD$%>>-Jjxo4rSr?dxC9M!^x%AKJxX_@9#!An>7>7QM~&{rZ~Z=?FjYid%*6BnSFZdr{e%7@{7jPGL8G>tV{pD_ z+HPfyLMa&xRJb@lpS5}T?AHr~SHx6N`Rn&?eFjy-IgUU5){~O&vishjiQ_X%P(1jr zvh6?Mn0i%?nPu4)$=&Cp$u*~qLP<^_tzBRLy$&zX$i5(Y^1Uk84{o&)e#gQL4| z3(2jEdBVNkq+(`so_5AvLw~@PhX7~q1M--zJixce-^Zx)N?{Gd8<}*p+Dn=e! zxA(Pb1gD|g!|rbHjsVX=&MLp` zv+(c58hYG+!WH1Mt(J-b;rmVQy+iIucajwS)mG`o?zO}J01*z2^`idu{zs;~DyX)^ zFZ>1n0Gasu^Yhl2XUVVA{a^M9_+#UH1-`TJ{hM0qQ4?s|Y-Qn47zUGkPMb%}0NtIt zPsrcH=YJCa0N|1O9MCP+fqijr8)TGQvg!sh7zajU-;KwNbIo^93 zCZ>#5(KzI_CXbU-0lJ~LiKJ@Kj={kDwE2?Uk7Fq-q*uWdQhFG;mPDEFQUjW*9;8V!YKY}! zq>~1p=3=V{%{^OapvF-wiE=6NzSC8d)3;`WH%zo8=A31~s;e&)zHZUpgFj|TB!!Z` z)BT^pz-V~AuVYrjZXp#%8$daNsMj=?L?@S>5TzK2kbANWSr?F4%St^}7ES$420zFT>W9kGlYbISZb9zysSN%WWK&)GZ}mo8~m z9pL`}2EWYp`zv+QCApSO_flHNBHBgv$3=|+`;tfl4Z{!jK|5J^Bw%UyMBeM#X|pkE zk8IY`7u1)^yqJc4pT6Eg$fM=kjE#!9G6oARD{Tp{Z6mXLi|3lx&7E?yOXY6>DU7VI zxT5kMh%6iB$u3uWN6<#2tE@Vm)t;%UZC@##++6*bs4)45_jo&uQs;7l9312*TKsNp zAJVL?XL+b;7q-?iEVrvZL6L+}`QVnoE9cSngwx1o;aE0YM<{0aq-|pEP%6$GPJ^ zFW0<8-Z8kb(PY%_waE#^fxSrMR$^859PDS>U3W27Il&+V6&H>*MxR25OVu?ET1oWw zGEZ#@g<|_tHsa1MH?)Hdg>txkvX$Jak?Xo$itATWYT8bpqv%%l8H(cm>dEZx+xKb` zINm@IfH14GI96oJ`+#lNp7=o9g@cq%`{}JlRGw9;EHk}~c<+dGTdxazO1|*( zUTRU@UX$g^E8;lRf};fE_pyC7I`u6-26l zzSJa!Uy}>a4cXkg$47Sb?aRW{$250WD!zC~7AYBm zghpoC+sIG=JHNa_jux}T;v)}sB+5$1%)hiB?8$wl*vaAzF5OZqShrqUg-Cp?bixO3 zo9`9~c8$5hf&uYcaUextxGXtRKdpYMct^mEZhV%L%#F6Jshz;#K-h9Q>5_4rlh6PM zgZ|W?@K1j-;%#feI(^5TIB9M)$m87}a5Lrel_&eSBPaNHt@8ZUU)k3AKl3@=RP;VF zP#)2|#oV|#T=n*;Z1Fnn*vfIvMsQE9TJbl7FFX~lOQvd;bLp4eTH4`Eaxc&xdsH^^ zM{gO4bMkd0o(4GE>)2P*!YQkwWmJ-AL^19iaxgmqn#t9*Nlm*fUo?twpHB6ASDWm1 zZzR()g$iAp0Dwv7^z^P?>&F(RMvrIjnR2;PoR!GuxE;^7eJi3A&UsXA=t(@!DsGxZ zjN_fm6jd@s!N%r~X#{0S1o47#*n9V??W^1B7xF_j+#hLSmWj8dk&(#8)g%qO&PN~) z!z4@L4~0HB@urNo`Y(p{OUSRCBD1)fCWa}%1AomU#-|-{A3rc0RaCD|n!MUbl@`jH zhm6-x9#bnb!dn{?b1QAeaNBsvIL{n%LFt`$@e5DXE=`+7=G{rYP{_|Db0Ihx3;;$0 ztYrx3LpRK8+5Qp#0Kq@?e-ovauj0=UX}%fL{?f4hr6QK`F5XUlMnYgQoPGZQv~1)N zkhmV<;V<|nZ^KsoTp85t`2M zkA%Ei@nger*}?Q^JE`GgINs;yFO7U1ty^nL9+#l_ zt3~k*l%@|ZO*!LjiU-dAVur@T1{<+ZLCtjj5Ac_YelBQMx_n+6*EICKmN=!>B(oOK zMJjH?M&u-Mw;*j&K2pE}*sst(iOn~OENpa3ZD&-5;_6suwvO_7ri$K2SeX?J{KxW@ z0}>1nz^-$*!E~4|JYDfF<3-bN{5yMa=+})jn(ea0pd7j}0ETofT%wj-ENA zFqKCdICS)C_x`@?rgq`-{5y{{=WeIe-?De?;h=cW;BST3#0{uwlW1Cd*hs%?k*}S^ z#iWsnvH2B*YQ9GV1MZ zdfTVsWr)H~Qst!FmqmVurhHHRqy7`x_@++`c$3B2Wv;KPBEdGDs$E9W1bG?!i8|Y% zf0{B$0mA@UvZU!->Joe|_+t8RhjiF=sr142Yim6){{Ux1Hh>m1F4F_@scphX-OG0^ zUK_0Zc=%0ue`|Sp@aMxi)}`Ut)_XhKy#~?+xSYwsv}p^fjyC|#4jDFNjiYnIf3}W^ z;wGERvtJHvRFmwXqC}BMW>UUbeZ)GFM&XU0Fi^uik;Twlsm*Jy`e<|gMzyY>^s&?Y z9{r?sUx^Z3TDONaofBWv;EFe!QHE<;gfs8ie^H0ZL+Oqch#cFgP5J|6DOKcts3%dbv z63!G7ceyGeO0jIW&9rrY0)J{Y@jce1Ypbr2ZLTO}lJeF_ZQ{9Ixm9A)hLTW3 z#494F%BLWlh^LIh&R)$szxZ#@q0v(VS~2#VwqMuG?7kyK9k#sI>*7ro&tJM(CBD#< zSlry}(S!tfkug_Okmo8h^0&+vcGui#)^@tIcDG&~(C;m6;%`3o#R9{3l^ngk%p{^P z4*c#63aB<3-{3INUV zKZ*4(4)|GaFEwim9Y8Z(!Ed9(HrXIJY{-{P@(9eWj1>+_uGKAod+_mde7$>qx){op zt@)I{Xita!6Zn_oDD=HcMYyxEk~Op%o||QC&E}vEhXGo7Fr{(?kOp3Xhb{BRgg;~p z4-!k~3*ACnd6G#W0u_x4D*z;E6`yjEkT#A;IXyRh9bvEBO*?8D-Ml(}iFa!9NIdg3 z|+D=ivAA?ZwTsD_q+7|Xu+N6<1rs>CZy~~xsFEbY0?X`C9 zRSK=aY@Odlg3K{kZ{bvu^lsmF$C-@D@EEIoW{hX*lYf=Seh7RQ@OOc=r_)BCrRq{i zaMD0Lz_MD#0<&!r5Z-3Y<##&`u0vq0dIgrfaBh~~5Vz3WZMaRB=ZIKtSltiK>4T9W zBa^@kE1I?N<*$k_VYsukH#&{Yn29I*M3+}gw*z^}knl1|`LMWVTnrptm*Iw|;z_>4 z4EK62lF~3fLYb~eF#N&5Pmy_Xwl!4eDszQAwI?c*bEzx0-0OunK`28+x@?C@Hjk{_ zFOw~&+bqhPnSfIz$ITnE`HG-4n^*#f$0*D;9;wiH2UXMbUxvDM{4X0rHO9+9b#`Lh zHv7-a@iQ|SztTsBx7g&TI(x5KXyTxi}2 zx@|sKE?US%0xWPeo>@@eJE?4(p0VW!P&va4XB7IFN|u*Lsa)wXc$#SzYa20hZWd)W z`h>fqkg1Kw2&0diYkH_SQUR#tic5K}mQvR-$NRmp=P~@F8Dq(loMawB83zE4Z@`+< z>e|$8sZDJUiL65{#CA`-G%WElFbr~6VyHOe7b7ErdP%<13&!^s8~lU-`DKJ;U~UCY zdSLpHGt(s1dYIdx_`g5zTR-GfA~y7?qmz2)fm1FSdv)wO*Ysp$(fpfJ4yUOM5SKN2 z3ni3N#SZ*cgk7KT9@KkAOmJy#Td=Z4+s{6=r5q|2vtYQ|YTS2wM_;|^S+?2R2*NS4 zL++qc{35e%pd7OLRm+*d9e%Y+>TI9A_q$fqTTJt@(1Ti{qk2KVEo|0tHXDF6c>B3yp3ne%?7k@9|!ASY5xGhKAzpa47IPFG9~sAA z@+|)Vx0mXEso@_o&Yi!KUz$FM@b7`{g`^%_Q9~oYn<1S>#WH1O7Fgk8Ju(L4orgGJNC4zu5dQ#%(XWZL`=yc_*zIJQnniYX zoh5cz9axYthshvk0{~zE2JXAzYlOIu>@5o2av51qml|$T=W8+K@JYyH$jQkE@amGY zKc;!LvCL|Q^4i?KTE;tnoxH7)`OL>8lA*UTAgRg55y(Oq6{{$RMbH}SP|#N5$p_kF z`wV-VYmj%uRX%kt#fboh8E|%jwA*VNUlV*ovA)vot?u;Ob-7Elv{@Qi@ACr0GT*up z#~gPXfG3|U>})RHs`kR>-rRXsDYZn@zXEFZqCRocB7>LIsEJx-D1cg)*K;AQ+Ysc2Q0%)+>>rvY2dOIIB zC~kbHm=*aL#u8QwwQ!~S#?mNMP#vq+^(gLb2imVWSV4AK&zO1Lg+D72qjLoxFks|u z$RKc@D~j{SFzR-?0@;6QOp0%!J42Hm7^pIXBYdX=0}9N)Fa(9D_bM{ze0g#EH|gFv z{h(u&?5EM9&~4?_Zf&Nz#CK?}qB!DzB_b$Tl1c_btQQ-LZu&F!cJNbAYpB@69kq;1 ze93L%C<@F@*$XNGou)jfWKo=s0opkahCc}WacSaz5m>FI#+#$xWiJxa!EKWDT3Hmk zfweLhrsg9UI7JJ)=?{T_0X1C{!}0$BYTn;X3rFR(tXF%Z2r>XsvLK@zkT~a%#BQps zTkPD@bre<0-U;|$4v(YTz^x?7Z6c{q`&HWjXKE0t!>9uQ9N}>LYtuX};E>U)!Ed(& zGMS%qDd(xl8@l9zdiLpBnorq$Kc~lUvQ5i~l{4lX5r9~p{k!$3@4ROwo2^F`vX8RG z610f0mph%dh6f{ZjGh!8xjie6?dr}cRg|8Fj+^18f+&_ivhK)dE3^^F>DwF;*SBid zy4I~Ug;bJdj!6gCAY*YKO#ZdV>6+Zyq_ZrCbdj(?@v82N?(v+msp*vigU&nD_V+OO ziPy`T697XiV2Kh{WEmSt8;%bLk;`Y$*2?I{QP)z>i~IxOzl(ZOKE2`nHvTPvL*LmX zl0=6b?mVdPkVY|{)#duH>i9l8k-zZ?) zm6fq3N{**HPenXMNPH4#aZdKR=k`CaC&8@}NhFWL^UWXcrII=IYt6R|a^$up2Xhh0 zA+i|plDl=Zf7wgnZ-pK^`(Fk4T`g8TF}c&Do@G~cF|hLiDhMpNBX>?g9PHV}sNQN4 zH1d6;N`YgFE7ccrJ2R z53qrf%mWM$n5;_|USAZS-px6D%ibFBJ&nGl_E>yBqv`q!!W!Je8V8ku`9Y0T4j1^h z9J6Bw8;xHP_$J;s^w?mA9VR<>Pqs}HFPzA|7v>{yB(V)DxWH^7a*VQD__FC&%es?n zkuia%518_;fyUko14vHQ_?JnO`M6Y#%_^(IYoO}y45(C%Gewz*e=((L`&j8@Xfkw}PGvr3DxRmn^S zAlSOl^$!VKEx(4!#JXGz!$#7~0NMv>00h&a`RmjjmBh& zLbwo*Et$6*ou>pg;0|)9{H3an%bV^qEg`#>_9=g~CAZWT%^Ok>*oX+7(L%XtVsh!Z z3h>1Jz;_jD!nyF9c#c`5k#00!5KU$!OQuLBVF&qQAR9B7or{PwNx-|YS)&3sq*81+HER$_Sg6=nw=8%aB znATzfp>n%^W#EwIlzj=}-xgTi_=m$`FRiWYq*?DS1hCGnC`APtHvzo46`$ophG4B1 z%2?yhe`=qMmc9u1X>Y5xn;xy@L!B|8E>zAH=}5}g}egKRn#MnD+^6I_d2b? z{qK|k`4RUB_w+BcoN>M(_$rqEIl0pG+y4L#>sk%GFDy6qaz$+<5UZ358J1RMX%aQX#+`E{_r=5|WD?H0Bp-Wt1 zy_N54eztb|k5da;t9GF6eLMbp8J8M1rQz*irnuESC8R?Q(j&|p?F}I>{;fr_PWa0< zaB`=DLHTO~S<>{~H{t_A-YBw{ONuYv+}P;slEwiAqGf4glq;&R+#ft;hH$l`;@=-@ z9t+SkKkTb(d&Z7K1=8GH8=vg>M)g!iDdq^&z7c5UIs<+E>Tl4Qrng?tD?NX@BsRYF81*WYbt# z#Splh6p0wK1gSHi8$=XIn=ZW;~Q{rWVX*Sk6Zisy0Jo;9T<$aC=fxTpPj|M{6 zVnG}X02mVAOO#<1c-|6fE2Bv}-_!GK^D$NVWofN_bpF2Mf$+`Mlo}npce?4keM!F8 zr)k$$G2K{NP0B30Fc*GUsAUX;5@&Gbdo3s7E}^LEmhYwN*H_YA-TAlMB-=E(TqfxO z`4L%JPy&h==jKpB>a^d5LqoD(Hc@fqub%PTI8iYnR}5ntW5@t1h51*WLX3Lng?<)k z>)}}AnQrwBI`M7M;aNPkoj@bZkf~9?XJQ5va!_wLKUGRGp$=Mqe{;vgVlS&WKLvan z);whlc5+8=WufW&qO-VZR#+zsz}kp+`C-+U2WI3W8OC3y({H>t@XqED;*CmeLg=Kk z$M&R+5JsC!m@0|_W%p+TqU4?#w*Dk|lTdZ>H*0rs8g6LlvC5rO-QX8_ao?}K}wpeizY*T{1Zt{2sA-0U1 zzAw1pl$+evlj8NC#m^PrX*Sn(nriuRy{vZeEVITojjb#0XjryMR97rx8^QU;E?Iak z8_9&yUTPPYX6f!w-^NNrcV*TzEQUT=lt|-u8R%Oyoo4aAr>4!N$z!Nkt1ZGrY+QYt zbc1BEINlwCHqZ{$2Xk&+m2T_7`i6jYA#pY1!+C7@w~l@l@D@)eZq`=k}XCRO`uIEAVZH=anZmicA3(*+E=Y>5!X%nlH@|^Ry z@thi|ePGwNkl!Q4ESJv99h(6hQ$z|c8;BTPgzye`0gg^;GLkAXYesqX&%)0=ZN{bj zrL1Z3T-&?b%W)!tPs*gS4ekafZO+8xu1Ex$-LTQL`wt0fFwE znO_l^4jJ(q0HUb0JKg3D# zL9}~+59$(I!*a_Os1Mq#$yiC5$;_ + #include #include #include @@ -57,6 +59,7 @@ void Application::initVulkan() { createGraphicsPipeline(); createFrameBuffers(); createCommandPool(); + createTextureImage(); createVertexBuffer(); createIndexBuffer(); createUniformBuffers(); @@ -166,6 +169,9 @@ void Application::cleanup() { m_device.destroy(m_vertexBuffer); m_device.free(m_vertexBufferMemory); + m_device.free(m_textureImageMemory); + m_device.destroy(m_textureImage); + m_device.destroy(m_commandPool); m_device.destroy(m_graphicsPipeline); m_device.destroy(m_pipelineLayout); @@ -544,6 +550,72 @@ void Application::createCommandPool() { m_commandPool = m_device.createCommandPool(poolInfo); } +void Application::createTextureImage() { + int texWidth, texHeight, texChannels; + stbi_uc* pixels = stbi_load( + "res/textures/texture.jpg", + &texWidth, + &texHeight, + &texChannels, + STBI_rgb_alpha + ); + vk::DeviceSize imageSize = texWidth * texHeight * 4; + + if (!pixels) { + throw std::runtime_error("failed to load texture image!"); + } + + vk::Buffer stagingBuffer; + vk::DeviceMemory stagingBufferMemory; + createBuffer( + imageSize, + vk::BufferUsageFlagBits::eTransferSrc, + vk::MemoryPropertyFlagBits::eHostVisible | + vk::MemoryPropertyFlagBits::eHostCoherent, + stagingBuffer, + stagingBufferMemory + ); + + void* data = m_device.mapMemory(stagingBufferMemory, 0, imageSize); + memcpy(data, pixels, static_cast(imageSize)); + m_device.unmapMemory(stagingBufferMemory); + + stbi_image_free(pixels); + + createImage( + texWidth, + texHeight, + vk::Format::eR8G8B8A8Srgb, + vk::ImageTiling::eOptimal, + vk::ImageUsageFlagBits::eTransferDst | vk::ImageUsageFlagBits::eSampled, + vk::MemoryPropertyFlagBits::eDeviceLocal, + m_textureImage, + m_textureImageMemory + ); + + transitionImageLayout( + m_textureImage, + vk::Format::eR8G8B8A8Srgb, + vk::ImageLayout::eUndefined, + vk::ImageLayout::eTransferDstOptimal + ); + copyBufferToImage( + stagingBuffer, + m_textureImage, + static_cast(texWidth), + static_cast(texHeight) + ); + transitionImageLayout( + m_textureImage, + vk::Format::eR8G8B8A8Srgb, + vk::ImageLayout::eTransferDstOptimal, + vk::ImageLayout::eShaderReadOnlyOptimal + ); + + m_device.destroy(stagingBuffer); + m_device.free(stagingBufferMemory); +} + void Application::createVertexBuffer() { size_t bufferSize = sizeof(VERTICES[0]) * VERTICES.size(); @@ -910,33 +982,14 @@ void Application::copyBuffer( vk::Buffer& dstBuffer, const vk::DeviceSize& size ) { - vk::CommandBufferAllocateInfo allocInfo; - allocInfo.level = vk::CommandBufferLevel::ePrimary; - allocInfo.commandPool = m_commandPool; - allocInfo.commandBufferCount = 1; - - vk::CommandBuffer commandBuffer; - commandBuffer = m_device.allocateCommandBuffers(allocInfo)[0]; - - vk::CommandBufferBeginInfo beginInfo; - beginInfo.flags = vk::CommandBufferUsageFlagBits::eOneTimeSubmit; - - commandBuffer.begin(beginInfo); + vk::CommandBuffer commandBuffer = beginSingleTimeCommands(); vk::BufferCopy copyRegion; copyRegion.size = size; commandBuffer.copyBuffer(srcBuffer, dstBuffer, 1, ©Region); - commandBuffer.end(); - - vk::SubmitInfo submitInfo; - submitInfo.setCommandBuffers(commandBuffer); - - m_graphicsQueue.submit(submitInfo, nullptr); - m_graphicsQueue.waitIdle(); - - m_device.freeCommandBuffers(m_commandPool, commandBuffer); + endSingleTimeCommands(commandBuffer); } void Application::updateUniformBuffer(uint32_t currentImage) { @@ -968,3 +1021,146 @@ void Application::updateUniformBuffer(uint32_t currentImage) { std::memcpy(m_uniformBuffersMapped[currentImage], &ubo, sizeof(ubo)); } + +void Application::createImage( + uint32_t width, + uint32_t height, + vk::Format format, + vk::ImageTiling tiling, + vk::ImageUsageFlags usage, + vk::MemoryPropertyFlags properties, + vk::Image& image, + vk::DeviceMemory& imageMemory +) { + vk::ImageCreateInfo imageInfo{}; + imageInfo.imageType = vk::ImageType::e2D; + imageInfo.extent.width = width; + imageInfo.extent.height = height; + imageInfo.extent.depth = 1; + imageInfo.mipLevels = 1; + imageInfo.arrayLayers = 1; + imageInfo.format = format; + imageInfo.tiling = tiling; + imageInfo.initialLayout = vk::ImageLayout::eUndefined; + imageInfo.usage = usage; + imageInfo.samples = vk::SampleCountFlagBits::e1; + imageInfo.sharingMode = vk::SharingMode::eExclusive; + + image = m_device.createImage(imageInfo); + + vk::MemoryRequirements memRequirements = + m_device.getImageMemoryRequirements(image); + + vk::MemoryAllocateInfo allocInfo{}; + allocInfo.allocationSize = memRequirements.size; + allocInfo.memoryTypeIndex = + findMemoryType(memRequirements.memoryTypeBits, properties); + + imageMemory = m_device.allocateMemory(allocInfo); + m_device.bindImageMemory(image, imageMemory, 0); +} + +void Application::transitionImageLayout( + vk::Image image, + vk::Format format, + vk::ImageLayout oldLayout, + vk::ImageLayout newLayout +) { + vk::CommandBuffer commandBuffer = beginSingleTimeCommands(); + + vk::ImageMemoryBarrier barrier{}; + barrier.oldLayout = oldLayout; + barrier.newLayout = newLayout; + barrier.srcQueueFamilyIndex = vk::QueueFamilyIgnored; + barrier.dstQueueFamilyIndex = vk::QueueFamilyIgnored; + barrier.image = image; + barrier.subresourceRange.aspectMask = vk::ImageAspectFlagBits::eColor; + barrier.subresourceRange.baseMipLevel = 0; + barrier.subresourceRange.levelCount = 1; + barrier.subresourceRange.baseArrayLayer = 0; + barrier.subresourceRange.layerCount = 1; + + vk::PipelineStageFlags sourceStage, destinationStage; + + if (oldLayout == vk::ImageLayout::eUndefined && + newLayout == vk::ImageLayout::eTransferDstOptimal) { + barrier.srcAccessMask = {}; + barrier.dstAccessMask = vk::AccessFlagBits::eTransferWrite; + + sourceStage = vk::PipelineStageFlagBits::eTopOfPipe; + destinationStage = vk::PipelineStageFlagBits::eTransfer; + } else if (oldLayout == vk::ImageLayout::eTransferDstOptimal && newLayout == vk::ImageLayout::eShaderReadOnlyOptimal) { + barrier.srcAccessMask = vk::AccessFlagBits::eTransferWrite; + barrier.dstAccessMask = vk::AccessFlagBits::eShaderRead; + + sourceStage = vk::PipelineStageFlagBits::eTransfer; + destinationStage = vk::PipelineStageFlagBits::eFragmentShader; + } else { + throw std::invalid_argument("unsupported layout transition!"); + } + + commandBuffer.pipelineBarrier( + sourceStage, + destinationStage, + vk::DependencyFlags(), + 0, + nullptr, + 0, + nullptr, + 1, + &barrier + ); + + endSingleTimeCommands(commandBuffer); +} + +void Application::copyBufferToImage( + vk::Buffer buffer, vk::Image image, uint32_t width, uint32_t height +) { + vk::CommandBuffer commandBuffer = beginSingleTimeCommands(); + + vk::BufferImageCopy region{}; + region.bufferOffset = 0; + region.bufferRowLength = 0; + region.bufferImageHeight = 0; + region.imageSubresource.aspectMask = vk::ImageAspectFlagBits::eColor; + region.imageSubresource.mipLevel = 0; + region.imageSubresource.baseArrayLayer = 0; + region.imageSubresource.layerCount = 1; + region.imageOffset = vk::Offset3D{0, 0, 0}; + region.imageExtent = vk::Extent3D{width, height, 1}; + + commandBuffer.copyBufferToImage( + buffer, image, vk::ImageLayout::eTransferDstOptimal, 1, ®ion + ); + + endSingleTimeCommands(commandBuffer); +} + +vk::CommandBuffer Application::beginSingleTimeCommands() { + vk::CommandBufferAllocateInfo allocInfo; + allocInfo.level = vk::CommandBufferLevel::ePrimary; + allocInfo.commandPool = m_commandPool; + allocInfo.commandBufferCount = 1; + + vk::CommandBuffer commandBuffer; + commandBuffer = m_device.allocateCommandBuffers(allocInfo)[0]; + + vk::CommandBufferBeginInfo beginInfo; + beginInfo.flags = vk::CommandBufferUsageFlagBits::eOneTimeSubmit; + + commandBuffer.begin(beginInfo); + return commandBuffer; +} + +void Application::endSingleTimeCommands(vk::CommandBuffer& commandBuffer) { + commandBuffer.end(); + + vk::SubmitInfo submitInfo; + submitInfo.setCommandBuffers(commandBuffer); + + m_graphicsQueue.submit(submitInfo, nullptr); + m_graphicsQueue.waitIdle(); + + m_device.freeCommandBuffers(m_commandPool, commandBuffer); +} diff --git a/src/Application.hpp b/src/Application.hpp index 94e3803..3dbcd41 100644 --- a/src/Application.hpp +++ b/src/Application.hpp @@ -49,6 +49,10 @@ class Application { vk::Pipeline m_graphicsPipeline; std::vector m_swapChainFrameBuffers; vk::CommandPool m_commandPool; + + vk::Image m_textureImage; + vk::DeviceMemory m_textureImageMemory; + vk::Buffer m_vertexBuffer; vk::DeviceMemory m_vertexBufferMemory; vk::Buffer m_indexBuffer; @@ -88,6 +92,7 @@ class Application { void createGraphicsPipeline(); void createFrameBuffers(); void createCommandPool(); + void createTextureImage(); void createVertexBuffer(); void createIndexBuffer(); void createUniformBuffers(); @@ -145,4 +150,30 @@ class Application { ); void updateUniformBuffer(uint32_t currentImage); + + void createImage( + uint32_t width, + uint32_t height, + vk::Format format, + vk::ImageTiling tiling, + vk::ImageUsageFlags usage, + vk::MemoryPropertyFlags properties, + vk::Image& image, + vk::DeviceMemory& imageMemory + ); + + void transitionImageLayout( + vk::Image image, + vk::Format format, + vk::ImageLayout oldLayout, + vk::ImageLayout newLayout + ); + + void copyBufferToImage( + vk::Buffer buffer, vk::Image image, uint32_t width, uint32_t height + ); + + vk::CommandBuffer beginSingleTimeCommands(); + + void endSingleTimeCommands(vk::CommandBuffer& commandBuffer); }; From 753f2cb112affc8595963291873b7ff80807e27a Mon Sep 17 00:00:00 2001 From: Michael Pacheco Date: Fri, 24 Nov 2023 19:21:12 -0300 Subject: [PATCH 092/129] refactor(linux): use `vk::ImageCreateInfo` fluent API --- src/Application.cpp | 30 +++++++++++++++++------------- 1 file changed, 17 insertions(+), 13 deletions(-) diff --git a/src/Application.cpp b/src/Application.cpp index 103ea20..2fece88 100644 --- a/src/Application.cpp +++ b/src/Application.cpp @@ -552,6 +552,7 @@ void Application::createCommandPool() { void Application::createTextureImage() { int texWidth, texHeight, texChannels; + stbi_uc* pixels = stbi_load( "res/textures/texture.jpg", &texWidth, @@ -559,6 +560,7 @@ void Application::createTextureImage() { &texChannels, STBI_rgb_alpha ); + vk::DeviceSize imageSize = texWidth * texHeight * 4; if (!pixels) { @@ -567,6 +569,7 @@ void Application::createTextureImage() { vk::Buffer stagingBuffer; vk::DeviceMemory stagingBufferMemory; + createBuffer( imageSize, vk::BufferUsageFlagBits::eTransferSrc, @@ -599,12 +602,14 @@ void Application::createTextureImage() { vk::ImageLayout::eUndefined, vk::ImageLayout::eTransferDstOptimal ); + copyBufferToImage( stagingBuffer, m_textureImage, static_cast(texWidth), static_cast(texHeight) ); + transitionImageLayout( m_textureImage, vk::Format::eR8G8B8A8Srgb, @@ -1032,19 +1037,18 @@ void Application::createImage( vk::Image& image, vk::DeviceMemory& imageMemory ) { - vk::ImageCreateInfo imageInfo{}; - imageInfo.imageType = vk::ImageType::e2D; - imageInfo.extent.width = width; - imageInfo.extent.height = height; - imageInfo.extent.depth = 1; - imageInfo.mipLevels = 1; - imageInfo.arrayLayers = 1; - imageInfo.format = format; - imageInfo.tiling = tiling; - imageInfo.initialLayout = vk::ImageLayout::eUndefined; - imageInfo.usage = usage; - imageInfo.samples = vk::SampleCountFlagBits::e1; - imageInfo.sharingMode = vk::SharingMode::eExclusive; + const auto imageInfo = + vk::ImageCreateInfo() + .setImageType(vk::ImageType::e2D) + .setExtent({width, height, 1}) + .setMipLevels(1) + .setArrayLayers(1) + .setFormat(format) + .setTiling(tiling) + .setInitialLayout(vk::ImageLayout::eUndefined) + .setUsage(usage) + .setSamples(vk::SampleCountFlagBits::e1) + .setSharingMode(vk::SharingMode::eExclusive); image = m_device.createImage(imageInfo); From bc0d4e84572ea73b6a3da20add8c79103b1cfbd6 Mon Sep 17 00:00:00 2001 From: Michael Pacheco Date: Fri, 24 Nov 2023 21:42:50 -0300 Subject: [PATCH 093/129] docs(linux): add image texture mapping navigation link to linux summary branch --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index 48967bf..ee93e1a 100644 --- a/README.md +++ b/README.md @@ -44,3 +44,5 @@ and current step. * [Index buffer](https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/tree/linux/03-vertex-buffers/04-index-buffer) * [Descriptor layout and buffer](https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/tree/linux/04-uniform-buffers/01-descriptor-layout-and-buffer) * [Descriptor pool and sets](https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/tree/linux/04-uniform-buffers/02-descriptor-pool-and-sets) +* Texture mapping + * [Images](https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/tree/linux/05-texture-mapping/01-images) From 60517ef972f0741c4a753817c7d3fb8c3b853ea9 Mon Sep 17 00:00:00 2001 From: Michael Pacheco Date: Fri, 24 Nov 2023 22:12:25 -0300 Subject: [PATCH 094/129] feat(linux): add image view and sampler --- README.md | 14 +++++----- src/Application.cpp | 65 ++++++++++++++++++++++++++++++++++----------- src/Application.hpp | 7 +++++ 3 files changed, 63 insertions(+), 23 deletions(-) diff --git a/README.md b/README.md index 4f50de8..186ebca 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# Linux ❘ Texture mapping ❘ Images +# Linux ❘ Texture mapping ❘ Image view and sampler Summary [here](https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/tree/linux-summary). @@ -7,13 +7,13 @@ Summary [here](https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/tree/lin # Navigation [🌐 Original tutorial]( -https://docs.vulkan.org/tutorial/latest/06_Texture_mapping/00_Images.html) +https://docs.vulkan.org/tutorial/latest/06_Texture_mapping/01_Image_view_and_sampler.html) -[⏮ Uniform buffers / Descriptor pool and sets]( -https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/tree/linux/04-uniform-buffers/02-descriptor-pool-and-sets) +[⏮ Texture mapping / Images]( +https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/tree/linux/05-texture-mapping/01-images) -[⏭ Texture mapping / Image view and sampler]( -https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/tree/linux/05-texture-mapping/02-image-view-and-sampler) +[⏭ Texture mapping / Combined image sampler]( +https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/tree/linux/05-texture-mapping/03-combined-image-sampler) [🔄 Diff from previous step]( -https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/compare/linux/04-uniform-buffers/02-descriptor-pool-and-sets...linux/05-texture-mapping/01-images) +https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/compare/linux/05-texture-mapping/01-images...linux/05-texture-mapping/02-image-view-and-sampler) diff --git a/src/Application.cpp b/src/Application.cpp index 2fece88..85ad9d9 100644 --- a/src/Application.cpp +++ b/src/Application.cpp @@ -169,6 +169,9 @@ void Application::cleanup() { m_device.destroy(m_vertexBuffer); m_device.free(m_vertexBufferMemory); + m_device.destroy(textureSampler); + m_device.destroy(textureImageView); + m_device.free(m_textureImageMemory); m_device.destroy(m_textureImage); @@ -258,7 +261,9 @@ void Application::pickPhysicalDevice() { void Application::createLogicalDevice() { const auto indices = QueueFamily::findIndices(m_physicalDevice, m_surface); const auto queueCreateInfos = indices.getQueueCreateInfos(); + vk::PhysicalDeviceFeatures deviceFeatures; + deviceFeatures.samplerAnisotropy = vk::True; const auto deviceCreateInfo = vk::DeviceCreateInfo() @@ -343,21 +348,8 @@ void Application::createImageViews() { m_swapChainImageViews.resize(m_swapChainImages.size()); for (size_t i = 0; i < m_swapChainImages.size(); ++i) { - const auto createInfo = - vk::ImageViewCreateInfo() - .setImage(m_swapChainImages[i]) - .setViewType(vk::ImageViewType::e2D) - .setFormat(m_swapChainImageFormat) - .setSubresourceRange( - vk::ImageSubresourceRange() - .setAspectMask(vk::ImageAspectFlagBits::eColor) - .setBaseMipLevel(0) - .setLevelCount(1) - .setBaseArrayLayer(0) - .setLayerCount(1) - ); - - m_swapChainImageViews[i] = m_device.createImageView(createInfo); + m_swapChainImageViews[i] = + createImageView(m_swapChainImages[i], m_swapChainImageFormat); } } @@ -621,6 +613,30 @@ void Application::createTextureImage() { m_device.free(stagingBufferMemory); } +void Application::createTextureImageView() { + textureImageView = createImageView(m_textureImage, vk::Format::eR8G8B8A8Srgb); +} + +void Application::createTextureSampler() { + vk::PhysicalDeviceProperties properties = m_physicalDevice.getProperties(); + + vk::SamplerCreateInfo samplerInfo; + samplerInfo.magFilter = vk::Filter::eLinear; + samplerInfo.minFilter = vk::Filter::eLinear; + samplerInfo.addressModeU = vk::SamplerAddressMode::eRepeat; + samplerInfo.addressModeV = vk::SamplerAddressMode::eRepeat; + samplerInfo.addressModeW = vk::SamplerAddressMode::eRepeat; + samplerInfo.anisotropyEnable = vk::True; + samplerInfo.maxAnisotropy = properties.limits.maxSamplerAnisotropy; + samplerInfo.borderColor = vk::BorderColor::eIntOpaqueBlack; + samplerInfo.unnormalizedCoordinates = vk::False; + samplerInfo.compareEnable = vk::False; + samplerInfo.compareOp = vk::CompareOp::eAlways; + samplerInfo.mipmapMode = vk::SamplerMipmapMode::eLinear; + + textureSampler = m_device.createSampler(samplerInfo); +} + void Application::createVertexBuffer() { size_t bufferSize = sizeof(VERTICES[0]) * VERTICES.size(); @@ -796,7 +812,10 @@ bool Application::isDeviceSuitable(const vk::PhysicalDevice& device) const { ); } - return indices.isComplete() && extensionsSupported && suitableSwapChain; + vk::PhysicalDeviceFeatures supportedFeatures = device.getFeatures(); + + return indices.isComplete() && extensionsSupported && suitableSwapChain && + supportedFeatures.samplerAnisotropy; } bool Application::checkDeviceExtensionSupport(const vk::PhysicalDevice& device @@ -1168,3 +1187,17 @@ void Application::endSingleTimeCommands(vk::CommandBuffer& commandBuffer) { m_device.freeCommandBuffers(m_commandPool, commandBuffer); } + +vk::ImageView Application::createImageView(vk::Image image, vk::Format format) { + vk::ImageViewCreateInfo viewInfo; + viewInfo.image = image; + viewInfo.viewType = vk::ImageViewType::e2D; + viewInfo.format = format; + viewInfo.subresourceRange.aspectMask = vk::ImageAspectFlagBits::eColor; + viewInfo.subresourceRange.baseMipLevel = 0; + viewInfo.subresourceRange.levelCount = 1; + viewInfo.subresourceRange.baseArrayLayer = 0; + viewInfo.subresourceRange.layerCount = 1; + + return m_device.createImageView(viewInfo); +} diff --git a/src/Application.hpp b/src/Application.hpp index 3dbcd41..a5917e0 100644 --- a/src/Application.hpp +++ b/src/Application.hpp @@ -52,6 +52,9 @@ class Application { vk::Image m_textureImage; vk::DeviceMemory m_textureImageMemory; + vk::ImageView textureImageView; + vk::Sampler textureSampler; + vk::Buffer m_vertexBuffer; vk::DeviceMemory m_vertexBufferMemory; @@ -93,6 +96,8 @@ class Application { void createFrameBuffers(); void createCommandPool(); void createTextureImage(); + void createTextureImageView(); + void createTextureSampler(); void createVertexBuffer(); void createIndexBuffer(); void createUniformBuffers(); @@ -176,4 +181,6 @@ class Application { vk::CommandBuffer beginSingleTimeCommands(); void endSingleTimeCommands(vk::CommandBuffer& commandBuffer); + + vk::ImageView createImageView(vk::Image image, vk::Format format); }; From 563f30c7bd090f32c0f39f288a140eece2042ccc Mon Sep 17 00:00:00 2001 From: Michael Pacheco Date: Fri, 24 Nov 2023 22:13:32 -0300 Subject: [PATCH 095/129] docs(linux): add image view and sampler navigation link to linux summary branch --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index ee93e1a..8564685 100644 --- a/README.md +++ b/README.md @@ -46,3 +46,4 @@ and current step. * [Descriptor pool and sets](https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/tree/linux/04-uniform-buffers/02-descriptor-pool-and-sets) * Texture mapping * [Images](https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/tree/linux/05-texture-mapping/01-images) + * [Image view and sampler](https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/tree/linux/05-texture-mapping/02-image-view-and-sampler) From 7d976cc68e98658e7861d4e74622e900dca28ea5 Mon Sep 17 00:00:00 2001 From: Michael Pacheco Date: Fri, 24 Nov 2023 22:59:20 -0300 Subject: [PATCH 096/129] feat(linux): add combined image sampler --- README.md | 4 +-- res/shaders/shader.frag | 5 ++- res/shaders/shader.vert | 3 ++ src/Application.cpp | 77 ++++++++++++++++++++++++++++++----------- src/Vertex.cpp | 9 +++-- src/Vertex.hpp | 3 +- 6 files changed, 74 insertions(+), 27 deletions(-) diff --git a/README.md b/README.md index 186ebca..1a4d31d 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# Linux ❘ Texture mapping ❘ Image view and sampler +# Linux ❘ Texture mapping ❘ Combined image sampler Summary [here](https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/tree/linux-summary). @@ -7,7 +7,7 @@ Summary [here](https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/tree/lin # Navigation [🌐 Original tutorial]( -https://docs.vulkan.org/tutorial/latest/06_Texture_mapping/01_Image_view_and_sampler.html) +https://docs.vulkan.org/tutorial/latest/06_Texture_mapping/02_Combined_image_sampler.html) [⏮ Texture mapping / Images]( https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/tree/linux/05-texture-mapping/01-images) diff --git a/res/shaders/shader.frag b/res/shaders/shader.frag index 9a7d092..3bbbbb6 100644 --- a/res/shaders/shader.frag +++ b/res/shaders/shader.frag @@ -1,9 +1,12 @@ #version 450 +layout (binding = 1) uniform sampler2D texSampler; + layout (location = 0) in vec3 fragColor; +layout (location = 1) in vec2 fragTexCoord; layout (location = 0) out vec4 outColor; void main() { - outColor = vec4(fragColor, 1.0); + outColor = texture(texSampler, fragTexCoord); } diff --git a/res/shaders/shader.vert b/res/shaders/shader.vert index f931ea1..c0329be 100644 --- a/res/shaders/shader.vert +++ b/res/shaders/shader.vert @@ -8,10 +8,13 @@ layout (binding = 0) uniform UniformBufferObject { layout (location = 0) in vec2 inPosition; layout (location = 1) in vec3 inColor; +layout (location = 2) in vec2 inTexCoord; layout (location = 0) out vec3 fragColor; +layout (location = 1) out vec2 fragTexCoord; void main() { gl_Position = ubo.proj * ubo.view * ubo.model * vec4(inPosition, 0.0, 1.0); fragColor = inColor; + fragTexCoord = inTexCoord; } diff --git a/src/Application.cpp b/src/Application.cpp index 85ad9d9..2560b11 100644 --- a/src/Application.cpp +++ b/src/Application.cpp @@ -18,10 +18,11 @@ constexpr auto NO_TIMEOUT = std::numeric_limits::max(); const std::vector VERTICES = { - {{-0.5f, -0.5f}, {1.0f, 0.0f, 0.0f}}, - {{0.5f, -0.5f}, {0.0f, 1.0f, 0.0f}}, - {{0.5f, 0.5f}, {0.0f, 0.0f, 1.0f}}, - {{-0.5f, 0.5f}, {1.0f, 1.0f, 1.0f}}}; + {{-0.5f, -0.5f}, {1.0f, 0.0f, 0.0f}, {1.0f, 0.0f}}, + {{0.5f, -0.5f}, {0.0f, 1.0f, 0.0f}, {0.0f, 0.0f}}, + {{0.5f, 0.5f}, {0.0f, 0.0f, 1.0f}, {0.0f, 1.0f}}, + {{-0.5f, 0.5f}, {1.0f, 1.0f, 1.0f}, {1.0f, 1.0f}}}; + const std::vector INDICES = {0, 1, 2, 2, 3, 0}; @@ -60,6 +61,8 @@ void Application::initVulkan() { createFrameBuffers(); createCommandPool(); createTextureImage(); + createTextureImageView(); + createTextureSampler(); createVertexBuffer(); createIndexBuffer(); createUniformBuffers(); @@ -401,8 +404,18 @@ void Application::createDescriptorSetLayout() { .setDescriptorType(vk::DescriptorType::eUniformBuffer) .setStageFlags(vk::ShaderStageFlagBits::eVertex); + const auto samplerLayoutBinding = + vk::DescriptorSetLayoutBinding() + .setBinding(1) + .setDescriptorCount(1) + .setDescriptorType(vk::DescriptorType::eCombinedImageSampler) + .setStageFlags(vk::ShaderStageFlagBits::eFragment); + + + std::array bindings = {uboLayoutBinding, samplerLayoutBinding}; + vk::DescriptorSetLayoutCreateInfo layoutInfo; - layoutInfo.setBindings(uboLayoutBinding); + layoutInfo.setBindings(bindings); m_descriptorSetLayout = m_device.createDescriptorSetLayout(layoutInfo); } @@ -728,14 +741,21 @@ void Application::createUniformBuffers() { } void Application::createDescriptorPool() { - vk::DescriptorPoolSize poolSize; - poolSize.type = vk::DescriptorType::eUniformBuffer; - poolSize.descriptorCount = + const auto maxFramesInFlight = static_cast(Config::MAX_FRAMES_IN_FLIGHT); + std::array poolSizes; + + poolSizes[0].type = vk::DescriptorType::eUniformBuffer; + poolSizes[0].descriptorCount = maxFramesInFlight; + + poolSizes[1].type = vk::DescriptorType::eCombinedImageSampler; + poolSizes[1].descriptorCount = maxFramesInFlight; + + vk::DescriptorPoolCreateInfo poolInfo; - poolInfo.setPoolSizes(poolSize); - poolInfo.maxSets = static_cast(Config::MAX_FRAMES_IN_FLIGHT); + poolInfo.setPoolSizes(poolSizes); + poolInfo.maxSets = maxFramesInFlight; m_descriptorPool = m_device.createDescriptorPool(poolInfo); } @@ -759,15 +779,30 @@ void Application::createDescriptorSets() { bufferInfo.offset = 0; bufferInfo.range = sizeof(UniformBufferObject); - vk::WriteDescriptorSet descriptorWrite; - descriptorWrite.dstSet = m_descriptorSets[i]; - descriptorWrite.dstBinding = 0; - descriptorWrite.dstArrayElement = 0; - descriptorWrite.descriptorType = vk::DescriptorType::eUniformBuffer; - descriptorWrite.descriptorCount = 1; - descriptorWrite.setBufferInfo(bufferInfo); + vk::DescriptorImageInfo imageInfo; + imageInfo.imageLayout = vk::ImageLayout::eShaderReadOnlyOptimal; + imageInfo.imageView = textureImageView; + imageInfo.sampler = textureSampler; + + std::array descriptorWrites; + + descriptorWrites[0].dstSet = m_descriptorSets[i]; + descriptorWrites[0].dstBinding = 0; + descriptorWrites[0].dstArrayElement = 0; + descriptorWrites[0].descriptorType = vk::DescriptorType::eUniformBuffer; + descriptorWrites[0].descriptorCount = 1; + descriptorWrites[0].pBufferInfo = &bufferInfo; - m_device.updateDescriptorSets(descriptorWrite, {}); + descriptorWrites[1].dstSet = m_descriptorSets[i]; + descriptorWrites[1].dstBinding = 1; + descriptorWrites[1].dstArrayElement = 0; + descriptorWrites[1].descriptorType = + vk::DescriptorType::eCombinedImageSampler; + descriptorWrites[1].descriptorCount = 1; + descriptorWrites[1].pImageInfo = &imageInfo; + + + m_device.updateDescriptorSets(descriptorWrites, {}); } } @@ -1074,7 +1109,7 @@ void Application::createImage( vk::MemoryRequirements memRequirements = m_device.getImageMemoryRequirements(image); - vk::MemoryAllocateInfo allocInfo{}; + vk::MemoryAllocateInfo allocInfo; allocInfo.allocationSize = memRequirements.size; allocInfo.memoryTypeIndex = findMemoryType(memRequirements.memoryTypeBits, properties); @@ -1091,7 +1126,7 @@ void Application::transitionImageLayout( ) { vk::CommandBuffer commandBuffer = beginSingleTimeCommands(); - vk::ImageMemoryBarrier barrier{}; + vk::ImageMemoryBarrier barrier; barrier.oldLayout = oldLayout; barrier.newLayout = newLayout; barrier.srcQueueFamilyIndex = vk::QueueFamilyIgnored; @@ -1142,7 +1177,7 @@ void Application::copyBufferToImage( ) { vk::CommandBuffer commandBuffer = beginSingleTimeCommands(); - vk::BufferImageCopy region{}; + vk::BufferImageCopy region; region.bufferOffset = 0; region.bufferRowLength = 0; region.bufferImageHeight = 0; diff --git a/src/Vertex.cpp b/src/Vertex.cpp index 5a3f687..e7d3925 100644 --- a/src/Vertex.cpp +++ b/src/Vertex.cpp @@ -8,9 +8,9 @@ vk::VertexInputBindingDescription Vertex::getBindingDescription() { return bindingDescription; } -std::array +std::array Vertex::getAttributeDescriptions() { - std::array attributeDescriptions{}; + std::array attributeDescriptions{}; attributeDescriptions[0].binding = 0; attributeDescriptions[0].location = 0; @@ -22,5 +22,10 @@ Vertex::getAttributeDescriptions() { attributeDescriptions[1].format = vk::Format::eR32G32B32Sfloat; attributeDescriptions[1].offset = offsetof(Vertex, color); + attributeDescriptions[2].binding = 0; + attributeDescriptions[2].location = 2; + attributeDescriptions[2].format = vk::Format::eR32G32Sfloat; + attributeDescriptions[2].offset = offsetof(Vertex, texCoord); + return attributeDescriptions; } diff --git a/src/Vertex.hpp b/src/Vertex.hpp index 05f3891..4391927 100644 --- a/src/Vertex.hpp +++ b/src/Vertex.hpp @@ -7,9 +7,10 @@ struct Vertex { glm::vec2 pos; glm::vec3 color; + glm::vec2 texCoord; static vk::VertexInputBindingDescription getBindingDescription(); - static std::array + static std::array getAttributeDescriptions(); }; From f60897cbce034dbd909059d8535d6caa0133311a Mon Sep 17 00:00:00 2001 From: Michael Pacheco Date: Fri, 24 Nov 2023 23:05:49 -0300 Subject: [PATCH 097/129] refactor(linux): improve code readability --- src/Application.cpp | 33 ++++++++++++++++----------------- src/Vertex.cpp | 29 ++++++++++++++++------------- 2 files changed, 32 insertions(+), 30 deletions(-) diff --git a/src/Application.cpp b/src/Application.cpp index 2560b11..c4a5727 100644 --- a/src/Application.cpp +++ b/src/Application.cpp @@ -784,23 +784,22 @@ void Application::createDescriptorSets() { imageInfo.imageView = textureImageView; imageInfo.sampler = textureSampler; - std::array descriptorWrites; - - descriptorWrites[0].dstSet = m_descriptorSets[i]; - descriptorWrites[0].dstBinding = 0; - descriptorWrites[0].dstArrayElement = 0; - descriptorWrites[0].descriptorType = vk::DescriptorType::eUniformBuffer; - descriptorWrites[0].descriptorCount = 1; - descriptorWrites[0].pBufferInfo = &bufferInfo; - - descriptorWrites[1].dstSet = m_descriptorSets[i]; - descriptorWrites[1].dstBinding = 1; - descriptorWrites[1].dstArrayElement = 0; - descriptorWrites[1].descriptorType = - vk::DescriptorType::eCombinedImageSampler; - descriptorWrites[1].descriptorCount = 1; - descriptorWrites[1].pImageInfo = &imageInfo; - + const std::array descriptorWrites{ + vk::WriteDescriptorSet() + .setDstSet(m_descriptorSets[i]) + .setDstBinding(0) + .setDstArrayElement(0) + .setDescriptorType(vk::DescriptorType::eUniformBuffer) + .setDescriptorCount(1) + .setPBufferInfo(&bufferInfo), + + vk::WriteDescriptorSet() + .setDstSet(m_descriptorSets[i]) + .setDstBinding(1) + .setDstArrayElement(0) + .setDescriptorType(vk::DescriptorType::eCombinedImageSampler) + .setDescriptorCount(1) + .setPImageInfo(&imageInfo)}; m_device.updateDescriptorSets(descriptorWrites, {}); } diff --git a/src/Vertex.cpp b/src/Vertex.cpp index e7d3925..26a37a1 100644 --- a/src/Vertex.cpp +++ b/src/Vertex.cpp @@ -10,22 +10,25 @@ vk::VertexInputBindingDescription Vertex::getBindingDescription() { std::array Vertex::getAttributeDescriptions() { - std::array attributeDescriptions{}; + const std::array attributeDescriptions{ + vk::VertexInputAttributeDescription() + .setBinding(0) + .setLocation(0) + .setFormat(vk::Format::eR32G32Sfloat) + .setOffset(offsetof(Vertex, pos)), - attributeDescriptions[0].binding = 0; - attributeDescriptions[0].location = 0; - attributeDescriptions[0].format = vk::Format::eR32G32Sfloat; - attributeDescriptions[0].offset = offsetof(Vertex, pos); + vk::VertexInputAttributeDescription() + .setBinding(0) + .setLocation(1) + .setFormat(vk::Format::eR32G32B32Sfloat) + .setOffset(offsetof(Vertex, color)), - attributeDescriptions[1].binding = 0; - attributeDescriptions[1].location = 1; - attributeDescriptions[1].format = vk::Format::eR32G32B32Sfloat; - attributeDescriptions[1].offset = offsetof(Vertex, color); + vk::VertexInputAttributeDescription() + .setBinding(0) + .setLocation(2) + .setFormat(vk::Format::eR32G32Sfloat) + .setOffset(offsetof(Vertex, texCoord))}; - attributeDescriptions[2].binding = 0; - attributeDescriptions[2].location = 2; - attributeDescriptions[2].format = vk::Format::eR32G32Sfloat; - attributeDescriptions[2].offset = offsetof(Vertex, texCoord); return attributeDescriptions; } From ec38bc81796b6fa9874567f79f0edb8bb797508d Mon Sep 17 00:00:00 2001 From: Michael Pacheco Date: Fri, 24 Nov 2023 23:07:44 -0300 Subject: [PATCH 098/129] docs(linux): add combined image sampler branch navigation links to README.md --- README.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 1a4d31d..6a52ab6 100644 --- a/README.md +++ b/README.md @@ -9,11 +9,11 @@ Summary [here](https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/tree/lin [🌐 Original tutorial]( https://docs.vulkan.org/tutorial/latest/06_Texture_mapping/02_Combined_image_sampler.html) -[⏮ Texture mapping / Images]( -https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/tree/linux/05-texture-mapping/01-images) +[⏮ Texture mapping / Image view and sampler]( +https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/tree/linux/05-texture-mapping/02-image-view-and-sampler) -[⏭ Texture mapping / Combined image sampler]( -https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/tree/linux/05-texture-mapping/03-combined-image-sampler) +[⏭ Depth buffering]( +https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/tree/linux/06-depth-buffering) [🔄 Diff from previous step]( -https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/compare/linux/05-texture-mapping/01-images...linux/05-texture-mapping/02-image-view-and-sampler) +https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/compare/linux/05-texture-mapping/02-image-view-and-sampler...linux/05-texture-mapping/03-combined-image-sampler) From 14dbd8c2b204c5294e81680ac658fd6e5d4670cd Mon Sep 17 00:00:00 2001 From: Michael Pacheco Date: Sat, 25 Nov 2023 11:38:26 -0300 Subject: [PATCH 099/129] docs(linux): add combined image sampler navigation link to linux summary branch --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 8564685..1ab79e0 100644 --- a/README.md +++ b/README.md @@ -47,3 +47,4 @@ and current step. * Texture mapping * [Images](https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/tree/linux/05-texture-mapping/01-images) * [Image view and sampler](https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/tree/linux/05-texture-mapping/02-image-view-and-sampler) + * [Combined image sampler](https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/tree/linux/05-texture-mapping/03-combined-image-sampler) From c7a06d086afd3cde118fd3129530b0a7ad56f58f Mon Sep 17 00:00:00 2001 From: Michael Pacheco Date: Sat, 25 Nov 2023 11:41:35 -0300 Subject: [PATCH 100/129] docs(linux): add depth buffering navigation links to README.md --- README.md | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index 6a52ab6..6aef742 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# Linux ❘ Texture mapping ❘ Combined image sampler +# Linux ❘ Texture mapping ❘ Depth buffering Summary [here](https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/tree/linux-summary). @@ -7,13 +7,13 @@ Summary [here](https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/tree/lin # Navigation [🌐 Original tutorial]( -https://docs.vulkan.org/tutorial/latest/06_Texture_mapping/02_Combined_image_sampler.html) +https://docs.vulkan.org/tutorial/latest/07_Depth_buffering.html) -[⏮ Texture mapping / Image view and sampler]( -https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/tree/linux/05-texture-mapping/02-image-view-and-sampler) +[⏮ Texture mapping / Combined image sampler]( +https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/tree/linux/05-texture-mapping/03-combined-image-sampler) -[⏭ Depth buffering]( -https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/tree/linux/06-depth-buffering) +[⏭ Loading models]( +https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/tree/linux/07-loading-models) [🔄 Diff from previous step]( -https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/compare/linux/05-texture-mapping/02-image-view-and-sampler...linux/05-texture-mapping/03-combined-image-sampler) +https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/compare/linux/05-texture-mapping/03-combined-image-sampler...linux/06-depth-buffering) From 584a4b9c576a072227912bd04a63c03b6da16abb Mon Sep 17 00:00:00 2001 From: Michael Pacheco Date: Sat, 25 Nov 2023 13:19:28 -0300 Subject: [PATCH 101/129] feat(linux): add depth test --- res/shaders/shader.vert | 4 +- src/Application.cpp | 200 +++++++++++++++++++++++++++++++++------- src/Application.hpp | 19 +++- src/Vertex.cpp | 2 +- src/Vertex.hpp | 2 +- 5 files changed, 186 insertions(+), 41 deletions(-) diff --git a/res/shaders/shader.vert b/res/shaders/shader.vert index c0329be..b5be891 100644 --- a/res/shaders/shader.vert +++ b/res/shaders/shader.vert @@ -6,7 +6,7 @@ layout (binding = 0) uniform UniformBufferObject { mat4 proj; } ubo; -layout (location = 0) in vec2 inPosition; +layout (location = 0) in vec3 inPosition; layout (location = 1) in vec3 inColor; layout (location = 2) in vec2 inTexCoord; @@ -14,7 +14,7 @@ layout (location = 0) out vec3 fragColor; layout (location = 1) out vec2 fragTexCoord; void main() { - gl_Position = ubo.proj * ubo.view * ubo.model * vec4(inPosition, 0.0, 1.0); + gl_Position = ubo.proj * ubo.view * ubo.model * vec4(inPosition, 1.0); fragColor = inColor; fragTexCoord = inTexCoord; } diff --git a/src/Application.cpp b/src/Application.cpp index c4a5727..3f0e46e 100644 --- a/src/Application.cpp +++ b/src/Application.cpp @@ -18,13 +18,35 @@ constexpr auto NO_TIMEOUT = std::numeric_limits::max(); const std::vector VERTICES = { - {{-0.5f, -0.5f}, {1.0f, 0.0f, 0.0f}, {1.0f, 0.0f}}, - {{0.5f, -0.5f}, {0.0f, 1.0f, 0.0f}, {0.0f, 0.0f}}, - {{0.5f, 0.5f}, {0.0f, 0.0f, 1.0f}, {0.0f, 1.0f}}, - {{-0.5f, 0.5f}, {1.0f, 1.0f, 1.0f}, {1.0f, 1.0f}}}; - - -const std::vector INDICES = {0, 1, 2, 2, 3, 0}; + // Top face + {{-0.5f, -0.5f, 0.0f}, {1.0f, 0.0f, 0.0f}, {0.0f, 0.0f}}, + {{0.5f, -0.5f, 0.0f}, {0.0f, 1.0f, 0.0f}, {1.0f, 0.0f}}, + {{0.5f, 0.5f, 0.0f}, {0.0f, 0.0f, 1.0f}, {1.0f, 1.0f}}, + {{-0.5f, 0.5f, 0.0f}, {1.0f, 1.0f, 1.0f}, {0.0f, 1.0f}}, + + // Bottom face + {{-0.5f, -0.5f, -0.5f}, {1.0f, 0.0f, 0.0f}, {0.0f, 0.0f}}, + {{0.5f, -0.5f, -0.5f}, {0.0f, 1.0f, 0.0f}, {1.0f, 0.0f}}, + {{0.5f, 0.5f, -0.5f}, {0.0f, 0.0f, 1.0f}, {1.0f, 1.0f}}, + {{-0.5f, 0.5f, -0.5f}, {1.0f, 1.0f, 1.0f}, {0.0f, 1.0f}}}; + + +const std::vector INDICES = { + // Top face + 0, + 1, + 2, + 2, + 3, + 0, + + // Bottom face + 4, + 5, + 6, + 6, + 7, + 4}; void Application::run() { initWindow(); @@ -58,8 +80,9 @@ void Application::initVulkan() { createRenderPass(); createDescriptorSetLayout(); createGraphicsPipeline(); - createFrameBuffers(); createCommandPool(); + createDepthResources(); + createFrameBuffers(); createTextureImage(); createTextureImageView(); createTextureSampler(); @@ -336,6 +359,12 @@ void Application::recreateSwapChain() { } void Application::cleanupSwapChain() { + // Depth resources freed out of creation order because it needs to be + // freed at swap chain recreation + m_device.destroy(depthImageView); + m_device.destroy(depthImage); + m_device.free(depthImageMemory); + for (const auto& frameBuffer : m_swapChainFrameBuffers) { m_device.destroy(frameBuffer); } @@ -351,8 +380,11 @@ void Application::createImageViews() { m_swapChainImageViews.resize(m_swapChainImages.size()); for (size_t i = 0; i < m_swapChainImages.size(); ++i) { - m_swapChainImageViews[i] = - createImageView(m_swapChainImages[i], m_swapChainImageFormat); + m_swapChainImageViews[i] = createImageView( + m_swapChainImages[i], + m_swapChainImageFormat, + vk::ImageAspectFlagBits::eColor + ); } } @@ -368,28 +400,58 @@ void Application::createRenderPass() { .setInitialLayout(vk::ImageLayout::eUndefined) .setFinalLayout(vk::ImageLayout::ePresentSrcKHR); + const auto depthAttachment = + vk::AttachmentDescription() + .setFormat(findDepthFormat()) + .setSamples(vk::SampleCountFlagBits::e1) + .setLoadOp(vk::AttachmentLoadOp::eClear) + .setStoreOp(vk::AttachmentStoreOp::eDontCare) + .setStencilLoadOp(vk::AttachmentLoadOp::eDontCare) + .setStencilStoreOp(vk::AttachmentStoreOp::eDontCare) + .setInitialLayout(vk::ImageLayout::eUndefined) + .setFinalLayout(vk::ImageLayout::eDepthStencilAttachmentOptimal); + + const auto colorAttachmentRef = vk::AttachmentReference().setAttachment(0).setLayout( vk::ImageLayout::eColorAttachmentOptimal ); + const auto depthAttachmentRef = + vk::AttachmentReference().setAttachment(1).setLayout( + vk::ImageLayout::eDepthStencilAttachmentOptimal + ); + + const auto subPass = vk::SubpassDescription() .setPipelineBindPoint(vk::PipelineBindPoint::eGraphics) - .setColorAttachments(colorAttachmentRef); + .setColorAttachments(colorAttachmentRef) + .setPDepthStencilAttachment(&depthAttachmentRef); const auto dependency = vk::SubpassDependency() .setSrcSubpass(vk::SubpassExternal) .setDstSubpass(0) - .setSrcStageMask(vk::PipelineStageFlagBits::eColorAttachmentOutput) - .setSrcAccessMask({}) - .setDstStageMask(vk::PipelineStageFlagBits::eColorAttachmentOutput) - .setDstAccessMask(vk::AccessFlagBits::eColorAttachmentWrite); + .setSrcStageMask( + vk::PipelineStageFlagBits::eColorAttachmentOutput | + vk::PipelineStageFlagBits::eLateFragmentTests + ) + .setSrcAccessMask(vk::AccessFlagBits::eDepthStencilAttachmentWrite) + .setDstStageMask( + vk::PipelineStageFlagBits::eColorAttachmentOutput | + vk::PipelineStageFlagBits::eEarlyFragmentTests + ) + .setDstAccessMask( + vk::AccessFlagBits::eColorAttachmentWrite | + vk::AccessFlagBits::eDepthStencilAttachmentWrite + ); + + const auto attachments = {colorAttachment, depthAttachment}; const auto renderPassInfo = vk::RenderPassCreateInfo() - .setAttachments(colorAttachment) + .setAttachments(attachments) .setSubpasses(subPass) .setDependencies(dependency); @@ -475,6 +537,15 @@ void Application::createGraphicsPipeline() { .setSampleShadingEnable(vk::False) .setRasterizationSamples(vk::SampleCountFlagBits::e1); + const auto depthStencil = + vk::PipelineDepthStencilStateCreateInfo() + .setDepthTestEnable(vk::True) + .setDepthWriteEnable(vk::True) + .setDepthCompareOp(vk::CompareOp::eLess) + .setDepthBoundsTestEnable(vk::False) + .setStencilTestEnable(vk::False); + + const auto colorBlendAttachment = vk::PipelineColorBlendAttachmentState() .setColorWriteMask( @@ -509,6 +580,7 @@ void Application::createGraphicsPipeline() { .setPViewportState(&viewportState) .setPRasterizationState(&rasterizer) .setPMultisampleState(&multisampling) + .setPDepthStencilState(&depthStencil) .setPColorBlendState(&colorBlending) .setPDynamicState(&dynamicState) .setLayout(m_pipelineLayout) @@ -527,14 +599,46 @@ void Application::createGraphicsPipeline() { m_device.destroy(fragShaderModule); } +void Application::createCommandPool() { + const QueueFamily::Indices queueFamilyIndices = + QueueFamily::findIndices(m_physicalDevice, m_surface); + + const auto poolInfo = + vk::CommandPoolCreateInfo() + .setFlags(vk::CommandPoolCreateFlagBits::eResetCommandBuffer) + .setQueueFamilyIndex(queueFamilyIndices.graphicsFamily.value()); + + m_commandPool = m_device.createCommandPool(poolInfo); +} + +void Application::createDepthResources() { + vk::Format depthFormat = findDepthFormat(); + + createImage( + m_swapChainExtent.width, + m_swapChainExtent.height, + depthFormat, + vk::ImageTiling::eOptimal, + vk::ImageUsageFlagBits::eDepthStencilAttachment, + vk::MemoryPropertyFlagBits::eDeviceLocal, + depthImage, + depthImageMemory + ); + + depthImageView = + createImageView(depthImage, depthFormat, vk::ImageAspectFlagBits::eDepth); +} + void Application::createFrameBuffers() { m_swapChainFrameBuffers.resize(m_swapChainImageViews.size()); for (size_t i = 0; i < m_swapChainImageViews.size(); ++i) { + std::array attachments = {m_swapChainImageViews[i], depthImageView}; + const auto framebufferInfo = vk::FramebufferCreateInfo() .setRenderPass(m_renderPass) - .setAttachments(m_swapChainImageViews[i]) + .setAttachments(attachments) .setWidth(m_swapChainExtent.width) .setHeight(m_swapChainExtent.height) .setLayers(1); @@ -543,18 +647,6 @@ void Application::createFrameBuffers() { } } -void Application::createCommandPool() { - const QueueFamily::Indices& queueFamilyIndices = - QueueFamily::findIndices(m_physicalDevice, m_surface); - - const auto poolInfo = - vk::CommandPoolCreateInfo() - .setFlags(vk::CommandPoolCreateFlagBits::eResetCommandBuffer) - .setQueueFamilyIndex(queueFamilyIndices.graphicsFamily.value()); - - m_commandPool = m_device.createCommandPool(poolInfo); -} - void Application::createTextureImage() { int texWidth, texHeight, texChannels; @@ -627,7 +719,9 @@ void Application::createTextureImage() { } void Application::createTextureImageView() { - textureImageView = createImageView(m_textureImage, vk::Format::eR8G8B8A8Srgb); + textureImageView = createImageView( + m_textureImage, vk::Format::eR8G8B8A8Srgb, vk::ImageAspectFlagBits::eColor + ); } void Application::createTextureSampler() { @@ -947,16 +1041,18 @@ void Application::recordCommandBuffer( commandBuffer.begin(beginInfo); - vk::ClearValue clearColor{{0.0f, 0.0f, 0.0f, 1.0f}}; vk::Offset2D zeroOffset{0, 0}; + std::array clearValues{}; + clearValues[0].color = vk::ClearColorValue{0.0f, 0.0f, 0.0f, 1.0f}; + clearValues[1].depthStencil = vk::ClearDepthStencilValue{1.0f, 0}; + const auto renderPassInfo = vk::RenderPassBeginInfo() .setRenderPass(m_renderPass) .setFramebuffer(m_swapChainFrameBuffers[imageIndex]) .setRenderArea({zeroOffset, m_swapChainExtent}) - .setClearValueCount(1) - .setClearValues(clearColor); + .setClearValues(clearValues); commandBuffer.beginRenderPass(renderPassInfo, vk::SubpassContents::eInline); @@ -1222,12 +1318,14 @@ void Application::endSingleTimeCommands(vk::CommandBuffer& commandBuffer) { m_device.freeCommandBuffers(m_commandPool, commandBuffer); } -vk::ImageView Application::createImageView(vk::Image image, vk::Format format) { +vk::ImageView Application::createImageView( + vk::Image image, vk::Format format, vk::ImageAspectFlagBits aspectFlags +) { vk::ImageViewCreateInfo viewInfo; viewInfo.image = image; viewInfo.viewType = vk::ImageViewType::e2D; viewInfo.format = format; - viewInfo.subresourceRange.aspectMask = vk::ImageAspectFlagBits::eColor; + viewInfo.subresourceRange.aspectMask = aspectFlags; viewInfo.subresourceRange.baseMipLevel = 0; viewInfo.subresourceRange.levelCount = 1; viewInfo.subresourceRange.baseArrayLayer = 0; @@ -1235,3 +1333,35 @@ vk::ImageView Application::createImageView(vk::Image image, vk::Format format) { return m_device.createImageView(viewInfo); } + +vk::Format Application::findSupportedFormat( + const std::vector& candidates, + vk::ImageTiling tiling, + vk::FormatFeatureFlags features +) { + for (vk::Format format : candidates) { + vk::FormatProperties props = m_physicalDevice.getFormatProperties(format); + + if (tiling == vk::ImageTiling::eLinear && + (props.linearTilingFeatures & features) == features) { + return format; + } + + if (tiling == vk::ImageTiling::eOptimal && + (props.optimalTilingFeatures & features) == features) { + return format; + } + } + + throw std::runtime_error("Failed to find supported format"); +} + +vk::Format Application::findDepthFormat() { + return findSupportedFormat( + {vk::Format::eD32Sfloat, + vk::Format::eD32SfloatS8Uint, + vk::Format::eD24UnormS8Uint}, + vk::ImageTiling::eOptimal, + vk::FormatFeatureFlagBits::eDepthStencilAttachment + ); +} diff --git a/src/Application.hpp b/src/Application.hpp index a5917e0..48a8c60 100644 --- a/src/Application.hpp +++ b/src/Application.hpp @@ -50,6 +50,10 @@ class Application { std::vector m_swapChainFrameBuffers; vk::CommandPool m_commandPool; + vk::Image depthImage; + vk::DeviceMemory depthImageMemory; + vk::ImageView depthImageView; + vk::Image m_textureImage; vk::DeviceMemory m_textureImageMemory; vk::ImageView textureImageView; @@ -93,8 +97,9 @@ class Application { void createRenderPass(); void createDescriptorSetLayout(); void createGraphicsPipeline(); - void createFrameBuffers(); void createCommandPool(); + void createDepthResources(); + void createFrameBuffers(); void createTextureImage(); void createTextureImageView(); void createTextureSampler(); @@ -182,5 +187,15 @@ class Application { void endSingleTimeCommands(vk::CommandBuffer& commandBuffer); - vk::ImageView createImageView(vk::Image image, vk::Format format); + vk::ImageView createImageView( + vk::Image image, vk::Format format, vk::ImageAspectFlagBits aspectFlags + ); + + vk::Format findSupportedFormat( + const std::vector& candidates, + vk::ImageTiling tiling, + vk::FormatFeatureFlags features + ); + + vk::Format findDepthFormat(); }; diff --git a/src/Vertex.cpp b/src/Vertex.cpp index 26a37a1..0f8d28f 100644 --- a/src/Vertex.cpp +++ b/src/Vertex.cpp @@ -14,7 +14,7 @@ Vertex::getAttributeDescriptions() { vk::VertexInputAttributeDescription() .setBinding(0) .setLocation(0) - .setFormat(vk::Format::eR32G32Sfloat) + .setFormat(vk::Format::eR32G32B32Sfloat) .setOffset(offsetof(Vertex, pos)), vk::VertexInputAttributeDescription() diff --git a/src/Vertex.hpp b/src/Vertex.hpp index 4391927..1281eb3 100644 --- a/src/Vertex.hpp +++ b/src/Vertex.hpp @@ -5,7 +5,7 @@ #include struct Vertex { - glm::vec2 pos; + glm::vec3 pos; glm::vec3 color; glm::vec2 texCoord; From 442fa12ba278fe16201a6a41c11d20d6c5df87eb Mon Sep 17 00:00:00 2001 From: Michael Pacheco Date: Sat, 25 Nov 2023 13:46:06 -0300 Subject: [PATCH 102/129] docs(linux): add depth buffering navigation link to linux summary branch --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 1ab79e0..af0ba2b 100644 --- a/README.md +++ b/README.md @@ -48,3 +48,4 @@ and current step. * [Images](https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/tree/linux/05-texture-mapping/01-images) * [Image view and sampler](https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/tree/linux/05-texture-mapping/02-image-view-and-sampler) * [Combined image sampler](https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/tree/linux/05-texture-mapping/03-combined-image-sampler) +* [Depth buffering](https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/tree/linux/06-depth-buffering) From a40e4c681d06f334064b361139d254ed9c9d7e5d Mon Sep 17 00:00:00 2001 From: Michael Pacheco Date: Sat, 25 Nov 2023 15:29:59 -0300 Subject: [PATCH 103/129] feat(linux): load .obj model --- CMakeLists.txt | 26 + README.md | 14 +- res/models/viking_room.obj | 10945 +++++++++++++++++++++++++++++++++ res/textures/viking_room.png | Bin 0 -> 962052 bytes src/Application.cpp | 51 +- src/Application.hpp | 4 + src/ModelLoader.cpp | 62 + src/ModelLoader.hpp | 14 + src/Vertex.hpp | 5 + 9 files changed, 11076 insertions(+), 45 deletions(-) create mode 100644 res/models/viking_room.obj create mode 100644 res/textures/viking_room.png create mode 100644 src/ModelLoader.cpp create mode 100644 src/ModelLoader.hpp diff --git a/CMakeLists.txt b/CMakeLists.txt index 2ec4b47..e6241f7 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -21,8 +21,16 @@ set(SOURCES src/BinaryLoader.hpp src/Vertex.cpp src/Vertex.hpp + src/ModelLoader.cpp + src/ModelLoader.hpp ) +if (CMAKE_BUILD_TYPE STREQUAL "Release") + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -O2") +else () + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -O0") +endif () + add_compile_definitions(GLFW_VULKAN_STATIC) add_executable(KhronosVulkanTutorialHpp ${SOURCES}) @@ -64,6 +72,7 @@ endif () add_compile_definitions( GLM_FORCE_DEPTH_ZERO_TO_ONE GLM_FORCE_RADIANS + GLM_ENABLE_EXPERIMENTAL ) FetchContent_Declare( @@ -116,6 +125,23 @@ endif () target_include_directories(KhronosVulkanTutorialHpp PRIVATE ${stb_SOURCE_DIR}) +############################### tinyobjloader ################################## +add_compile_definitions(TINYOBJLOADER_IMPLEMENTATION) + +FetchContent_Declare( + tinyobjloader + GIT_REPOSITORY https://github.com/tinyobjloader/tinyobjloader.git + GIT_TAG release +) + +FetchContent_GetProperties(tinyobjloader) +if (NOT tinyobjloader_POPULATED) + FetchContent_Populate(tinyobjloader) + add_subdirectory(${tinyobjloader_SOURCE_DIR} ${tinyobjloader_BINARY_DIR}) +endif () + +target_link_libraries(KhronosVulkanTutorialHpp PRIVATE tinyobjloader) + ############################ End of dependencies ############################### target_link_libraries(KhronosVulkanTutorialHpp diff --git a/README.md b/README.md index 6aef742..7c09bb8 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# Linux ❘ Texture mapping ❘ Depth buffering +# Linux ❘ Texture mapping ❘ Loading models Summary [here](https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/tree/linux-summary). @@ -7,13 +7,13 @@ Summary [here](https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/tree/lin # Navigation [🌐 Original tutorial]( -https://docs.vulkan.org/tutorial/latest/07_Depth_buffering.html) +https://docs.vulkan.org/tutorial/latest/08_Loading_models.html) -[⏮ Texture mapping / Combined image sampler]( -https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/tree/linux/05-texture-mapping/03-combined-image-sampler) +[⏮ Depth buffering]( +https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/tree/linux/06-depth-buffering) -[⏭ Loading models]( -https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/tree/linux/07-loading-models) +[⏭ Generating Mipmaps]( +https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/tree/linux/08-generating-mipmaps) [🔄 Diff from previous step]( -https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/compare/linux/05-texture-mapping/03-combined-image-sampler...linux/06-depth-buffering) +https://github.com/Pacheco95/khronos-vulkan-tutorial-cpp/compare/linux/06-depth-buffering...linux/07-loading-models) diff --git a/res/models/viking_room.obj b/res/models/viking_room.obj new file mode 100644 index 0000000..a3b8d02 --- /dev/null +++ b/res/models/viking_room.obj @@ -0,0 +1,10945 @@ +# Blender 3.6.5 +# www.blender.org +mtllib untitled.mtl +o mesh_all1_Texture1_0 +v 0.573651 0.713748 0.001530 +v 0.573651 -0.000154 0.151382 +v 0.573651 0.619081 0.164474 +v 0.573651 0.629386 -0.172251 +v 0.573651 -0.000154 -0.158077 +v 0.321455 0.292965 -0.083704 +v 0.330610 0.325114 -0.076846 +v 0.321455 0.286187 -0.102605 +v 0.321455 0.314261 -0.139709 +v 0.321455 0.300642 -0.133254 +v 0.330610 0.347841 -0.116841 +v 0.353414 0.292965 -0.083704 +v 0.353414 0.286187 -0.102605 +v 0.344259 0.325114 -0.076846 +v 0.353414 0.314261 -0.139709 +v 0.344259 0.347841 -0.116841 +v 0.353414 0.300642 -0.133254 +v 0.337435 0.252007 -0.055125 +v 0.343555 0.266330 -0.059984 +v 0.331314 0.266330 -0.059984 +v 0.343555 0.326087 -0.162781 +v 0.337435 0.329128 -0.176479 +v 0.331314 0.326087 -0.162781 +v 0.380872 0.191148 -0.014709 +v 0.386786 0.190067 0.043401 +v 0.383829 0.165599 0.016847 +v 0.276384 0.191148 -0.008655 +v 0.279157 0.165599 0.016669 +v 0.281929 0.190067 0.036991 +v -0.532522 0.008346 0.273765 +v -0.540774 0.031466 0.354737 +v -0.467002 0.009207 0.246589 +v -0.595516 0.008721 0.256354 +v -0.690958 -0.003071 0.677146 +v -0.607800 -0.002071 0.646006 +v -0.638479 0.021070 0.592487 +v -0.253268 0.007915 0.306429 +v -0.298805 0.008946 0.266359 +v -0.268356 0.034153 0.370791 +v -0.184580 0.008489 0.289839 +v -0.221447 -0.003731 0.729652 +v -0.232895 0.014291 0.642290 +v -0.309542 -0.002732 0.688101 +v -0.741905 0.001923 -0.721043 +v -0.319177 0.001923 -0.223316 +v -0.319177 0.001923 -0.721043 +v 0.114645 0.001923 -0.721043 +v 0.114645 0.001923 -0.223316 +v 0.575491 0.001923 -0.721043 +v -0.741905 0.001923 0.739535 +v -0.319177 0.001923 0.739535 +v -0.319177 0.001923 0.188385 +v 0.575491 0.001923 0.739535 +v 0.114645 0.001923 0.188385 +v 0.114645 0.001923 0.739535 +v 0.411461 0.675560 0.212408 +v 0.411461 0.750638 0.209834 +v 0.411461 0.699099 0.170319 +v 0.411461 0.675616 -0.213822 +v 0.411461 0.699646 -0.173571 +v 0.411461 0.745240 -0.212562 +v 0.454846 0.486233 -0.024046 +v 0.445048 0.484215 -0.025567 +v 0.448282 0.507913 -0.023882 +v 0.452934 0.485221 0.011287 +v 0.446340 0.506886 0.012005 +v 0.442980 0.483121 0.012645 +v 0.465520 0.534670 0.007524 +v 0.461744 0.548021 0.007451 +v 0.452587 0.528738 0.009780 +v 0.466905 0.535403 -0.018078 +v 0.454235 0.529610 -0.020678 +v 0.463093 0.548734 -0.017464 +v 0.484932 0.560385 0.004695 +v 0.486844 0.573640 0.005319 +v 0.473494 0.563596 0.005911 +v 0.485945 0.560921 -0.014022 +v 0.474635 0.564200 -0.015181 +v 0.487893 0.574195 -0.014072 +v 0.520481 0.560873 0.004809 +v 0.531981 0.564167 0.006112 +v 0.517902 0.574299 0.005407 +v 0.521493 0.561408 -0.013890 +v 0.518949 0.574853 -0.013936 +v 0.533123 0.564771 -0.014989 +v 0.540070 0.535300 0.007789 +v 0.552785 0.529545 0.010139 +v 0.543663 0.548737 0.007734 +v 0.541457 0.536034 -0.017846 +v 0.545012 0.549451 -0.017201 +v 0.554436 0.530419 -0.020371 +v 0.552724 0.485913 0.011631 +v 0.562516 0.483901 0.013054 +v 0.559070 0.507808 0.012401 +v 0.554638 0.486925 -0.023732 +v 0.561014 0.508837 -0.023528 +v 0.564585 0.484996 -0.025189 +v 0.519142 0.487602 -0.071106 +v 0.484330 0.487579 -0.070382 +v 0.549653 0.487078 -0.054333 +v 0.521847 0.483541 0.058768 +v 0.456523 0.484043 0.042720 +v 0.487034 0.483518 0.059493 +v 0.373970 0.561430 0.352886 +v 0.372429 0.556986 0.349968 +v 0.370280 0.551648 0.350637 +v 0.376749 0.544444 0.448804 +v 0.395875 0.585830 0.438057 +v 0.385656 0.551520 0.358403 +v 0.409958 0.618384 0.416769 +v 0.424311 0.639710 0.368196 +v 0.416400 0.626770 0.342731 +v 0.418078 0.626391 0.308704 +v 0.403129 0.585444 0.274433 +v 0.384375 0.538006 0.266441 +v 0.373184 0.503630 0.283125 +v 0.358251 0.477395 0.303948 +v 0.358985 0.458250 0.343152 +v 0.351293 0.470936 0.400130 +v 0.361022 0.499096 0.435885 +v 0.392141 0.458736 -0.274407 +v 0.404246 0.449455 -0.280731 +v 0.381403 0.500104 -0.360558 +v 0.418947 0.449135 -0.286666 +v 0.432304 0.457863 -0.290620 +v 0.440738 0.473300 -0.291535 +v 0.441989 0.491309 -0.289165 +v 0.441989 0.491309 -0.289165 +v 0.435722 0.507065 -0.284146 +v 0.423617 0.516346 -0.277822 +v 0.408916 0.516665 -0.271888 +v 0.395559 0.507937 -0.267933 +v 0.387125 0.492501 -0.267019 +v 0.385874 0.474492 -0.269388 +v -0.245786 0.152919 -0.579001 +v -0.243482 0.144899 -0.544751 +v -0.222300 0.152919 -0.596550 +v -0.184260 0.144899 -0.556156 +v -0.161260 0.144899 -0.334844 +v -0.216432 0.144899 -0.328119 +v -0.183450 0.150074 -0.306128 +v -0.212467 0.150074 -0.309309 +v -0.188087 0.152919 -0.593086 +v -0.156860 0.150074 -0.315354 +v -0.119065 0.160294 -0.584458 +v -0.151411 0.160294 -0.590904 +v -0.116544 0.149178 -0.560137 +v -0.184027 0.149178 -0.554069 +v -0.186388 0.160294 -0.578329 +v -0.093980 0.149178 -0.351118 +v -0.117136 0.156351 -0.306193 +v -0.087578 0.156351 -0.319203 +v -0.161651 0.149178 -0.336739 +v -0.154635 0.156351 -0.305797 +v -0.118307 0.152700 -0.589580 +v -0.118340 0.144772 -0.572183 +v -0.086177 0.152700 -0.601870 +v -0.055611 0.144772 -0.565524 +v -0.037224 0.144772 -0.360889 +v -0.093361 0.144772 -0.344161 +v -0.058206 0.149888 -0.330401 +v -0.089083 0.149888 -0.325584 +v -0.063742 0.152700 -0.588814 +v -0.034755 0.149888 -0.344658 +v -0.125535 0.162553 -0.399860 +v -0.131949 0.159852 -0.397949 +v -0.129966 0.159384 -0.404947 +v -0.124083 0.163903 -0.406701 +v -0.129043 0.162553 -0.411630 +v -0.135457 0.159852 -0.409718 +v -0.136909 0.158502 -0.402877 +v -0.138796 0.183367 -0.395907 +v -0.132383 0.186068 -0.397819 +v -0.137874 0.186536 -0.402590 +v -0.130931 0.187418 -0.404660 +v -0.135891 0.186068 -0.409589 +v -0.142305 0.183367 -0.407677 +v -0.143757 0.182017 -0.400836 +v -0.139085 0.163774 -0.418762 +v -0.141638 0.158861 -0.421979 +v -0.135908 0.160722 -0.423221 +v -0.134111 0.166742 -0.420677 +v -0.131691 0.164797 -0.425809 +v -0.134244 0.159885 -0.429025 +v -0.139218 0.156916 -0.427110 +v -0.151422 0.173179 -0.430679 +v -0.148869 0.178092 -0.427463 +v -0.147205 0.177255 -0.433267 +v -0.143895 0.181060 -0.429378 +v -0.141474 0.179115 -0.434509 +v -0.144028 0.174202 -0.437726 +v -0.149001 0.171234 -0.435811 +v -0.114156 0.181759 -0.496712 +v -0.113028 0.181759 -0.507623 +v -0.116767 0.145224 -0.502496 +v -0.119946 0.181759 -0.516136 +v -0.130857 0.181759 -0.517264 +v -0.125729 0.145224 -0.513526 +v -0.139370 0.181759 -0.510347 +v -0.140497 0.181759 -0.499435 +v -0.136759 0.145224 -0.504563 +v 0.238488 0.581732 0.573899 +v 0.205640 0.581732 0.590027 +v 0.251197 0.559399 0.630347 +v 0.188545 0.581732 0.622382 +v 0.193733 0.581732 0.658606 +v 0.219222 0.581732 0.684863 +v 0.255276 0.581732 0.691123 +v 0.288124 0.581732 0.674996 +v 0.305219 0.581732 0.642641 +v 0.300031 0.581732 0.606416 +v 0.274543 0.581732 0.580160 +v 0.198390 0.581732 -0.583185 +v 0.190495 0.581732 -0.547453 +v 0.250429 0.559399 -0.557892 +v 0.205110 0.581732 -0.513905 +v 0.236653 0.581732 -0.495354 +v 0.273076 0.581732 -0.498887 +v 0.300466 0.581732 -0.523154 +v 0.308362 0.581732 -0.558886 +v 0.293747 0.581732 -0.592434 +v 0.262203 0.581732 -0.610985 +v 0.225780 0.581732 -0.607452 +v 0.389896 0.921101 -0.547006 +v 0.445245 0.921101 -0.552738 +v 0.334546 0.921101 -0.552738 +v 0.389896 0.921101 0.547006 +v 0.334546 0.921101 0.552738 +v 0.445245 0.921101 0.552738 +v -0.564855 0.921101 -0.547006 +v -0.509506 0.921101 -0.552738 +v -0.620205 0.921101 -0.552738 +v 0.291320 0.566384 -0.536528 +v 0.302021 0.566384 -0.514091 +v 0.387725 0.566384 -0.513312 +v 0.488464 0.566384 -0.540873 +v 0.476036 0.566384 -0.514259 +v 0.387725 0.429362 -0.513312 +v 0.488464 0.429362 -0.540873 +v 0.476036 0.429362 -0.514259 +v 0.291320 0.429362 -0.536528 +v 0.302021 0.429362 -0.514091 +v -0.661798 0.566384 -0.568567 +v -0.651097 0.566384 -0.546131 +v -0.565393 0.566384 -0.545352 +v -0.464654 0.566384 -0.572912 +v -0.477082 0.566384 -0.546299 +v -0.565393 0.429362 -0.545352 +v -0.464654 0.429362 -0.572912 +v -0.477082 0.429362 -0.546299 +v -0.661798 0.429362 -0.568567 +v -0.651097 0.429362 -0.546131 +v 0.291027 0.566384 0.536528 +v 0.387432 0.566384 0.513312 +v 0.301727 0.566384 0.514091 +v 0.488170 0.566384 0.540872 +v 0.475743 0.566384 0.514259 +v 0.387432 0.429362 0.513312 +v 0.475743 0.429362 0.514259 +v 0.488171 0.429362 0.540872 +v 0.291027 0.429362 0.536528 +v 0.301727 0.429362 0.514091 +v 0.453264 0.414817 -0.438596 +v 0.427770 0.394532 -0.438596 +v 0.453264 0.394532 -0.438596 +v 0.453264 0.414817 -0.464081 +v 0.453264 0.394532 -0.464081 +v 0.427770 0.394532 -0.464081 +v 0.453264 0.414817 -0.257355 +v 0.427770 0.394532 -0.257355 +v 0.453264 0.394532 -0.257355 +v 0.453264 0.414817 -0.282839 +v 0.453264 0.394532 -0.282839 +v 0.427770 0.394532 -0.282839 +v 0.453264 0.413165 0.277542 +v 0.427770 0.396429 0.277542 +v 0.453264 0.396429 0.277542 +v 0.453264 0.413165 0.250185 +v 0.453264 0.396429 0.250185 +v 0.427770 0.396429 0.250185 +v 0.453264 0.413165 0.462431 +v 0.427770 0.396429 0.462431 +v 0.453264 0.396429 0.462431 +v 0.453264 0.413165 0.435082 +v 0.453264 0.396429 0.435082 +v 0.427770 0.396429 0.435082 +v 0.274652 0.219052 0.143427 +v 0.265515 0.221150 0.151991 +v 0.263536 0.225535 0.164246 +v 0.293859 0.235216 0.179881 +v 0.302996 0.233118 0.171317 +v 0.304974 0.228733 0.159062 +v 0.260761 0.223100 -0.130895 +v 0.273335 0.225208 -0.131040 +v 0.283112 0.229610 -0.138774 +v 0.271260 0.239332 -0.170916 +v 0.258686 0.237225 -0.170771 +v 0.248910 0.232822 -0.163037 +v -0.017080 0.169198 0.043178 +v -0.010006 0.171680 -0.015389 +v -0.103749 0.189413 0.003803 +v -0.038739 0.173863 -0.066924 +v -0.092303 0.174915 -0.091744 +v -0.150239 0.174433 -0.080368 +v -0.179960 0.174535 -0.032204 +v -0.186180 0.172353 0.019296 +v -0.160915 0.170433 0.064613 +v -0.113813 0.169508 0.086438 +v -0.062868 0.169932 0.076435 +v 0.217900 0.076654 -0.441431 +v 0.207289 0.059471 -0.436671 +v 0.198346 0.078506 -0.434496 +v 0.243401 0.137634 -0.350576 +v 0.248037 0.142316 -0.369666 +v 0.228483 0.144168 -0.362730 +v 0.260360 0.674025 0.646583 +v 0.253966 0.698247 0.636373 +v 0.252678 0.670918 0.633151 +v 0.259357 0.674006 0.647161 +v 0.251673 0.670898 0.633730 +v 0.253030 0.698229 0.636913 +v 0.237613 0.645912 -0.560210 +v 0.247500 0.665355 -0.557118 +v 0.249555 0.643025 -0.556435 +v 0.237897 0.645912 -0.561109 +v 0.249840 0.643025 -0.557335 +v 0.247765 0.665355 -0.557957 +v 0.281383 0.264412 0.156884 +v 0.281430 0.280989 0.156974 +v 0.287747 0.270807 0.168617 +v 0.280328 0.264412 0.157457 +v 0.286694 0.270807 0.169188 +v 0.280379 0.280989 0.157545 +v 0.266766 0.254597 -0.146384 +v 0.266731 0.266520 -0.146448 +v 0.262097 0.259196 -0.154772 +v 0.267520 0.254597 -0.146803 +v 0.262850 0.259196 -0.155191 +v 0.267483 0.266520 -0.146866 +v 0.447121 0.713748 0.001530 +v 0.447121 0.629386 -0.172251 +v 0.573651 0.629386 -0.172251 +v 0.573651 0.713748 0.001530 +v 0.447121 0.619081 0.164474 +v 0.573651 0.619081 0.164474 +v 0.447121 -0.000154 0.151382 +v 0.573651 -0.000154 0.151382 +v 0.447121 -0.000154 -0.158077 +v 0.573651 -0.000154 -0.158077 +v 0.447121 0.004394 -0.600028 +v 0.447121 -0.000154 -0.158077 +v 0.447121 0.629386 -0.172251 +v 0.447121 0.648033 -0.586933 +v 0.447121 0.619081 0.164474 +v 0.447121 -0.000154 0.151382 +v 0.447121 -0.005760 0.593027 +v 0.447121 0.641591 0.584216 +v 0.447121 -0.000154 0.151382 +v 0.447121 -0.000154 -0.158077 +v 0.447121 0.800080 0.461288 +v 0.447121 0.857197 0.353390 +v 0.447121 0.713748 0.001530 +v 0.447121 0.864522 0.002412 +v 0.447121 0.859314 -0.357613 +v 0.447121 0.819132 -0.443691 +v -0.536407 0.002715 -0.664843 +v 0.337867 0.000860 -0.664843 +v 0.338482 0.813595 -0.664843 +v -0.535793 0.815448 -0.664843 +v 0.330770 0.246266 -0.616018 +v 0.330770 0.316683 -0.616018 +v 0.187438 0.314538 -0.616327 +v 0.185947 0.264762 -0.618911 +v 0.335768 0.316683 -0.681060 +v 0.192972 0.314538 -0.688336 +v 0.335768 0.246266 -0.681060 +v 0.191091 0.264762 -0.685842 +v -0.073168 0.299157 -0.692533 +v -0.079190 0.299157 -0.614170 +v -0.075552 0.248478 -0.615534 +v -0.069755 0.248478 -0.690982 +v -0.359678 0.314656 -0.611262 +v -0.352998 0.314656 -0.698193 +v -0.502730 0.322434 -0.695377 +v -0.510377 0.322434 -0.608245 +v -0.349125 0.262758 -0.610981 +v -0.510377 0.243607 -0.608245 +v -0.502730 0.243607 -0.695377 +v -0.342445 0.262758 -0.697912 +v -0.473809 0.851846 -0.596288 +v -0.293424 0.831581 -0.596288 +v -0.293424 0.831581 -0.686392 +v -0.473809 0.851846 -0.686392 +v -0.473809 0.768415 -0.596288 +v -0.473809 0.768415 -0.686392 +v -0.293424 0.748150 -0.686392 +v -0.293424 0.748150 -0.596288 +v -0.473809 0.768415 -0.596288 +v -0.293424 0.748150 -0.596288 +v -0.058102 0.851846 -0.596288 +v -0.058102 0.851846 -0.686392 +v -0.058102 0.768415 -0.686392 +v -0.058102 0.768415 -0.596288 +v -0.058102 0.768415 -0.596288 +v 0.157246 0.836647 -0.596288 +v 0.157246 0.836647 -0.686392 +v 0.157246 0.753216 -0.686392 +v 0.157246 0.753216 -0.596288 +v 0.157246 0.753216 -0.596288 +v 0.300480 0.851846 -0.596288 +v 0.300480 0.851846 -0.686392 +v 0.300480 0.768415 -0.686392 +v 0.300480 0.768415 -0.596288 +v 0.300480 0.768415 -0.596288 +v 0.347241 0.386481 -0.057963 +v 0.343686 0.365938 -0.073398 +v 0.349514 0.371622 -0.082855 +v 0.356623 0.394205 -0.073770 +v 0.356623 0.394205 -0.073770 +v 0.349514 0.371622 -0.082855 +v 0.343686 0.377306 -0.092311 +v 0.347241 0.401930 -0.089578 +v 0.332030 0.377306 -0.092311 +v 0.328476 0.401930 -0.089578 +v 0.326202 0.371622 -0.082855 +v 0.319093 0.394205 -0.073770 +v 0.332030 0.365938 -0.073398 +v 0.328476 0.386481 -0.057963 +v 0.356623 0.394205 -0.073770 +v 0.347241 0.401930 -0.089578 +v 0.328476 0.401930 -0.089578 +v 0.319093 0.394205 -0.073770 +v 0.328476 0.386481 -0.057963 +v 0.347241 0.386481 -0.057963 +v 0.337435 0.239781 -0.085052 +v 0.331314 0.257433 -0.082573 +v 0.331314 0.251556 -0.110023 +v 0.337435 0.234843 -0.116048 +v 0.337435 0.259908 -0.158964 +v 0.331314 0.276723 -0.148351 +v 0.331314 0.302278 -0.159419 +v 0.337435 0.293854 -0.173274 +v 0.331314 0.263252 -0.131040 +v 0.337435 0.244318 -0.140354 +v 0.321455 0.290185 -0.117789 +v 0.330610 0.336106 -0.096586 +v 0.324990 0.275141 -0.073597 +v 0.324990 0.321760 -0.143295 +v 0.343555 0.251556 -0.110023 +v 0.343555 0.257433 -0.082573 +v 0.343555 0.302278 -0.159419 +v 0.343555 0.276723 -0.148351 +v 0.343555 0.263252 -0.131040 +v 0.353414 0.290185 -0.117789 +v 0.344259 0.336106 -0.096586 +v 0.343555 0.266330 -0.059984 +v 0.343555 0.326087 -0.162781 +v 0.349879 0.275141 -0.073597 +v 0.349879 0.321760 -0.143295 +v 0.353414 0.292965 -0.083704 +v 0.344259 0.325114 -0.076846 +v 0.344259 0.347841 -0.116841 +v 0.353414 0.314261 -0.139709 +v 0.349879 0.275141 -0.073597 +v 0.349879 0.321760 -0.143295 +v 0.357733 0.252472 0.153127 +v 0.357733 0.280389 0.157451 +v 0.351836 0.274248 0.166836 +v 0.351836 0.254493 0.163776 +v 0.337563 0.238514 0.150965 +v 0.337563 0.244616 0.162246 +v 0.317393 0.252472 0.153127 +v 0.323290 0.254493 0.163776 +v 0.317393 0.280389 0.157451 +v 0.323290 0.274248 0.166836 +v 0.337563 0.294348 0.159613 +v 0.337563 0.284125 0.168366 +v 0.337563 0.294348 0.159613 +v 0.337563 0.284125 0.168366 +v 0.323290 0.254493 0.163776 +v 0.337563 0.244616 0.162246 +v 0.337563 0.284125 0.168366 +v 0.323290 0.274248 0.166836 +v 0.351836 0.274248 0.166836 +v 0.351836 0.254493 0.163776 +v 0.337563 0.397225 -0.127435 +v 0.321615 0.386968 -0.131133 +v 0.328314 0.372933 -0.116500 +v 0.337563 0.379331 -0.115496 +v 0.321615 0.366454 -0.138527 +v 0.328314 0.360136 -0.118510 +v 0.337563 0.356198 -0.142224 +v 0.337563 0.353739 -0.119514 +v 0.337563 0.356198 -0.142224 +v 0.353511 0.366454 -0.138527 +v 0.346812 0.360137 -0.118510 +v 0.337563 0.353739 -0.119514 +v 0.353511 0.386968 -0.131133 +v 0.346812 0.372933 -0.116500 +v 0.337563 0.379581 -0.080905 +v 0.313826 0.370030 -0.084424 +v 0.322398 0.343349 -0.059151 +v 0.337563 0.351886 -0.053610 +v 0.313826 0.332992 -0.100242 +v 0.322398 0.326274 -0.070233 +v 0.337563 0.323441 -0.103762 +v 0.337563 0.317737 -0.075774 +v 0.337563 0.323441 -0.103762 +v 0.361301 0.332992 -0.100242 +v 0.352729 0.326274 -0.070233 +v 0.337563 0.317737 -0.075774 +v 0.361301 0.370030 -0.084424 +v 0.352729 0.343349 -0.059151 +v 0.337563 0.379581 -0.080905 +v 0.337563 0.351886 -0.053610 +v 0.337563 0.310195 0.023452 +v 0.325649 0.301950 0.022175 +v 0.327229 0.295533 0.052690 +v 0.337563 0.302685 0.053798 +v 0.325649 0.285460 0.019621 +v 0.327229 0.281229 0.050474 +v 0.337563 0.277215 0.018344 +v 0.337563 0.274077 0.049367 +v 0.337563 0.277215 0.018344 +v 0.349478 0.285460 0.019621 +v 0.347898 0.281229 0.050474 +v 0.337563 0.274077 0.049367 +v 0.349478 0.301950 0.022175 +v 0.347898 0.295533 0.052690 +v 0.325376 0.271268 0.092754 +v 0.317597 0.257536 0.132978 +v 0.317635 0.285207 0.136945 +v 0.325404 0.288162 0.095138 +v 0.337563 0.262799 0.091561 +v 0.337563 0.243671 0.130993 +v 0.337563 0.262799 0.091561 +v 0.349750 0.271268 0.092754 +v 0.357530 0.257537 0.132978 +v 0.337563 0.243671 0.130993 +v 0.349723 0.288162 0.095138 +v 0.357492 0.285207 0.136945 +v 0.337563 0.296573 0.096328 +v 0.337563 0.298993 0.138924 +v 0.328314 0.340018 -0.061313 +v 0.328314 0.329605 -0.068071 +v 0.326740 0.305780 -0.038814 +v 0.326740 0.319273 -0.032710 +v 0.337563 0.324398 -0.071451 +v 0.337563 0.299033 -0.041865 +v 0.337563 0.324398 -0.071451 +v 0.346812 0.329605 -0.068071 +v 0.348386 0.305780 -0.038814 +v 0.337563 0.299033 -0.041865 +v 0.346812 0.340018 -0.061313 +v 0.348386 0.319273 -0.032710 +v 0.337563 0.345225 -0.057934 +v 0.337563 0.326020 -0.029659 +v 0.328314 0.340018 -0.061313 +v 0.337563 0.345225 -0.057934 +v 0.322398 0.377025 -0.115858 +v 0.328314 0.372933 -0.116500 +v 0.328314 0.360136 -0.118510 +v 0.322398 0.356044 -0.119152 +v 0.328314 0.329605 -0.068071 +v 0.337563 0.353739 -0.119514 +v 0.337563 0.345554 -0.120799 +v 0.337563 0.324398 -0.071451 +v 0.337563 0.345554 -0.120799 +v 0.337563 0.353739 -0.119514 +v 0.346812 0.360137 -0.118510 +v 0.352729 0.356044 -0.119152 +v 0.346812 0.329605 -0.068071 +v 0.337563 0.324398 -0.071451 +v 0.346812 0.372933 -0.116500 +v 0.352729 0.377025 -0.115858 +v 0.346812 0.340018 -0.061313 +v 0.337563 0.379331 -0.115496 +v 0.337563 0.387516 -0.114210 +v 0.337563 0.345225 -0.057934 +v 0.337563 0.387516 -0.114210 +v 0.337563 0.379331 -0.115496 +v 0.320009 0.373239 -0.150433 +v 0.320009 0.395124 -0.140534 +v 0.337563 0.362297 -0.155383 +v 0.355117 0.373239 -0.150433 +v 0.337563 0.362297 -0.155383 +v 0.355117 0.395124 -0.140534 +v 0.337563 0.406067 -0.135585 +v 0.323999 0.280338 0.138546 +v 0.323999 0.261564 0.135638 +v 0.337563 0.252177 0.134184 +v 0.351127 0.261564 0.135638 +v 0.351127 0.280338 0.138546 +v 0.337563 0.289724 0.140000 +v 0.337563 0.289724 0.140000 +v 0.323006 0.297919 0.055725 +v 0.327229 0.295533 0.052690 +v 0.327229 0.281229 0.050474 +v 0.322966 0.277678 0.052928 +v 0.323999 0.261564 0.135638 +v 0.323999 0.280338 0.138546 +v 0.337563 0.274077 0.049367 +v 0.337563 0.267524 0.051528 +v 0.337563 0.252177 0.134184 +v 0.337563 0.267524 0.051528 +v 0.337563 0.274077 0.049367 +v 0.347898 0.281229 0.050474 +v 0.352161 0.277678 0.052928 +v 0.351127 0.261564 0.135638 +v 0.337563 0.252177 0.134184 +v 0.347898 0.295533 0.052690 +v 0.352120 0.297919 0.055725 +v 0.351127 0.280338 0.138546 +v 0.337563 0.302685 0.053798 +v 0.337563 0.307988 0.057120 +v 0.337563 0.289724 0.140000 +v 0.328351 0.306540 -0.003103 +v 0.328351 0.294361 -0.006534 +v 0.337563 0.288272 -0.008249 +v 0.337563 0.288272 -0.008249 +v 0.346776 0.294361 -0.006534 +v 0.346776 0.306540 -0.003103 +v 0.337563 0.312629 -0.001388 +v 0.337563 0.362297 -0.155383 +v 0.320009 0.373239 -0.150433 +v 0.320009 0.395124 -0.140534 +v 0.337563 0.406067 -0.135585 +v 0.355117 0.395124 -0.140534 +v 0.355117 0.373239 -0.150433 +v 0.281039 0.165109 -0.082836 +v 0.281039 0.199666 -0.082836 +v 0.386786 0.199666 -0.082836 +v 0.386786 0.165109 -0.082836 +v 0.386786 0.199176 0.088875 +v 0.386786 0.164619 0.088875 +v 0.281039 0.164619 0.088875 +v 0.281039 0.199176 0.088875 +v 0.274017 0.158852 -0.124209 +v 0.273006 0.158852 -0.076783 +v 0.273006 0.206902 -0.076783 +v 0.274017 0.215549 -0.124209 +v 0.325500 0.206902 -0.082481 +v 0.325500 0.215549 -0.121004 +v 0.394483 0.215549 -0.125277 +v 0.395157 0.206902 -0.073222 +v 0.395157 0.158852 -0.073222 +v 0.394483 0.158852 -0.125277 +v 0.273006 0.158852 -0.076783 +v 0.325500 0.158852 -0.082481 +v 0.325500 0.158852 -0.121004 +v 0.274017 0.158852 -0.124209 +v 0.394483 0.158852 -0.125277 +v 0.395157 0.158852 -0.073222 +v 0.272669 0.158852 0.084176 +v 0.274354 0.158852 0.127328 +v 0.274354 0.213027 0.127016 +v 0.272669 0.206902 0.084176 +v 0.333398 0.213027 0.119893 +v 0.331039 0.206902 0.088806 +v 0.393471 0.206902 0.085244 +v 0.397516 0.213027 0.124879 +v 0.397516 0.158852 0.125192 +v 0.393471 0.158852 0.085244 +v 0.274354 0.158852 0.127328 +v 0.333398 0.158852 0.120206 +v 0.331039 0.158852 0.088806 +v 0.272669 0.158852 0.084176 +v 0.393471 0.158852 0.085244 +v 0.397516 0.158852 0.125192 +v 0.321874 0.191459 -0.051569 +v 0.321874 0.189244 -0.021273 +v 0.326325 0.230408 -0.030656 +v 0.326325 0.231339 -0.045416 +v 0.352860 0.189244 -0.021273 +v 0.348409 0.230408 -0.030656 +v 0.352860 0.191459 -0.051569 +v 0.348409 0.231339 -0.045416 +v 0.326348 0.277540 -0.025067 +v 0.326348 0.277540 -0.048713 +v 0.348387 0.277540 -0.048713 +v 0.348387 0.277540 -0.025067 +v 0.322968 0.270191 -0.054386 +v 0.322968 0.274988 -0.019309 +v 0.322968 0.288986 -0.013537 +v 0.322968 0.301897 -0.052750 +v 0.348988 0.288986 -0.013537 +v 0.348988 0.301897 -0.052750 +v 0.348988 0.270191 -0.054386 +v 0.348988 0.274988 -0.019309 +v 0.348988 0.274988 -0.019309 +v 0.348988 0.288986 -0.013537 +v 0.348988 0.270191 -0.054386 +v 0.348988 0.301897 -0.052750 +v 0.322968 0.244861 0.044584 +v 0.322968 0.247061 0.088392 +v 0.322968 0.262334 0.087109 +v 0.322968 0.268930 0.046407 +v 0.348988 0.262334 0.087109 +v 0.348988 0.268930 0.046407 +v 0.348988 0.244861 0.044584 +v 0.348988 0.247062 0.088392 +v 0.348988 0.247062 0.088392 +v 0.348988 0.262334 0.087109 +v 0.348988 0.244861 0.044584 +v 0.348988 0.268930 0.046407 +v 0.321874 0.190311 0.048453 +v 0.321874 0.194269 0.077050 +v 0.326325 0.223588 0.075773 +v 0.326325 0.224149 0.059011 +v 0.352860 0.194269 0.077050 +v 0.348409 0.223588 0.075773 +v 0.326348 0.249187 0.080353 +v 0.326348 0.251539 0.048498 +v 0.348387 0.249187 0.080353 +v 0.348387 0.251539 0.048498 +v 0.348409 0.224149 0.059011 +v 0.352860 0.190311 0.048453 +v 0.408631 0.350520 0.133840 +v 0.408631 0.343534 0.185495 +v 0.417825 0.389491 0.179489 +v 0.417825 0.390303 0.136514 +v 0.409266 0.440177 0.125617 +v 0.409266 0.447533 0.189861 +v 0.460364 0.437159 0.189861 +v 0.460364 0.429804 0.125617 +v 0.460344 0.357436 0.133840 +v 0.460344 0.350449 0.185495 +v 0.408631 0.343534 0.185495 +v 0.460344 0.350449 0.185495 +v 0.460407 0.391565 0.179489 +v 0.417825 0.389491 0.179489 +v 0.460344 0.357436 0.133840 +v 0.408631 0.350520 0.133840 +v 0.417825 0.390303 0.136514 +v 0.460407 0.392378 0.136514 +v 0.409266 0.440177 0.125617 +v 0.460364 0.429804 0.125617 +v 0.460364 0.437159 0.189861 +v 0.409266 0.447533 0.189861 +v 0.418841 0.155999 -0.187839 +v 0.418841 0.155600 -0.144497 +v 0.418841 0.407394 -0.150307 +v 0.418841 0.405468 -0.183765 +v 0.448062 0.155600 -0.144497 +v 0.448062 0.407394 -0.150307 +v 0.448062 0.155999 -0.187839 +v 0.448062 0.405468 -0.183765 +v 0.418841 0.623881 -0.144312 +v 0.418841 0.619447 -0.185604 +v 0.448062 0.619447 -0.185604 +v 0.448062 0.623881 -0.144312 +v 0.420734 0.158518 0.176813 +v 0.420734 0.398454 0.171165 +v 0.420734 0.400649 0.144015 +v 0.420734 0.158119 0.133152 +v 0.449955 0.400649 0.144015 +v 0.449955 0.158119 0.133152 +v 0.449955 0.158518 0.176813 +v 0.449955 0.398454 0.171165 +v 0.420734 0.619447 0.180689 +v 0.420734 0.623881 0.139397 +v 0.449955 0.619447 0.180689 +v 0.449955 0.623881 0.139397 +v 0.456184 0.373593 -0.164699 +v 0.456184 0.385251 0.158984 +v 0.456184 0.416030 0.159770 +v 0.456184 0.421160 -0.167725 +v 0.575149 0.416030 0.159770 +v 0.575149 0.421160 -0.167725 +v 0.575149 0.373593 -0.164699 +v 0.575149 0.385251 0.158984 +v 0.408631 0.350403 -0.146232 +v 0.417825 0.390186 -0.148906 +v 0.417825 0.389373 -0.191880 +v 0.408631 0.343416 -0.197887 +v 0.409266 0.440060 -0.138009 +v 0.460364 0.429686 -0.138009 +v 0.460364 0.437042 -0.202253 +v 0.409266 0.447416 -0.202253 +v 0.460344 0.357319 -0.146232 +v 0.460344 0.350332 -0.197887 +v 0.408631 0.343416 -0.197887 +v 0.417825 0.389373 -0.191880 +v 0.460407 0.391448 -0.191880 +v 0.460344 0.350332 -0.197887 +v 0.460344 0.357319 -0.146232 +v 0.460407 0.392260 -0.148906 +v 0.417825 0.390186 -0.148906 +v 0.408631 0.350403 -0.146232 +v 0.460364 0.429686 -0.138009 +v 0.409266 0.440060 -0.138009 +v 0.409266 0.447416 -0.202253 +v 0.460364 0.437042 -0.202253 +v -0.588718 0.006153 0.349642 +v -0.631482 0.008222 0.272193 +v -0.631916 0.008574 0.446990 +v -0.581104 0.026813 0.453087 +v -0.631554 0.001503 0.515283 +v -0.574975 0.024092 0.525073 +v -0.725379 -0.002505 0.654587 +v -0.685266 -0.000621 0.588856 +v -0.461600 -0.003347 0.701101 +v -0.441820 0.025780 0.655788 +v -0.428120 0.029422 0.569025 +v -0.415274 0.037569 0.488868 +v -0.396565 0.043260 0.369979 +v -0.377371 0.009510 0.241151 +v -0.219986 0.005976 0.378598 +v -0.154045 0.007776 0.317484 +v -0.200713 0.002643 0.501280 +v -0.243517 0.021185 0.494071 +v -0.216612 0.000855 0.564037 +v -0.274236 0.019101 0.560861 +v -0.180606 -0.003068 0.708175 +v -0.187996 -0.001472 0.649980 +v -0.441820 0.025780 0.655788 +v -0.461600 -0.003347 0.701101 +v -0.415274 0.037569 0.488868 +v -0.428120 0.029422 0.569025 +v -0.396565 0.043260 0.369979 +v -0.377371 0.009510 0.241151 +v 0.114645 -0.107646 0.739535 +v 0.575491 -0.107646 0.739535 +v -0.319177 -0.107646 0.739535 +v -0.741905 -0.107647 0.739535 +v 0.575491 -0.107646 -0.721043 +v 0.114645 -0.107646 -0.721043 +v -0.319177 -0.107646 -0.721043 +v -0.741905 -0.107647 -0.721043 +v 0.575491 -0.107646 -0.721043 +v 0.575491 -0.107646 0.739535 +v -0.741905 -0.107647 -0.721043 +v -0.741905 -0.107647 0.739535 +v 0.447635 0.664645 0.256695 +v 0.417421 0.664645 0.256695 +v 0.417421 0.658135 0.250623 +v 0.447635 0.658135 0.250623 +v 0.417421 0.726090 0.247516 +v 0.417421 0.692649 0.216328 +v 0.417421 0.658135 0.250623 +v 0.447635 0.658135 0.250623 +v 0.447635 0.692649 0.216328 +v 0.447635 0.726090 0.247516 +v 0.447635 0.656174 -0.254362 +v 0.447635 0.649664 -0.248290 +v 0.417421 0.649664 -0.248290 +v 0.417421 0.656174 -0.254362 +v 0.417421 0.649664 -0.248290 +v 0.417421 0.684178 -0.213995 +v 0.417421 0.717619 -0.245183 +v 0.447635 0.649664 -0.248290 +v 0.447635 0.684178 -0.213995 +v 0.447635 0.717619 -0.245183 +v 0.411461 0.614738 0.202230 +v 0.411461 0.670555 0.168495 +v 0.411461 0.652002 0.121505 +v 0.411461 0.612594 0.123459 +v 0.411461 0.726295 0.254991 +v 0.411461 0.747076 0.250444 +v 0.411461 0.775239 0.183746 +v 0.411461 0.729690 0.135465 +v 0.411461 0.608645 -0.200853 +v 0.411461 0.616770 -0.123031 +v 0.411461 0.661191 -0.121763 +v 0.411461 0.670042 -0.170962 +v 0.411461 0.737319 -0.247081 +v 0.411461 0.715214 -0.250693 +v 0.411461 0.718761 -0.140056 +v 0.411461 0.772849 -0.166506 +v 0.411461 0.754349 0.000381 +v 0.411461 0.687263 -0.000534 +v 0.448569 0.670555 0.168495 +v 0.448569 0.652002 0.121505 +v 0.411461 0.652002 0.121505 +v 0.411461 0.670555 0.168495 +v 0.448569 0.612594 0.123459 +v 0.448569 0.614738 0.202230 +v 0.411461 0.614738 0.202230 +v 0.411461 0.612594 0.123459 +v 0.448569 0.699099 0.170319 +v 0.411461 0.699099 0.170319 +v 0.448569 0.675560 0.212408 +v 0.411461 0.675560 0.212408 +v 0.448569 0.726295 0.254991 +v 0.411461 0.726295 0.254991 +v 0.448569 0.726295 0.254991 +v 0.448569 0.747076 0.250444 +v 0.411461 0.747076 0.250444 +v 0.411461 0.726295 0.254991 +v 0.448569 0.750638 0.209834 +v 0.411461 0.750638 0.209834 +v 0.448569 0.775239 0.183746 +v 0.411461 0.775239 0.183746 +v 0.448569 0.729690 0.135465 +v 0.411461 0.729690 0.135465 +v 0.448569 0.754349 0.000381 +v 0.411461 0.754349 0.000381 +v 0.448569 0.687263 -0.000534 +v 0.411461 0.687263 -0.000534 +v 0.448569 0.608645 -0.200853 +v 0.448569 0.616770 -0.123031 +v 0.411461 0.616770 -0.123031 +v 0.411461 0.608645 -0.200853 +v 0.448569 0.661191 -0.121763 +v 0.448569 0.670042 -0.170962 +v 0.411461 0.670042 -0.170962 +v 0.411461 0.661191 -0.121763 +v 0.448569 0.675616 -0.213822 +v 0.411461 0.675616 -0.213822 +v 0.448569 0.699646 -0.173571 +v 0.411461 0.699646 -0.173571 +v 0.448569 0.745240 -0.212562 +v 0.448569 0.737319 -0.247081 +v 0.411461 0.737319 -0.247081 +v 0.411461 0.745240 -0.212562 +v 0.448569 0.715214 -0.250693 +v 0.411461 0.715214 -0.250693 +v 0.448569 0.715214 -0.250693 +v 0.411461 0.715214 -0.250693 +v 0.448569 0.718761 -0.140056 +v 0.411461 0.718761 -0.140056 +v 0.448569 0.772849 -0.166506 +v 0.411461 0.772849 -0.166506 +v 0.426600 0.394045 -0.021946 +v 0.425094 0.384050 -0.005993 +v 0.434734 0.437012 -0.004954 +v 0.434423 0.437641 -0.026875 +v 0.427058 0.393120 0.010334 +v 0.435045 0.436385 0.016967 +v 0.440123 0.391583 -0.022144 +v 0.438617 0.381588 -0.006191 +v 0.440582 0.390658 0.010136 +v 0.440582 0.390658 0.010136 +v 0.448568 0.433922 0.016769 +v 0.440123 0.391583 -0.022144 +v 0.447946 0.435178 -0.027073 +v 0.499039 0.569104 0.002764 +v 0.495826 0.569141 0.000129 +v 0.481623 0.556359 0.010780 +v 0.490260 0.556221 0.019267 +v 0.494319 0.569225 -0.003466 +v 0.477960 0.556651 -0.001157 +v 0.494862 0.569335 -0.007198 +v 0.480110 0.557030 -0.013811 +v 0.497331 0.569448 -0.010211 +v 0.487580 0.557410 -0.024282 +v 0.501159 0.569537 -0.011816 +v 0.498659 0.557702 -0.030171 +v 0.505471 0.569582 -0.011644 +v 0.510809 0.557841 -0.030130 +v 0.509279 0.569573 -0.009735 +v 0.521246 0.557795 -0.024167 +v 0.511709 0.569511 -0.006527 +v 0.527581 0.557573 -0.013650 +v 0.512206 0.569411 -0.002754 +v 0.528360 0.557228 -0.000986 +v 0.512206 0.569411 -0.002754 +v 0.510655 0.569296 0.000719 +v 0.523407 0.556837 0.010922 +v 0.528360 0.557228 -0.000986 +v 0.507412 0.569192 0.003097 +v 0.513855 0.556491 0.019347 +v 0.503220 0.569123 0.003835 +v 0.501892 0.556269 0.022358 +v 0.472487 0.541947 0.016906 +v 0.484811 0.541750 0.029016 +v 0.467260 0.542364 -0.000127 +v 0.470327 0.542905 -0.018183 +v 0.480986 0.543447 -0.033124 +v 0.496795 0.543864 -0.041527 +v 0.514132 0.544063 -0.041468 +v 0.529026 0.543996 -0.032961 +v 0.538064 0.543680 -0.017953 +v 0.539176 0.543187 0.000117 +v 0.532108 0.542629 0.017109 +v 0.539176 0.543187 0.000117 +v 0.518478 0.542135 0.029130 +v 0.501409 0.541818 0.033428 +v 0.465189 0.523495 0.021695 +v 0.480484 0.523251 0.036724 +v 0.458701 0.524013 0.000555 +v 0.462508 0.524684 -0.021853 +v 0.475737 0.525356 -0.040396 +v 0.495357 0.525875 -0.050825 +v 0.516873 0.526121 -0.050752 +v 0.535358 0.526038 -0.040193 +v 0.546575 0.525646 -0.021567 +v 0.547956 0.525034 0.000858 +v 0.539183 0.524342 0.021947 +v 0.547956 0.525034 0.000858 +v 0.522267 0.523729 0.036866 +v 0.501083 0.523335 0.042199 +v 0.460149 0.502591 0.024880 +v 0.477526 0.502313 0.041955 +v 0.452778 0.503178 0.000862 +v 0.457103 0.503941 -0.024597 +v 0.472132 0.504705 -0.045664 +v 0.494423 0.505294 -0.057513 +v 0.518869 0.505573 -0.057430 +v 0.539870 0.505480 -0.045434 +v 0.552614 0.505034 -0.024272 +v 0.554182 0.504338 0.001206 +v 0.544216 0.503552 0.025165 +v 0.554182 0.504338 0.001206 +v 0.524997 0.502856 0.042116 +v 0.500930 0.502409 0.048175 +v 0.457622 0.484489 0.026361 +v 0.476072 0.484194 0.044490 +v 0.449797 0.485113 0.000861 +v 0.454388 0.485923 -0.026168 +v 0.470345 0.486733 -0.048535 +v 0.494011 0.487358 -0.061115 +v 0.519966 0.487655 -0.061027 +v 0.542262 0.487556 -0.048291 +v 0.555793 0.487083 -0.025824 +v 0.557458 0.486344 0.001227 +v 0.546876 0.485510 0.026664 +v 0.557458 0.486344 0.001227 +v 0.526472 0.484770 0.044661 +v 0.500919 0.484296 0.051094 +v 0.502162 0.577600 0.005192 +v 0.503183 0.578140 -0.013678 +v 0.502403 0.567584 0.004271 +v 0.503348 0.568084 -0.013178 +v 0.526710 0.427093 0.074191 +v 0.564217 0.427803 0.051490 +v 0.551633 0.484104 0.040741 +v 0.521847 0.483541 0.058768 +v 0.585345 0.429004 0.013085 +v 0.568412 0.485058 0.010241 +v 0.584433 0.430374 -0.030736 +v 0.567687 0.486146 -0.024558 +v 0.561724 0.431547 -0.068230 +v 0.549653 0.487078 -0.054333 +v 0.561724 0.431547 -0.068230 +v 0.523304 0.432207 -0.089350 +v 0.519142 0.487602 -0.071106 +v 0.549653 0.487078 -0.054333 +v 0.479467 0.432179 -0.088438 +v 0.484330 0.487579 -0.070382 +v 0.441960 0.431469 -0.065737 +v 0.454544 0.487016 -0.052354 +v 0.420832 0.430268 -0.027332 +v 0.437765 0.486062 -0.021855 +v 0.421744 0.428898 0.016489 +v 0.438490 0.484974 0.012945 +v 0.444453 0.427725 0.053983 +v 0.456523 0.484043 0.042720 +v 0.482873 0.427065 0.075103 +v 0.487034 0.483518 0.059493 +v 0.437765 0.486062 -0.021855 +v 0.438490 0.484974 0.012945 +v 0.551633 0.484104 0.040741 +v 0.568412 0.485058 0.010241 +v 0.567687 0.486146 -0.024558 +v 0.454544 0.487016 -0.052354 +v 0.390863 0.563614 0.372365 +v 0.379384 0.564704 0.370165 +v 0.374701 0.553807 0.375703 +v 0.384889 0.549714 0.379430 +v 0.394361 0.569924 0.358094 +v 0.382127 0.569651 0.358977 +v 0.393748 0.565690 0.343295 +v 0.381645 0.566332 0.347376 +v 0.389309 0.552894 0.334893 +v 0.378165 0.556301 0.340789 +v 0.383121 0.537524 0.336819 +v 0.373315 0.544251 0.342299 +v 0.378081 0.526770 0.348171 +v 0.369364 0.535821 0.351199 +v 0.376547 0.525666 0.363639 +v 0.368161 0.534955 0.363324 +v 0.379235 0.534727 0.375984 +v 0.370268 0.542059 0.373002 +v 0.372968 0.560709 0.362982 +v 0.370894 0.555881 0.365436 +v 0.374183 0.562900 0.358026 +v 0.368529 0.547913 0.354580 +v 0.367996 0.547529 0.359952 +v 0.368930 0.550676 0.364239 +v 0.386589 0.536790 0.463970 +v 0.408036 0.583917 0.453039 +v 0.383103 0.597471 0.454857 +v 0.361655 0.550345 0.465788 +v 0.426097 0.625667 0.425737 +v 0.401163 0.639222 0.427555 +v 0.437540 0.660192 0.370240 +v 0.411237 0.663236 0.365796 +v 0.440289 0.644265 0.337570 +v 0.412666 0.652529 0.335410 +v 0.429935 0.652229 0.294774 +v 0.411003 0.649562 0.302276 +v 0.418209 0.586556 0.251873 +v 0.388293 0.602502 0.257418 +v 0.394157 0.526420 0.247884 +v 0.369223 0.539975 0.249701 +v 0.371245 0.482693 0.269351 +v 0.350460 0.503023 0.275970 +v 0.365383 0.459989 0.292132 +v 0.340449 0.473544 0.293949 +v 0.362129 0.431748 0.338458 +v 0.337195 0.445303 0.340276 +v 0.354648 0.446709 0.411016 +v 0.329714 0.460264 0.412834 +v 0.367637 0.483090 0.447926 +v 0.342704 0.496645 0.449744 +v 0.382137 0.593298 0.439059 +v 0.363011 0.551913 0.449805 +v 0.396219 0.625853 0.417771 +v 0.409818 0.641387 0.365747 +v 0.402661 0.634239 0.343732 +v 0.404339 0.633860 0.309706 +v 0.394160 0.592785 0.276745 +v 0.370636 0.545475 0.267443 +v 0.361731 0.514832 0.286772 +v 0.344513 0.484864 0.304950 +v 0.345247 0.465719 0.344154 +v 0.337555 0.478405 0.401132 +v 0.347283 0.506565 0.436886 +v 0.315313 0.366718 0.581021 +v 0.321318 0.497917 0.581021 +v 0.321326 0.497930 0.535899 +v 0.315313 0.366718 0.531147 +v 0.334654 0.608309 0.573301 +v 0.334654 0.608309 0.533609 +v 0.290416 0.729348 0.544425 +v 0.290416 0.699577 0.506918 +v 0.244261 0.825101 0.482028 +v 0.242863 0.784232 0.446929 +v 0.244261 0.825101 0.482028 +v 0.176609 0.900818 0.373210 +v 0.176609 0.848096 0.359250 +v 0.242863 0.784232 0.446929 +v 0.458150 0.366718 0.581021 +v 0.315313 0.366718 0.581021 +v 0.315313 0.366718 0.531147 +v 0.458150 0.366718 0.531147 +v 0.321326 0.497930 0.535899 +v 0.458123 0.497930 0.535899 +v 0.458123 0.497917 0.581021 +v 0.458150 0.366718 0.581021 +v 0.334654 0.608309 0.533609 +v 0.458111 0.608309 0.533609 +v 0.458111 0.608309 0.573301 +v 0.290416 0.699577 0.506918 +v 0.458111 0.699577 0.506918 +v 0.458111 0.729348 0.544425 +v 0.242863 0.784232 0.446929 +v 0.458126 0.784232 0.446929 +v 0.458122 0.825101 0.482028 +v 0.458126 0.784232 0.446929 +v 0.458205 0.848096 0.359250 +v 0.458205 0.900818 0.373210 +v 0.458122 0.825101 0.482028 +v 0.458205 0.900818 0.373210 +v 0.458205 0.924882 0.000000 +v 0.176609 0.920199 0.000000 +v 0.176609 0.900818 0.373210 +v 0.176609 0.870731 0.000000 +v 0.176609 0.848096 0.359250 +v 0.176609 0.848096 0.359250 +v 0.176609 0.870731 0.000000 +v 0.458205 0.856508 0.000000 +v 0.458205 0.848096 0.359250 +v 0.315313 0.366718 -0.581021 +v 0.315313 0.366718 -0.531147 +v 0.321326 0.497930 -0.535899 +v 0.321318 0.497917 -0.581021 +v 0.334654 0.608309 -0.533609 +v 0.334654 0.608309 -0.573301 +v 0.290416 0.699577 -0.506918 +v 0.290416 0.729348 -0.544425 +v 0.238969 0.791554 -0.435946 +v 0.244178 0.832424 -0.471045 +v 0.244178 0.832424 -0.471045 +v 0.238969 0.791554 -0.435946 +v 0.176609 0.848096 -0.359250 +v 0.176609 0.900818 -0.373210 +v 0.458150 0.366718 -0.581021 +v 0.458150 0.366718 -0.531147 +v 0.315313 0.366718 -0.531147 +v 0.315313 0.366718 -0.581021 +v 0.458123 0.497930 -0.535899 +v 0.321326 0.497930 -0.535899 +v 0.458123 0.497917 -0.581021 +v 0.458150 0.366718 -0.581021 +v 0.458111 0.608309 -0.533609 +v 0.334654 0.608309 -0.533609 +v 0.458111 0.608309 -0.573301 +v 0.458111 0.699577 -0.506918 +v 0.290416 0.699577 -0.506918 +v 0.458111 0.729348 -0.544425 +v 0.458126 0.791554 -0.435946 +v 0.238969 0.791554 -0.435946 +v 0.458122 0.832424 -0.471045 +v 0.458126 0.791554 -0.435946 +v 0.458205 0.848096 -0.359250 +v 0.458205 0.900818 -0.373210 +v 0.458122 0.832424 -0.471045 +v 0.458205 0.900818 -0.373210 +v 0.176609 0.900818 -0.373210 +v 0.176609 0.848096 -0.359250 +v 0.176609 0.870731 0.000000 +v 0.176609 0.848096 -0.359250 +v 0.458205 0.848096 -0.359250 +v -0.499370 -0.003355 -0.358474 +v -0.468167 -0.003355 -0.429543 +v -0.434727 0.102648 -0.433233 +v -0.479455 0.102648 -0.331359 +v -0.468167 -0.003355 -0.429543 +v -0.514114 -0.003355 -0.492100 +v -0.500589 0.102648 -0.522905 +v -0.434727 0.102648 -0.433233 +v -0.514114 -0.003355 -0.492100 +v -0.591263 -0.003355 -0.483588 +v -0.611179 0.102648 -0.510702 +v -0.500589 0.102648 -0.522905 +v -0.591263 -0.003355 -0.483588 +v -0.622466 -0.003355 -0.412518 +v -0.655906 0.102648 -0.408828 +v -0.611179 0.102648 -0.510702 +v -0.622466 -0.003355 -0.412518 +v -0.576519 -0.003355 -0.349961 +v -0.590044 0.102648 -0.319156 +v -0.655906 0.102648 -0.408828 +v -0.576519 -0.003355 -0.349961 +v -0.499370 -0.003355 -0.358474 +v -0.479455 0.102648 -0.331359 +v -0.590044 0.102648 -0.319156 +v -0.514114 0.196085 -0.492100 +v -0.591263 0.196085 -0.483588 +v -0.622466 0.196085 -0.412518 +v -0.576519 0.196085 -0.349961 +v -0.499370 0.196085 -0.358474 +v -0.468167 0.196085 -0.429543 +v -0.622466 0.196085 -0.412518 +v -0.591263 0.196085 -0.483588 +v -0.591263 0.196085 -0.483588 +v -0.514114 0.196085 -0.492100 +v -0.514114 0.196085 -0.492100 +v -0.468167 0.196085 -0.429543 +v -0.468167 0.196085 -0.429543 +v -0.499370 0.196085 -0.358474 +v -0.499370 0.196085 -0.358474 +v -0.576519 0.196085 -0.349961 +v -0.576519 0.196085 -0.349961 +v -0.622466 0.196085 -0.412518 +v 0.430337 -0.003355 0.304702 +v 0.361318 -0.003355 0.269194 +v 0.360410 0.102648 0.250475 +v 0.446095 0.102648 0.294556 +v 0.361318 -0.003355 0.269194 +v 0.296058 -0.003355 0.311213 +v 0.279393 0.102648 0.302640 +v 0.296058 -0.003355 0.311213 +v 0.299817 -0.003355 0.388739 +v 0.284060 0.102648 0.398885 +v 0.279393 0.102648 0.302640 +v 0.299817 -0.003355 0.388739 +v 0.368837 -0.003355 0.424247 +v 0.369744 0.102648 0.442966 +v 0.284060 0.102648 0.398885 +v 0.368837 -0.003355 0.424247 +v 0.434097 -0.003355 0.382228 +v 0.450762 0.102648 0.390801 +v 0.369744 0.102648 0.442966 +v 0.434097 -0.003355 0.382228 +v 0.430337 -0.003355 0.304702 +v 0.450762 0.102648 0.390801 +v 0.296058 0.196085 0.311213 +v 0.299817 0.196085 0.388739 +v 0.368836 0.196085 0.424247 +v 0.434097 0.196085 0.382228 +v 0.430337 0.196085 0.304702 +v 0.361318 0.196085 0.269194 +v 0.368836 0.196085 0.424247 +v 0.299817 0.196085 0.388739 +v 0.299817 0.196085 0.388739 +v 0.296058 0.196085 0.311213 +v 0.296058 0.196085 0.311213 +v 0.361318 0.196085 0.269194 +v 0.361318 0.196085 0.269194 +v 0.430337 0.196085 0.304702 +v 0.430337 0.196085 0.304702 +v 0.434097 0.196085 0.382228 +v 0.434097 0.196085 0.382228 +v 0.368836 0.196085 0.424247 +v 0.350648 0.474883 -0.280157 +v 0.334665 0.476013 -0.289444 +v 0.329726 0.478837 -0.282446 +v 0.349579 0.477077 -0.273411 +v 0.370365 0.483171 -0.276471 +v 0.368242 0.479712 -0.284710 +v 0.320842 0.488932 -0.344889 +v 0.327015 0.492732 -0.352981 +v 0.322270 0.501280 -0.360971 +v 0.313394 0.493142 -0.345731 +v 0.317049 0.484677 -0.333836 +v 0.310247 0.488864 -0.335173 +v 0.325201 0.480229 -0.304513 +v 0.318311 0.483319 -0.320094 +v 0.307735 0.488458 -0.318939 +v 0.315653 0.484534 -0.299264 +v 0.336953 0.480608 -0.292064 +v 0.328405 0.485313 -0.281374 +v 0.326285 0.470906 -0.277722 +v 0.349658 0.471374 -0.268478 +v 0.373965 0.476684 -0.270408 +v 0.319472 0.496722 -0.371829 +v 0.307422 0.487407 -0.348749 +v 0.304843 0.483644 -0.338568 +v 0.300092 0.479089 -0.317875 +v 0.308154 0.474725 -0.297435 +v 0.322363 0.472659 -0.274522 +v 0.327140 0.462623 -0.278937 +v 0.350569 0.465282 -0.269455 +v 0.375147 0.471478 -0.270390 +v 0.320641 0.487046 -0.374709 +v 0.308011 0.479888 -0.350530 +v 0.305419 0.476550 -0.340295 +v 0.300993 0.468534 -0.319833 +v 0.309153 0.464178 -0.299285 +v 0.323707 0.459579 -0.276657 +v 0.373319 0.463280 -0.280824 +v 0.351947 0.461263 -0.276974 +v 0.332869 0.457267 -0.287078 +v 0.326164 0.475067 -0.366707 +v 0.316348 0.473251 -0.350083 +v 0.313042 0.470052 -0.339289 +v 0.312300 0.460510 -0.323448 +v 0.321016 0.456112 -0.303958 +v 0.333510 0.450943 -0.288895 +v 0.336269 0.465214 -0.291807 +v 0.351822 0.466983 -0.281886 +v 0.369719 0.469766 -0.286886 +v 0.328962 0.479625 -0.355849 +v 0.322320 0.478987 -0.347066 +v 0.318446 0.475271 -0.335895 +v 0.320385 0.469524 -0.323012 +v 0.327300 0.466312 -0.307523 +v 0.339477 0.463620 -0.295782 +v 0.350648 0.474883 -0.280157 +v 0.334665 0.476013 -0.289444 +v 0.368242 0.479712 -0.284710 +v 0.320842 0.488932 -0.344889 +v 0.327015 0.492732 -0.352981 +v 0.317049 0.484677 -0.333836 +v 0.325201 0.480229 -0.304513 +v 0.318311 0.483319 -0.320094 +v 0.336953 0.480608 -0.292064 +v 0.320643 0.487932 -0.332003 +v 0.309387 0.494623 -0.333431 +v 0.322877 0.472893 -0.335294 +v 0.320643 0.487932 -0.332003 +v 0.313931 0.464035 -0.340125 +v 0.301320 0.474375 -0.340945 +v 0.300395 0.485780 -0.338232 +v 0.334665 0.476013 -0.289444 +v 0.336269 0.465214 -0.291807 +v 0.329726 0.478837 -0.282446 +v 0.334665 0.476013 -0.289444 +v 0.326285 0.470906 -0.277722 +v 0.327140 0.462623 -0.278937 +v 0.332869 0.457267 -0.287078 +v 0.317049 0.484677 -0.333836 +v 0.310247 0.488864 -0.335173 +v 0.318446 0.475271 -0.335895 +v 0.317049 0.484677 -0.333836 +v 0.313042 0.470052 -0.339289 +v 0.305419 0.476550 -0.340295 +v 0.304843 0.483644 -0.338568 +v 0.326947 0.461178 -0.383792 +v 0.349945 0.443629 -0.395793 +v 0.360427 0.441323 -0.371523 +v 0.338447 0.458095 -0.360053 +v 0.349945 0.443629 -0.395793 +v 0.377886 0.443056 -0.407066 +v 0.387130 0.440775 -0.382297 +v 0.360427 0.441323 -0.371523 +v 0.403282 0.459613 -0.414590 +v 0.411402 0.456599 -0.389488 +v 0.419329 0.488864 -0.416350 +v 0.426738 0.484555 -0.391170 +v 0.421726 0.522972 -0.411873 +v 0.429029 0.517152 -0.386891 +v 0.409832 0.552796 -0.402360 +v 0.417661 0.545656 -0.377799 +v 0.386833 0.570345 -0.390359 +v 0.395681 0.562428 -0.366329 +v 0.358892 0.570918 -0.379085 +v 0.368978 0.562976 -0.355555 +v 0.333496 0.554361 -0.371561 +v 0.344706 0.547152 -0.348364 +v 0.317450 0.525110 -0.369801 +v 0.329370 0.519196 -0.346682 +v 0.315052 0.491003 -0.374278 +v 0.327079 0.486599 -0.350961 +v 0.397269 0.537434 -0.291636 +v 0.377640 0.524608 -0.285825 +v 0.388754 0.517548 -0.262472 +v 0.407352 0.529701 -0.267978 +v 0.418873 0.536965 -0.300357 +v 0.427821 0.529257 -0.276241 +v 0.436663 0.523326 -0.309650 +v 0.444677 0.516333 -0.285046 +v 0.445872 0.500172 -0.317026 +v 0.453403 0.494395 -0.292035 +v 0.444034 0.473706 -0.320509 +v 0.451661 0.469319 -0.295335 +v 0.431639 0.451021 -0.319164 +v 0.439918 0.447825 -0.294061 +v 0.412011 0.438195 -0.313353 +v 0.421320 0.435672 -0.288555 +v 0.390407 0.438664 -0.304632 +v 0.400850 0.436117 -0.280292 +v 0.372617 0.452303 -0.295339 +v 0.390407 0.438664 -0.304632 +v 0.400850 0.436117 -0.280292 +v 0.383994 0.449040 -0.271487 +v 0.363407 0.475458 -0.287963 +v 0.375268 0.470978 -0.264498 +v 0.365246 0.501923 -0.284480 +v 0.377010 0.496054 -0.261198 +v 0.370091 0.553852 -0.358239 +v 0.349585 0.540452 -0.352168 +v 0.381481 0.519272 -0.288575 +v 0.398229 0.530216 -0.293533 +v 0.392660 0.553362 -0.367349 +v 0.416662 0.529816 -0.300974 +v 0.411245 0.539113 -0.377058 +v 0.431841 0.518178 -0.308903 +v 0.420866 0.514924 -0.384764 +v 0.439699 0.498422 -0.315197 +v 0.418946 0.487276 -0.388402 +v 0.438130 0.475841 -0.318168 +v 0.405998 0.463577 -0.386997 +v 0.427555 0.456485 -0.317021 +v 0.385492 0.450177 -0.380926 +v 0.410807 0.445542 -0.312063 +v 0.362922 0.450667 -0.371816 +v 0.392374 0.445942 -0.304622 +v 0.344337 0.464916 -0.362107 +v 0.362922 0.450667 -0.371816 +v 0.392374 0.445942 -0.304622 +v 0.377195 0.457579 -0.296693 +v 0.334716 0.489105 -0.354401 +v 0.369337 0.477336 -0.290399 +v 0.336637 0.516753 -0.350763 +v 0.370906 0.499917 -0.287428 +v 0.362922 0.450667 -0.371816 +v 0.344337 0.464916 -0.362107 +v 0.385492 0.450177 -0.380926 +v 0.362922 0.450667 -0.371816 +v 0.405998 0.463577 -0.386997 +v 0.418946 0.487276 -0.388402 +v 0.420866 0.514924 -0.384764 +v 0.411245 0.539113 -0.377058 +v 0.392660 0.553362 -0.367349 +v 0.370091 0.553852 -0.358239 +v 0.349585 0.540452 -0.352168 +v 0.336637 0.516753 -0.350763 +v 0.334716 0.489105 -0.354401 +v 0.398229 0.530216 -0.293533 +v 0.381481 0.519272 -0.288575 +v 0.416662 0.529816 -0.300974 +v 0.431841 0.518178 -0.308903 +v 0.439699 0.498422 -0.315197 +v 0.438130 0.475841 -0.318168 +v 0.427555 0.456485 -0.317021 +v 0.410807 0.445542 -0.312063 +v 0.392374 0.445942 -0.304622 +v 0.377195 0.457579 -0.296693 +v 0.392374 0.445942 -0.304622 +v 0.369337 0.477336 -0.290399 +v 0.370906 0.499917 -0.287428 +v 0.404246 0.449455 -0.280731 +v 0.392141 0.458736 -0.274407 +v 0.418947 0.449135 -0.286666 +v 0.404246 0.449455 -0.280731 +v 0.432304 0.457863 -0.290620 +v 0.440738 0.473300 -0.291535 +v 0.441989 0.491309 -0.289165 +v 0.435722 0.507065 -0.284146 +v 0.423617 0.516346 -0.277822 +v 0.408916 0.516665 -0.271888 +v 0.395559 0.507937 -0.267933 +v 0.387125 0.492501 -0.267019 +v 0.385874 0.474492 -0.269388 +v 0.377886 0.443056 -0.407066 +v 0.349945 0.443629 -0.395793 +v 0.358892 0.570918 -0.379085 +v 0.386833 0.570345 -0.390359 +v 0.326947 0.461178 -0.383792 +v 0.333496 0.554361 -0.371561 +v 0.409832 0.552796 -0.402360 +v 0.403282 0.459613 -0.414590 +v 0.421726 0.522972 -0.411873 +v 0.419329 0.488864 -0.416350 +v 0.315052 0.491003 -0.374278 +v 0.317450 0.525110 -0.369801 +v -0.130418 0.158016 -0.002096 +v -0.125108 0.155232 -0.017533 +v -0.123871 0.273397 -0.047969 +v -0.132647 0.277999 -0.022455 +v -0.135999 0.151956 -0.029571 +v -0.141871 0.267983 -0.067865 +v -0.152199 0.151464 -0.026172 +v -0.168646 0.267170 -0.062247 +v -0.157509 0.154248 -0.010735 +v -0.177422 0.271772 -0.036733 +v -0.146618 0.157524 0.001303 +v -0.159422 0.277186 -0.016837 +v -0.130418 0.158016 -0.002096 +v -0.132647 0.277999 -0.022455 +v -0.132647 0.277999 -0.022455 +v -0.123871 0.273397 -0.047969 +v -0.141871 0.267983 -0.067865 +v -0.168646 0.267170 -0.062247 +v -0.177422 0.271772 -0.036733 +v -0.159422 0.277186 -0.016837 +v 0.151840 0.150534 0.442825 +v 0.125064 0.150534 0.570251 +v 0.125064 0.176347 0.570251 +v 0.151840 0.176347 0.442825 +v 0.212470 0.193445 0.586103 +v 0.239245 0.193445 0.458678 +v 0.212470 0.150534 0.586103 +v 0.239245 0.150534 0.458678 +v 0.125064 0.150534 0.570251 +v 0.212470 0.150534 0.586103 +v 0.239245 0.150534 0.458678 +v 0.151840 0.150534 0.442825 +v 0.249346 0.054440 0.412439 +v -0.115625 0.054439 0.346246 +v -0.115625 0.131554 0.346246 +v 0.249346 0.131554 0.412439 +v 0.204283 0.131554 0.626893 +v -0.160688 0.131554 0.560700 +v -0.160688 0.054439 0.560700 +v 0.204283 0.054440 0.626893 +v -0.160688 0.054439 0.560700 +v -0.160688 0.131554 0.560700 +v 0.030698 0.074088 0.594196 +v -0.118020 0.074088 0.567224 +v -0.134023 0.076372 0.643383 +v 0.014695 0.076372 0.670356 +v -0.134023 0.053193 0.643383 +v 0.014695 0.053193 0.670356 +v 0.014695 0.053193 0.670356 +v -0.134023 0.053193 0.643383 +v -0.118020 0.055383 0.567224 +v 0.030698 0.055383 0.594196 +v -0.118020 0.055383 0.567224 +v -0.134023 0.053193 0.643383 +v 0.014695 0.053193 0.670356 +v 0.030698 0.055383 0.594196 +v 0.001930 -0.003114 0.631416 +v -0.106431 -0.003114 0.611763 +v -0.116103 0.058063 0.610008 +v 0.011602 0.058063 0.633170 +v 0.006190 0.058063 0.658929 +v -0.121516 0.058063 0.635767 +v -0.111844 -0.003114 0.637521 +v -0.003482 -0.003114 0.657175 +v -0.106431 -0.003114 0.611763 +v -0.116103 0.058063 0.610008 +v 0.001930 -0.003114 0.631416 +v 0.011602 0.058063 0.633170 +v 0.269322 -0.003288 0.384617 +v -0.130676 -0.003288 0.312070 +v -0.133519 0.055359 0.325597 +v 0.266479 0.055359 0.398144 +v -0.186922 0.055359 0.579744 +v 0.213076 0.055359 0.652290 +v -0.189765 -0.003288 0.593271 +v 0.210233 -0.003288 0.665817 +v -0.130676 -0.003288 0.312070 +v -0.189765 -0.003288 0.593271 +v 0.210233 -0.003288 0.665817 +v 0.269322 -0.003288 0.384617 +v 0.260499 0.119982 0.407943 +v -0.129778 0.114963 0.337160 +v -0.129778 0.151157 0.337160 +v 0.260499 0.151157 0.407943 +v -0.177965 0.151157 0.566483 +v 0.212311 0.151157 0.637266 +v -0.177965 0.114963 0.566483 +v 0.212311 0.119982 0.637266 +v 0.212311 0.119982 0.637266 +v -0.177965 0.114963 0.566483 +v -0.129778 0.114963 0.337160 +v 0.260499 0.119982 0.407943 +v -0.129778 0.114963 0.337160 +v -0.177965 0.114963 0.566483 +v 0.212311 0.119982 0.637266 +v 0.260499 0.119982 0.407943 +v -0.222300 0.118426 -0.596550 +v -0.245786 0.118426 -0.579001 +v -0.212467 0.120719 -0.309309 +v -0.183450 0.120719 -0.306128 +v -0.245786 0.118426 -0.579001 +v -0.243482 0.124890 -0.544751 +v -0.184260 0.124890 -0.556156 +v -0.188087 0.118426 -0.593086 +v -0.156860 0.120719 -0.315354 +v -0.161260 0.124890 -0.334844 +v -0.216432 0.124890 -0.328119 +v -0.212467 0.120719 -0.309309 +v -0.188087 0.118426 -0.593086 +v -0.156860 0.120719 -0.315354 +v -0.235011 0.134033 -0.439582 +v -0.173953 0.134033 -0.451037 +v -0.173953 0.114024 -0.451037 +v -0.235011 0.114024 -0.439582 +v -0.119065 0.108325 -0.584458 +v -0.151411 0.108325 -0.590904 +v -0.117136 0.112123 -0.306193 +v -0.087578 0.112123 -0.319203 +v -0.186388 0.108325 -0.578329 +v -0.184027 0.119031 -0.554069 +v -0.116544 0.119031 -0.560137 +v -0.119065 0.108325 -0.584458 +v -0.154635 0.112123 -0.305797 +v -0.186388 0.108325 -0.578329 +v -0.173755 0.138312 -0.457917 +v -0.105557 0.138312 -0.464577 +v -0.105557 0.108165 -0.464577 +v -0.173755 0.108165 -0.457917 +v -0.087578 0.112123 -0.319203 +v -0.093980 0.119031 -0.351118 +v -0.161651 0.119031 -0.336739 +v -0.154635 0.112123 -0.305797 +v -0.086177 0.107347 -0.601870 +v -0.118307 0.107347 -0.589580 +v -0.089083 0.111290 -0.325584 +v -0.058206 0.111290 -0.330401 +v -0.118307 0.107347 -0.589580 +v -0.118340 0.118464 -0.572183 +v -0.055611 0.118464 -0.565524 +v -0.063742 0.107347 -0.588814 +v -0.034755 0.111290 -0.344658 +v -0.037224 0.118464 -0.360889 +v -0.093361 0.118464 -0.344161 +v -0.089083 0.111290 -0.325584 +v -0.063742 0.107347 -0.588814 +v -0.034755 0.111290 -0.344658 +v -0.047579 0.107598 -0.457113 +v -0.047579 0.133906 -0.457113 +v -0.105951 0.107598 -0.463304 +v -0.105951 0.133906 -0.463304 +v -0.123351 0.168510 -0.395821 +v -0.134459 0.163833 -0.392509 +v -0.120835 0.170849 -0.407669 +v -0.129427 0.168510 -0.416206 +v -0.140535 0.163833 -0.412895 +v -0.143051 0.161494 -0.401047 +v -0.123998 0.175660 -0.393911 +v -0.136825 0.170259 -0.390087 +v -0.121093 0.178361 -0.407592 +v -0.131015 0.175660 -0.417450 +v -0.143841 0.170259 -0.413626 +v -0.146747 0.167559 -0.399945 +v -0.127304 0.182087 -0.394642 +v -0.138413 0.177409 -0.391331 +v -0.124789 0.184426 -0.406490 +v -0.133381 0.182087 -0.415028 +v -0.144489 0.177409 -0.411716 +v -0.147005 0.175071 -0.399868 +v -0.142925 0.168223 -0.416844 +v -0.147347 0.159714 -0.422416 +v -0.134310 0.173364 -0.420161 +v -0.130117 0.169996 -0.429049 +v -0.134539 0.161487 -0.434621 +v -0.143154 0.156346 -0.431304 +v -0.146398 0.172877 -0.417981 +v -0.151504 0.163052 -0.424414 +v -0.136450 0.178814 -0.421811 +v -0.131609 0.174924 -0.432074 +v -0.136715 0.165099 -0.438507 +v -0.146663 0.159163 -0.434677 +v -0.148573 0.176490 -0.421867 +v -0.152996 0.167980 -0.427439 +v -0.139958 0.181631 -0.425184 +v -0.135766 0.178262 -0.434073 +v -0.140188 0.169753 -0.439644 +v -0.148803 0.164612 -0.436327 +v -0.157642 0.145063 -0.388504 +v -0.134850 0.146416 -0.380518 +v -0.135327 0.163625 -0.376442 +v -0.161176 0.162091 -0.385499 +v -0.111678 0.146416 -0.387425 +v -0.109047 0.163625 -0.384276 +v -0.096977 0.145063 -0.406587 +v -0.092375 0.162091 -0.406007 +v -0.096363 0.142874 -0.430684 +v -0.091678 0.159608 -0.433336 +v -0.110070 0.140685 -0.450512 +v -0.107224 0.157125 -0.455824 +v -0.132863 0.139332 -0.458497 +v -0.133073 0.155591 -0.464880 +v -0.156034 0.139332 -0.451590 +v -0.159353 0.155591 -0.457047 +v -0.170735 0.140685 -0.432429 +v -0.176025 0.157125 -0.435316 +v -0.171349 0.142874 -0.408332 +v -0.176722 0.159608 -0.407987 +v -0.134324 0.136364 -0.489546 +v -0.122222 0.136364 -0.488295 +v -0.121089 0.159136 -0.484495 +v -0.136210 0.159136 -0.486058 +v -0.112779 0.136364 -0.495968 +v -0.109291 0.159136 -0.494082 +v -0.111528 0.136364 -0.508071 +v -0.107728 0.159136 -0.509203 +v -0.119201 0.136364 -0.517513 +v -0.117315 0.159136 -0.521001 +v -0.131304 0.136364 -0.518764 +v -0.132436 0.159136 -0.522564 +v -0.140746 0.136364 -0.511091 +v -0.144234 0.159136 -0.512977 +v -0.140746 0.136364 -0.511091 +v -0.141997 0.136364 -0.498988 +v -0.145797 0.159136 -0.497856 +v -0.144234 0.159136 -0.512977 +v -0.136612 0.181759 -0.485314 +v -0.120847 0.181759 -0.483685 +v -0.122669 0.181759 -0.489795 +v -0.133580 0.181759 -0.490923 +v -0.108547 0.181759 -0.493680 +v -0.114156 0.181759 -0.496712 +v -0.106918 0.181759 -0.509445 +v -0.113028 0.181759 -0.507623 +v -0.116913 0.181759 -0.521745 +v -0.119946 0.181759 -0.516136 +v -0.132678 0.181759 -0.523374 +v -0.130857 0.181759 -0.517264 +v -0.144978 0.181759 -0.513379 +v -0.139370 0.181759 -0.510347 +v -0.144978 0.181759 -0.513379 +v -0.146608 0.181759 -0.497614 +v -0.140497 0.181759 -0.499435 +v -0.139370 0.181759 -0.510347 +v -0.133580 0.181759 -0.490923 +v -0.122669 0.181759 -0.489795 +v -0.127796 0.145224 -0.493533 +v -0.139370 0.181759 -0.510347 +v -0.136759 0.145224 -0.504563 +v -0.024037 0.120296 -0.395128 +v -0.083348 0.111105 -0.389559 +v -0.083348 0.148428 -0.389559 +v -0.024037 0.154833 -0.395128 +v -0.075052 0.148428 -0.361303 +v -0.022894 0.154833 -0.359032 +v -0.075052 0.108060 -0.361303 +v -0.022894 0.120296 -0.359032 +v -0.238693 0.117332 -0.366589 +v -0.226012 0.117332 -0.326800 +v -0.226012 0.157797 -0.326800 +v -0.238693 0.157797 -0.366589 +v -0.022894 0.120296 -0.359032 +v -0.024037 0.120296 -0.395128 +v -0.169733 0.154924 -0.346062 +v -0.226012 0.117332 -0.326800 +v -0.169733 0.111105 -0.346062 +v -0.177267 0.154924 -0.377689 +v -0.177267 0.111105 -0.377689 +v -0.238693 0.117332 -0.366589 +v -0.122523 0.152636 -0.354845 +v -0.122523 0.109432 -0.354845 +v -0.130917 0.111105 -0.383064 +v -0.130917 0.152636 -0.383064 +v -0.182380 -0.004393 -0.367513 +v -0.096051 0.128785 -0.381670 +v -0.043002 0.128785 -0.390739 +v -0.139849 -0.004393 -0.374784 +v -0.095970 0.128785 -0.359515 +v -0.182295 -0.004393 -0.344155 +v -0.139764 -0.004393 -0.351426 +v -0.042922 0.128785 -0.368585 +v -0.139849 -0.004393 -0.374784 +v -0.043002 0.128785 -0.390739 +v -0.058300 -0.004393 -0.384473 +v -0.101109 -0.004393 -0.378134 +v -0.198565 0.128785 -0.363244 +v -0.145170 0.128785 -0.371151 +v -0.144384 0.128785 -0.354426 +v -0.197779 0.128785 -0.346518 +v -0.100281 -0.004393 -0.360500 +v -0.057472 -0.004393 -0.366839 +v -0.058300 -0.004393 -0.384473 +v -0.145170 0.128785 -0.371151 +v -0.199045 -0.004393 -0.532142 +v -0.112737 0.128785 -0.546372 +v -0.059702 0.128785 -0.555484 +v -0.156524 -0.004393 -0.539447 +v -0.112698 0.128785 -0.524359 +v -0.199004 -0.004393 -0.508932 +v -0.156483 -0.004393 -0.516238 +v -0.059663 0.128785 -0.533471 +v -0.156524 -0.004393 -0.539447 +v -0.059702 0.128785 -0.555484 +v -0.075073 -0.004393 -0.549465 +v -0.117825 -0.004393 -0.542935 +v -0.215155 0.128785 -0.527625 +v -0.161831 0.128785 -0.535770 +v -0.161196 0.128785 -0.519548 +v -0.214520 0.128785 -0.511403 +v -0.117155 -0.004393 -0.525831 +v -0.074403 -0.004393 -0.532362 +v -0.075073 -0.004393 -0.549465 +v -0.161831 0.128785 -0.535770 +v -0.358559 0.061267 -0.295684 +v -0.316431 0.061267 -0.280847 +v -0.316229 0.085495 -0.289091 +v -0.353550 0.085495 -0.302235 +v -0.273627 0.061267 -0.293606 +v -0.278310 0.085495 -0.300394 +v -0.246498 0.061267 -0.329087 +v -0.254276 0.085495 -0.331826 +v -0.245405 0.061267 -0.373738 +v -0.253308 0.085495 -0.371383 +v -0.270766 0.061267 -0.410504 +v -0.275775 0.085495 -0.403953 +v -0.312894 0.061267 -0.425341 +v -0.313096 0.085495 -0.417097 +v -0.355698 0.061267 -0.412583 +v -0.351016 0.085495 -0.405795 +v -0.382827 0.061267 -0.377101 +v -0.375049 0.085495 -0.374362 +v -0.383920 0.061267 -0.332450 +v -0.376017 0.085495 -0.334806 +v -0.297152 -0.002659 -0.287135 +v -0.284143 -0.002659 -0.311192 +v -0.295893 0.066195 -0.323178 +v -0.303189 0.066195 -0.309686 +v -0.308200 -0.002659 -0.324200 +v -0.309385 0.066195 -0.330474 +v -0.308200 -0.002659 -0.324200 +v -0.321209 -0.002659 -0.300143 +v -0.316681 0.066195 -0.316982 +v -0.309385 0.066195 -0.330474 +v -0.243663 -0.002659 -0.375185 +v -0.268004 -0.002659 -0.387654 +v -0.280547 0.066195 -0.375474 +v -0.266895 0.066195 -0.368481 +v -0.280473 -0.002659 -0.363313 +v -0.287540 0.066195 -0.361822 +v -0.280473 -0.002659 -0.363313 +v -0.256132 -0.002659 -0.350844 +v -0.273888 0.066195 -0.354829 +v -0.287540 0.066195 -0.361822 +v -0.387992 -0.002659 -0.334543 +v -0.364867 -0.002659 -0.319941 +v -0.351462 0.066195 -0.331729 +v -0.364432 0.066195 -0.339918 +v -0.350266 -0.002659 -0.343067 +v -0.343273 0.066195 -0.344699 +v -0.350266 -0.002659 -0.343067 +v -0.373391 -0.002659 -0.357668 +v -0.356243 0.066195 -0.352888 +v -0.343273 0.066195 -0.344699 +v -0.335532 -0.002659 -0.420725 +v -0.348591 -0.002659 -0.396695 +v -0.336623 0.066195 -0.384757 +v -0.329298 0.066195 -0.398234 +v -0.324562 -0.002659 -0.383636 +v -0.323145 0.066195 -0.377432 +v -0.324562 -0.002659 -0.383636 +v -0.311503 -0.002659 -0.407666 +v -0.315821 0.066195 -0.390910 +v -0.323145 0.066195 -0.377432 +v -0.337313 -0.001527 -0.511268 +v -0.321777 -0.001527 -0.501458 +v -0.312771 0.044730 -0.509377 +v -0.321484 0.044730 -0.514879 +v -0.311967 -0.001527 -0.516995 +v -0.307269 0.044730 -0.518091 +v -0.311967 -0.001527 -0.516995 +v -0.327503 -0.001527 -0.526804 +v -0.315982 0.044730 -0.523593 +v -0.307269 0.044730 -0.518091 +v -0.317539 0.041420 -0.485162 +v -0.289236 0.041420 -0.475194 +v -0.289100 0.057697 -0.480732 +v -0.314173 0.057697 -0.489563 +v -0.260479 0.041420 -0.483765 +v -0.263625 0.057697 -0.488326 +v -0.242253 0.041420 -0.507603 +v -0.247479 0.057697 -0.509443 +v -0.241519 0.041420 -0.537601 +v -0.246828 0.057697 -0.536018 +v -0.258557 0.041420 -0.562301 +v -0.261922 0.057697 -0.557900 +v -0.286860 0.041420 -0.572269 +v -0.286996 0.057697 -0.566730 +v -0.315617 0.041420 -0.563697 +v -0.312471 0.057697 -0.559137 +v -0.333843 0.041420 -0.539860 +v -0.328617 0.057697 -0.538020 +v -0.334577 0.041420 -0.509862 +v -0.329268 0.057697 -0.511445 +v -0.240348 -0.001527 -0.538573 +v -0.256702 -0.001527 -0.546950 +v -0.265128 0.044730 -0.538767 +v -0.255956 0.044730 -0.534068 +v -0.265078 -0.001527 -0.530596 +v -0.269826 0.044730 -0.529595 +v -0.265078 -0.001527 -0.530596 +v -0.248725 -0.001527 -0.522220 +v -0.260655 0.044730 -0.524897 +v -0.269826 0.044730 -0.529595 +v -0.276284 -0.001527 -0.479418 +v -0.267544 -0.001527 -0.495580 +v -0.275438 0.044730 -0.503633 +v -0.280339 0.044730 -0.494568 +v -0.283706 -0.001527 -0.504320 +v -0.284502 0.044730 -0.508535 +v -0.283706 -0.001527 -0.504320 +v -0.292446 -0.001527 -0.488158 +v -0.289404 0.044730 -0.499470 +v -0.284502 0.044730 -0.508535 +v -0.302069 -0.001527 -0.569168 +v -0.310842 -0.001527 -0.553024 +v -0.302801 0.044730 -0.545003 +v -0.297881 0.044730 -0.554057 +v -0.294698 -0.001527 -0.544250 +v -0.293747 0.044730 -0.540082 +v -0.294698 -0.001527 -0.544250 +v -0.285925 -0.001527 -0.560394 +v -0.288826 0.044730 -0.549137 +v -0.293747 0.044730 -0.540082 +v -0.038421 0.112782 -0.554150 +v -0.098035 0.110861 -0.559599 +v -0.098035 0.150163 -0.559599 +v -0.038421 0.164664 -0.554150 +v -0.096671 0.150163 -0.529226 +v -0.039459 0.164664 -0.511608 +v -0.096671 0.107654 -0.529226 +v -0.039458 0.112782 -0.511608 +v -0.252342 0.111132 -0.542666 +v -0.253065 0.111132 -0.503330 +v -0.253065 0.166314 -0.503330 +v -0.252342 0.166314 -0.542666 +v -0.039458 0.112782 -0.511608 +v -0.038421 0.112782 -0.554150 +v -0.192004 0.157003 -0.521330 +v -0.253065 0.111132 -0.503330 +v -0.192004 0.110861 -0.521330 +v -0.194834 0.157003 -0.554953 +v -0.194834 0.110861 -0.554953 +v -0.252342 0.111132 -0.542666 +v -0.142571 0.154594 -0.530412 +v -0.142571 0.109098 -0.530412 +v -0.145344 0.110861 -0.561827 +v -0.145344 0.154594 -0.561827 +v 0.238997 0.465286 0.577452 +v 0.208140 0.465286 0.592603 +v 0.202793 0.537060 0.587095 +v 0.237909 0.537060 0.569854 +v 0.192081 0.465286 0.622996 +v 0.184518 0.537060 0.621683 +v 0.196954 0.465286 0.657025 +v 0.190064 0.537060 0.660408 +v 0.220898 0.465286 0.681690 +v 0.217312 0.537060 0.688477 +v 0.254767 0.465286 0.687571 +v 0.255855 0.537060 0.695169 +v 0.285624 0.465286 0.672420 +v 0.290971 0.537060 0.677928 +v 0.301683 0.465286 0.642026 +v 0.309246 0.537060 0.643340 +v 0.296810 0.465286 0.607998 +v 0.303700 0.537060 0.604615 +v 0.272866 0.465286 0.583333 +v 0.276452 0.537060 0.576546 +v 0.272866 0.465286 0.583333 +v 0.276452 0.537060 0.576546 +v 0.184518 0.537060 0.621683 +v 0.190064 0.537060 0.660408 +v 0.290971 0.537060 0.677928 +v 0.309246 0.537060 0.643340 +v 0.303700 0.537060 0.604615 +v 0.202793 0.537060 0.587095 +v 0.255855 0.537060 0.695169 +v 0.217312 0.537060 0.688477 +v 0.276452 0.537060 0.576546 +v 0.237909 0.537060 0.569854 +v 0.192081 0.465286 0.622996 +v 0.208140 0.465286 0.592603 +v 0.296810 0.465286 0.607998 +v 0.301683 0.465286 0.642026 +v 0.196954 0.465286 0.657025 +v 0.285624 0.465286 0.672420 +v 0.220898 0.465286 0.681690 +v 0.254767 0.465286 0.687571 +v 0.238997 0.465286 0.577452 +v 0.272866 0.465286 0.583333 +v 0.239613 0.535867 0.581755 +v 0.211168 0.535866 0.595721 +v 0.205640 0.581732 0.590027 +v 0.238488 0.581732 0.573899 +v 0.196364 0.535866 0.623740 +v 0.188545 0.581732 0.622382 +v 0.200856 0.535866 0.655109 +v 0.193733 0.581732 0.658606 +v 0.222929 0.535867 0.677846 +v 0.219222 0.581732 0.684863 +v 0.254151 0.535867 0.683267 +v 0.255276 0.581732 0.691123 +v 0.282596 0.535867 0.669301 +v 0.288124 0.581732 0.674996 +v 0.297400 0.535867 0.641283 +v 0.305219 0.581732 0.642641 +v 0.292908 0.535867 0.609914 +v 0.300031 0.581732 0.606416 +v 0.270835 0.535867 0.587176 +v 0.274543 0.581732 0.580160 +v 0.239613 0.535867 0.581755 +v 0.238488 0.581732 0.573899 +v 0.240848 0.446762 0.594326 +v 0.219771 0.449198 0.604820 +v 0.215916 0.467826 0.600613 +v 0.240580 0.467826 0.588504 +v 0.208728 0.449198 0.625720 +v 0.203081 0.467826 0.624906 +v 0.211936 0.446762 0.649045 +v 0.206976 0.467826 0.652104 +v 0.228170 0.442820 0.665883 +v 0.226113 0.467826 0.671819 +v 0.251229 0.438878 0.669805 +v 0.253184 0.467826 0.676519 +v 0.272305 0.436441 0.659311 +v 0.277848 0.467826 0.664410 +v 0.283348 0.436441 0.638411 +v 0.290683 0.467826 0.640117 +v 0.280140 0.438878 0.615086 +v 0.286788 0.467826 0.612918 +v 0.263906 0.442820 0.598248 +v 0.267651 0.467826 0.593204 +v 0.228634 0.400502 0.597361 +v 0.214664 0.406961 0.605745 +v 0.206615 0.406961 0.620980 +v 0.207561 0.400502 0.637245 +v 0.217141 0.390050 0.648328 +v 0.231696 0.379598 0.649997 +v 0.245666 0.373139 0.641612 +v 0.253715 0.373139 0.626378 +v 0.252769 0.379598 0.610113 +v 0.243189 0.390050 0.599029 +v 0.205890 0.349725 0.594831 +v 0.197550 0.354526 0.600327 +v 0.192495 0.354526 0.609895 +v 0.192654 0.349725 0.619881 +v 0.197968 0.341957 0.626471 +v 0.206406 0.334188 0.627147 +v 0.214746 0.329387 0.621651 +v 0.219801 0.329387 0.612084 +v 0.219641 0.334188 0.602097 +v 0.214328 0.341957 0.595508 +v 0.175231 0.307707 0.591772 +v 0.172703 0.307707 0.596556 +v 0.188148 0.366699 0.617535 +v 0.201265 0.366699 0.592708 +v 0.173591 0.303093 0.600085 +v 0.198080 0.348718 0.638663 +v 0.177007 0.298478 0.598830 +v 0.221131 0.330738 0.634962 +v 0.179534 0.298478 0.594046 +v 0.234249 0.330738 0.610135 +v 0.178647 0.303093 0.590517 +v 0.224316 0.348718 0.589008 +v 0.175231 0.307707 0.591772 +v 0.201265 0.366699 0.592708 +v 0.179534 0.298478 0.594046 +v 0.177007 0.298478 0.598830 +v 0.173591 0.303093 0.600085 +v 0.178647 0.303093 0.590517 +v 0.172703 0.307707 0.596556 +v 0.175231 0.307707 0.591772 +v 0.198080 0.348718 0.638663 +v 0.221131 0.330738 0.634962 +v 0.234249 0.330738 0.610135 +v 0.224316 0.348718 0.589008 +v 0.201265 0.366699 0.592708 +v 0.188148 0.366699 0.617535 +v 0.201484 0.465286 -0.581366 +v 0.194068 0.465286 -0.547800 +v 0.186427 0.537060 -0.547059 +v 0.194867 0.537060 -0.585257 +v 0.207797 0.465286 -0.516285 +v 0.202051 0.537060 -0.511195 +v 0.237428 0.465286 -0.498859 +v 0.235772 0.537060 -0.491364 +v 0.271643 0.465286 -0.502177 +v 0.274709 0.537060 -0.495140 +v 0.297373 0.465286 -0.524973 +v 0.303989 0.537060 -0.521082 +v 0.304789 0.465286 -0.558539 +v 0.312430 0.537060 -0.559281 +v 0.291060 0.465286 -0.590054 +v 0.296806 0.537060 -0.595144 +v 0.261429 0.465286 -0.607480 +v 0.263085 0.537060 -0.614976 +v 0.227214 0.465286 -0.604162 +v 0.224148 0.537060 -0.611199 +v 0.227214 0.465286 -0.604162 +v 0.224148 0.537060 -0.611199 +v 0.202051 0.537060 -0.511195 +v 0.235772 0.537060 -0.491364 +v 0.312430 0.537060 -0.559281 +v 0.296806 0.537060 -0.595144 +v 0.263085 0.537060 -0.614976 +v 0.186427 0.537060 -0.547059 +v 0.303989 0.537060 -0.521082 +v 0.274709 0.537060 -0.495140 +v 0.224148 0.537060 -0.611199 +v 0.194867 0.537060 -0.585257 +v 0.207797 0.465286 -0.516285 +v 0.194068 0.465286 -0.547800 +v 0.261429 0.465286 -0.607480 +v 0.291060 0.465286 -0.590054 +v 0.237428 0.465286 -0.498859 +v 0.304789 0.465286 -0.558539 +v 0.271643 0.465286 -0.502177 +v 0.297373 0.465286 -0.524973 +v 0.201484 0.465286 -0.581366 +v 0.227214 0.465286 -0.604162 +v 0.205231 0.535866 -0.579162 +v 0.198394 0.535866 -0.548219 +v 0.190495 0.581732 -0.547453 +v 0.198390 0.581732 -0.583185 +v 0.211050 0.535866 -0.519168 +v 0.205110 0.581732 -0.513905 +v 0.238366 0.535867 -0.503103 +v 0.236653 0.581732 -0.495354 +v 0.269907 0.535867 -0.506163 +v 0.273076 0.581732 -0.498887 +v 0.293626 0.535867 -0.527177 +v 0.300466 0.581732 -0.523154 +v 0.300463 0.535867 -0.558120 +v 0.308362 0.581732 -0.558886 +v 0.287807 0.535867 -0.587172 +v 0.293747 0.581732 -0.592434 +v 0.260491 0.535867 -0.603236 +v 0.262203 0.581732 -0.610985 +v 0.228950 0.535867 -0.600177 +v 0.225780 0.581732 -0.607452 +v 0.205231 0.535866 -0.579162 +v 0.198390 0.581732 -0.583185 +v 0.215824 0.446762 -0.572282 +v 0.210872 0.449198 -0.549265 +v 0.205179 0.467826 -0.548878 +v 0.211107 0.467826 -0.575706 +v 0.220313 0.449198 -0.527594 +v 0.216153 0.467826 -0.523688 +v 0.240541 0.446762 -0.515546 +v 0.239837 0.467826 -0.509760 +v 0.263829 0.442820 -0.517723 +v 0.267184 0.467826 -0.512412 +v 0.281283 0.438878 -0.533295 +v 0.287749 0.467826 -0.530633 +v 0.286234 0.436441 -0.556312 +v 0.293677 0.467826 -0.557462 +v 0.276793 0.436441 -0.577983 +v 0.282704 0.467826 -0.582651 +v 0.256566 0.438878 -0.590031 +v 0.259020 0.467826 -0.596579 +v 0.233278 0.442820 -0.587853 +v 0.231673 0.467826 -0.593927 +v 0.210575 0.400502 -0.560845 +v 0.208409 0.406961 -0.544696 +v 0.215290 0.406961 -0.528901 +v 0.228591 0.400502 -0.519490 +v 0.243229 0.390050 -0.520060 +v 0.253615 0.379598 -0.530392 +v 0.255781 0.373139 -0.546540 +v 0.248899 0.373139 -0.562336 +v 0.235599 0.379598 -0.571747 +v 0.220960 0.390050 -0.571177 +v 0.194405 0.349725 -0.544650 +v 0.193495 0.354526 -0.534705 +v 0.197817 0.354526 -0.524784 +v 0.205720 0.349725 -0.518677 +v 0.214185 0.341957 -0.518717 +v 0.219979 0.334188 -0.524889 +v 0.220889 0.329387 -0.534835 +v 0.216567 0.329387 -0.544755 +v 0.208664 0.334188 -0.550862 +v 0.200199 0.341957 -0.550822 +v 0.172883 0.307707 -0.522602 +v 0.175044 0.307707 -0.517642 +v 0.201075 0.366699 -0.516619 +v 0.189860 0.366699 -0.542362 +v 0.178355 0.303093 -0.516133 +v 0.223782 0.348718 -0.511197 +v 0.179506 0.298478 -0.519586 +v 0.235275 0.330738 -0.531518 +v 0.177345 0.298478 -0.524546 +v 0.224060 0.330738 -0.557261 +v 0.174033 0.303093 -0.526055 +v 0.201352 0.348718 -0.562683 +v 0.172883 0.307707 -0.522602 +v 0.189860 0.366699 -0.542362 +v 0.177345 0.298478 -0.524546 +v 0.179506 0.298478 -0.519586 +v 0.178355 0.303093 -0.516133 +v 0.174033 0.303093 -0.526055 +v 0.175044 0.307707 -0.517642 +v 0.172883 0.307707 -0.522602 +v 0.223782 0.348718 -0.511197 +v 0.235275 0.330738 -0.531518 +v 0.224060 0.330738 -0.557261 +v 0.201352 0.348718 -0.562683 +v 0.189860 0.366699 -0.542362 +v 0.201075 0.366699 -0.516619 +v 0.447426 -0.023026 -0.527494 +v 0.497054 -0.023026 -0.560465 +v 0.490319 0.140847 -0.564554 +v 0.443810 0.140847 -0.533656 +v 0.283243 -0.023026 -0.713133 +v 0.265381 -0.023026 -0.625157 +v 0.273208 0.140847 -0.625179 +v 0.289947 0.140847 -0.712765 +v 0.282737 -0.023026 -0.560465 +v 0.289472 0.140847 -0.564554 +v 0.332366 -0.023026 -0.527494 +v 0.335982 0.140847 -0.533656 +v 0.389896 -0.023026 -0.521362 +v 0.389896 0.140847 -0.527909 +v 0.348764 0.140847 -0.573050 +v 0.389896 0.140847 -0.568791 +v 0.389896 0.338447 -0.577627 +v 0.354534 0.338447 -0.581289 +v 0.318654 0.140847 -0.592486 +v 0.328648 0.338447 -0.597997 +v 0.307632 0.140847 -0.632399 +v 0.319173 0.338447 -0.632311 +v 0.318654 0.140847 -0.700484 +v 0.328648 0.338447 -0.699983 +v 0.431027 0.140847 -0.573050 +v 0.461138 0.140847 -0.592486 +v 0.451143 0.338447 -0.597997 +v 0.425257 0.338447 -0.581289 +v 0.461138 0.140847 -0.592486 +v 0.431027 0.140847 -0.573050 +v 0.307632 0.140847 -0.632399 +v 0.318654 0.140847 -0.700484 +v 0.318654 0.140847 -0.592486 +v 0.348764 0.140847 -0.573050 +v 0.389896 0.140847 -0.568791 +v 0.389896 0.921101 -0.547006 +v 0.334546 0.921101 -0.552738 +v 0.294027 0.921101 -0.578892 +v 0.279196 0.921101 -0.632602 +v 0.294027 0.921101 -0.701718 +v 0.460618 0.338447 -0.632311 +v 0.451143 0.338447 -0.699983 +v 0.485764 0.921101 -0.701718 +v 0.500595 0.921101 -0.632602 +v 0.485764 0.921101 -0.578892 +v 0.445245 0.921101 -0.552738 +v 0.294027 0.921101 -0.701718 +v 0.279196 0.921101 -0.632602 +v 0.500595 0.921101 -0.632602 +v 0.485764 0.921101 -0.701718 +v 0.485764 0.921101 -0.578892 +v 0.294027 0.921101 -0.578892 +v 0.447426 -0.023026 0.527494 +v 0.443810 0.140847 0.533656 +v 0.490319 0.140847 0.564554 +v 0.497054 -0.023026 0.560465 +v 0.283243 -0.023026 0.713133 +v 0.289947 0.140847 0.712765 +v 0.273208 0.140847 0.625179 +v 0.265381 -0.023026 0.625157 +v 0.289472 0.140847 0.564554 +v 0.282737 -0.023026 0.560465 +v 0.335982 0.140847 0.533656 +v 0.332366 -0.023026 0.527494 +v 0.389896 0.140847 0.527909 +v 0.389896 -0.023026 0.521362 +v 0.348764 0.140847 0.573050 +v 0.354534 0.338447 0.581289 +v 0.389896 0.338447 0.577627 +v 0.389896 0.140847 0.568791 +v 0.318654 0.140847 0.592486 +v 0.328648 0.338447 0.597997 +v 0.307632 0.140847 0.632399 +v 0.319173 0.338447 0.632311 +v 0.318654 0.140847 0.700484 +v 0.328648 0.338447 0.699983 +v 0.472159 0.140847 0.632399 +v 0.460618 0.338447 0.632311 +v 0.451143 0.338447 0.699983 +v 0.461138 0.140744 0.700484 +v 0.461138 0.140847 0.592486 +v 0.451143 0.338447 0.597997 +v 0.431027 0.140847 0.573050 +v 0.425257 0.338447 0.581289 +v 0.461138 0.140847 0.592486 +v 0.431027 0.140847 0.573050 +v 0.472159 0.140847 0.632399 +v 0.506584 0.140744 0.625179 +v 0.461138 0.140744 0.700484 +v 0.489845 0.140744 0.712765 +v 0.307632 0.140847 0.632399 +v 0.318654 0.140847 0.700484 +v 0.318654 0.140847 0.592486 +v 0.348764 0.140847 0.573050 +v 0.389896 0.140847 0.568791 +v 0.334546 0.921101 0.552738 +v 0.389896 0.921101 0.547006 +v 0.294027 0.921101 0.578892 +v 0.279196 0.921101 0.632602 +v 0.294027 0.921101 0.701718 +v 0.500595 0.921101 0.632602 +v 0.485764 0.921101 0.701718 +v 0.485764 0.921101 0.578892 +v 0.445245 0.921101 0.552738 +v 0.485764 0.921101 0.701718 +v 0.451143 0.338447 0.699983 +v 0.451143 0.338447 0.699983 +v 0.461138 0.140744 0.700484 +v 0.489845 0.140744 0.712765 +v 0.289947 0.140847 0.712765 +v 0.283243 -0.023026 0.713133 +v 0.496548 -0.025216 0.713133 +v 0.461138 0.140744 0.700484 +v 0.318654 0.140847 0.700484 +v 0.294027 0.921101 0.701718 +v 0.485764 0.921101 0.701718 +v 0.500595 0.921101 0.632602 +v 0.279196 0.921101 0.632602 +v 0.485764 0.921101 0.578892 +v 0.294027 0.921101 0.578892 +v -0.507325 -0.023026 -0.527494 +v -0.457697 -0.023026 -0.560465 +v -0.464432 0.140847 -0.564554 +v -0.510941 0.140847 -0.533656 +v -0.440341 -0.023026 -0.625157 +v -0.448167 0.140744 -0.625179 +v -0.458203 -0.023026 -0.713133 +v -0.464906 0.140744 -0.712765 +v -0.671508 -0.023026 -0.713133 +v -0.689370 -0.023026 -0.625157 +v -0.681543 0.140847 -0.625179 +v -0.664804 0.140847 -0.712765 +v -0.672014 -0.023026 -0.560465 +v -0.665279 0.140847 -0.564554 +v -0.622386 -0.023026 -0.527494 +v -0.618769 0.140847 -0.533656 +v -0.564855 -0.023026 -0.521362 +v -0.564855 0.140847 -0.527909 +v -0.605987 0.140847 -0.573050 +v -0.564855 0.140847 -0.568791 +v -0.564855 0.338447 -0.577627 +v -0.600217 0.338447 -0.581289 +v -0.636097 0.140847 -0.592486 +v -0.626103 0.338447 -0.597997 +v -0.647119 0.140847 -0.632399 +v -0.635578 0.338447 -0.632311 +v -0.636097 0.140847 -0.700484 +v -0.626103 0.338447 -0.699983 +v -0.482592 0.140847 -0.632399 +v -0.493613 0.140744 -0.700484 +v -0.503608 0.338447 -0.699983 +v -0.494133 0.338447 -0.632311 +v -0.493613 0.140847 -0.592486 +v -0.503608 0.338447 -0.597997 +v -0.523724 0.140847 -0.573050 +v -0.529494 0.338447 -0.581289 +v -0.493613 0.140847 -0.592486 +v -0.523724 0.140847 -0.573050 +v -0.482592 0.140847 -0.632399 +v -0.493613 0.140744 -0.700484 +v -0.647119 0.140847 -0.632399 +v -0.636097 0.140847 -0.700484 +v -0.636097 0.140847 -0.592486 +v -0.605987 0.140847 -0.573050 +v -0.564855 0.140847 -0.568791 +v -0.564855 0.921101 -0.547006 +v -0.620205 0.921101 -0.552738 +v -0.660724 0.921101 -0.578892 +v -0.675555 0.921101 -0.632602 +v -0.660724 0.921101 -0.701718 +v -0.468987 0.921101 -0.701718 +v -0.454156 0.921101 -0.632602 +v -0.468987 0.921101 -0.578892 +v -0.509506 0.921101 -0.552738 +v -0.660724 0.921101 -0.701718 +v -0.675555 0.921101 -0.632602 +v -0.454156 0.921101 -0.632602 +v -0.468987 0.921101 -0.701718 +v -0.468987 0.921101 -0.578892 +v -0.660724 0.921101 -0.578892 +v 0.287865 0.452463 -0.712307 +v 0.281151 0.452463 -0.529473 +v 0.281151 0.543283 -0.529473 +v 0.287865 0.543283 -0.712307 +v 0.297407 0.566384 -0.711724 +v 0.387829 0.566384 -0.711724 +v 0.387829 0.429362 -0.711724 +v 0.297407 0.429362 -0.711724 +v 0.292956 0.452463 -0.504722 +v 0.387502 0.452463 -0.503862 +v 0.387502 0.543283 -0.503862 +v 0.292956 0.543283 -0.504722 +v 0.484115 0.566384 -0.711724 +v 0.484115 0.429362 -0.711724 +v 0.484923 0.452463 -0.504907 +v 0.484923 0.543283 -0.504907 +v 0.291320 0.566384 -0.536528 +v 0.297407 0.566384 -0.711724 +v 0.302021 0.566384 -0.514091 +v 0.387725 0.566384 -0.513312 +v 0.476036 0.566384 -0.514259 +v 0.297407 0.429362 -0.711724 +v 0.291320 0.429362 -0.536528 +v 0.387725 0.429362 -0.513312 +v 0.476036 0.429362 -0.514259 +v 0.302021 0.429362 -0.514091 +v -0.665253 0.452463 -0.712307 +v -0.671967 0.452463 -0.561513 +v -0.671967 0.543283 -0.561513 +v -0.665253 0.543283 -0.712307 +v -0.655712 0.566384 -0.711724 +v -0.565289 0.566384 -0.711724 +v -0.459283 0.543283 -0.712307 +v -0.454486 0.543283 -0.566306 +v -0.454486 0.452463 -0.566306 +v -0.459283 0.452463 -0.712307 +v -0.565289 0.429362 -0.711724 +v -0.655712 0.429362 -0.711724 +v -0.660163 0.452463 -0.536762 +v -0.565616 0.452463 -0.535902 +v -0.565616 0.543283 -0.535902 +v -0.660163 0.543283 -0.536762 +v -0.469003 0.566384 -0.711724 +v -0.469003 0.429362 -0.711724 +v -0.468195 0.452463 -0.536947 +v -0.468195 0.543283 -0.536947 +v -0.661798 0.566384 -0.568567 +v -0.655712 0.566384 -0.711724 +v -0.469003 0.566384 -0.711724 +v -0.464654 0.566384 -0.572912 +v -0.651097 0.566384 -0.546131 +v -0.565393 0.566384 -0.545352 +v -0.477082 0.566384 -0.546299 +v -0.655712 0.429362 -0.711724 +v -0.661798 0.429362 -0.568567 +v -0.464654 0.429362 -0.572912 +v -0.469003 0.429362 -0.711724 +v -0.477082 0.429362 -0.546299 +v -0.565393 0.429362 -0.545352 +v -0.651097 0.429362 -0.546131 +v -0.565289 0.566384 -0.711724 +v -0.469003 0.566384 -0.711724 +v -0.469003 0.429362 -0.711724 +v -0.565289 0.429362 -0.711724 +v -0.655712 0.566384 -0.711724 +v -0.655712 0.429362 -0.711724 +v -0.459283 0.543283 -0.712307 +v -0.459283 0.452463 -0.712307 +v -0.665253 0.452463 -0.712307 +v -0.665253 0.543283 -0.712307 +v 0.287572 0.452463 0.712307 +v 0.287572 0.543283 0.712307 +v 0.280858 0.543283 0.529473 +v 0.280858 0.452463 0.529473 +v 0.297113 0.566384 0.711724 +v 0.387536 0.566384 0.711724 +v 0.387536 0.429362 0.711724 +v 0.297113 0.429362 0.711724 +v 0.292662 0.452463 0.504722 +v 0.292662 0.543283 0.504722 +v 0.387208 0.543283 0.503862 +v 0.387208 0.452463 0.503862 +v 0.483822 0.566384 0.711724 +v 0.483822 0.429362 0.711724 +v 0.484630 0.543283 0.504907 +v 0.484630 0.452463 0.504907 +v 0.297113 0.566384 0.711724 +v 0.291027 0.566384 0.536528 +v 0.301727 0.566384 0.514091 +v 0.387432 0.566384 0.513312 +v 0.475743 0.566384 0.514259 +v 0.291027 0.429362 0.536528 +v 0.297113 0.429362 0.711724 +v 0.475743 0.429362 0.514259 +v 0.387432 0.429362 0.513312 +v 0.301727 0.429362 0.514091 +v 0.387536 0.566384 0.711724 +v 0.387536 0.429362 0.711724 +v 0.483822 0.429362 0.711724 +v 0.483822 0.566384 0.711724 +v 0.297113 0.566384 0.711724 +v 0.297113 0.429362 0.711724 +v 0.493542 0.543283 0.712307 +v 0.493542 0.452463 0.712307 +v 0.287572 0.543283 0.712307 +v 0.287572 0.452463 0.712307 +v 0.356935 0.390241 -0.438596 +v 0.392690 0.396251 -0.438596 +v 0.395843 0.414817 -0.438596 +v 0.357632 0.415676 -0.438596 +v 0.434913 0.315227 -0.438596 +v 0.453264 0.315227 -0.438596 +v 0.356935 0.390241 -0.464081 +v 0.357632 0.415676 -0.464081 +v 0.395843 0.414817 -0.464081 +v 0.392690 0.396251 -0.464081 +v 0.453264 0.315227 -0.464081 +v 0.434913 0.315227 -0.464081 +v 0.356935 0.390241 -0.464081 +v 0.392690 0.396251 -0.464081 +v 0.392690 0.396251 -0.438596 +v 0.356935 0.390241 -0.438596 +v 0.357632 0.415676 -0.464081 +v 0.357632 0.415676 -0.438596 +v 0.427770 0.394532 -0.464081 +v 0.427770 0.394532 -0.438596 +v 0.434913 0.315227 -0.464081 +v 0.434913 0.315227 -0.438596 +v 0.453264 0.315227 -0.464081 +v 0.453264 0.315227 -0.438596 +v 0.392400 0.397413 -0.440706 +v 0.370854 0.393686 -0.440706 +v 0.373061 0.362676 -0.441905 +v 0.393228 0.365543 -0.441905 +v 0.396582 0.335854 -0.443950 +v 0.408561 0.347089 -0.443408 +v 0.438395 0.322336 -0.445899 +v 0.438179 0.336146 -0.443341 +v 0.392400 0.397413 -0.461971 +v 0.393228 0.365543 -0.460773 +v 0.373061 0.362676 -0.460773 +v 0.370854 0.393686 -0.461971 +v 0.408561 0.347089 -0.459496 +v 0.396582 0.335854 -0.458953 +v 0.438179 0.336146 -0.458676 +v 0.438395 0.322336 -0.456778 +v 0.370854 0.393686 -0.461971 +v 0.373061 0.362676 -0.460773 +v 0.373061 0.362676 -0.441905 +v 0.370854 0.393686 -0.440706 +v 0.393228 0.365543 -0.460773 +v 0.392400 0.397413 -0.461971 +v 0.392400 0.397413 -0.440706 +v 0.393228 0.365543 -0.441905 +v 0.396582 0.335854 -0.458953 +v 0.396582 0.335854 -0.443950 +v 0.408561 0.347089 -0.459496 +v 0.408561 0.347089 -0.443408 +v 0.438395 0.322336 -0.456778 +v 0.438395 0.322336 -0.445899 +v 0.438179 0.336146 -0.458676 +v 0.438179 0.336146 -0.443341 +v 0.328552 0.407789 -0.502376 +v 0.328552 0.418121 -0.365226 +v 0.328552 0.440254 -0.365226 +v 0.328552 0.446882 -0.502376 +v 0.453264 0.440254 -0.365226 +v 0.453264 0.446882 -0.502376 +v 0.453264 0.418121 -0.365226 +v 0.453264 0.407789 -0.502376 +v 0.453264 0.407789 -0.502376 +v 0.453264 0.418121 -0.365226 +v 0.328552 0.418121 -0.365226 +v 0.328552 0.407789 -0.502376 +v 0.328552 0.407813 -0.225458 +v 0.453264 0.407813 -0.225458 +v 0.453264 0.446857 -0.225458 +v 0.328552 0.446857 -0.225458 +v 0.453264 0.407789 -0.502376 +v 0.328552 0.407789 -0.502376 +v 0.453264 0.407813 -0.225458 +v 0.453264 0.407813 -0.225458 +v 0.328552 0.407813 -0.225458 +v 0.328552 0.407813 -0.225458 +v 0.356935 0.390241 -0.257355 +v 0.392690 0.396251 -0.257355 +v 0.395843 0.414817 -0.257355 +v 0.357632 0.415676 -0.257355 +v 0.434913 0.315227 -0.257355 +v 0.453264 0.315227 -0.257355 +v 0.356935 0.390241 -0.282839 +v 0.357632 0.415676 -0.282839 +v 0.395843 0.414817 -0.282839 +v 0.392690 0.396251 -0.282839 +v 0.453264 0.315227 -0.282839 +v 0.434913 0.315227 -0.282839 +v 0.356935 0.390241 -0.282839 +v 0.392690 0.396251 -0.282839 +v 0.392690 0.396251 -0.257355 +v 0.356935 0.390241 -0.257355 +v 0.357632 0.415676 -0.282839 +v 0.357632 0.415676 -0.257355 +v 0.427770 0.394532 -0.282839 +v 0.427770 0.394532 -0.257355 +v 0.434913 0.315227 -0.282839 +v 0.434913 0.315227 -0.257355 +v 0.453264 0.315227 -0.282839 +v 0.453264 0.315227 -0.257355 +v 0.392400 0.397413 -0.259464 +v 0.370854 0.393686 -0.259464 +v 0.373061 0.362676 -0.260663 +v 0.393228 0.365543 -0.260663 +v 0.396582 0.335854 -0.262709 +v 0.408561 0.347089 -0.262166 +v 0.438395 0.322336 -0.264658 +v 0.438179 0.336146 -0.262099 +v 0.392400 0.397413 -0.280730 +v 0.393228 0.365543 -0.279531 +v 0.373061 0.362676 -0.279531 +v 0.370854 0.393686 -0.280730 +v 0.408561 0.347089 -0.278254 +v 0.396582 0.335854 -0.277712 +v 0.438179 0.336146 -0.277435 +v 0.438395 0.322336 -0.275536 +v 0.370854 0.393686 -0.280730 +v 0.373061 0.362676 -0.279531 +v 0.373061 0.362676 -0.260663 +v 0.370854 0.393686 -0.259464 +v 0.393228 0.365543 -0.279531 +v 0.392400 0.397413 -0.280730 +v 0.392400 0.397413 -0.259464 +v 0.393228 0.365543 -0.260663 +v 0.396582 0.335854 -0.277712 +v 0.396582 0.335854 -0.262709 +v 0.408561 0.347089 -0.278254 +v 0.408561 0.347089 -0.262166 +v 0.438395 0.322336 -0.275536 +v 0.438395 0.322336 -0.264658 +v 0.438179 0.336146 -0.277435 +v 0.438179 0.336146 -0.262099 +v 0.356935 0.392889 0.277542 +v 0.392690 0.397847 0.277542 +v 0.395843 0.413165 0.277542 +v 0.357632 0.413874 0.277542 +v 0.434913 0.331001 0.277542 +v 0.453264 0.331001 0.277542 +v 0.356935 0.392889 0.250185 +v 0.357632 0.413874 0.250185 +v 0.395843 0.413165 0.250185 +v 0.392690 0.397847 0.250185 +v 0.453264 0.331001 0.250185 +v 0.434913 0.331001 0.250185 +v 0.356935 0.392889 0.250185 +v 0.392690 0.397847 0.250185 +v 0.392690 0.397847 0.277542 +v 0.356935 0.392889 0.277542 +v 0.357632 0.413874 0.250185 +v 0.357632 0.413874 0.277542 +v 0.427770 0.396429 0.250185 +v 0.427770 0.396429 0.277542 +v 0.434913 0.331001 0.250185 +v 0.434913 0.331001 0.277542 +v 0.453264 0.331001 0.250185 +v 0.453264 0.331001 0.277542 +v 0.392400 0.398806 0.275278 +v 0.370854 0.395731 0.275278 +v 0.373061 0.370147 0.273991 +v 0.393228 0.372512 0.273991 +v 0.396582 0.348019 0.271795 +v 0.408561 0.357288 0.272377 +v 0.438395 0.336866 0.269702 +v 0.438179 0.348260 0.272449 +v 0.392400 0.398806 0.252449 +v 0.393228 0.372512 0.253736 +v 0.373061 0.370147 0.253736 +v 0.370854 0.395731 0.252449 +v 0.408561 0.357288 0.255107 +v 0.396582 0.348019 0.255689 +v 0.438179 0.348260 0.255986 +v 0.438395 0.336866 0.258025 +v 0.370854 0.395731 0.252449 +v 0.373061 0.370147 0.253736 +v 0.373061 0.370147 0.273991 +v 0.370854 0.395731 0.275278 +v 0.393228 0.372512 0.253736 +v 0.392400 0.398806 0.252449 +v 0.392400 0.398806 0.275278 +v 0.393228 0.372512 0.273991 +v 0.396582 0.348019 0.255689 +v 0.396582 0.348019 0.271795 +v 0.408561 0.357288 0.255107 +v 0.408561 0.357288 0.272377 +v 0.438395 0.336866 0.258025 +v 0.438395 0.336866 0.269702 +v 0.438179 0.348260 0.255986 +v 0.438179 0.348260 0.272449 +v 0.328552 0.407366 0.231556 +v 0.328552 0.415891 0.361479 +v 0.328552 0.434151 0.361479 +v 0.328552 0.439620 0.231556 +v 0.453264 0.434151 0.361479 +v 0.453264 0.439620 0.231556 +v 0.453264 0.415891 0.361479 +v 0.453264 0.407366 0.231556 +v 0.453264 0.407366 0.231556 +v 0.453264 0.415891 0.361479 +v 0.328552 0.415891 0.361479 +v 0.328552 0.407366 0.231556 +v 0.328552 0.407387 0.493882 +v 0.453264 0.407387 0.493882 +v 0.453264 0.439599 0.493882 +v 0.328552 0.439599 0.493882 +v 0.453264 0.407366 0.231556 +v 0.328552 0.407366 0.231556 +v 0.453264 0.407387 0.493882 +v 0.453264 0.407387 0.493882 +v 0.328552 0.407387 0.493882 +v 0.328552 0.407387 0.493882 +v 0.356935 0.392889 0.462431 +v 0.392690 0.397847 0.462431 +v 0.395843 0.413165 0.462431 +v 0.357632 0.413874 0.462431 +v 0.434913 0.331001 0.462431 +v 0.453264 0.331001 0.462431 +v 0.356935 0.392889 0.435082 +v 0.357632 0.413874 0.435082 +v 0.395843 0.413165 0.435082 +v 0.392690 0.397847 0.435082 +v 0.453264 0.331001 0.435082 +v 0.434913 0.331001 0.435082 +v 0.356935 0.392889 0.435082 +v 0.392690 0.397847 0.435082 +v 0.392690 0.397847 0.462431 +v 0.356935 0.392889 0.462431 +v 0.357632 0.413874 0.435082 +v 0.357632 0.413874 0.462431 +v 0.427770 0.396429 0.435082 +v 0.427770 0.396429 0.462431 +v 0.434913 0.331001 0.435082 +v 0.434913 0.331001 0.462431 +v 0.453264 0.331001 0.435082 +v 0.453264 0.331001 0.462431 +v 0.392400 0.398806 0.460167 +v 0.370854 0.395731 0.460167 +v 0.373061 0.370147 0.458881 +v 0.393228 0.372512 0.458881 +v 0.396582 0.348019 0.456685 +v 0.408561 0.357288 0.457267 +v 0.438395 0.336866 0.454593 +v 0.438179 0.348260 0.457339 +v 0.392400 0.398806 0.437346 +v 0.393228 0.372512 0.438632 +v 0.373061 0.370147 0.438632 +v 0.370854 0.395731 0.437346 +v 0.408561 0.357288 0.440002 +v 0.396582 0.348019 0.440584 +v 0.438179 0.348260 0.440881 +v 0.438395 0.336866 0.442919 +v 0.370854 0.395731 0.437346 +v 0.373061 0.370147 0.438632 +v 0.373061 0.370147 0.458881 +v 0.370854 0.395731 0.460167 +v 0.393228 0.372512 0.438632 +v 0.392400 0.398806 0.437346 +v 0.392400 0.398806 0.460167 +v 0.393228 0.372512 0.458881 +v 0.396582 0.348019 0.440584 +v 0.396582 0.348019 0.456685 +v 0.408561 0.357288 0.440002 +v 0.408561 0.357288 0.457267 +v 0.438395 0.336866 0.442919 +v 0.438395 0.336866 0.454593 +v 0.438179 0.348260 0.440881 +v 0.438179 0.348260 0.457339 +v 0.295252 0.154481 0.181062 +v 0.304289 0.154481 0.171602 +v 0.298081 0.208830 0.168869 +v 0.291829 0.208830 0.175414 +v 0.305693 0.154481 0.158160 +v 0.299052 0.208830 0.159568 +v 0.298927 0.154481 0.145868 +v 0.294372 0.208830 0.151064 +v 0.286577 0.154481 0.139423 +v 0.285827 0.208830 0.146605 +v 0.273358 0.154481 0.141286 +v 0.276682 0.208830 0.147894 +v 0.273358 0.154481 0.141286 +v 0.264321 0.154481 0.150746 +v 0.270429 0.208830 0.154439 +v 0.276682 0.208830 0.147894 +v 0.262918 0.154481 0.164188 +v 0.269458 0.208830 0.163739 +v 0.269683 0.154481 0.176480 +v 0.274139 0.208830 0.172243 +v 0.282034 0.154481 0.182925 +v 0.282684 0.208830 0.176703 +v 0.269471 0.230530 0.175511 +v 0.263536 0.225535 0.164246 +v 0.265515 0.221150 0.151991 +v 0.274652 0.219052 0.143427 +v 0.274652 0.219052 0.143427 +v 0.287457 0.220040 0.141825 +v 0.299039 0.223738 0.147797 +v 0.304974 0.228733 0.159062 +v 0.302996 0.233118 0.171317 +v 0.293859 0.235216 0.179881 +v 0.281054 0.234228 0.181483 +v 0.299039 0.223738 0.147797 +v 0.287457 0.220040 0.141825 +v 0.269471 0.230530 0.175511 +v 0.281054 0.234228 0.181483 +v 0.271029 0.158262 -0.172735 +v 0.257922 0.158262 -0.171859 +v 0.260665 0.212836 -0.165625 +v 0.269733 0.212836 -0.166231 +v 0.247766 0.158262 -0.162856 +v 0.253638 0.212836 -0.159396 +v 0.244440 0.158262 -0.149166 +v 0.251338 0.212836 -0.149924 +v 0.249215 0.158262 -0.136017 +v 0.254641 0.212836 -0.140827 +v 0.260267 0.158262 -0.128433 +v 0.262288 0.212836 -0.135580 +v 0.260267 0.158262 -0.128433 +v 0.273374 0.158262 -0.129309 +v 0.271356 0.212836 -0.136186 +v 0.262288 0.212836 -0.135580 +v 0.283530 0.158262 -0.138312 +v 0.278383 0.212836 -0.142415 +v 0.286856 0.158262 -0.152002 +v 0.280684 0.212836 -0.151887 +v 0.282081 0.158262 -0.165151 +v 0.277380 0.212836 -0.160984 +v 0.286356 0.234626 -0.151141 +v 0.283112 0.229610 -0.138774 +v 0.273335 0.225208 -0.131040 +v 0.260761 0.223100 -0.130895 +v 0.260761 0.223100 -0.130895 +v 0.250192 0.224093 -0.138393 +v 0.245665 0.227806 -0.150670 +v 0.248910 0.232822 -0.163037 +v 0.258686 0.237225 -0.170771 +v 0.271260 0.239332 -0.170916 +v 0.281829 0.238339 -0.163418 +v 0.245665 0.227806 -0.150670 +v 0.250192 0.224093 -0.138393 +v 0.286356 0.234626 -0.151141 +v 0.281829 0.238339 -0.163418 +v 0.209010 -0.000076 0.173785 +v 0.209010 -0.000076 0.214239 +v 0.209010 0.181010 0.234996 +v 0.209010 0.176927 0.187399 +v 0.209010 0.176927 0.187399 +v 0.448328 0.181010 0.234996 +v 0.448328 0.176928 0.187399 +v 0.448328 -0.000076 0.214239 +v 0.448328 -0.000076 0.173785 +v 0.209010 -0.000076 0.173785 +v 0.209010 0.176927 0.187399 +v 0.448328 0.176928 0.187399 +v 0.209010 -0.000076 -0.181187 +v 0.209010 0.176927 -0.194802 +v 0.209010 0.181010 -0.242399 +v 0.209010 -0.000076 -0.221641 +v 0.209010 0.176927 -0.194802 +v 0.448328 0.176928 -0.194802 +v 0.448328 0.181010 -0.242399 +v 0.448328 -0.000076 -0.221641 +v 0.448328 -0.000076 -0.181187 +v 0.448328 0.176928 -0.194802 +v 0.209010 0.176927 -0.194802 +v 0.209010 -0.000076 -0.181187 +v 0.236799 0.159738 -0.195177 +v 0.236799 0.160356 0.187208 +v 0.449134 0.160356 0.187208 +v 0.449134 0.159738 -0.195177 +v 0.236799 0.000058 -0.182929 +v 0.236799 0.000058 0.175948 +v -0.016243 0.016578 0.027980 +v -0.009101 0.022569 -0.030901 +v 0.020266 0.084240 -0.030428 +v 0.010908 0.076391 0.046722 +v -0.038111 0.027840 -0.082713 +v -0.017745 0.091147 -0.098317 +v -0.092192 0.030378 -0.107667 +v -0.088606 0.094473 -0.131013 +v -0.150687 0.029215 -0.096229 +v -0.165252 0.092949 -0.116026 +v -0.191254 0.024793 -0.052770 +v -0.218405 0.087155 -0.059083 +v -0.198396 0.018803 0.006111 +v -0.227763 0.079306 0.018068 +v -0.169386 0.013532 0.057923 +v -0.189752 0.072399 0.085957 +v -0.115305 0.010993 0.082876 +v -0.118891 0.069073 0.118652 +v -0.056810 0.012157 0.071439 +v -0.042245 0.070598 0.103666 +v -0.016243 0.016578 0.027980 +v 0.010908 0.076391 0.046722 +v 0.007001 0.200274 0.057504 +v 0.016041 0.207856 -0.017018 +v -0.010006 0.207730 -0.011885 +v -0.017080 0.201797 0.046433 +v -0.020675 0.214527 -0.082593 +v -0.038739 0.212951 -0.063202 +v -0.089122 0.217740 -0.114174 +v -0.092303 0.215465 -0.087916 +v -0.163156 0.216267 -0.099699 +v -0.150239 0.214313 -0.076588 +v -0.214498 0.210672 -0.044695 +v -0.190417 0.209934 -0.033544 +v -0.223538 0.203090 0.029827 +v -0.197491 0.204001 0.024774 +v -0.186822 0.196419 0.095402 +v -0.168759 0.198780 0.076091 +v -0.118375 0.193206 0.126983 +v -0.115195 0.196266 0.100805 +v -0.044341 0.194678 0.112508 +v -0.057258 0.197418 0.089477 +v 0.007001 0.200274 0.057504 +v -0.017080 0.201797 0.046433 +v -0.010006 0.171680 -0.015389 +v -0.017080 0.169198 0.043178 +v -0.038739 0.173863 -0.066924 +v -0.092303 0.174915 -0.091744 +v -0.150239 0.174433 -0.080368 +v -0.179960 0.174535 -0.032204 +v -0.186180 0.172353 0.019296 +v -0.160915 0.170433 0.064613 +v -0.113813 0.169508 0.086438 +v -0.062868 0.169932 0.076435 +v -0.017080 0.169198 0.043178 +v -0.194491 0.134516 0.097406 +v -0.119725 0.131007 0.131903 +v -0.234597 0.141804 0.025776 +v -0.224723 0.150085 -0.055626 +v -0.168641 0.156198 -0.115707 +v -0.087772 0.157806 -0.131519 +v -0.013006 0.154297 -0.097022 +v 0.027100 0.147010 -0.025393 +v 0.017226 0.138728 0.056010 +v -0.038856 0.132615 0.116091 +v 0.017226 0.138728 0.056010 +v 0.172675 -0.003610 0.193249 +v 0.121540 -0.003610 0.097689 +v 0.121540 0.061781 0.097689 +v 0.172675 0.061781 0.193249 +v 0.165399 0.069521 0.191045 +v 0.119337 0.069521 0.104966 +v 0.073887 0.069521 0.121388 +v 0.126520 0.069521 0.219748 +v 0.077115 0.061781 0.244384 +v 0.025980 0.061781 0.148824 +v 0.025980 -0.003610 0.148824 +v 0.077115 -0.003610 0.244384 +v 0.071085 -0.003610 0.115920 +v 0.071085 0.061781 0.115920 +v 0.129515 -0.003610 0.225112 +v 0.172675 -0.003610 0.193249 +v 0.172675 0.061781 0.193249 +v 0.129515 0.061781 0.225112 +v 0.119337 0.069521 0.104966 +v 0.165399 0.069521 0.191045 +v 0.073887 0.069521 0.121388 +v 0.079319 0.069521 0.237108 +v 0.033257 0.069521 0.151028 +v 0.165399 0.069521 0.191045 +v 0.126520 0.069521 0.219748 +v 0.033257 0.069521 0.151028 +v 0.079319 0.069521 0.237108 +v 0.060320 0.048261 0.218895 +v 0.059301 0.048261 0.148140 +v -0.084736 0.054316 0.150214 +v -0.083717 0.054316 0.220970 +v 0.059301 -0.006293 0.148140 +v -0.084736 -0.006293 0.150214 +v -0.083717 -0.006293 0.220970 +v 0.060320 -0.006293 0.218895 +v -0.200144 -0.006293 0.151877 +v -0.200144 0.048261 0.151877 +v -0.199125 0.048261 0.222632 +v -0.199125 -0.006293 0.222632 +v -0.281552 -0.006293 0.153049 +v -0.281552 0.048261 0.153049 +v -0.280533 0.048261 0.223804 +v -0.280533 -0.006293 0.223804 +v 0.144132 0.042900 -0.191441 +v 0.073372 0.042900 -0.192034 +v 0.072165 0.042900 -0.047986 +v 0.142925 0.042900 -0.047393 +v 0.073372 -0.051327 -0.192034 +v 0.072165 -0.051327 -0.047986 +v 0.142925 -0.051327 -0.047393 +v 0.144132 -0.051327 -0.191441 +v 0.071197 -0.051327 0.067430 +v 0.071197 0.057953 0.067430 +v 0.141957 0.057953 0.068023 +v 0.141958 -0.051327 0.068023 +v 0.070515 -0.051327 0.148843 +v 0.070515 0.042900 0.148843 +v 0.141275 0.042900 0.149436 +v 0.141275 -0.051327 0.149436 +v 0.057198 -0.003610 -0.271295 +v 0.035310 -0.003610 -0.165147 +v 0.035310 0.061781 -0.165147 +v 0.057198 0.061781 -0.271295 +v 0.061377 0.069521 -0.264944 +v 0.041661 0.069521 -0.169327 +v 0.087090 0.069521 -0.152849 +v 0.109619 0.069521 -0.262107 +v 0.163346 0.061781 -0.249407 +v 0.141458 0.061781 -0.143260 +v 0.141458 -0.003610 -0.143260 +v 0.163346 -0.003610 -0.249407 +v 0.085743 -0.003610 -0.146855 +v 0.085743 0.061781 -0.146855 +v 0.110753 -0.003610 -0.268145 +v 0.057198 -0.003610 -0.271295 +v 0.057198 0.061781 -0.271295 +v 0.110753 0.061781 -0.268145 +v 0.041661 0.069521 -0.169327 +v 0.061377 0.069521 -0.264944 +v 0.087090 0.069521 -0.152849 +v 0.156995 0.069521 -0.245228 +v 0.137278 0.069521 -0.149610 +v 0.061377 0.069521 -0.264944 +v 0.109619 0.069521 -0.262107 +v 0.137278 0.069521 -0.149610 +v 0.156995 0.069521 -0.245228 +v -0.261248 0.048261 -0.259379 +v -0.261248 0.048261 -0.188616 +v -0.117195 0.056181 -0.188616 +v -0.117195 0.056181 -0.259379 +v -0.261248 -0.006293 -0.188616 +v -0.117195 -0.006293 -0.188616 +v -0.117195 -0.006293 -0.259379 +v -0.261248 -0.006293 -0.259379 +v -0.001775 -0.006293 -0.188616 +v -0.001775 0.048261 -0.188616 +v -0.001775 0.048261 -0.259379 +v -0.001775 -0.006293 -0.259379 +v 0.079641 -0.006293 -0.188616 +v 0.079641 0.048261 -0.188616 +v 0.079641 0.048261 -0.259379 +v 0.079641 -0.006293 -0.259379 +v -0.374763 -0.003610 -0.185931 +v -0.284750 -0.003610 -0.125565 +v -0.284750 0.061780 -0.125565 +v -0.374763 0.061780 -0.185931 +v -0.367304 0.069521 -0.187402 +v -0.286220 0.069521 -0.133024 +v -0.253802 0.069521 -0.168862 +v -0.346452 0.069521 -0.230997 +v -0.314397 0.061780 -0.275944 +v -0.224384 0.061780 -0.215578 +v -0.224384 -0.003610 -0.215578 +v -0.314397 -0.003610 -0.275944 +v -0.248761 -0.003610 -0.165350 +v -0.248761 0.061780 -0.165350 +v -0.351615 -0.003610 -0.234327 +v -0.374763 -0.003610 -0.185931 +v -0.374763 0.061780 -0.185931 +v -0.351615 0.061780 -0.234327 +v -0.286220 0.069521 -0.133024 +v -0.367304 0.069521 -0.187402 +v -0.253802 0.069521 -0.168862 +v -0.312927 0.069521 -0.268485 +v -0.231843 0.069521 -0.214108 +v -0.367304 0.069521 -0.187402 +v -0.346452 0.069521 -0.230997 +v -0.231843 0.069521 -0.214108 +v -0.312927 0.069521 -0.268485 +v -0.360806 0.048261 0.150027 +v -0.290054 0.048261 0.151260 +v -0.287543 0.058608 0.007230 +v -0.358295 0.058608 0.005996 +v -0.290054 -0.006293 0.151260 +v -0.287543 0.004054 0.007230 +v -0.358295 -0.006293 0.005996 +v -0.360806 -0.006293 0.150027 +v -0.285531 -0.006293 -0.108173 +v -0.285531 0.048261 -0.108173 +v -0.356283 0.048261 -0.109406 +v -0.356283 -0.006293 -0.109406 +v -0.284112 -0.006293 -0.189577 +v -0.284112 0.048261 -0.189577 +v -0.354864 0.048261 -0.190810 +v -0.354864 -0.006293 -0.190810 +v -0.307878 -0.003610 0.254125 +v -0.231977 -0.003610 0.176759 +v -0.231977 0.061780 0.176759 +v -0.307878 0.061780 0.254125 +v -0.307951 0.069521 0.246522 +v -0.239579 0.069521 0.176832 +v -0.268838 0.069521 0.138371 +v -0.346963 0.069521 0.218003 +v -0.385244 0.061780 0.178223 +v -0.309342 0.061780 0.100858 +v -0.309342 -0.003610 0.100858 +v -0.385244 -0.003610 0.178223 +v -0.264458 -0.003610 0.134063 +v -0.264458 0.061780 0.134063 +v -0.351187 -0.003610 0.222465 +v -0.307878 -0.003610 0.254125 +v -0.307878 0.061780 0.254125 +v -0.351187 0.061780 0.222465 +v -0.239579 0.069521 0.176832 +v -0.307951 0.069521 0.246522 +v -0.268838 0.069521 0.138371 +v -0.377641 0.069521 0.178151 +v -0.309270 0.069521 0.108460 +v -0.307951 0.069521 0.246522 +v -0.346963 0.069521 0.218003 +v -0.309270 0.069521 0.108460 +v -0.377641 0.069521 0.178151 +v -0.289197 -0.005561 -0.197716 +v -0.289197 0.012898 -0.016541 +v -0.108022 0.042422 -0.016541 +v -0.108022 0.023963 -0.197716 +v -0.289197 -0.005561 0.164634 +v -0.108022 0.023963 0.164634 +v 0.073152 0.012898 -0.016541 +v 0.073152 -0.005561 -0.197716 +v 0.073152 -0.005561 0.164634 +v 0.209994 -0.009065 -0.341899 +v 0.264484 -0.009065 -0.366517 +v 0.254033 0.038065 -0.377229 +v 0.206483 0.037992 -0.356542 +v 0.297523 -0.009065 -0.412223 +v 0.283238 0.037848 -0.416462 +v 0.297523 -0.009065 -0.412223 +v 0.310382 -0.009065 -0.471676 +v 0.295111 0.037409 -0.467860 +v 0.283238 0.037848 -0.416462 +v 0.286947 -0.009065 -0.524863 +v 0.275435 0.036835 -0.514262 +v 0.238469 -0.009065 -0.557289 +v 0.233792 0.036308 -0.542967 +v 0.182978 -0.009065 -0.554253 +v 0.185636 0.036046 -0.541007 +v 0.122531 -0.009065 -0.540392 +v 0.133051 0.035850 -0.529720 +v 0.088189 -0.009065 -0.493503 +v 0.102702 0.036071 -0.489477 +v 0.090370 -0.009065 -0.435811 +v 0.103892 0.036573 -0.439424 +v 0.122120 -0.009065 -0.384463 +v 0.130800 0.037174 -0.394515 +v 0.155885 -0.009065 -0.346771 +v 0.159622 0.037670 -0.361422 +v 0.116660 0.076684 -0.428039 +v 0.108154 0.075302 -0.472094 +v 0.128929 0.076209 -0.512213 +v 0.173629 0.079306 -0.530079 +v 0.215812 0.082360 -0.539039 +v 0.256820 0.085794 -0.519921 +v 0.281088 0.088273 -0.481866 +v 0.278272 0.088848 -0.434662 +v 0.278272 0.088848 -0.434662 +v 0.258356 0.087988 -0.395608 +v 0.219497 0.085462 -0.370189 +v 0.177436 0.082313 -0.367469 +v 0.147084 0.079591 -0.392389 +v 0.173629 0.079306 -0.530079 +v 0.128929 0.076209 -0.512213 +v 0.147084 0.079591 -0.392389 +v 0.177436 0.082313 -0.367469 +v 0.215812 0.082360 -0.539039 +v 0.219497 0.085462 -0.370189 +v 0.256820 0.085794 -0.519921 +v 0.258356 0.087988 -0.395608 +v 0.278272 0.088848 -0.434662 +v 0.281088 0.088273 -0.481866 +v 0.108154 0.075302 -0.472094 +v 0.116660 0.076684 -0.428039 +v 0.338018 0.053237 -0.423677 +v 0.318740 0.053435 -0.440080 +v 0.250402 0.042896 -0.338065 +v 0.269680 0.042699 -0.321661 +v 0.315717 0.009001 -0.443183 +v 0.247379 -0.001538 -0.341168 +v 0.315717 0.009001 -0.443183 +v 0.360678 0.014417 -0.412731 +v 0.292340 0.003878 -0.310715 +v 0.247379 -0.001538 -0.341168 +v 0.360678 0.014417 -0.412731 +v 0.315717 0.009001 -0.443183 +v 0.318740 0.053435 -0.440080 +v 0.338018 0.053237 -0.423677 +v 0.250402 0.042896 -0.338065 +v 0.247379 -0.001538 -0.341168 +v 0.292340 0.003878 -0.310715 +v 0.269680 0.042699 -0.321661 +v 0.118395 0.043288 -0.338441 +v 0.140599 0.045689 -0.350356 +v 0.070189 0.045725 -0.451504 +v 0.047985 0.043323 -0.439589 +v 0.145943 0.001967 -0.357635 +v 0.075534 0.002003 -0.458782 +v 0.145943 0.001967 -0.357635 +v 0.101261 0.002064 -0.326303 +v 0.030851 0.002099 -0.427450 +v 0.075534 0.002003 -0.458782 +v 0.101261 0.002064 -0.326303 +v 0.145943 0.001967 -0.357635 +v 0.140599 0.045689 -0.350356 +v 0.118395 0.043288 -0.338441 +v 0.070189 0.045725 -0.451504 +v 0.075534 0.002003 -0.458782 +v 0.030851 0.002099 -0.427450 +v 0.047985 0.043323 -0.439589 +v 0.277106 0.277824 -0.328473 +v 0.281152 0.265830 -0.314653 +v 0.273795 0.257849 -0.323654 +v 0.270722 0.267450 -0.334248 +v 0.268716 0.261203 -0.302614 +v 0.264047 0.254117 -0.314355 +v 0.252234 0.268569 -0.304396 +v 0.251227 0.259986 -0.315649 +v 0.248188 0.280563 -0.318217 +v 0.248154 0.269588 -0.326243 +v 0.260623 0.285191 -0.330255 +v 0.257902 0.273319 -0.335542 +v 0.260623 0.285191 -0.330255 +v 0.257902 0.273319 -0.335542 +v 0.268716 0.261203 -0.302614 +v 0.281152 0.265830 -0.314653 +v 0.248188 0.280563 -0.318217 +v 0.252234 0.268569 -0.304396 +v 0.277106 0.277824 -0.328473 +v 0.260623 0.285191 -0.330255 +v 0.211114 0.139207 -0.475743 +v 0.212990 0.126615 -0.467921 +v 0.202887 0.121365 -0.460094 +v 0.190907 0.128707 -0.460088 +v 0.189031 0.141299 -0.467910 +v 0.199135 0.146549 -0.475737 +v 0.207478 0.136479 -0.450190 +v 0.199570 0.141325 -0.450186 +v 0.190907 0.128707 -0.460088 +v 0.202887 0.121365 -0.460094 +v 0.214147 0.139944 -0.455356 +v 0.212990 0.126615 -0.467921 +v 0.212908 0.148256 -0.460519 +v 0.211114 0.139207 -0.475743 +v 0.205001 0.153102 -0.460515 +v 0.199135 0.146549 -0.475737 +v 0.198332 0.149636 -0.455349 +v 0.189031 0.141299 -0.467910 +v 0.198332 0.149636 -0.455349 +v 0.189031 0.141299 -0.467910 +v 0.224371 0.162898 -0.407874 +v 0.209165 0.172217 -0.407867 +v 0.194547 0.138605 -0.446504 +v 0.208332 0.130157 -0.446510 +v 0.237195 0.169562 -0.417809 +v 0.224371 0.162898 -0.407874 +v 0.208332 0.130157 -0.446510 +v 0.219958 0.136198 -0.455517 +v 0.234814 0.185545 -0.427737 +v 0.217799 0.150689 -0.464518 +v 0.219608 0.194864 -0.427730 +v 0.204014 0.159137 -0.464512 +v 0.206784 0.188200 -0.417795 +v 0.192388 0.153095 -0.455504 +v 0.223516 0.169220 -0.411554 +v 0.214189 0.174937 -0.411550 +v 0.199570 0.141325 -0.450186 +v 0.207478 0.136479 -0.450190 +v 0.231383 0.173308 -0.417648 +v 0.223516 0.169220 -0.411554 +v 0.207478 0.136479 -0.450190 +v 0.214147 0.139944 -0.455356 +v 0.229922 0.183113 -0.423739 +v 0.212908 0.148256 -0.460519 +v 0.220595 0.188829 -0.423734 +v 0.205001 0.153102 -0.460515 +v 0.212728 0.184741 -0.417640 +v 0.198332 0.149636 -0.455349 +v 0.239133 0.227197 -0.346084 +v 0.236610 0.236868 -0.355140 +v 0.223200 0.204686 -0.389784 +v 0.225101 0.194937 -0.382466 +v 0.250760 0.221380 -0.345233 +v 0.235382 0.189179 -0.382115 +v 0.259865 0.225234 -0.353438 +v 0.243762 0.193170 -0.389084 +v 0.257343 0.234904 -0.362493 +v 0.241861 0.202919 -0.396403 +v 0.245716 0.240721 -0.363344 +v 0.231580 0.208677 -0.396753 +v 0.245716 0.240721 -0.363344 +v 0.231580 0.208677 -0.396753 +v 0.212728 0.184741 -0.417640 +v 0.214189 0.174937 -0.411550 +v 0.223516 0.169220 -0.411554 +v 0.231383 0.173308 -0.417648 +v 0.229922 0.183113 -0.423739 +v 0.220595 0.188829 -0.423734 +v 0.220595 0.188829 -0.423734 +v 0.205257 0.119740 -0.423302 +v 0.204920 0.148943 -0.439538 +v 0.201125 0.140748 -0.448590 +v 0.199633 0.106472 -0.436491 +v 0.219647 0.073808 -0.404714 +v 0.208057 0.092423 -0.409914 +v 0.230088 0.091297 -0.378793 +v 0.217357 0.109451 -0.387118 +v 0.212795 0.136058 -0.405330 +v 0.209754 0.159454 -0.428022 +v 0.220544 0.152829 -0.386856 +v 0.216201 0.173401 -0.412651 +v 0.224811 0.117889 -0.430238 +v 0.219187 0.104620 -0.443426 +v 0.214782 0.139455 -0.453434 +v 0.218577 0.147649 -0.444382 +v 0.217900 0.076654 -0.441431 +v 0.227611 0.090571 -0.416850 +v 0.236911 0.107599 -0.394054 +v 0.232349 0.134205 -0.412265 +v 0.223412 0.158161 -0.432866 +v 0.248037 0.142316 -0.369666 +v 0.240098 0.150977 -0.393791 +v 0.229858 0.172107 -0.417495 +v 0.214782 0.139455 -0.453434 +v 0.219187 0.104620 -0.443426 +v 0.240098 0.150977 -0.393791 +v 0.229858 0.172107 -0.417495 +v 0.505807 0.485693 -0.090672 +v 0.492953 0.490711 -0.087538 +v 0.495398 0.483847 -0.067237 +v 0.509081 0.478504 -0.070573 +v 0.479533 0.486421 -0.087323 +v 0.481111 0.479279 -0.067007 +v 0.470672 0.474459 -0.090109 +v 0.471679 0.466545 -0.069973 +v 0.469756 0.459396 -0.094832 +v 0.470704 0.450510 -0.075001 +v 0.477134 0.446984 -0.099688 +v 0.478558 0.437298 -0.080171 +v 0.489988 0.441965 -0.102822 +v 0.492241 0.431955 -0.083507 +v 0.503408 0.446257 -0.103037 +v 0.506527 0.436523 -0.083736 +v 0.512268 0.458218 -0.100252 +v 0.515960 0.449256 -0.080771 +v 0.513184 0.473281 -0.095528 +v 0.516935 0.465292 -0.075743 +v 0.513184 0.473281 -0.095528 +v 0.516935 0.465292 -0.075743 +v 0.479533 0.486421 -0.087323 +v 0.492953 0.490711 -0.087538 +v 0.512268 0.458218 -0.100252 +v 0.503408 0.446257 -0.103037 +v 0.470672 0.474459 -0.090109 +v 0.489988 0.441965 -0.102822 +v 0.469756 0.459396 -0.094832 +v 0.477134 0.446984 -0.099688 +v 0.505807 0.485693 -0.090672 +v 0.513184 0.473281 -0.095528 +v 0.496415 0.496376 -0.108124 +v 0.487577 0.498064 -0.103249 +v 0.493531 0.486667 -0.086789 +v 0.504471 0.482396 -0.089457 +v 0.477874 0.494509 -0.102650 +v 0.482109 0.483015 -0.086607 +v 0.471012 0.487069 -0.106555 +v 0.474568 0.472835 -0.088977 +v 0.469612 0.478586 -0.113475 +v 0.473789 0.460015 -0.092997 +v 0.474209 0.472299 -0.120763 +v 0.480068 0.449451 -0.097130 +v 0.483047 0.470611 -0.125639 +v 0.491007 0.445180 -0.099798 +v 0.492750 0.474166 -0.126238 +v 0.502429 0.448832 -0.099981 +v 0.499612 0.481607 -0.122333 +v 0.509971 0.459012 -0.097610 +v 0.501012 0.490090 -0.115414 +v 0.510750 0.471833 -0.093590 +v 0.501012 0.490090 -0.115414 +v 0.510750 0.471833 -0.093590 +v 0.483976 0.518942 -0.125287 +v 0.478848 0.516992 -0.120178 +v 0.471946 0.514011 -0.119212 +v 0.465906 0.511138 -0.122758 +v 0.463036 0.509470 -0.129461 +v 0.464431 0.509646 -0.136762 +v 0.469559 0.511596 -0.141871 +v 0.476461 0.514577 -0.142836 +v 0.482501 0.517450 -0.139292 +v 0.485372 0.519118 -0.132588 +v 0.485372 0.519118 -0.132588 +v 0.472899 0.540137 -0.125898 +v 0.470245 0.537626 -0.122734 +v 0.466032 0.535474 -0.121980 +v 0.461871 0.534503 -0.123922 +v 0.459350 0.535084 -0.127819 +v 0.459431 0.536995 -0.132183 +v 0.462086 0.539506 -0.135347 +v 0.466298 0.541657 -0.136101 +v 0.470459 0.542628 -0.134159 +v 0.472981 0.542047 -0.130262 +v 0.472981 0.542047 -0.130262 +v 0.461465 0.558424 -0.119445 +v 0.459359 0.557348 -0.119068 +v 0.464576 0.529437 -0.119615 +v 0.475506 0.535020 -0.121575 +v 0.457572 0.557980 -0.120466 +v 0.456291 0.529400 -0.128455 +v 0.457572 0.557980 -0.120466 +v 0.457890 0.559687 -0.122242 +v 0.458937 0.534948 -0.139254 +v 0.456291 0.529400 -0.128455 +v 0.459996 0.560762 -0.122619 +v 0.469867 0.540531 -0.141213 +v 0.461784 0.560131 -0.121221 +v 0.478152 0.540567 -0.132373 +v 0.459996 0.560762 -0.122619 +v 0.457890 0.559687 -0.122242 +v 0.457572 0.557980 -0.120466 +v 0.461784 0.560131 -0.121221 +v 0.459359 0.557348 -0.119068 +v 0.461465 0.558424 -0.119445 +v 0.456291 0.529400 -0.128455 +v 0.458937 0.534948 -0.139254 +v 0.469867 0.540531 -0.141213 +v 0.478152 0.540567 -0.132373 +v 0.475506 0.535020 -0.121575 +v 0.464576 0.529437 -0.119615 +v 0.509409 0.480392 0.078652 +v 0.512683 0.473204 0.058553 +v 0.499000 0.478546 0.055217 +v 0.496555 0.485411 0.075518 +v 0.484714 0.473978 0.054988 +v 0.483135 0.481120 0.075303 +v 0.475282 0.461245 0.057953 +v 0.474275 0.469158 0.078089 +v 0.474306 0.445209 0.062981 +v 0.473358 0.454095 0.082812 +v 0.482160 0.431997 0.068151 +v 0.480736 0.441684 0.087668 +v 0.495843 0.426654 0.071487 +v 0.493590 0.436665 0.090802 +v 0.510130 0.431223 0.071716 +v 0.507010 0.440956 0.091018 +v 0.519562 0.443956 0.068751 +v 0.515871 0.452918 0.088232 +v 0.520537 0.459991 0.063723 +v 0.516787 0.467981 0.083508 +v 0.516787 0.467981 0.083508 +v 0.520537 0.459991 0.063723 +v 0.483135 0.481120 0.075303 +v 0.507010 0.440956 0.091018 +v 0.515871 0.452918 0.088232 +v 0.496555 0.485411 0.075518 +v 0.474275 0.469158 0.078089 +v 0.493590 0.436665 0.090802 +v 0.473358 0.454095 0.082812 +v 0.480736 0.441684 0.087668 +v 0.516787 0.467981 0.083508 +v 0.509409 0.480392 0.078652 +v 0.500017 0.491076 0.096104 +v 0.508073 0.477095 0.077437 +v 0.497134 0.481367 0.074770 +v 0.491180 0.492764 0.091229 +v 0.485712 0.477715 0.074586 +v 0.481476 0.489208 0.090630 +v 0.478171 0.467534 0.076957 +v 0.474615 0.481769 0.094536 +v 0.477391 0.454714 0.080978 +v 0.473215 0.473285 0.101455 +v 0.483670 0.444151 0.085110 +v 0.477812 0.466999 0.108743 +v 0.494610 0.439879 0.087778 +v 0.486650 0.465311 0.113619 +v 0.506032 0.443531 0.087961 +v 0.496353 0.468866 0.114218 +v 0.513573 0.453712 0.085590 +v 0.503215 0.476306 0.110313 +v 0.514353 0.466532 0.081570 +v 0.504614 0.484789 0.103394 +v 0.504614 0.484789 0.103394 +v 0.514353 0.466532 0.081570 +v 0.482450 0.511691 0.108159 +v 0.487578 0.513642 0.113267 +v 0.475548 0.508710 0.107192 +v 0.469508 0.505837 0.110738 +v 0.466638 0.504170 0.117441 +v 0.468033 0.504345 0.124742 +v 0.473161 0.506296 0.129851 +v 0.480064 0.509277 0.130816 +v 0.486103 0.512150 0.127272 +v 0.488974 0.513817 0.120568 +v 0.488974 0.513817 0.120568 +v 0.473847 0.532325 0.110715 +v 0.476501 0.534836 0.113878 +v 0.469634 0.530174 0.109960 +v 0.465473 0.529203 0.111902 +v 0.462952 0.529784 0.115799 +v 0.463034 0.531694 0.120163 +v 0.465688 0.534205 0.123327 +v 0.469900 0.536357 0.124081 +v 0.474062 0.537328 0.122139 +v 0.476583 0.536747 0.118243 +v 0.476583 0.536747 0.118243 +v 0.465067 0.553124 0.107425 +v 0.479109 0.529720 0.109555 +v 0.468179 0.524136 0.107595 +v 0.462961 0.552048 0.107048 +v 0.459893 0.524100 0.116435 +v 0.461174 0.552679 0.108446 +v 0.461174 0.552679 0.108446 +v 0.459893 0.524100 0.116435 +v 0.462539 0.529647 0.127234 +v 0.461493 0.554386 0.110222 +v 0.473469 0.535231 0.129193 +v 0.463599 0.555462 0.110599 +v 0.481754 0.535266 0.120353 +v 0.465386 0.554831 0.109201 +v 0.463599 0.555462 0.110599 +v 0.465386 0.554831 0.109201 +v 0.461174 0.552679 0.108446 +v 0.461493 0.554386 0.110222 +v 0.462961 0.552048 0.107048 +v 0.465067 0.553124 0.107425 +v 0.459893 0.524100 0.116435 +v 0.481754 0.535266 0.120353 +v 0.473469 0.535231 0.129193 +v 0.462539 0.529647 0.127234 +v 0.468179 0.524136 0.107595 +v 0.479109 0.529720 0.109555 +v 0.264880 0.580126 0.651371 +v 0.265111 0.613381 0.652853 +v 0.238290 0.601110 0.605908 +v 0.251497 0.557140 0.627397 +v 0.255723 0.644775 0.637583 +v 0.244514 0.652901 0.618396 +v 0.263938 0.580108 0.651914 +v 0.250562 0.557122 0.627936 +v 0.237321 0.601091 0.606467 +v 0.264148 0.613363 0.653408 +v 0.243516 0.652882 0.618971 +v 0.254736 0.644756 0.638152 +v 0.230585 0.569611 -0.562461 +v 0.230227 0.596719 -0.562564 +v 0.271922 0.585481 -0.549382 +v 0.251390 0.550264 -0.555889 +v 0.244822 0.621864 -0.557939 +v 0.262247 0.627968 -0.552426 +v 0.230852 0.569611 -0.563306 +v 0.251655 0.550264 -0.556727 +v 0.272197 0.585481 -0.550251 +v 0.230500 0.596719 -0.563428 +v 0.262529 0.627968 -0.553321 +v 0.245101 0.621864 -0.558824 +v 0.278327 0.236079 0.151241 +v 0.278220 0.252211 0.151048 +v 0.290627 0.245523 0.173922 +v 0.284518 0.224566 0.162654 +v 0.277261 0.236079 0.151819 +v 0.283451 0.224566 0.163233 +v 0.289568 0.245523 0.174496 +v 0.277159 0.252211 0.151623 +v 0.269008 0.234220 -0.142349 +v 0.269087 0.245822 -0.142211 +v 0.259984 0.241012 -0.158564 +v 0.264466 0.225940 -0.150508 +v 0.269770 0.234220 -0.142773 +v 0.265229 0.225940 -0.150933 +v 0.260742 0.241012 -0.158985 +v 0.269845 0.245822 -0.142633 +v -0.127796 0.145224 -0.493533 +v -0.116767 0.145224 -0.502496 +v -0.125729 0.145224 -0.513526 +v -0.136759 0.145224 -0.504563 +v 0.575491 0.001923 -0.721043 +v 0.575491 0.001923 -0.721043 +v 0.114645 0.001923 -0.721043 +v -0.319177 0.001923 -0.721043 +v -0.741905 0.001923 -0.721043 +v -0.741905 0.001923 -0.721043 +v -0.464906 0.140744 -0.712765 +v 0.289947 0.140847 -0.712765 +v -0.664804 0.140847 -0.712765 +v -0.448167 0.140744 -0.625179 +v 0.273208 0.140847 -0.625179 +v -0.681543 0.140847 -0.625179 +v 0.185947 0.264762 -0.618911 +v 0.187438 0.314538 -0.616327 +v 0.330770 0.246266 -0.616018 +v 0.330770 0.316683 -0.616018 +v -0.075552 0.248478 -0.615534 +v -0.079190 0.299157 -0.614170 +v -0.359678 0.314656 -0.611262 +v -0.349125 0.262758 -0.610981 +v -0.510377 0.243607 -0.608245 +v -0.510377 0.322434 -0.608245 +v -0.086177 0.107347 -0.601870 +v -0.086177 0.152700 -0.601870 +v -0.086177 0.152700 -0.601870 +v -0.222300 0.152919 -0.596550 +v -0.293424 0.831581 -0.596288 +v 0.300480 0.851846 -0.596288 +v -0.058102 0.851846 -0.596288 +v -0.473809 0.851846 -0.596288 +v 0.157246 0.836647 -0.596288 +v -0.188087 0.152919 -0.593086 +v -0.188087 0.152919 -0.593086 +v -0.151411 0.160294 -0.590904 +v -0.118307 0.152700 -0.589580 +v -0.118307 0.152700 -0.589580 +v -0.063742 0.152700 -0.588814 +v -0.119065 0.160294 -0.584458 +v -0.119065 0.160294 -0.584458 +v 0.315313 0.366718 -0.581021 +v 0.321318 0.497917 -0.581021 +v -0.245786 0.152919 -0.579001 +v -0.245786 0.152919 -0.579001 +v -0.186388 0.160294 -0.578329 +v -0.186388 0.160294 -0.578329 +v 0.334654 0.608309 -0.573301 +v -0.118340 0.144772 -0.572183 +v -0.302069 -0.001527 -0.569168 +v -0.286996 0.057697 -0.566730 +v -0.055611 0.144772 -0.565524 +v 0.490319 0.140847 -0.564554 +v 0.289472 0.140847 -0.564554 +v -0.464432 0.140847 -0.564554 +v -0.665279 0.140847 -0.564554 +v 0.201352 0.348718 -0.562683 +v -0.145344 0.154594 -0.561827 +v -0.285925 -0.001527 -0.560394 +v -0.116544 0.149178 -0.560137 +v -0.098035 0.150163 -0.559599 +v -0.312471 0.057697 -0.559137 +v -0.261922 0.057697 -0.557900 +v 0.224060 0.330738 -0.557261 +v -0.184260 0.144899 -0.556156 +v -0.194834 0.157003 -0.554953 +v -0.038421 0.164664 -0.554150 +v -0.038421 0.164664 -0.554150 +v -0.184027 0.149178 -0.554069 +v -0.297881 0.044730 -0.554057 +v -0.310842 -0.001527 -0.553024 +v -0.288826 0.044730 -0.549137 +v -0.256702 -0.001527 -0.546950 +v -0.112737 0.128785 -0.546372 +v -0.477082 0.429362 -0.546299 +v -0.477082 0.566384 -0.546299 +v -0.651097 0.429362 -0.546131 +v -0.651097 0.566384 -0.546131 +v -0.302801 0.044730 -0.545003 +v -0.243482 0.144899 -0.544751 +v 0.290416 0.729348 -0.544425 +v -0.117825 -0.004393 -0.542935 +v -0.252342 0.166314 -0.542666 +v -0.252342 0.166314 -0.542666 +v 0.215812 0.082360 -0.539039 +v -0.265128 0.044730 -0.538767 +v -0.240348 -0.001527 -0.538573 +v -0.328617 0.057697 -0.538020 +v -0.468195 0.452463 -0.536947 +v -0.468195 0.543283 -0.536947 +v -0.660163 0.452463 -0.536762 +v -0.660163 0.543283 -0.536762 +v -0.246828 0.057697 -0.536018 +v -0.255956 0.044730 -0.534068 +v 0.443810 0.140847 -0.533656 +v 0.335982 0.140847 -0.533656 +v -0.510941 0.140847 -0.533656 +v -0.618769 0.140847 -0.533656 +v -0.059663 0.128785 -0.533471 +v -0.074403 -0.004393 -0.532362 +v -0.199045 -0.004393 -0.532142 +v 0.235275 0.330738 -0.531518 +v 0.458150 0.366718 -0.531147 +v 0.315313 0.366718 -0.531147 +v -0.142571 0.154594 -0.530412 +v -0.096671 0.150163 -0.529226 +v 0.389896 0.140847 -0.527909 +v -0.564855 0.140847 -0.527909 +v -0.215155 0.128785 -0.527625 +v -0.327503 -0.001527 -0.526804 +v 0.174033 0.303093 -0.526055 +v -0.117155 -0.004393 -0.525831 +v -0.260655 0.044730 -0.524897 +v 0.177345 0.298478 -0.524546 +v -0.112698 0.128785 -0.524359 +v -0.315982 0.044730 -0.523593 +v -0.132678 0.181759 -0.523374 +v -0.248725 -0.001527 -0.522220 +v -0.116913 0.181759 -0.521745 +v -0.192004 0.157003 -0.521330 +v 0.179506 0.298478 -0.519586 +v -0.161196 0.128785 -0.519548 +v 0.175044 0.307707 -0.517642 +v 0.201075 0.366699 -0.516619 +v -0.156483 -0.004393 -0.516238 +v 0.178355 0.303093 -0.516133 +v -0.321484 0.044730 -0.514879 +v 0.302021 0.429362 -0.514091 +v 0.302021 0.566384 -0.514091 +v -0.144978 0.181759 -0.513379 +v -0.144978 0.181759 -0.513379 +v 0.128929 0.076209 -0.512213 +v -0.039459 0.164664 -0.511608 +v -0.039459 0.164664 -0.511608 +v -0.329268 0.057697 -0.511445 +v -0.214520 0.128785 -0.511403 +v -0.337313 -0.001527 -0.511268 +v 0.223782 0.348718 -0.511197 +v -0.106918 0.181759 -0.509445 +v -0.247479 0.057697 -0.509443 +v -0.312771 0.044730 -0.509377 +v -0.199004 -0.004393 -0.508932 +v 0.292956 0.452463 -0.504722 +v 0.292956 0.543283 -0.504722 +v -0.275438 0.044730 -0.503633 +v -0.253065 0.166314 -0.503330 +v -0.253065 0.166314 -0.503330 +v 0.453264 0.446882 -0.502376 +v 0.453264 0.446882 -0.502376 +v 0.328552 0.446882 -0.502376 +v 0.328552 0.446882 -0.502376 +v -0.321777 -0.001527 -0.501458 +v -0.289404 0.044730 -0.499470 +v -0.146608 0.181759 -0.497614 +v -0.267544 -0.001527 -0.495580 +v -0.280339 0.044730 -0.494568 +v -0.108547 0.181759 -0.493680 +v -0.314173 0.057697 -0.489563 +v -0.263625 0.057697 -0.488326 +v -0.292446 -0.001527 -0.488158 +v -0.136612 0.181759 -0.485314 +v -0.120847 0.181759 -0.483685 +v 0.281088 0.088273 -0.481866 +v -0.289100 0.057697 -0.480732 +v -0.276284 -0.001527 -0.479418 +v 0.211114 0.139207 -0.475743 +v 0.199135 0.146549 -0.475737 +v 0.108154 0.075302 -0.472094 +v 0.244178 0.832424 -0.471045 +v 0.244178 0.832424 -0.471045 +v 0.212990 0.126615 -0.467921 +v -0.133073 0.155591 -0.464880 +v -0.105557 0.138312 -0.464577 +v 0.217799 0.150689 -0.464518 +v 0.217799 0.150689 -0.464518 +v 0.204014 0.159137 -0.464512 +v 0.204014 0.159137 -0.464512 +v 0.434913 0.315227 -0.464081 +v 0.356935 0.390241 -0.464081 +v 0.427770 0.394532 -0.464081 +v -0.105951 0.133906 -0.463304 +v 0.212908 0.148256 -0.460519 +v 0.205001 0.153102 -0.460515 +v 0.202887 0.121365 -0.460094 +v 0.190907 0.128707 -0.460088 +v -0.173755 0.138312 -0.457917 +v -0.047579 0.133906 -0.457113 +v -0.159353 0.155591 -0.457047 +v -0.107224 0.157125 -0.455824 +v 0.219958 0.136198 -0.455517 +v 0.219958 0.136198 -0.455517 +v 0.192388 0.153095 -0.455504 +v 0.192388 0.153095 -0.455504 +v 0.214147 0.139944 -0.455356 +v 0.070189 0.045725 -0.451504 +v -0.173953 0.134033 -0.451037 +v 0.207478 0.136479 -0.450190 +v 0.199570 0.141325 -0.450186 +v 0.201125 0.140748 -0.448590 +v 0.208332 0.130157 -0.446510 +v 0.208332 0.130157 -0.446510 +v 0.194547 0.138605 -0.446504 +v 0.194547 0.138605 -0.446504 +v 0.318740 0.053435 -0.440080 +v 0.047985 0.043323 -0.439589 +v -0.235011 0.134033 -0.439582 +v 0.434913 0.315227 -0.438596 +v 0.356935 0.390241 -0.438596 +v 0.427770 0.394532 -0.438596 +v -0.136715 0.165099 -0.438507 +v 0.207289 0.059471 -0.436671 +v 0.207289 0.059471 -0.436671 +v 0.199633 0.106472 -0.436491 +v 0.238969 0.791554 -0.435946 +v -0.176025 0.157125 -0.435316 +v -0.146663 0.159163 -0.434677 +v 0.198346 0.078506 -0.434496 +v -0.091678 0.159608 -0.433336 +v -0.131609 0.174924 -0.432074 +v -0.143154 0.156346 -0.431304 +v 0.234814 0.185545 -0.427737 +v 0.234814 0.185545 -0.427737 +v 0.219608 0.194864 -0.427730 +v 0.219608 0.194864 -0.427730 +v 0.030851 0.002099 -0.427450 +v -0.139958 0.181631 -0.425184 +v -0.151504 0.163052 -0.424414 +v 0.229922 0.183113 -0.423739 +v 0.338018 0.053237 -0.423677 +v -0.136450 0.178814 -0.421811 +v -0.335532 -0.002659 -0.420725 +v -0.146398 0.172877 -0.417981 +v 0.237195 0.169562 -0.417809 +v 0.237195 0.169562 -0.417809 +v 0.206784 0.188200 -0.417795 +v 0.206784 0.188200 -0.417795 +v 0.231383 0.173308 -0.417648 +v 0.212728 0.184741 -0.417640 +v -0.131015 0.175660 -0.417450 +v -0.313096 0.085495 -0.417097 +v -0.143841 0.170259 -0.413626 +v 0.360678 0.014417 -0.412731 +v 0.216201 0.173401 -0.412651 +v 0.223516 0.169220 -0.411554 +v 0.214189 0.174937 -0.411550 +v -0.176722 0.159608 -0.407987 +v 0.224371 0.162898 -0.407874 +v 0.224371 0.162898 -0.407874 +v 0.209165 0.172217 -0.407867 +v 0.209165 0.172217 -0.407867 +v -0.311503 -0.002659 -0.407666 +v -0.121093 0.178361 -0.407592 +v -0.124789 0.184426 -0.406490 +v -0.092375 0.162091 -0.406007 +v -0.351016 0.085495 -0.405795 +v 0.219647 0.073808 -0.404714 +v -0.275775 0.085495 -0.403953 +v -0.143051 0.161494 -0.401047 +v -0.146747 0.167559 -0.399945 +v -0.329298 0.066195 -0.398234 +v -0.348591 -0.002659 -0.396695 +v 0.241861 0.202919 -0.396403 +v -0.024037 0.154833 -0.395128 +v -0.024037 0.154833 -0.395128 +v -0.123998 0.175660 -0.393911 +v 0.426738 0.484555 -0.391170 +v -0.315821 0.066195 -0.390910 +v -0.136825 0.170259 -0.390087 +v 0.223200 0.204686 -0.389784 +v -0.083348 0.148428 -0.389559 +v 0.411402 0.456599 -0.389488 +v 0.243762 0.193170 -0.389084 +v -0.268004 -0.002659 -0.387654 +v 0.429029 0.517152 -0.386891 +v 0.220544 0.152829 -0.386856 +v -0.161176 0.162091 -0.385499 +v -0.336623 0.066195 -0.384757 +v -0.109047 0.163625 -0.384276 +v -0.130917 0.152636 -0.383064 +v 0.225101 0.194937 -0.382466 +v 0.387130 0.440775 -0.382297 +v 0.235382 0.189179 -0.382115 +v -0.096051 0.128785 -0.381670 +v 0.230088 0.091297 -0.378793 +v -0.101109 -0.004393 -0.378134 +v 0.417661 0.545656 -0.377799 +v -0.177267 0.154924 -0.377689 +v -0.135327 0.163625 -0.376442 +v -0.280547 0.066195 -0.375474 +v -0.243663 -0.002659 -0.375185 +v -0.375049 0.085495 -0.374362 +v 0.176609 0.900818 -0.373210 +v 0.176609 0.900818 -0.373210 +v 0.319472 0.496722 -0.371829 +v 0.360427 0.441323 -0.371523 +v 0.360427 0.441323 -0.371523 +v -0.253308 0.085495 -0.371383 +v -0.042922 0.128785 -0.368585 +v -0.266895 0.066195 -0.368481 +v -0.182380 -0.004393 -0.367513 +v 0.177436 0.082313 -0.367469 +v -0.057472 -0.004393 -0.366839 +v 0.326164 0.475067 -0.366707 +v -0.238693 0.157797 -0.366589 +v -0.238693 0.157797 -0.366589 +v 0.395681 0.562428 -0.366329 +v 0.453264 0.440254 -0.365226 +v 0.328552 0.440254 -0.365226 +v -0.198565 0.128785 -0.363244 +v 0.228483 0.144168 -0.362730 +v 0.257343 0.234904 -0.362493 +v -0.075052 0.148428 -0.361303 +v 0.322270 0.501280 -0.360971 +v -0.037224 0.144772 -0.360889 +v -0.100281 -0.004393 -0.360500 +v 0.338447 0.458095 -0.360053 +v -0.095970 0.128785 -0.359515 +v 0.176609 0.848096 -0.359250 +v -0.022894 0.154833 -0.359032 +v -0.022894 0.154833 -0.359032 +v -0.373391 -0.002659 -0.357668 +v 0.328962 0.479625 -0.355849 +v 0.368978 0.562976 -0.355555 +v 0.236610 0.236868 -0.355140 +v -0.122523 0.152636 -0.354845 +v -0.273888 0.066195 -0.354829 +v -0.144384 0.128785 -0.354426 +v 0.259865 0.225234 -0.353438 +v -0.356243 0.066195 -0.352888 +v -0.139764 -0.004393 -0.351426 +v -0.093980 0.149178 -0.351118 +v 0.327079 0.486599 -0.350961 +v -0.256132 -0.002659 -0.350844 +v 0.243401 0.137634 -0.350576 +v 0.243401 0.137634 -0.350576 +v 0.140599 0.045689 -0.350356 +v 0.316348 0.473251 -0.350083 +v 0.307422 0.487407 -0.348749 +v 0.344706 0.547152 -0.348364 +v 0.322320 0.478987 -0.347066 +v 0.329370 0.519196 -0.346682 +v -0.197779 0.128785 -0.346518 +v 0.239133 0.227197 -0.346084 +v -0.169733 0.154924 -0.346062 +v 0.313394 0.493142 -0.345731 +v 0.250760 0.221380 -0.345233 +v -0.034755 0.149888 -0.344658 +v -0.034755 0.149888 -0.344658 +v -0.093361 0.144772 -0.344161 +v -0.182295 -0.004393 -0.344155 +v 0.301320 0.474375 -0.340945 +v 0.301320 0.474375 -0.340945 +v 0.305419 0.476550 -0.340295 +v 0.313931 0.464035 -0.340125 +v 0.313931 0.464035 -0.340125 +v -0.364432 0.066195 -0.339918 +v 0.313042 0.470052 -0.339289 +v 0.304843 0.483644 -0.338568 +v 0.118395 0.043288 -0.338441 +v 0.300395 0.485780 -0.338232 +v 0.300395 0.485780 -0.338232 +v 0.250402 0.042896 -0.338065 +v -0.161651 0.149178 -0.336739 +v 0.318446 0.475271 -0.335895 +v 0.322877 0.472893 -0.335294 +v 0.322877 0.472893 -0.335294 +v 0.310247 0.488864 -0.335173 +v -0.161260 0.144899 -0.334844 +v -0.376017 0.085495 -0.334806 +v -0.387992 -0.002659 -0.334543 +v 0.270722 0.267450 -0.334248 +v 0.309387 0.494623 -0.333431 +v 0.309387 0.494623 -0.333431 +v 0.320643 0.487932 -0.332003 +v 0.320643 0.487932 -0.332003 +v -0.254276 0.085495 -0.331826 +v -0.351462 0.066195 -0.331729 +v -0.058206 0.149888 -0.330401 +v 0.277106 0.277824 -0.328473 +v -0.216432 0.144899 -0.328119 +v -0.226012 0.157797 -0.326800 +v -0.226012 0.157797 -0.326800 +v 0.101261 0.002064 -0.326303 +v 0.248154 0.269588 -0.326243 +v -0.089083 0.149888 -0.325584 +v -0.089083 0.149888 -0.325584 +v 0.273795 0.257849 -0.323654 +v 0.312300 0.460510 -0.323448 +v -0.295893 0.066195 -0.323178 +v 0.320385 0.469524 -0.323012 +v 0.269680 0.042699 -0.321661 +v 0.444034 0.473706 -0.320509 +v -0.364867 -0.002659 -0.319941 +v 0.300993 0.468534 -0.319833 +v -0.087578 0.156351 -0.319203 +v -0.087578 0.156351 -0.319203 +v 0.431639 0.451021 -0.319164 +v 0.307735 0.488458 -0.318939 +v 0.248188 0.280563 -0.318217 +v 0.300092 0.479089 -0.317875 +v 0.445872 0.500172 -0.317026 +v -0.316681 0.066195 -0.316982 +v 0.251227 0.259986 -0.315649 +v -0.156860 0.150074 -0.315354 +v -0.156860 0.150074 -0.315354 +v 0.281152 0.265830 -0.314653 +v 0.264047 0.254117 -0.314355 +v 0.412011 0.438195 -0.313353 +v -0.284143 -0.002659 -0.311192 +v 0.292340 0.003878 -0.310715 +v -0.303189 0.066195 -0.309686 +v 0.436663 0.523326 -0.309650 +v -0.212467 0.150074 -0.309309 +v -0.212467 0.150074 -0.309309 +v 0.327300 0.466312 -0.307523 +v -0.117136 0.156351 -0.306193 +v -0.183450 0.150074 -0.306128 +v -0.154635 0.156351 -0.305797 +v -0.154635 0.156351 -0.305797 +v 0.390407 0.438664 -0.304632 +v 0.390407 0.438664 -0.304632 +v 0.252234 0.268569 -0.304396 +v 0.321016 0.456112 -0.303958 +v 0.268716 0.261203 -0.302614 +v -0.353550 0.085495 -0.302235 +v -0.278310 0.085495 -0.300394 +v 0.418873 0.536965 -0.300357 +v -0.321209 -0.002659 -0.300143 +v 0.309153 0.464178 -0.299285 +v 0.315653 0.484534 -0.299264 +v 0.339477 0.463620 -0.295782 +v 0.339477 0.463620 -0.295782 +v 0.372617 0.452303 -0.295339 +v 0.451661 0.469319 -0.295335 +v 0.439918 0.447825 -0.294061 +v 0.336953 0.480608 -0.292064 +v 0.336953 0.480608 -0.292064 +v 0.453403 0.494395 -0.292035 +v 0.336269 0.465214 -0.291807 +v 0.397269 0.537434 -0.291636 +v -0.316229 0.085495 -0.289091 +v 0.333510 0.450943 -0.288895 +v 0.333510 0.450943 -0.288895 +v 0.421320 0.435672 -0.288555 +v 0.363407 0.475458 -0.287963 +v -0.297152 -0.002659 -0.287135 +v 0.332869 0.457267 -0.287078 +v 0.369719 0.469766 -0.286886 +v 0.377640 0.524608 -0.285825 +v 0.444677 0.516333 -0.285046 +v 0.365246 0.501923 -0.284480 +v 0.434913 0.315227 -0.282839 +v 0.356935 0.390241 -0.282839 +v 0.427770 0.394532 -0.282839 +v 0.329726 0.478837 -0.282446 +v 0.351822 0.466983 -0.281886 +v 0.351822 0.466983 -0.281886 +v 0.328405 0.485313 -0.281374 +v 0.328405 0.485313 -0.281374 +v 0.373319 0.463280 -0.280824 +v 0.400850 0.436117 -0.280292 +v 0.400850 0.436117 -0.280292 +v 0.350648 0.474883 -0.280157 +v 0.327140 0.462623 -0.278937 +v 0.326285 0.470906 -0.277722 +v 0.351947 0.461263 -0.276974 +v 0.323707 0.459579 -0.276657 +v 0.323707 0.459579 -0.276657 +v 0.370365 0.483171 -0.276471 +v 0.427821 0.529257 -0.276241 +v -0.314397 -0.003610 -0.275944 +v -0.314397 0.061780 -0.275944 +v 0.322363 0.472659 -0.274522 +v 0.349579 0.477077 -0.273411 +v 0.383994 0.449040 -0.271487 +v 0.373965 0.476684 -0.270408 +v 0.375147 0.471478 -0.270390 +v 0.350569 0.465282 -0.269455 +v -0.312927 0.069521 -0.268485 +v 0.349658 0.471374 -0.268478 +v 0.407352 0.529701 -0.267978 +v 0.375268 0.470978 -0.264498 +v 0.388754 0.517548 -0.262472 +v 0.377010 0.496054 -0.261198 +v 0.079641 0.048261 -0.259379 +v -0.001775 0.048261 -0.259379 +v -0.261248 0.048261 -0.259379 +v -0.117195 0.056181 -0.259379 +v 0.434913 0.315227 -0.257355 +v 0.356935 0.390241 -0.257355 +v 0.427770 0.394532 -0.257355 +v 0.447635 0.656174 -0.254362 +v 0.417421 0.656174 -0.254362 +v 0.417421 0.656174 -0.254362 +v 0.163346 -0.003610 -0.249407 +v 0.163346 0.061781 -0.249407 +v 0.417421 0.649664 -0.248290 +v 0.448569 0.737319 -0.247081 +v 0.411461 0.737319 -0.247081 +v 0.156995 0.069521 -0.245228 +v 0.417421 0.717619 -0.245183 +v 0.448328 0.181010 -0.242399 +v 0.209010 0.181010 -0.242399 +v 0.209010 0.181010 -0.242399 +v 0.453264 0.446857 -0.225458 +v 0.453264 0.446857 -0.225458 +v 0.328552 0.446857 -0.225458 +v 0.328552 0.446857 -0.225458 +v 0.209010 -0.000076 -0.221641 +v -0.224384 -0.003610 -0.215578 +v -0.224384 0.061780 -0.215578 +v -0.231843 0.069521 -0.214108 +v 0.417421 0.684178 -0.213995 +v 0.409266 0.447416 -0.202253 +v 0.448569 0.608645 -0.200853 +v 0.411461 0.608645 -0.200853 +v 0.408631 0.343416 -0.197887 +v 0.236799 0.159738 -0.195177 +v 0.073372 0.042900 -0.192034 +v 0.144132 0.042900 -0.191441 +v -0.354864 0.048261 -0.190810 +v -0.284112 0.048261 -0.189577 +v 0.079641 0.048261 -0.188616 +v -0.001775 0.048261 -0.188616 +v -0.261248 0.048261 -0.188616 +v -0.117195 0.056181 -0.188616 +v 0.418841 0.155999 -0.187839 +v 0.418841 0.619447 -0.185604 +v 0.418841 0.405468 -0.183765 +v 0.337435 0.329128 -0.176479 +v 0.337435 0.329128 -0.176479 +v 0.448569 0.699646 -0.173571 +v 0.411461 0.699646 -0.173571 +v 0.337435 0.293854 -0.173274 +v 0.573651 0.629386 -0.172251 +v 0.447121 0.629386 -0.172251 +v 0.448569 0.670042 -0.170962 +v 0.411461 0.670042 -0.170962 +v 0.041661 0.069521 -0.169327 +v 0.456184 0.421160 -0.167725 +v 0.448569 0.772849 -0.166506 +v 0.411461 0.772849 -0.166506 +v 0.035310 -0.003610 -0.165147 +v 0.035310 0.061781 -0.165147 +v 0.456184 0.373593 -0.164699 +v 0.331314 0.326087 -0.162781 +v 0.337435 0.259908 -0.158964 +v 0.573651 -0.000154 -0.158077 +v 0.355117 0.373239 -0.150433 +v 0.320009 0.373239 -0.150433 +v 0.418841 0.407394 -0.150307 +v 0.137278 0.069521 -0.149610 +v 0.408631 0.350403 -0.146232 +v 0.418841 0.155600 -0.144497 +v 0.418841 0.623881 -0.144312 +v 0.349879 0.321760 -0.143295 +v 0.324990 0.321760 -0.143295 +v 0.324990 0.321760 -0.143295 +v 0.141458 -0.003610 -0.143260 +v 0.141458 0.061781 -0.143260 +v 0.469867 0.540531 -0.141213 +v 0.355117 0.395124 -0.140534 +v 0.320009 0.395124 -0.140534 +v 0.337435 0.244318 -0.140354 +v 0.448569 0.718761 -0.140056 +v 0.411461 0.718761 -0.140056 +v 0.353414 0.314261 -0.139709 +v 0.321455 0.314261 -0.139709 +v 0.321455 0.314261 -0.139709 +v 0.458937 0.534948 -0.139254 +v 0.353511 0.366454 -0.138527 +v 0.321615 0.366454 -0.138527 +v 0.409266 0.440060 -0.138009 +v 0.337563 0.406067 -0.135585 +v -0.286220 0.069521 -0.133024 +v 0.478152 0.540567 -0.132373 +v 0.353511 0.386968 -0.131133 +v 0.321615 0.386968 -0.131133 +v 0.337563 0.397225 -0.127435 +v -0.284750 -0.003610 -0.125565 +v -0.284750 0.061780 -0.125565 +v 0.394483 0.215549 -0.125277 +v 0.394483 0.215549 -0.125277 +v 0.274017 0.215549 -0.124209 +v 0.274017 0.215549 -0.124209 +v 0.459996 0.560762 -0.122619 +v 0.457890 0.559687 -0.122242 +v 0.448569 0.661191 -0.121763 +v 0.411461 0.661191 -0.121763 +v 0.475506 0.535020 -0.121575 +v 0.461784 0.560131 -0.121221 +v 0.325500 0.215549 -0.121004 +v 0.337563 0.345554 -0.120799 +v 0.337563 0.345554 -0.120799 +v 0.464576 0.529437 -0.119615 +v 0.461465 0.558424 -0.119445 +v 0.352729 0.356044 -0.119152 +v 0.352729 0.356044 -0.119152 +v 0.322398 0.356044 -0.119152 +v 0.322398 0.356044 -0.119152 +v 0.459359 0.557348 -0.119068 +v 0.346812 0.360137 -0.118510 +v 0.328314 0.360136 -0.118510 +v 0.330610 0.347841 -0.116841 +v 0.346812 0.372933 -0.116500 +v 0.328314 0.372933 -0.116500 +v 0.337435 0.234843 -0.116048 +v 0.352729 0.377025 -0.115858 +v 0.352729 0.377025 -0.115858 +v 0.322398 0.377025 -0.115858 +v 0.322398 0.377025 -0.115858 +v 0.337563 0.379331 -0.115496 +v 0.337563 0.387516 -0.114210 +v 0.337563 0.387516 -0.114210 +v -0.089122 0.217740 -0.114174 +v -0.356283 0.048261 -0.109406 +v -0.285531 0.048261 -0.108173 +v 0.361301 0.332992 -0.100242 +v 0.313826 0.332992 -0.100242 +v -0.163156 0.216267 -0.099699 +v 0.343686 0.377306 -0.092311 +v 0.332030 0.377306 -0.092311 +v 0.347241 0.401930 -0.089578 +v 0.328476 0.401930 -0.089578 +v -0.092303 0.215465 -0.087916 +v 0.337435 0.239781 -0.085052 +v 0.361301 0.370030 -0.084424 +v 0.313826 0.370030 -0.084424 +v 0.353414 0.292965 -0.083704 +v 0.321455 0.292965 -0.083704 +v 0.321455 0.292965 -0.083704 +v 0.326202 0.371622 -0.082855 +v 0.386786 0.199666 -0.082836 +v 0.281039 0.199666 -0.082836 +v -0.020675 0.214527 -0.082593 +v 0.325500 0.206902 -0.082481 +v -0.150239 0.174433 -0.080368 +v 0.330610 0.325114 -0.076846 +v 0.273006 0.206902 -0.076783 +v 0.273006 0.206902 -0.076783 +v -0.150239 0.214313 -0.076588 +v -0.150239 0.214313 -0.076588 +v 0.337563 0.317737 -0.075774 +v 0.337563 0.317737 -0.075774 +v 0.319093 0.394205 -0.073770 +v 0.324990 0.275141 -0.073597 +v 0.343686 0.365938 -0.073398 +v 0.332030 0.365938 -0.073398 +v 0.395157 0.206902 -0.073222 +v 0.395157 0.206902 -0.073222 +v 0.322398 0.326274 -0.070233 +v 0.322398 0.326274 -0.070233 +v 0.352729 0.326274 -0.070233 +v 0.352729 0.326274 -0.070233 +v 0.346812 0.329605 -0.068071 +v 0.328314 0.329605 -0.068071 +v -0.141871 0.267983 -0.067865 +v -0.038739 0.212951 -0.063202 +v -0.168646 0.267170 -0.062247 +v 0.346812 0.340018 -0.061313 +v 0.328314 0.340018 -0.061313 +v 0.343555 0.266330 -0.059984 +v 0.331314 0.266330 -0.059984 +v 0.331314 0.266330 -0.059984 +v 0.352729 0.343349 -0.059151 +v 0.352729 0.343349 -0.059151 +v 0.322398 0.343349 -0.059151 +v 0.322398 0.343349 -0.059151 +v 0.347241 0.386481 -0.057963 +v 0.328476 0.386481 -0.057963 +v 0.337563 0.345225 -0.057934 +v 0.337435 0.252007 -0.055125 +v 0.337435 0.252007 -0.055125 +v 0.322968 0.270191 -0.054386 +v 0.322968 0.270191 -0.054386 +v 0.337563 0.351886 -0.053610 +v 0.337563 0.351886 -0.053610 +v 0.322968 0.301897 -0.052750 +v 0.322968 0.301897 -0.052750 +v 0.321874 0.191459 -0.051569 +v 0.326348 0.277540 -0.048713 +v 0.072165 0.042900 -0.047986 +v -0.123871 0.273397 -0.047969 +v 0.142925 0.042900 -0.047393 +v 0.326325 0.231339 -0.045416 +v -0.214498 0.210672 -0.044695 +v 0.348386 0.305780 -0.038814 +v 0.326740 0.305780 -0.038814 +v -0.177422 0.271772 -0.036733 +v -0.190417 0.209934 -0.033544 +v 0.348386 0.319273 -0.032710 +v 0.326740 0.319273 -0.032710 +v 0.326325 0.230408 -0.030656 +v 0.337563 0.326020 -0.029659 +v -0.135999 0.151956 -0.029571 +v 0.434423 0.437641 -0.026875 +v -0.152199 0.151464 -0.026172 +v 0.445048 0.484215 -0.025567 +v 0.564585 0.484996 -0.025189 +v 0.326348 0.277540 -0.025067 +v 0.448282 0.507913 -0.023882 +v 0.561014 0.508837 -0.023528 +v 0.426600 0.394045 -0.021946 +v 0.426600 0.394045 -0.021946 +v 0.321874 0.189244 -0.021273 +v 0.454235 0.529610 -0.020678 +v 0.554436 0.530419 -0.020371 +v 0.322968 0.274988 -0.019309 +v 0.322968 0.274988 -0.019309 +v -0.125108 0.155232 -0.017533 +v 0.463093 0.548734 -0.017464 +v 0.545012 0.549451 -0.017201 +v 0.016041 0.207856 -0.017018 +v -0.159422 0.277186 -0.016837 +v 0.474635 0.564200 -0.015181 +v 0.533123 0.564771 -0.014989 +v 0.380872 0.191148 -0.014709 +v 0.487893 0.574195 -0.014072 +v 0.518949 0.574853 -0.013936 +v 0.503183 0.578140 -0.013678 +v 0.322968 0.288986 -0.013537 +v 0.322968 0.288986 -0.013537 +v -0.010006 0.207730 -0.011885 +v -0.157509 0.154248 -0.010735 +v 0.276384 0.191148 -0.008655 +v 0.346776 0.294361 -0.006534 +v 0.328351 0.294361 -0.006534 +v 0.438617 0.381588 -0.006191 +v 0.425094 0.384050 -0.005993 +v 0.425094 0.384050 -0.005993 +v 0.346776 0.306540 -0.003103 +v 0.328351 0.306540 -0.003103 +v 0.337563 0.312629 -0.001388 +v 0.448569 0.687263 -0.000534 +v 0.411461 0.687263 -0.000534 +v 0.176609 0.920199 0.000000 +v 0.448569 0.754349 0.000381 +v 0.411461 0.754349 0.000381 +v -0.146618 0.157524 0.001303 +v 0.573651 0.713748 0.001530 +v 0.447121 0.713748 0.001530 +v 0.502162 0.577600 0.005192 +v 0.486844 0.573640 0.005319 +v 0.517902 0.574299 0.005407 +v 0.473494 0.563596 0.005911 +v -0.358295 0.058608 0.005996 +v 0.531981 0.564167 0.006112 +v -0.287543 0.058608 0.007230 +v 0.461744 0.548021 0.007451 +v 0.543663 0.548737 0.007734 +v 0.452587 0.528738 0.009780 +v 0.552785 0.529545 0.010139 +v 0.427058 0.393120 0.010334 +v 0.427058 0.393120 0.010334 +v 0.446340 0.506886 0.012005 +v 0.559070 0.507808 0.012401 +v 0.442980 0.483121 0.012645 +v 0.562516 0.483901 0.013054 +v 0.435045 0.436385 0.016967 +v 0.349478 0.285460 0.019621 +v 0.325649 0.285460 0.019621 +v 0.349478 0.301950 0.022175 +v 0.325649 0.301950 0.022175 +v 0.337563 0.310195 0.023452 +v -0.197491 0.204001 0.024774 +v -0.223538 0.203090 0.029827 +v 0.281929 0.190067 0.036991 +v 0.386786 0.190067 0.043401 +v 0.322968 0.244861 0.044584 +v 0.322968 0.244861 0.044584 +v 0.322968 0.268930 0.046407 +v 0.322968 0.268930 0.046407 +v -0.017080 0.201797 0.046433 +v -0.017080 0.201797 0.046433 +v 0.321874 0.190311 0.048453 +v 0.326348 0.251539 0.048498 +v 0.347898 0.281229 0.050474 +v 0.327229 0.281229 0.050474 +v 0.337563 0.267524 0.051528 +v 0.337563 0.267524 0.051528 +v 0.347898 0.295533 0.052690 +v 0.327229 0.295533 0.052690 +v 0.352161 0.277678 0.052928 +v 0.352161 0.277678 0.052928 +v 0.322966 0.277678 0.052928 +v 0.322966 0.277678 0.052928 +v 0.337563 0.302685 0.053798 +v 0.352120 0.297919 0.055725 +v 0.352120 0.297919 0.055725 +v 0.323006 0.297919 0.055725 +v 0.323006 0.297919 0.055725 +v 0.337563 0.307988 0.057120 +v 0.337563 0.307988 0.057120 +v 0.007001 0.200274 0.057504 +v 0.007001 0.200274 0.057504 +v 0.326325 0.224149 0.059011 +v 0.071197 0.057953 0.067430 +v 0.141957 0.057953 0.068023 +v 0.326325 0.223588 0.075773 +v -0.168759 0.198780 0.076091 +v 0.321874 0.194269 0.077050 +v 0.326348 0.249187 0.080353 +v 0.272669 0.206902 0.084176 +v 0.272669 0.206902 0.084176 +v 0.393471 0.206902 0.085244 +v 0.393471 0.206902 0.085244 +v 0.322968 0.262334 0.087109 +v 0.322968 0.262334 0.087109 +v 0.322968 0.247061 0.088392 +v 0.322968 0.247061 0.088392 +v 0.331039 0.206902 0.088806 +v 0.386786 0.199176 0.088875 +v 0.281039 0.199176 0.088875 +v -0.057258 0.197418 0.089477 +v 0.349750 0.271268 0.092754 +v 0.325376 0.271268 0.092754 +v 0.325404 0.288162 0.095138 +v 0.349723 0.288162 0.095138 +v -0.186822 0.196419 0.095402 +v 0.337563 0.296573 0.096328 +v 0.121540 -0.003610 0.097689 +v 0.121540 0.061781 0.097689 +v -0.115195 0.196266 0.100805 +v -0.309342 -0.003610 0.100858 +v -0.309342 0.061780 0.100858 +v 0.119337 0.069521 0.104966 +v 0.462961 0.552048 0.107048 +v 0.465067 0.553124 0.107425 +v 0.468179 0.524136 0.107595 +v -0.309270 0.069521 0.108460 +v 0.465386 0.554831 0.109201 +v 0.479109 0.529720 0.109555 +v 0.461493 0.554386 0.110222 +v 0.463599 0.555462 0.110599 +v -0.044341 0.194678 0.112508 +v 0.333398 0.213027 0.119893 +v 0.481754 0.535266 0.120353 +v 0.448569 0.652002 0.121505 +v 0.411461 0.652002 0.121505 +v 0.397516 0.213027 0.124879 +v 0.397516 0.213027 0.124879 +v 0.409266 0.440177 0.125617 +v -0.118375 0.193206 0.126983 +v 0.274354 0.213027 0.127016 +v 0.274354 0.213027 0.127016 +v 0.462539 0.529647 0.127234 +v 0.473469 0.535231 0.129193 +v 0.337563 0.243671 0.130993 +v 0.337563 0.243671 0.130993 +v 0.357530 0.257537 0.132978 +v 0.357530 0.257537 0.132978 +v 0.317597 0.257536 0.132978 +v 0.317597 0.257536 0.132978 +v 0.420734 0.158119 0.133152 +v 0.408631 0.350520 0.133840 +v 0.337563 0.252177 0.134184 +v 0.448569 0.729690 0.135465 +v 0.411461 0.729690 0.135465 +v 0.351127 0.261564 0.135638 +v 0.323999 0.261564 0.135638 +v 0.317635 0.285207 0.136945 +v 0.317635 0.285207 0.136945 +v 0.357492 0.285207 0.136945 +v 0.357492 0.285207 0.136945 +v 0.351127 0.280338 0.138546 +v 0.323999 0.280338 0.138546 +v 0.337563 0.298993 0.138924 +v 0.337563 0.298993 0.138924 +v 0.420734 0.623881 0.139397 +v 0.420734 0.400649 0.144015 +v 0.059301 0.048261 0.148140 +v 0.025980 -0.003610 0.148824 +v 0.025980 0.061781 0.148824 +v 0.070515 0.042900 0.148843 +v 0.141275 0.042900 0.149436 +v -0.360806 0.048261 0.150027 +v -0.084736 0.054316 0.150214 +v 0.337563 0.238514 0.150965 +v 0.337563 0.238514 0.150965 +v 0.337563 0.238514 0.150965 +v 0.033257 0.069521 0.151028 +v -0.290054 0.048261 0.151260 +v 0.573651 -0.000154 0.151382 +v -0.200144 0.048261 0.151877 +v -0.281552 0.048261 0.153049 +v 0.357733 0.252472 0.153127 +v 0.357733 0.252472 0.153127 +v 0.357733 0.252472 0.153127 +v 0.317393 0.252472 0.153127 +v 0.317393 0.252472 0.153127 +v 0.317393 0.252472 0.153127 +v 0.357733 0.280389 0.157451 +v 0.357733 0.280389 0.157451 +v 0.357733 0.280389 0.157451 +v 0.317393 0.280389 0.157451 +v 0.317393 0.280389 0.157451 +v 0.317393 0.280389 0.157451 +v 0.456184 0.385251 0.158984 +v 0.337563 0.294348 0.159613 +v 0.337563 0.294348 0.159613 +v 0.456184 0.416030 0.159770 +v 0.337563 0.244616 0.162246 +v 0.351836 0.254493 0.163776 +v 0.323290 0.254493 0.163776 +v 0.573651 0.619081 0.164474 +v 0.447121 0.619081 0.164474 +v 0.351836 0.274248 0.166836 +v 0.323290 0.274248 0.166836 +v 0.448569 0.670555 0.168495 +v 0.411461 0.670555 0.168495 +v 0.448569 0.699099 0.170319 +v 0.411461 0.699099 0.170319 +v 0.420734 0.398454 0.171165 +v -0.231977 -0.003610 0.176759 +v -0.231977 0.061780 0.176759 +v 0.420734 0.158518 0.176813 +v -0.239579 0.069521 0.176832 +v -0.377641 0.069521 0.178151 +v -0.385244 -0.003610 0.178223 +v -0.385244 0.061780 0.178223 +v 0.420734 0.619447 0.180689 +v 0.448569 0.775239 0.183746 +v 0.411461 0.775239 0.183746 +v 0.408631 0.343534 0.185495 +v 0.236799 0.160356 0.187208 +v 0.409266 0.447533 0.189861 +v 0.448569 0.614738 0.202230 +v 0.411461 0.614738 0.202230 +v 0.209010 -0.000076 0.214239 +v 0.417421 0.692649 0.216328 +v 0.060320 0.048261 0.218895 +v -0.083717 0.054316 0.220970 +v -0.199125 0.048261 0.222632 +v -0.280533 0.048261 0.223804 +v 0.453264 0.439620 0.231556 +v 0.453264 0.439620 0.231556 +v 0.328552 0.439620 0.231556 +v 0.328552 0.439620 0.231556 +v 0.448328 0.181010 0.234996 +v 0.209010 0.181010 0.234996 +v 0.209010 0.181010 0.234996 +v 0.079319 0.069521 0.237108 +v 0.077115 -0.003610 0.244384 +v 0.077115 0.061781 0.244384 +v 0.417421 0.726090 0.247516 +v 0.369223 0.539975 0.249701 +v 0.434913 0.331001 0.250185 +v 0.356935 0.392889 0.250185 +v 0.427770 0.396429 0.250185 +v 0.448569 0.747076 0.250444 +v 0.411461 0.747076 0.250444 +v 0.360410 0.102648 0.250475 +v 0.417421 0.658135 0.250623 +v 0.447635 0.664645 0.256695 +v 0.417421 0.664645 0.256695 +v 0.417421 0.664645 0.256695 +v 0.388293 0.602502 0.257418 +v 0.384375 0.538006 0.266441 +v 0.370636 0.545475 0.267443 +v 0.403129 0.585444 0.274433 +v 0.350460 0.503023 0.275970 +v 0.394160 0.592785 0.276745 +v 0.434913 0.331001 0.277542 +v 0.356935 0.392889 0.277542 +v 0.427770 0.396429 0.277542 +v 0.373184 0.503630 0.283125 +v 0.361731 0.514832 0.286772 +v -0.184580 0.008489 0.289839 +v 0.340449 0.473544 0.293949 +v 0.446095 0.102648 0.294556 +v 0.429935 0.652229 0.294774 +v 0.411003 0.649562 0.302276 +v 0.411003 0.649562 0.302276 +v 0.358251 0.477395 0.303948 +v 0.344513 0.484864 0.304950 +v 0.418078 0.626391 0.308704 +v 0.418078 0.626391 0.308704 +v 0.404339 0.633860 0.309706 +v 0.404339 0.633860 0.309706 +v -0.133519 0.055359 0.325597 +v -0.133519 0.055359 0.325597 +v 0.412666 0.652529 0.335410 +v -0.129778 0.151157 0.337160 +v -0.129778 0.151157 0.337160 +v 0.337195 0.445303 0.340276 +v 0.416400 0.626770 0.342731 +v 0.358985 0.458250 0.343152 +v 0.402661 0.634239 0.343732 +v 0.345247 0.465719 0.344154 +v -0.115625 0.054439 0.346246 +v -0.115625 0.131554 0.346246 +v 0.176609 0.848096 0.359250 +v 0.453264 0.434151 0.361479 +v 0.328552 0.434151 0.361479 +v 0.409818 0.641387 0.365747 +v 0.409818 0.641387 0.365747 +v 0.411237 0.663236 0.365796 +v 0.411237 0.663236 0.365796 +v 0.424311 0.639710 0.368196 +v 0.424311 0.639710 0.368196 +v 0.437540 0.660192 0.370240 +v 0.370268 0.542059 0.373002 +v 0.176609 0.900818 0.373210 +v 0.176609 0.900818 0.373210 +v 0.374701 0.553807 0.375703 +v 0.266479 0.055359 0.398144 +v 0.266479 0.055359 0.398144 +v 0.351293 0.470936 0.400130 +v 0.337555 0.478405 0.401132 +v 0.260499 0.151157 0.407943 +v 0.260499 0.151157 0.407943 +v 0.249346 0.054440 0.412439 +v 0.249346 0.131554 0.412439 +v 0.329714 0.460264 0.412834 +v 0.409958 0.618384 0.416769 +v 0.396219 0.625853 0.417771 +v 0.401163 0.639222 0.427555 +v 0.434913 0.331001 0.435082 +v 0.356935 0.392889 0.435082 +v 0.427770 0.396429 0.435082 +v 0.361022 0.499096 0.435885 +v 0.347283 0.506565 0.436886 +v 0.395875 0.585830 0.438057 +v 0.382137 0.593298 0.439059 +v 0.151840 0.176347 0.442825 +v 0.151840 0.176347 0.442825 +v 0.242863 0.784232 0.446929 +v 0.376749 0.544444 0.448804 +v 0.342704 0.496645 0.449744 +v 0.363011 0.551913 0.449805 +v 0.383103 0.597471 0.454857 +v 0.239245 0.193445 0.458678 +v 0.239245 0.193445 0.458678 +v 0.434913 0.331001 0.462431 +v 0.356935 0.392889 0.462431 +v 0.427770 0.396429 0.462431 +v 0.361655 0.550345 0.465788 +v 0.244261 0.825101 0.482028 +v 0.244261 0.825101 0.482028 +v 0.453264 0.439599 0.493882 +v 0.453264 0.439599 0.493882 +v 0.328552 0.439599 0.493882 +v 0.328552 0.439599 0.493882 +v 0.292662 0.452463 0.504722 +v 0.292662 0.543283 0.504722 +v 0.301727 0.429362 0.514091 +v 0.301727 0.566384 0.514091 +v 0.389896 0.140847 0.527909 +v 0.458150 0.366718 0.531147 +v 0.315313 0.366718 0.531147 +v 0.443810 0.140847 0.533656 +v 0.335982 0.140847 0.533656 +v 0.290416 0.729348 0.544425 +v 0.490319 0.140847 0.564554 +v 0.289472 0.140847 0.564554 +v -0.177965 0.151157 0.566483 +v -0.177965 0.151157 0.566483 +v -0.118020 0.074088 0.567224 +v 0.125064 0.176347 0.570251 +v 0.125064 0.176347 0.570251 +v 0.334654 0.608309 0.573301 +v -0.186922 0.055359 0.579744 +v -0.186922 0.055359 0.579744 +v 0.315313 0.366718 0.581021 +v 0.321318 0.497917 0.581021 +v 0.212470 0.193445 0.586103 +v 0.212470 0.193445 0.586103 +v 0.224316 0.348718 0.589008 +v 0.178647 0.303093 0.590517 +v 0.179534 0.298478 0.594046 +v 0.030698 0.074088 0.594196 +v 0.172703 0.307707 0.596556 +v 0.177007 0.298478 0.598830 +v 0.173591 0.303093 0.600085 +v 0.234249 0.330738 0.610135 +v 0.188148 0.366699 0.617535 +v 0.273208 0.140847 0.625179 +v 0.204283 0.054440 0.626893 +v 0.204283 0.131554 0.626893 +v 0.221131 0.330738 0.634962 +v -0.121516 0.058063 0.635767 +v 0.212311 0.151157 0.637266 +v 0.212311 0.151157 0.637266 +v -0.111844 -0.003114 0.637521 +v 0.198080 0.348718 0.638663 +v -0.134023 0.076372 0.643383 +v -0.134023 0.076372 0.643383 +v 0.213076 0.055359 0.652290 +v 0.213076 0.055359 0.652290 +v -0.003482 -0.003114 0.657175 +v 0.006190 0.058063 0.658929 +v 0.014695 0.076372 0.670356 +v 0.014695 0.076372 0.670356 +v 0.328648 0.338447 0.699983 +v 0.318654 0.140847 0.700484 +v 0.294027 0.921101 0.701718 +v 0.489845 0.140744 0.712765 +v 0.289947 0.140847 0.712765 +v 0.289947 0.140847 0.712765 +v 0.575491 0.001923 0.739535 +v 0.575491 0.001923 0.739535 +v 0.114645 0.001923 0.739535 +v -0.319177 0.001923 0.739535 +v -0.741905 0.001923 0.739535 +v -0.741905 0.001923 0.739535 +vt 0.198708 0.637534 +vt 0.234555 0.810452 +vt 0.237885 0.660782 +vt 0.156512 0.657538 +vt 0.157310 0.809737 +vt 0.032586 0.305514 +vt 0.138994 0.214943 +vt 0.032703 0.214805 +vt 0.344498 0.305514 +vt 0.344615 0.215210 +vt 0.226915 0.215057 +vt 0.344863 0.024180 +vt 0.227035 0.122413 +vt 0.344735 0.122566 +vt 0.555366 0.620808 +vt 0.525425 0.621990 +vt 0.545979 0.640150 +vt 0.703497 0.632040 +vt 0.703766 0.644967 +vt 0.709725 0.620711 +vt 0.751722 0.631037 +vt 0.745762 0.655292 +vt 0.751990 0.643963 +vt 0.408401 0.317210 +vt 0.426405 0.315345 +vt 0.390399 0.315345 +vt 0.408393 0.317216 +vt 0.426397 0.315351 +vt 0.390392 0.315351 +vt 0.627038 0.072824 +vt 0.629668 0.078340 +vt 0.650736 0.078532 +vt 0.675500 0.071756 +vt 0.672445 0.078298 +vt 0.600993 0.074672 +vt 0.579813 0.068877 +vt 0.582426 0.074473 +vt 0.621262 0.069791 +vt 0.619012 0.074508 +vt 0.220644 0.128904 +vt 0.207065 0.139746 +vt 0.220956 0.139618 +vt 0.220638 0.128912 +vt 0.220949 0.139623 +vt 0.207062 0.139750 +vt 0.949122 0.597231 +vt 0.955406 0.598935 +vt 0.961638 0.596347 +vt 0.961430 0.578168 +vt 0.955147 0.576465 +vt 0.948914 0.579054 +vt 0.949123 0.597232 +vt 0.961638 0.596348 +vt 0.860312 0.451857 +vt 0.874741 0.453387 +vt 0.868700 0.443409 +vt 0.537019 0.284964 +vt 0.536350 0.273283 +vt 0.546464 0.281809 +vt 0.204156 0.857615 +vt 0.271518 0.856214 +vt 0.271518 0.901396 +vt 0.204156 0.899995 +vt 0.010645 0.858310 +vt 0.010645 0.899297 +vt 0.008767 0.853584 +vt 0.152514 0.854868 +vt 0.147622 0.650113 +vt 0.012735 0.644234 +vt 0.059247 0.588517 +vt 0.087227 0.575408 +vt 0.204111 0.622597 +vt 0.204330 0.573554 +vt 0.009995 0.569599 +vt 0.316824 0.570065 +vt 0.316985 0.334568 +vt 0.010155 0.334103 +vt 0.566967 0.211539 +vt 0.566967 0.239347 +vt 0.629407 0.242384 +vt 0.629108 0.214280 +vt 0.705424 0.239521 +vt 0.705742 0.213331 +vt 0.773908 0.241927 +vt 0.774203 0.215096 +vt 0.822129 0.240247 +vt 0.822129 0.214523 +vt 0.514444 0.402537 +vt 0.514444 0.415372 +vt 0.526844 0.415372 +vt 0.526844 0.402537 +vt 0.551999 0.402537 +vt 0.551999 0.415372 +vt 0.564669 0.415372 +vt 0.564669 0.402537 +vt 0.481995 0.432843 +vt 0.471706 0.449305 +vt 0.481995 0.454792 +vt 0.492285 0.449305 +vt 0.492285 0.438331 +vt 0.627840 0.440285 +vt 0.649325 0.454437 +vt 0.638135 0.450043 +vt 0.587934 0.407259 +vt 0.582871 0.420766 +vt 0.588185 0.439122 +vt 0.595805 0.411663 +vt 0.576238 0.424739 +vt 0.583448 0.435461 +vt 0.645320 0.565656 +vt 0.663068 0.565657 +vt 0.663068 0.557037 +vt 0.628080 0.565656 +vt 0.645320 0.557037 +vt 0.611505 0.565656 +vt 0.628080 0.557037 +vt 0.611503 0.557037 +vt 0.595075 0.565662 +vt 0.595073 0.557045 +vt 0.579433 0.565670 +vt 0.579431 0.557052 +vt 0.682203 0.565656 +vt 0.682203 0.557036 +vt 0.680069 0.478679 +vt 0.687342 0.468265 +vt 0.658207 0.468260 +vt 0.665470 0.478685 +vt 0.665506 0.457893 +vt 0.680029 0.457886 +vt 0.616080 0.372041 +vt 0.619967 0.373248 +vt 0.622910 0.364541 +vt 0.619586 0.360479 +vt 0.576422 0.367054 +vt 0.572607 0.369039 +vt 0.574931 0.380349 +vt 0.579220 0.380289 +vt 0.618617 0.383510 +vt 0.573607 0.390062 +vt 0.578360 0.393861 +vt 0.614474 0.383641 +vt 0.615443 0.396067 +vt 0.620348 0.393075 +vt 0.573305 0.354868 +vt 0.576423 0.367054 +vt 0.569637 0.359136 +vt 0.614475 0.383641 +vt 0.573306 0.354868 +vt 0.595079 0.577424 +vt 0.611507 0.577419 +vt 0.628080 0.577419 +vt 0.645320 0.577419 +vt 0.663068 0.577419 +vt 0.579439 0.577431 +vt 0.475770 0.455325 +vt 0.466987 0.462784 +vt 0.468340 0.475726 +vt 0.478477 0.481208 +vt 0.347338 0.540059 +vt 0.364235 0.537567 +vt 0.361352 0.520540 +vt 0.342683 0.476976 +vt 0.361217 0.475862 +vt 0.362972 0.459025 +vt 0.344748 0.457135 +vt 0.344424 0.520271 +vt 0.220222 0.595179 +vt 0.232442 0.591968 +vt 0.233884 0.586760 +vt 0.219438 0.583879 +vt 0.235697 0.577649 +vt 0.221250 0.574774 +vt 0.222594 0.604159 +vt 0.234799 0.600948 +vt 0.210959 0.595820 +vt 0.210177 0.584519 +vt 0.308714 0.586081 +vt 0.310371 0.601710 +vt 0.315830 0.600895 +vt 0.317127 0.586207 +vt 0.325129 0.601731 +vt 0.326425 0.587016 +vt 0.299412 0.587062 +vt 0.301074 0.602722 +vt 0.311744 0.611057 +vt 0.317252 0.610242 +vt 0.308859 0.577039 +vt 0.317253 0.577163 +vt 0.358855 0.609095 +vt 0.358383 0.584027 +vt 0.338193 0.584865 +vt 0.338663 0.609932 +vt 0.414243 0.614163 +vt 0.418771 0.594355 +vt 0.399013 0.589480 +vt 0.394498 0.609284 +vt 0.748398 0.675457 +vt 0.748784 0.691477 +vt 0.659783 0.688498 +vt 0.660428 0.678715 +vt 0.578565 0.691342 +vt 0.579945 0.676595 +vt 0.735680 0.392351 +vt 0.834453 0.392351 +vt 0.835030 0.382989 +vt 0.735271 0.377828 +vt 0.836912 0.346779 +vt 0.737131 0.341597 +vt 0.735672 0.428636 +vt 0.834459 0.428636 +vt 0.358854 0.609097 +vt 0.338661 0.609932 +vt 0.338191 0.584864 +vt 0.358382 0.584027 +vt 0.414245 0.614164 +vt 0.394499 0.609285 +vt 0.399014 0.589479 +vt 0.418774 0.594355 +vt 0.139115 0.122299 +vt 0.032824 0.122161 +vt 0.367259 0.122595 +vt 0.367259 0.024180 +vt 0.367259 0.215239 +vt 0.367259 0.305514 +vt 0.010555 0.024180 +vt 0.010428 0.122132 +vt 0.032951 0.024180 +vt 0.010307 0.214776 +vt 0.032980 0.001349 +vt 0.344892 0.001754 +vt 0.032557 0.327476 +vt 0.344469 0.327881 +vt 0.362282 0.405026 +vt 0.362002 0.420574 +vt 0.366540 0.420627 +vt 0.366819 0.405137 +vt 0.330516 0.419972 +vt 0.344622 0.438430 +vt 0.364777 0.424145 +vt 0.373688 0.436665 +vt 0.353504 0.450978 +vt 0.330767 0.404645 +vt 0.366541 0.420627 +vt 0.364778 0.424144 +vt 0.579622 0.625485 +vt 0.557362 0.640988 +vt 0.564761 0.662583 +vt 0.580476 0.661685 +vt 0.535133 0.601239 +vt 0.526845 0.603327 +vt 0.515615 0.633980 +vt 0.533779 0.656167 +vt 0.523988 0.718247 +vt 0.550740 0.718669 +vt 0.576483 0.581689 +vt 0.554962 0.581699 +vt 0.554955 0.597452 +vt 0.576476 0.597484 +vt 0.588662 0.581696 +vt 0.588654 0.597490 +vt 0.678338 0.581744 +vt 0.669282 0.581740 +vt 0.669273 0.597537 +vt 0.678328 0.597542 +vt 0.636647 0.581726 +vt 0.608401 0.581707 +vt 0.608393 0.597502 +vt 0.636638 0.597515 +vt 0.487466 0.581644 +vt 0.487458 0.597440 +vt 0.769639 0.651693 +vt 0.776566 0.655127 +vt 0.776876 0.635825 +vt 0.767555 0.635563 +vt 0.786196 0.636039 +vt 0.769050 0.656354 +vt 0.776390 0.660423 +vt 0.783467 0.656971 +vt 0.783360 0.652036 +vt 0.789129 0.652754 +vt 0.791961 0.636729 +vt 0.763891 0.652210 +vt 0.761781 0.636010 +vt 0.721785 0.662257 +vt 0.745028 0.619977 +vt 0.733703 0.613746 +vt 0.720782 0.614015 +vt 0.710460 0.656026 +vt 0.734706 0.661988 +vt 0.600539 0.939346 +vt 0.600318 0.907033 +vt 0.611602 0.906953 +vt 0.611815 0.939264 +vt 0.918026 0.263616 +vt 0.931187 0.286410 +vt 0.957508 0.286196 +vt 0.970667 0.263616 +vt 0.957508 0.240822 +vt 0.931187 0.240822 +vt 0.239664 0.713314 +vt 0.258710 0.746302 +vt 0.296801 0.745992 +vt 0.315846 0.713314 +vt 0.296801 0.680327 +vt 0.258710 0.680327 +vt 0.621440 0.720752 +vt 0.616770 0.720752 +vt 0.616770 0.727266 +vt 0.621440 0.727266 +vt 0.982500 0.722041 +vt 0.989364 0.722142 +vt 0.988048 0.694953 +vt 0.981184 0.694852 +vt 0.995131 0.718586 +vt 0.994168 0.698683 +vt 0.975416 0.698408 +vt 0.976380 0.718311 +vt 0.972290 0.704667 +vt 0.998258 0.712327 +vt 0.997905 0.705042 +vt 0.632629 0.660273 +vt 0.632629 0.652215 +vt 0.585126 0.652215 +vt 0.632629 0.644505 +vt 0.585126 0.644505 +vt 0.632629 0.636445 +vt 0.585126 0.636445 +vt 0.632629 0.628080 +vt 0.632629 0.620657 +vt 0.585126 0.620657 +vt 0.585126 0.628079 +vt 0.632629 0.612305 +vt 0.585126 0.612305 +vt 0.664117 0.425566 +vt 0.656733 0.437835 +vt 0.664181 0.450016 +vt 0.679015 0.449938 +vt 0.686402 0.437669 +vt 0.678953 0.425479 +vt 0.862652 0.294818 +vt 0.900958 0.295147 +vt 0.901080 0.287611 +vt 0.862738 0.287145 +vt 0.900850 0.261062 +vt 0.862513 0.260394 +vt 0.901105 0.248424 +vt 0.862745 0.247734 +vt 0.908542 0.288975 +vt 0.913220 0.263350 +vt 0.850116 0.262865 +vt 0.855231 0.288633 +vt 0.968933 0.438529 +vt 0.968933 0.541315 +vt 0.990302 0.541315 +vt 0.990302 0.438529 +vt 0.990302 0.377804 +vt 0.990301 0.275017 +vt 0.968932 0.275017 +vt 0.968933 0.377804 +vt 0.838109 0.242946 +vt 0.882559 0.242946 +vt 0.882627 0.220025 +vt 0.838109 0.220025 +vt 0.882559 0.214516 +vt 0.838109 0.214516 +vt 0.761114 0.125281 +vt 0.793028 0.125281 +vt 0.793028 0.108849 +vt 0.761162 0.108849 +vt 0.888136 0.242947 +vt 0.888136 0.220025 +vt 0.755083 0.109138 +vt 0.731835 0.108988 +vt 0.729677 0.121890 +vt 0.757076 0.122066 +vt 0.919081 0.230139 +vt 0.919296 0.175990 +vt 0.893660 0.179994 +vt 0.893562 0.225961 +vt 0.891819 0.169066 +vt 0.917552 0.164869 +vt 0.891845 0.236798 +vt 0.917357 0.240962 +vt 0.743574 0.104480 +vt 0.850272 0.102825 +vt 0.850272 0.088665 +vt 0.743574 0.088665 +vt 0.850272 0.020501 +vt 0.743574 0.020501 +vt 0.850272 0.003030 +vt 0.865709 0.090825 +vt 0.865709 0.015405 +vt 0.728224 0.016685 +vt 0.727304 0.092105 +vt 0.983460 0.080071 +vt 0.883113 0.080071 +vt 0.883113 0.088298 +vt 0.983460 0.088298 +vt 0.883113 0.147522 +vt 0.983460 0.147522 +vt 0.883113 0.154776 +vt 0.983460 0.155066 +vt 0.873752 0.076169 +vt 0.992940 0.076169 +vt 0.992940 0.005826 +vt 0.873752 0.005826 +vt 0.991462 0.147522 +vt 0.991462 0.088298 +vt 0.952457 0.996821 +vt 0.970560 0.997140 +vt 0.970981 0.973276 +vt 0.955902 0.974128 +vt 0.624658 0.959808 +vt 0.613835 0.988165 +vt 0.623014 0.991721 +vt 0.633890 0.963368 +vt 0.639268 0.971669 +vt 0.632533 0.989195 +vt 0.615092 0.962349 +vt 0.608834 0.970042 +vt 0.608284 0.979956 +vt 0.223918 0.910653 +vt 0.233000 0.910653 +vt 0.233000 0.907305 +vt 0.223918 0.907305 +vt 0.242220 0.910653 +vt 0.242220 0.907305 +vt 0.251161 0.910653 +vt 0.251160 0.907305 +vt 0.260035 0.910653 +vt 0.260035 0.907305 +vt 0.268544 0.910653 +vt 0.268544 0.907305 +vt 0.277163 0.910653 +vt 0.277163 0.907305 +vt 0.207906 0.910653 +vt 0.215683 0.910653 +vt 0.215683 0.907305 +vt 0.207906 0.907305 +vt 0.853675 0.858557 +vt 0.855302 0.845863 +vt 0.843172 0.844352 +vt 0.841518 0.857027 +vt 0.649959 0.965912 +vt 0.696430 0.965912 +vt 0.696430 0.952047 +vt 0.649959 0.952047 +vt 0.696430 0.972673 +vt 0.649959 0.972673 +vt 0.649959 0.984788 +vt 0.696430 0.984788 +vt 0.649959 0.991922 +vt 0.696430 0.991922 +vt 0.958798 0.528001 +vt 0.958798 0.513416 +vt 0.892225 0.513416 +vt 0.892225 0.528002 +vt 0.892225 0.495377 +vt 0.892225 0.507565 +vt 0.958798 0.507565 +vt 0.958798 0.495376 +vt 0.958798 0.490659 +vt 0.892225 0.490659 +vt 0.650085 0.965852 +vt 0.696430 0.965852 +vt 0.650085 0.952047 +vt 0.696430 0.972605 +vt 0.650085 0.972605 +vt 0.650085 0.984705 +vt 0.696430 0.984705 +vt 0.650085 0.991922 +vt 0.958798 0.513415 +vt 0.892225 0.513415 +vt 0.892225 0.528001 +vt 0.958798 0.490658 +vt 0.892225 0.490658 +vt 0.592711 0.965417 +vt 0.588222 0.951603 +vt 0.550219 0.951608 +vt 0.545739 0.965419 +vt 0.550215 0.979216 +vt 0.588215 0.979224 +vt 0.576476 0.987751 +vt 0.561961 0.987757 +vt 0.576475 0.943077 +vt 0.561967 0.943074 +vt 0.797692 0.676526 +vt 0.795813 0.667596 +vt 0.772302 0.670825 +vt 0.773357 0.675835 +vt 0.792431 0.659122 +vt 0.770406 0.666076 +vt 0.791452 0.693604 +vt 0.795301 0.685331 +vt 0.772017 0.680774 +vt 0.769856 0.685414 +vt 0.797702 0.676526 +vt 0.795820 0.667591 +vt 0.772294 0.670822 +vt 0.773350 0.675834 +vt 0.792437 0.659110 +vt 0.770398 0.666069 +vt 0.791458 0.693615 +vt 0.795308 0.685336 +vt 0.772010 0.680776 +vt 0.769848 0.685420 +vt 0.792437 0.659111 +vt 0.791457 0.693615 +vt 0.743085 0.844945 +vt 0.745467 0.860837 +vt 0.760808 0.858542 +vt 0.758528 0.842570 +vt 0.853675 0.858558 +vt 0.452325 0.997102 +vt 0.468568 0.991563 +vt 0.467918 0.946644 +vt 0.451523 0.941579 +vt 0.435280 0.947116 +vt 0.435936 0.992037 +vt 0.478205 0.960378 +vt 0.478449 0.977536 +vt 0.425400 0.961144 +vt 0.425649 0.978301 +vt 0.397306 0.942556 +vt 0.382211 0.947218 +vt 0.381609 0.988578 +vt 0.396562 0.993678 +vt 0.412259 0.947656 +vt 0.411657 0.989014 +vt 0.421357 0.960570 +vt 0.421130 0.976369 +vt 0.372738 0.959864 +vt 0.372511 0.975662 +vt 0.798102 0.885738 +vt 0.814208 0.917624 +vt 0.826405 0.906006 +vt 0.789242 0.887569 +vt 0.786081 0.886458 +vt 0.767554 0.919929 +vt 0.782798 0.925228 +vt 0.173513 0.155390 +vt 0.183231 0.155676 +vt 0.188423 0.147431 +vt 0.168910 0.146914 +vt 0.183467 0.139131 +vt 0.174377 0.138546 +vt 0.194991 0.179274 +vt 0.207891 0.172147 +vt 0.207779 0.158104 +vt 0.194765 0.151186 +vt 0.181864 0.158313 +vt 0.181977 0.172356 +vt 0.795787 0.887974 +vt 0.456386 0.334431 +vt 0.433241 0.334431 +vt 0.433241 0.347763 +vt 0.351838 0.334431 +vt 0.325524 0.334431 +vt 0.325524 0.347763 +vt 0.351838 0.347763 +vt 0.371053 0.334431 +vt 0.371053 0.347763 +vt 0.390364 0.334431 +vt 0.390364 0.347763 +vt 0.412002 0.334431 +vt 0.412002 0.347763 +vt 0.377220 0.266889 +vt 0.372396 0.289371 +vt 0.444407 0.289371 +vt 0.439584 0.266889 +vt 0.439584 0.306837 +vt 0.377220 0.306837 +vt 0.390363 0.347763 +vt 0.390363 0.334431 +vt 0.456386 0.347763 +vt 0.478889 0.347763 +vt 0.478889 0.334431 +vt 0.559262 0.348354 +vt 0.505244 0.347769 +vt 0.505244 0.397436 +vt 0.559262 0.397062 +vt 0.456379 0.334437 +vt 0.433234 0.334437 +vt 0.433234 0.347769 +vt 0.351830 0.334437 +vt 0.325517 0.334437 +vt 0.325517 0.347769 +vt 0.351830 0.347769 +vt 0.371046 0.334437 +vt 0.390356 0.334437 +vt 0.371046 0.347769 +vt 0.390356 0.347769 +vt 0.411994 0.334437 +vt 0.411994 0.347769 +vt 0.377213 0.266895 +vt 0.372389 0.289377 +vt 0.444399 0.289377 +vt 0.439576 0.266895 +vt 0.439576 0.306843 +vt 0.377213 0.306843 +vt 0.628535 0.029757 +vt 0.650762 0.029757 +vt 0.600970 0.032956 +vt 0.619981 0.032956 +vt 0.674432 0.029758 +vt 0.580727 0.032956 +vt 0.174822 0.136832 +vt 0.189025 0.136979 +vt 0.191327 0.128441 +vt 0.176133 0.126594 +vt 0.212013 0.185213 +vt 0.222181 0.184952 +vt 0.174829 0.136837 +vt 0.176141 0.126603 +vt 0.191329 0.128449 +vt 0.189029 0.136985 +vt 0.222174 0.184944 +vt 0.212009 0.185205 +vt 0.223976 0.196470 +vt 0.213034 0.197378 +vt 0.213019 0.206849 +vt 0.223957 0.207798 +vt 0.186358 0.196200 +vt 0.152191 0.196168 +vt 0.152185 0.207900 +vt 0.186344 0.207939 +vt 0.143715 0.195955 +vt 0.143715 0.208114 +vt 0.029076 0.989527 +vt 0.085869 0.982982 +vt 0.085950 0.973428 +vt 0.028546 0.972752 +vt 0.029073 0.919083 +vt 0.086440 0.919348 +vt 0.086530 0.909799 +vt 0.029941 0.902334 +vt 0.160624 0.973789 +vt 0.161108 0.920146 +vt 0.144866 0.920019 +vt 0.144381 0.973663 +vt 0.012803 0.918944 +vt 0.012275 0.972612 +vt 0.144329 0.903285 +vt 0.143542 0.990387 +vt 0.223956 0.207798 +vt 0.223974 0.196470 +vt 0.029941 0.902335 +vt 0.945111 0.584944 +vt 0.945189 0.591887 +vt 0.965441 0.590457 +vt 0.965362 0.583513 +vt 0.965441 0.590458 +vt 0.432887 0.915098 +vt 0.447248 0.915094 +vt 0.448154 0.849959 +vt 0.431404 0.851894 +vt 0.448393 0.833024 +vt 0.533533 0.849959 +vt 0.533772 0.833024 +vt 0.535639 0.764845 +vt 0.450253 0.764845 +vt 0.450110 0.828183 +vt 0.535500 0.828183 +vt 0.432886 0.915347 +vt 0.431404 0.851905 +vt 0.532626 0.915094 +vt 0.535638 0.764845 +vt 0.535498 0.828183 +vt 0.450254 0.764845 +vt 0.549546 0.839804 +vt 0.686557 0.839804 +vt 0.686557 0.766420 +vt 0.549546 0.766420 +vt 0.551589 0.891219 +vt 0.684735 0.891406 +vt 0.728195 0.378410 +vt 0.728242 0.345495 +vt 0.712121 0.343125 +vt 0.712069 0.380736 +vt 0.695325 0.345451 +vt 0.695278 0.378366 +vt 0.940809 0.297498 +vt 0.899813 0.300379 +vt 0.899998 0.325679 +vt 0.900832 0.373884 +vt 0.939885 0.344344 +vt 0.900142 0.343649 +vt 0.868001 0.372721 +vt 0.868660 0.345654 +vt 0.866602 0.297789 +vt 0.843504 0.298977 +vt 0.844879 0.325713 +vt 0.868319 0.324892 +vt 0.844917 0.372430 +vt 0.845249 0.345712 +vt 0.939386 0.324138 +vt 0.941715 0.371086 +vt 0.944090 0.643423 +vt 0.949905 0.657973 +vt 0.988907 0.652063 +vt 0.997019 0.642184 +vt 0.941174 0.629693 +vt 0.996136 0.628493 +vt 0.947399 0.616345 +vt 0.987859 0.615844 +vt 0.975149 0.609363 +vt 0.959784 0.608446 +vt 0.977305 0.661967 +vt 0.913207 0.453729 +vt 0.911983 0.462700 +vt 0.956080 0.463603 +vt 0.957304 0.454633 +vt 0.956794 0.479568 +vt 0.913946 0.417646 +vt 0.913480 0.437172 +vt 0.957577 0.438075 +vt 0.958044 0.418549 +vt 0.912697 0.478665 +vt 0.852377 0.444507 +vt 0.844290 0.440132 +vt 0.843951 0.458750 +vt 0.836033 0.445066 +vt 0.835864 0.454375 +vt 0.993792 0.684717 +vt 0.994203 0.671255 +vt 0.983798 0.664368 +vt 0.972933 0.670948 +vt 0.972512 0.684500 +vt 0.982962 0.691383 +vt 0.726423 0.719640 +vt 0.736393 0.719640 +vt 0.736392 0.711134 +vt 0.726423 0.711134 +vt 0.717259 0.719640 +vt 0.717259 0.711134 +vt 0.706925 0.719640 +vt 0.706925 0.711134 +vt 0.696485 0.719640 +vt 0.696485 0.711134 +vt 0.685626 0.719640 +vt 0.685627 0.711134 +vt 0.746240 0.719640 +vt 0.746240 0.711134 +vt 0.962377 0.382209 +vt 0.953389 0.409837 +vt 0.962378 0.409832 +vt 0.917808 0.382206 +vt 0.908728 0.382209 +vt 0.908733 0.409840 +vt 0.917813 0.409832 +vt 0.926084 0.382207 +vt 0.926087 0.409835 +vt 0.934492 0.382204 +vt 0.934492 0.409835 +vt 0.943949 0.382205 +vt 0.943950 0.409833 +vt 0.953388 0.382203 +vt 0.765355 0.668489 +vt 0.766762 0.663419 +vt 0.756110 0.656121 +vt 0.752188 0.659469 +vt 0.761434 0.671836 +vt 0.750782 0.664539 +vt 0.756496 0.672182 +vt 0.752426 0.669395 +vt 0.765117 0.658563 +vt 0.761048 0.655775 +vt 0.755030 0.690070 +vt 0.755121 0.691118 +vt 0.767342 0.693549 +vt 0.766882 0.688114 +vt 0.752680 0.687988 +vt 0.753539 0.688588 +vt 0.761753 0.678759 +vt 0.757282 0.675638 +vt 0.929129 0.616217 +vt 0.921653 0.618887 +vt 0.920002 0.626975 +vt 0.935022 0.621201 +vt 0.925710 0.632243 +vt 0.933476 0.629371 +vt 0.857028 0.645947 +vt 0.846384 0.658935 +vt 0.853634 0.664879 +vt 0.862578 0.661358 +vt 0.864277 0.651892 +vt 0.848080 0.649470 +vt 0.836061 0.189941 +vt 0.871098 0.177117 +vt 0.853693 0.205576 +vt 0.835760 0.168035 +vt 0.848132 0.147715 +vt 0.862902 0.142782 +vt 0.852146 0.130615 +vt 0.529300 0.311967 +vt 0.529108 0.297958 +vt 0.551706 0.303766 +vt 0.540575 0.321965 +vt 0.527892 0.933630 +vt 0.538348 0.933583 +vt 0.538309 0.923126 +vt 0.527846 0.923165 +vt 0.625545 0.417834 +vt 0.616979 0.448089 +vt 0.594928 0.445071 +vt 0.655666 0.463990 +vt 0.654573 0.448402 +vt 0.565258 0.430230 +vt 0.560053 0.438792 +vt 0.569873 0.436974 +vt 0.474983 0.279034 +vt 0.497509 0.277984 +vt 0.487295 0.270060 +vt 0.476619 0.318946 +vt 0.486572 0.327711 +vt 0.494340 0.318109 +vt 0.413139 0.551358 +vt 0.417025 0.526779 +vt 0.430646 0.563410 +vt 0.389300 0.557957 +vt 0.388884 0.402444 +vt 0.421084 0.413119 +vt 0.396349 0.432831 +vt 0.468690 0.743511 +vt 0.475418 0.747458 +vt 0.478038 0.731446 +vt 0.510176 0.746045 +vt 0.501252 0.732821 +vt 0.502587 0.749301 +vt 0.506222 0.709553 +vt 0.498085 0.704042 +vt 0.499863 0.717505 +vt 0.474427 0.709006 +vt 0.480238 0.716706 +vt 0.482262 0.703522 +vt 0.502117 0.686692 +vt 0.495074 0.681746 +vt 0.496119 0.691673 +vt 0.477232 0.686534 +vt 0.483963 0.691341 +vt 0.484430 0.681347 +vt 0.500697 0.658278 +vt 0.494735 0.654680 +vt 0.494075 0.664108 +vt 0.478454 0.657938 +vt 0.485060 0.663744 +vt 0.484474 0.654310 +vt 0.500532 0.639841 +vt 0.496369 0.635093 +vt 0.494899 0.644346 +vt 0.478967 0.639371 +vt 0.484513 0.643967 +vt 0.483350 0.634710 +vt 0.503024 0.617634 +vt 0.498736 0.615408 +vt 0.497418 0.625613 +vt 0.477373 0.617081 +vt 0.482697 0.625220 +vt 0.481834 0.614997 +vt 0.481508 0.413066 +vt 0.480532 0.414847 +vt 0.480974 0.416919 +vt 0.564173 0.517083 +vt 0.559639 0.500179 +vt 0.530028 0.514377 +vt 0.551360 0.487118 +vt 0.532862 0.478079 +vt 0.523434 0.483948 +vt 0.510684 0.484103 +vt 0.498154 0.500666 +vt 0.495473 0.519836 +vt 0.501886 0.533329 +vt 0.509988 0.544475 +vt 0.525011 0.551055 +vt 0.546770 0.546941 +vt 0.559945 0.535375 +vt 0.534909 0.661859 +vt 0.534258 0.665116 +vt 0.551174 0.674648 +vt 0.532890 0.668571 +vt 0.532254 0.671591 +vt 0.532811 0.675943 +vt 0.534498 0.679799 +vt 0.552799 0.652439 +vt 0.550855 0.652380 +vt 0.547589 0.652918 +vt 0.543878 0.653910 +vt 0.540716 0.655090 +vt 0.539240 0.656581 +vt 0.536769 0.659202 +vt 0.877978 0.856483 +vt 0.877232 0.872658 +vt 0.889929 0.851614 +vt 0.905011 0.870715 +vt 0.902126 0.972930 +vt 0.877310 0.972490 +vt 0.890365 0.983221 +vt 0.878460 0.981310 +vt 0.905096 0.852899 +vt 0.901777 0.982274 +vt 0.723741 0.946973 +vt 0.722927 0.960191 +vt 0.736016 0.945534 +vt 0.736322 0.974965 +vt 0.725525 0.973947 +vt 0.828994 0.946923 +vt 0.845428 0.959954 +vt 0.843442 0.947405 +vt 0.831004 0.976284 +vt 0.844607 0.974824 +vt 0.972286 0.964119 +vt 0.943732 0.957997 +vt 0.944710 0.863614 +vt 0.970146 0.858760 +vt 0.955654 0.852027 +vt 0.968477 0.850066 +vt 0.945665 0.969435 +vt 0.945065 0.855897 +vt 0.260362 0.824402 +vt 0.258718 0.830026 +vt 0.255089 0.827156 +vt 0.256301 0.820871 +vt 0.250601 0.822925 +vt 0.248926 0.828532 +vt 0.252981 0.832101 +vt 0.252928 0.820876 +vt 0.254644 0.815113 +vt 0.248278 0.816496 +vt 0.250476 0.811502 +vt 0.244596 0.813614 +vt 0.242846 0.819357 +vt 0.247009 0.823010 +vt 0.275191 0.846095 +vt 0.272207 0.849169 +vt 0.274373 0.844567 +vt 0.276356 0.841025 +vt 0.274536 0.839067 +vt 0.271571 0.842145 +vt 0.270407 0.847178 +vt 0.259081 0.843251 +vt 0.262060 0.840121 +vt 0.259253 0.837672 +vt 0.263258 0.834998 +vt 0.261475 0.833043 +vt 0.258515 0.836177 +vt 0.257318 0.841262 +vt 0.503285 0.920274 +vt 0.497208 0.920274 +vt 0.502118 0.935389 +vt 0.492432 0.920274 +vt 0.486946 0.920274 +vt 0.492081 0.935389 +vt 0.524836 0.920274 +vt 0.519326 0.920274 +vt 0.524730 0.935389 +vt 0.480603 0.979707 +vt 0.491431 0.994171 +vt 0.506829 0.968376 +vt 0.508694 0.999504 +vt 0.525797 0.993671 +vt 0.536202 0.978901 +vt 0.535943 0.960833 +vt 0.525109 0.946372 +vt 0.507847 0.941039 +vt 0.490749 0.946871 +vt 0.480338 0.961641 +vt 0.684567 0.662749 +vt 0.696486 0.646341 +vt 0.665273 0.636200 +vt 0.696486 0.626060 +vt 0.684567 0.609652 +vt 0.665273 0.603384 +vt 0.648314 0.612855 +vt 0.637833 0.627283 +vt 0.637833 0.645118 +vt 0.648314 0.659545 +vt 0.665273 0.665057 +vt 0.850508 0.375082 +vt 0.838249 0.383533 +vt 0.850252 0.386839 +vt 0.842025 0.128282 +vt 0.850396 0.112569 +vt 0.235704 0.841928 +vt 0.156016 0.842307 +vt 0.838848 0.293986 +vt 0.836522 0.271306 +vt 0.789349 0.276038 +vt 0.788994 0.292912 +vt 0.836139 0.250269 +vt 0.790060 0.252294 +vt 0.839620 0.315037 +vt 0.790838 0.315774 +vt 0.703195 0.252538 +vt 0.701350 0.278026 +vt 0.702717 0.294367 +vt 0.705239 0.318423 +vt 0.609743 0.278209 +vt 0.612827 0.250235 +vt 0.566104 0.247960 +vt 0.561762 0.274868 +vt 0.613589 0.295274 +vt 0.561153 0.299301 +vt 0.565614 0.326142 +vt 0.617149 0.323913 +vt 0.629533 0.183466 +vt 0.566967 0.182011 +vt 0.566967 0.126163 +vt 0.566967 0.155223 +vt 0.630310 0.156081 +vt 0.631134 0.127271 +vt 0.705984 0.185397 +vt 0.706103 0.159074 +vt 0.706733 0.130212 +vt 0.774444 0.185479 +vt 0.774579 0.158897 +vt 0.775057 0.130741 +vt 0.822129 0.186534 +vt 0.822129 0.160647 +vt 0.822129 0.132483 +vt 0.577174 0.415372 +vt 0.577174 0.402537 +vt 0.502859 0.402537 +vt 0.502859 0.415372 +vt 0.539672 0.415372 +vt 0.539672 0.402537 +vt 0.471706 0.438331 +vt 0.636580 0.476711 +vt 0.635402 0.463953 +vt 0.618635 0.472311 +vt 0.617759 0.484532 +vt 0.586407 0.477005 +vt 0.589872 0.463947 +vt 0.577521 0.450616 +vt 0.570367 0.459338 +vt 0.603285 0.468937 +vt 0.600916 0.483027 +vt 0.606649 0.448516 +vt 0.610875 0.414923 +vt 0.644722 0.427325 +vt 0.626988 0.414531 +vt 0.651492 0.439741 +vt 0.526991 0.426368 +vt 0.517179 0.429381 +vt 0.520509 0.440363 +vt 0.526439 0.438091 +vt 0.508314 0.436417 +vt 0.515598 0.445643 +vt 0.501521 0.444148 +vt 0.512137 0.450798 +vt 0.550834 0.446378 +vt 0.544670 0.438003 +vt 0.536515 0.446600 +vt 0.539503 0.452135 +vt 0.536437 0.430110 +vt 0.532131 0.440845 +vt 0.596075 0.350114 +vt 0.595279 0.364093 +vt 0.596663 0.387825 +vt 0.596749 0.401610 +vt 0.596662 0.387825 +vt 0.663136 0.518737 +vt 0.663623 0.527478 +vt 0.682644 0.526379 +vt 0.682199 0.518654 +vt 0.664859 0.537528 +vt 0.683664 0.535253 +vt 0.665810 0.546416 +vt 0.684821 0.542976 +vt 0.665566 0.491283 +vt 0.664716 0.500080 +vt 0.683415 0.502134 +vt 0.684459 0.494459 +vt 0.663572 0.510028 +vt 0.682527 0.510949 +vt 0.650936 0.398976 +vt 0.674530 0.408171 +vt 0.677767 0.395266 +vt 0.652159 0.388592 +vt 0.648781 0.407089 +vt 0.670365 0.420597 +vt 0.648387 0.353084 +vt 0.650319 0.360342 +vt 0.670686 0.351762 +vt 0.666825 0.341071 +vt 0.651689 0.369751 +vt 0.674400 0.363557 +vt 0.652289 0.378723 +vt 0.676921 0.372844 +vt 0.592214 0.524960 +vt 0.590939 0.534915 +vt 0.621449 0.540027 +vt 0.620558 0.528554 +vt 0.589752 0.547128 +vt 0.622143 0.550196 +vt 0.594670 0.490345 +vt 0.594752 0.498591 +vt 0.622521 0.497268 +vt 0.623368 0.487949 +vt 0.594036 0.507860 +vt 0.621199 0.507995 +vt 0.593124 0.516304 +vt 0.620347 0.518145 +vt 0.504364 0.430179 +vt 0.515502 0.422763 +vt 0.495900 0.438403 +vt 0.549155 0.432091 +vt 0.556986 0.441053 +vt 0.538674 0.423660 +vt 0.527252 0.419817 +vt 0.682203 0.577419 +vt 0.631173 0.386461 +vt 0.628519 0.386594 +vt 0.627696 0.394707 +vt 0.630349 0.395717 +vt 0.678766 0.408335 +vt 0.682670 0.395377 +vt 0.625912 0.401585 +vt 0.628684 0.404191 +vt 0.675939 0.418930 +vt 0.629771 0.355089 +vt 0.627119 0.357395 +vt 0.628511 0.363821 +vt 0.631029 0.362969 +vt 0.674262 0.351414 +vt 0.671635 0.342403 +vt 0.628946 0.371478 +vt 0.631482 0.371692 +vt 0.678063 0.361880 +vt 0.628892 0.378943 +vt 0.631482 0.378980 +vt 0.682244 0.374159 +vt 0.645908 0.527751 +vt 0.646756 0.537356 +vt 0.647554 0.545266 +vt 0.647633 0.492680 +vt 0.646885 0.500323 +vt 0.646005 0.509698 +vt 0.645609 0.518685 +vt 0.487257 0.473748 +vt 0.485903 0.460807 +vt 0.449069 0.329959 +vt 0.448603 0.316962 +vt 0.448902 0.277481 +vt 0.450991 0.265335 +vt 0.514716 0.278513 +vt 0.512667 0.266454 +vt 0.512826 0.330007 +vt 0.514338 0.317901 +vt 0.358009 0.500349 +vt 0.344818 0.501772 +vt 0.378054 0.519648 +vt 0.377081 0.501295 +vt 0.324464 0.502603 +vt 0.324714 0.520542 +vt 0.322774 0.478356 +vt 0.378120 0.476568 +vt 0.222063 0.640983 +vt 0.232602 0.641656 +vt 0.229869 0.626101 +vt 0.224076 0.625716 +vt 0.242917 0.638984 +vt 0.237795 0.625314 +vt 0.211398 0.638579 +vt 0.216061 0.625036 +vt 0.231040 0.609000 +vt 0.223056 0.609127 +vt 0.215592 0.609352 +vt 0.238469 0.609318 +vt 0.241387 0.594449 +vt 0.242833 0.589244 +vt 0.324357 0.638458 +vt 0.323444 0.627585 +vt 0.312039 0.627996 +vt 0.311729 0.634709 +vt 0.321996 0.615624 +vt 0.311409 0.619644 +vt 0.303156 0.626893 +vt 0.301772 0.638365 +vt 0.303036 0.619791 +vt 0.302390 0.645062 +vt 0.310686 0.643271 +vt 0.321144 0.647155 +vt 0.380656 0.590156 +vt 0.378793 0.606734 +vt 0.012612 0.615551 +vt 0.032947 0.613055 +vt 0.032996 0.596849 +vt 0.016472 0.597515 +vt 0.304228 0.684120 +vt 0.324279 0.687030 +vt 0.320886 0.671506 +vt 0.304361 0.670512 +vt 0.324497 0.651731 +vt 0.304580 0.655376 +vt 0.033075 0.578771 +vt 0.013316 0.574716 +vt 0.748480 0.702196 +vt 0.659803 0.698968 +vt 0.747992 0.664740 +vt 0.660352 0.668247 +vt 0.580222 0.666178 +vt 0.578935 0.701757 +vt 0.378793 0.606735 +vt 0.380656 0.590154 +vt 0.012613 0.615550 +vt 0.016473 0.597515 +vt 0.032945 0.613053 +vt 0.304227 0.684121 +vt 0.304360 0.670511 +vt 0.324279 0.687032 +vt 0.304578 0.655375 +vt 0.324496 0.651730 +vt 0.013317 0.574717 +vt 0.033075 0.578772 +vt 0.397326 0.525455 +vt 0.377378 0.549829 +vt 0.382728 0.483359 +vt 0.404267 0.484518 +vt 0.391658 0.460595 +vt 0.412854 0.460201 +vt 0.375531 0.411402 +vt 0.379646 0.431434 +vt 0.464447 0.403667 +vt 0.464447 0.422788 +vt 0.464447 0.453096 +vt 0.464447 0.481306 +vt 0.464447 0.522919 +vt 0.464447 0.569581 +vt 0.010190 0.305514 +vt 0.460008 0.693674 +vt 0.460009 0.657172 +vt 0.442813 0.657173 +vt 0.442813 0.693674 +vt 0.460009 0.632714 +vt 0.442813 0.632714 +vt 0.460009 0.612313 +vt 0.442813 0.612313 +vt 0.651918 0.581730 +vt 0.651909 0.597528 +vt 0.460008 0.751131 +vt 0.442812 0.751130 +vt 0.812776 0.683445 +vt 0.813882 0.685355 +vt 0.818483 0.683168 +vt 0.816824 0.680039 +vt 0.814511 0.687440 +vt 0.819374 0.686466 +vt 0.814662 0.689588 +vt 0.819492 0.689809 +vt 0.814439 0.691373 +vt 0.818891 0.692930 +vt 0.813712 0.693053 +vt 0.817568 0.695812 +vt 0.812567 0.694474 +vt 0.815588 0.698344 +vt 0.811143 0.695494 +vt 0.813017 0.700465 +vt 0.809581 0.695998 +vt 0.809852 0.702204 +vt 0.808041 0.695903 +vt 0.805861 0.703835 +vt 0.805637 0.680477 +vt 0.807485 0.680282 +vt 0.807391 0.672942 +vt 0.802386 0.671108 +vt 0.809413 0.680776 +vt 0.811276 0.674891 +vt 0.811241 0.681879 +vt 0.814402 0.677265 +vt 0.823809 0.680791 +vt 0.821558 0.676344 +vt 0.824941 0.685510 +vt 0.824999 0.690208 +vt 0.824005 0.694745 +vt 0.822035 0.698904 +vt 0.819161 0.702605 +vt 0.815456 0.705788 +vt 0.810935 0.708504 +vt 0.805497 0.710831 +vt 0.808411 0.665482 +vt 0.801715 0.662733 +vt 0.813854 0.668651 +vt 0.818242 0.672245 +vt 0.830202 0.678209 +vt 0.827367 0.672210 +vt 0.831594 0.684488 +vt 0.831524 0.690843 +vt 0.830086 0.696914 +vt 0.827377 0.702496 +vt 0.823544 0.707391 +vt 0.818698 0.711590 +vt 0.812929 0.715186 +vt 0.806296 0.718397 +vt 0.810670 0.657642 +vt 0.802657 0.653692 +vt 0.817509 0.661920 +vt 0.823095 0.666781 +vt 0.838055 0.675248 +vt 0.834566 0.667575 +vt 0.839666 0.683448 +vt 0.839417 0.691721 +vt 0.837409 0.699631 +vt 0.833841 0.706759 +vt 0.828920 0.712903 +vt 0.822842 0.718003 +vt 0.815778 0.722248 +vt 0.808002 0.726193 +vt 0.814102 0.649457 +vt 0.804901 0.644510 +vt 0.822376 0.654653 +vt 0.829290 0.660653 +vt 0.847724 0.671826 +vt 0.843520 0.662151 +vt 0.849553 0.682315 +vt 0.849007 0.692983 +vt 0.846253 0.703090 +vt 0.841608 0.712018 +vt 0.835426 0.719424 +vt 0.827944 0.725250 +vt 0.819320 0.729601 +vt 0.809824 0.732673 +vt 0.818443 0.641044 +vt 0.807332 0.637017 +vt 0.828578 0.646584 +vt 0.837071 0.653672 +vt 0.494638 0.672668 +vt 0.484639 0.672262 +vt 0.500869 0.672188 +vt 0.478404 0.671920 +vt 0.882516 0.759686 +vt 0.897602 0.759686 +vt 0.894575 0.739550 +vt 0.880596 0.739550 +vt 0.912157 0.759686 +vt 0.908064 0.739550 +vt 0.926600 0.759686 +vt 0.921447 0.739550 +vt 0.939670 0.759686 +vt 0.933559 0.739550 +vt 0.772985 0.759686 +vt 0.786521 0.759686 +vt 0.791639 0.739550 +vt 0.779096 0.739550 +vt 0.800131 0.759686 +vt 0.804252 0.739550 +vt 0.812358 0.759686 +vt 0.815583 0.739550 +vt 0.825814 0.759686 +vt 0.828051 0.739550 +vt 0.839090 0.759686 +vt 0.840355 0.739550 +vt 0.853467 0.759686 +vt 0.853677 0.739550 +vt 0.868155 0.759686 +vt 0.867288 0.739550 +vt 0.492522 0.405842 +vt 0.488491 0.410470 +vt 0.490537 0.415106 +vt 0.495655 0.414867 +vt 0.483134 0.401702 +vt 0.483671 0.408808 +vt 0.473015 0.405270 +vt 0.478481 0.409747 +vt 0.469851 0.414277 +vt 0.476164 0.414487 +vt 0.472516 0.422852 +vt 0.477526 0.419689 +vt 0.479280 0.427938 +vt 0.481529 0.422787 +vt 0.487217 0.427894 +vt 0.486123 0.422698 +vt 0.493431 0.422925 +vt 0.489479 0.419817 +vt 0.485389 0.413277 +vt 0.486353 0.415094 +vt 0.483464 0.412509 +vt 0.482561 0.418274 +vt 0.484524 0.418317 +vt 0.485997 0.417071 +vt 0.588463 0.518375 +vt 0.582757 0.491275 +vt 0.570695 0.495881 +vt 0.575900 0.516719 +vt 0.566828 0.468381 +vt 0.559197 0.477783 +vt 0.535401 0.454759 +vt 0.532256 0.465815 +vt 0.516879 0.456777 +vt 0.518735 0.470859 +vt 0.499636 0.466084 +vt 0.505757 0.472895 +vt 0.473138 0.492132 +vt 0.487052 0.495200 +vt 0.470232 0.524442 +vt 0.483049 0.521494 +vt 0.481714 0.551020 +vt 0.492030 0.541298 +vt 0.495590 0.565471 +vt 0.502472 0.553718 +vt 0.521148 0.577834 +vt 0.523453 0.564415 +vt 0.558234 0.570570 +vt 0.554978 0.558762 +vt 0.580638 0.549861 +vt 0.570313 0.541447 +vt 0.564829 0.497612 +vt 0.569874 0.516277 +vt 0.555378 0.482994 +vt 0.532035 0.473987 +vt 0.522213 0.478517 +vt 0.508946 0.479077 +vt 0.495046 0.497752 +vt 0.489829 0.519888 +vt 0.496198 0.535370 +vt 0.506121 0.548829 +vt 0.524733 0.556142 +vt 0.550366 0.551457 +vt 0.565224 0.537461 +vt 0.367978 0.622362 +vt 0.370326 0.670884 +vt 0.354199 0.672557 +vt 0.349318 0.623464 +vt 0.375342 0.711606 +vt 0.360147 0.711872 +vt 0.358820 0.757868 +vt 0.345021 0.748431 +vt 0.342426 0.802453 +vt 0.325386 0.791696 +vt 0.765206 0.813032 +vt 0.741407 0.764660 +vt 0.727179 0.778369 +vt 0.746954 0.819947 +vt 0.641326 0.908115 +vt 0.641490 0.939059 +vt 0.420575 0.670676 +vt 0.420456 0.622477 +vt 0.666350 0.911004 +vt 0.666413 0.938950 +vt 0.420661 0.711339 +vt 0.687944 0.900943 +vt 0.687880 0.938966 +vt 0.420681 0.757066 +vt 0.714393 0.889311 +vt 0.714168 0.939083 +vt 0.420616 0.803564 +vt 0.726912 0.840712 +vt 0.693998 0.819251 +vt 0.843397 0.766143 +vt 0.842668 0.814157 +vt 0.420952 0.813491 +vt 0.420519 0.919310 +vt 0.342421 0.919310 +vt 0.342421 0.813491 +vt 0.325579 0.919310 +vt 0.325562 0.813491 +vt 0.321004 0.848879 +vt 0.320796 0.903364 +vt 0.278067 0.903008 +vt 0.278421 0.848669 +vt 0.367977 0.622359 +vt 0.360147 0.711871 +vt 0.375344 0.711606 +vt 0.342426 0.802456 +vt 0.741407 0.764661 +vt 0.325574 0.813491 +vt 0.325591 0.919310 +vt 0.928846 0.238454 +vt 0.955163 0.238449 +vt 0.958342 0.201882 +vt 0.925667 0.201882 +vt 0.928846 0.238452 +vt 0.955163 0.238456 +vt 0.955119 0.169575 +vt 0.928798 0.169575 +vt 0.293485 0.577328 +vt 0.255393 0.577328 +vt 0.250861 0.624083 +vt 0.298149 0.624083 +vt 0.255462 0.677010 +vt 0.293548 0.677003 +vt 0.595373 0.720752 +vt 0.595373 0.727266 +vt 0.599532 0.727266 +vt 0.599532 0.720752 +vt 0.599532 0.713925 +vt 0.595373 0.713925 +vt 0.856994 0.676371 +vt 0.856994 0.692316 +vt 0.865952 0.692316 +vt 0.865952 0.676370 +vt 0.856993 0.669547 +vt 0.865952 0.669547 +vt 0.561124 0.713515 +vt 0.561124 0.720739 +vt 0.566061 0.720739 +vt 0.566062 0.713515 +vt 0.561124 0.707194 +vt 0.566061 0.707194 +vt 0.603626 0.727267 +vt 0.603626 0.720752 +vt 0.603626 0.713925 +vt 0.874771 0.692316 +vt 0.874771 0.676370 +vt 0.874771 0.669547 +vt 0.570922 0.720739 +vt 0.570922 0.713515 +vt 0.570922 0.707194 +vt 0.607882 0.727266 +vt 0.607882 0.720752 +vt 0.607882 0.713925 +vt 0.883941 0.692316 +vt 0.883941 0.676370 +vt 0.883941 0.669547 +vt 0.575975 0.720739 +vt 0.575975 0.713515 +vt 0.575975 0.707194 +vt 0.612524 0.713925 +vt 0.612524 0.720752 +vt 0.612524 0.727266 +vt 0.893936 0.692316 +vt 0.893938 0.676370 +vt 0.893936 0.669547 +vt 0.581485 0.720739 +vt 0.581485 0.713515 +vt 0.581485 0.707194 +vt 0.616770 0.713925 +vt 0.903084 0.692316 +vt 0.903084 0.676370 +vt 0.903084 0.669547 +vt 0.586525 0.720739 +vt 0.586525 0.713515 +vt 0.586526 0.707194 +vt 0.621440 0.713925 +vt 0.913145 0.676371 +vt 0.913145 0.692316 +vt 0.913145 0.669547 +vt 0.592071 0.713515 +vt 0.592071 0.720739 +vt 0.592071 0.707194 +vt 0.561124 0.726221 +vt 0.566062 0.726221 +vt 0.586526 0.726221 +vt 0.592071 0.726221 +vt 0.581485 0.726221 +vt 0.575975 0.726221 +vt 0.570922 0.726221 +vt 0.592071 0.705581 +vt 0.586525 0.705581 +vt 0.566061 0.705580 +vt 0.561124 0.705581 +vt 0.570922 0.705581 +vt 0.575975 0.705580 +vt 0.581485 0.705581 +vt 0.561124 0.727869 +vt 0.566062 0.727869 +vt 0.586525 0.727869 +vt 0.592071 0.727869 +vt 0.581485 0.727869 +vt 0.575975 0.727869 +vt 0.570922 0.727869 +vt 0.747637 0.758623 +vt 0.756599 0.758623 +vt 0.756599 0.747687 +vt 0.747637 0.747687 +vt 0.634474 0.758623 +vt 0.645304 0.758623 +vt 0.645304 0.747687 +vt 0.634474 0.747687 +vt 0.654934 0.758623 +vt 0.654934 0.747687 +vt 0.665270 0.758623 +vt 0.665270 0.747687 +vt 0.675491 0.758623 +vt 0.675491 0.747687 +vt 0.685636 0.758623 +vt 0.685636 0.747687 +vt 0.695509 0.758623 +vt 0.695509 0.747687 +vt 0.705178 0.758623 +vt 0.705178 0.747687 +vt 0.716021 0.758623 +vt 0.716021 0.747687 +vt 0.726917 0.758623 +vt 0.726917 0.747687 +vt 0.737640 0.758623 +vt 0.737640 0.747687 +vt 0.699611 0.737629 +vt 0.709390 0.737629 +vt 0.709390 0.728639 +vt 0.699611 0.728639 +vt 0.690890 0.737629 +vt 0.690890 0.728639 +vt 0.681985 0.737629 +vt 0.681985 0.728639 +vt 0.672836 0.737629 +vt 0.672836 0.728639 +vt 0.663617 0.737629 +vt 0.663617 0.728639 +vt 0.654295 0.737629 +vt 0.654295 0.728639 +vt 0.645609 0.737629 +vt 0.645609 0.728639 +vt 0.635841 0.737629 +vt 0.635841 0.728639 +vt 0.737905 0.737629 +vt 0.745988 0.737629 +vt 0.745988 0.728639 +vt 0.737905 0.728639 +vt 0.728889 0.737629 +vt 0.728889 0.728639 +vt 0.719217 0.737629 +vt 0.719217 0.728639 +vt 0.586105 0.759121 +vt 0.595477 0.759121 +vt 0.595477 0.731390 +vt 0.586105 0.731390 +vt 0.577747 0.759121 +vt 0.577747 0.731390 +vt 0.569212 0.759121 +vt 0.569212 0.731390 +vt 0.560443 0.759121 +vt 0.560443 0.731390 +vt 0.551607 0.759121 +vt 0.551607 0.731390 +vt 0.542673 0.759121 +vt 0.542673 0.731390 +vt 0.534348 0.759121 +vt 0.534348 0.731390 +vt 0.524987 0.759121 +vt 0.524987 0.731390 +vt 0.622807 0.759121 +vt 0.630554 0.759121 +vt 0.630554 0.731390 +vt 0.622807 0.731390 +vt 0.614165 0.759121 +vt 0.614165 0.731390 +vt 0.604896 0.759121 +vt 0.604896 0.731390 +vt 0.756599 0.743685 +vt 0.747637 0.743685 +vt 0.645304 0.743685 +vt 0.634474 0.743685 +vt 0.654934 0.743685 +vt 0.665270 0.743685 +vt 0.675491 0.743685 +vt 0.685636 0.743685 +vt 0.695509 0.743685 +vt 0.705178 0.743685 +vt 0.716021 0.743685 +vt 0.726917 0.743685 +vt 0.737640 0.743685 +vt 0.699611 0.740018 +vt 0.709390 0.740018 +vt 0.690890 0.740018 +vt 0.681985 0.740018 +vt 0.672836 0.740018 +vt 0.663617 0.740018 +vt 0.654295 0.740018 +vt 0.645609 0.740018 +vt 0.635841 0.740018 +vt 0.737905 0.740018 +vt 0.745988 0.740018 +vt 0.728889 0.740018 +vt 0.719217 0.740018 +vt 0.745988 0.723912 +vt 0.737905 0.723912 +vt 0.645609 0.723912 +vt 0.635841 0.723912 +vt 0.654295 0.723912 +vt 0.663617 0.723912 +vt 0.672836 0.723912 +vt 0.681985 0.723912 +vt 0.690890 0.723912 +vt 0.699611 0.723912 +vt 0.709390 0.723912 +vt 0.719217 0.723912 +vt 0.728889 0.723912 +vt 0.972643 0.711952 +vt 0.585126 0.660273 +vt 0.968933 0.602040 +vt 0.990302 0.602040 +vt 0.832599 0.220025 +vt 0.832599 0.242946 +vt 0.743574 0.004685 +vt 0.874107 0.088298 +vt 0.874107 0.147522 +vt 0.887681 0.834634 +vt 0.872827 0.839011 +vt 0.877263 0.993981 +vt 0.889869 0.995168 +vt 0.862885 0.858991 +vt 0.868188 0.873530 +vt 0.914042 0.872083 +vt 0.920439 0.856190 +vt 0.914115 0.980316 +vt 0.911058 0.972195 +vt 0.868396 0.971865 +vt 0.865750 0.979998 +vt 0.905493 0.835033 +vt 0.902012 0.994943 +vt 0.875440 0.921242 +vt 0.903952 0.919621 +vt 0.913021 0.919889 +vt 0.866390 0.921260 +vt 0.699648 0.948281 +vt 0.703024 0.963093 +vt 0.862856 0.959286 +vt 0.861806 0.945918 +vt 0.730020 0.993369 +vt 0.738191 0.987277 +vt 0.738020 0.932516 +vt 0.729094 0.925627 +vt 0.862882 0.974810 +vt 0.705509 0.977442 +vt 0.778391 0.975353 +vt 0.779001 0.945164 +vt 0.779225 0.932086 +vt 0.778187 0.988191 +vt 0.840872 0.929298 +vt 0.827900 0.934040 +vt 0.829627 0.988919 +vt 0.842546 0.993311 +vt 0.964984 0.833800 +vt 0.951820 0.836633 +vt 0.990713 0.968848 +vt 0.984178 0.962364 +vt 0.932031 0.956549 +vt 0.925678 0.966767 +vt 0.928983 0.858811 +vt 0.933210 0.865106 +vt 0.981805 0.859541 +vt 0.985608 0.851314 +vt 0.938975 0.992992 +vt 0.940448 0.839911 +vt 0.932698 0.907687 +vt 0.944597 0.907822 +vt 0.983276 0.912869 +vt 0.971340 0.913129 +vt 0.263387 0.820968 +vt 0.260536 0.830772 +vt 0.256313 0.814849 +vt 0.246400 0.818415 +vt 0.243450 0.828163 +vt 0.250511 0.834400 +vt 0.263341 0.817739 +vt 0.260016 0.829144 +vt 0.255109 0.810639 +vt 0.243571 0.814783 +vt 0.240112 0.826113 +vt 0.248325 0.833374 +vt 0.260162 0.815582 +vt 0.257240 0.825524 +vt 0.252981 0.809384 +vt 0.242889 0.813007 +vt 0.239864 0.822891 +vt 0.247031 0.829211 +vt 0.273779 0.846308 +vt 0.268600 0.851651 +vt 0.275811 0.837484 +vt 0.272655 0.834114 +vt 0.267535 0.839468 +vt 0.265509 0.848181 +vt 0.270482 0.845127 +vt 0.264499 0.851328 +vt 0.272847 0.834896 +vt 0.269220 0.831016 +vt 0.263314 0.837231 +vt 0.260958 0.847313 +vt 0.266182 0.842857 +vt 0.261006 0.848258 +vt 0.268246 0.833980 +vt 0.265129 0.830614 +vt 0.260012 0.836023 +vt 0.257954 0.844789 +vt 0.610201 0.993026 +vt 0.622646 0.997530 +vt 0.635725 0.994072 +vt 0.644223 0.983536 +vt 0.638750 0.981532 +vt 0.644854 0.970053 +vt 0.637480 0.958808 +vt 0.624946 0.954015 +vt 0.611984 0.957453 +vt 0.603448 0.967843 +vt 0.602536 0.981548 +vt 0.223917 0.932574 +vt 0.232999 0.932574 +vt 0.233000 0.920753 +vt 0.223917 0.920753 +vt 0.242220 0.932574 +vt 0.242221 0.920753 +vt 0.251160 0.932574 +vt 0.251160 0.920753 +vt 0.260035 0.932574 +vt 0.260035 0.920753 +vt 0.268544 0.932574 +vt 0.268544 0.920753 +vt 0.277163 0.932574 +vt 0.277163 0.920753 +vt 0.207906 0.932574 +vt 0.215683 0.932574 +vt 0.215684 0.920753 +vt 0.207906 0.920753 +vt 0.515161 0.920274 +vt 0.508480 0.920274 +vt 0.513159 0.935389 +vt 0.482685 0.920274 +vt 0.482685 0.935389 +vt 0.843661 0.831557 +vt 0.819500 0.827674 +vt 0.819713 0.842626 +vt 0.821588 0.854563 +vt 0.820635 0.869631 +vt 0.838933 0.868515 +vt 0.783801 0.855202 +vt 0.763696 0.873734 +vt 0.786416 0.871830 +vt 0.782820 0.842597 +vt 0.783786 0.825691 +vt 0.759320 0.826753 +vt 0.802566 0.854047 +vt 0.803938 0.869997 +vt 0.801575 0.826974 +vt 0.800737 0.842863 +vt 0.542787 0.946218 +vt 0.536571 0.965426 +vt 0.542788 0.984598 +vt 0.559123 0.996488 +vt 0.579316 0.996466 +vt 0.595626 0.984618 +vt 0.601901 0.965425 +vt 0.595647 0.946198 +vt 0.579308 0.934361 +vt 0.559139 0.934348 +vt 0.782819 0.842597 +vt 0.224206 0.989148 +vt 0.238950 0.989148 +vt 0.238950 0.961720 +vt 0.224206 0.961720 +vt 0.255949 0.989148 +vt 0.255949 0.961720 +vt 0.272788 0.989148 +vt 0.272788 0.961720 +vt 0.288974 0.989148 +vt 0.288974 0.961720 +vt 0.306463 0.989148 +vt 0.306463 0.961720 +vt 0.323231 0.989148 +vt 0.323231 0.961720 +vt 0.339239 0.989148 +vt 0.339239 0.961720 +vt 0.355049 0.989148 +vt 0.355049 0.961720 +vt 0.368223 0.989148 +vt 0.368223 0.961720 +vt 0.207121 0.989148 +vt 0.207121 0.961720 +vt 0.207395 0.958377 +vt 0.221277 0.958377 +vt 0.221277 0.940272 +vt 0.207395 0.940272 +vt 0.236980 0.958377 +vt 0.236980 0.940272 +vt 0.252534 0.958377 +vt 0.252534 0.940272 +vt 0.267492 0.958377 +vt 0.267492 0.940272 +vt 0.282960 0.958377 +vt 0.282960 0.940272 +vt 0.297506 0.958377 +vt 0.297506 0.940272 +vt 0.312107 0.958377 +vt 0.312107 0.940272 +vt 0.326609 0.958377 +vt 0.326609 0.940272 +vt 0.340477 0.958377 +vt 0.340477 0.940272 +vt 0.353511 0.958377 +vt 0.353511 0.940272 +vt 0.244109 0.761706 +vt 0.254564 0.761442 +vt 0.254755 0.752994 +vt 0.243283 0.752660 +vt 0.265432 0.762039 +vt 0.265848 0.753583 +vt 0.276282 0.763408 +vt 0.277002 0.753908 +vt 0.286803 0.765604 +vt 0.288526 0.754549 +vt 0.296804 0.768765 +vt 0.300125 0.756467 +vt 0.246936 0.782374 +vt 0.254690 0.781015 +vt 0.262737 0.781821 +vt 0.270448 0.784814 +vt 0.277369 0.789342 +vt 0.283527 0.794494 +vt 0.248280 0.806800 +vt 0.253085 0.805996 +vt 0.257812 0.806614 +vt 0.262222 0.808685 +vt 0.266210 0.811780 +vt 0.269832 0.815302 +vt 0.792508 0.888345 +vt 0.799010 0.924296 +vt 0.783049 0.885021 +vt 0.755406 0.909143 +vt 0.780759 0.882646 +vt 0.747574 0.894536 +vt 0.433241 0.397430 +vt 0.456386 0.397430 +vt 0.325524 0.397430 +vt 0.351838 0.397430 +vt 0.371053 0.397430 +vt 0.390364 0.397430 +vt 0.412002 0.397430 +vt 0.433587 0.254843 +vt 0.445877 0.254833 +vt 0.445709 0.192432 +vt 0.434165 0.192550 +vt 0.422955 0.254845 +vt 0.424181 0.192806 +vt 0.410655 0.254588 +vt 0.412743 0.193408 +vt 0.390056 0.254089 +vt 0.391217 0.194966 +vt 0.458216 0.255010 +vt 0.468927 0.254922 +vt 0.467250 0.192560 +vt 0.457255 0.192394 +vt 0.444716 0.005849 +vt 0.427037 0.006031 +vt 0.411726 0.006585 +vt 0.394088 0.008055 +vt 0.371787 0.010630 +vt 0.478706 0.193054 +vt 0.500278 0.194393 +vt 0.517699 0.009834 +vt 0.495369 0.007501 +vt 0.477713 0.006223 +vt 0.462396 0.005837 +vt 0.390363 0.397430 +vt 0.505253 0.397430 +vt 0.505253 0.347763 +vt 0.478889 0.397430 +vt 0.458216 0.255011 +vt 0.467249 0.192560 +vt 0.481304 0.254550 +vt 0.502013 0.253817 +vt 0.500278 0.194392 +vt 0.325523 0.334431 +vt 0.325523 0.347763 +vt 0.505253 0.334431 +vt 0.517699 0.009835 +vt 0.573963 0.010867 +vt 0.546586 0.196227 +vt 0.546586 0.196228 +vt 0.546788 0.255153 +vt 0.559262 0.334313 +vt 0.505244 0.334437 +vt 0.433234 0.397436 +vt 0.456379 0.397436 +vt 0.456379 0.347769 +vt 0.478881 0.397436 +vt 0.478881 0.347769 +vt 0.325517 0.397436 +vt 0.351830 0.397436 +vt 0.371046 0.397436 +vt 0.390356 0.397436 +vt 0.411994 0.397436 +vt 0.433579 0.254849 +vt 0.445870 0.254839 +vt 0.445702 0.192438 +vt 0.434159 0.192556 +vt 0.422947 0.254850 +vt 0.424174 0.192811 +vt 0.410648 0.254593 +vt 0.412736 0.193413 +vt 0.390049 0.254094 +vt 0.391210 0.194972 +vt 0.481297 0.254555 +vt 0.502006 0.253823 +vt 0.500270 0.194399 +vt 0.478698 0.193060 +vt 0.468920 0.254927 +vt 0.467242 0.192566 +vt 0.458209 0.255016 +vt 0.457247 0.192400 +vt 0.478881 0.334437 +vt 0.444709 0.005856 +vt 0.427029 0.006038 +vt 0.411720 0.006592 +vt 0.394081 0.008062 +vt 0.371780 0.010637 +vt 0.517692 0.009840 +vt 0.495361 0.007508 +vt 0.477706 0.006230 +vt 0.462389 0.005844 +vt 0.573080 0.111794 +vt 0.617867 0.111794 +vt 0.617853 0.089806 +vt 0.573071 0.089806 +vt 0.623897 0.111794 +vt 0.647030 0.111794 +vt 0.647029 0.089806 +vt 0.623887 0.089806 +vt 0.670910 0.111794 +vt 0.670920 0.089806 +vt 0.616463 0.083451 +vt 0.573144 0.083451 +vt 0.624826 0.083451 +vt 0.647085 0.083451 +vt 0.669990 0.083451 +vt 0.573159 0.118205 +vt 0.616489 0.118205 +vt 0.647086 0.118205 +vt 0.669977 0.118205 +vt 0.624841 0.118205 +vt 0.721801 0.089806 +vt 0.678175 0.089806 +vt 0.678162 0.111794 +vt 0.721792 0.111794 +vt 0.721708 0.083451 +vt 0.679462 0.083451 +vt 0.679434 0.118205 +vt 0.721693 0.118205 +vt 0.715725 0.056066 +vt 0.715723 0.032352 +vt 0.682043 0.032352 +vt 0.682041 0.056066 +vt 0.715726 0.078252 +vt 0.682040 0.078251 +vt 0.710043 0.029956 +vt 0.687722 0.029957 +vt 0.687718 0.080599 +vt 0.710048 0.080599 +vt 0.715724 0.056066 +vt 0.682043 0.032353 +vt 0.715722 0.032353 +vt 0.715725 0.078251 +vt 0.710043 0.029957 +vt 0.687723 0.029957 +vt 0.202559 0.197150 +vt 0.202544 0.207042 +vt 0.180225 0.157496 +vt 0.168351 0.158737 +vt 0.169209 0.175931 +vt 0.179621 0.174454 +vt 0.181754 0.189784 +vt 0.187389 0.183595 +vt 0.203120 0.194920 +vt 0.202461 0.187693 +vt 0.180231 0.157515 +vt 0.179629 0.174456 +vt 0.169227 0.175931 +vt 0.168368 0.158755 +vt 0.187388 0.183587 +vt 0.181758 0.189769 +vt 0.202444 0.187681 +vt 0.203102 0.194901 +vt 0.144716 0.126890 +vt 0.143601 0.143303 +vt 0.153187 0.143957 +vt 0.155341 0.127980 +vt 0.166833 0.147117 +vt 0.167453 0.130088 +vt 0.156468 0.130088 +vt 0.157086 0.147117 +vt 0.143677 0.162180 +vt 0.151780 0.162337 +vt 0.166138 0.159930 +vt 0.157899 0.159930 +vt 0.145001 0.185061 +vt 0.150461 0.185078 +vt 0.164736 0.176598 +vt 0.157603 0.176598 +vt 0.166909 0.908600 +vt 0.166909 0.944868 +vt 0.201591 0.944868 +vt 0.201591 0.908600 +vt 0.166909 0.981830 +vt 0.201591 0.981830 +vt 0.168368 0.158754 +vt 0.151778 0.162337 +vt 0.157900 0.159930 +vt 0.890755 0.733858 +vt 0.898922 0.733858 +vt 0.898869 0.702745 +vt 0.891741 0.702745 +vt 0.907283 0.733858 +vt 0.906193 0.702745 +vt 0.915853 0.733858 +vt 0.913663 0.702745 +vt 0.924218 0.733858 +vt 0.920871 0.702745 +vt 0.932056 0.733858 +vt 0.927442 0.702745 +vt 0.849772 0.733858 +vt 0.857324 0.733858 +vt 0.862545 0.702745 +vt 0.856201 0.702745 +vt 0.865355 0.733858 +vt 0.869515 0.702745 +vt 0.873860 0.733858 +vt 0.876967 0.702745 +vt 0.882431 0.733858 +vt 0.884482 0.702745 +vt 0.877212 0.695801 +vt 0.869967 0.695801 +vt 0.863093 0.695801 +vt 0.855827 0.695801 +vt 0.927610 0.695801 +vt 0.919918 0.695801 +vt 0.912946 0.695801 +vt 0.906382 0.695801 +vt 0.899676 0.695801 +vt 0.892485 0.695801 +vt 0.884848 0.695801 +vt 0.890755 0.733859 +vt 0.898921 0.733859 +vt 0.898869 0.702746 +vt 0.891741 0.702746 +vt 0.907283 0.733859 +vt 0.906193 0.702746 +vt 0.915852 0.733859 +vt 0.913663 0.702746 +vt 0.924219 0.733859 +vt 0.920872 0.702746 +vt 0.932056 0.733859 +vt 0.927442 0.702746 +vt 0.849772 0.733859 +vt 0.857325 0.733859 +vt 0.862545 0.702746 +vt 0.856201 0.702746 +vt 0.865356 0.733859 +vt 0.869515 0.702746 +vt 0.873860 0.733859 +vt 0.876967 0.702746 +vt 0.882430 0.733859 +vt 0.884482 0.702746 +vt 0.877212 0.695802 +vt 0.869967 0.695802 +vt 0.863093 0.695802 +vt 0.855827 0.695802 +vt 0.927610 0.695802 +vt 0.919918 0.695802 +vt 0.912946 0.695802 +vt 0.906382 0.695802 +vt 0.899675 0.695802 +vt 0.892485 0.695802 +vt 0.884849 0.695802 +vt 0.532627 0.915094 +vt 0.692740 0.609015 +vt 0.717206 0.609015 +vt 0.717206 0.593044 +vt 0.692740 0.593044 +vt 0.742813 0.609015 +vt 0.742813 0.593044 +vt 0.765585 0.609015 +vt 0.765585 0.593044 +vt 0.790694 0.609015 +vt 0.790694 0.593044 +vt 0.814694 0.609015 +vt 0.814694 0.593044 +vt 0.842015 0.609015 +vt 0.842015 0.593044 +vt 0.867997 0.609015 +vt 0.867997 0.593044 +vt 0.893928 0.609015 +vt 0.893928 0.593044 +vt 0.918320 0.609015 +vt 0.918320 0.593044 +vt 0.939929 0.609015 +vt 0.939929 0.593044 +vt 0.692740 0.557075 +vt 0.717206 0.557075 +vt 0.717206 0.549366 +vt 0.692740 0.549445 +vt 0.742813 0.557075 +vt 0.742813 0.549430 +vt 0.765585 0.557075 +vt 0.765585 0.549427 +vt 0.790694 0.557075 +vt 0.790694 0.549449 +vt 0.814694 0.557075 +vt 0.814694 0.549420 +vt 0.842015 0.557075 +vt 0.842015 0.549403 +vt 0.867997 0.557075 +vt 0.867997 0.549417 +vt 0.893928 0.557075 +vt 0.893928 0.549408 +vt 0.918320 0.557075 +vt 0.918320 0.549438 +vt 0.939929 0.557075 +vt 0.939929 0.549388 +vt 0.717206 0.539500 +vt 0.692740 0.539500 +vt 0.742813 0.539500 +vt 0.765585 0.539500 +vt 0.790694 0.539500 +vt 0.814694 0.539500 +vt 0.842015 0.539500 +vt 0.867997 0.539500 +vt 0.893928 0.539500 +vt 0.918320 0.539500 +vt 0.939929 0.539500 +vt 0.867997 0.575341 +vt 0.893928 0.575341 +vt 0.842015 0.575341 +vt 0.814694 0.575341 +vt 0.790694 0.575341 +vt 0.765585 0.575341 +vt 0.742813 0.575341 +vt 0.717206 0.575341 +vt 0.692740 0.575341 +vt 0.918320 0.575341 +vt 0.939929 0.575341 +vt 0.692520 0.407616 +vt 0.692520 0.438477 +vt 0.725542 0.438477 +vt 0.725542 0.407616 +vt 0.725542 0.502057 +vt 0.725542 0.470710 +vt 0.692520 0.470710 +vt 0.692520 0.502057 +vt 0.692520 0.453555 +vt 0.725542 0.453555 +vt 0.692520 0.518117 +vt 0.692520 0.533770 +vt 0.725542 0.533770 +vt 0.725542 0.518117 +vt 0.729861 0.438477 +vt 0.729861 0.407616 +vt 0.729861 0.453555 +vt 0.729861 0.502057 +vt 0.729861 0.470710 +vt 0.729861 0.533770 +vt 0.729861 0.518117 +vt 0.734306 0.534676 +vt 0.783426 0.534676 +vt 0.783469 0.485554 +vt 0.734878 0.485438 +vt 0.832497 0.535082 +vt 0.832123 0.485559 +vt 0.783453 0.436543 +vt 0.734464 0.436118 +vt 0.832472 0.436098 +vt 0.872792 0.613786 +vt 0.853734 0.612237 +vt 0.853944 0.628134 +vt 0.870679 0.629661 +vt 0.835799 0.613290 +vt 0.838282 0.628773 +vt 0.967861 0.746371 +vt 0.969147 0.727937 +vt 0.954108 0.728889 +vt 0.952982 0.745012 +vt 0.967303 0.710321 +vt 0.952588 0.713255 +vt 0.962781 0.693028 +vt 0.948703 0.697853 +vt 0.955664 0.677432 +vt 0.942633 0.684041 +vt 0.946876 0.660263 +vt 0.935073 0.669134 +vt 0.935251 0.646255 +vt 0.924899 0.657066 +vt 0.921006 0.634921 +vt 0.912418 0.647359 +vt 0.904397 0.625334 +vt 0.897971 0.639224 +vt 0.889902 0.617976 +vt 0.885409 0.633104 +vt 0.901593 0.655573 +vt 0.912975 0.663108 +vt 0.922153 0.673181 +vt 0.928680 0.686158 +vt 0.933454 0.698178 +vt 0.936531 0.711408 +vt 0.937902 0.724912 +vt 0.937623 0.739175 +vt 0.835075 0.645702 +vt 0.848902 0.644436 +vt 0.863596 0.644341 +vt 0.876775 0.645744 +vt 0.888347 0.649729 +vt 0.962965 0.664735 +vt 0.886088 0.455685 +vt 0.908393 0.456087 +vt 0.905257 0.438109 +vt 0.894941 0.438976 +vt 0.887521 0.462014 +vt 0.884886 0.480072 +vt 0.907170 0.479053 +vt 0.897857 0.462595 +vt 0.847207 0.533353 +vt 0.855382 0.534309 +vt 0.855548 0.527683 +vt 0.848043 0.526833 +vt 0.862861 0.534750 +vt 0.862763 0.528041 +vt 0.870463 0.534212 +vt 0.870024 0.527636 +vt 0.878425 0.532921 +vt 0.877410 0.526607 +vt 0.886229 0.530982 +vt 0.884225 0.525367 +vt 0.838944 0.531680 +vt 0.840988 0.525864 +vt 0.852208 0.453817 +vt 0.962381 0.379198 +vt 0.953391 0.379190 +vt 0.953390 0.413333 +vt 0.962382 0.413326 +vt 0.917809 0.379193 +vt 0.908728 0.379195 +vt 0.908738 0.413338 +vt 0.917814 0.413327 +vt 0.926085 0.379194 +vt 0.926086 0.413331 +vt 0.934492 0.379190 +vt 0.934492 0.413330 +vt 0.943951 0.379193 +vt 0.943950 0.413327 +vt 0.868850 0.504464 +vt 0.875480 0.503975 +vt 0.874188 0.479446 +vt 0.868089 0.479673 +vt 0.862513 0.504601 +vt 0.862369 0.479702 +vt 0.856262 0.504404 +vt 0.856737 0.479596 +vt 0.849604 0.504006 +vt 0.850631 0.479418 +vt 0.843080 0.503581 +vt 0.844681 0.479216 +vt 0.881858 0.503313 +vt 0.880025 0.479065 +vt 0.873834 0.461243 +vt 0.867888 0.461225 +vt 0.862304 0.461148 +vt 0.856808 0.461156 +vt 0.850857 0.461215 +vt 0.845260 0.461190 +vt 0.879332 0.461065 +vt 0.869830 0.402958 +vt 0.889269 0.401140 +vt 0.887019 0.394049 +vt 0.865905 0.392227 +vt 0.838928 0.405387 +vt 0.852082 0.404251 +vt 0.842487 0.424429 +vt 0.855934 0.421234 +vt 0.874402 0.417067 +vt 0.892210 0.410176 +vt 0.879060 0.431597 +vt 0.896100 0.422242 +vt 0.874402 0.417068 +vt 0.888298 0.385681 +vt 0.868699 0.380390 +vt 0.886975 0.440720 +vt 0.900786 0.429337 +vt 0.633364 0.720187 +vt 0.638579 0.720186 +vt 0.638579 0.712444 +vt 0.633364 0.712444 +vt 0.644023 0.720186 +vt 0.644023 0.712444 +vt 0.649218 0.720186 +vt 0.649218 0.712444 +vt 0.654439 0.720187 +vt 0.654439 0.712444 +vt 0.659886 0.720187 +vt 0.659886 0.712444 +vt 0.664767 0.720187 +vt 0.664767 0.712444 +vt 0.669811 0.720187 +vt 0.669811 0.712444 +vt 0.674133 0.720187 +vt 0.674133 0.712444 +vt 0.678858 0.720187 +vt 0.678858 0.712444 +vt 0.628491 0.720187 +vt 0.628491 0.712444 +vt 0.792183 0.720849 +vt 0.787280 0.722822 +vt 0.792578 0.733394 +vt 0.798474 0.732060 +vt 0.781962 0.724601 +vt 0.783205 0.735394 +vt 0.776964 0.725977 +vt 0.777420 0.736479 +vt 0.772509 0.726942 +vt 0.772195 0.738293 +vt 0.768639 0.727374 +vt 0.767334 0.739780 +vt 0.765173 0.727165 +vt 0.762744 0.740196 +vt 0.761857 0.726292 +vt 0.758332 0.739158 +vt 0.758568 0.724783 +vt 0.754157 0.736648 +vt 0.755269 0.722753 +vt 0.750471 0.733127 +vt 0.796793 0.718681 +vt 0.804814 0.731182 +vt 0.784474 0.708630 +vt 0.781942 0.710985 +vt 0.778738 0.712706 +vt 0.775456 0.713462 +vt 0.772572 0.713380 +vt 0.770099 0.712831 +vt 0.767818 0.712139 +vt 0.765544 0.711481 +vt 0.763215 0.710934 +vt 0.760759 0.710454 +vt 0.786309 0.706096 +vt 0.778292 0.701635 +vt 0.777305 0.703052 +vt 0.775945 0.704020 +vt 0.774335 0.704328 +vt 0.772685 0.704039 +vt 0.771079 0.703415 +vt 0.769474 0.702737 +vt 0.767834 0.702192 +vt 0.766168 0.701851 +vt 0.764476 0.701658 +vt 0.779008 0.700064 +vt 0.754541 0.691970 +vt 0.765745 0.698617 +vt 0.751732 0.687455 +vt 0.751968 0.674424 +vt 0.754373 0.689200 +vt 0.764915 0.683031 +s 0 +usemtl Texture1 +f 1/1 2/2 3/3 +f 4/4 5/5 1/1 +f 1/1 5/5 2/2 +f 44/6 45/7 46/8 +f 50/9 51/10 52/11 +f 53/12 54/13 55/14 +f 56/15 57/16 58/17 +f 59/15 60/17 61/16 +f 98/18 99/19 100/20 +f 101/21 102/22 103/23 +f 224/24 225/25 226/26 +f 227/24 228/25 229/26 +f 230/27 231/28 232/29 +f 233/30 234/31 235/32 +f 236/33 235/32 237/34 +f 238/35 239/36 240/37 +f 241/38 238/35 242/39 +f 243/30 244/31 245/32 +f 246/33 245/32 247/34 +f 248/35 249/36 250/37 +f 251/38 248/35 252/39 +f 253/30 254/32 255/31 +f 256/33 257/34 254/32 +f 258/35 259/37 260/36 +f 261/38 262/39 258/35 +f 263/40 264/41 265/42 +f 266/43 267/44 268/45 +f 269/40 270/41 271/42 +f 272/43 273/44 274/45 +f 275/40 276/41 277/42 +f 278/40 279/42 280/41 +f 281/40 282/41 283/42 +f 284/40 285/42 286/41 +f 287/46 288/47 289/48 +f 290/49 291/50 292/51 +f 293/52 294/47 295/53 +f 296/49 297/50 298/51 +f 313/54 314/55 315/56 +f 328/57 329/58 330/59 +f 334/57 335/58 336/59 +f 337/57 338/59 339/58 +f 344/60 4311/61 4310/62 +f 344/60 4310/62 345/63 +f 346/64 4476/60 4475/63 +f 346/64 4475/63 347/65 +f 4106/60 348/64 349/65 +f 4106/60 349/65 4105/63 +f 350/66 351/67 352/68 +f 350/66 352/68 353/69 +f 354/68 355/67 356/66 +f 354/68 357/69 360/70 +f 354/68 360/70 361/71 +f 362/72 354/68 361/71 +f 362/72 361/71 363/73 +f 353/69 352/68 364/71 +f 352/68 362/72 363/73 +f 352/68 363/73 364/71 +f 366/74 367/75 368/76 +f 366/74 368/76 369/77 +f 3602/78 398/79 399/80 +f 3602/78 399/80 3599/81 +f 3599/81 399/80 404/82 +f 3599/81 404/82 3601/83 +f 3601/83 404/82 409/84 +f 3601/83 409/84 3603/85 +f 3603/85 414/86 3600/87 +f 4193/88 4191/89 423/90 +f 4193/88 423/90 424/91 +f 4240/92 4218/93 4217/94 +f 4240/92 4217/94 4239/95 +f 429/96 431/97 432/98 +f 429/96 432/98 433/99 +f 429/96 433/99 434/100 +f 4200/101 4234/102 447/103 +f 4199/101 458/103 4232/102 +f 462/104 463/105 4138/106 +f 462/104 4138/106 4174/107 +f 4137/105 465/108 4127/109 +f 4137/105 4127/109 4139/106 +f 466/110 467/111 468/112 +f 470/113 4456/110 4473/114 +f 472/115 4448/113 4472/116 +f 472/115 4472/116 473/117 +f 474/118 4459/115 4474/117 +f 474/118 4474/117 475/119 +f 476/120 4465/118 4478/119 +f 476/120 4478/119 477/121 +f 4462/111 478/122 479/123 +f 4462/111 479/123 4477/112 +f 480/124 481/125 482/126 +f 480/124 482/126 483/127 +f 484/128 482/126 481/125 +f 484/128 481/125 485/129 +f 4238/130 558/131 559/132 +f 4238/130 559/132 4246/133 +f 560/134 561/135 562/136 +f 560/134 562/136 563/137 +f 4238/130 564/138 558/131 +f 563/137 562/136 565/139 +f 563/137 565/139 566/140 +f 4222/141 4213/142 567/143 +f 4222/141 567/143 564/138 +f 568/133 570/131 571/130 +f 4214/144 4224/145 572/135 +f 4214/144 572/135 573/146 +f 571/130 570/131 574/138 +f 571/130 574/138 575/147 +f 4224/145 4236/137 576/136 +f 575/147 574/138 577/143 +f 575/147 577/143 578/142 +f 4236/137 4247/140 579/139 +f 4236/137 579/139 576/136 +f 560/134 580/148 581/146 +f 560/134 581/146 561/135 +f 589/149 4460/115 4466/118 +f 4430/150 591/151 4449/113 +f 4430/150 4449/113 4461/115 +f 4426/151 592/152 4457/110 +f 4426/151 4457/110 4450/113 +f 4429/152 593/153 4463/111 +f 4429/152 4463/111 4458/110 +f 4435/153 4469/122 4464/111 +f 595/154 4436/149 4467/118 +f 627/155 628/156 629/157 +f 627/155 629/157 624/158 +f 638/159 639/160 640/161 +f 644/162 645/163 646/164 +f 644/162 646/164 647/165 +f 654/160 655/159 656/166 +f 654/160 656/166 657/161 +f 660/163 662/165 663/164 +f 682/167 683/168 684/169 +f 4248/170 4291/169 686/171 +f 4248/170 686/171 687/172 +f 688/173 689/174 4278/168 +f 688/173 4278/168 4244/167 +f 692/175 4245/167 4249/170 +f 692/175 4249/170 693/176 +f 694/177 695/178 696/179 +f 694/177 696/179 697/180 +f 4341/180 4377/179 698/181 +f 4341/180 698/181 699/182 +f 700/183 701/184 4379/178 +f 700/183 4379/178 4339/177 +f 4380/178 702/185 703/186 +f 4380/178 703/186 4378/179 +f 704/187 4342/180 705/188 +f 722/189 723/190 724/191 +f 722/189 724/191 725/192 +f 726/193 727/194 4494/195 +f 726/193 4494/195 4425/196 +f 740/197 741/198 742/199 +f 740/197 742/199 743/200 +f 743/200 742/199 748/201 +f 743/200 748/201 749/202 +f 752/197 753/200 754/199 +f 753/200 760/202 761/201 +f 764/203 765/204 766/205 +f 764/203 766/205 767/206 +f 4110/206 4471/205 768/207 +f 4110/206 768/207 769/208 +f 770/209 771/210 4468/204 +f 770/209 4468/204 4115/203 +f 776/211 777/212 778/213 +f 776/211 778/213 779/214 +f 780/215 4123/216 4087/217 +f 780/215 4087/217 781/218 +f 46/8 45/7 48/219 +f 46/8 48/219 47/220 +f 822/221 823/222 4670/12 +f 822/221 4670/12 4672/14 +f 824/223 822/221 4672/14 +f 824/223 4672/14 4673/10 +f 825/224 824/223 4673/10 +f 825/224 4673/10 4674/9 +f 826/225 827/226 3575/220 +f 826/225 3575/220 3573/227 +f 827/226 828/228 3576/8 +f 827/226 3576/8 3575/220 +f 828/228 3577/6 3576/8 +f 44/6 50/9 52/11 +f 49/227 48/219 54/13 +f 49/227 54/13 53/12 +f 830/229 3574/227 4671/12 +f 830/229 4671/12 831/230 +f 3578/6 832/231 833/232 +f 3578/6 833/232 4675/9 +f 54/13 52/11 51/10 +f 54/13 51/10 55/14 +f 834/233 835/234 836/235 +f 834/233 836/235 837/236 +f 4525/234 838/237 839/238 +f 4525/234 839/238 840/239 +f 841/240 4523/239 4500/238 +f 841/240 4500/238 842/241 +f 843/242 4515/237 4526/234 +f 843/242 4526/234 4524/233 +f 844/233 845/236 846/243 +f 844/233 846/243 847/234 +f 4063/234 848/244 849/238 +f 4063/234 849/238 850/237 +f 851/240 852/241 4083/238 +f 851/240 4083/238 4067/244 +f 853/242 4062/233 4064/234 +f 853/242 4064/234 4071/237 +f 854/245 855/246 856/247 +f 854/245 856/247 857/248 +f 56/15 58/17 855/246 +f 56/15 858/249 859/250 +f 56/15 859/250 57/16 +f 57/16 860/251 861/252 +f 862/245 863/248 864/247 +f 862/245 864/247 865/246 +f 59/15 862/245 865/246 +f 59/15 865/246 60/17 +f 59/15 61/16 866/250 +f 61/16 60/17 868/252 +f 61/16 868/252 869/251 +f 857/248 856/247 870/253 +f 864/247 863/248 871/254 +f 864/247 871/254 870/253 +f 872/255 873/256 874/257 +f 872/255 874/257 875/258 +f 880/259 4479/255 4480/258 +f 880/259 4480/258 881/260 +f 886/261 887/262 888/263 +f 886/261 888/263 889/264 +f 4492/265 894/266 895/267 +f 4492/265 895/267 4493/268 +f 4427/266 4481/259 4482/260 +f 4427/266 4482/260 4428/267 +f 4408/256 896/269 897/270 +f 4408/256 897/270 4409/257 +f 904/256 905/255 906/258 +f 904/256 906/258 907/257 +f 4068/262 916/261 917/264 +f 4068/262 917/264 4069/263 +f 4102/259 920/266 921/267 +f 4102/259 921/267 4103/260 +f 4135/266 922/265 923/268 +f 4135/266 923/268 4136/267 +f 924/271 925/272 926/273 +f 924/271 926/273 927/274 +f 925/272 929/275 926/273 +f 930/276 931/277 4299/272 +f 930/276 4299/272 4273/271 +f 4298/277 932/278 4323/279 +f 4298/277 4323/279 4300/272 +f 4324/279 933/280 934/281 +f 4324/279 934/281 4329/275 +f 935/282 4274/271 4266/274 +f 935/282 4266/274 936/283 +f 1051/284 1053/285 1054/286 +f 1054/286 1055/287 1056/288 +f 1054/286 1056/288 1051/284 +f 1052/289 102/22 101/21 +f 1052/289 101/21 1053/285 +f 1055/287 100/20 99/19 +f 1055/287 99/19 1056/288 +f 1134/290 1135/291 1136/292 +f 1134/290 1136/292 1137/293 +f 1179/290 1180/293 1181/292 +f 1179/290 1181/292 1182/291 +f 1230/294 1231/295 1232/296 +f 1230/294 1232/296 1233/297 +f 1230/294 1233/297 1234/298 +f 1230/294 1234/298 1235/299 +f 1270/300 1271/301 1272/302 +f 1270/300 1272/302 1273/303 +f 1270/300 1273/303 1274/304 +f 1270/300 1274/304 1275/305 +f 1342/306 4026/307 4009/308 +f 1342/306 4009/308 1343/309 +f 1489/310 1490/311 1491/312 +f 1489/310 1491/312 1492/313 +f 1490/311 1493/314 1494/315 +f 1490/311 1494/315 1491/312 +f 1492/313 1495/316 1496/317 +f 1497/318 1496/317 1495/316 +f 1494/315 1493/314 1499/319 +f 1494/315 1499/319 1500/320 +f 1501/321 1502/322 1503/323 +f 4280/322 1505/324 1506/325 +f 4280/322 1506/325 4253/323 +f 4265/324 1507/326 1508/327 +f 4265/324 1508/327 4227/325 +f 4294/328 1511/329 1512/330 +f 4294/328 1512/330 4259/331 +f 4309/329 1513/332 1514/333 +f 4309/329 1514/333 4284/330 +f 1515/334 1516/335 1517/336 +f 1515/334 1517/336 1518/337 +f 1515/334 1518/337 1519/338 +f 1515/334 1519/338 1520/339 +f 1521/340 1522/341 1523/342 +f 1521/340 1523/342 1524/343 +f 4595/343 1525/344 1526/345 +f 4602/345 4636/344 1527/346 +f 4602/345 1527/346 1528/347 +f 1529/348 1530/349 4637/344 +f 1529/348 4637/344 4630/342 +f 1531/350 1532/351 4596/343 +f 1531/350 4596/343 4603/345 +f 1533/352 1534/353 1535/354 +f 1533/352 1535/354 1536/355 +f 1537/356 1538/357 1539/358 +f 1537/356 1539/358 1540/359 +f 4648/359 4582/352 4583/355 +f 4648/359 4583/355 4649/356 +f 1543/360 1544/361 1545/362 +f 1543/360 1545/362 1546/363 +f 4662/363 4656/362 1547/364 +f 4662/363 1547/364 1548/365 +f 1549/366 1550/367 1551/368 +f 1549/366 1551/368 1552/369 +f 1553/370 1554/371 4657/362 +f 1553/370 4657/362 4628/361 +f 1557/372 1558/373 1559/374 +f 1557/372 1559/374 1560/375 +f 1561/376 1562/377 1563/378 +f 1561/376 1563/378 1564/379 +f 1565/380 4654/378 4651/377 +f 1565/380 4651/377 1566/381 +f 4660/379 1567/382 1568/383 +f 4660/379 1568/383 4661/376 +f 1569/384 1570/385 1571/386 +f 1569/384 1571/386 1572/387 +f 4576/387 4550/386 1573/388 +f 4576/387 1573/388 1574/389 +f 4658/389 4632/388 1575/390 +f 1577/391 1578/392 4633/388 +f 1577/391 4633/388 4551/386 +f 1579/393 1580/394 4577/387 +f 1579/393 4577/387 4659/389 +f 1581/395 1582/396 1583/397 +f 4580/398 4553/397 1585/399 +f 4580/398 1585/399 1586/400 +f 4652/400 4626/399 1587/401 +f 4652/400 1587/401 1588/402 +f 1589/403 1590/404 1591/405 +f 1589/403 1591/405 1592/406 +f 1595/407 1596/408 4581/398 +f 1595/407 4581/398 4653/400 +f 1633/409 1634/410 3607/411 +f 1633/409 3607/411 3596/412 +f 3742/413 3846/414 3858/415 +f 3858/415 3759/416 3742/413 +f 3788/417 3759/416 3848/418 +f 3758/419 3785/420 3816/421 +f 3758/419 3816/421 3846/414 +f 1725/422 1726/423 1727/424 +f 1725/422 1727/424 1728/425 +f 1726/423 1729/426 1730/427 +f 1726/423 1730/427 1727/424 +f 1729/426 1731/428 1732/429 +f 1729/426 1732/429 1730/427 +f 1731/428 1733/430 1734/431 +f 1731/428 1734/431 1732/429 +f 1733/430 1735/432 1736/433 +f 1733/430 1736/433 1734/431 +f 1735/432 1737/434 1738/435 +f 1735/432 1738/435 1736/433 +f 1739/436 1740/437 1741/438 +f 1739/436 1741/438 1742/439 +f 1740/437 1725/422 1728/425 +f 1740/437 1728/425 1741/438 +f 1760/440 1761/441 3834/442 +f 1760/440 3834/442 3890/443 +f 1772/444 1773/445 1774/446 +f 1772/444 1774/446 1775/447 +f 1776/448 1777/449 1778/450 +f 1776/448 1778/450 1779/451 +f 3900/450 1780/452 1781/453 +f 3900/450 1781/453 3868/451 +f 3887/448 3853/445 3870/444 +f 3887/448 3870/444 3920/449 +f 1782/454 1783/455 1784/456 +f 1782/454 1784/456 1785/457 +f 1786/458 1787/459 1788/460 +f 1786/458 1788/460 1789/461 +f 3885/460 3912/459 3879/456 +f 3885/460 3879/456 3855/455 +f 3897/458 3872/461 1790/462 +f 3897/458 1790/462 1791/463 +f 1792/464 1793/465 1794/446 +f 1792/464 1794/446 1795/466 +f 1796/467 1797/468 1798/469 +f 1796/467 1798/469 1799/470 +f 3695/469 1800/471 1801/453 +f 3695/469 1801/453 3669/470 +f 3685/467 3644/465 3671/464 +f 3685/467 3671/464 3712/468 +f 1802/454 1803/472 1804/473 +f 1802/454 1804/473 1805/474 +f 1806/458 1807/459 1808/460 +f 1806/458 1808/460 1809/461 +f 3682/460 3706/459 3679/473 +f 3682/460 3679/473 3652/472 +f 3692/458 3670/461 1810/475 +f 3692/458 1810/475 1811/476 +f 3810/477 3825/478 3995/479 +f 3810/477 3995/479 4011/480 +f 4011/480 3996/481 3827/482 +f 4011/480 3827/482 3810/477 +f 3867/483 3827/482 3996/481 +f 3867/483 3996/481 3946/484 +f 3825/478 3861/485 3939/486 +f 3825/478 3939/486 3995/479 +f 1832/487 1833/488 1834/489 +f 1832/487 1834/489 1835/490 +f 3979/488 1836/491 1837/492 +f 3979/488 1837/492 3959/489 +f 1838/493 1839/494 1840/495 +f 1838/493 1840/495 1841/496 +f 3998/494 3981/490 3972/495 +f 1842/497 1843/498 1844/499 +f 1842/497 1844/499 1845/500 +f 3843/498 1846/501 1847/502 +f 1848/503 1849/504 1850/505 +f 1848/503 1850/505 1851/506 +f 3903/504 3860/497 3869/500 +f 3903/504 3869/500 3896/505 +f 1852/497 1853/498 1854/499 +f 1852/497 1854/499 1855/500 +f 3963/498 1856/507 1857/502 +f 1858/508 1859/504 1860/505 +f 1858/508 1860/505 1861/506 +f 3891/504 3940/497 3926/500 +f 3891/504 3926/500 3899/505 +f 1862/487 1863/488 1864/489 +f 1862/487 1864/489 1865/490 +f 3831/488 1866/491 1867/492 +f 3831/488 1867/492 3847/489 +f 1868/493 1870/495 1871/496 +f 3821/494 3801/487 3830/490 +f 3821/494 3830/490 3837/495 +f 1872/487 1873/488 1874/489 +f 1872/487 1874/489 1875/490 +f 3722/488 1876/491 1877/492 +f 3722/488 1877/492 3711/489 +f 1878/493 1879/494 1880/495 +f 1878/493 1880/495 1881/496 +f 3680/494 3707/487 3697/490 +f 3621/477 3632/478 3728/479 +f 3621/477 3728/479 3734/480 +f 3734/480 3729/481 3633/482 +f 3734/480 3633/482 3621/477 +f 3663/483 3633/482 3729/481 +f 3663/483 3729/481 3710/484 +f 3632/478 3658/485 3705/486 +f 3632/478 3705/486 3728/479 +f 1902/487 1903/488 1904/489 +f 1902/487 1904/489 1905/490 +f 3643/488 1906/491 1907/492 +f 3643/488 1907/492 3656/489 +f 1908/493 1910/495 1911/496 +f 3688/494 3657/487 3664/490 +f 3688/494 3664/490 3683/495 +f 1912/487 1913/488 1914/489 +f 1912/487 1914/489 1915/490 +f 3725/488 1917/492 3715/489 +f 1918/493 1919/494 1920/495 +f 1918/493 1920/495 1921/496 +f 3730/494 3735/487 3726/490 +f 3730/494 3726/490 3723/495 +f 1922/487 1923/488 1924/489 +f 1922/487 1924/489 1925/490 +f 3641/488 1926/491 1927/492 +f 3641/488 1927/492 3649/489 +f 1928/493 1929/494 1930/495 +f 1928/493 1930/495 1931/496 +f 3629/494 3620/487 3640/490 +f 3629/494 3640/490 3642/495 +f 1940/509 1941/510 1942/511 +f 1940/509 1942/511 1943/512 +f 1944/513 1945/441 3638/442 +f 1944/513 3638/442 3704/443 +f 1978/514 1979/515 1980/516 +f 1978/514 1980/516 1981/517 +f 1981/517 1982/518 1983/519 +f 1984/520 1980/516 1979/515 +f 1984/520 1979/515 1985/521 +f 1982/518 1986/522 1987/523 +f 1982/518 1987/523 1983/519 +f 1988/524 1989/525 1990/526 +f 1988/524 1990/526 1991/527 +f 1992/528 1988/524 1991/527 +f 1992/528 1991/527 1993/529 +f 1994/530 1992/528 1993/529 +f 1994/530 1993/529 1995/531 +f 1989/525 1996/532 1997/533 +f 1989/525 1997/533 1990/526 +f 2060/534 2062/535 2063/536 +f 4643/537 2068/538 2069/539 +f 4643/537 2069/539 4650/540 +f 2074/541 2075/542 2076/543 +f 2074/541 2076/543 2077/544 +f 2078/545 2079/546 2077/544 +f 2078/545 2077/544 2076/543 +f 2080/547 2081/548 2082/549 +f 2080/547 2083/550 2084/551 +f 2080/547 2084/551 2085/552 +f 2108/514 2109/515 2110/516 +f 2108/514 2110/516 2111/517 +f 2111/517 2112/518 2113/519 +f 2111/517 2113/519 2108/514 +f 2114/520 2110/516 2109/515 +f 2114/520 2109/515 2115/521 +f 2112/518 2116/522 2117/523 +f 2112/518 2117/523 2113/519 +f 2118/524 2120/526 2121/527 +f 2122/528 2118/524 2121/527 +f 2122/528 2121/527 2123/529 +f 2124/530 2122/528 2123/529 +f 2119/525 2126/532 2127/533 +f 2119/525 2127/533 2120/526 +f 2190/534 2191/553 2192/535 +f 2190/534 2192/535 2193/536 +f 3691/537 2198/538 2199/539 +f 3691/537 2199/539 3672/540 +f 2204/541 2205/542 2206/543 +f 2204/541 2206/543 2207/544 +f 2208/545 2207/544 2206/543 +f 2210/547 2213/550 2214/551 +f 2244/554 2245/555 3665/556 +f 2246/557 2247/558 3580/559 +f 2246/557 3580/559 3583/560 +f 2248/561 2246/557 3583/560 +f 2248/561 3583/560 3624/562 +f 2249/563 2248/561 3624/562 +f 2249/563 3624/562 3666/564 +f 2250/565 2249/563 3666/564 +f 2250/565 3666/564 3677/566 +f 2245/555 2250/565 3677/566 +f 2245/555 3677/566 3665/556 +f 2262/567 2263/568 2264/569 +f 2262/567 2264/569 2265/570 +f 2266/571 2264/569 2263/568 +f 2266/571 2263/568 2267/572 +f 225/25 2266/571 2267/572 +f 225/25 2267/572 226/26 +f 2300/561 4621/573 2301/574 +f 2308/554 4625/575 4647/576 +f 2308/554 4647/576 2306/577 +f 2309/555 4622/556 4625/575 +f 2309/555 4625/575 2308/554 +f 2310/565 4618/566 4622/556 +f 2310/565 4622/556 2309/555 +f 2301/574 4621/573 4618/566 +f 2301/574 4618/566 2310/565 +f 4667/578 4669/579 2326/580 +f 4667/578 2326/580 2327/581 +f 2330/570 2331/567 2332/568 +f 2330/570 2332/568 2333/569 +f 2334/572 2335/571 2333/569 +f 2334/572 2333/569 2332/568 +f 229/26 228/25 2335/571 +f 229/26 2335/571 2334/572 +f 2372/582 2373/583 3667/584 +f 2376/585 2377/586 3581/587 +f 2376/585 3581/587 3584/588 +f 2378/589 2376/585 3584/588 +f 2379/590 2378/589 3626/591 +f 2379/590 3626/591 3668/592 +f 2380/593 2379/590 3668/592 +f 2380/593 3668/592 3678/594 +f 2373/583 2380/593 3678/594 +f 2373/583 3678/594 3667/584 +f 2390/595 2391/596 2392/597 +f 2390/595 2392/597 2393/598 +f 2394/599 2392/597 2391/596 +f 231/28 2394/599 2395/600 +f 231/28 2395/600 232/29 +f 2400/601 233/30 235/32 +f 2400/601 235/32 2401/602 +f 2402/603 238/35 241/38 +f 2402/603 241/38 2403/604 +f 2401/602 235/32 236/33 +f 2401/602 236/33 2408/605 +f 2409/606 239/36 238/35 +f 2409/606 238/35 2402/603 +f 2426/601 243/30 245/32 +f 2426/601 245/32 2427/602 +f 2432/603 248/35 251/38 +f 2432/603 251/38 2433/604 +f 2427/602 245/32 246/33 +f 2427/602 246/33 2438/605 +f 2439/606 249/36 248/35 +f 2439/606 248/35 2432/603 +f 2470/601 2471/602 254/32 +f 2470/601 254/32 253/30 +f 2472/603 2473/604 261/38 +f 2472/603 261/38 258/35 +f 2471/602 2478/605 256/33 +f 2479/606 2472/603 258/35 +f 2479/606 258/35 260/36 +f 2502/607 2503/608 2504/609 +f 2502/607 2504/609 2505/610 +f 2504/609 2503/608 264/41 +f 2504/609 264/41 263/40 +f 265/42 264/41 2506/611 +f 265/42 2506/611 2507/612 +f 2508/613 2509/614 2510/615 +f 2508/613 2510/615 2511/616 +f 2510/615 266/43 268/45 +f 2510/615 268/45 2511/616 +f 267/44 2512/617 2513/618 +f 267/44 2513/618 268/45 +f 2518/619 3749/620 3778/621 +f 2518/619 3778/621 2519/622 +f 3750/623 2522/624 2523/625 +f 3750/623 2523/625 3779/626 +f 3748/624 2524/627 2525/628 +f 3748/624 2525/628 3777/625 +f 2558/629 2559/630 2560/631 +f 2558/629 2560/631 2561/632 +f 3718/633 3877/634 2564/635 +f 3718/633 2564/635 2565/636 +f 2570/637 2571/638 2572/639 +f 2570/637 2572/639 2573/640 +f 2574/641 2575/642 3721/632 +f 2574/641 3721/632 3719/633 +f 2564/635 3877/634 4076/639 +f 2564/635 4076/639 2576/643 +f 2560/631 2559/630 2579/644 +f 2560/631 2579/644 4078/640 +f 2580/607 2581/608 2582/609 +f 2580/607 2582/609 2583/610 +f 2582/609 2581/608 270/41 +f 2582/609 270/41 269/40 +f 271/42 270/41 2584/611 +f 271/42 2584/611 2585/612 +f 2586/613 2587/614 2588/615 +f 2586/613 2588/615 2589/616 +f 2588/615 272/43 274/45 +f 2588/615 274/45 2589/616 +f 273/44 2590/617 2591/618 +f 273/44 2591/618 274/45 +f 2596/619 4023/620 4060/621 +f 2596/619 4060/621 2597/645 +f 4024/623 2600/624 2601/625 +f 4024/623 2601/625 4061/626 +f 4022/624 2602/627 2603/628 +f 4022/624 2603/628 4059/625 +f 2636/607 2637/608 2638/609 +f 2636/607 2638/609 2639/610 +f 2638/609 2637/608 276/41 +f 2638/609 276/41 275/40 +f 277/42 276/41 2640/618 +f 2642/607 2643/610 2644/609 +f 2642/607 2644/609 2645/608 +f 2644/609 278/40 280/41 +f 2644/609 280/41 2645/608 +f 279/42 2647/618 280/41 +f 2652/646 4518/620 4534/621 +f 2652/646 4534/621 2653/645 +f 4519/623 2656/624 2657/625 +f 4519/623 2657/625 4535/626 +f 4517/624 2658/627 2659/628 +f 4517/624 2659/628 4533/625 +f 2692/629 2693/630 2694/631 +f 2692/629 2694/631 2695/632 +f 4505/633 4563/634 2698/635 +f 4505/633 2698/635 2699/647 +f 2704/637 2705/638 2706/639 +f 2704/637 2706/639 2707/640 +f 2708/641 2709/642 4508/632 +f 2708/641 4508/632 4506/633 +f 2698/635 4563/634 4611/639 +f 2698/635 4611/639 2710/643 +f 2694/631 2693/630 2713/644 +f 2694/631 2713/644 4613/640 +f 2714/607 2715/608 2716/609 +f 2714/607 2716/609 2717/610 +f 2716/609 2715/608 282/41 +f 2716/609 282/41 281/40 +f 283/42 282/41 2718/618 +f 2720/607 2721/610 2722/609 +f 2720/607 2722/609 2723/608 +f 2722/609 284/40 286/41 +f 2722/609 286/41 2723/608 +f 285/42 2725/618 286/41 +f 4590/623 2734/624 2735/625 +f 4590/623 2735/625 4606/626 +f 4588/624 2736/627 2737/628 +f 4588/624 2737/628 4604/625 +f 2803/648 2804/649 2805/650 +f 2803/648 2805/650 2806/651 +f 2804/649 287/46 289/48 +f 2804/649 289/48 2805/650 +f 292/51 2803/648 2806/651 +f 292/51 2806/651 290/49 +f 2840/648 2841/649 2842/652 +f 2840/648 2842/652 2843/651 +f 2841/649 293/52 295/53 +f 2841/649 295/53 2842/652 +f 298/51 2840/648 2843/651 +f 298/51 2843/651 296/49 +f 2844/653 2845/654 2846/655 +f 2844/653 2846/655 2847/656 +f 2848/657 4510/655 2849/658 +f 2848/657 2849/658 2850/659 +f 2852/660 2853/661 2854/662 +f 2852/660 2854/662 2855/663 +f 2856/664 2857/665 2858/655 +f 2860/657 2861/659 2862/658 +f 2860/657 2862/658 4073/655 +f 4079/654 4074/655 4072/658 +f 4079/654 4072/658 2863/666 +f 2864/667 2865/668 2866/662 +f 2864/667 2866/662 2867/669 +f 2868/670 2869/671 2870/672 +f 2868/670 2870/672 2871/673 +f 4088/670 2872/674 2873/675 +f 4088/670 2873/675 4495/671 +f 2944/676 2945/677 2946/678 +f 2944/676 2946/678 2947/679 +f 2947/679 2946/678 2965/680 +f 2947/679 2965/680 2966/681 +f 2971/682 2972/683 4447/684 +f 2973/685 4501/686 4502/687 +f 2978/688 2973/685 4502/687 +f 2978/688 4502/687 4503/689 +f 2975/690 2979/691 2980/692 +f 2975/690 2980/692 2976/693 +f 2982/694 2978/688 4503/689 +f 2982/694 4503/689 4504/695 +f 2988/683 2991/690 2992/693 +f 2988/683 2992/693 4252/684 +f 2994/688 4254/687 4368/689 +f 2991/690 2995/691 2996/692 +f 2998/694 2994/688 4368/689 +f 2998/694 4368/689 4445/695 +f 3003/676 3004/677 3005/678 +f 3003/676 3005/678 3006/679 +f 3006/679 3005/678 3024/680 +f 3006/679 3024/680 3025/681 +f 3030/682 3031/683 4096/684 +f 3030/682 4096/684 4095/696 +f 3032/685 4057/686 4058/687 +f 3031/683 3034/690 3035/693 +f 3031/683 3035/693 4096/684 +f 3037/688 3032/685 4058/687 +f 3037/688 4058/687 4056/689 +f 3046/676 3047/677 3048/678 +f 3046/676 3048/678 3049/679 +f 3049/679 3048/678 3067/680 +f 3049/679 3067/680 3068/681 +f 3073/682 3074/683 4318/684 +f 3073/682 4318/684 4452/696 +f 3075/685 3076/697 4446/686 +f 3075/685 4446/686 4316/687 +f 3074/683 3077/690 3078/693 +f 3074/683 3078/693 4318/684 +f 3080/688 4316/687 4186/689 +f 3077/690 3081/691 3082/692 +f 3077/690 3082/692 3078/693 +f 3084/694 3080/688 4186/689 +f 3084/694 4186/689 4091/695 +f 3089/676 3090/677 3091/678 +f 3089/676 3091/678 3092/679 +f 3092/679 3091/678 3110/680 +f 3092/679 3110/680 3111/681 +f 3160/698 3161/699 3162/700 +f 3160/698 3162/700 3163/701 +f 3164/702 3160/698 3163/701 +f 3164/702 3163/701 3165/703 +f 3166/704 3164/702 3165/703 +f 3166/704 3165/703 3167/705 +f 3166/704 3167/705 3168/706 +f 3166/704 3168/706 3169/707 +f 3161/699 3171/708 3162/700 +f 3172/709 3173/710 3174/711 +f 3172/709 3174/711 3175/712 +f 3774/710 3177/713 3932/711 +f 3178/714 3179/715 3180/716 +f 3178/714 3180/716 3181/717 +f 3812/715 3799/709 3961/712 +f 3812/715 3961/712 3980/716 +f 3190/709 3191/710 3192/711 +f 3906/710 3194/718 3195/713 +f 3906/710 3195/713 3765/711 +f 3196/714 3197/715 3198/716 +f 3196/714 3198/716 3199/717 +f 3953/715 3775/712 3795/716 +f 3222/719 3223/720 3224/721 +f 3226/722 3227/723 3224/721 +f 3226/722 3224/721 3223/720 +f 3228/724 3229/725 3230/726 +f 3228/724 3231/727 3232/728 +f 3228/724 3232/728 3233/729 +f 3234/730 3235/731 3236/732 +f 3234/730 3236/732 3237/733 +f 3238/734 3767/730 3754/733 +f 3238/734 3754/733 3239/735 +f 3240/736 3764/734 3741/735 +f 3240/736 3741/735 3241/737 +f 3242/738 3752/736 3736/737 +f 3242/738 3736/737 3243/739 +f 3244/740 3753/738 3737/739 +f 3244/740 3737/739 3245/741 +f 3768/731 3246/742 3247/743 +f 3768/731 3247/743 3755/732 +f 3248/744 3250/745 3251/746 +f 3252/747 3253/748 3254/749 +f 3252/747 3254/749 3255/750 +f 3256/751 3803/747 3760/750 +f 3256/751 3760/750 3257/752 +f 3258/753 3791/751 3744/752 +f 3258/753 3744/752 3259/754 +f 3260/755 3793/753 3746/754 +f 3260/755 3746/754 3261/756 +f 3819/757 3805/755 3762/756 +f 3819/757 3762/756 3772/745 +f 3347/758 3348/759 3349/760 +f 3347/758 3349/760 3350/761 +f 3351/762 3347/758 3350/761 +f 3351/762 3350/761 3352/763 +f 3353/764 3351/762 3352/763 +f 3353/764 3352/763 3354/765 +f 3348/759 3355/766 3356/767 +f 3401/768 3402/769 3403/770 +f 3401/768 3403/770 3404/771 +f 4157/772 3411/773 3412/774 +f 4157/772 3412/774 4140/775 +f 3415/776 3416/777 3417/778 +f 3415/776 3417/778 3418/779 +f 3419/780 3420/781 3418/779 +f 3419/780 3418/779 3417/778 +f 3421/782 3423/783 3424/784 +f 3421/782 3424/784 3425/785 +f 3421/782 3425/785 3426/786 +f 3449/758 3450/761 3451/760 +f 3449/758 3451/760 3452/759 +f 3453/762 3454/763 3450/761 +f 3453/762 3450/761 3449/758 +f 3455/764 3454/763 3453/762 +f 3452/759 3451/760 3457/767 +f 3452/759 3457/767 3458/766 +f 3503/768 3504/771 3505/770 +f 3503/768 3505/770 3506/769 +f 4403/772 4416/775 3513/774 +f 4403/772 3513/774 3514/773 +f 3517/776 3518/779 3519/778 +f 3517/776 3519/778 3520/777 +f 3521/780 3519/778 3518/779 +f 3521/780 3518/779 3522/781 +f 3523/782 3525/783 3526/787 +f 3523/782 3527/786 3528/785 +f 3523/782 3528/785 3524/784 +f 3529/788 3531/789 3532/790 +f 3530/791 3533/792 3534/793 +f 3530/791 3534/793 3531/789 +f 3535/788 3536/790 3537/789 +f 3535/788 3537/789 3538/791 +f 3538/791 3537/789 3539/793 +f 3538/791 3539/793 3540/792 +f 3540/792 3539/793 320/794 +f 3541/788 3542/791 3543/789 +f 3542/791 3545/792 3546/793 +f 3542/791 3546/793 3543/789 +f 3547/788 3549/789 3550/791 +f 3550/791 3551/793 3552/792 +f 3552/792 3551/793 326/794 +f 3553/795 3554/796 3555/797 +f 3553/795 3555/797 3556/798 +f 3554/796 328/57 330/59 +f 3554/796 330/59 3555/797 +f 3557/795 3558/798 3559/797 +f 3557/795 3559/797 3560/796 +f 3560/796 3559/797 332/59 +f 3560/796 332/59 331/57 +f 3561/795 3562/796 3563/797 +f 3561/795 3563/797 3564/798 +f 3562/796 334/57 336/59 +f 3562/796 336/59 3563/797 +f 3565/795 3566/798 3567/797 +f 3565/795 3567/797 3568/796 +f 3568/796 3567/797 338/59 +f 3568/796 338/59 337/57 +f 3569/799 3570/800 3571/801 +f 3569/799 3571/801 3572/802 +s 1 +f 6/101 7/803 8/804 +f 9/106 10/805 11/107 +f 12/101 13/804 14/803 +f 15/106 16/107 17/805 +f 18/806 19/807 20/102 +f 21/808 22/809 23/810 +f 24/811 25/812 26/813 +f 27/814 28/815 29/816 +f 30/817 31/818 32/819 +f 33/820 31/818 30/817 +f 34/821 35/822 36/823 +f 37/817 38/819 39/818 +f 40/820 37/817 39/818 +f 41/821 42/823 43/822 +f 47/220 48/219 49/227 +f 62/824 63/825 64/826 +f 65/827 66/828 67/829 +f 68/830 69/831 70/832 +f 71/833 72/834 73/835 +f 74/836 75/837 76/838 +f 77/839 78/840 79/841 +f 80/842 81/843 82/844 +f 83/845 84/846 85/847 +f 86/848 87/849 88/850 +f 89/851 90/852 91/853 +f 92/854 93/855 94/856 +f 95/857 96/858 97/859 +f 104/860 105/861 106/862 +f 107/863 108/864 109/865 +f 108/864 110/866 109/865 +f 110/866 111/867 109/865 +f 111/867 112/868 109/865 +f 112/868 113/869 109/865 +f 113/869 114/870 109/865 +f 114/870 115/871 109/865 +f 115/871 116/872 109/865 +f 116/872 117/873 109/865 +f 117/873 118/874 109/865 +f 118/874 119/875 109/865 +f 119/875 120/876 109/865 +f 120/876 107/863 109/865 +f 121/877 122/878 123/879 +f 122/878 124/880 123/879 +f 124/880 125/881 123/879 +f 125/881 126/882 123/879 +f 126/882 127/883 123/879 +f 128/884 129/885 123/879 +f 129/885 130/886 123/879 +f 130/886 131/887 123/879 +f 131/887 132/888 123/879 +f 132/888 133/889 123/879 +f 133/889 134/890 123/879 +f 134/890 121/877 123/879 +f 135/891 136/892 137/893 +f 137/893 136/892 138/894 +f 139/895 140/896 141/897 +f 141/897 140/896 142/898 +f 143/899 137/893 138/894 +f 139/895 141/897 144/900 +f 145/901 146/902 147/903 +f 147/903 146/902 148/904 +f 148/904 146/902 149/905 +f 150/906 151/907 152/908 +f 150/906 153/909 151/907 +f 151/907 153/909 154/910 +f 155/411 156/911 157/412 +f 157/412 156/911 158/912 +f 159/913 160/914 161/915 +f 161/915 160/914 162/916 +f 163/917 157/412 158/912 +f 159/913 161/915 164/918 +f 165/919 166/920 167/921 +f 168/922 165/919 167/921 +f 169/923 168/922 167/921 +f 170/924 169/923 167/921 +f 171/925 170/924 167/921 +f 166/920 171/925 167/921 +f 172/926 173/927 174/928 +f 173/927 175/929 174/928 +f 175/929 176/930 174/928 +f 176/930 177/931 174/928 +f 177/931 178/932 174/928 +f 178/932 172/926 174/928 +f 179/933 180/934 181/935 +f 182/936 179/933 181/935 +f 183/937 182/936 181/935 +f 184/938 183/937 181/935 +f 185/939 184/938 181/935 +f 180/934 185/939 181/935 +f 186/940 187/941 188/942 +f 187/941 189/943 188/942 +f 189/943 190/944 188/942 +f 190/944 191/945 188/942 +f 191/945 192/946 188/942 +f 192/946 186/940 188/942 +f 193/947 194/948 195/949 +f 196/950 197/951 198/952 +f 199/953 200/954 201/955 +f 202/956 203/957 204/958 +f 203/957 205/959 204/958 +f 205/959 206/960 204/958 +f 206/960 207/961 204/958 +f 207/961 208/962 204/958 +f 208/962 209/963 204/958 +f 209/963 210/964 204/958 +f 210/964 211/965 204/958 +f 211/965 212/966 204/958 +f 212/966 202/956 204/958 +f 213/956 214/957 215/958 +f 214/957 216/959 215/958 +f 216/959 217/960 215/958 +f 217/960 218/961 215/958 +f 218/961 219/962 215/958 +f 219/962 220/963 215/958 +f 220/963 221/964 215/958 +f 221/964 222/965 215/958 +f 222/965 223/966 215/958 +f 223/966 213/956 215/958 +f 299/967 300/968 301/969 +f 300/968 302/970 301/969 +f 302/970 303/971 301/969 +f 303/971 304/972 301/969 +f 304/972 305/973 301/969 +f 305/973 306/974 301/969 +f 306/974 307/975 301/969 +f 307/975 308/976 301/969 +f 308/976 309/977 301/969 +f 309/977 299/967 301/969 +f 310/978 311/979 312/980 +f 316/981 317/982 318/794 +f 319/981 320/794 321/982 +f 322/981 323/982 324/794 +f 325/981 326/794 327/982 +f 331/57 332/59 333/58 +f 340/61 341/60 342/63 +f 340/61 342/63 343/62 +f 354/68 356/66 357/69 +f 358/983 4453/2 4118/5 +f 358/983 4118/5 359/984 +f 353/69 364/71 365/70 +f 370/985 371/986 372/987 +f 370/985 372/987 373/988 +f 3588/986 374/989 375/990 +f 3588/986 375/990 3586/987 +f 376/991 3587/985 3585/988 +f 376/991 3585/988 377/992 +f 3586/987 375/990 378/993 +f 3586/987 378/993 379/994 +f 3585/988 380/995 381/996 +f 3585/988 381/996 377/992 +f 372/987 3590/994 3589/995 +f 372/987 3589/995 373/988 +f 382/997 383/998 384/999 +f 382/997 384/999 385/1000 +f 386/1001 387/1002 388/1003 +f 386/1001 388/1003 389/1004 +f 3591/997 3594/1000 3593/1002 +f 3591/997 3593/1002 3592/1001 +f 379/994 378/993 383/998 +f 379/994 383/998 382/997 +f 380/995 386/1001 389/1004 +f 380/995 389/1004 381/996 +f 3590/994 3591/997 3592/1001 +f 3590/994 3592/1001 3589/995 +f 390/78 391/81 392/1005 +f 390/78 392/1005 393/1006 +f 394/1007 395/1008 396/1009 +f 394/1007 396/1009 397/1010 +f 391/81 400/83 401/1011 +f 391/81 401/1011 392/1005 +f 397/1010 396/1009 402/1012 +f 397/1010 402/1012 403/1013 +f 400/83 405/85 406/1014 +f 400/83 406/1014 401/1011 +f 403/1013 402/1012 407/1015 +f 403/1013 407/1015 408/1016 +f 405/85 410/87 411/1017 +f 405/85 411/1017 406/1014 +f 408/1016 407/1015 412/1018 +f 408/1016 412/1018 413/1019 +f 3603/85 409/84 414/86 +f 415/95 416/94 417/1020 +f 415/95 417/1020 418/1021 +f 419/1022 420/1023 421/89 +f 419/1022 421/89 422/88 +f 4194/91 4192/90 425/1024 +f 4194/91 425/1024 426/1025 +f 4215/1025 4202/1024 427/93 +f 4215/1025 427/93 428/92 +f 429/96 430/1026 431/97 +f 435/1027 436/1028 437/1029 +f 435/1027 437/1029 438/1030 +f 439/1031 440/1032 441/1033 +f 439/1031 441/1033 442/1034 +f 438/1030 437/1029 443/1035 +f 438/1030 443/1035 444/1036 +f 444/1036 443/1035 440/1032 +f 444/1036 440/1032 439/1031 +f 445/1037 8/804 7/803 +f 445/1037 7/803 446/1038 +f 10/805 445/1037 446/1038 +f 10/805 446/1038 11/107 +f 436/1028 435/1027 4242/806 +f 436/1028 4242/806 4233/102 +f 442/1034 441/1033 4116/810 +f 442/1034 4116/810 4100/809 +f 6/101 436/1028 4233/102 +f 437/1029 436/1028 6/101 +f 437/1029 6/101 8/804 +f 443/1035 437/1029 8/804 +f 443/1035 8/804 445/1037 +f 440/1032 443/1035 445/1037 +f 440/1032 445/1037 10/805 +f 441/1033 440/1032 10/805 +f 441/1033 10/805 9/106 +f 4116/810 441/1033 9/106 +f 4116/810 9/106 448/109 +f 4196/1027 4177/1030 449/1029 +f 4196/1027 449/1029 450/1028 +f 4117/1031 4104/1034 451/1033 +f 4117/1031 451/1033 452/1032 +f 4177/1030 4134/1036 453/1035 +f 4177/1030 453/1035 449/1029 +f 4134/1036 4117/1031 452/1032 +f 4134/1036 452/1032 453/1035 +f 454/1037 455/1038 14/803 +f 454/1037 14/803 13/804 +f 17/805 16/107 455/1038 +f 17/805 455/1038 454/1037 +f 450/1028 456/102 4243/806 +f 450/1028 4243/806 4196/1027 +f 4104/1034 4101/809 457/810 +f 4104/1034 457/810 451/1033 +f 12/101 456/102 450/1028 +f 449/1029 13/804 12/101 +f 449/1029 12/101 450/1028 +f 453/1035 454/1037 13/804 +f 453/1035 13/804 449/1029 +f 452/1032 17/805 454/1037 +f 452/1032 454/1037 453/1035 +f 451/1033 15/106 17/805 +f 451/1033 17/805 452/1032 +f 457/810 459/109 15/106 +f 457/810 15/106 451/1033 +f 460/1039 461/1040 4208/803 +f 460/1039 4208/803 4201/101 +f 19/807 464/1041 4216/103 +f 19/807 4216/103 20/102 +f 464/1041 460/1039 4201/101 +f 464/1041 4201/101 4216/103 +f 4126/108 21/808 23/810 +f 4126/108 23/810 4128/109 +f 466/110 468/112 469/114 +f 470/113 4473/114 471/116 +f 486/1042 487/1043 488/1044 +f 486/1042 488/1044 489/1045 +f 4148/1043 490/1046 491/1047 +f 4148/1043 491/1047 4176/1044 +f 4142/1046 492/1048 493/1049 +f 4142/1046 493/1049 4173/1047 +f 494/1050 495/1051 496/1052 +f 494/1050 496/1052 497/1053 +f 4141/1051 498/1054 499/1055 +f 4141/1051 499/1055 4172/1052 +f 4147/1054 4149/1042 4182/1045 +f 4147/1054 4182/1045 4175/1055 +f 500/1056 501/1057 502/130 +f 500/1056 502/130 503/133 +f 4198/1057 504/1058 505/141 +f 4198/1057 505/141 4237/130 +f 4189/1058 506/1059 507/142 +f 4189/1058 507/142 4221/141 +f 508/1056 509/1057 510/145 +f 508/1056 510/145 511/144 +f 4188/1057 512/1060 513/137 +f 4188/1057 513/137 4223/145 +f 4197/1060 514/1059 515/140 +f 4197/1060 515/140 4235/137 +f 516/1061 517/1062 518/1063 +f 516/1061 518/1063 519/1064 +f 4333/1062 520/1065 521/1066 +f 4333/1062 521/1066 4352/1063 +f 4331/1065 522/1067 523/1068 +f 4331/1065 523/1068 4348/1066 +f 524/1069 525/1070 526/1071 +f 524/1069 526/1071 527/1072 +f 4330/1070 528/1073 529/1074 +f 4330/1070 529/1074 4347/1071 +f 4332/1073 4334/1061 4357/1064 +f 4332/1073 4357/1064 4351/1074 +f 530/1075 531/1076 532/1077 +f 530/1075 532/1077 533/1078 +f 4386/1075 534/1079 535/1080 +f 4386/1075 535/1080 4422/1076 +f 536/1081 537/1082 538/1083 +f 536/1081 538/1083 539/1084 +f 4385/1082 540/1085 541/1086 +f 4385/1082 541/1086 4420/1083 +f 4388/1085 542/1087 543/1088 +f 4388/1085 543/1088 4433/1086 +f 4390/1087 4387/1078 4431/1077 +f 4390/1087 4431/1077 4437/1088 +f 544/1089 545/1090 546/1091 +f 544/1089 546/1091 547/1092 +f 4226/1090 548/1093 549/1094 +f 4226/1090 549/1094 4258/1091 +f 550/1095 551/1096 552/1097 +f 550/1095 552/1097 553/1098 +f 4225/1096 554/1099 555/1100 +f 4225/1096 555/1100 4257/1097 +f 4230/1099 556/1101 557/1102 +f 4230/1099 557/1102 4261/1100 +f 4231/1089 4262/1092 4264/1102 +f 4231/1089 4264/1102 4241/1101 +f 4238/130 4222/141 564/138 +f 568/133 569/132 570/131 +f 4224/145 576/136 572/135 +f 4180/134 4169/137 504/1058 +f 4180/134 504/1058 4198/1057 +f 4170/137 4163/140 506/1059 +f 4170/137 506/1059 4189/1058 +f 4164/133 4167/130 509/1057 +f 4164/133 509/1057 508/1056 +f 4168/130 4178/147 512/1060 +f 4168/130 512/1060 4188/1057 +f 4179/147 4183/142 514/1059 +f 4179/147 514/1059 4197/1060 +f 4181/134 501/1057 500/1056 +f 4181/134 500/1056 4184/148 +f 582/1103 490/1046 4148/1043 +f 582/1103 4148/1043 583/1104 +f 584/1105 492/1048 4142/1046 +f 584/1105 4142/1046 4120/1103 +f 585/1106 495/1051 494/1050 +f 585/1106 494/1050 586/1107 +f 587/1108 498/1054 4141/1051 +f 587/1108 4141/1051 4119/1106 +f 4132/1108 588/1109 4149/1042 +f 4132/1108 4149/1042 4147/1054 +f 4133/1104 487/1043 486/1042 +f 4133/1104 486/1042 4144/1109 +f 589/149 590/150 4460/115 +f 4435/153 594/1110 4469/122 +f 595/154 4467/118 4470/120 +f 596/1111 597/1112 598/1113 +f 596/1111 598/1113 599/1114 +f 4432/1077 4423/1076 600/1115 +f 4432/1077 600/1115 601/1116 +f 599/1114 598/1113 602/1117 +f 599/1114 602/1117 603/1118 +f 4423/1076 4418/1080 604/1119 +f 4423/1076 604/1119 600/1115 +f 605/1120 606/1121 607/1122 +f 605/1120 607/1122 608/1123 +f 4419/1084 4421/1083 609/1124 +f 4419/1084 609/1124 610/1125 +f 608/1123 607/1122 611/1126 +f 608/1123 611/1126 612/1127 +f 4421/1083 4434/1086 613/1128 +f 4421/1083 613/1128 609/1124 +f 612/1127 611/1126 614/1129 +f 612/1127 614/1129 615/1130 +f 4434/1086 4438/1088 616/1131 +f 4434/1086 616/1131 613/1128 +f 615/1130 614/1129 597/1112 +f 615/1130 597/1112 596/1111 +f 4438/1088 4432/1077 601/1116 +f 4438/1088 601/1116 616/1131 +f 617/1132 618/1133 520/1065 +f 617/1132 520/1065 4333/1062 +f 4297/1133 619/1134 522/1067 +f 4297/1133 522/1067 4331/1065 +f 620/1135 621/1136 525/1070 +f 620/1135 525/1070 524/1069 +f 4296/1136 622/1137 528/1073 +f 4296/1136 528/1073 4330/1070 +f 4301/1137 623/1138 4334/1061 +f 4301/1137 4334/1061 4332/1073 +f 4303/1138 4302/1132 517/1062 +f 4303/1138 517/1062 516/1061 +f 4360/1111 4355/1114 530/1075 +f 4360/1111 530/1075 533/1078 +f 4356/1114 4349/1118 534/1079 +f 4356/1114 534/1079 4386/1075 +f 4350/1120 4353/1123 537/1082 +f 4350/1120 537/1082 536/1081 +f 4354/1123 4358/1127 540/1085 +f 4354/1123 540/1085 4385/1082 +f 4359/1127 4362/1130 542/1087 +f 4359/1127 542/1087 4388/1085 +f 4363/1130 4361/1111 4387/1078 +f 4363/1130 4387/1078 4390/1087 +f 547/1092 546/1091 618/1133 +f 547/1092 618/1133 617/1132 +f 4258/1091 549/1094 619/1134 +f 4258/1091 619/1134 4297/1133 +f 553/1098 552/1097 621/1136 +f 553/1098 621/1136 620/1135 +f 4257/1097 555/1100 622/1137 +f 4257/1097 622/1137 4296/1136 +f 4261/1100 557/1102 623/1138 +f 4261/1100 623/1138 4301/1137 +f 4264/1102 4262/1092 4302/1132 +f 4264/1102 4302/1132 4303/1138 +f 624/158 625/1139 626/1140 +f 624/158 626/1140 627/155 +f 630/1141 28/815 27/814 +f 630/1141 27/814 631/1142 +f 4204/1142 4295/814 4287/811 +f 4204/1142 4287/811 632/1143 +f 4203/1143 24/811 26/813 +f 4203/1143 26/813 633/1144 +f 4287/811 4295/814 4337/816 +f 4287/811 4337/816 4338/812 +f 25/812 634/1145 635/1146 +f 25/812 635/1146 26/813 +f 29/816 28/815 636/1147 +f 29/816 636/1147 637/1148 +f 4338/812 4337/816 4383/1148 +f 4338/812 4383/1148 4382/1145 +f 638/159 640/161 641/166 +f 4154/166 4209/161 642/1149 +f 4154/166 642/1149 643/1150 +f 648/1151 649/1152 4206/1149 +f 648/1151 4206/1149 4210/161 +f 650/1153 651/1154 4155/166 +f 650/1153 4155/166 4162/1150 +f 652/1155 650/1153 4162/1150 +f 652/1155 4162/1150 4152/162 +f 4206/1149 649/1152 653/1156 +f 4206/1149 653/1156 4219/163 +f 643/1150 642/1149 4220/163 +f 643/1150 4220/163 4153/162 +f 4373/161 4414/166 658/1150 +f 4373/161 658/1150 659/1149 +f 660/163 661/162 662/165 +f 664/1154 665/1153 4406/1150 +f 664/1154 4406/1150 4415/166 +f 666/1152 667/1151 4374/161 +f 666/1152 4374/161 4381/1149 +f 659/1149 658/1150 4410/162 +f 659/1149 4410/162 4375/163 +f 668/1156 666/1152 4381/1149 +f 668/1156 4381/1149 4376/163 +f 4406/1150 665/1153 669/1155 +f 4406/1150 669/1155 4411/162 +f 670/1157 671/1158 672/1159 +f 670/1157 672/1159 673/1160 +f 4275/1158 674/1161 675/1162 +f 4275/1158 675/1162 4263/1159 +f 676/1163 4250/1157 4255/1160 +f 676/1163 4255/1160 677/1164 +f 673/1160 672/1159 678/1165 +f 673/1160 678/1165 679/1166 +f 677/1164 4255/1160 4251/1166 +f 677/1164 4251/1166 680/1167 +f 4263/1159 675/1162 681/1168 +f 4263/1159 681/1168 4270/1165 +f 682/167 684/169 685/170 +f 4279/168 690/1169 691/1170 +f 4279/168 691/1170 4292/169 +f 704/187 4340/177 4342/180 +f 706/1171 707/1172 708/1173 +f 706/1171 708/1173 709/1174 +f 4371/1172 710/1175 711/1176 +f 4371/1172 711/1176 4369/1173 +f 709/1174 708/1173 712/1177 +f 709/1174 712/1177 713/1178 +f 4369/1173 711/1176 714/1179 +f 4369/1173 714/1179 4372/1177 +f 4366/1174 4346/1178 715/1180 +f 4366/1174 715/1180 716/1181 +f 716/1181 717/1182 4345/1171 +f 716/1181 4345/1171 4366/1174 +f 718/196 719/195 720/1183 +f 718/196 720/1183 721/1184 +f 728/1185 729/1186 730/1187 +f 728/1185 730/1187 731/1188 +f 732/1189 733/1190 734/1191 +f 732/1189 734/1191 735/1192 +f 721/1184 720/1183 4496/190 +f 721/1184 4496/190 4412/189 +f 735/1192 734/1191 736/1193 +f 735/1192 736/1193 737/1194 +f 731/1188 730/1187 738/1195 +f 731/1188 738/1195 739/1196 +f 4124/198 744/1197 745/1198 +f 4124/198 745/1198 4121/199 +f 746/1199 4097/197 4099/200 +f 746/1199 4099/200 747/1200 +f 747/1200 4099/200 4098/202 +f 747/1200 4098/202 750/1201 +f 4121/199 745/1198 751/1202 +f 4121/199 751/1202 4125/201 +f 752/197 754/199 755/198 +f 4424/198 4440/199 756/1198 +f 4424/198 756/1198 757/1197 +f 758/1199 759/1200 4483/200 +f 758/1199 4483/200 4486/197 +f 753/200 761/201 754/199 +f 759/1200 762/1201 4491/202 +f 759/1200 4491/202 4483/200 +f 4440/199 4439/201 763/1202 +f 4440/199 763/1202 756/1198 +f 772/216 773/1203 774/1204 +f 772/216 774/1204 775/217 +f 782/1205 783/1206 784/1187 +f 782/1205 784/1187 785/1207 +f 786/1208 787/1209 788/1191 +f 786/1208 788/1191 789/1210 +f 773/1203 4143/211 4084/214 +f 773/1203 4084/214 774/1204 +f 787/1209 790/1211 791/1212 +f 787/1209 791/1212 788/1191 +f 783/1206 792/1213 793/1214 +f 783/1206 793/1214 784/1187 +f 794/1215 31/818 33/820 +f 794/1215 33/820 795/1216 +f 796/1217 797/1218 31/818 +f 796/1217 31/818 794/1215 +f 798/1219 799/1220 797/1218 +f 798/1219 797/1218 796/1217 +f 800/1221 34/821 36/823 +f 800/1221 36/823 801/1222 +f 35/822 802/1223 803/1224 +f 35/822 803/1224 36/823 +f 797/1218 799/1220 804/1225 +f 797/1218 804/1225 805/1226 +f 31/818 797/1218 805/1226 +f 31/818 805/1226 806/1227 +f 32/819 31/818 806/1227 +f 32/819 806/1227 807/1228 +f 801/1222 36/823 799/1220 +f 801/1222 799/1220 798/1219 +f 804/1225 799/1220 36/823 +f 804/1225 36/823 803/1224 +f 808/1215 809/1216 4538/820 +f 808/1215 4538/820 39/818 +f 810/1217 808/1215 39/818 +f 810/1217 39/818 811/1218 +f 812/1219 810/1217 811/1218 +f 812/1219 811/1218 813/1220 +f 814/1221 815/1222 42/823 +f 814/1221 42/823 41/821 +f 43/822 42/823 816/1224 +f 43/822 816/1224 817/1223 +f 811/1218 818/1226 819/1225 +f 811/1218 819/1225 813/1220 +f 39/818 820/1227 818/1226 +f 39/818 818/1226 811/1218 +f 38/819 821/1228 820/1227 +f 38/819 820/1227 39/818 +f 815/1222 812/1219 813/1220 +f 815/1222 813/1220 42/823 +f 819/1225 816/1224 42/823 +f 819/1225 42/823 813/1220 +f 828/228 829/1229 3577/6 +f 44/6 52/11 45/7 +f 56/15 855/246 854/245 +f 57/16 861/252 58/17 +f 59/15 866/250 867/249 +f 857/248 870/253 871/254 +f 876/1230 877/1231 878/1232 +f 876/1230 878/1232 879/1233 +f 4497/1231 882/1234 883/1235 +f 4497/1231 883/1235 4498/1232 +f 882/1234 884/1236 885/1237 +f 882/1234 885/1237 883/1235 +f 4520/262 890/1238 891/1239 +f 4520/262 891/1239 4521/263 +f 890/1238 892/265 893/268 +f 890/1238 893/268 891/1239 +f 898/1240 876/1230 879/1233 +f 898/1240 879/1233 899/1241 +f 900/1231 901/1230 902/1233 +f 900/1231 902/1233 903/1232 +f 908/1234 4085/1231 4086/1232 +f 908/1234 4086/1232 909/1235 +f 4107/255 910/259 911/260 +f 4107/255 911/260 4108/258 +f 912/1238 913/262 914/263 +f 912/1238 914/263 915/1239 +f 918/1236 908/1234 909/1235 +f 918/1236 909/1235 919/1237 +f 4111/265 912/1238 915/1239 +f 4111/265 915/1239 4112/268 +f 901/1230 4304/1240 4305/1241 +f 901/1230 4305/1241 902/1233 +f 4307/269 4158/256 4159/257 +f 4307/269 4159/257 4308/270 +f 925/272 928/279 929/275 +f 937/1242 938/1243 939/1244 +f 937/1242 939/1244 940/1245 +f 938/1243 941/1246 942/1247 +f 938/1243 942/1247 939/1244 +f 941/1246 943/1248 944/1249 +f 941/1246 944/1249 942/1247 +f 943/1248 945/1250 946/1251 +f 943/1248 946/1251 944/1249 +f 945/1250 947/1252 948/1253 +f 945/1250 948/1253 946/1251 +f 947/1252 949/1254 950/1255 +f 947/1252 950/1255 948/1253 +f 949/1254 951/1256 952/1257 +f 949/1254 952/1257 950/1255 +f 951/1256 953/1258 954/1259 +f 951/1256 954/1259 952/1257 +f 953/1258 955/1260 956/1261 +f 953/1258 956/1261 954/1259 +f 957/1262 958/1263 959/1264 +f 957/1262 959/1264 960/1265 +f 958/1263 961/1266 962/1267 +f 958/1263 962/1267 959/1264 +f 961/1266 963/1268 964/1269 +f 961/1266 964/1269 962/1267 +f 963/1268 937/1242 940/1245 +f 963/1268 940/1245 964/1269 +f 940/1245 939/1244 965/1270 +f 940/1245 965/1270 966/1271 +f 939/1244 942/1247 967/1272 +f 939/1244 967/1272 965/1270 +f 942/1247 944/1249 968/1273 +f 942/1247 968/1273 967/1272 +f 944/1249 946/1251 969/1274 +f 944/1249 969/1274 968/1273 +f 946/1251 948/1253 970/1275 +f 946/1251 970/1275 969/1274 +f 948/1253 950/1255 971/1276 +f 948/1253 971/1276 970/1275 +f 950/1255 952/1257 972/1277 +f 950/1255 972/1277 971/1276 +f 952/1257 954/1259 973/1278 +f 952/1257 973/1278 972/1277 +f 954/1259 956/1261 974/1279 +f 954/1259 974/1279 973/1278 +f 960/1265 959/1264 975/1280 +f 960/1265 975/1280 976/1281 +f 959/1264 962/1267 977/1282 +f 959/1264 977/1282 975/1280 +f 962/1267 964/1269 978/1283 +f 962/1267 978/1283 977/1282 +f 964/1269 940/1245 966/1271 +f 964/1269 966/1271 978/1283 +f 966/1271 965/1270 979/1284 +f 966/1271 979/1284 980/1285 +f 965/1270 967/1272 981/1286 +f 965/1270 981/1286 979/1284 +f 967/1272 968/1273 982/1287 +f 967/1272 982/1287 981/1286 +f 968/1273 969/1274 983/1288 +f 968/1273 983/1288 982/1287 +f 969/1274 970/1275 984/1289 +f 969/1274 984/1289 983/1288 +f 970/1275 971/1276 985/1290 +f 970/1275 985/1290 984/1289 +f 971/1276 972/1277 986/1291 +f 971/1276 986/1291 985/1290 +f 972/1277 973/1278 987/1292 +f 972/1277 987/1292 986/1291 +f 973/1278 974/1279 988/1293 +f 973/1278 988/1293 987/1292 +f 976/1281 975/1280 989/1294 +f 976/1281 989/1294 990/1295 +f 975/1280 977/1282 991/1296 +f 975/1280 991/1296 989/1294 +f 977/1282 978/1283 992/1297 +f 977/1282 992/1297 991/1296 +f 978/1283 966/1271 980/1285 +f 978/1283 980/1285 992/1297 +f 980/1285 979/1284 993/1298 +f 980/1285 993/1298 994/1299 +f 979/1284 981/1286 995/1300 +f 979/1284 995/1300 993/1298 +f 981/1286 982/1287 996/1301 +f 981/1286 996/1301 995/1300 +f 982/1287 983/1288 997/1302 +f 982/1287 997/1302 996/1301 +f 983/1288 984/1289 998/1303 +f 983/1288 998/1303 997/1302 +f 984/1289 985/1290 999/1304 +f 984/1289 999/1304 998/1303 +f 985/1290 986/1291 1000/1305 +f 985/1290 1000/1305 999/1304 +f 986/1291 987/1292 1001/1306 +f 986/1291 1001/1306 1000/1305 +f 987/1292 988/1293 1002/1307 +f 987/1292 1002/1307 1001/1306 +f 990/1295 989/1294 1003/1308 +f 990/1295 1003/1308 1004/1309 +f 989/1294 991/1296 1005/1310 +f 989/1294 1005/1310 1003/1308 +f 991/1296 992/1297 1006/1311 +f 991/1296 1006/1311 1005/1310 +f 992/1297 980/1285 994/1299 +f 992/1297 994/1299 1006/1311 +f 994/1299 993/1298 1007/1312 +f 994/1299 1007/1312 1008/1313 +f 993/1298 995/1300 1009/1314 +f 993/1298 1009/1314 1007/1312 +f 995/1300 996/1301 1010/1315 +f 995/1300 1010/1315 1009/1314 +f 996/1301 997/1302 1011/1316 +f 996/1301 1011/1316 1010/1315 +f 997/1302 998/1303 1012/1317 +f 997/1302 1012/1317 1011/1316 +f 998/1303 999/1304 1013/1318 +f 998/1303 1013/1318 1012/1317 +f 999/1304 1000/1305 1014/1319 +f 999/1304 1014/1319 1013/1318 +f 1000/1305 1001/1306 1015/1320 +f 1000/1305 1015/1320 1014/1319 +f 1001/1306 1002/1307 1016/1321 +f 1001/1306 1016/1321 1015/1320 +f 1004/1309 1003/1308 1017/1322 +f 1004/1309 1017/1322 1018/1323 +f 1003/1308 1005/1310 1019/1324 +f 1003/1308 1019/1324 1017/1322 +f 1005/1310 1006/1311 1020/1325 +f 1005/1310 1020/1325 1019/1324 +f 1006/1311 994/1299 1008/1313 +f 1006/1311 1008/1313 1020/1325 +f 4271/826 4268/825 4327/829 +f 4271/826 4327/829 4325/828 +f 4271/826 4325/828 4321/832 +f 4271/826 4321/832 4276/834 +f 4276/834 4321/832 4319/831 +f 4276/834 4319/831 4281/835 +f 4281/835 4319/831 4315/838 +f 4281/835 4315/838 4285/840 +f 4285/840 4315/838 4313/837 +f 4285/840 4313/837 4288/841 +f 4288/841 4313/837 1021/1326 +f 4288/841 1021/1326 1022/1327 +f 1022/1327 1021/1326 4314/844 +f 1022/1327 4314/844 4289/846 +f 4289/846 4314/844 4317/843 +f 4289/846 4317/843 4286/847 +f 4286/847 4317/843 4320/850 +f 4286/847 4320/850 4282/852 +f 4282/852 4320/850 4322/849 +f 4282/852 4322/849 4277/853 +f 4277/853 4322/849 4326/856 +f 4277/853 4326/856 4272/858 +f 4272/858 4326/856 4328/855 +f 4272/858 4328/855 4269/859 +f 65/827 68/830 70/832 +f 65/827 70/832 66/828 +f 71/833 62/824 64/826 +f 71/833 64/826 72/834 +f 68/830 74/836 76/838 +f 68/830 76/838 69/831 +f 77/839 71/833 73/835 +f 77/839 73/835 78/840 +f 74/836 1023/1328 4312/1326 +f 74/836 4312/1326 75/837 +f 1024/1329 77/839 79/841 +f 1024/1329 79/841 4290/1327 +f 1023/1328 80/842 82/844 +f 1023/1328 82/844 4312/1326 +f 83/845 1024/1329 4290/1327 +f 83/845 4290/1327 84/846 +f 80/842 86/848 88/850 +f 80/842 88/850 81/843 +f 89/851 83/845 85/847 +f 89/851 85/847 90/852 +f 86/848 92/854 94/856 +f 86/848 94/856 87/849 +f 95/857 89/851 91/853 +f 95/857 91/853 96/858 +f 1025/1330 1026/1331 1027/1332 +f 1025/1330 1027/1332 1028/1333 +f 1026/1331 1029/1334 1030/1335 +f 1026/1331 1030/1335 1027/1332 +f 1029/1334 1031/1336 1032/1337 +f 1029/1334 1032/1337 1030/1335 +f 1031/1336 1033/1338 1034/1339 +f 1031/1336 1034/1339 1032/1337 +f 1035/1340 1036/1341 1037/1342 +f 1035/1340 1037/1342 1038/1343 +f 1036/1341 1039/1344 1040/1345 +f 1036/1341 1040/1345 1037/1342 +f 1039/1344 1041/1346 1042/1347 +f 1039/1344 1042/1347 1040/1345 +f 1041/1346 1043/1348 1044/1349 +f 1041/1346 1044/1349 1042/1347 +f 1043/1348 1045/1350 1046/1351 +f 1043/1348 1046/1351 1044/1349 +f 1045/1350 1047/1352 1048/1353 +f 1045/1350 1048/1353 1046/1351 +f 1047/1352 1049/1354 1050/1355 +f 1047/1352 1050/1355 1048/1353 +f 1049/1354 1025/1330 1028/1333 +f 1049/1354 1028/1333 1050/1355 +f 1051/284 1052/289 1053/285 +f 1057/1356 1058/1357 1059/1358 +f 1057/1356 1059/1358 1060/1359 +f 1061/1360 1062/1361 1058/1357 +f 1061/1360 1058/1357 1057/1356 +f 1063/1362 1064/1363 1062/1361 +f 1063/1362 1062/1361 1061/1360 +f 1065/1364 1066/1365 1064/1363 +f 1065/1364 1064/1363 1063/1362 +f 1067/1366 1068/1367 1066/1365 +f 1067/1366 1066/1365 1065/1364 +f 1069/1368 1070/1369 1068/1367 +f 1069/1368 1068/1367 1067/1366 +f 1071/1370 1072/1371 1070/1369 +f 1071/1370 1070/1369 1069/1368 +f 1073/1372 1074/1373 1072/1371 +f 1073/1372 1072/1371 1071/1370 +f 1060/1359 1059/1358 1074/1373 +f 1060/1359 1074/1373 1073/1372 +f 4575/1358 1058/1357 1075/1374 +f 4575/1358 1075/1374 1076/1375 +f 1058/1357 1062/1361 1077/1376 +f 1058/1357 1077/1376 1075/1374 +f 1062/1361 1064/1363 104/860 +f 1062/1361 104/860 1077/1376 +f 1064/1363 1066/1365 105/861 +f 1064/1363 105/861 104/860 +f 1066/1365 1068/1367 106/862 +f 1066/1365 106/862 105/861 +f 1068/1367 1070/1369 1078/1377 +f 1068/1367 1078/1377 106/862 +f 1070/1369 1072/1371 1079/1378 +f 1070/1369 1079/1378 1078/1377 +f 1072/1371 4572/1373 1080/1379 +f 1072/1371 1080/1379 1079/1378 +f 4572/1373 4575/1358 1076/1375 +f 4572/1373 1076/1375 1080/1379 +f 1078/1377 1079/1378 1075/1374 +f 1078/1377 1075/1374 1077/1376 +f 1079/1378 1080/1379 1076/1375 +f 1079/1378 1076/1375 1075/1374 +f 1077/1376 104/860 106/862 +f 1077/1376 106/862 1078/1377 +f 1081/1380 1082/1381 1083/1382 +f 1081/1380 1083/1382 1084/1383 +f 1082/1381 1085/1384 1086/1385 +f 1082/1381 1086/1385 1083/1382 +f 1085/1384 1087/1386 1088/1387 +f 1085/1384 1088/1387 1086/1385 +f 4571/1386 1089/1388 1090/1389 +f 4571/1386 1090/1389 4567/1387 +f 1089/1388 1091/1390 1092/1391 +f 1089/1388 1092/1391 1090/1389 +f 4541/1390 1093/1392 1094/1393 +f 4541/1390 1094/1393 4542/1391 +f 1093/1392 1095/1394 1096/1395 +f 1093/1392 1096/1395 1094/1393 +f 1095/1394 1097/1396 1098/1397 +f 1095/1394 1098/1397 1096/1395 +f 1097/1396 1099/1398 1100/1399 +f 1097/1396 1100/1399 1098/1397 +f 1099/1398 1101/1400 1102/1401 +f 1099/1398 1102/1401 1100/1399 +f 1101/1400 1103/1402 1104/1403 +f 1101/1400 1104/1403 1102/1401 +f 1103/1402 1105/1404 1106/1405 +f 1103/1402 1106/1405 1104/1403 +f 1105/1404 1081/1380 1084/1383 +f 1105/1404 1084/1383 1106/1405 +f 4607/1383 4601/1382 1107/1406 +f 4607/1383 1107/1406 1108/1407 +f 4601/1382 4587/1385 1109/1408 +f 4601/1382 1109/1408 1107/1406 +f 4587/1385 4568/1387 1110/1409 +f 4587/1385 1110/1409 1109/1408 +f 4568/1387 4552/1389 1111/1410 +f 4568/1387 1111/1410 1110/1409 +f 4552/1389 4543/1391 1112/1411 +f 4552/1389 1112/1411 1111/1410 +f 4543/1391 4527/1393 1113/1412 +f 4543/1391 1113/1412 1112/1411 +f 4527/1393 4516/1395 1114/1413 +f 4527/1393 1114/1413 1113/1412 +f 4516/1395 4531/1397 1115/1414 +f 4516/1395 1115/1414 1114/1413 +f 4531/1397 4539/1399 1116/1415 +f 4531/1397 1116/1415 1115/1414 +f 4539/1399 4555/1401 1117/1416 +f 4539/1399 1117/1416 1116/1415 +f 4555/1401 4584/1403 1118/1417 +f 4555/1401 1118/1417 1117/1416 +f 4584/1403 4599/1405 1119/1418 +f 4584/1403 1119/1418 1118/1417 +f 4599/1405 4607/1383 1108/1407 +f 4599/1405 1108/1407 1119/1418 +f 4600/1407 4594/1406 4593/864 +f 4600/1407 4593/864 4598/863 +f 4594/1406 4586/1408 4585/866 +f 4594/1406 4585/866 4593/864 +f 4586/1408 4565/1409 4569/867 +f 4586/1408 4569/867 4585/866 +f 4566/1409 4558/1410 4556/868 +f 4566/1409 4556/868 4570/867 +f 4558/1410 4548/1411 4546/869 +f 4558/1410 4546/869 4556/868 +f 4549/1411 4532/1412 4530/870 +f 4549/1411 4530/870 4547/869 +f 4532/1412 4529/1413 4528/871 +f 4532/1412 4528/871 4530/870 +f 4529/1413 4537/1414 4536/872 +f 4529/1413 4536/872 4528/871 +f 4537/1414 4545/1415 4544/873 +f 4537/1414 4544/873 4536/872 +f 4545/1415 4559/1416 4557/874 +f 4545/1415 4557/874 4544/873 +f 4559/1416 4579/1417 4578/875 +f 4559/1416 4578/875 4557/874 +f 4579/1417 4592/1418 4591/876 +f 4579/1417 4591/876 4578/875 +f 4592/1418 4600/1407 4598/863 +f 4592/1418 4598/863 4591/876 +f 1120/1419 1121/1420 1122/1421 +f 1120/1419 1122/1421 1123/1422 +f 1121/1420 1124/1423 1125/1424 +f 1121/1420 1125/1424 1122/1421 +f 1124/1423 1126/1425 1127/1426 +f 1124/1423 1127/1426 1125/1424 +f 1126/1425 1128/1427 1129/1428 +f 1126/1425 1129/1428 1127/1426 +f 1130/1429 1131/1430 1132/1431 +f 1130/1429 1132/1431 1133/1432 +f 4619/293 4620/292 1138/1433 +f 4619/293 1138/1433 1139/1434 +f 1140/1435 4635/1420 4634/1419 +f 1140/1435 4634/1419 1141/1436 +f 1139/1434 1138/1433 1142/1437 +f 1139/1434 1142/1437 1143/1438 +f 1144/1439 4631/1423 4635/1420 +f 1144/1439 4635/1420 1140/1435 +f 1143/1438 1142/1437 1145/1440 +f 1143/1438 1145/1440 1146/1441 +f 1147/1442 4623/1425 4631/1423 +f 1147/1442 4631/1423 1144/1439 +f 1146/1441 1145/1440 1148/1443 +f 1146/1441 1148/1443 1149/1444 +f 1150/1445 4608/1427 4623/1425 +f 1150/1445 4623/1425 1147/1442 +f 1151/1446 4597/1432 4562/1431 +f 1151/1446 4562/1431 1152/1447 +f 1153/1448 4573/1430 4609/1429 +f 1153/1448 4609/1429 1154/1449 +f 1155/1450 1156/1451 1157/1452 +f 1155/1450 1157/1452 4574/1453 +f 1158/1453 4306/1452 1159/1454 +f 1158/1453 1159/1454 1160/1455 +f 1161/1456 1162/1457 1163/1458 +f 1161/1456 1163/1458 1164/1459 +f 1165/1460 1166/1422 1167/1421 +f 1165/1460 1167/1421 1168/1420 +f 1168/1420 1167/1421 1169/1461 +f 1168/1420 1169/1461 1170/1462 +f 1170/1462 1169/1461 1171/1426 +f 1170/1462 1171/1426 1172/1425 +f 1172/1425 1171/1426 1173/1428 +f 1172/1425 1173/1428 1174/1463 +f 1175/1429 1176/1432 1177/1431 +f 1175/1429 1177/1431 1178/1464 +f 3673/293 1183/1434 1184/1433 +f 3673/293 1184/1433 3674/292 +f 1185/1435 1186/1436 3612/1460 +f 1185/1435 3612/1460 3613/1420 +f 1183/1434 1187/1438 1188/1437 +f 1183/1434 1188/1437 1184/1433 +f 1189/1439 1185/1435 3613/1420 +f 1189/1439 3613/1420 3618/1462 +f 1187/1438 1190/1441 1191/1440 +f 1187/1438 1191/1440 1188/1437 +f 1192/1442 1189/1439 3618/1462 +f 1192/1442 3618/1462 3651/1425 +f 1190/1441 1193/1444 1194/1443 +f 1190/1441 1194/1443 1191/1440 +f 1195/1445 1192/1442 3651/1425 +f 1195/1445 3651/1425 3739/1463 +f 1196/1446 1197/1447 3888/1431 +f 1196/1446 3888/1431 3784/1432 +f 1198/1448 1199/1449 3740/1429 +f 1198/1448 3740/1429 3862/1464 +f 1200/1450 3863/1453 1157/1452 +f 1200/1450 1157/1452 1156/1451 +f 1201/1453 1202/1465 1203/1466 +f 1201/1453 1203/1466 4306/1452 +f 1204/1456 1205/1459 1163/1458 +f 1204/1456 1163/1458 1162/1457 +f 1206/1467 1207/1468 1208/1469 +f 1206/1467 1208/1469 1209/1470 +f 1210/1471 1211/1472 1212/1469 +f 1210/1471 1212/1469 1213/1470 +f 1214/1471 1215/1472 1216/1469 +f 1214/1471 1216/1469 1217/1470 +f 1218/1471 1219/1472 1220/1469 +f 1218/1471 1220/1469 1221/1470 +f 1222/1471 1223/1472 1224/1469 +f 1222/1471 1224/1469 1225/1470 +f 1226/1471 1227/1472 1228/1469 +f 1226/1471 1228/1469 1229/1470 +f 1221/1470 1220/1469 1236/1473 +f 1221/1470 1236/1473 1237/1474 +f 1217/1470 1216/1469 1238/1473 +f 1217/1470 1238/1473 1239/1474 +f 1213/1470 1212/1469 1240/1473 +f 1213/1470 1240/1473 1241/1474 +f 1209/1470 1208/1469 1242/1473 +f 1209/1470 1242/1473 1243/1474 +f 1229/1470 1228/1469 1244/1473 +f 1229/1470 1244/1473 1245/1474 +f 1225/1470 1224/1469 1246/1473 +f 1225/1470 1246/1473 1247/1474 +f 1248/1475 1249/1476 1250/1477 +f 1248/1475 1250/1477 1251/1478 +f 1252/1479 1253/1480 1254/1478 +f 1252/1479 1254/1478 4522/1477 +f 1255/1479 1256/1480 1257/1478 +f 1255/1479 1257/1478 1258/1477 +f 1259/1479 1260/1480 1261/1478 +f 1259/1479 1261/1478 1262/1477 +f 1263/1479 1264/1480 1265/1478 +f 1263/1479 1265/1478 1266/1477 +f 1267/1479 1268/1480 4540/1478 +f 1267/1479 4540/1478 1269/1477 +f 1262/1477 1261/1478 1276/1475 +f 1262/1477 1276/1475 1277/1476 +f 1258/1477 1257/1478 1278/1475 +f 1258/1477 1278/1475 1279/1476 +f 4522/1477 1254/1478 1280/1475 +f 4522/1477 1280/1475 1281/1476 +f 1251/1478 1250/1477 1282/1479 +f 1251/1478 1282/1479 1283/1480 +f 1269/1477 4540/1478 1284/1475 +f 1269/1477 1284/1475 1285/1476 +f 1266/1477 1265/1478 1286/1475 +f 1266/1477 1286/1475 1287/1476 +f 1288/1481 1289/1482 1290/1483 +f 1288/1481 1290/1483 1291/1484 +f 1292/1485 1293/1486 1288/1481 +f 1292/1485 1288/1481 1291/1484 +f 1294/1487 1295/1488 1296/1489 +f 1294/1487 1296/1489 1297/1490 +f 1298/1491 1294/1487 1297/1490 +f 1298/1491 1297/1490 1299/1492 +f 1300/1493 1301/1494 1302/1495 +f 1300/1493 1302/1495 1303/1496 +f 1304/1497 1300/1493 1303/1496 +f 1304/1497 1303/1496 1305/1498 +f 4044/1484 4025/1483 1306/1499 +f 4044/1484 1306/1499 1307/1500 +f 1308/1501 4039/1485 4044/1484 +f 1308/1501 4044/1484 1307/1500 +f 3915/1490 3883/1489 1309/1502 +f 3915/1490 1309/1502 1310/1503 +f 1311/1504 3937/1492 3915/1490 +f 1311/1504 3915/1490 1310/1503 +f 4000/1496 3968/1495 1312/1505 +f 4000/1496 1312/1505 1313/1506 +f 4028/1498 4000/1496 1313/1506 +f 4028/1498 1313/1506 1314/1507 +f 4050/1500 4035/1499 1315/1508 +f 4050/1500 1315/1508 1316/1509 +f 4046/1501 4050/1500 1316/1509 +f 4046/1501 1316/1509 1317/1510 +f 3908/1503 3864/1502 1318/1511 +f 3908/1503 1318/1511 1319/1512 +f 3928/1504 3908/1503 1319/1512 +f 3928/1504 1319/1512 1320/1513 +f 1313/1506 3970/1505 1321/1514 +f 1313/1506 1321/1514 1322/1515 +f 1314/1507 1313/1506 1322/1515 +f 1314/1507 1322/1515 1323/1516 +f 1324/1517 4047/1510 4048/1509 +f 1324/1517 4048/1509 1325/1518 +f 4048/1509 4034/1508 1326/1519 +f 4048/1509 1326/1519 1325/1518 +f 1319/1512 1318/1511 1327/1520 +f 1319/1512 1327/1520 1328/1521 +f 1329/1522 3923/1513 1319/1512 +f 1329/1522 1319/1512 1328/1521 +f 3999/1515 3964/1514 1330/1523 +f 3999/1515 1330/1523 1331/1524 +f 4037/1516 3999/1515 1331/1524 +f 4037/1516 1331/1524 1332/1525 +f 4036/1518 4017/1519 1333/308 +f 4036/1518 1333/308 1334/307 +f 1335/1526 4030/1517 4036/1518 +f 1335/1526 4036/1518 1334/307 +f 3907/1521 3873/1520 1336/1527 +f 3907/1521 1336/1527 1337/1528 +f 1338/1529 3927/1522 3907/1521 +f 1338/1529 3907/1521 1337/1528 +f 3993/1524 3958/1523 1339/1530 +f 3993/1524 1339/1530 1340/1531 +f 4012/1525 3993/1524 1340/1531 +f 4012/1525 1340/1531 1341/1532 +f 1344/1533 4018/1526 4027/307 +f 1344/1533 4027/307 4033/306 +f 1345/1534 3910/1528 3892/1527 +f 1345/1534 3892/1527 1346/1535 +f 1347/1536 3934/1529 3910/1528 +f 1347/1536 3910/1528 1345/1534 +f 1348/1537 3985/1531 3960/1530 +f 1348/1537 3960/1530 1349/1538 +f 1350/1539 4001/1532 3985/1531 +f 1350/1539 3985/1531 1348/1537 +f 1301/1494 1351/1540 1352/1541 +f 1301/1494 1352/1541 1302/1495 +f 1349/1538 3960/1530 1353/1542 +f 1349/1538 1353/1542 1354/1543 +f 3958/1523 1355/1544 3935/1542 +f 3958/1523 3935/1542 1339/1530 +f 3964/1514 1356/1545 3924/1544 +f 3964/1514 3924/1544 1330/1523 +f 3970/1505 1357/1546 3921/1545 +f 3970/1505 3921/1545 1321/1514 +f 3968/1495 3942/1541 3930/1546 +f 3968/1495 3930/1546 1312/1505 +f 4007/1539 1358/1547 1359/1548 +f 4007/1539 1359/1548 4002/1532 +f 4006/1497 4029/1498 1360/1549 +f 4006/1497 1360/1549 1361/1550 +f 4029/1498 4043/1507 1362/1551 +f 4029/1498 1362/1551 1360/1549 +f 1363/1552 1362/1551 4043/1507 +f 1363/1552 4043/1507 4038/1516 +f 4038/1516 4013/1525 1364/1553 +f 4038/1516 1364/1553 1363/1552 +f 4013/1525 4002/1532 1359/1548 +f 4013/1525 1359/1548 1364/1553 +f 3944/1540 1365/1554 1366/1555 +f 3944/1540 1366/1555 3943/1541 +f 3945/1543 3936/1542 1367/1556 +f 3945/1543 1367/1556 1368/1557 +f 3936/1542 3925/1544 1369/1558 +f 3936/1542 1369/1558 1367/1556 +f 3925/1544 3922/1545 1370/1559 +f 3925/1544 1370/1559 1369/1558 +f 1371/1560 1370/1559 3922/1545 +f 1371/1560 3922/1545 3931/1546 +f 3931/1546 3943/1541 1366/1555 +f 3931/1546 1366/1555 1371/1560 +f 1372/1561 1373/1562 1374/1563 +f 1372/1561 1374/1563 1375/1564 +f 1376/1565 1377/1566 1378/1567 +f 1376/1565 1378/1567 1379/1568 +f 1377/1566 1380/1569 1381/1570 +f 1377/1566 1381/1570 1378/1567 +f 1380/1569 1382/1571 1383/1572 +f 1380/1569 1383/1572 1381/1570 +f 1382/1571 1384/1573 1385/1574 +f 1382/1571 1385/1574 1383/1572 +f 1384/1573 1386/1575 1387/1576 +f 1384/1573 1387/1576 1385/1574 +f 1386/1575 1388/1577 1389/1578 +f 1386/1575 1389/1578 1387/1576 +f 1388/1577 1390/1579 1391/1580 +f 1388/1577 1391/1580 1389/1578 +f 1390/1579 1392/1581 1393/1582 +f 1390/1579 1393/1582 1391/1580 +f 1392/1581 1394/1583 1395/1584 +f 1392/1581 1395/1584 1393/1582 +f 1394/1583 1396/1585 1397/1586 +f 1394/1583 1397/1586 1395/1584 +f 1396/1585 1372/1561 1375/1564 +f 1396/1585 1375/1564 1397/1586 +f 1398/1587 1399/1588 1400/1589 +f 1398/1587 1400/1589 1401/1590 +f 1402/1591 1398/1587 1401/1590 +f 1402/1591 1401/1590 1403/1592 +f 1404/1593 1402/1591 1403/1592 +f 1404/1593 1403/1592 1405/1594 +f 1406/1595 1404/1593 1405/1594 +f 1406/1595 1405/1594 1407/1596 +f 1408/1597 1406/1595 1407/1596 +f 1408/1597 1407/1596 1409/1598 +f 1410/1599 1408/1597 1409/1598 +f 1410/1599 1409/1598 1411/1600 +f 1412/1601 1410/1599 1411/1600 +f 1412/1601 1411/1600 1413/1602 +f 1414/1603 1412/1601 1413/1602 +f 1414/1603 1413/1602 1415/1604 +f 1416/1605 1417/1606 1418/1607 +f 1416/1605 1418/1607 1419/1608 +f 1420/1609 1416/1605 1419/1608 +f 1420/1609 1419/1608 1421/1610 +f 1422/1611 1420/1609 1421/1610 +f 1422/1611 1421/1610 1423/1612 +f 1399/1588 1422/1611 1423/1612 +f 1399/1588 1423/1612 1400/1589 +f 1424/1613 1425/1614 1426/1615 +f 1424/1613 1426/1615 1427/1616 +f 1428/1617 1424/1613 1427/1616 +f 1428/1617 1427/1616 1429/1618 +f 1430/1619 1428/1617 1429/1618 +f 1430/1619 1429/1618 1431/1620 +f 1432/1621 1430/1619 1431/1620 +f 1432/1621 1431/1620 1433/1622 +f 1434/1623 1432/1621 1433/1622 +f 1434/1623 1433/1622 1435/1624 +f 1436/1625 1434/1623 1435/1624 +f 1436/1625 1435/1624 1437/1626 +f 1438/1627 1436/1625 1437/1626 +f 1438/1627 1437/1626 1439/1628 +f 1440/1629 1438/1627 1439/1628 +f 1440/1629 1439/1628 1441/1630 +f 1442/1631 1443/1632 1444/1633 +f 1442/1631 1444/1633 1445/1634 +f 1446/1635 1442/1631 1445/1634 +f 1446/1635 1445/1634 1447/1636 +f 1448/1637 1446/1635 1447/1636 +f 1448/1637 1447/1636 1449/1638 +f 1425/1614 1448/1637 1449/1638 +f 1425/1614 1449/1638 1426/1615 +f 1450/1639 1451/1640 3886/1564 +f 1450/1639 3886/1564 3865/1563 +f 1452/1641 1453/1642 3866/1568 +f 1452/1641 3866/1568 3851/1567 +f 1454/1643 1452/1641 3851/1567 +f 1454/1643 3851/1567 3841/1570 +f 1455/1644 1454/1643 3841/1570 +f 1455/1644 3841/1570 3836/1572 +f 1456/1645 1455/1644 3836/1572 +f 1456/1645 3836/1572 3844/1574 +f 1457/1646 1456/1645 3844/1574 +f 1457/1646 3844/1574 3856/1576 +f 1458/1647 1457/1646 3856/1576 +f 1458/1647 3856/1576 3876/1578 +f 1459/1648 1458/1647 3876/1578 +f 1459/1648 3876/1578 3893/1580 +f 1460/1649 1459/1648 3893/1580 +f 1460/1649 3893/1580 3909/1582 +f 1461/1650 1460/1649 3909/1582 +f 1461/1650 3909/1582 3911/1584 +f 1462/1651 1461/1650 3911/1584 +f 1462/1651 3911/1584 3902/1586 +f 1451/1640 1462/1651 3902/1586 +f 1451/1640 3902/1586 3886/1564 +f 1463/1652 1464/1653 4019/1588 +f 1463/1652 4019/1588 4010/1587 +f 1465/1654 1463/1652 4010/1587 +f 1465/1654 4010/1587 3997/1591 +f 1466/1655 1465/1654 3997/1591 +f 1466/1655 3997/1591 3982/1593 +f 1467/1656 1466/1655 3982/1593 +f 1467/1656 3982/1593 3971/1595 +f 1468/1657 1467/1656 3971/1595 +f 1468/1657 3971/1595 3962/1597 +f 1469/1658 1468/1657 3962/1597 +f 1469/1658 3962/1597 3967/1599 +f 1470/1659 1469/1658 3967/1599 +f 1470/1659 3967/1599 3978/1601 +f 1471/1660 1470/1659 3978/1601 +f 1471/1660 3978/1601 3990/1603 +f 1472/1661 1473/1662 3991/1606 +f 1472/1661 3991/1606 4003/1605 +f 1474/1663 1472/1661 4003/1605 +f 1474/1663 4003/1605 4015/1609 +f 1475/1664 1474/1663 4015/1609 +f 1475/1664 4015/1609 4021/1611 +f 1464/1653 1475/1664 4021/1611 +f 1464/1653 4021/1611 4019/1588 +f 4045/1608 4032/1607 1476/1665 +f 4045/1608 1476/1665 1477/1666 +f 4031/1604 4014/1602 1478/1667 +f 4031/1604 1478/1667 1479/1668 +f 4014/1602 4005/1600 1480/1669 +f 4014/1602 1480/1669 1478/1667 +f 4005/1600 4004/1598 1481/1670 +f 4005/1600 1481/1670 1480/1669 +f 4004/1598 4008/1596 1482/1671 +f 4004/1598 1482/1671 1481/1670 +f 4008/1596 4020/1594 1483/1672 +f 4008/1596 1483/1672 1482/1671 +f 4020/1594 4040/1592 1484/1673 +f 4020/1594 1484/1673 1483/1672 +f 4040/1592 4051/1590 1485/1674 +f 4040/1592 1485/1674 1484/1673 +f 4051/1590 4053/1589 1486/1675 +f 4051/1590 1486/1675 1485/1674 +f 4053/1589 4054/1612 1487/1676 +f 4053/1589 1487/1676 1486/1675 +f 4054/1612 4052/1610 1488/1677 +f 4054/1612 1488/1677 1487/1676 +f 4052/1610 4045/1608 1477/1666 +f 4052/1610 1477/1666 1488/1677 +f 1492/313 1496/317 1489/310 +f 1497/318 1498/1678 1496/317 +f 1501/321 1503/323 1504/1679 +f 4267/326 1509/328 1510/331 +f 4267/326 1510/331 4229/327 +f 4595/343 4629/342 1525/344 +f 4560/353 1541/1680 1542/1681 +f 4560/353 1542/1681 4561/354 +f 1555/1682 1556/1683 4641/360 +f 1555/1682 4641/360 4663/363 +f 4658/389 1575/390 1576/1684 +f 1581/395 1583/397 1584/398 +f 1593/1685 1594/1686 4627/399 +f 1593/1685 4627/399 4554/397 +f 1597/1687 1598/1688 3614/891 +f 1597/1687 3614/891 3598/893 +f 3987/897 3983/898 1599/1689 +f 3987/897 1599/1689 1600/1690 +f 1601/1691 1602/1692 3650/892 +f 1601/1691 3650/892 3615/891 +f 1603/1693 1604/1694 3604/899 +f 1603/1693 3604/899 3635/894 +f 1605/1695 1606/1696 3938/895 +f 1605/1695 3938/895 3974/900 +f 3950/896 1607/1697 1608/1698 +f 3950/896 1608/1698 3984/898 +f 1609/1699 1597/1687 3598/893 +f 1609/1699 3598/893 3605/899 +f 3975/900 3987/897 1600/1690 +f 3975/900 1600/1690 1610/1700 +f 138/894 136/892 1611/1701 +f 138/894 1611/1701 1612/1702 +f 1613/1703 1603/1693 3635/894 +f 1613/1703 3635/894 3766/1702 +f 3650/892 1602/1692 1614/1704 +f 3650/892 1614/1704 3776/1701 +f 139/895 1612/1702 1611/1701 +f 139/895 1611/1701 140/896 +f 3776/1701 1614/1704 1607/1697 +f 3776/1701 1607/1697 3950/896 +f 3938/895 1606/1696 1613/1703 +f 3938/895 1613/1703 3766/1702 +f 1615/1705 1616/1706 3606/902 +f 1615/1705 3606/902 3610/901 +f 3965/908 3986/907 1617/1707 +f 3965/908 1617/1707 1618/1708 +f 1619/1709 1620/1710 3639/904 +f 1619/1709 3639/904 3616/905 +f 1621/1711 1622/1712 3611/901 +f 1621/1711 3611/901 3630/903 +f 3986/907 3988/910 1623/1713 +f 3986/907 1623/1713 1617/1707 +f 3606/902 1616/1706 1624/1714 +f 3606/902 1624/1714 3617/905 +f 1625/1715 1626/1716 147/903 +f 1625/1715 147/903 148/904 +f 1627/1717 1621/1711 3630/903 +f 1627/1717 3630/903 3743/1716 +f 3639/904 1620/1710 1628/1718 +f 3639/904 1628/1718 3756/1715 +f 1629/1719 1630/1720 3901/906 +f 1629/1719 3901/906 3966/908 +f 3933/909 1631/1721 1632/1722 +f 3933/909 1632/1722 3989/910 +f 1630/1720 1627/1717 3743/1716 +f 1630/1720 3743/1716 3901/906 +f 3756/1715 1628/1718 1631/1721 +f 3756/1715 1631/1721 3933/909 +f 153/909 150/906 1626/1716 +f 153/909 1626/1716 1625/1715 +f 3948/915 3955/916 1635/1723 +f 3948/915 1635/1723 1636/1724 +f 1637/1725 1638/1726 3619/911 +f 1637/1725 3619/911 3608/411 +f 1639/1727 1640/1728 3609/917 +f 1639/1727 3609/917 3622/912 +f 1641/1729 1642/1730 3884/913 +f 1641/1729 3884/913 3917/918 +f 3919/914 1643/1731 1644/1732 +f 3919/914 1644/1732 3956/916 +f 1645/1733 3595/409 3597/412 +f 1645/1733 3597/412 3609/917 +f 3918/918 3948/915 1636/1724 +f 3918/918 1636/1724 1646/1734 +f 1647/1735 1639/1727 3622/912 +f 1647/1735 3622/912 1648/1736 +f 3619/911 1638/1726 1649/1737 +f 3619/911 1649/1737 1650/1738 +f 158/912 156/911 3751/1738 +f 158/912 3751/1738 3757/1736 +f 159/913 3757/1736 3751/1738 +f 159/913 3751/1738 160/914 +f 1650/1738 1649/1737 1643/1731 +f 1650/1738 1643/1731 3919/914 +f 3884/913 1642/1730 1647/1735 +f 3884/913 1647/1735 1648/1736 +f 166/920 165/919 1651/1739 +f 166/920 1651/1739 1652/1740 +f 165/919 168/922 1653/1741 +f 165/919 1653/1741 1651/1739 +f 168/922 169/923 1654/1742 +f 168/922 1654/1742 1653/1741 +f 169/923 170/924 1655/1743 +f 169/923 1655/1743 1654/1742 +f 170/924 171/925 1656/1744 +f 170/924 1656/1744 1655/1743 +f 171/925 166/920 1652/1740 +f 171/925 1652/1740 3828/1744 +f 1652/1740 1651/1739 1657/1745 +f 1652/1740 1657/1745 1658/1746 +f 1651/1739 1653/1741 1659/1747 +f 1651/1739 1659/1747 3835/1745 +f 1653/1741 1654/1742 1660/1748 +f 1653/1741 1660/1748 3822/1747 +f 1654/1742 1655/1743 1661/1749 +f 1654/1742 1661/1749 3809/1748 +f 1655/1743 1656/1744 1662/1750 +f 1655/1743 1662/1750 3811/1749 +f 3828/1744 1652/1740 3838/1746 +f 3828/1744 3838/1746 3829/1750 +f 1658/1746 1657/1745 1663/1751 +f 1658/1746 1663/1751 1664/1752 +f 3835/1745 1659/1747 1665/1753 +f 3835/1745 1665/1753 1663/1751 +f 3822/1747 1660/1748 1666/1754 +f 3822/1747 1666/1754 3823/1753 +f 3809/1748 1661/1749 1667/1755 +f 3809/1748 1667/1755 1666/1754 +f 3811/1749 1662/1750 1668/1756 +f 3811/1749 1668/1756 1667/1755 +f 3829/1750 3838/1746 1664/1752 +f 3829/1750 1664/1752 1668/1756 +f 1664/1752 1663/1751 173/927 +f 1664/1752 173/927 172/926 +f 1663/1751 1665/1753 175/929 +f 1663/1751 175/929 173/927 +f 3823/1753 1666/1754 176/930 +f 3823/1753 176/930 175/929 +f 1666/1754 1667/1755 177/931 +f 1666/1754 177/931 176/930 +f 1667/1755 1668/1756 178/932 +f 1667/1755 178/932 177/931 +f 1668/1756 1664/1752 172/926 +f 1668/1756 172/926 178/932 +f 180/934 179/933 1669/1757 +f 180/934 1669/1757 1670/1758 +f 179/933 182/936 1671/1759 +f 179/933 1671/1759 1669/1757 +f 182/936 183/937 1672/1760 +f 182/936 1672/1760 1671/1759 +f 183/937 184/938 1673/1761 +f 183/937 1673/1761 1672/1760 +f 184/938 185/939 1674/1762 +f 184/938 1674/1762 1673/1761 +f 185/939 180/934 1670/1758 +f 185/939 1670/1758 3790/1762 +f 1670/1758 1669/1757 1675/1763 +f 1670/1758 1675/1763 1676/1764 +f 1669/1757 1671/1759 1677/1765 +f 1669/1757 1677/1765 3802/1763 +f 1671/1759 1672/1760 1678/1766 +f 1671/1759 1678/1766 3800/1765 +f 1672/1760 1673/1761 1679/1767 +f 1672/1760 1679/1767 3789/1766 +f 1673/1761 1674/1762 1680/1768 +f 1673/1761 1680/1768 3780/1767 +f 3790/1762 1670/1758 3797/1764 +f 3790/1762 3797/1764 3786/1768 +f 1676/1764 1675/1763 1681/1769 +f 1676/1764 1681/1769 1682/1770 +f 3802/1763 1677/1765 1683/1771 +f 3802/1763 1683/1771 1681/1769 +f 3800/1765 1678/1766 1684/1772 +f 3800/1765 1684/1772 3796/1771 +f 3789/1766 1679/1767 1685/1773 +f 3789/1766 1685/1773 1684/1772 +f 3780/1767 1680/1768 1686/1774 +f 3780/1767 1686/1774 1685/1773 +f 3786/1768 3797/1764 1682/1770 +f 3786/1768 1682/1770 1686/1774 +f 1682/1770 1681/1769 187/941 +f 1682/1770 187/941 186/940 +f 1681/1769 1683/1771 189/943 +f 1681/1769 189/943 187/941 +f 3796/1771 1684/1772 190/944 +f 3796/1771 190/944 189/943 +f 1684/1772 1685/1773 191/945 +f 1684/1772 191/945 190/944 +f 1685/1773 1686/1774 192/946 +f 1685/1773 192/946 191/945 +f 1686/1774 1682/1770 186/940 +f 1686/1774 186/940 192/946 +f 1687/1775 1688/1776 1689/415 +f 1687/1775 1689/415 1690/414 +f 1688/1776 1691/1777 1692/418 +f 1688/1776 1692/418 1689/415 +f 1691/1777 1693/1778 1694/1779 +f 1691/1777 1694/1779 1692/418 +f 1693/1778 1695/1780 1696/417 +f 1693/1778 1696/417 1694/1779 +f 1695/1780 1697/1781 1698/416 +f 1695/1780 1698/416 1696/417 +f 1697/1781 1699/1782 1700/413 +f 1697/1781 1700/413 1698/416 +f 1699/1782 1701/1783 1702/419 +f 1699/1782 1702/419 1700/413 +f 1701/1783 1703/1784 1704/420 +f 1701/1783 1704/420 1702/419 +f 1703/1784 1705/1785 1706/421 +f 1703/1784 1706/421 1704/420 +f 1705/1785 1687/1775 1690/414 +f 1705/1785 1690/414 1706/421 +f 3742/413 3758/419 3846/414 +f 3858/415 3848/418 3759/416 +f 3788/417 3848/418 3824/1779 +f 1707/1786 1708/1787 1709/1788 +f 1707/1786 1709/1788 1710/1789 +f 1708/1787 1711/1790 1712/1791 +f 1708/1787 1712/1791 1709/1788 +f 1711/1790 1713/1792 1714/1793 +f 1711/1790 1714/1793 1712/1791 +f 1713/1792 1715/1794 1716/1795 +f 1713/1792 1716/1795 1714/1793 +f 1715/1794 1717/1796 1718/1797 +f 1715/1794 1718/1797 1716/1795 +f 1717/1796 1719/1798 1720/1799 +f 1717/1796 1720/1799 1718/1797 +f 1721/1800 1722/1801 1723/1802 +f 1721/1800 1723/1802 1724/1803 +f 1722/1801 1707/1786 1710/1789 +f 1722/1801 1710/1789 1723/1802 +f 1743/1804 1744/1805 1745/1806 +f 1744/1805 193/947 195/949 +f 1744/1805 195/949 1745/1806 +f 194/948 196/950 198/952 +f 194/948 198/952 195/949 +f 197/951 1746/1807 1747/1808 +f 197/951 1747/1808 198/952 +f 200/954 1743/1804 1745/1806 +f 200/954 1745/1806 201/955 +f 1718/1797 1720/1799 3700/434 +f 1718/1797 3700/434 3687/432 +f 1716/1795 1718/1797 3687/432 +f 1716/1795 3687/432 3689/430 +f 1714/1793 1716/1795 3689/430 +f 1714/1793 3689/430 3709/428 +f 1712/1791 1714/1793 3709/428 +f 1712/1791 3709/428 3727/426 +f 1709/1788 1712/1791 3727/426 +f 1709/1788 3727/426 3732/423 +f 1710/1789 1709/1788 3732/423 +f 1710/1789 3732/423 3731/422 +f 1723/1802 1710/1789 3731/422 +f 1723/1802 3731/422 3724/437 +f 1724/1803 1723/1802 3724/437 +f 1724/1803 3724/437 3701/436 +f 1748/1809 1749/1810 1750/1811 +f 1748/1809 1750/1811 1751/442 +f 3833/442 3840/1811 1752/1812 +f 3833/442 1752/1812 1753/443 +f 3889/443 3882/1812 1754/1813 +f 3889/443 1754/1813 1755/1814 +f 1756/509 1757/510 1758/511 +f 1756/509 1758/511 1759/512 +f 1762/1815 3951/511 1763/1816 +f 1762/1815 1763/1816 1764/1817 +f 1765/1818 1766/1819 1767/1820 +f 1765/1818 1767/1820 3874/512 +f 3914/1815 3857/1818 3875/512 +f 3914/1815 3875/512 3952/511 +f 3882/1812 1768/1821 1769/1822 +f 3882/1812 1769/1822 1754/1813 +f 1750/1811 1749/1810 1770/1823 +f 1750/1811 1770/1823 1771/1824 +f 1752/1812 3840/1811 3849/1824 +f 1752/1812 3849/1824 3895/1821 +f 1768/1821 1762/1815 1764/1817 +f 1768/1821 1764/1817 1769/1822 +f 1771/1824 1770/1823 1766/1819 +f 1771/1824 1766/1819 1765/1818 +f 3895/1821 3849/1824 3857/1818 +f 3895/1821 3857/1818 3914/1815 +f 1812/1825 1813/1826 1814/480 +f 1812/1825 1814/480 1815/479 +f 1813/1826 1816/1827 1817/481 +f 1813/1826 1817/481 1814/480 +f 1816/1827 1818/1828 1819/484 +f 1816/1827 1819/484 1817/481 +f 1818/1828 1820/1829 1821/483 +f 1818/1828 1821/483 1819/484 +f 1820/1829 1822/1830 1823/482 +f 1820/1829 1823/482 1821/483 +f 1822/1830 1824/1831 1825/477 +f 1822/1830 1825/477 1823/482 +f 1824/1831 1826/1832 1827/478 +f 1824/1831 1827/478 1825/477 +f 1826/1832 1828/1833 1829/485 +f 1826/1832 1829/485 1827/478 +f 1828/1833 1830/1834 1831/486 +f 1828/1833 1831/486 1829/485 +f 1830/1834 1812/1825 1815/479 +f 1830/1834 1815/479 1831/486 +f 3998/494 4016/487 3981/490 +f 3843/498 1847/502 3859/499 +f 3963/498 1857/502 3947/499 +f 1868/493 1869/494 1870/495 +f 3680/494 3697/490 3686/495 +f 1882/1825 1883/1826 1884/480 +f 1882/1825 1884/480 1885/479 +f 1883/1826 1886/1827 1887/481 +f 1883/1826 1887/481 1884/480 +f 1886/1827 1888/1828 1889/484 +f 1886/1827 1889/484 1887/481 +f 1888/1828 1890/1829 1891/483 +f 1888/1828 1891/483 1889/484 +f 1890/1829 1892/1830 1893/482 +f 1890/1829 1893/482 1891/483 +f 1892/1830 1894/1831 1895/477 +f 1892/1830 1895/477 1893/482 +f 1894/1831 1896/1832 1897/478 +f 1894/1831 1897/478 1895/477 +f 1896/1832 1898/1833 1899/485 +f 1896/1832 1899/485 1897/478 +f 1898/1833 1900/1834 1901/486 +f 1898/1833 1901/486 1899/485 +f 1900/1834 1882/1825 1885/479 +f 1900/1834 1885/479 1901/486 +f 1908/493 1909/494 1910/495 +f 3725/488 1916/491 1917/492 +f 1932/1809 1933/1810 1934/1811 +f 1932/1809 1934/1811 1935/442 +f 3637/442 3631/1811 1936/1812 +f 3637/442 1936/1812 1937/443 +f 3703/443 3676/1812 1938/1813 +f 3703/443 1938/1813 1939/1814 +f 1946/1815 3716/511 1947/1816 +f 1946/1815 1947/1816 1948/1817 +f 1949/1835 1950/1819 1951/1820 +f 1949/1835 1951/1820 3653/512 +f 3690/1815 3636/1835 3654/512 +f 3690/1815 3654/512 3717/511 +f 3676/1812 1952/1821 1953/1822 +f 3676/1812 1953/1822 1938/1813 +f 1934/1811 1933/1810 1954/1823 +f 1934/1811 1954/1823 1955/1824 +f 1936/1812 3631/1811 3628/1824 +f 1936/1812 3628/1824 3675/1821 +f 1952/1821 1946/1815 1948/1817 +f 1952/1821 1948/1817 1953/1822 +f 1955/1824 1954/1823 1950/1819 +f 1955/1824 1950/1819 1949/1835 +f 3675/1821 3628/1824 3636/1835 +f 3675/1821 3636/1835 3690/1815 +f 1956/1836 1957/1837 1958/1838 +f 1956/1836 1958/1838 1959/1839 +f 1957/1837 1960/1840 1961/1841 +f 1957/1837 1961/1841 1958/1838 +f 1960/1840 1962/1842 1963/1843 +f 1960/1840 1963/1843 1961/1841 +f 1962/1842 1964/1844 1965/1845 +f 1962/1842 1965/1845 1963/1843 +f 1964/1844 1966/1846 1967/1847 +f 1964/1844 1967/1847 1965/1845 +f 1966/1846 1968/1848 1969/1849 +f 1966/1846 1969/1849 1967/1847 +f 1968/1848 1970/1850 1971/1851 +f 1968/1848 1971/1851 1969/1849 +f 1970/1850 1972/1852 1973/1853 +f 1970/1850 1973/1853 1971/1851 +f 1972/1852 1974/1854 1975/1855 +f 1972/1852 1975/1855 1973/1853 +f 1976/1856 1956/1836 1959/1839 +f 1976/1856 1959/1839 1977/1857 +f 1981/517 1983/519 1978/514 +f 1998/1858 1999/1859 2000/1860 +f 1998/1858 2000/1860 2001/1861 +f 1999/1859 2002/1862 2003/1863 +f 1999/1859 2003/1863 2000/1860 +f 2002/1862 2004/1864 2005/1865 +f 2002/1862 2005/1865 2003/1863 +f 2004/1864 2006/1866 2007/1867 +f 2004/1864 2007/1867 2005/1865 +f 2006/1866 2008/1868 2009/1869 +f 2006/1866 2009/1869 2007/1867 +f 2008/1868 2010/1870 2011/1871 +f 2008/1868 2011/1871 2009/1869 +f 2010/1870 2012/1872 2013/1873 +f 2010/1870 2013/1873 2011/1871 +f 2012/1872 2014/1874 2015/1875 +f 2012/1872 2015/1875 2013/1873 +f 2014/1874 2016/1876 2017/1877 +f 2014/1874 2017/1877 2015/1875 +f 2016/1876 2018/1878 2019/1879 +f 2016/1876 2019/1879 2017/1877 +f 2020/1880 2021/1881 2022/1882 +f 2020/1880 2022/1882 2023/1883 +f 2021/1881 2024/1884 2025/1885 +f 2021/1881 2025/1885 2022/1882 +f 2024/1884 2026/1886 2027/1887 +f 2024/1884 2027/1887 2025/1885 +f 2026/1886 2028/1888 2029/1889 +f 2026/1886 2029/1889 2027/1887 +f 2028/1888 2030/1890 2031/1891 +f 2028/1888 2031/1891 2029/1889 +f 2030/1890 2032/1888 2033/1889 +f 2030/1890 2033/1889 2031/1891 +f 2032/1888 2034/1886 2035/1887 +f 2032/1888 2035/1887 2033/1889 +f 2034/1886 2036/1884 2037/1885 +f 2034/1886 2037/1885 2035/1887 +f 2036/1884 2038/1881 2039/1882 +f 2036/1884 2039/1882 2037/1885 +f 2038/1881 2020/1880 2023/1883 +f 2038/1881 2023/1883 2039/1882 +f 2021/1881 2020/1880 2040/1892 +f 2021/1881 2040/1892 2041/1893 +f 2024/1884 2021/1881 2041/1893 +f 2024/1884 2041/1893 2042/1894 +f 2026/1886 2024/1884 2042/1894 +f 2026/1886 2042/1894 2043/1895 +f 2028/1888 2026/1886 2043/1895 +f 2028/1888 2043/1895 2044/1896 +f 2030/1890 2028/1888 2044/1896 +f 2030/1890 2044/1896 2045/1897 +f 2032/1888 2030/1890 2045/1897 +f 2032/1888 2045/1897 2046/1896 +f 2034/1886 2032/1888 2046/1896 +f 2034/1886 2046/1896 2047/1895 +f 2036/1884 2034/1886 2047/1895 +f 2036/1884 2047/1895 2048/1894 +f 2038/1881 2036/1884 2048/1894 +f 2038/1881 2048/1894 2049/1893 +f 2020/1880 2038/1881 2049/1893 +f 2020/1880 2049/1893 2040/1892 +f 2041/1893 2040/1892 2050/1898 +f 2041/1893 2050/1898 2051/1899 +f 2042/1894 2041/1893 2051/1899 +f 2042/1894 2051/1899 2052/1900 +f 2043/1895 2042/1894 2052/1900 +f 2043/1895 2052/1900 2053/1901 +f 2044/1896 2043/1895 2053/1901 +f 2044/1896 2053/1901 2054/1902 +f 2045/1897 2044/1896 2054/1902 +f 2045/1897 2054/1902 2055/1903 +f 2046/1896 2045/1897 2055/1903 +f 2046/1896 2055/1903 2056/1902 +f 2047/1895 2046/1896 2056/1902 +f 2047/1895 2056/1902 2057/1901 +f 2048/1894 2047/1895 2057/1901 +f 2048/1894 2057/1901 2058/1900 +f 2049/1893 2048/1894 2058/1900 +f 2049/1893 2058/1900 2059/1899 +f 2040/1892 2049/1893 2059/1899 +f 2040/1892 2059/1899 2050/1898 +f 2060/534 2061/553 2062/535 +f 4642/553 2064/1904 2065/1905 +f 4642/553 2065/1905 4646/535 +f 4644/1904 2066/537 2067/540 +f 4644/1904 2067/540 4655/1905 +f 4640/538 2070/1906 2071/1907 +f 4640/538 2071/1907 4645/539 +f 4639/1906 2072/1908 2073/1909 +f 4639/1906 2073/1909 4638/1907 +f 2080/547 2082/549 2083/550 +f 2086/1836 2087/1837 2088/1838 +f 2086/1836 2088/1838 2089/1839 +f 2087/1837 2090/1840 2091/1841 +f 2087/1837 2091/1841 2088/1838 +f 2090/1840 2092/1842 2093/1843 +f 2090/1840 2093/1843 2091/1841 +f 2092/1842 2094/1844 2095/1845 +f 2092/1842 2095/1845 2093/1843 +f 2094/1844 2096/1846 2097/1847 +f 2094/1844 2097/1847 2095/1845 +f 2096/1846 2098/1848 2099/1849 +f 2096/1846 2099/1849 2097/1847 +f 2098/1848 2100/1850 2101/1851 +f 2098/1848 2101/1851 2099/1849 +f 2100/1850 2102/1852 2103/1853 +f 2100/1850 2103/1853 2101/1851 +f 2102/1852 2104/1854 2105/1855 +f 2102/1852 2105/1855 2103/1853 +f 2106/1856 2086/1836 2089/1839 +f 2106/1856 2089/1839 2107/1857 +f 2118/524 2119/525 2120/526 +f 2124/530 2123/529 2125/531 +f 2128/1858 2129/1859 2130/1860 +f 2128/1858 2130/1860 2131/1861 +f 2129/1859 2132/1862 2133/1863 +f 2129/1859 2133/1863 2130/1860 +f 2132/1862 2134/1864 2135/1865 +f 2132/1862 2135/1865 2133/1863 +f 2134/1864 2136/1866 2137/1867 +f 2134/1864 2137/1867 2135/1865 +f 2136/1866 2138/1868 2139/1869 +f 2136/1866 2139/1869 2137/1867 +f 2138/1868 2140/1870 2141/1871 +f 2138/1868 2141/1871 2139/1869 +f 2140/1870 2142/1872 2143/1873 +f 2140/1870 2143/1873 2141/1871 +f 2142/1872 2144/1874 2145/1875 +f 2142/1872 2145/1875 2143/1873 +f 2144/1874 2146/1876 2147/1877 +f 2144/1874 2147/1877 2145/1875 +f 2146/1876 2148/1878 2149/1879 +f 2146/1876 2149/1879 2147/1877 +f 2150/1880 2151/1881 2152/1882 +f 2150/1880 2152/1882 2153/1883 +f 2151/1881 2154/1884 2155/1885 +f 2151/1881 2155/1885 2152/1882 +f 2154/1884 2156/1886 2157/1887 +f 2154/1884 2157/1887 2155/1885 +f 2156/1886 2158/1888 2159/1889 +f 2156/1886 2159/1889 2157/1887 +f 2158/1888 2160/1890 2161/1891 +f 2158/1888 2161/1891 2159/1889 +f 2160/1890 2162/1888 2163/1889 +f 2160/1890 2163/1889 2161/1891 +f 2162/1888 2164/1886 2165/1887 +f 2162/1888 2165/1887 2163/1889 +f 2164/1886 2166/1884 2167/1885 +f 2164/1886 2167/1885 2165/1887 +f 2166/1884 2168/1881 2169/1882 +f 2166/1884 2169/1882 2167/1885 +f 2168/1881 2150/1880 2153/1883 +f 2168/1881 2153/1883 2169/1882 +f 2151/1881 2150/1880 2170/1892 +f 2151/1881 2170/1892 2171/1893 +f 2154/1884 2151/1881 2171/1893 +f 2154/1884 2171/1893 2172/1894 +f 2156/1886 2154/1884 2172/1894 +f 2156/1886 2172/1894 2173/1895 +f 2158/1888 2156/1886 2173/1895 +f 2158/1888 2173/1895 2174/1896 +f 2160/1890 2158/1888 2174/1896 +f 2160/1890 2174/1896 2175/1897 +f 2162/1888 2160/1890 2175/1897 +f 2162/1888 2175/1897 2176/1896 +f 2164/1886 2162/1888 2176/1896 +f 2164/1886 2176/1896 2177/1895 +f 2166/1884 2164/1886 2177/1895 +f 2166/1884 2177/1895 2178/1894 +f 2168/1881 2166/1884 2178/1894 +f 2168/1881 2178/1894 2179/1893 +f 2150/1880 2168/1881 2179/1893 +f 2150/1880 2179/1893 2170/1892 +f 2171/1893 2170/1892 2180/1898 +f 2171/1893 2180/1898 2181/1899 +f 2172/1894 2171/1893 2181/1899 +f 2172/1894 2181/1899 2182/1900 +f 2173/1895 2172/1894 2182/1900 +f 2173/1895 2182/1900 2183/1901 +f 2174/1896 2173/1895 2183/1901 +f 2174/1896 2183/1901 2184/1902 +f 2175/1897 2174/1896 2184/1902 +f 2175/1897 2184/1902 2185/1903 +f 2176/1896 2175/1897 2185/1903 +f 2176/1896 2185/1903 2186/1902 +f 2177/1895 2176/1896 2186/1902 +f 2177/1895 2186/1902 2187/1901 +f 2178/1894 2177/1895 2187/1901 +f 2178/1894 2187/1901 2188/1900 +f 2179/1893 2178/1894 2188/1900 +f 2179/1893 2188/1900 2189/1899 +f 2170/1892 2179/1893 2189/1899 +f 2170/1892 2189/1899 2180/1898 +f 3693/553 2194/1904 2195/1905 +f 3693/553 2195/1905 3694/535 +f 3696/1904 2196/537 2197/540 +f 3696/1904 2197/540 3708/1905 +f 3684/538 2200/1906 2201/1907 +f 3684/538 2201/1907 3634/539 +f 3681/1906 2202/1908 2203/1909 +f 3681/1906 2203/1909 3627/1907 +f 2208/545 2209/546 2207/544 +f 2210/547 2211/548 2212/549 +f 2210/547 2212/549 2213/550 +f 2210/547 2214/551 2215/552 +f 2216/1910 2217/1911 2218/575 +f 2216/1910 2218/575 2219/556 +f 2220/1912 2221/1913 2222/560 +f 2220/1912 2222/560 2223/559 +f 2221/1913 2224/1914 2225/562 +f 2221/1913 2225/562 2222/560 +f 2224/1914 2226/1915 2227/564 +f 2224/1914 2227/564 2225/562 +f 2226/1915 2228/1916 2229/566 +f 2226/1915 2229/566 2227/564 +f 2228/1916 2216/1910 2219/556 +f 2228/1916 2219/556 2229/566 +f 2230/1917 2231/1918 2232/1919 +f 2230/1917 2232/1919 2233/1920 +f 2234/1921 2230/1917 2233/1920 +f 2234/1921 2233/1920 2235/1922 +f 2236/1923 2234/1921 2235/1922 +f 2236/1923 2235/1922 2237/1924 +f 2238/1925 2236/1923 2237/1924 +f 2238/1925 2237/1924 2239/1926 +f 2240/1927 2241/1928 2242/1929 +f 2240/1927 2242/1929 2243/1930 +f 2231/1918 2240/1927 2243/1930 +f 2231/1918 2243/1930 2232/1919 +f 2244/554 3665/556 3623/575 +f 2233/1920 2232/1919 2251/1931 +f 2233/1920 2251/1931 2252/1932 +f 2235/1922 2233/1920 2252/1932 +f 2235/1922 2252/1932 2253/1933 +f 2237/1924 2235/1922 2253/1933 +f 2237/1924 2253/1933 2254/1934 +f 2239/1926 2237/1924 2254/1934 +f 2239/1926 2254/1934 2255/1935 +f 2256/1936 2257/1937 2258/1938 +f 2256/1936 2258/1938 2259/1939 +f 2242/1929 2256/1936 2259/1939 +f 2242/1929 2259/1939 2260/1940 +f 2243/1930 2242/1929 2260/1940 +f 2243/1930 2260/1940 2261/1941 +f 2232/1919 2243/1930 2261/1941 +f 2232/1919 2261/1941 2251/1931 +f 2268/1942 2269/573 2270/562 +f 2268/1942 2270/562 2271/1914 +f 2272/1943 2273/1944 2274/576 +f 2272/1943 2274/576 2275/1945 +f 2275/1945 2274/576 2276/575 +f 2275/1945 2276/575 2277/1911 +f 2277/1911 2276/575 2278/556 +f 2277/1911 2278/556 2279/1910 +f 2279/1910 2278/556 2280/566 +f 2279/1910 2280/566 2281/1916 +f 2281/1916 2280/566 2269/573 +f 2281/1916 2269/573 2268/1942 +f 2282/1946 2283/1930 2284/1919 +f 2282/1946 2284/1919 2285/1918 +f 2286/1928 2287/1947 2283/1930 +f 2286/1928 2283/1930 2282/1946 +f 2288/1948 2289/1936 2287/1947 +f 2288/1948 2287/1947 2286/1928 +f 2290/1949 2291/1950 2289/1936 +f 2290/1949 2289/1936 2288/1948 +f 2292/1923 2293/1924 2294/1926 +f 2292/1923 2294/1926 2295/1925 +f 2296/1921 2297/1922 2293/1924 +f 2296/1921 2293/1924 2292/1923 +f 2298/1917 2299/1920 2297/1922 +f 2298/1917 2297/1922 2296/1921 +f 2285/1918 2284/1919 2299/1920 +f 2285/1918 2299/1920 2298/1917 +f 2300/561 4624/562 4621/573 +f 2302/557 2303/560 4624/562 +f 2302/557 4624/562 2300/561 +f 2304/1951 2305/1952 2303/560 +f 2304/1951 2303/560 2302/557 +f 2306/577 4647/576 4668/1944 +f 2306/577 4668/1944 2307/1953 +f 2283/1930 2311/1941 2312/1931 +f 2283/1930 2312/1931 2284/1919 +f 2287/1947 2313/1940 2311/1941 +f 2287/1947 2311/1941 2283/1930 +f 2289/1936 2314/1939 2313/1940 +f 2289/1936 2313/1940 2287/1947 +f 2291/1950 2315/1954 2314/1939 +f 2291/1950 2314/1939 2289/1936 +f 2293/1924 2316/1934 2317/1935 +f 2293/1924 2317/1935 2294/1926 +f 2297/1922 2318/1933 2316/1934 +f 2297/1922 2316/1934 2293/1924 +f 2299/1920 2319/1932 2318/1933 +f 2299/1920 2318/1933 2297/1922 +f 2284/1919 2312/1931 2319/1932 +f 2284/1919 2319/1932 2299/1920 +f 2320/1955 4666/1954 4664/1950 +f 2320/1955 4664/1950 2321/1956 +f 2322/1957 4664/1950 4665/1949 +f 2322/1957 4665/1949 2323/1958 +f 2324/578 2328/1959 2329/1960 +f 2324/578 2329/1960 2325/579 +f 2336/1961 2337/1962 2338/1963 +f 2336/1961 2338/1963 2339/584 +f 2337/1962 2340/1964 2341/1965 +f 2337/1962 2341/1965 2338/1963 +f 2340/1964 2342/580 2343/579 +f 2340/1964 2343/579 2341/1965 +f 2344/1966 2345/1967 2346/588 +f 2344/1966 2346/588 2347/587 +f 2345/1967 2348/1968 2349/591 +f 2345/1967 2349/591 2346/588 +f 2348/1968 2350/1969 2351/592 +f 2348/1968 2351/592 2349/591 +f 2350/1969 2352/1970 2353/594 +f 2350/1969 2353/594 2351/592 +f 2352/1970 2336/1961 2339/584 +f 2352/1970 2339/584 2353/594 +f 2354/1971 2355/1972 2356/1973 +f 2354/1971 2356/1973 2357/1974 +f 2358/1975 2354/1971 2357/1974 +f 2358/1975 2357/1974 2359/1976 +f 2360/1977 2358/1975 2359/1976 +f 2360/1977 2359/1976 2361/1978 +f 2362/1979 2360/1977 2361/1978 +f 2362/1979 2361/1978 2363/1980 +f 2364/1981 2365/1982 2366/1983 +f 2364/1981 2366/1983 2367/1984 +f 2368/1985 2364/1981 2367/1984 +f 2368/1985 2367/1984 2369/1986 +f 2370/1987 2368/1985 2369/1986 +f 2370/1987 2369/1986 2371/1988 +f 2355/1972 2370/1987 2371/1988 +f 2355/1972 2371/1988 2356/1973 +f 2372/582 3667/584 3625/1963 +f 2374/1989 2372/582 3625/1963 +f 2374/1989 3625/1963 3582/1965 +f 2375/1960 2374/1989 3582/1965 +f 2375/1960 3582/1965 3579/579 +f 2378/589 3584/588 3626/591 +f 2357/1974 2356/1973 2381/1990 +f 2357/1974 2381/1990 2382/1991 +f 2359/1976 2357/1974 2382/1991 +f 2359/1976 2382/1991 2383/1992 +f 2361/1978 2359/1976 2383/1992 +f 2361/1978 2383/1992 2384/1993 +f 2363/1980 2361/1978 2384/1993 +f 2363/1980 2384/1993 2385/1994 +f 2367/1984 2366/1983 2386/1995 +f 2367/1984 2386/1995 2387/1996 +f 2369/1986 2367/1984 2387/1996 +f 2369/1986 2387/1996 2388/1997 +f 2371/1988 2369/1986 2388/1997 +f 2371/1988 2388/1997 2389/1998 +f 2356/1973 2371/1988 2389/1998 +f 2356/1973 2389/1998 2381/1990 +f 2394/599 2391/596 2395/600 +f 2396/1999 2397/2000 2398/2001 +f 2396/1999 2398/2001 2399/2002 +f 2404/2003 2405/2004 2406/2005 +f 2404/2003 2406/2005 2407/2006 +f 2406/2005 2405/2004 2410/2007 +f 2406/2005 2410/2007 2411/2008 +f 2398/2001 2397/2000 3713/2003 +f 2398/2001 3713/2003 3714/2006 +f 2399/2002 2398/2001 2412/2009 +f 2399/2002 2412/2009 2413/2010 +f 2398/2001 3714/2006 2414/2011 +f 2398/2001 2414/2011 2412/2009 +f 2407/2006 2406/2005 2415/2012 +f 2407/2006 2415/2012 3699/2011 +f 2406/2005 2411/2008 2416/2013 +f 2406/2005 2416/2013 2415/2012 +f 2397/2000 2396/1999 2417/2014 +f 2397/2000 2417/2014 2418/2015 +f 2410/2007 2405/2004 2419/2016 +f 2410/2007 2419/2016 2420/2017 +f 2405/2004 2404/2003 2421/2018 +f 2405/2004 2421/2018 2419/2016 +f 3713/2003 2397/2000 2418/2015 +f 3713/2003 2418/2015 3698/2018 +f 2422/1999 2423/2000 2424/2001 +f 2422/1999 2424/2001 2425/2002 +f 2428/2019 2429/2020 2430/2021 +f 2428/2019 2430/2021 2431/2022 +f 2434/2003 2435/2004 2436/2005 +f 2434/2003 2436/2005 2437/2006 +f 2436/2005 2435/2004 2440/2007 +f 2436/2005 2440/2007 2441/2008 +f 2430/2021 2429/2020 3660/2008 +f 2430/2021 3660/2008 3659/2007 +f 2424/2001 2423/2000 3661/2003 +f 2424/2001 3661/2003 3662/2006 +f 2425/2002 2424/2001 2442/2009 +f 2425/2002 2442/2009 2443/2010 +f 2429/2020 2428/2019 2444/2023 +f 2429/2020 2444/2023 2445/2024 +f 2424/2001 3662/2006 2446/2011 +f 2424/2001 2446/2011 2442/2009 +f 2437/2006 2436/2005 2447/2012 +f 2437/2006 2447/2012 3648/2011 +f 2436/2005 2441/2008 2448/2013 +f 2436/2005 2448/2013 2447/2012 +f 3660/2008 2429/2020 2445/2024 +f 3660/2008 2445/2024 3646/2013 +f 2423/2000 2422/1999 2449/2014 +f 2423/2000 2449/2014 2450/2015 +f 2431/2022 2430/2021 2451/2025 +f 2431/2022 2451/2025 2452/2026 +f 2430/2021 3659/2007 2453/2017 +f 2430/2021 2453/2017 2451/2025 +f 2440/2007 2435/2004 2454/2016 +f 2440/2007 2454/2016 3645/2017 +f 2435/2004 2434/2003 2455/2018 +f 2435/2004 2455/2018 2454/2016 +f 3661/2003 2423/2000 2450/2015 +f 3661/2003 2450/2015 3647/2018 +f 2456/2027 2457/2028 2458/2029 +f 2456/2027 2458/2029 2459/2030 +f 2460/2031 2456/2027 2459/2030 +f 2460/2031 2459/2030 2461/2032 +f 2462/2033 2463/2034 2458/2029 +f 2462/2033 2458/2029 2457/2028 +f 2460/2031 2461/2032 2464/2035 +f 2460/2031 2464/2035 2465/2036 +f 2466/1999 2467/2002 2468/2001 +f 2466/1999 2468/2001 2469/2000 +f 2474/2003 2475/2006 2476/2005 +f 2474/2003 2476/2005 2477/2004 +f 2471/602 256/33 254/32 +f 2476/2005 2480/2008 2481/2007 +f 2476/2005 2481/2007 2477/2004 +f 2468/2001 4615/2006 4614/2003 +f 2468/2001 4614/2003 2469/2000 +f 2467/2002 2482/2010 2483/2009 +f 2467/2002 2483/2009 2468/2001 +f 2468/2001 2483/2009 2484/2011 +f 2468/2001 2484/2011 4615/2006 +f 2475/2006 4617/2011 2485/2012 +f 2475/2006 2485/2012 2476/2005 +f 2476/2005 2485/2012 2486/2013 +f 2476/2005 2486/2013 2480/2008 +f 2469/2000 2487/2015 2488/2014 +f 2469/2000 2488/2014 2466/1999 +f 2481/2007 2489/2017 2490/2016 +f 2481/2007 2490/2016 2477/2004 +f 2477/2004 2490/2016 2491/2018 +f 2477/2004 2491/2018 2474/2003 +f 4614/2003 4616/2018 2487/2015 +f 4614/2003 2487/2015 2469/2000 +f 2492/2037 2493/2030 2494/2038 +f 2492/2037 2494/2038 2495/2039 +f 2496/2040 2497/2032 2493/2030 +f 2496/2040 2493/2030 2492/2037 +f 2498/2041 2495/2039 2494/2038 +f 2498/2041 2494/2038 2499/2042 +f 2496/2040 2500/2036 2501/2035 +f 2496/2040 2501/2035 2497/2032 +f 2514/620 2515/2043 2516/2044 +f 2514/620 2516/2044 2517/621 +f 2515/2043 2520/623 2521/626 +f 2515/2043 2521/626 2516/2044 +f 2526/2045 2527/2046 2528/2047 +f 2526/2045 2528/2047 2529/2048 +f 2529/2048 2528/2047 2530/2049 +f 2529/2048 2530/2049 2531/2050 +f 2531/2050 2530/2049 2532/2051 +f 2531/2050 2532/2051 2533/2052 +f 2534/2053 2535/2054 2536/2055 +f 2534/2053 2536/2055 2537/2056 +f 2535/2054 2538/2057 2539/2058 +f 2535/2054 2539/2058 2536/2055 +f 2538/2057 2540/2059 2541/2060 +f 2538/2057 2541/2060 2539/2058 +f 2542/2061 2543/2062 2544/2063 +f 2542/2061 2544/2063 2545/2064 +f 2546/2065 2547/2066 2548/2067 +f 2546/2065 2548/2067 2549/2068 +f 2543/2062 2550/2069 2551/2070 +f 2543/2062 2551/2070 2544/2063 +f 2552/2071 2546/2065 2549/2068 +f 2552/2071 2549/2068 2553/2072 +f 2550/2069 2554/2073 2555/2074 +f 2550/2069 2555/2074 2551/2070 +f 2556/2075 2552/2071 2553/2072 +f 2556/2075 2553/2072 2557/2076 +f 3720/632 3878/631 2562/634 +f 3720/632 2562/634 2563/633 +f 2566/2077 2567/2078 2568/2079 +f 2566/2077 2568/2079 2569/2080 +f 3878/631 4077/640 4075/639 +f 3878/631 4075/639 2562/634 +f 2568/2079 2567/2078 2577/2081 +f 2568/2079 2577/2081 2578/2082 +f 2592/620 2593/2043 2594/2044 +f 2592/620 2594/2044 2595/621 +f 2593/2043 2598/623 2599/626 +f 2593/2043 2599/626 2594/2044 +f 2604/2045 2605/2046 2606/2047 +f 2604/2045 2606/2047 2607/2048 +f 2607/2048 2606/2047 2608/2049 +f 2607/2048 2608/2049 2609/2050 +f 2609/2050 2608/2049 2610/2051 +f 2609/2050 2610/2051 2611/2052 +f 2612/2053 2613/2054 2614/2055 +f 2612/2053 2614/2055 2615/2083 +f 2613/2054 2616/2057 2617/2058 +f 2613/2054 2617/2058 2614/2055 +f 2616/2057 2618/2059 2619/2060 +f 2616/2057 2619/2060 2617/2058 +f 2620/2061 2621/2062 2622/2063 +f 2620/2061 2622/2063 2623/2064 +f 2624/2065 2625/2066 2626/2067 +f 2624/2065 2626/2067 2627/2068 +f 2621/2062 2628/2069 2629/2084 +f 2621/2062 2629/2084 2622/2063 +f 2630/2071 2624/2065 2627/2068 +f 2630/2071 2627/2068 2631/2085 +f 2628/2069 2632/2073 2633/2074 +f 2628/2069 2633/2074 2629/2084 +f 2634/2075 2630/2071 2631/2085 +f 2634/2075 2631/2085 2635/2076 +f 277/42 2640/618 2641/612 +f 279/42 2646/612 2647/618 +f 2648/620 2649/2043 2650/2044 +f 2648/620 2650/2044 2651/621 +f 2649/2043 2654/623 2655/626 +f 2649/2043 2655/626 2650/2044 +f 2660/2053 2661/2056 2662/2055 +f 2660/2053 2662/2055 2663/2054 +f 2663/2054 2662/2055 2664/2058 +f 2663/2054 2664/2058 2665/2057 +f 2665/2057 2664/2058 2666/2060 +f 2665/2057 2666/2060 2667/2059 +f 2668/2053 2669/2054 2670/2055 +f 2668/2053 2670/2055 2671/2056 +f 2669/2054 2672/2057 2673/2058 +f 2669/2054 2673/2058 2670/2055 +f 2672/2057 2674/2059 2675/2060 +f 2672/2057 2675/2060 2673/2058 +f 2676/2061 2677/2062 2678/2063 +f 2676/2061 2678/2063 2679/2064 +f 2680/2065 2681/2066 2682/2067 +f 2680/2065 2682/2067 2683/2068 +f 2677/2062 2684/2069 2685/2084 +f 2677/2062 2685/2084 2678/2063 +f 2686/2071 2680/2065 2683/2068 +f 2686/2071 2683/2068 2687/2085 +f 2684/2069 2688/2073 2689/2074 +f 2684/2069 2689/2074 2685/2084 +f 2690/2075 2686/2071 2687/2085 +f 2690/2075 2687/2085 2691/2076 +f 4507/632 4564/631 2696/634 +f 4507/632 2696/634 2697/633 +f 2700/2077 2701/2078 2702/2079 +f 2700/2077 2702/2079 2703/2080 +f 4564/631 4612/640 4610/639 +f 4564/631 4610/639 2696/634 +f 2702/2079 2701/2078 2711/2081 +f 2702/2079 2711/2081 2712/2082 +f 283/42 2718/618 2719/612 +f 285/42 2724/612 2725/618 +f 2726/620 2727/2043 2728/2044 +f 2726/620 2728/2044 2729/621 +f 2730/646 4589/620 4605/621 +f 2730/646 4605/621 2731/645 +f 2727/2043 2732/623 2733/626 +f 2727/2043 2733/626 2728/2044 +f 2738/2053 2739/2056 2740/2055 +f 2738/2053 2740/2055 2741/2054 +f 2741/2054 2740/2055 2742/2058 +f 2741/2054 2742/2058 2743/2057 +f 2743/2057 2742/2058 2744/2060 +f 2743/2057 2744/2060 2745/2059 +f 2746/2053 2747/2054 2748/2055 +f 2746/2053 2748/2055 2749/2056 +f 2747/2054 2750/2057 2751/2058 +f 2747/2054 2751/2058 2748/2055 +f 2750/2057 2752/2059 2753/2060 +f 2750/2057 2753/2060 2751/2058 +f 2754/2061 2755/2062 2756/2063 +f 2754/2061 2756/2063 2757/2064 +f 2758/2065 2759/2066 2760/2067 +f 2758/2065 2760/2067 2761/2068 +f 2755/2062 2762/2069 2763/2084 +f 2755/2062 2763/2084 2756/2063 +f 2764/2071 2758/2065 2761/2068 +f 2764/2071 2761/2068 2765/2085 +f 2762/2069 2766/2073 2767/2074 +f 2762/2069 2767/2074 2763/2084 +f 2768/2075 2764/2071 2765/2085 +f 2768/2075 2765/2085 2769/2076 +f 2770/2086 2771/2087 2772/2088 +f 2770/2086 2772/2088 2773/2089 +f 2771/2087 2774/2090 2775/2091 +f 2771/2087 2775/2091 2772/2088 +f 2774/2090 2776/2092 2777/2093 +f 2774/2090 2777/2093 2775/2091 +f 2776/2092 2778/2094 2779/2095 +f 2776/2092 2779/2095 2777/2093 +f 2778/2094 2780/2096 2781/2097 +f 2778/2094 2781/2097 2779/2095 +f 2782/2098 2783/2099 2784/2100 +f 2782/2098 2784/2100 2785/2101 +f 2783/2099 2786/2102 2787/2103 +f 2783/2099 2787/2103 2784/2100 +f 2786/2102 2788/2104 2789/2105 +f 2786/2102 2789/2105 2787/2103 +f 2788/2104 2790/2106 2791/2107 +f 2788/2104 2791/2107 2789/2105 +f 2790/2106 2770/2086 2773/2089 +f 2790/2106 2773/2089 2791/2107 +f 2787/2103 2789/2105 2792/2108 +f 2787/2103 2792/2108 2793/2109 +f 2784/2100 2787/2103 2793/2109 +f 2784/2100 2793/2109 2794/2110 +f 2785/2101 2784/2100 2794/2110 +f 2785/2101 2794/2110 2795/2111 +f 2779/2095 2781/2097 2796/2112 +f 2779/2095 2796/2112 2797/2113 +f 2777/2093 2779/2095 2797/2113 +f 2777/2093 2797/2113 2798/2114 +f 2775/2091 2777/2093 2798/2114 +f 2775/2091 2798/2114 2799/2115 +f 2772/2088 2775/2091 2799/2115 +f 2772/2088 2799/2115 2800/2116 +f 2773/2089 2772/2088 2800/2116 +f 2773/2089 2800/2116 2801/2117 +f 2791/2107 2773/2089 2801/2117 +f 2791/2107 2801/2117 2802/2118 +f 2789/2105 2791/2107 2802/2118 +f 2789/2105 2802/2118 2792/2108 +f 2807/2119 2808/2120 2809/2121 +f 2807/2119 2809/2121 2810/2122 +f 2808/2120 2811/2123 2812/2124 +f 2808/2120 2812/2124 2809/2121 +f 2811/2123 2813/2125 2814/2126 +f 2811/2123 2814/2126 2812/2124 +f 2813/2125 2815/2127 2816/2128 +f 2813/2125 2816/2128 2814/2126 +f 2815/2127 2817/2129 2818/2130 +f 2815/2127 2818/2130 2816/2128 +f 2819/2131 2820/2132 2821/2133 +f 2819/2131 2821/2133 2822/2134 +f 2820/2132 2823/2135 2824/2136 +f 2820/2132 2824/2136 2821/2133 +f 2823/2135 2825/2137 2826/2138 +f 2823/2135 2826/2138 2824/2136 +f 2825/2137 2827/2139 2828/2140 +f 2825/2137 2828/2140 2826/2138 +f 2827/2139 2807/2119 2810/2122 +f 2827/2139 2810/2122 2828/2140 +f 2824/2136 2826/2138 2829/2141 +f 2824/2136 2829/2141 2830/2142 +f 2821/2133 2824/2136 2830/2142 +f 2821/2133 2830/2142 2831/2143 +f 2822/2134 2821/2133 2831/2143 +f 2822/2134 2831/2143 2832/2144 +f 2816/2128 2818/2130 2833/2145 +f 2816/2128 2833/2145 2834/2146 +f 2814/2126 2816/2128 2834/2146 +f 2814/2126 2834/2146 2835/2147 +f 2812/2124 2814/2126 2835/2147 +f 2812/2124 2835/2147 2836/2148 +f 2809/2121 2812/2124 2836/2148 +f 2809/2121 2836/2148 2837/2149 +f 2810/2122 2809/2121 2837/2149 +f 2810/2122 2837/2149 2838/2150 +f 2828/2140 2810/2122 2838/2150 +f 2828/2140 2838/2150 2839/2151 +f 2826/2138 2828/2140 2839/2151 +f 2826/2138 2839/2151 2829/2141 +f 4499/654 2851/2152 4509/658 +f 4499/654 4509/658 4511/655 +f 2856/664 2858/655 2859/654 +f 2874/2153 2875/2154 2876/2155 +f 2874/2153 2876/2155 2877/2156 +f 2875/2154 2878/2157 2879/2158 +f 2875/2154 2879/2158 2876/2155 +f 2878/2157 2880/2159 2881/2160 +f 2878/2157 2881/2160 2879/2158 +f 2880/2159 2882/2161 2883/2162 +f 2880/2159 2883/2162 2881/2160 +f 2882/2161 2884/2163 2885/2164 +f 2882/2161 2885/2164 2883/2162 +f 2884/2163 2886/2165 2887/2166 +f 2884/2163 2887/2166 2885/2164 +f 2886/2165 2888/2167 2889/2168 +f 2886/2165 2889/2168 2887/2166 +f 2888/2167 2890/2169 2891/2170 +f 2888/2167 2891/2170 2889/2168 +f 2890/2169 2892/2171 2893/2172 +f 2890/2169 2893/2172 2891/2170 +f 2892/2171 2894/2173 2895/2174 +f 2892/2171 2895/2174 2893/2172 +f 2896/2175 2897/2176 2898/2177 +f 2896/2175 2898/2177 2899/2178 +f 2897/2176 2900/2179 2901/2180 +f 2897/2176 2901/2180 2898/2177 +f 2900/2179 2902/2181 2903/2182 +f 2900/2179 2903/2182 2901/2180 +f 2902/2181 2904/2183 2905/2184 +f 2902/2181 2905/2184 2903/2182 +f 2904/2183 2906/2185 2907/2186 +f 2904/2183 2907/2186 2905/2184 +f 2906/2185 2908/2187 2909/2188 +f 2906/2185 2909/2188 2907/2186 +f 2908/2187 2910/2189 2911/2190 +f 2908/2187 2911/2190 2909/2188 +f 2910/2189 2912/2191 2913/2192 +f 2910/2189 2913/2192 2911/2190 +f 2912/2191 2914/2193 2915/2194 +f 2912/2191 2915/2194 2913/2192 +f 2914/2193 2916/2195 2917/2196 +f 2914/2193 2917/2196 2915/2194 +f 4343/2178 4293/2177 2918/2197 +f 4343/2178 2918/2197 2919/2198 +f 4293/2177 4228/2180 2920/2199 +f 4293/2177 2920/2199 2918/2197 +f 4228/2180 4195/2182 2921/2200 +f 4228/2180 2921/2200 2920/2199 +f 4195/2182 4211/2184 2922/2201 +f 4195/2182 2922/2201 2921/2200 +f 4212/2184 4260/2186 2923/2202 +f 4212/2184 2923/2202 4207/2201 +f 4260/2186 4335/2188 2924/2203 +f 4260/2186 2924/2203 2923/2202 +f 4335/2188 4370/2190 2925/2204 +f 4335/2188 2925/2204 2924/2203 +f 4370/2190 4393/2192 2926/2205 +f 4370/2190 2926/2205 2925/2204 +f 4393/2192 4384/2194 2927/2206 +f 4393/2192 2927/2206 2926/2205 +f 4384/2194 4344/2196 2928/2207 +f 4384/2194 2928/2207 2927/2206 +f 2929/2208 2930/2209 4413/2191 +f 2929/2208 4413/2191 4389/2189 +f 2931/2210 2929/2208 4389/2189 +f 2931/2210 4389/2189 4336/2187 +f 2932/2211 2931/2210 4336/2187 +f 2932/2211 4336/2187 4256/2185 +f 2933/2212 2932/2211 4256/2185 +f 2933/2212 4256/2185 4190/2183 +f 2934/2213 2933/2212 4190/2183 +f 2934/2213 4190/2183 4185/2181 +f 2935/2214 2934/2213 4185/2181 +f 2935/2214 4185/2181 4205/2179 +f 2936/2215 2935/2214 4205/2179 +f 2936/2215 4205/2179 4283/2176 +f 2937/2216 2936/2215 4283/2176 +f 2937/2216 4283/2176 4364/2175 +f 2938/2217 2939/2218 4365/2195 +f 2938/2217 4365/2195 4405/2193 +f 2930/2209 2938/2217 4405/2193 +f 2930/2209 4405/2193 4413/2191 +f 2889/2168 2891/2170 2930/2209 +f 2889/2168 2930/2209 2929/2208 +f 2887/2166 2889/2168 2929/2208 +f 2887/2166 2929/2208 2931/2210 +f 2885/2164 2887/2166 2931/2210 +f 2885/2164 2931/2210 2932/2211 +f 2883/2162 2885/2164 2932/2211 +f 2883/2162 2932/2211 2933/2212 +f 2881/2160 2883/2162 2933/2212 +f 2881/2160 2933/2212 2934/2213 +f 2879/2158 2881/2160 2934/2213 +f 2879/2158 2934/2213 2935/2214 +f 2876/2155 2879/2158 2935/2214 +f 2876/2155 2935/2214 2936/2215 +f 2877/2156 2876/2155 2936/2215 +f 2877/2156 2936/2215 2937/2216 +f 2893/2172 2895/2174 2939/2218 +f 2893/2172 2939/2218 2938/2217 +f 2891/2170 2893/2172 2938/2217 +f 2891/2170 2938/2217 2930/2209 +f 2940/2219 2941/2220 2942/2221 +f 2940/2219 2942/2221 2943/2222 +f 2948/2223 2949/2224 2950/2225 +f 2948/2223 2950/2225 2951/2226 +f 4391/2220 2952/2227 2953/2228 +f 4391/2220 2953/2228 4392/2221 +f 2954/2229 2955/2230 2956/2231 +f 2954/2229 2956/2231 2957/2232 +f 2943/2222 2942/2221 2958/2233 +f 2943/2222 2958/2233 2959/2234 +f 4392/2221 2953/2228 2960/2235 +f 4392/2221 2960/2235 4396/2233 +f 2949/2224 2948/2223 2961/2236 +f 2949/2224 2961/2236 2962/2237 +f 2957/2232 2956/2231 2963/2238 +f 2957/2232 2963/2238 2964/2239 +f 4514/2223 2957/2232 2964/2239 +f 4514/2223 2964/2239 4512/2236 +f 4513/2226 2954/2229 2957/2232 +f 4513/2226 2957/2232 4514/2223 +f 2953/2228 2952/2227 4442/2225 +f 2953/2228 4442/2225 4443/2224 +f 2960/2235 2953/2228 4443/2224 +f 2960/2235 4443/2224 4451/2237 +f 2967/686 2968/696 2969/684 +f 2967/686 2969/684 2970/687 +f 2971/682 4447/684 4441/696 +f 2973/685 2974/697 4501/686 +f 2972/683 2975/690 2976/693 +f 2972/683 2976/693 4447/684 +f 2970/687 2969/684 4454/693 +f 2970/687 4454/693 2977/689 +f 2977/689 4454/693 4455/692 +f 2977/689 4455/692 2981/695 +f 2983/686 2984/696 2985/684 +f 2983/686 2985/684 2986/687 +f 2987/682 2988/683 4252/684 +f 2987/682 4252/684 4089/696 +f 2989/685 2990/697 4090/686 +f 2989/685 4090/686 4254/687 +f 2986/687 2985/684 4367/693 +f 2986/687 4367/693 2993/689 +f 2994/688 2989/685 4254/687 +f 2991/690 2996/692 2992/693 +f 2993/689 4367/693 4444/692 +f 2993/689 4444/692 2997/695 +f 2999/2219 3000/2220 3001/2221 +f 2999/2219 3001/2221 3002/2222 +f 3007/2223 3008/2224 3009/2225 +f 3007/2223 3009/2225 3010/2226 +f 4113/2220 3011/2227 3012/2228 +f 4113/2220 3012/2228 4114/2221 +f 3013/2229 3014/2230 3015/2231 +f 3013/2229 3015/2231 3016/2232 +f 3002/2222 3001/2221 3017/2233 +f 3002/2222 3017/2233 3018/2234 +f 4114/2221 3012/2228 3019/2235 +f 4114/2221 3019/2235 4109/2233 +f 3008/2224 3007/2223 3020/2236 +f 3008/2224 3020/2236 3021/2237 +f 3016/2232 3015/2231 3022/2238 +f 3016/2232 3022/2238 3023/2239 +f 4066/2223 3016/2232 3023/2239 +f 4066/2223 3023/2239 4070/2236 +f 4065/2226 3013/2229 3016/2232 +f 4065/2226 3016/2232 4066/2223 +f 3012/2228 3011/2227 4129/2225 +f 3012/2228 4129/2225 4130/2224 +f 3019/2235 3012/2228 4130/2224 +f 3019/2235 4130/2224 4122/2237 +f 3026/686 3027/696 3028/684 +f 3026/686 3028/684 3029/687 +f 3032/685 3033/697 4057/686 +f 3029/687 3028/684 4094/693 +f 3029/687 4094/693 3036/689 +f 3034/690 3038/691 3039/692 +f 3034/690 3039/692 3035/693 +f 3036/689 4094/693 4093/692 +f 3036/689 4093/692 3040/695 +f 3041/694 3037/688 4056/689 +f 3041/694 4056/689 4055/695 +f 3042/2219 3043/2220 3044/2221 +f 3042/2219 3044/2221 3045/2222 +f 3050/2223 3051/2224 3052/2225 +f 3050/2223 3052/2225 3053/2226 +f 4150/2220 3054/2227 3055/2228 +f 4150/2220 3055/2228 4151/2221 +f 3056/2229 3057/2230 3058/2231 +f 3056/2229 3058/2231 3059/2232 +f 3045/2222 3044/2221 3060/2233 +f 3045/2222 3060/2233 3061/2234 +f 4151/2221 3055/2228 3062/2235 +f 4151/2221 3062/2235 4145/2233 +f 3051/2224 3050/2223 3063/2236 +f 3051/2224 3063/2236 3064/2237 +f 3059/2232 3058/2231 3065/2238 +f 3059/2232 3065/2238 3066/2239 +f 4042/2223 3059/2232 3066/2239 +f 4042/2223 3066/2239 4049/2236 +f 4041/2226 3056/2229 3059/2232 +f 4041/2226 3059/2232 4042/2223 +f 3055/2228 3054/2227 4080/2225 +f 3055/2228 4080/2225 4081/2224 +f 3062/2235 3055/2228 4081/2224 +f 3062/2235 4081/2224 4082/2237 +f 3069/686 3070/696 3071/684 +f 3069/686 3071/684 3072/687 +f 3072/687 3071/684 4187/693 +f 3072/687 4187/693 3079/689 +f 3080/688 3075/685 4316/687 +f 3079/689 4187/693 4092/692 +f 3079/689 4092/692 3083/695 +f 3085/2219 3086/2220 3087/2221 +f 3085/2219 3087/2221 3088/2222 +f 3093/2223 3094/2224 3095/2225 +f 3093/2223 3095/2225 3096/2226 +f 4484/2220 3097/2227 3098/2228 +f 4484/2220 3098/2228 4485/2221 +f 3099/2229 3100/2230 3101/2231 +f 3099/2229 3101/2231 3102/2232 +f 3088/2222 3087/2221 3103/2233 +f 3088/2222 3103/2233 3104/2234 +f 4485/2221 3098/2228 3105/2235 +f 4485/2221 3105/2235 4487/2233 +f 3094/2224 3093/2223 3106/2236 +f 3094/2224 3106/2236 3107/2237 +f 3102/2232 3101/2231 3108/2238 +f 3102/2232 3108/2238 3109/2239 +f 4490/2223 3102/2232 3109/2239 +f 4490/2223 3109/2239 4488/2236 +f 4489/2226 3099/2229 3102/2232 +f 4489/2226 3102/2232 4490/2223 +f 3098/2228 3097/2227 4394/2225 +f 3098/2228 4394/2225 4395/2224 +f 3105/2235 3098/2228 4395/2224 +f 3105/2235 4395/2224 4400/2237 +f 3112/2240 3113/2241 3114/2242 +f 3112/2240 3114/2242 3115/2243 +f 3113/2241 3116/2244 3117/2245 +f 3113/2241 3117/2245 3114/2242 +f 3115/2243 3114/2242 3118/2246 +f 3115/2243 3118/2246 3119/2247 +f 3114/2242 3117/2245 3120/2248 +f 3114/2242 3120/2248 3118/2246 +f 3121/2249 3122/2250 3123/2251 +f 3121/2249 3123/2251 3124/2252 +f 3122/2250 3125/2253 3126/2254 +f 3122/2250 3126/2254 3123/2251 +f 3127/2255 3128/2256 3129/2257 +f 3127/2255 3129/2257 3130/2258 +f 3128/2256 3131/2259 3132/2260 +f 3128/2256 3132/2260 3129/2257 +f 3131/2259 3133/2261 3134/2262 +f 3131/2259 3134/2262 3132/2260 +f 3133/2261 3135/2263 3136/2264 +f 3133/2261 3136/2264 3134/2262 +f 3135/2263 3137/2265 3138/2266 +f 3135/2263 3138/2266 3136/2264 +f 3137/2265 3139/2267 3140/2268 +f 3137/2265 3140/2268 3138/2266 +f 3139/2267 3141/2269 3142/2270 +f 3139/2267 3142/2270 3140/2268 +f 3141/2269 3143/2271 3144/2272 +f 3141/2269 3144/2272 3142/2270 +f 3143/2271 3145/2273 3146/2274 +f 3143/2271 3146/2274 3144/2272 +f 3145/2273 3121/2249 3124/2252 +f 3145/2273 3124/2252 3146/2274 +f 3140/2268 3142/2270 3147/2275 +f 3140/2268 3147/2275 3148/2276 +f 3138/2266 3140/2268 3738/2276 +f 3138/2266 3738/2276 3149/2277 +f 3136/2264 3138/2266 3702/2277 +f 3136/2264 3702/2277 3150/2278 +f 3134/2262 3136/2264 3150/2278 +f 3134/2262 3150/2278 3151/2279 +f 3132/2260 3134/2262 3655/2279 +f 3132/2260 3655/2279 3152/2280 +f 3129/2257 3132/2260 3152/2280 +f 3129/2257 3152/2280 3153/2281 +f 3130/2258 3129/2257 3733/2281 +f 3130/2258 3733/2281 3154/2282 +f 3123/2251 3126/2254 3155/2283 +f 3123/2251 3155/2283 3156/2284 +f 3124/2252 3123/2251 3156/2284 +f 3124/2252 3156/2284 3157/2285 +f 3146/2274 3124/2252 3157/2285 +f 3146/2274 3157/2285 3158/2286 +f 3144/2272 3146/2274 3871/2286 +f 3144/2272 3871/2286 3159/2287 +f 3142/2270 3144/2272 3159/2287 +f 3142/2270 3159/2287 3147/2275 +f 3161/699 3170/2288 3171/708 +f 3774/710 3176/718 3177/713 +f 3182/2289 3183/2290 3184/2291 +f 3182/2289 3184/2291 3185/2292 +f 3186/2293 3187/2294 3188/2295 +f 3186/2293 3188/2295 3189/2296 +f 3190/709 3192/711 3193/712 +f 3953/715 3929/709 3775/712 +f 3200/2289 3201/2290 3202/2291 +f 3200/2289 3202/2291 3203/2292 +f 3204/2293 3205/2294 3206/2295 +f 3204/2293 3206/2295 3207/2296 +f 3208/2297 3209/2298 3210/2299 +f 3208/2297 3210/2299 3211/2300 +f 3976/2298 3212/2301 3213/2302 +f 3976/2298 3213/2302 3957/2299 +f 3994/2301 3214/2303 3215/2304 +f 3994/2301 3215/2304 3977/2302 +f 3992/2303 3216/2305 3217/2306 +f 3992/2303 3217/2306 3973/2304 +f 3969/2305 3218/2307 3219/2308 +f 3969/2305 3219/2308 3954/2306 +f 3220/2309 3949/2297 3941/2300 +f 3220/2309 3941/2300 3221/2310 +f 3222/719 3224/721 3225/2311 +f 3228/724 3230/726 3231/727 +f 3248/744 3249/757 3250/745 +f 3262/2312 3263/2313 3820/757 +f 3262/2312 3820/757 3817/744 +f 3264/2314 3265/2315 3770/746 +f 3264/2314 3770/746 3773/745 +f 3266/2316 3267/2317 3818/748 +f 3266/2316 3818/748 3804/747 +f 3268/2318 3269/2319 3761/750 +f 3268/2318 3761/750 3771/749 +f 3270/2320 3266/2316 3804/747 +f 3270/2320 3804/747 3792/751 +f 3269/2319 3271/2321 3745/752 +f 3269/2319 3745/752 3761/750 +f 3272/2322 3270/2320 3792/751 +f 3272/2322 3792/751 3794/753 +f 3271/2321 3273/2323 3747/754 +f 3271/2321 3747/754 3745/752 +f 3274/2324 3272/2322 3794/753 +f 3274/2324 3794/753 3806/755 +f 3273/2323 3275/2325 3763/756 +f 3273/2323 3763/756 3747/754 +f 3263/2313 3274/2324 3806/755 +f 3263/2313 3806/755 3820/757 +f 3275/2325 3264/2314 3773/745 +f 3275/2325 3773/745 3763/756 +f 3276/2326 3277/2327 3278/2328 +f 3276/2326 3278/2328 3279/2329 +f 3280/2330 3913/2326 3850/2329 +f 3280/2330 3850/2329 3281/2331 +f 3282/2332 3916/2330 3852/2331 +f 3282/2332 3852/2331 3283/2333 +f 3284/2334 3898/2332 3842/2333 +f 3284/2334 3842/2333 3285/2335 +f 3286/2336 3881/2334 3832/2335 +f 3286/2336 3832/2335 3287/2337 +f 3894/2327 3288/2338 3289/2339 +f 3894/2327 3289/2339 3839/2328 +f 3279/2329 3278/2328 3290/2340 +f 3279/2329 3290/2340 3291/2341 +f 3281/2331 3850/2329 3815/2341 +f 3281/2331 3815/2341 3292/2342 +f 3283/2333 3852/2331 3814/2342 +f 3283/2333 3814/2342 3293/2343 +f 3285/2335 3842/2333 3807/2343 +f 3285/2335 3807/2343 3294/2344 +f 3287/2337 3832/2335 3798/2344 +f 3287/2337 3798/2344 3295/2345 +f 3839/2328 3289/2339 3296/2346 +f 3839/2328 3296/2346 3808/2340 +f 3973/2304 3217/2306 3277/2327 +f 3973/2304 3277/2327 3276/2326 +f 3977/2302 3215/2304 3913/2326 +f 3977/2302 3913/2326 3280/2330 +f 3957/2299 3213/2302 3916/2330 +f 3957/2299 3916/2330 3282/2332 +f 3211/2300 3210/2299 3898/2332 +f 3211/2300 3898/2332 3284/2334 +f 3221/2310 3941/2300 3881/2334 +f 3221/2310 3881/2334 3286/2336 +f 3954/2306 3219/2308 3288/2338 +f 3954/2306 3288/2338 3894/2327 +f 3297/2347 3298/2348 3299/2349 +f 3297/2347 3299/2349 3300/2350 +f 3301/2351 3302/2352 3787/980 +f 3301/2351 3787/980 3781/979 +f 3303/2353 3304/2354 3302/2352 +f 3303/2353 3302/2352 3301/2351 +f 3305/2355 3306/2356 3298/2348 +f 3305/2355 3298/2348 3297/2347 +f 3904/54 3880/56 3304/2354 +f 3904/54 3304/2354 3303/2353 +f 3307/2357 3308/2358 3306/2356 +f 3307/2357 3306/2356 3305/2355 +f 3880/56 3307/2357 3305/2355 +f 3880/56 3305/2355 3304/2354 +f 3302/2352 3304/2354 3305/2355 +f 3302/2352 3305/2355 3297/2347 +f 3787/980 3302/2352 3297/2347 +f 3787/980 3297/2347 3300/2350 +f 3309/2347 3310/2350 3311/2349 +f 3309/2347 3311/2349 3312/2348 +f 3826/2351 3782/979 3313/980 +f 3826/2351 3313/980 3314/2352 +f 3854/2353 3826/2351 3314/2352 +f 3854/2353 3314/2352 3315/2354 +f 3316/2359 3309/2347 3312/2348 +f 3316/2359 3312/2348 3317/2356 +f 3905/54 3854/2353 3315/2354 +f 3905/54 3315/2354 3318/56 +f 3319/2357 3316/2359 3317/2356 +f 3319/2357 3317/2356 3320/2358 +f 3318/56 3315/2354 3316/2359 +f 3318/56 3316/2359 3319/2357 +f 3314/2352 3309/2347 3316/2359 +f 3314/2352 3316/2359 3315/2354 +f 3313/980 3310/2350 3309/2347 +f 3313/980 3309/2347 3314/2352 +f 3321/2360 3322/2361 3783/2350 +f 3321/2360 3783/2350 3769/2349 +f 3323/2362 3324/2363 3813/2358 +f 3323/2362 3813/2358 3845/2357 +f 314/55 3323/2362 3845/2357 +f 314/55 3845/2357 315/56 +f 3322/2361 310/978 312/980 +f 3322/2361 312/980 3783/2350 +f 3325/2364 3326/2365 3327/2366 +f 3325/2364 3327/2366 3328/2367 +f 3326/2365 3329/2368 3330/2369 +f 3326/2365 3330/2369 3327/2366 +f 3329/2368 3331/2370 3332/2371 +f 3329/2368 3332/2371 3330/2369 +f 3331/2370 3333/2372 3334/2373 +f 3331/2370 3334/2373 3332/2371 +f 3333/2372 3335/2374 3336/2375 +f 3333/2372 3336/2375 3334/2373 +f 3335/2374 3337/2376 3338/2377 +f 3335/2374 3338/2377 3336/2375 +f 3337/2376 3339/2378 3340/2379 +f 3337/2376 3340/2379 3338/2377 +f 3339/2378 3341/2380 3342/2381 +f 3339/2378 3342/2381 3340/2379 +f 3341/2380 3343/2382 3344/2383 +f 3341/2380 3344/2383 3342/2381 +f 3345/2384 3325/2364 3328/2367 +f 3345/2384 3328/2367 3346/2385 +f 3348/759 3356/767 3349/760 +f 3357/2386 3358/2387 3359/2388 +f 3357/2386 3359/2388 3360/2389 +f 3358/2387 3361/2390 3362/2391 +f 3358/2387 3362/2391 3359/2388 +f 3361/2390 3363/2392 3364/2393 +f 3361/2390 3364/2393 3362/2391 +f 3363/2392 3365/2394 3366/2395 +f 3363/2392 3366/2395 3364/2393 +f 3365/2394 3367/2396 3368/2397 +f 3365/2394 3368/2397 3366/2395 +f 3367/2396 3369/2398 3370/2399 +f 3367/2396 3370/2399 3368/2397 +f 3369/2398 3371/2400 3372/2401 +f 3369/2398 3372/2401 3370/2399 +f 3371/2400 3373/2402 3374/2403 +f 3371/2400 3374/2403 3372/2401 +f 3373/2402 3375/2404 3376/2405 +f 3373/2402 3376/2405 3374/2403 +f 3377/2406 3357/2386 3360/2389 +f 3377/2406 3360/2389 3378/2407 +f 3358/2387 3357/2386 3379/2408 +f 3358/2387 3379/2408 3380/2409 +f 3361/2390 3358/2387 3380/2409 +f 3361/2390 3380/2409 3381/2410 +f 3363/2392 3361/2390 3381/2410 +f 3363/2392 3381/2410 3382/2411 +f 3365/2394 3363/2392 3382/2411 +f 3365/2394 3382/2411 3383/2412 +f 3367/2396 3365/2394 3383/2412 +f 3367/2396 3383/2412 3384/2413 +f 3369/2398 3367/2396 3384/2413 +f 3369/2398 3384/2413 3385/2414 +f 3371/2400 3369/2398 3385/2414 +f 3371/2400 3385/2414 3386/2415 +f 3373/2402 3371/2400 3386/2415 +f 3373/2402 3386/2415 3387/2416 +f 3375/2404 3373/2402 3387/2416 +f 3375/2404 3387/2416 3388/2417 +f 3357/2386 3377/2406 3389/2418 +f 3357/2386 3389/2418 3379/2408 +f 3380/2409 3379/2408 3390/2419 +f 3380/2409 3390/2419 3391/2420 +f 3381/2410 3380/2409 3391/2420 +f 3381/2410 3391/2420 3392/2421 +f 3382/2411 3381/2410 3392/2421 +f 3382/2411 3392/2421 3393/2422 +f 3383/2412 3382/2411 3393/2422 +f 3383/2412 3393/2422 3394/2423 +f 3384/2413 3383/2412 3394/2423 +f 3384/2413 3394/2423 3395/2424 +f 3385/2414 3384/2413 3395/2424 +f 3385/2414 3395/2424 3396/2425 +f 3386/2415 3385/2414 3396/2425 +f 3386/2415 3396/2425 3397/2426 +f 3387/2416 3386/2415 3397/2426 +f 3387/2416 3397/2426 3398/2427 +f 3388/2417 3387/2416 3398/2427 +f 3388/2417 3398/2427 3399/2428 +f 3379/2408 3389/2418 3400/2429 +f 3379/2408 3400/2429 3390/2419 +f 4171/769 3405/2430 3406/2431 +f 4171/769 3406/2431 4165/770 +f 3407/2432 3408/772 3409/775 +f 3407/2432 3409/775 3410/2433 +f 4156/773 3413/2434 3414/2435 +f 4156/773 3414/2435 4131/774 +f 4161/2434 4166/768 4160/771 +f 4161/2434 4160/771 4146/2435 +f 3421/782 3422/787 3423/783 +f 3427/2364 3428/2367 3429/2366 +f 3427/2364 3429/2366 3430/2365 +f 3430/2365 3429/2366 3431/2369 +f 3430/2365 3431/2369 3432/2368 +f 3432/2368 3431/2369 3433/2371 +f 3432/2368 3433/2371 3434/2370 +f 3434/2370 3433/2371 3435/2373 +f 3434/2370 3435/2373 3436/2372 +f 3436/2372 3435/2373 3437/2375 +f 3436/2372 3437/2375 3438/2374 +f 3438/2374 3437/2375 3439/2377 +f 3438/2374 3439/2377 3440/2376 +f 3440/2376 3439/2377 3441/2379 +f 3440/2376 3441/2379 3442/2378 +f 3442/2378 3441/2379 3443/2381 +f 3442/2378 3443/2381 3444/2380 +f 3444/2380 3443/2381 3445/2383 +f 3444/2380 3445/2383 3446/2382 +f 3447/2384 3448/2385 3428/2367 +f 3447/2384 3428/2367 3427/2364 +f 3455/764 3456/765 3454/763 +f 3459/2386 3460/2389 3461/2388 +f 3459/2386 3461/2388 3462/2387 +f 3462/2387 3461/2388 3463/2391 +f 3462/2387 3463/2391 3464/2390 +f 3464/2390 3463/2391 3465/2393 +f 3464/2390 3465/2393 3466/2392 +f 3466/2392 3465/2393 3467/2395 +f 3466/2392 3467/2395 3468/2394 +f 3468/2394 3467/2395 3469/2397 +f 3468/2394 3469/2397 3470/2396 +f 3470/2396 3469/2397 3471/2399 +f 3470/2396 3471/2399 3472/2398 +f 3472/2398 3471/2399 3473/2401 +f 3472/2398 3473/2401 3474/2400 +f 3474/2400 3473/2401 3475/2403 +f 3474/2400 3475/2403 3476/2402 +f 3476/2402 3475/2403 3477/2405 +f 3476/2402 3477/2405 3478/2404 +f 3479/2406 3480/2407 3460/2389 +f 3479/2406 3460/2389 3459/2386 +f 3462/2387 3481/2409 3482/2408 +f 3462/2387 3482/2408 3459/2386 +f 3464/2390 3483/2410 3481/2409 +f 3464/2390 3481/2409 3462/2387 +f 3466/2392 3484/2411 3483/2410 +f 3466/2392 3483/2410 3464/2390 +f 3468/2394 3485/2412 3484/2411 +f 3468/2394 3484/2411 3466/2392 +f 3470/2396 3486/2413 3485/2412 +f 3470/2396 3485/2412 3468/2394 +f 3472/2398 3487/2414 3486/2413 +f 3472/2398 3486/2413 3470/2396 +f 3474/2400 3488/2415 3487/2414 +f 3474/2400 3487/2414 3472/2398 +f 3476/2402 3489/2416 3488/2415 +f 3476/2402 3488/2415 3474/2400 +f 3478/2404 3490/2417 3489/2416 +f 3478/2404 3489/2416 3476/2402 +f 3459/2386 3482/2408 3491/2418 +f 3459/2386 3491/2418 3479/2406 +f 3481/2409 3492/2420 3493/2419 +f 3481/2409 3493/2419 3482/2408 +f 3483/2410 3494/2421 3492/2420 +f 3483/2410 3492/2420 3481/2409 +f 3484/2411 3495/2422 3494/2421 +f 3484/2411 3494/2421 3483/2410 +f 3485/2412 3496/2423 3495/2422 +f 3485/2412 3495/2422 3484/2411 +f 3486/2413 3497/2424 3496/2423 +f 3486/2413 3496/2423 3485/2412 +f 3487/2414 3498/2425 3497/2424 +f 3487/2414 3497/2424 3486/2413 +f 3488/2415 3499/2426 3498/2425 +f 3488/2415 3498/2425 3487/2414 +f 3489/2416 3500/2427 3499/2426 +f 3489/2416 3499/2426 3488/2415 +f 3490/2417 3501/2428 3500/2427 +f 3490/2417 3500/2427 3489/2416 +f 3482/2408 3493/2419 3502/2429 +f 3482/2408 3502/2429 3491/2418 +f 4397/769 4399/770 3507/2431 +f 4397/769 3507/2431 3508/2430 +f 3509/2432 3510/2433 3511/775 +f 3509/2432 3511/775 3512/772 +f 4404/773 4417/774 3515/2435 +f 4404/773 3515/2435 3516/2434 +f 4401/2434 4407/2435 4402/771 +f 4401/2434 4402/771 4398/768 +f 3523/782 3524/784 3525/783 +f 3529/788 3530/791 3531/789 +f 3533/792 316/981 318/794 +f 3533/792 318/794 3534/793 +f 3540/792 320/794 319/981 +f 3541/788 3543/789 3544/790 +f 3545/792 322/981 324/794 +f 3545/792 324/794 3546/793 +f 3547/788 3548/790 3549/789 +f 3550/791 3549/789 3551/793 +f 3552/792 326/794 325/981 diff --git a/res/textures/viking_room.png b/res/textures/viking_room.png new file mode 100644 index 0000000000000000000000000000000000000000..6a879ea3e0a369e03b69fd8bfec917febaf9974e GIT binary patch literal 962052 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 z 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

?*F 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