diff --git a/.git_assets/1.png b/.git_assets/1.png
new file mode 100644
index 0000000..3684d0d
Binary files /dev/null and b/.git_assets/1.png differ
diff --git a/.git_assets/logo.svg b/.git_assets/logo.svg
new file mode 100644
index 0000000..30d7bcf
--- /dev/null
+++ b/.git_assets/logo.svg
@@ -0,0 +1,58 @@
+
+
+
+
diff --git a/.gitignore b/.gitignore
index b46334d..8fdf144 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,10 +1,17 @@
build/
-docs/
out/
-cmake-build-debug/
-cmake-build-release/
-.idea/
.vs/
-CMakeSettings.json
-imgui.ini
\ No newline at end of file
+# Build directories
+engine/build
+vmve/build
+
+# Project vendor files
+engine/vendor/
+vmve/vendor/
+
+imgui.ini
+
+# NOTE: Is produced because of a bug in Visual Studio and should be fixed
+# in the February 2023 patch.
+*/JSON
\ No newline at end of file
diff --git a/.gitmodules b/.gitmodules
deleted file mode 100644
index 46b02d3..0000000
--- a/.gitmodules
+++ /dev/null
@@ -1,12 +0,0 @@
-[submodule "vendor/glfw"]
- path = vendor/glfw
- url = https://github.com/glfw/glfw
-[submodule "vendor/glm"]
- path = vendor/glm
- url = https://github.com/g-truc/glm
-[submodule "vendor/vma"]
- path = vendor/vma
- url = https://github.com/GPUOpen-LibrariesAndSDKs/VulkanMemoryAllocator
-[submodule "vendor/assimp"]
- path = vendor/assimp
- url = https://github.com/assimp/assimp
diff --git a/CHANGELOG.md b/CHANGELOG.md
deleted file mode 100644
index 5ddad42..0000000
--- a/CHANGELOG.md
+++ /dev/null
@@ -1 +0,0 @@
-# Changelog
\ No newline at end of file
diff --git a/CMakeLists.txt b/CMakeLists.txt
deleted file mode 100644
index 6eb46e6..0000000
--- a/CMakeLists.txt
+++ /dev/null
@@ -1,84 +0,0 @@
-cmake_minimum_required(VERSION 3.23 FATAL_ERROR)
-project(my_engine
- VERSION 0.0.1
- DESCRIPTION "My custom rendering engine"
- LANGUAGES CXX)
-
-###############################
-# Compiler Options #
-###############################
-set(CMAKE_CXX_STANDARD 17)
-#set(CMAKE_EXE_LINKER_FLAGS "-static")
-
-###############################
-# 3rd Party Libraries #
-###############################
-
-find_package(Vulkan REQUIRED)
-
-set(GLFW_BUILD_DOCS OFF CACHE BOOL "" FORCE)
-set(GLFW_BUILD_TESTS OFF CACHE BOOL "" FORCE)
-set(GLFW_BUILD_EXAMPLES OFF CACHE BOOL "" FORCE)
-
-add_subdirectory(vendor/glfw)
-add_subdirectory(vendor/glm)
-add_subdirectory(vendor/vma)
-add_subdirectory(vendor/assimp)
-
-set(IMGUI_SRC
- vendor/imgui/imgui.cpp
- vendor/imgui/imgui_demo.cpp
- vendor/imgui/imgui_draw.cpp
- vendor/imgui/imgui_impl_glfw.cpp
- vendor/imgui/imgui_impl_vulkan.cpp
- vendor/imgui/imgui_tables.cpp
- vendor/imgui/imgui_widgets.cpp)
-
-add_executable(${PROJECT_NAME}
- ${IMGUI_SRC}
-
- # engine test file
- "sandbox/main.cpp"
-
- # engine source
- "src/window.cpp"
- "src/camera.cpp"
- "src/entity.cpp"
- "src/input.cpp"
-
- # engine rendering
- "src/renderer/renderer.cpp"
- "src/renderer/ui.cpp"
-
- # precompiled header
- # note: this is required to compile header only files such as STB
- # note: this will be removed in the future.
- "src/pch.cpp"
- "src/model.cpp"
- "src/renderer/texture.cpp"
- "src/vertex.cpp"
- "src/renderer/vertex_array.cpp"
- "src/renderer/buffer.cpp"
- "src/renderer/shader.cpp"
- "src/renderer/renderer_context.cpp")
-
-
-target_precompile_headers(${PROJECT_NAME} PRIVATE
- src/pch.hpp)
-
-target_include_directories(${PROJECT_NAME} PRIVATE
- vendor/stb
- vendor/imgui)
-
-target_link_directories(${PROJECT_NAME} PRIVATE
- ${Vulkan_INCLUDE_DIR}/../Lib)
-
-target_link_libraries(${PROJECT_NAME}
- PRIVATE
- glfw
- glm::glm
- Vulkan::Vulkan
- shaderc_shared
- VulkanMemoryAllocator
- assimp
- )
diff --git a/README.md b/README.md
index 6eb8a53..7020cb8 100644
--- a/README.md
+++ b/README.md
@@ -1,2 +1,17 @@
+![logo](.git_assets/logo.svg)
+
# Vulkan Model Viewer and Exporter
+![overview](.git_assets/1.png)
+
+## Features
+* Standalone application
+* Latest rendering API (Vulkan)
+* Deferred Rendering
+* User Interface
+* Supports multiple models
+* Wireframe
+* Console logging
+
+# Downloads
+All downloads can be found on the official [VMVE](https://zoulhadj.github.io/vmve_website/) website or in [releases](https://github.com/ZOulhadj/vmve/releases) section.
diff --git a/assets/fonts/Karla-Regular.ttf b/assets/fonts/Karla-Regular.ttf
deleted file mode 100644
index 81b3de6..0000000
Binary files a/assets/fonts/Karla-Regular.ttf and /dev/null differ
diff --git a/assets/model.obj b/assets/model.obj
deleted file mode 100644
index e5aefeb..0000000
--- a/assets/model.obj
+++ /dev/null
@@ -1,2977 +0,0 @@
-# Blender 3.3.1
-# www.blender.org
-mtllib bike.mtl
-o Suzanne
-v -0.437500 0.164062 -0.765625
-v 0.437500 0.164062 -0.765625
-v -0.500000 0.093750 -0.687500
-v 0.500000 0.093750 -0.687500
-v -0.546875 0.054688 -0.578125
-v 0.546875 0.054688 -0.578125
-v -0.351562 -0.023438 -0.617188
-v 0.351562 -0.023438 -0.617188
-v -0.351562 0.031250 -0.718750
-v 0.351562 0.031250 -0.718750
-v -0.351562 0.132812 -0.781250
-v 0.351562 0.132812 -0.781250
-v -0.273438 0.164062 -0.796875
-v 0.273438 0.164062 -0.796875
-v -0.203125 0.093750 -0.742188
-v 0.203125 0.093750 -0.742188
-v -0.156250 0.054688 -0.648438
-v 0.156250 0.054688 -0.648438
-v -0.078125 0.242188 -0.656250
-v 0.078125 0.242188 -0.656250
-v -0.140625 0.242188 -0.742188
-v 0.140625 0.242188 -0.742188
-v -0.242188 0.242188 -0.796875
-v 0.242188 0.242188 -0.796875
-v -0.273438 0.328125 -0.796875
-v 0.273438 0.328125 -0.796875
-v -0.203125 0.390625 -0.742188
-v 0.203125 0.390625 -0.742188
-v -0.156250 0.437500 -0.648438
-v 0.156250 0.437500 -0.648438
-v -0.351562 0.515625 -0.617188
-v 0.351562 0.515625 -0.617188
-v -0.351562 0.453125 -0.718750
-v 0.351562 0.453125 -0.718750
-v -0.351562 0.359375 -0.781250
-v 0.351562 0.359375 -0.781250
-v -0.437500 0.328125 -0.765625
-v 0.437500 0.328125 -0.765625
-v -0.500000 0.390625 -0.687500
-v 0.500000 0.390625 -0.687500
-v -0.546875 0.437500 -0.578125
-v 0.546875 0.437500 -0.578125
-v -0.625000 0.242188 -0.562500
-v 0.625000 0.242188 -0.562500
-v -0.562500 0.242188 -0.671875
-v 0.562500 0.242188 -0.671875
-v -0.468750 0.242188 -0.757812
-v 0.468750 0.242188 -0.757812
-v -0.476562 0.242188 -0.773438
-v 0.476562 0.242188 -0.773438
-v -0.445312 0.335938 -0.781250
-v 0.445312 0.335938 -0.781250
-v -0.351562 0.375000 -0.804688
-v 0.351562 0.375000 -0.804688
-v -0.265625 0.335938 -0.820312
-v 0.265625 0.335938 -0.820312
-v -0.226562 0.242188 -0.820312
-v 0.226562 0.242188 -0.820312
-v -0.265625 0.156250 -0.820312
-v 0.265625 0.156250 -0.820312
-v -0.351562 0.242188 -0.828125
-v 0.351562 0.242188 -0.828125
-v -0.351562 0.117188 -0.804688
-v 0.351562 0.117188 -0.804688
-v -0.445312 0.156250 -0.781250
-v 0.445312 0.156250 -0.781250
-v 0.000000 0.429688 -0.742188
-v 0.000000 0.351562 -0.820312
-v 0.000000 -0.679688 -0.734375
-v 0.000000 -0.320312 -0.781250
-v 0.000000 -0.187500 -0.796875
-v 0.000000 -0.773438 -0.718750
-v 0.000000 0.406250 -0.601562
-v 0.000000 0.570312 -0.570312
-v 0.000000 0.898438 0.546875
-v 0.000000 0.562500 0.851562
-v 0.000000 0.070312 0.828125
-v 0.000000 -0.382812 0.351562
-v -0.203125 -0.187500 -0.562500
-v 0.203125 -0.187500 -0.562500
-v -0.312500 -0.437500 -0.570312
-v 0.312500 -0.437500 -0.570312
-v -0.351562 -0.695312 -0.570312
-v 0.351562 -0.695312 -0.570312
-v -0.367188 -0.890625 -0.531250
-v 0.367188 -0.890625 -0.531250
-v -0.328125 -0.945312 -0.523438
-v 0.328125 -0.945312 -0.523438
-v -0.179688 -0.968750 -0.554688
-v 0.179688 -0.968750 -0.554688
-v 0.000000 -0.984375 -0.578125
-v -0.437500 -0.140625 -0.531250
-v 0.437500 -0.140625 -0.531250
-v -0.632812 -0.039062 -0.539062
-v 0.632812 -0.039062 -0.539062
-v -0.828125 0.148438 -0.445312
-v 0.828125 0.148438 -0.445312
-v -0.859375 0.429688 -0.593750
-v 0.859375 0.429688 -0.593750
-v -0.710938 0.484375 -0.625000
-v 0.710938 0.484375 -0.625000
-v -0.492188 0.601562 -0.687500
-v 0.492188 0.601562 -0.687500
-v -0.320312 0.757812 -0.734375
-v 0.320312 0.757812 -0.734375
-v -0.156250 0.718750 -0.757812
-v 0.156250 0.718750 -0.757812
-v -0.062500 0.492188 -0.750000
-v 0.062500 0.492188 -0.750000
-v -0.164062 0.414062 -0.773438
-v 0.164062 0.414062 -0.773438
-v -0.125000 0.304688 -0.765625
-v 0.125000 0.304688 -0.765625
-v -0.203125 0.093750 -0.742188
-v 0.203125 0.093750 -0.742188
-v -0.375000 0.015625 -0.703125
-v 0.375000 0.015625 -0.703125
-v -0.492188 0.062500 -0.671875
-v 0.492188 0.062500 -0.671875
-v -0.625000 0.187500 -0.648438
-v 0.625000 0.187500 -0.648438
-v -0.640625 0.296875 -0.648438
-v 0.640625 0.296875 -0.648438
-v -0.601562 0.375000 -0.664062
-v 0.601562 0.375000 -0.664062
-v -0.429688 0.437500 -0.718750
-v 0.429688 0.437500 -0.718750
-v -0.250000 0.468750 -0.757812
-v 0.250000 0.468750 -0.757812
-v 0.000000 -0.765625 -0.734375
-v -0.109375 -0.718750 -0.734375
-v 0.109375 -0.718750 -0.734375
-v -0.117188 -0.835938 -0.710938
-v 0.117188 -0.835938 -0.710938
-v -0.062500 -0.882812 -0.695312
-v 0.062500 -0.882812 -0.695312
-v 0.000000 -0.890625 -0.687500
-v 0.000000 -0.195312 -0.750000
-v 0.000000 -0.140625 -0.742188
-v -0.101562 -0.148438 -0.742188
-v 0.101562 -0.148438 -0.742188
-v -0.125000 -0.226562 -0.750000
-v 0.125000 -0.226562 -0.750000
-v -0.085938 -0.289062 -0.742188
-v 0.085938 -0.289062 -0.742188
-v -0.398438 -0.046875 -0.671875
-v 0.398438 -0.046875 -0.671875
-v -0.617188 0.054688 -0.625000
-v 0.617188 0.054688 -0.625000
-v -0.726562 0.203125 -0.601562
-v 0.726562 0.203125 -0.601562
-v -0.742188 0.375000 -0.656250
-v 0.742188 0.375000 -0.656250
-v -0.687500 0.414062 -0.726562
-v 0.687500 0.414062 -0.726562
-v -0.437500 0.546875 -0.796875
-v 0.437500 0.546875 -0.796875
-v -0.312500 0.640625 -0.835938
-v 0.312500 0.640625 -0.835938
-v -0.203125 0.617188 -0.851562
-v 0.203125 0.617188 -0.851562
-v -0.101562 0.429688 -0.843750
-v 0.101562 0.429688 -0.843750
-v -0.125000 -0.101562 -0.812500
-v 0.125000 -0.101562 -0.812500
-v -0.210938 -0.445312 -0.710938
-v 0.210938 -0.445312 -0.710938
-v -0.250000 -0.703125 -0.687500
-v 0.250000 -0.703125 -0.687500
-v -0.265625 -0.820312 -0.664062
-v 0.265625 -0.820312 -0.664062
-v -0.234375 -0.914062 -0.632812
-v 0.234375 -0.914062 -0.632812
-v -0.164062 -0.929688 -0.632812
-v 0.164062 -0.929688 -0.632812
-v 0.000000 -0.945312 -0.640625
-v 0.000000 0.046875 -0.726562
-v 0.000000 0.210938 -0.765625
-v -0.328125 0.476562 -0.742188
-v 0.328125 0.476562 -0.742188
-v -0.164062 0.140625 -0.750000
-v 0.164062 0.140625 -0.750000
-v -0.132812 0.210938 -0.757812
-v 0.132812 0.210938 -0.757812
-v -0.117188 -0.687500 -0.734375
-v 0.117188 -0.687500 -0.734375
-v -0.078125 -0.445312 -0.750000
-v 0.078125 -0.445312 -0.750000
-v 0.000000 -0.445312 -0.750000
-v 0.000000 -0.328125 -0.742188
-v -0.093750 -0.273438 -0.781250
-v 0.093750 -0.273438 -0.781250
-v -0.132812 -0.226562 -0.796875
-v 0.132812 -0.226562 -0.796875
-v -0.109375 -0.132812 -0.781250
-v 0.109375 -0.132812 -0.781250
-v -0.039062 -0.125000 -0.781250
-v 0.039062 -0.125000 -0.781250
-v 0.000000 -0.203125 -0.828125
-v -0.046875 -0.148438 -0.812500
-v 0.046875 -0.148438 -0.812500
-v -0.093750 -0.156250 -0.812500
-v 0.093750 -0.156250 -0.812500
-v -0.109375 -0.226562 -0.828125
-v 0.109375 -0.226562 -0.828125
-v -0.078125 -0.250000 -0.804688
-v 0.078125 -0.250000 -0.804688
-v 0.000000 -0.289062 -0.804688
-v -0.257812 -0.312500 -0.554688
-v 0.257812 -0.312500 -0.554688
-v -0.164062 -0.242188 -0.710938
-v 0.164062 -0.242188 -0.710938
-v -0.179688 -0.312500 -0.710938
-v 0.179688 -0.312500 -0.710938
-v -0.234375 -0.250000 -0.554688
-v 0.234375 -0.250000 -0.554688
-v 0.000000 -0.875000 -0.687500
-v -0.046875 -0.867188 -0.687500
-v 0.046875 -0.867188 -0.687500
-v -0.093750 -0.820312 -0.710938
-v 0.093750 -0.820312 -0.710938
-v -0.093750 -0.742188 -0.726562
-v 0.093750 -0.742188 -0.726562
-v 0.000000 -0.781250 -0.656250
-v -0.093750 -0.750000 -0.664062
-v 0.093750 -0.750000 -0.664062
-v -0.093750 -0.812500 -0.640625
-v 0.093750 -0.812500 -0.640625
-v -0.046875 -0.851562 -0.632812
-v 0.046875 -0.851562 -0.632812
-v 0.000000 -0.859375 -0.632812
-v -0.171875 0.218750 -0.781250
-v 0.171875 0.218750 -0.781250
-v -0.187500 0.156250 -0.773438
-v 0.187500 0.156250 -0.773438
-v -0.335938 0.429688 -0.757812
-v 0.335938 0.429688 -0.757812
-v -0.273438 0.421875 -0.773438
-v 0.273438 0.421875 -0.773438
-v -0.421875 0.398438 -0.773438
-v 0.421875 0.398438 -0.773438
-v -0.562500 0.351562 -0.695312
-v 0.562500 0.351562 -0.695312
-v -0.585938 0.289062 -0.687500
-v 0.585938 0.289062 -0.687500
-v -0.578125 0.195312 -0.679688
-v 0.578125 0.195312 -0.679688
-v -0.476562 0.101562 -0.718750
-v 0.476562 0.101562 -0.718750
-v -0.375000 0.062500 -0.742188
-v 0.375000 0.062500 -0.742188
-v -0.226562 0.109375 -0.781250
-v 0.226562 0.109375 -0.781250
-v -0.179688 0.296875 -0.781250
-v 0.179688 0.296875 -0.781250
-v -0.210938 0.375000 -0.781250
-v 0.210938 0.375000 -0.781250
-v -0.234375 0.359375 -0.757812
-v 0.234375 0.359375 -0.757812
-v -0.195312 0.296875 -0.757812
-v 0.195312 0.296875 -0.757812
-v -0.242188 0.125000 -0.757812
-v 0.242188 0.125000 -0.757812
-v -0.375000 0.085938 -0.726562
-v 0.375000 0.085938 -0.726562
-v -0.460938 0.117188 -0.703125
-v 0.460938 0.117188 -0.703125
-v -0.546875 0.210938 -0.671875
-v 0.546875 0.210938 -0.671875
-v -0.554688 0.281250 -0.671875
-v 0.554688 0.281250 -0.671875
-v -0.531250 0.335938 -0.679688
-v 0.531250 0.335938 -0.679688
-v -0.414062 0.390625 -0.750000
-v 0.414062 0.390625 -0.750000
-v -0.281250 0.398438 -0.765625
-v 0.281250 0.398438 -0.765625
-v -0.335938 0.406250 -0.750000
-v 0.335938 0.406250 -0.750000
-v -0.203125 0.171875 -0.750000
-v 0.203125 0.171875 -0.750000
-v -0.195312 0.226562 -0.750000
-v 0.195312 0.226562 -0.750000
-v -0.109375 0.460938 -0.609375
-v 0.109375 0.460938 -0.609375
-v -0.195312 0.664062 -0.617188
-v 0.195312 0.664062 -0.617188
-v -0.335938 0.687500 -0.593750
-v 0.335938 0.687500 -0.593750
-v -0.484375 0.554688 -0.554688
-v 0.484375 0.554688 -0.554688
-v -0.679688 0.453125 -0.492188
-v 0.679688 0.453125 -0.492188
-v -0.796875 0.406250 -0.460938
-v 0.796875 0.406250 -0.460938
-v -0.773438 0.164062 -0.375000
-v 0.773438 0.164062 -0.375000
-v -0.601562 0.000000 -0.414062
-v 0.601562 0.000000 -0.414062
-v -0.437500 -0.093750 -0.468750
-v 0.437500 -0.093750 -0.468750
-v 0.000000 0.898438 -0.289062
-v 0.000000 0.984375 0.078125
-v 0.000000 -0.195312 0.671875
-v 0.000000 -0.460938 -0.187500
-v 0.000000 -0.976562 -0.460938
-v 0.000000 -0.804688 -0.343750
-v 0.000000 -0.570312 -0.320312
-v 0.000000 -0.484375 -0.281250
-v -0.851562 0.234375 -0.054688
-v 0.851562 0.234375 -0.054688
-v -0.859375 0.320312 0.046875
-v 0.859375 0.320312 0.046875
-v -0.773438 0.265625 0.437500
-v 0.773438 0.265625 0.437500
-v -0.460938 0.437500 0.703125
-v 0.460938 0.437500 0.703125
-v -0.734375 -0.046875 -0.070312
-v 0.734375 -0.046875 -0.070312
-v -0.593750 -0.125000 0.164062
-v 0.593750 -0.125000 0.164062
-v -0.640625 -0.007812 0.429688
-v 0.640625 -0.007812 0.429688
-v -0.335938 0.054688 0.664062
-v 0.335938 0.054688 0.664062
-v -0.234375 -0.351562 -0.406250
-v 0.234375 -0.351562 -0.406250
-v -0.179688 -0.414062 -0.257812
-v 0.179688 -0.414062 -0.257812
-v -0.289062 -0.710938 -0.382812
-v 0.289062 -0.710938 -0.382812
-v -0.250000 -0.500000 -0.390625
-v 0.250000 -0.500000 -0.390625
-v -0.328125 -0.914062 -0.398438
-v 0.328125 -0.914062 -0.398438
-v -0.140625 -0.757812 -0.367188
-v 0.140625 -0.757812 -0.367188
-v -0.125000 -0.539062 -0.359375
-v 0.125000 -0.539062 -0.359375
-v -0.164062 -0.945312 -0.437500
-v 0.164062 -0.945312 -0.437500
-v -0.218750 -0.281250 -0.429688
-v 0.218750 -0.281250 -0.429688
-v -0.210938 -0.226562 -0.468750
-v 0.210938 -0.226562 -0.468750
-v -0.203125 -0.171875 -0.500000
-v 0.203125 -0.171875 -0.500000
-v -0.210938 -0.390625 -0.164062
-v 0.210938 -0.390625 -0.164062
-v -0.296875 -0.312500 0.265625
-v 0.296875 -0.312500 0.265625
-v -0.343750 -0.148438 0.539062
-v 0.343750 -0.148438 0.539062
-v -0.453125 0.867188 0.382812
-v 0.453125 0.867188 0.382812
-v -0.453125 0.929688 0.070312
-v 0.453125 0.929688 0.070312
-v -0.453125 0.851562 -0.234375
-v 0.453125 0.851562 -0.234375
-v -0.460938 0.523438 -0.429688
-v 0.460938 0.523438 -0.429688
-v -0.726562 0.406250 -0.335938
-v 0.726562 0.406250 -0.335938
-v -0.632812 0.453125 -0.281250
-v 0.632812 0.453125 -0.281250
-v -0.640625 0.703125 -0.054688
-v 0.640625 0.703125 -0.054688
-v -0.796875 0.562500 -0.125000
-v 0.796875 0.562500 -0.125000
-v -0.796875 0.617188 0.117188
-v 0.796875 0.617188 0.117188
-v -0.640625 0.750000 0.195312
-v 0.640625 0.750000 0.195312
-v -0.640625 0.679688 0.445312
-v 0.640625 0.679688 0.445312
-v -0.796875 0.539062 0.359375
-v 0.796875 0.539062 0.359375
-v -0.617188 0.328125 0.585938
-v 0.617188 0.328125 0.585938
-v -0.484375 0.023438 0.546875
-v 0.484375 0.023438 0.546875
-v -0.820312 0.328125 0.203125
-v 0.820312 0.328125 0.203125
-v -0.406250 -0.171875 -0.148438
-v 0.406250 -0.171875 -0.148438
-v -0.429688 -0.195312 0.210938
-v 0.429688 -0.195312 0.210938
-v -0.890625 0.406250 0.234375
-v 0.890625 0.406250 0.234375
-v -0.773438 -0.140625 0.125000
-v 0.773438 -0.140625 0.125000
-v -1.039062 -0.101562 0.328125
-v 1.039062 -0.101562 0.328125
-v -1.281250 0.054688 0.429688
-v 1.281250 0.054688 0.429688
-v -1.351562 0.320312 0.421875
-v 1.351562 0.320312 0.421875
-v -1.234375 0.507812 0.421875
-v 1.234375 0.507812 0.421875
-v -1.023438 0.476562 0.312500
-v 1.023438 0.476562 0.312500
-v -1.015625 0.414062 0.289062
-v 1.015625 0.414062 0.289062
-v -1.187500 0.437500 0.390625
-v 1.187500 0.437500 0.390625
-v -1.265625 0.289062 0.406250
-v 1.265625 0.289062 0.406250
-v -1.210938 0.078125 0.406250
-v 1.210938 0.078125 0.406250
-v -1.031250 -0.039062 0.304688
-v 1.031250 -0.039062 0.304688
-v -0.828125 -0.070312 0.132812
-v 0.828125 -0.070312 0.132812
-v -0.921875 0.359375 0.218750
-v 0.921875 0.359375 0.218750
-v -0.945312 0.304688 0.289062
-v 0.945312 0.304688 0.289062
-v -0.882812 -0.023438 0.210938
-v 0.882812 -0.023438 0.210938
-v -1.039062 0.000000 0.367188
-v 1.039062 0.000000 0.367188
-v -1.187500 0.093750 0.445312
-v 1.187500 0.093750 0.445312
-v -1.234375 0.250000 0.445312
-v 1.234375 0.250000 0.445312
-v -1.171875 0.359375 0.437500
-v 1.171875 0.359375 0.437500
-v -1.023438 0.343750 0.359375
-v 1.023438 0.343750 0.359375
-v -0.843750 0.289062 0.210938
-v 0.843750 0.289062 0.210938
-v -0.835938 0.171875 0.273438
-v 0.835938 0.171875 0.273438
-v -0.757812 0.093750 0.273438
-v 0.757812 0.093750 0.273438
-v -0.820312 0.085938 0.273438
-v 0.820312 0.085938 0.273438
-v -0.843750 0.015625 0.273438
-v 0.843750 0.015625 0.273438
-v -0.812500 -0.015625 0.273438
-v 0.812500 -0.015625 0.273438
-v -0.726562 0.000000 0.070312
-v 0.726562 0.000000 0.070312
-v -0.718750 -0.023438 0.171875
-v 0.718750 -0.023438 0.171875
-v -0.718750 0.039062 0.187500
-v 0.718750 0.039062 0.187500
-v -0.796875 0.203125 0.210938
-v 0.796875 0.203125 0.210938
-v -0.890625 0.242188 0.265625
-v 0.890625 0.242188 0.265625
-v -0.890625 0.234375 0.320312
-v 0.890625 0.234375 0.320312
-v -0.812500 -0.015625 0.320312
-v 0.812500 -0.015625 0.320312
-v -0.851562 0.015625 0.320312
-v 0.851562 0.015625 0.320312
-v -0.828125 0.078125 0.320312
-v 0.828125 0.078125 0.320312
-v -0.765625 0.093750 0.320312
-v 0.765625 0.093750 0.320312
-v -0.843750 0.171875 0.320312
-v 0.843750 0.171875 0.320312
-v -1.039062 0.328125 0.414062
-v 1.039062 0.328125 0.414062
-v -1.187500 0.343750 0.484375
-v 1.187500 0.343750 0.484375
-v -1.257812 0.242188 0.492188
-v 1.257812 0.242188 0.492188
-v -1.210938 0.085938 0.484375
-v 1.210938 0.085938 0.484375
-v -1.046875 0.000000 0.421875
-v 1.046875 0.000000 0.421875
-v -0.882812 -0.015625 0.265625
-v 0.882812 -0.015625 0.265625
-v -0.953125 0.289062 0.343750
-v 0.953125 0.289062 0.343750
-v -0.890625 0.109375 0.328125
-v 0.890625 0.109375 0.328125
-v -0.937500 0.062500 0.335938
-v 0.937500 0.062500 0.335938
-v -1.000000 0.125000 0.367188
-v 1.000000 0.125000 0.367188
-v -0.960938 0.171875 0.351562
-v 0.960938 0.171875 0.351562
-v -1.015625 0.234375 0.375000
-v 1.015625 0.234375 0.375000
-v -1.054688 0.187500 0.382812
-v 1.054688 0.187500 0.382812
-v -1.109375 0.210938 0.390625
-v 1.109375 0.210938 0.390625
-v -1.085938 0.273438 0.390625
-v 1.085938 0.273438 0.390625
-v -1.023438 0.437500 0.484375
-v 1.023438 0.437500 0.484375
-v -1.250000 0.468750 0.546875
-v 1.250000 0.468750 0.546875
-v -1.367188 0.296875 0.500000
-v 1.367188 0.296875 0.500000
-v -1.312500 0.054688 0.531250
-v 1.312500 0.054688 0.531250
-v -1.039062 -0.085938 0.492188
-v 1.039062 -0.085938 0.492188
-v -0.789062 -0.125000 0.328125
-v 0.789062 -0.125000 0.328125
-v -0.859375 0.382812 0.382812
-v 0.859375 0.382812 0.382812
-vn -0.6617 -0.2026 -0.7219
-vn 0.6617 -0.2026 -0.7219
-vn -0.8268 -0.3051 -0.4725
-vn 0.8268 -0.3051 -0.4725
-vn -0.4076 -0.7905 -0.4570
-vn 0.4076 -0.7905 -0.4570
-vn -0.3791 -0.5163 -0.7679
-vn 0.3791 -0.5163 -0.7679
-vn 0.0859 -0.5222 -0.8485
-vn -0.0859 -0.5222 -0.8485
-vn 0.2664 -0.8487 -0.4570
-vn -0.2664 -0.8487 -0.4570
-vn 0.7824 -0.3294 -0.5285
-vn -0.7606 -0.3400 -0.5531
-vn 0.4706 -0.1981 -0.8598
-vn -0.4706 -0.1981 -0.8598
-vn 0.4649 0.1958 -0.8634
-vn -0.4649 0.1958 -0.8634
-vn 0.7656 0.3223 -0.5568
-vn -0.7683 0.3293 -0.5488
-vn 0.2560 0.8073 -0.5317
-vn -0.2487 0.8249 -0.5076
-vn 0.0821 0.6023 -0.7940
-vn -0.1017 0.5518 -0.8277
-vn -0.3329 0.5231 -0.7846
-vn 0.3861 0.5446 -0.7445
-vn -0.4246 0.7711 -0.4745
-vn 0.4059 0.7641 -0.5014
-vn -0.8251 0.2968 -0.4808
-vn 0.8299 0.2940 -0.4742
-vn -0.6888 0.1868 -0.7005
-vn 0.6617 0.2026 -0.7219
-vn -0.8400 0.3436 0.4200
-vn 0.7816 0.3058 0.5437
-vn -0.2074 0.8296 0.5185
-vn 0.2037 0.8146 0.5431
-vn 0.4056 0.7605 0.5070
-vn -0.4381 0.7988 0.4123
-vn 0.8642 0.3143 0.3928
-vn -0.7861 0.3276 0.5241
-vn 0.7782 -0.3538 0.5188
-vn -0.7783 -0.3538 0.5188
-vn 0.4381 -0.7988 0.4123
-vn -0.4381 -0.7988 0.4123
-vn -0.2037 -0.8146 0.5431
-vn 0.2037 -0.8146 0.5431
-vn -0.7683 -0.3293 0.5488
-vn 0.7683 -0.3293 0.5488
-vn -0.4000 -0.0623 -0.9144
-vn 0.4000 -0.0623 -0.9144
-vn -0.3069 -0.1754 -0.9354
-vn 0.3069 -0.1754 -0.9354
-vn -0.0945 -0.1835 -0.9785
-vn 0.0945 -0.1835 -0.9785
-vn 0.0624 -0.0283 -0.9977
-vn -0.0624 -0.0283 -0.9977
-vn 0.0624 0.0260 -0.9977
-vn -0.0624 0.0260 -0.9977
-vn -0.0996 0.1729 -0.9799
-vn 0.0996 0.1729 -0.9799
-vn -0.3036 0.1656 -0.9383
-vn 0.3036 0.1656 -0.9383
-vn -0.4002 0.0572 -0.9147
-vn 0.4002 0.0572 -0.9147
-vn -0.1367 -0.8748 -0.4648
-vn 0.1054 -0.8433 -0.5270
-vn -0.2303 -0.8656 -0.4447
-vn 0.1916 -0.8620 -0.4693
-vn -0.5788 -0.5049 -0.6404
-vn 0.5788 -0.5049 -0.6404
-vn -0.7763 -0.0633 -0.6272
-vn 0.7763 -0.0633 -0.6272
-vn -0.7471 0.1132 -0.6550
-vn 0.7471 0.1132 -0.6550
-vn -0.3747 -0.8345 -0.4040
-vn 0.3747 -0.8345 -0.4040
-vn -0.3557 -0.7290 -0.5848
-vn 0.4177 -0.5751 -0.7034
-vn -0.6947 -0.4197 -0.5841
-vn 0.6947 -0.4197 -0.5841
-vn -0.7028 -0.3915 -0.5939
-vn 0.5537 -0.2978 -0.7777
-vn -0.3127 0.3425 -0.8860
-vn 0.8227 0.3606 -0.4395
-vn -0.5091 0.6482 -0.5663
-vn 0.5041 0.6448 -0.5745
-vn -0.5977 0.5565 -0.5771
-vn 0.5977 0.5565 -0.5771
-vn 0.0486 0.6560 -0.7532
-vn -0.0371 0.6685 -0.7428
-vn 0.7104 0.2715 -0.6494
-vn -0.7386 0.3768 -0.5590
-vn 0.6013 0.5262 -0.6013
-vn -0.5774 0.5774 -0.5774
-vn -0.5070 -0.6281 -0.5903
-vn 0.5364 -0.3230 -0.7797
-vn -0.2226 -0.4694 -0.8545
-vn 0.2226 -0.4694 -0.8545
-vn 0.0348 -0.5792 -0.8144
-vn -0.1073 -0.5010 -0.8588
-vn 0.0899 -0.7843 -0.6138
-vn -0.0770 -0.5759 -0.8139
-vn -0.0547 -0.1695 -0.9840
-vn 0.0279 -0.8645 -0.5019
-vn -0.4260 -0.0609 -0.9027
-vn 0.1687 -0.3128 -0.9347
-vn -0.3352 -0.1828 -0.9243
-vn 0.4350 -0.1812 -0.8820
-vn -0.3579 -0.3068 -0.8819
-vn 0.3223 -0.2762 -0.9054
-vn -0.3069 0.2113 -0.9280
-vn 0.4815 -0.2408 -0.8427
-vn 0.1598 0.3903 -0.9067
-vn -0.1598 0.3903 -0.9067
-vn -0.6819 -0.2915 -0.6709
-vn 0.1854 -0.4956 -0.8485
-vn -0.0585 -0.0781 -0.9952
-vn 0.0585 -0.0781 -0.9952
-vn 0.0066 -0.2316 -0.9728
-vn 0.0585 -0.0845 -0.9947
-vn -0.1008 -0.7103 -0.6966
-vn 0.1008 -0.7103 -0.6966
-vn -0.1322 -0.5947 -0.7930
-vn 0.1322 -0.5947 -0.7930
-vn -0.3128 -0.1662 -0.9352
-vn 0.3143 -0.3928 -0.8642
-vn -0.3288 -0.0360 -0.9437
-vn 0.3288 -0.0360 -0.9437
-vn -0.3233 -0.0808 -0.9429
-vn 0.3233 -0.0808 -0.9429
-vn 0.0232 0.0511 -0.9984
-vn -0.0000 0.0665 -0.9978
-vn 0.0043 -0.0651 -0.9979
-vn -0.0000 -0.0665 -0.9978
-vn -0.0000 -0.0000 -1.0000
-vn -0.8447 -0.5335 -0.0445
-vn 0.8447 -0.5335 -0.0445
-vn -0.9500 0.2692 0.1583
-vn 0.9500 0.2692 0.1583
-vn -0.0693 0.9004 0.4294
-vn 0.1018 0.9165 0.3870
-vn 1.0000 -0.0000 -0.0000
-vn -0.6905 0.5492 -0.4708
-vn -0.4071 -0.8956 -0.1791
-vn 0.4319 -0.8639 -0.2592
-vn -0.2873 -0.5747 -0.7663
-vn 0.2873 -0.5747 -0.7663
-vn 0.6326 0.5353 -0.5596
-vn -0.6326 0.5353 -0.5596
-vn -0.0862 0.7759 -0.6250
-vn 0.0862 0.7759 -0.6250
-vn -0.7532 0.2870 -0.5918
-vn 0.7639 0.2971 -0.5729
-vn -0.3416 -0.5409 -0.7686
-vn 0.3416 -0.5409 -0.7686
-vn -0.0502 0.2343 -0.9709
-vn 0.0375 0.2247 -0.9737
-vn 0.1304 -0.6087 -0.7826
-vn -0.1304 -0.6087 -0.7826
-vn 0.5059 0.0716 -0.8596
-vn -0.5059 0.0716 -0.8596
-vn 0.5774 -0.5774 -0.5774
-vn -0.5774 -0.5774 -0.5774
-vn -0.5460 -0.4310 -0.7184
-vn 0.3319 0.0738 -0.9404
-vn -0.3231 0.0311 -0.9459
-vn 0.2815 0.0662 -0.9573
-vn -0.7357 0.3910 -0.5531
-vn 0.8753 0.2059 -0.4376
-vn -0.8480 0.3180 -0.4240
-vn 0.8973 0.1994 -0.3938
-vn -0.8505 0.3798 -0.3638
-vn 0.8505 0.3798 -0.3638
-vn -0.1783 -0.4161 -0.8917
-vn 0.2524 -0.8655 -0.4327
-vn 0.1296 -0.1945 -0.9723
-vn -0.1296 -0.1945 -0.9723
-vn 0.4472 -0.0000 -0.8944
-vn -0.4472 -0.0000 -0.8944
-vn 0.1582 0.9494 -0.2713
-vn -0.1582 0.9494 -0.2713
-vn 0.6463 0.7337 -0.2096
-vn -0.6463 0.7337 -0.2096
-vn -1.0000 -0.0000 -0.0000
-vn -0.3051 -0.9450 -0.1181
-vn 0.3051 -0.9450 -0.1181
-vn -0.0217 -0.3031 -0.9527
-vn 0.0217 -0.3031 -0.9527
-vn -0.1353 -0.3479 -0.9277
-vn 0.1353 -0.3479 -0.9277
-vn 0.4681 -0.2239 -0.8548
-vn -0.4681 -0.2239 -0.8548
-vn 0.2710 0.0271 -0.9622
-vn -0.2710 0.0271 -0.9622
-vn 0.1717 -0.0090 -0.9851
-vn -0.2595 0.1038 -0.9601
-vn 0.4332 -0.4874 -0.7581
-vn -0.6684 -0.4595 -0.5849
-vn 0.1599 -0.8797 -0.4478
-vn -0.1599 -0.8797 -0.4478
-vn -0.3900 -0.5895 -0.7074
-vn 0.3900 -0.5895 -0.7074
-vn -0.6547 -0.4589 -0.6007
-vn 0.6547 -0.4589 -0.6007
-vn -0.5378 -0.1144 -0.8353
-vn 0.5378 -0.1144 -0.8353
-vn -0.5657 0.1197 -0.8159
-vn 0.5774 0.1155 -0.8083
-vn -0.4082 0.4082 -0.8165
-vn 0.5214 0.6574 -0.5441
-vn -0.1796 0.7882 -0.5886
-vn 0.1796 0.7882 -0.5886
-vn -0.1881 0.3387 -0.9219
-vn 0.1881 0.3387 -0.9219
-vn 0.0870 0.2756 -0.9573
-vn -0.0870 0.2756 -0.9573
-vn -0.2804 -0.2181 -0.9348
-vn 0.3553 -0.5739 -0.7379
-vn -0.3015 -0.3015 -0.9045
-vn 0.3015 -0.3015 -0.9045
-vn 0.3766 -0.8339 -0.4035
-vn -0.0631 -0.3156 -0.9468
-vn -0.0823 -0.7822 -0.6175
-vn -0.2016 -0.9071 -0.3696
-vn 0.3707 -0.2851 -0.8839
-vn -0.3707 -0.2851 -0.8839
-vn 0.2692 -0.0577 -0.9614
-vn -0.4568 0.0508 -0.8881
-vn 0.2797 0.5245 -0.8042
-vn -0.2797 0.5245 -0.8042
-vn 0.0213 0.5546 -0.8319
-vn -0.0487 0.6815 -0.7302
-vn -0.3778 0.6342 -0.6746
-vn 0.3378 0.5221 -0.7831
-vn -0.4988 0.5300 -0.6858
-vn 0.4988 0.5300 -0.6858
-vn -0.5425 -0.3391 -0.7686
-vn 0.5425 -0.3391 -0.7686
-vn -0.8305 -0.0615 -0.5536
-vn 0.8305 -0.0615 -0.5536
-vn -0.7814 0.1116 -0.6140
-vn 0.7814 0.1116 -0.6140
-vn 0.4338 0.8888 0.1481
-vn -0.4338 0.8888 0.1481
-vn 0.8515 0.3744 0.3670
-vn -0.8515 0.3744 0.3670
-vn 0.2664 0.8710 0.4127
-vn -0.2197 0.8626 0.4557
-vn -0.5932 0.7445 0.3063
-vn 0.5914 0.7489 0.2991
-vn -0.3714 0.8685 0.3284
-vn 0.3653 0.8833 0.2938
-vn -0.2901 0.9141 0.2833
-vn 0.2901 0.9141 0.2833
-vn -0.8873 0.1343 0.4412
-vn 0.7964 0.1323 0.5901
-vn -0.5108 -0.6649 0.5450
-vn 0.5108 -0.6649 0.5450
-vn -0.3695 -0.8566 0.3601
-vn 0.3695 -0.8566 0.3601
-vn -0.3617 -0.3858 0.8487
-vn 0.1649 -0.6644 0.7289
-vn -0.1952 -0.0976 0.9759
-vn 0.3011 -0.0125 0.9535
-vn 0.0107 -0.5633 0.8262
-vn 0.2562 -0.3112 0.9152
-vn -0.1533 -0.9649 0.2134
-vn 0.1533 -0.9649 0.2134
-vn -0.1260 -0.9624 0.2406
-vn 0.1260 -0.9624 0.2406
-vn -0.9396 0.1573 0.3041
-vn 0.9396 0.1573 0.3041
-vn -0.9278 0.1838 0.3246
-vn 0.9278 0.1838 0.3246
-vn -0.2192 0.0766 0.9727
-vn 0.2192 0.0766 0.9727
-vn -0.1211 -0.0530 0.9912
-vn -0.1497 -0.3635 0.9195
-vn -0.9094 0.1371 0.3927
-vn 0.3706 -0.6780 0.6349
-vn -0.9202 0.1355 0.3672
-vn 0.9202 0.1355 0.3672
-vn -0.9173 0.3440 0.2007
-vn 0.9457 0.2673 0.1850
-vn -0.9004 0.3642 0.2380
-vn 0.9337 0.2813 0.2215
-vn -0.8945 0.4337 -0.1084
-vn 0.9501 0.2455 0.1922
-vn -0.1596 -0.9577 0.2394
-vn 0.1835 -0.7864 0.5898
-vn -0.3693 -0.4712 0.8010
-vn 0.3727 -0.4759 0.7966
-vn -0.2986 -0.8236 0.4821
-vn 0.3263 -0.8342 0.4446
-vn -0.2995 -0.9442 0.1368
-vn 0.2995 -0.9442 0.1368
-vn -0.3287 -0.9163 0.2291
-vn 0.3287 -0.9163 0.2291
-vn -0.8305 0.3333 0.4463
-vn 0.8642 -0.4737 -0.1696
-vn -0.9166 -0.3740 -0.1414
-vn 0.9166 -0.3740 -0.1414
-vn -0.2950 -0.0454 0.9544
-vn 0.4189 -0.2265 0.8793
-vn -0.1272 0.9658 -0.2260
-vn 0.1119 0.9626 -0.2468
-vn -0.1320 0.9750 0.1788
-vn 0.1320 0.9750 0.1788
-vn -0.3878 0.6192 0.6828
-vn 0.3878 0.6192 0.6828
-vn -0.4951 0.8618 0.1100
-vn 0.4951 0.8618 0.1100
-vn -0.2561 0.6447 -0.7202
-vn 0.2561 0.6447 -0.7202
-vn -0.5966 0.7888 -0.1479
-vn 0.5966 0.7888 -0.1479
-vn -0.7125 0.6755 0.1900
-vn 0.7125 0.6755 0.1900
-vn -0.7104 0.1364 0.6904
-vn 0.6304 0.2517 0.7343
-vn -0.6823 0.2318 0.6933
-vn 0.6823 0.2318 0.6933
-vn -0.6574 0.7254 0.2040
-vn 0.6574 0.7254 0.2040
-vn -0.7289 0.6729 -0.1262
-vn 0.7289 0.6729 -0.1262
-vn -0.7791 0.4074 -0.4764
-vn 0.7791 0.4074 -0.4764
-vn -0.3669 0.8840 0.2898
-vn 0.3238 0.9434 0.0720
-vn -0.2854 0.6237 -0.7277
-vn 0.1548 0.5080 -0.8473
-vn 0.1681 0.1005 0.9806
-vn -0.1681 0.1005 0.9806
-vn -0.2925 0.5674 -0.7697
-vn 0.2925 0.5674 -0.7697
-vn 0.1616 0.1847 -0.9694
-vn -0.1616 0.1847 -0.9694
-vn -0.8681 0.0893 0.4883
-vn 0.9340 0.2255 -0.2773
-vn -0.9276 0.0762 -0.3657
-vn 0.9276 0.0762 -0.3657
-vn -0.9750 0.2169 -0.0490
-vn 0.9750 0.2169 -0.0490
-vn -0.9817 -0.0304 0.1882
-vn 0.9956 0.0893 0.0288
-vn -0.7466 -0.6646 -0.0285
-vn 0.6374 -0.7651 -0.0915
-vn -0.3723 -0.9243 -0.0847
-vn 0.3720 -0.9244 -0.0845
-vn -0.3986 -0.8754 -0.2734
-vn 0.3986 -0.8754 -0.2734
-vn -0.6328 -0.7642 -0.1247
-vn 0.6328 -0.7642 -0.1247
-vn -0.7325 -0.6368 -0.2407
-vn 0.7325 -0.6368 -0.2407
-vn -0.2637 -0.4499 -0.8533
-vn 0.2637 -0.4499 -0.8533
-vn -0.5881 -0.3070 0.7483
-vn 0.5236 -0.3290 0.7859
-vn -0.4694 -0.2400 0.8498
-vn 0.5396 -0.3343 0.7727
-vn -0.4463 -0.8452 0.2941
-vn 0.2144 -0.8341 0.5082
-vn -0.6973 -0.6610 0.2771
-vn 0.7365 -0.6154 0.2808
-vn -0.4972 -0.4408 0.7473
-vn 0.4972 -0.4408 0.7473
-vn -0.3691 0.2855 -0.8844
-vn 0.3244 0.4867 -0.8111
-vn -0.4467 0.0975 -0.8894
-vn 0.4467 0.0975 -0.8894
-vn -0.3188 0.1993 -0.9266
-vn 0.1817 -0.0079 -0.9833
-vn -0.2076 -0.0836 -0.9746
-vn 0.2925 -0.0758 -0.9533
-vn -0.3398 0.0824 -0.9369
-vn 0.5847 -0.2198 -0.7809
-vn -0.5957 -0.3850 -0.7049
-vn 0.5957 -0.3850 -0.7049
-vn -0.4843 0.5580 -0.6738
-vn 0.4843 0.5580 -0.6738
-vn 0.2675 0.8318 -0.4864
-vn -0.2675 0.8318 -0.4864
-vn 0.8576 0.2223 -0.4637
-vn -0.7885 0.2366 -0.5677
-vn 0.5257 -0.3579 -0.7717
-vn -0.5242 -0.3548 -0.7742
-vn -0.4663 -0.5991 -0.6509
-vn 0.4390 -0.5252 -0.7290
-vn -0.7104 -0.4567 -0.5356
-vn 0.7104 -0.4567 -0.5356
-vn -0.7507 -0.6131 0.2461
-vn 0.6302 -0.7658 -0.1282
-vn 0.1788 0.2923 -0.9395
-vn -0.2175 0.2733 -0.9370
-vn -0.9042 -0.3578 0.2332
-vn 0.9042 -0.3578 0.2332
-vn -0.0400 0.3399 -0.9396
-vn 0.0400 0.3399 -0.9396
-vn -0.2734 0.9064 -0.3221
-vn 0.2734 0.9064 -0.3221
-vn -0.4480 -0.4480 -0.7737
-vn 0.7177 0.1689 -0.6755
-vn -0.5534 -0.5534 -0.6225
-vn 0.9008 -0.4075 -0.1501
-vn -0.5724 -0.3122 -0.7582
-vn 0.5815 -0.5217 -0.6243
-vn -0.5597 -0.5533 -0.6169
-vn 0.6138 -0.2571 -0.7465
-vn -0.8271 0.5323 0.1802
-vn 0.8271 0.5323 0.1802
-vn -0.9227 -0.3765 0.0825
-vn 0.8717 -0.4446 0.2063
-vn -0.9972 -0.0181 0.0725
-vn 0.9972 -0.0181 0.0725
-vn -0.6895 -0.6644 -0.2883
-vn 0.6895 -0.6644 -0.2883
-vn -0.7815 -0.6176 -0.0882
-vn 0.7930 -0.5947 -0.1322
-vn -0.7022 -0.7022 -0.1170
-vn 0.7022 -0.7022 -0.1170
-vn -0.1240 0.9921 -0.0207
-vn 0.2408 0.9631 0.1204
-vn -0.9435 0.3145 -0.1048
-vn 0.9251 0.3469 -0.1542
-vn -0.6213 -0.7767 -0.1036
-vn 0.6213 -0.7767 -0.1036
-vn -0.0000 1.0000 -0.0000
-vn -0.6197 -0.6899 -0.3742
-vn 0.6197 -0.6899 -0.3742
-vn -0.2752 -0.8808 -0.3853
-vn 0.2752 -0.8808 -0.3853
-vn 0.7929 -0.5252 0.3089
-vn -0.7929 -0.5252 0.3089
-vn 0.8096 0.2429 0.5343
-vn -0.8538 0.2328 0.4657
-vn 0.5621 0.8231 0.0803
-vn -0.5433 0.6985 0.4657
-vn 0.0071 0.9899 -0.1414
-vn -0.1096 0.9939 0.0157
-vn -0.1046 0.0392 -0.9937
-vn 0.1738 0.0097 -0.9847
-vn -0.2461 0.0852 -0.9655
-vn 0.4134 0.0413 -0.9096
-vn -0.3009 0.0926 -0.9491
-vn 0.3009 0.0926 -0.9491
-vn -0.2104 0.0124 -0.9775
-vn 0.1220 0.0458 -0.9915
-vn 0.0099 0.3867 -0.9221
-vn -0.0099 0.3867 -0.9221
-vn -0.3787 -0.0364 -0.9248
-vn 0.4244 -0.0320 -0.9049
-vn -0.2530 -0.1897 -0.9487
-vn 0.2570 0.0723 -0.9637
-vn 0.4870 0.6088 -0.6262
-vn -0.2981 0.7454 -0.5963
-vn -0.6693 0.1802 -0.7208
-vn 0.6693 0.1802 -0.7208
-vn -0.4388 -0.2008 -0.8759
-vn 0.4723 -0.1986 -0.8588
-vn -0.5786 -0.1334 -0.8046
-vn 0.2975 -0.4062 -0.8640
-vn -0.5002 0.2833 -0.8182
-vn 0.5002 0.2833 -0.8182
-vn -0.2980 0.5802 -0.7580
-vn 0.2980 0.5802 -0.7580
-vn -0.0929 -0.9912 0.0944
-vn 0.0929 -0.9912 0.0944
-vn -0.4688 -0.8715 -0.1442
-vn 0.4688 -0.8715 -0.1442
-vn -0.9309 -0.2541 -0.2624
-vn 0.9264 -0.2460 -0.2851
-vn -0.8465 0.5291 0.0595
-vn 0.8267 0.5627 0.0035
-vn 0.2511 0.9439 0.2145
-vn -0.2146 0.9243 0.3157
-vn 0.4841 0.8743 0.0361
-vn -0.4196 0.8851 0.2012
-vn 0.5256 -0.0030 0.8507
-vn -0.5470 -0.0144 0.8370
-vn 0.1466 0.0104 0.9891
-vn -0.1466 0.0104 0.9891
-vn -0.4046 0.0266 0.9141
-vn 0.4046 0.0266 0.9141
-vn 0.8073 0.5901 -0.0041
-vn -0.7330 0.6786 -0.0472
-vn -0.4200 -0.2291 0.8781
-vn 0.4200 -0.2291 0.8781
-vn 0.0687 -0.9943 0.0818
-vn -0.0687 -0.9943 0.0818
-vn -0.6713 -0.1971 -0.7145
-vn 0.6713 -0.1971 -0.7145
-vn -0.8326 -0.3017 -0.4646
-vn 0.8326 -0.3017 -0.4646
-vn -0.4258 -0.7967 -0.4290
-vn 0.4258 -0.7967 -0.4290
-vn -0.3265 -0.4954 -0.8050
-vn 0.3265 -0.4954 -0.8050
-vn 0.0649 -0.5714 -0.8181
-vn -0.0649 -0.5714 -0.8181
-vn 0.2738 -0.8315 -0.4834
-vn -0.2738 -0.8315 -0.4834
-vn 0.7606 -0.3400 -0.5531
-vn -0.7824 -0.3294 -0.5285
-vn 0.4658 -0.1863 -0.8651
-vn -0.4658 -0.1863 -0.8651
-vn 0.4983 0.1812 -0.8478
-vn -0.4983 0.1812 -0.8478
-vn 0.7683 0.3293 -0.5488
-vn -0.7656 0.3223 -0.5568
-vn 0.2487 0.8249 -0.5076
-vn -0.2560 0.8073 -0.5317
-vn 0.1017 0.5518 -0.8277
-vn -0.0821 0.6023 -0.7940
-vn -0.3861 0.5446 -0.7445
-vn 0.3329 0.5231 -0.7846
-vn -0.4059 0.7641 -0.5014
-vn 0.4246 0.7711 -0.4745
-vn -0.8299 0.2940 -0.4742
-vn 0.8251 0.2968 -0.4808
-vn -0.6617 0.2026 -0.7219
-vn 0.6888 0.1868 -0.7005
-vn -0.7816 0.3058 0.5437
-vn 0.8400 0.3436 0.4200
-vn -0.2037 0.8146 0.5431
-vn 0.2074 0.8296 0.5185
-vn 0.4381 0.7988 0.4123
-vn -0.4056 0.7605 0.5070
-vn 0.7861 0.3276 0.5241
-vn -0.8642 0.3143 0.3928
-vn 0.8519 -0.3408 0.3976
-vn -0.8519 -0.3408 0.3976
-vn 0.4056 -0.7605 0.5070
-vn -0.4056 -0.7605 0.5070
-vn -0.2074 -0.8296 0.5185
-vn 0.2074 -0.8296 0.5185
-vn -0.8297 -0.3734 0.4149
-vn 0.8297 -0.3734 0.4149
-vn -0.1054 -0.8433 -0.5270
-vn 0.1367 -0.8748 -0.4648
-vn -0.1916 -0.8620 -0.4693
-vn 0.2303 -0.8656 -0.4447
-vn -0.5959 -0.4256 -0.6810
-vn 0.5959 -0.4256 -0.6810
-vn -0.7563 -0.0299 -0.6535
-vn 0.7563 -0.0299 -0.6535
-vn -0.8069 0.0689 -0.5866
-vn 0.8069 0.0689 -0.5866
-vn -0.2334 -0.7779 -0.5834
-vn 0.2334 -0.7779 -0.5834
-vn -0.4177 -0.5751 -0.7034
-vn 0.3557 -0.7290 -0.5848
-vn -0.6872 -0.4191 -0.5934
-vn 0.6872 -0.4191 -0.5934
-vn -0.5537 -0.2978 -0.7777
-vn 0.7028 -0.3915 -0.5939
-vn -0.8227 0.3606 -0.4395
-vn 0.3127 0.3425 -0.8860
-vn -0.5041 0.6448 -0.5745
-vn 0.5091 0.6482 -0.5663
-vn -0.6155 0.4924 -0.6155
-vn 0.6155 0.4924 -0.6155
-vn 0.0371 0.6685 -0.7428
-vn -0.0486 0.6560 -0.7532
-vn 0.7386 0.3768 -0.5590
-vn -0.7104 0.2715 -0.6494
-vn 0.5774 0.5774 -0.5774
-vn -0.6013 0.5262 -0.6013
-vn -0.5364 -0.3230 -0.7797
-vn 0.5070 -0.6281 -0.5903
-vn -0.2181 -0.4685 -0.8561
-vn 0.2181 -0.4685 -0.8561
-vn 0.1073 -0.5010 -0.8588
-vn -0.0348 -0.5792 -0.8144
-vn 0.0770 -0.5759 -0.8139
-vn -0.0899 -0.7843 -0.6138
-vn -0.0279 -0.8645 -0.5019
-vn 0.0547 -0.1695 -0.9840
-vn -0.1687 -0.3128 -0.9347
-vn 0.4260 -0.0609 -0.9027
-vn -0.4350 -0.1812 -0.8820
-vn 0.3352 -0.1828 -0.9243
-vn -0.3223 -0.2762 -0.9054
-vn 0.3579 -0.3068 -0.8819
-vn -0.4815 -0.2408 -0.8427
-vn 0.3069 0.2113 -0.9280
-vn 0.0317 -0.1899 -0.9813
-vn -0.0317 -0.1899 -0.9813
-vn -0.1854 -0.4956 -0.8485
-vn 0.6819 -0.2915 -0.6709
-vn -0.2623 -0.3498 -0.8994
-vn 0.2623 -0.3498 -0.8994
-vn -0.0585 -0.0845 -0.9947
-vn -0.0066 -0.2316 -0.9728
-vn 0.0136 -0.6507 -0.7592
-vn -0.0136 -0.6507 -0.7592
-vn -0.2404 -0.5476 -0.8014
-vn 0.2404 -0.5476 -0.8014
-vn -0.3143 -0.3928 -0.8642
-vn 0.3128 -0.1662 -0.9352
-vn -0.2821 -0.0164 -0.9592
-vn 0.2821 -0.0164 -0.9592
-vn -0.3273 -0.1432 -0.9340
-vn 0.3273 -0.1432 -0.9340
-vn -0.0232 0.0511 -0.9984
-vn -0.0043 -0.0651 -0.9979
-vn -0.7826 -0.6087 0.1304
-vn 0.7826 -0.6087 0.1304
-vn -0.9448 0.1919 0.2657
-vn 0.9448 0.1919 0.2657
-vn -0.1018 0.9165 0.3870
-vn 0.0693 0.9004 0.4294
-vn 0.6905 0.5492 -0.4708
-vn -0.4319 -0.8639 -0.2592
-vn 0.4071 -0.8956 -0.1791
-vn 0.6667 0.6667 -0.3333
-vn -0.6667 0.6667 -0.3333
-vn -0.1348 0.8086 -0.5727
-vn 0.1348 0.8086 -0.5727
-vn -0.7639 0.2971 -0.5729
-vn 0.7532 0.2870 -0.5918
-vn -0.4116 -0.8575 -0.3087
-vn 0.4116 -0.8575 -0.3087
-vn -0.0375 0.2247 -0.9737
-vn 0.0502 0.2343 -0.9709
-vn -0.1304 -0.2609 -0.9565
-vn 0.1304 -0.2609 -0.9565
-vn 0.0631 -0.8206 -0.5681
-vn -0.0631 -0.8206 -0.5681
-vn -0.7325 0.2817 -0.6198
-vn 0.7325 0.2817 -0.6198
-vn -0.3319 0.0738 -0.9404
-vn 0.5460 -0.4310 -0.7184
-vn -0.2815 0.0662 -0.9573
-vn 0.3231 0.0311 -0.9459
-vn -0.8753 0.2059 -0.4376
-vn 0.7357 0.3910 -0.5531
-vn -0.8973 0.1994 -0.3938
-vn 0.8480 0.3180 -0.4240
-vn -0.9586 0.0664 -0.2767
-vn 0.9586 0.0664 -0.2767
-vn -0.2524 -0.8655 -0.4327
-vn 0.1783 -0.4161 -0.8917
-vn 0.1751 -0.2043 -0.9631
-vn -0.1751 -0.2043 -0.9631
-vn 0.1219 -0.1829 -0.9755
-vn -0.1219 -0.1829 -0.9755
-vn 0.1562 0.3123 -0.9370
-vn -0.1562 0.3123 -0.9370
-vn 0.7238 0.6857 -0.0762
-vn -0.7238 0.6857 -0.0762
-vn -0.0478 -0.2870 -0.9567
-vn 0.0478 -0.2870 -0.9567
-vn 0.5488 -0.3293 -0.7683
-vn -0.5488 -0.3293 -0.7683
-vn 0.4945 -0.1130 -0.8618
-vn -0.4945 -0.1130 -0.8618
-vn 0.2595 0.1038 -0.9601
-vn -0.1717 -0.0090 -0.9851
-vn 0.6684 -0.4595 -0.5849
-vn -0.4332 -0.4874 -0.7581
-vn 0.1156 -0.6359 -0.7631
-vn -0.1156 -0.6359 -0.7631
-vn -0.4242 -0.6211 -0.6590
-vn 0.4242 -0.6211 -0.6590
-vn -0.4767 -0.3557 -0.8039
-vn 0.4767 -0.3557 -0.8039
-vn -0.5871 -0.0839 -0.8052
-vn 0.5871 -0.0839 -0.8052
-vn -0.5774 0.1155 -0.8083
-vn 0.5657 0.1197 -0.8159
-vn -0.5214 0.6574 -0.5441
-vn 0.4082 0.4082 -0.8165
-vn -0.3358 0.3478 -0.8754
-vn 0.3358 0.3478 -0.8754
-vn -0.1452 0.3774 -0.9146
-vn 0.1452 0.3774 -0.9146
-vn -0.0301 0.2306 -0.9726
-vn 0.0301 0.2306 -0.9726
-vn -0.3553 -0.5739 -0.7379
-vn 0.2804 -0.2181 -0.9348
-vn -0.2627 -0.2252 -0.9382
-vn 0.2627 -0.2252 -0.9382
-vn 0.0631 -0.3156 -0.9468
-vn -0.3766 -0.8339 -0.4035
-vn 0.2016 -0.9071 -0.3696
-vn 0.0823 -0.7822 -0.6175
-vn 0.3356 -0.2397 -0.9110
-vn -0.3356 -0.2397 -0.9110
-vn 0.4568 0.0508 -0.8881
-vn -0.2692 -0.0577 -0.9614
-vn 0.0247 0.4072 -0.9130
-vn -0.0247 0.4072 -0.9130
-vn 0.0487 0.6815 -0.7302
-vn -0.0213 0.5546 -0.8319
-vn -0.3378 0.5221 -0.7831
-vn 0.3778 0.6342 -0.6746
-vn -0.7895 -0.3158 -0.5263
-vn 0.7895 -0.3158 -0.5263
-vn -0.8070 -0.0807 -0.5851
-vn 0.8070 -0.0807 -0.5851
-vn -0.7868 0.1210 -0.6052
-vn 0.7868 0.1210 -0.6052
-vn 0.6357 0.6811 0.3633
-vn -0.6357 0.6811 0.3633
-vn 0.8507 0.3650 0.3783
-vn -0.8507 0.3650 0.3783
-vn 0.2197 0.8626 0.4557
-vn -0.2664 0.8710 0.4127
-vn -0.5914 0.7489 0.2991
-vn 0.5932 0.7445 0.3063
-vn -0.3653 0.8833 0.2938
-vn 0.3714 0.8685 0.3284
-vn -0.2760 0.9159 0.2915
-vn 0.2760 0.9159 0.2915
-vn -0.7964 0.1323 0.5901
-vn 0.8873 0.1343 0.4412
-vn -0.5442 -0.7524 0.3712
-vn 0.5442 -0.7524 0.3712
-vn -0.4027 -0.7323 0.5492
-vn 0.4027 -0.7323 0.5492
-vn -0.1649 -0.6644 0.7289
-vn 0.3617 -0.3858 0.8487
-vn -0.3011 -0.0125 0.9535
-vn 0.1952 -0.0976 0.9759
-vn -0.2562 -0.3112 0.9152
-vn -0.0107 -0.5633 0.8262
-vn -0.0779 -0.9948 0.0663
-vn 0.0779 -0.9948 0.0663
-vn -0.1094 -0.9718 0.2089
-vn 0.1094 -0.9718 0.2089
-vn -0.8150 -0.5621 0.1405
-vn 0.8150 -0.5621 0.1405
-vn -0.9358 0.1396 0.3236
-vn 0.9358 0.1396 0.3236
-vn -0.1132 -0.0274 0.9932
-vn 0.1132 -0.0274 0.9932
-vn 0.1497 -0.3635 0.9195
-vn 0.1211 -0.0530 0.9912
-vn -0.3706 -0.6780 0.6349
-vn 0.9094 0.1371 0.3927
-vn -0.9193 0.1393 0.3682
-vn 0.9193 0.1393 0.3682
-vn -0.9457 0.2673 0.1850
-vn 0.9173 0.3440 0.2007
-vn -0.9337 0.2813 0.2215
-vn 0.9004 0.3642 0.2380
-vn -0.9501 0.2455 0.1922
-vn 0.8945 0.4337 -0.1084
-vn -0.1835 -0.7864 0.5898
-vn 0.1596 -0.9577 0.2394
-vn -0.3727 -0.4759 0.7966
-vn 0.3693 -0.4712 0.8010
-vn -0.3263 -0.8342 0.4446
-vn 0.2986 -0.8236 0.4821
-vn -0.2620 -0.9574 0.1217
-vn 0.2620 -0.9574 0.1217
-vn -0.2996 -0.9443 0.1362
-vn 0.2996 -0.9443 0.1362
-vn -0.8642 -0.4737 -0.1696
-vn 0.8305 0.3333 0.4463
-vn -0.6869 -0.6358 -0.3521
-vn 0.6869 -0.6358 -0.3521
-vn -0.4189 -0.2265 0.8793
-vn 0.2950 -0.0454 0.9544
-vn -0.1119 0.9626 -0.2468
-vn 0.1272 0.9658 -0.2260
-vn -0.1208 0.9734 0.1947
-vn 0.1208 0.9734 0.1947
-vn -0.3140 0.5711 0.7585
-vn 0.3140 0.5711 0.7585
-vn -0.3231 0.9288 0.1817
-vn 0.3231 0.9288 0.1817
-vn -0.0452 0.7955 -0.6043
-vn 0.0452 0.7955 -0.6043
-vn -0.6144 0.7696 -0.1738
-vn 0.6144 0.7696 -0.1738
-vn -0.6935 0.6857 0.2212
-vn 0.6935 0.6857 0.2212
-vn -0.6304 0.2517 0.7343
-vn 0.7104 0.1364 0.6904
-vn -0.3179 0.5704 0.7574
-vn 0.3179 0.5704 0.7574
-vn -0.6289 0.7624 0.1525
-vn 0.6289 0.7624 0.1525
-vn -0.7088 0.6833 -0.1752
-vn 0.7088 0.6833 -0.1752
-vn -0.6885 0.3830 -0.6158
-vn 0.6885 0.3830 -0.6158
-vn -0.3238 0.9434 0.0720
-vn 0.3669 0.8840 0.2898
-vn -0.1548 0.5080 -0.8473
-vn 0.2854 0.6237 -0.7277
-vn 0.1819 0.1145 0.9766
-vn -0.1819 0.1145 0.9766
-vn 0.2638 0.9462 0.1871
-vn -0.2638 0.9462 0.1871
-vn -0.9340 0.2255 -0.2773
-vn 0.8681 0.0893 0.4883
-vn -0.9758 0.1241 -0.1800
-vn 0.9758 0.1241 -0.1800
-vn -0.9613 0.1472 0.2330
-vn 0.9613 0.1472 0.2330
-vn -0.9956 0.0893 0.0288
-vn 0.9817 -0.0304 0.1882
-vn -0.6374 -0.7651 -0.0915
-vn 0.7466 -0.6646 -0.0285
-vn -0.3720 -0.9244 -0.0845
-vn 0.3723 -0.9243 -0.0847
-vn -0.5281 -0.8354 -0.1522
-vn 0.5281 -0.8354 -0.1522
-vn -0.3070 -0.5237 -0.7946
-vn 0.3070 -0.5237 -0.7946
-vn -0.5236 -0.3290 0.7859
-vn 0.5881 -0.3070 0.7483
-vn -0.5396 -0.3343 0.7727
-vn 0.4694 -0.2400 0.8498
-vn -0.2144 -0.8341 0.5082
-vn 0.4463 -0.8452 0.2941
-vn -0.7365 -0.6154 0.2808
-vn 0.6973 -0.6610 0.2771
-vn -0.3244 0.4867 -0.8111
-vn 0.3691 0.2855 -0.8844
-vn -0.4649 0.2593 -0.8465
-vn 0.4649 0.2593 -0.8465
-vn -0.1817 -0.0079 -0.9833
-vn 0.3188 0.1993 -0.9266
-vn -0.2925 -0.0758 -0.9533
-vn 0.2076 -0.0836 -0.9746
-vn -0.5847 -0.2198 -0.7809
-vn 0.3398 0.0824 -0.9369
-vn -0.6509 -0.1939 -0.7340
-vn 0.6509 -0.1939 -0.7340
-vn -0.4075 0.7506 -0.5201
-vn 0.4075 0.7506 -0.5201
-vn 0.2655 0.8296 -0.4911
-vn -0.2655 0.8296 -0.4911
-vn 0.7885 0.2366 -0.5677
-vn -0.8576 0.2223 -0.4637
-vn 0.5242 -0.3548 -0.7742
-vn -0.5257 -0.3579 -0.7717
-vn -0.4390 -0.5252 -0.7290
-vn 0.4663 -0.5991 -0.6509
-vn -0.6888 -0.4428 -0.5740
-vn 0.6888 -0.4428 -0.5740
-vn -0.6302 -0.7658 -0.1282
-vn 0.7507 -0.6131 0.2461
-vn 0.2175 0.2733 -0.9370
-vn -0.1788 0.2923 -0.9395
-vn -0.9046 -0.3869 0.1792
-vn 0.9046 -0.3869 0.1792
-vn -0.1782 -0.0891 -0.9800
-vn 0.1782 -0.0891 -0.9800
-vn 0.2335 0.8972 -0.3749
-vn -0.2335 0.8972 -0.3749
-vn -0.7177 0.1689 -0.6755
-vn 0.4480 -0.4480 -0.7737
-vn -0.5313 0.5844 -0.6134
-vn 0.5313 0.5844 -0.6134
-vn -0.9008 -0.4075 -0.1501
-vn 0.5534 -0.5534 -0.6225
-vn -0.5815 -0.5217 -0.6243
-vn 0.5724 -0.3122 -0.7582
-vn -0.6138 -0.2571 -0.7465
-vn 0.5597 -0.5533 -0.6169
-vn -0.8779 -0.4788 -0.0076
-vn 0.8779 -0.4788 -0.0076
-vn -0.8717 -0.4446 0.2063
-vn 0.9227 -0.3765 0.0825
-vn -0.7661 -0.6363 -0.0909
-vn 0.7661 -0.6363 -0.0909
-vn -0.7930 -0.5947 -0.1322
-vn 0.7815 -0.6176 -0.0882
-vn -0.2408 0.9631 0.1204
-vn 0.1240 0.9921 -0.0207
-vn -0.9251 0.3469 -0.1542
-vn 0.9435 0.3145 -0.1048
-vn -0.7071 -0.7071 -0.0000
-vn 0.7071 -0.7071 -0.0000
-vn 0.0157 0.9898 -0.1414
-vn -0.0157 0.9898 -0.1414
-vn -0.6266 -0.7211 -0.2956
-vn 0.6266 -0.7211 -0.2956
-vn -0.2714 -0.9022 -0.3353
-vn 0.2714 -0.9022 -0.3353
-vn 0.8651 -0.4853 0.1266
-vn -0.8651 -0.4853 0.1266
-vn 0.8538 0.2328 0.4657
-vn -0.8096 0.2429 0.5343
-vn 0.5433 0.6985 0.4657
-vn -0.5621 0.8231 0.0803
-vn 0.1096 0.9939 0.0157
-vn -0.0071 0.9899 -0.1414
-vn -0.1738 0.0097 -0.9847
-vn 0.1046 0.0392 -0.9937
-vn -0.4134 0.0413 -0.9096
-vn 0.2461 0.0852 -0.9655
-vn -0.3228 -0.0461 -0.9453
-vn 0.3228 -0.0461 -0.9453
-vn -0.1220 0.0458 -0.9915
-vn 0.2104 0.0124 -0.9775
-vn -0.5679 0.1916 -0.8005
-vn 0.5679 0.1916 -0.8005
-vn -0.4244 -0.0320 -0.9049
-vn 0.3787 -0.0364 -0.9248
-vn -0.2570 0.0723 -0.9637
-vn 0.2530 -0.1897 -0.9487
-vn -0.1351 -0.0225 -0.9906
-vn 0.1351 -0.0225 -0.9906
-vn 0.2981 0.7454 -0.5963
-vn -0.4870 0.6088 -0.6262
-vn -0.5571 -0.1486 -0.8171
-vn 0.5571 -0.1486 -0.8171
-vn -0.4723 -0.1986 -0.8588
-vn 0.4388 -0.2008 -0.8759
-vn -0.2975 -0.4062 -0.8640
-vn 0.5786 -0.1334 -0.8046
-vn -0.5771 0.2164 -0.7875
-vn 0.5771 0.2164 -0.7875
-vn -0.0931 -0.9932 0.0692
-vn 0.0931 -0.9932 0.0692
-vn -0.5161 -0.8527 0.0812
-vn 0.5161 -0.8527 0.0812
-vn -0.9264 -0.2460 -0.2851
-vn 0.9309 -0.2541 -0.2624
-vn -0.8267 0.5627 0.0035
-vn 0.8465 0.5291 0.0595
-vn 0.2146 0.9243 0.3157
-vn -0.2511 0.9439 0.2145
-vn 0.4196 0.8851 0.2012
-vn -0.4841 0.8743 0.0361
-vn 0.5470 -0.0144 0.8370
-vn -0.5256 -0.0030 0.8507
-vn 0.2556 -0.0749 0.9639
-vn -0.2556 -0.0749 0.9639
-vn 0.7330 0.6786 -0.0472
-vn -0.8073 0.5901 -0.0041
-vn -0.6844 -0.1711 0.7088
-vn 0.6844 -0.1711 0.7088
-vn 0.3604 -0.8283 0.4290
-vn -0.3604 -0.8283 0.4290
-vt 0.870622 0.589649
-vt 0.868067 0.821510
-vt 0.860081 0.560115
-vt 0.856226 0.850547
-vt 0.853018 0.521562
-vt 0.847458 0.888748
-vt 0.798481 0.569535
-vt 0.795104 0.838402
-vt 0.828900 0.590771
-vt 0.826436 0.818537
-vt 0.854402 0.604754
-vt 0.852534 0.805700
-vt 0.854107 0.625459
-vt 0.853157 0.785002
-vt 0.828171 0.633354
-vt 0.827598 0.775964
-vt 0.791018 0.645443
-vt 0.791018 0.762238
-vt 0.842358 0.702491
-vt 0.844839 0.707525
-vt 0.855181 0.668527
-vt 0.856142 0.742025
-vt 0.867508 0.642291
-vt 0.867293 0.768782
-vt 0.890474 0.641909
-vt 0.890219 0.770183
-vt 0.900375 0.666964
-vt 0.901223 0.745592
-vt 0.918898 0.699697
-vt 0.921180 0.713713
-vt 0.968392 0.645333
-vt 0.968213 0.770220
-vt 0.931889 0.636832
-vt 0.931368 0.777093
-vt 0.905882 0.627902
-vt 0.904990 0.784860
-vt 0.906232 0.605742
-vt 0.904357 0.807013
-vt 0.933717 0.593037
-vt 0.931250 0.820926
-vt 0.968392 0.573812
-vt 0.965038 0.841671
-vt 0.920166 0.524546
-vt 0.914672 0.888748
-vt 0.904571 0.559404
-vt 0.900640 0.853232
-vt 0.890955 0.590063
-vt 0.888398 0.821999
-vt 0.889591 0.593275
-vt 0.887178 0.818729
-vt 0.902359 0.607909
-vt 0.900583 0.804677
-vt 0.899781 0.626257
-vt 0.898822 0.786233
-vt 0.887842 0.636527
-vt 0.887351 0.775442
-vt 0.870908 0.635245
-vt 0.870376 0.775972
-vt 0.859881 0.623942
-vt 0.858859 0.786774
-vt 0.879400 0.616512
-vt 0.878029 0.795063
-vt 0.859664 0.608186
-vt 0.857942 0.802505
-vt 0.871664 0.593961
-vt 0.869299 0.817249
-vt 0.521923 0.386009
-vt 0.521086 0.343868
-vt 0.518925 0.093952
-vt 0.518998 0.159028
-vt 0.519132 0.185382
-vt 0.518925 0.083865
-vt 0.523031 0.433628
-vt 0.819845 0.468071
-vt 0.215894 0.503605
-vt 0.845499 0.449967
-vt 0.185281 0.484099
-vt 0.999856 0.254640
-vt 0.000144 0.259113
-vt 0.994525 0.167705
-vt 0.011829 0.155367
-vt 0.945900 0.079569
-vt 0.078961 0.060719
-vt 0.805584 0.010786
-vt 0.232648 0.003484
-vt 0.605512 0.165134
-vt 0.432024 0.165644
-vt 0.583135 0.108495
-vt 0.454527 0.108481
-vt 0.563812 0.076586
-vt 0.474014 0.076511
-vt 0.555073 0.061900
-vt 0.482805 0.061829
-vt 0.551930 0.058338
-vt 0.485955 0.058273
-vt 0.540260 0.053805
-vt 0.497626 0.053770
-vt 0.518916 0.050294
-vt 0.647395 0.200502
-vt 0.389677 0.201890
-vt 0.676379 0.233241
-vt 0.360308 0.235899
-vt 0.715342 0.265392
-vt 0.320452 0.270303
-vt 0.707254 0.310054
-vt 0.330721 0.316853
-vt 0.697446 0.332673
-vt 0.341964 0.339667
-vt 0.662817 0.372521
-vt 0.379297 0.378686
-vt 0.626842 0.395792
-vt 0.416915 0.400552
-vt 0.604826 0.397804
-vt 0.439252 0.401540
-vt 0.553095 0.390512
-vt 0.490934 0.391862
-vt 0.577279 0.340156
-vt 0.464579 0.342230
-vt 0.558527 0.316594
-vt 0.482619 0.317843
-vt 0.572941 0.258564
-vt 0.466409 0.259709
-vt 0.613992 0.242662
-vt 0.424464 0.244473
-vt 0.639236 0.253047
-vt 0.398938 0.255633
-vt 0.664101 0.277872
-vt 0.374100 0.281778
-vt 0.668440 0.297958
-vt 0.370304 0.302644
-vt 0.662406 0.312804
-vt 0.377061 0.317685
-vt 0.634472 0.332311
-vt 0.406362 0.336480
-vt 0.599845 0.344815
-vt 0.441977 0.347815
-vt 0.518927 0.085180
-vt 0.531019 0.087431
-vt 0.506827 0.087416
-vt 0.531231 0.073829
-vt 0.506626 0.073811
-vt 0.525483 0.068967
-vt 0.512375 0.068956
-vt 0.518928 0.067899
-vt 0.517577 0.190607
-vt 0.519841 0.200843
-vt 0.544281 0.193366
-vt 0.493996 0.193428
-vt 0.548362 0.173560
-vt 0.489683 0.173693
-vt 0.538112 0.158382
-vt 0.499851 0.158434
-vt 0.621513 0.227818
-vt 0.416514 0.229490
-vt 0.664761 0.253225
-vt 0.372747 0.256357
-vt 0.683908 0.279995
-vt 0.353696 0.284606
-vt 0.687515 0.311539
-vt 0.351187 0.317440
-vt 0.676824 0.323937
-vt 0.362723 0.329722
-vt 0.639050 0.357330
-vt 0.402772 0.362131
-vt 0.618316 0.375151
-vt 0.424583 0.379267
-vt 0.600808 0.377857
-vt 0.442396 0.381222
-vt 0.559674 0.357011
-vt 0.482938 0.358497
-vt 0.553118 0.209599
-vt 0.485339 0.210053
-vt 0.555621 0.121749
-vt 0.482177 0.121781
-vt 0.548333 0.084893
-vt 0.489507 0.084858
-vt 0.546290 0.072669
-vt 0.491565 0.072625
-vt 0.542788 0.064089
-vt 0.495083 0.064047
-vt 0.536419 0.062072
-vt 0.501452 0.062043
-vt 0.518925 0.059681
-vt 0.519760 0.248864
-vt 0.520277 0.294764
-vt 0.615546 0.342005
-vt 0.425972 0.345582
-vt 0.563905 0.272007
-vt 0.475886 0.273078
-vt 0.556923 0.291214
-vt 0.483433 0.292249
-vt 0.532669 0.090920
-vt 0.505177 0.090908
-vt 0.532042 0.127713
-vt 0.505828 0.127728
-vt 0.518941 0.128358
-vt 0.518981 0.151749
-vt 0.535214 0.166808
-vt 0.502799 0.166857
-vt 0.537959 0.175966
-vt 0.500100 0.176033
-vt 0.537248 0.187577
-vt 0.500890 0.187571
-vt 0.528757 0.191785
-vt 0.509219 0.191626
-vt 0.519099 0.179457
-vt 0.528222 0.186316
-vt 0.509787 0.186260
-vt 0.533528 0.184215
-vt 0.504547 0.184206
-vt 0.533449 0.176739
-vt 0.504604 0.176791
-vt 0.531131 0.171631
-vt 0.506910 0.171667
-vt 0.519016 0.165599
-vt 0.596138 0.133426
-vt 0.441395 0.133592
-vt 0.561572 0.167779
-vt 0.476363 0.167996
-vt 0.559475 0.149319
-vt 0.478371 0.149447
-vt 0.601169 0.147885
-vt 0.436337 0.148194
-vt 0.518929 0.069468
-vt 0.523751 0.070508
-vt 0.514106 0.070501
-vt 0.529036 0.075429
-vt 0.508820 0.075415
-vt 0.528933 0.084957
-vt 0.508915 0.084945
-vt 0.518926 0.079331
-vt 0.524601 0.079886
-vt 0.513252 0.079879
-vt 0.524236 0.076691
-vt 0.513619 0.076684
-vt 0.521560 0.074970
-vt 0.516297 0.074966
-vt 0.518928 0.074259
-vt 0.568351 0.292904
-vt 0.471978 0.294282
-vt 0.571787 0.277295
-vt 0.468070 0.278617
-vt 0.614408 0.331972
-vt 0.426727 0.335361
-vt 0.601033 0.333624
-vt 0.440344 0.336537
-vt 0.629040 0.323864
-vt 0.411556 0.327673
-vt 0.652752 0.310186
-vt 0.386858 0.314615
-vt 0.656064 0.297636
-vt 0.383015 0.301864
-vt 0.653658 0.279971
-vt 0.384904 0.283634
-vt 0.632494 0.262853
-vt 0.406068 0.265508
-vt 0.611720 0.255725
-vt 0.427062 0.257728
-vt 0.580734 0.266620
-vt 0.458737 0.268049
-vt 0.573085 0.311386
-vt 0.467790 0.313081
-vt 0.584855 0.327708
-vt 0.456477 0.329961
-vt 0.590644 0.321516
-vt 0.450408 0.323919
-vt 0.579548 0.309340
-vt 0.461204 0.311233
-vt 0.585166 0.270991
-vt 0.454369 0.272583
-vt 0.612641 0.261560
-vt 0.426254 0.263693
-vt 0.629829 0.267263
-vt 0.408893 0.269959
-vt 0.647785 0.283486
-vt 0.391040 0.287071
-vt 0.649541 0.296225
-vt 0.389662 0.300183
-vt 0.646248 0.306421
-vt 0.393381 0.310510
-vt 0.626851 0.320513
-vt 0.413648 0.324175
-vt 0.601799 0.328453
-vt 0.439372 0.331331
-vt 0.613335 0.327083
-vt 0.427623 0.330358
-vt 0.578124 0.281900
-vt 0.461798 0.283441
-vt 0.577524 0.293776
-vt 0.462754 0.295432
-vt 0.553209 0.433063
-vt 0.815858 0.445381
-vt 0.492809 0.434538
-vt 0.219260 0.477186
-vt 0.609819 0.431516
-vt 0.770572 0.444261
-vt 0.435860 0.435740
-vt 0.271364 0.473316
-vt 0.648174 0.419316
-vt 0.755700 0.418603
-vt 0.396518 0.425416
-vt 0.287033 0.442912
-vt 0.692106 0.388274
-vt 0.770185 0.379538
-vt 0.350292 0.396229
-vt 0.268122 0.398737
-vt 0.726332 0.341754
-vt 0.749542 0.334683
-vt 0.312756 0.350588
-vt 0.288183 0.346496
-vt 0.735879 0.312112
-vt 0.301067 0.320593
-vt 0.729900 0.256393
-vt 0.304876 0.261087
-vt 0.698172 0.216906
-vt 0.337414 0.219179
-vt 0.663103 0.190671
-vt 0.373474 0.191872
-vt 0.911671 0.402429
-vt 0.106400 0.432652
-vt 0.962901 0.344752
-vt 0.043968 0.367038
-vt 0.891780 0.036916
-vt 0.142277 0.021467
-vt 0.672384 0.022201
-vt 0.365979 0.020991
-vt 0.518922 0.024886
-vt 0.567460 0.000144
-vt 0.470636 0.000144
-vt 0.626908 0.015608
-vt 0.411318 0.015131
-vt 0.649444 0.022378
-vt 0.388827 0.021586
-vt 0.789046 0.233323
-vt 0.241255 0.236977
-vt 0.809631 0.233887
-vt 0.219168 0.237388
-vt 0.842355 0.195160
-vt 0.620420 0.565675
-vt 0.176788 0.196179
-vt 0.145041 0.562595
-vt 0.909112 0.183261
-vt 0.107928 0.179083
-vt 0.760215 0.193244
-vt 0.271553 0.193871
-vt 0.785486 0.152330
-vt 0.391039 0.611891
-vt 0.245969 0.151002
-vt 0.369913 0.610196
-vt 0.837382 0.156361
-vt 0.498072 0.552315
-vt 0.196622 0.155241
-vt 0.264218 0.550140
-vt 0.886245 0.121777
-vt 0.141314 0.112482
-vt 0.626663 0.111357
-vt 0.410618 0.111244
-vt 0.660451 0.076084
-vt 0.376796 0.075296
-vt 0.576951 0.057998
-vt 0.460920 0.057845
-vt 0.611687 0.078268
-vt 0.425932 0.077985
-vt 0.558059 0.053871
-vt 0.479842 0.053785
-vt 0.577206 0.032801
-vt 0.460782 0.032656
-vt 0.621440 0.048089
-vt 0.416419 0.047631
-vt 0.547413 0.041724
-vt 0.490511 0.041669
-vt 0.629482 0.130456
-vt 0.407648 0.130594
-vt 0.623495 0.146796
-vt 0.413741 0.147158
-vt 0.619303 0.159841
-vt 0.418035 0.160361
-vt 0.687018 0.077204
-vt 0.349875 0.075955
-vt 0.788458 0.080826
-vt 0.246353 0.076510
-vt 0.849114 0.099732
-vt 0.183115 0.092127
-vt 0.915360 0.259804
-vt 0.098965 0.266968
-vt 0.894128 0.301884
-vt 0.123776 0.315519
-vt 0.862868 0.338556
-vt 0.160557 0.356821
-vt 0.794286 0.364062
-vt 0.239776 0.382592
-vt 0.766337 0.300809
-vt 0.267408 0.310142
-vt 0.789162 0.313727
-vt 0.242992 0.325552
-vt 0.846174 0.293397
-vt 0.178537 0.304983
-vt 0.815314 0.276388
-vt 0.213065 0.285164
-vt 0.845007 0.256352
-vt 0.179662 0.263312
-vt 0.873517 0.265922
-vt 0.147089 0.274284
-vt 0.886999 0.233769
-vt 0.131514 0.237587
-vt 0.859075 0.228168
-vt 0.162803 0.231720
-vt 0.875030 0.184705
-vt 0.145224 0.182749
-vt 0.858171 0.137775
-vt 0.171653 0.132294
-vt 0.391747 0.862097
-vt 0.829287 0.219562
-vt 0.199067 0.222464
-vt 0.363377 0.861308
-vt 0.051216 0.522659
-vt 0.715482 0.139727
-vt 0.319538 0.139409
-vt 0.786480 0.117591
-vt 0.246666 0.114850
-vt 0.740843 0.572428
-vt 0.432388 0.894943
-vt 0.834578 0.206879
-vt 0.321637 0.893225
-vt 0.033664 0.564403
-vt 0.434803 0.658882
-vt 0.325318 0.656224
-vt 0.508270 0.697693
-vt 0.250811 0.693249
-vt 0.563786 0.739211
-vt 0.194086 0.733241
-vt 0.619962 0.791615
-vt 0.136063 0.784093
-vt 0.604825 0.879946
-vt 0.707492 0.759884
-vt 0.148729 0.873349
-vt 0.049526 0.748824
-vt 0.506166 0.904851
-vt 0.745511 0.652100
-vt 0.247207 0.901159
-vt 0.019409 0.639749
-vt 0.491058 0.881714
-vt 0.263032 0.878321
-vt 0.572792 0.860484
-vt 0.181486 0.854693
-vt 0.586396 0.793977
-vt 0.169745 0.787474
-vt 0.549027 0.746412
-vt 0.208656 0.740879
-vt 0.500314 0.711729
-vt 0.258399 0.707497
-vt 0.438641 0.680683
-vt 0.320962 0.677959
-vt 0.438797 0.870229
-vt 0.315867 0.868209
-vt 0.457832 0.840040
-vt 0.297562 0.837358
-vt 0.452955 0.700023
-vt 0.306136 0.696976
-vt 0.505666 0.730944
-vt 0.252524 0.726592
-vt 0.542850 0.755753
-vt 0.214575 0.750414
-vt 0.568148 0.787367
-vt 0.188269 0.781375
-vt 0.555495 0.826352
-vt 0.199850 0.820889
-vt 0.501231 0.844356
-vt 0.253846 0.840502
-vt 0.401605 0.841460
-vt 0.825107 0.209762
-vt 0.354026 0.840297
-vt 0.199767 0.214827
-vt 0.418086 0.784946
-vt 0.338952 0.783073
-vt 0.410995 0.747662
-vt 0.347028 0.745816
-vt 0.427812 0.742828
-vt 0.330270 0.740536
-vt 0.433669 0.729661
-vt 0.324726 0.727177
-vt 0.435018 0.718280
-vt 0.323658 0.715731
-vt 0.783193 0.187449
-vt 0.246955 0.187075
-vt 0.796021 0.176969
-vt 0.394766 0.686125
-vt 0.233625 0.175620
-vt 0.364838 0.684445
-vt 0.384658 0.710299
-vt 0.802192 0.184609
-vt 0.226485 0.183086
-vt 0.374400 0.708969
-vt 0.384657 0.795423
-vt 0.816266 0.203086
-vt 0.372270 0.794472
-vt 0.209828 0.206161
-vt 0.431333 0.817535
-vt 0.324790 0.815460
-vt 0.448505 0.804621
-vt 0.307886 0.802031
-vt 0.440995 0.724383
-vt 0.317510 0.721697
-vt 0.445392 0.731997
-vt 0.312907 0.729222
-vt 0.437950 0.749777
-vt 0.319919 0.747250
-vt 0.423718 0.754191
-vt 0.334089 0.752045
-vt 0.435868 0.779569
-vt 0.321237 0.777208
-vt 0.512485 0.828811
-vt 0.242975 0.824574
-vt 0.550942 0.811814
-vt 0.204839 0.806417
-vt 0.552139 0.787682
-vt 0.204331 0.782156
-vt 0.539407 0.764539
-vt 0.217774 0.759319
-vt 0.508439 0.743135
-vt 0.249419 0.738732
-vt 0.455277 0.713731
-vt 0.303460 0.710657
-vt 0.473386 0.824700
-vt 0.282357 0.821525
-vt 0.454776 0.761665
-vt 0.302729 0.758742
-vt 0.470841 0.748408
-vt 0.286960 0.745020
-vt 0.488870 0.770464
-vt 0.268291 0.766661
-vt 0.475403 0.783904
-vt 0.281439 0.780511
-vt 0.494476 0.802470
-vt 0.261790 0.798626
-vt 0.503673 0.787562
-vt 0.252972 0.783410
-vt 0.518562 0.791602
-vt 0.237920 0.787045
-vt 0.516802 0.807339
-vt 0.239243 0.802891
-vt 0.677256 0.670436
-vt 0.083564 0.662038
-vt 0.660647 0.741167
-vt 0.097038 0.732052
-vt 0.616701 0.759965
-vt 0.140379 0.752377
-vt 0.581052 0.726933
-vt 0.177176 0.720426
-vt 0.543385 0.683538
-vt 0.216123 0.678120
-vt 0.484068 0.628776
-vt 0.276936 0.625067
-vt 0.834705 0.206959
-vt 0.671403 0.592656
-vt 0.092820 0.589862
-s 0
-f 47/47/1 3/3/1 45/45/1
-f 4/4/2 48/48/2 46/46/2
-f 45/45/3 5/5/3 43/43/3
-f 6/6/4 46/46/4 44/44/4
-f 3/3/5 7/7/5 5/5/5
-f 8/8/6 4/4/6 6/6/6
-f 1/1/7 9/9/7 3/3/7
-f 10/10/8 2/2/8 4/4/8
-f 11/11/9 15/15/9 9/9/9
-f 16/16/10 12/12/10 10/10/10
-f 9/9/11 17/17/11 7/7/11
-f 18/18/12 10/10/12 8/8/12
-f 21/21/13 17/17/13 15/15/13
-f 22/22/14 18/18/14 20/20/14
-f 13/13/15 21/21/15 15/15/15
-f 22/22/16 14/14/16 16/16/16
-f 23/23/17 27/27/17 21/21/17
-f 28/28/18 24/24/18 22/22/18
-f 27/27/19 19/19/19 21/21/19
-f 28/28/20 20/20/20 30/30/20
-f 33/33/21 29/29/21 27/27/21
-f 34/34/22 30/30/22 32/32/22
-f 35/35/23 27/27/23 25/25/23
-f 36/36/24 28/28/24 34/34/24
-f 37/37/25 33/33/25 35/35/25
-f 38/38/26 34/34/26 40/40/26
-f 39/39/27 31/31/27 33/33/27
-f 40/40/28 32/32/28 42/42/28
-f 45/45/29 41/41/29 39/39/29
-f 46/46/30 42/42/30 44/44/30
-f 47/47/31 39/39/31 37/37/31
-f 48/48/32 40/40/32 46/46/32
-f 37/37/33 49/49/33 47/47/33
-f 38/38/34 50/50/34 52/52/34
-f 35/35/35 51/51/35 37/37/35
-f 36/36/36 52/52/36 54/54/36
-f 25/25/37 53/53/37 35/35/37
-f 26/26/38 54/54/38 56/56/38
-f 23/23/39 55/55/39 25/25/39
-f 24/24/40 56/56/40 58/58/40
-f 23/23/41 59/59/41 57/57/41
-f 60/60/42 24/24/42 58/58/42
-f 13/13/43 63/63/43 59/59/43
-f 64/64/44 14/14/44 60/60/44
-f 11/11/45 65/65/45 63/63/45
-f 66/66/46 12/12/46 64/64/46
-f 1/1/47 49/49/47 65/65/47
-f 50/50/48 2/2/48 66/66/48
-f 61/61/49 65/65/49 49/49/49
-f 50/50/50 66/66/50 62/62/50
-f 63/63/51 65/65/51 61/61/51
-f 62/62/52 66/66/52 64/64/52
-f 61/61/53 59/59/53 63/63/53
-f 64/64/54 60/60/54 62/62/54
-f 61/61/55 57/57/55 59/59/55
-f 60/60/56 58/58/56 62/62/56
-f 61/61/57 55/55/57 57/57/57
-f 58/58/58 56/56/58 62/62/58
-f 61/61/59 53/53/59 55/55/59
-f 56/56/60 54/54/60 62/62/60
-f 61/61/61 51/51/61 53/53/61
-f 54/54/62 52/52/62 62/62/62
-f 61/61/63 49/49/63 51/51/63
-f 52/52/64 50/50/64 62/62/64
-f 174/181/65 91/98/65 89/96/65
-f 175/182/66 91/98/66 176/183/66
-f 172/179/67 89/96/67 87/94/67
-f 173/180/68 90/97/68 175/182/68
-f 85/92/69 172/179/69 87/94/69
-f 173/180/70 86/93/70 88/95/70
-f 83/90/71 170/177/71 85/92/71
-f 171/178/72 84/91/72 86/93/72
-f 81/88/73 168/175/73 83/90/73
-f 169/176/74 82/89/74 84/91/74
-f 79/86/75 146/153/75 164/171/75
-f 147/154/76 80/87/76 165/172/76
-f 94/101/77 146/153/77 92/99/77
-f 95/102/78 147/154/78 149/156/78
-f 94/101/79 150/157/79 148/155/79
-f 151/158/80 95/102/80 149/156/80
-f 98/105/81 150/157/81 96/103/81
-f 99/106/82 151/158/82 153/160/82
-f 100/107/83 152/159/83 98/105/83
-f 101/108/84 153/160/84 155/162/84
-f 102/109/85 154/161/85 100/107/85
-f 103/110/86 155/162/86 157/164/86
-f 102/109/87 158/165/87 156/163/87
-f 159/166/88 103/110/88 157/164/88
-f 106/113/89 158/165/89 104/111/89
-f 107/114/90 159/166/90 161/168/90
-f 108/115/91 160/167/91 106/113/91
-f 109/116/92 161/168/92 163/170/92
-f 67/67/93 162/169/93 108/115/93
-f 67/67/94 163/170/94 68/68/94
-f 128/135/95 162/169/95 110/117/95
-f 129/136/96 163/170/96 161/168/96
-f 128/135/97 158/165/97 160/167/97
-f 159/166/98 129/136/98 161/168/98
-f 156/163/99 179/186/99 126/133/99
-f 157/164/100 180/187/100 159/166/100
-f 154/161/101 126/133/101 124/131/101
-f 155/162/102 127/134/102 157/164/102
-f 152/159/103 124/131/103 122/129/103
-f 153/160/104 125/132/104 155/162/104
-f 150/157/105 122/129/105 120/127/105
-f 151/158/106 123/130/106 153/160/106
-f 148/155/107 120/127/107 118/125/107
-f 149/156/108 121/128/108 151/158/108
-f 146/153/109 118/125/109 116/123/109
-f 147/154/110 119/126/110 149/156/110
-f 164/171/111 116/123/111 114/121/111
-f 165/172/112 117/124/112 147/154/112
-f 114/121/113 177/184/113 164/171/113
-f 177/184/114 115/122/114 165/172/114
-f 162/169/115 112/119/115 110/117/115
-f 163/170/116 113/120/116 68/68/116
-f 112/119/117 178/185/117 183/190/117
-f 178/185/118 113/120/118 184/191/118
-f 181/188/119 178/185/119 177/184/119
-f 182/189/120 178/185/120 184/191/120
-f 135/142/121 176/183/121 174/181/121
-f 176/183/122 136/143/122 175/182/122
-f 133/140/123 174/181/123 172/179/123
-f 175/182/124 134/141/124 173/180/124
-f 133/140/125 170/177/125 131/138/125
-f 134/141/126 171/178/126 173/180/126
-f 166/173/127 185/192/127 168/175/127
-f 186/193/128 167/174/128 169/176/128
-f 131/138/129 168/175/129 185/192/129
-f 169/176/130 132/139/130 186/193/130
-f 190/197/131 187/194/131 144/151/131
-f 190/197/132 188/195/132 189/196/132
-f 187/194/133 69/69/133 185/192/133
-f 188/195/134 69/69/134 189/196/134
-f 131/138/135 69/69/135 130/137/135
-f 132/139/135 69/69/135 186/193/135
-f 142/149/136 191/198/136 144/151/136
-f 192/199/137 143/150/137 145/152/137
-f 140/147/138 193/200/138 142/149/138
-f 194/201/139 141/148/139 143/150/139
-f 197/204/140 140/147/140 139/146/140
-f 198/205/141 141/148/141 196/203/141
-f 71/71/142 139/146/142 138/145/142
-f 71/71/143 139/146/143 198/205/143
-f 144/151/144 70/70/144 190/197/144
-f 145/152/145 70/70/145 192/199/145
-f 191/198/146 208/215/146 70/70/146
-f 192/199/147 208/215/147 207/214/147
-f 71/71/148 200/207/148 197/204/148
-f 201/208/149 71/71/149 198/205/149
-f 197/204/150 202/209/150 195/202/150
-f 203/210/151 198/205/151 196/203/151
-f 202/209/152 193/200/152 195/202/152
-f 203/210/153 194/201/153 205/212/153
-f 193/200/154 206/213/154 191/198/154
-f 207/214/155 194/201/155 192/199/155
-f 204/211/156 200/207/156 199/206/156
-f 205/212/157 201/208/157 203/210/157
-f 199/206/158 206/213/158 204/211/158
-f 207/214/159 199/206/159 205/212/159
-f 139/146/160 164/171/160 177/184/160
-f 165/172/161 139/146/161 177/184/161
-f 140/147/162 211/218/162 164/171/162
-f 212/219/163 141/148/163 165/172/163
-f 144/151/164 211/218/164 142/149/164
-f 145/152/165 212/219/165 214/221/165
-f 187/194/166 213/220/166 144/151/166
-f 188/195/167 214/221/167 167/174/167
-f 209/216/168 166/173/168 81/88/168
-f 210/217/169 167/174/169 214/221/169
-f 215/222/170 213/220/170 209/216/170
-f 216/223/171 214/221/171 212/219/171
-f 79/86/172 211/218/172 215/222/172
-f 212/219/173 80/87/173 216/223/173
-f 130/137/174 222/229/174 131/138/174
-f 130/137/175 223/230/175 72/72/175
-f 133/140/176 222/229/176 220/227/176
-f 223/230/177 134/141/177 221/228/177
-f 135/142/178 220/227/178 218/225/178
-f 221/228/179 136/143/179 219/226/179
-f 137/144/135 218/225/135 217/224/135
-f 219/226/135 137/144/135 217/224/135
-f 218/225/180 231/238/180 217/224/180
-f 219/226/181 231/238/181 230/237/181
-f 218/225/182 227/234/182 229/236/182
-f 228/235/183 219/226/183 230/237/183
-f 220/227/142 225/232/142 227/234/142
-f 226/233/184 221/228/184 228/235/184
-f 72/72/185 225/232/185 222/229/185
-f 72/72/186 226/233/186 224/231/186
-f 224/231/187 229/236/187 225/232/187
-f 230/237/188 224/231/188 226/233/188
-f 225/232/189 229/236/189 227/234/189
-f 228/235/190 230/237/190 226/233/190
-f 183/190/191 234/241/191 232/239/191
-f 235/242/192 184/191/192 233/240/192
-f 112/119/193 232/239/193 254/261/193
-f 233/240/194 113/120/194 255/262/194
-f 112/119/195 256/263/195 110/117/195
-f 113/120/196 257/264/196 255/262/196
-f 114/121/197 234/241/197 181/188/197
-f 115/122/198 235/242/198 253/260/198
-f 114/121/199 250/257/199 252/259/199
-f 251/258/200 115/122/200 253/260/200
-f 116/123/201 248/255/201 250/257/201
-f 249/256/202 117/124/202 251/258/202
-f 118/125/203 246/253/203 248/255/203
-f 247/254/204 119/126/204 249/256/204
-f 120/127/205 244/251/205 246/253/205
-f 245/252/206 121/128/206 247/254/206
-f 124/131/207 244/251/207 122/129/207
-f 125/132/208 245/252/208 243/250/208
-f 126/133/209 242/249/209 124/131/209
-f 127/134/210 243/250/210 241/248/210
-f 126/133/211 236/243/211 240/247/211
-f 237/244/212 127/134/212 241/248/212
-f 179/186/213 238/245/213 236/243/213
-f 239/246/214 180/187/214 237/244/214
-f 128/135/215 256/263/215 238/245/215
-f 257/264/216 129/136/216 239/246/216
-f 256/263/217 276/283/217 238/245/217
-f 257/264/218 277/284/218 259/266/218
-f 236/243/219 276/283/219 278/285/219
-f 277/284/220 237/244/220 279/286/220
-f 236/243/221 274/281/221 240/247/221
-f 237/244/222 275/282/222 279/286/222
-f 240/247/223 272/279/223 242/249/223
-f 241/248/224 273/280/224 275/282/224
-f 244/251/225 272/279/225 270/277/225
-f 273/280/226 245/252/226 271/278/226
-f 244/251/227 268/275/227 246/253/227
-f 245/252/228 269/276/228 271/278/228
-f 248/255/229 268/275/229 266/273/229
-f 269/276/230 249/256/230 267/274/230
-f 248/255/231 264/271/231 250/257/231
-f 249/256/232 265/272/232 267/274/232
-f 250/257/233 262/269/233 252/259/233
-f 251/258/234 263/270/234 265/272/234
-f 234/241/235 262/269/235 280/287/235
-f 263/270/236 235/242/236 281/288/236
-f 256/263/237 260/267/237 258/265/237
-f 261/268/238 257/264/238 259/266/238
-f 254/261/239 282/289/239 260/267/239
-f 283/290/240 255/262/240 261/268/240
-f 232/239/241 280/287/241 282/289/241
-f 281/288/242 233/240/242 283/290/242
-f 67/67/243 284/291/243 73/73/243
-f 285/293/244 67/67/244 73/73/244
-f 108/115/245 286/295/245 284/291/245
-f 287/297/246 109/116/246 285/293/246
-f 104/111/247 286/295/247 106/113/247
-f 105/112/248 287/297/248 289/301/248
-f 102/109/249 288/299/249 104/111/249
-f 103/110/250 289/301/250 291/305/250
-f 100/107/251 290/303/251 102/109/251
-f 101/108/252 291/305/252 293/309/252
-f 100/107/253 294/311/253 292/307/253
-f 295/312/254 101/108/254 293/309/254
-f 96/103/255 294/311/255 98/105/255
-f 97/104/256 295/312/256 297/314/256
-f 96/103/257 298/315/257 296/313/257
-f 299/316/258 97/104/258 297/314/258
-f 94/101/259 300/317/259 298/315/259
-f 301/318/260 95/102/260 299/316/260
-f 309/332/261 338/368/261 308/330/261
-f 309/333/262 339/369/262 329/359/262
-f 308/330/263 336/366/263 307/328/263
-f 308/331/264 337/367/264 339/369/264
-f 307/328/265 340/370/265 306/327/265
-f 307/329/266 341/371/266 337/367/266
-f 89/96/267 306/327/267 340/370/267
-f 306/327/268 90/97/268 341/371/268
-f 87/94/269 340/370/269 334/364/269
-f 341/371/270 88/95/270 335/365/270
-f 85/92/271 334/364/271 330/360/271
-f 335/365/272 86/93/272 331/361/272
-f 83/90/273 330/360/273 332/362/273
-f 331/361/274 84/91/274 333/363/274
-f 330/360/275 338/368/275 332/362/275
-f 339/369/276 331/361/276 333/363/276
-f 334/364/277 336/366/277 330/360/277
-f 335/365/278 337/367/278 341/371/278
-f 332/362/279 328/358/279 326/356/279
-f 333/363/280 329/359/280 339/369/280
-f 81/88/281 332/362/281 326/356/281
-f 333/363/282 82/89/282 327/357/282
-f 342/372/283 215/222/283 209/216/283
-f 343/373/284 216/223/284 345/375/284
-f 326/356/285 209/216/285 81/88/285
-f 327/357/286 210/217/286 343/373/286
-f 215/222/287 346/376/287 79/86/287
-f 216/223/288 347/377/288 345/375/288
-f 346/376/289 92/99/289 79/86/289
-f 347/377/290 93/100/290 301/318/290
-f 324/354/291 304/323/291 77/82/291
-f 325/355/292 304/324/292 353/383/292
-f 352/382/293 78/84/293 304/323/293
-f 353/383/294 78/85/294 351/381/294
-f 78/84/295 348/378/295 305/325/295
-f 349/379/296 78/85/296 305/326/296
-f 305/325/297 328/358/297 309/332/297
-f 329/359/298 305/326/298 309/333/298
-f 328/358/299 342/372/299 326/356/299
-f 329/359/300 343/373/300 349/379/300
-f 296/313/301 318/344/301 310/334/301
-f 319/345/302 297/314/302 311/335/302
-f 316/342/303 77/82/303 76/80/303
-f 317/343/304 77/83/304 325/355/304
-f 358/388/305 303/321/305 302/319/305
-f 359/389/306 303/322/306 357/387/306
-f 303/321/307 354/384/307 75/78/307
-f 355/385/308 303/322/308 75/79/308
-f 75/78/309 316/342/309 76/80/309
-f 317/343/310 75/79/310 76/81/310
-f 292/308/311 362/392/311 364/394/311
-f 363/393/312 293/310/312 365/395/312
-f 364/394/313 368/398/313 366/396/313
-f 369/399/314 365/395/314 367/397/314
-f 366/396/315 370/400/315 372/402/315
-f 371/401/316 367/397/316 373/403/316
-f 372/402/317 376/406/317 374/404/317
-f 377/407/318 373/403/318 375/405/318
-f 378/408/319 376/406/319 314/338/319
-f 379/409/320 377/407/320 375/405/320
-f 316/342/321 374/404/321 378/408/321
-f 375/405/322 317/343/322 379/409/322
-f 354/384/323 372/402/323 374/404/323
-f 373/403/324 355/385/324 375/405/324
-f 356/386/325 366/396/325 372/402/325
-f 367/397/326 357/387/326 373/403/326
-f 358/388/327 364/394/327 366/396/327
-f 365/395/328 359/389/328 367/397/328
-f 292/308/329 360/390/329 290/304/329
-f 293/310/330 361/391/330 365/395/330
-f 360/390/331 302/319/331 74/76/331
-f 361/391/332 302/320/332 359/389/332
-f 284/292/333 288/300/333 290/304/333
-f 289/302/334 285/294/334 291/306/334
-f 284/292/335 360/390/335 74/76/335
-f 361/391/336 285/294/336 74/77/336
-f 73/74/337 284/292/337 74/76/337
-f 74/77/338 285/294/338 73/75/338
-f 296/313/339 362/392/339 294/311/339
-f 297/314/340 363/393/340 311/335/340
-f 310/334/341 368/398/341 362/392/341
-f 369/399/342 311/335/342 363/393/342
-f 312/336/343 370/400/343 368/398/343
-f 371/401/344 313/337/344 369/399/344
-f 376/406/345 382/413/345 314/338/345
-f 377/407/346 383/414/346 371/401/346
-f 350/380/347 384/417/347 348/378/347
-f 351/381/348 385/418/348 387/420/348
-f 384/417/349 320/346/349 318/344/349
-f 385/418/350 321/348/350 387/420/350
-f 298/315/351 384/417/351 318/344/351
-f 385/418/352 299/316/352 319/345/352
-f 300/317/353 342/372/353 384/417/353
-f 343/373/354 301/318/354 385/418/354
-f 342/372/355 348/378/355 384/417/355
-f 385/418/356 349/379/356 343/373/356
-f 300/317/357 346/376/357 344/374/357
-f 345/375/358 347/377/358 301/318/358
-f 322/350/359 378/408/359 314/338/359
-f 323/352/360 379/409/360 381/411/360
-f 378/408/361 324/354/361 316/342/361
-f 379/409/362 325/355/362 381/411/362
-f 386/419/363 322/350/363 320/346/363
-f 387/420/364 323/352/364 381/411/364
-f 352/382/365 386/419/365 350/380/365
-f 353/383/366 387/420/366 381/411/366
-f 324/354/367 380/410/367 352/382/367
-f 353/383/368 381/411/368 325/355/368
-f 388/422/369 402/442/369 400/438/369
-f 389/424/370 403/443/370 415/455/370
-f 400/438/371 404/444/371 398/434/371
-f 405/445/372 401/440/372 399/436/372
-f 404/444/373 396/432/373 398/434/373
-f 405/445/374 397/433/374 407/447/374
-f 406/446/375 394/430/375 396/432/375
-f 407/447/376 395/431/376 409/449/376
-f 408/448/377 392/428/377 394/430/377
-f 409/449/378 393/429/378 411/451/378
-f 392/428/379 412/452/379 390/426/379
-f 413/453/380 393/429/380 391/427/380
-f 410/450/381 418/458/381 412/452/381
-f 419/459/382 411/451/382 413/453/382
-f 408/448/383 420/460/383 410/450/383
-f 421/461/384 409/449/384 411/451/384
-f 424/464/385 408/448/385 406/446/385
-f 425/465/386 409/449/386 423/463/386
-f 426/466/387 406/446/387 404/444/387
-f 427/467/388 407/447/388 425/465/388
-f 428/468/389 404/444/389 402/442/389
-f 429/469/390 405/445/390 427/467/390
-f 402/442/391 416/456/391 428/468/391
-f 417/457/392 403/443/392 429/469/392
-f 320/346/393 442/484/393 318/344/393
-f 321/348/394 443/485/394 445/488/394
-f 390/426/395 444/487/395 320/347/395
-f 391/427/396 445/489/396 413/453/396
-f 310/334/397 442/484/397 312/336/397
-f 443/485/398 311/335/398 313/337/398
-f 382/412/399 414/454/399 388/422/399
-f 415/455/400 383/415/400 389/424/400
-f 412/452/401 440/482/401 444/487/401
-f 441/483/402 413/453/402 445/489/402
-f 446/490/403 440/482/403 438/480/403
-f 447/493/404 441/483/404 445/489/404
-f 434/476/135 438/480/135 436/478/135
-f 439/481/135 435/477/135 437/479/135
-f 448/494/405 434/476/405 432/474/405
-f 449/496/406 435/477/406 447/493/406
-f 448/494/407 450/498/407 430/470/407
-f 449/496/408 451/499/408 433/475/408
-f 430/470/409 416/456/409 414/454/409
-f 431/472/410 417/457/410 451/499/410
-f 312/336/411 430/471/411 382/413/411
-f 431/473/412 313/337/412 383/414/412
-f 442/484/413 448/495/413 312/336/413
-f 443/485/414 449/497/414 447/492/414
-f 442/484/415 444/486/415 446/491/415
-f 447/492/416 445/488/416 443/485/416
-f 416/456/417 452/500/417 476/524/417
-f 453/501/418 417/457/418 477/525/418
-f 432/474/419 452/500/419 450/498/419
-f 433/475/420 453/501/420 463/511/420
-f 432/474/421 460/508/421 462/510/421
-f 461/509/422 433/475/422 463/511/422
-f 436/478/423 460/508/423 434/476/423
-f 437/479/424 461/509/424 459/507/424
-f 438/480/425 458/506/425 436/478/425
-f 439/481/426 459/507/426 457/505/426
-f 438/480/427 454/502/427 456/504/427
-f 455/503/428 439/481/428 457/505/428
-f 440/482/429 474/522/429 454/502/429
-f 475/523/429 441/483/429 455/503/429
-f 428/468/430 476/524/430 464/512/430
-f 477/525/431 429/469/431 465/513/431
-f 426/466/432 464/512/432 466/514/432
-f 465/513/433 427/467/433 467/515/433
-f 424/464/434 466/514/434 468/516/434
-f 467/515/435 425/465/435 469/517/435
-f 424/464/436 470/518/436 422/462/436
-f 425/465/437 471/519/437 469/517/437
-f 422/462/438 472/520/438 420/460/438
-f 423/463/439 473/521/439 471/519/439
-f 420/460/440 474/522/440 418/458/440
-f 421/461/441 475/523/441 473/521/441
-f 456/504/442 478/526/442 458/506/442
-f 457/505/443 479/527/443 481/529/443
-f 480/528/444 484/532/444 478/526/444
-f 481/529/445 485/533/445 483/531/445
-f 484/532/446 488/536/446 486/534/446
-f 489/537/447 485/533/447 487/535/447
-f 488/536/448 492/540/448 486/534/448
-f 489/537/449 493/541/449 491/539/449
-f 464/512/450 486/534/450 492/540/450
-f 487/535/451 465/513/451 493/541/451
-f 484/532/452 476/524/452 452/500/452
-f 485/533/453 477/525/453 487/535/453
-f 462/510/454 484/532/454 452/500/454
-f 463/511/455 485/533/455 479/527/455
-f 458/506/135 462/510/135 460/508/135
-f 463/511/135 459/507/135 461/509/135
-f 474/522/456 456/504/456 454/502/456
-f 475/523/457 457/505/457 481/529/457
-f 472/520/458 480/528/458 474/522/458
-f 481/529/459 473/521/459 475/523/459
-f 488/536/460 472/520/460 470/518/460
-f 489/537/461 473/521/461 483/531/461
-f 490/538/462 470/518/462 468/516/462
-f 491/539/463 471/519/463 489/537/463
-f 466/514/464 490/538/464 468/516/464
-f 491/539/465 467/515/465 469/517/465
-f 464/512/466 492/540/466 466/514/466
-f 467/515/467 493/541/467 465/513/467
-f 392/428/468 504/552/468 502/550/468
-f 505/553/469 393/429/469 503/551/469
-f 394/430/470 502/550/470 500/548/470
-f 503/551/471 395/431/471 501/549/471
-f 394/430/472 498/546/472 396/432/472
-f 395/431/473 499/547/473 501/549/473
-f 396/432/474 496/544/474 398/435/474
-f 397/433/475 497/545/475 499/547/475
-f 398/435/476 494/542/476 400/439/476
-f 399/437/477 495/543/477 497/545/477
-f 400/439/478 506/555/478 388/421/478
-f 401/441/479 507/556/479 495/543/479
-f 502/550/480 506/555/480 494/542/480
-f 503/551/481 507/556/481 505/553/481
-f 494/542/482 500/548/482 502/550/482
-f 501/549/483 495/543/483 503/551/483
-f 496/544/484 498/546/484 500/548/484
-f 501/549/485 499/547/485 497/545/485
-f 382/413/486 506/554/486 314/338/486
-f 383/416/487 507/556/487 389/425/487
-f 314/339/488 504/552/488 322/351/488
-f 505/553/489 315/341/489 323/353/489
-f 320/347/490 504/552/490 390/426/490
-f 505/553/491 321/349/491 391/427/491
-f 47/47/492 1/1/492 3/3/492
-f 4/4/493 2/2/493 48/48/493
-f 45/45/494 3/3/494 5/5/494
-f 6/6/495 4/4/495 46/46/495
-f 3/3/496 9/9/496 7/7/496
-f 8/8/497 10/10/497 4/4/497
-f 1/1/498 11/11/498 9/9/498
-f 10/10/499 12/12/499 2/2/499
-f 11/11/500 13/13/500 15/15/500
-f 16/16/501 14/14/501 12/12/501
-f 9/9/502 15/15/502 17/17/502
-f 18/18/503 16/16/503 10/10/503
-f 21/21/504 19/19/504 17/17/504
-f 22/22/505 16/16/505 18/18/505
-f 13/13/506 23/23/506 21/21/506
-f 22/22/507 24/24/507 14/14/507
-f 23/23/508 25/25/508 27/27/508
-f 28/28/509 26/26/509 24/24/509
-f 27/27/510 29/29/510 19/19/510
-f 28/28/511 22/22/511 20/20/511
-f 33/33/512 31/31/512 29/29/512
-f 34/34/513 28/28/513 30/30/513
-f 35/35/514 33/33/514 27/27/514
-f 36/36/515 26/26/515 28/28/515
-f 37/37/516 39/39/516 33/33/516
-f 38/38/517 36/36/517 34/34/517
-f 39/39/518 41/41/518 31/31/518
-f 40/40/519 34/34/519 32/32/519
-f 45/45/520 43/43/520 41/41/520
-f 46/46/521 40/40/521 42/42/521
-f 47/47/522 45/45/522 39/39/522
-f 48/48/523 38/38/523 40/40/523
-f 37/37/524 51/51/524 49/49/524
-f 38/38/525 48/48/525 50/50/525
-f 35/35/526 53/53/526 51/51/526
-f 36/36/527 38/38/527 52/52/527
-f 25/25/528 55/55/528 53/53/528
-f 26/26/529 36/36/529 54/54/529
-f 23/23/530 57/57/530 55/55/530
-f 24/24/531 26/26/531 56/56/531
-f 23/23/532 13/13/532 59/59/532
-f 60/60/533 14/14/533 24/24/533
-f 13/13/534 11/11/534 63/63/534
-f 64/64/535 12/12/535 14/14/535
-f 11/11/536 1/1/536 65/65/536
-f 66/66/537 2/2/537 12/12/537
-f 1/1/538 47/47/538 49/49/538
-f 50/50/539 48/48/539 2/2/539
-f 174/181/540 176/183/540 91/98/540
-f 175/182/541 90/97/541 91/98/541
-f 172/179/542 174/181/542 89/96/542
-f 173/180/543 88/95/543 90/97/543
-f 85/92/544 170/177/544 172/179/544
-f 173/180/545 171/178/545 86/93/545
-f 83/90/546 168/175/546 170/177/546
-f 171/178/547 169/176/547 84/91/547
-f 81/88/548 166/173/548 168/175/548
-f 169/176/549 167/174/549 82/89/549
-f 79/86/550 92/99/550 146/153/550
-f 147/154/551 93/100/551 80/87/551
-f 94/101/552 148/155/552 146/153/552
-f 95/102/553 93/100/553 147/154/553
-f 94/101/554 96/103/554 150/157/554
-f 151/158/555 97/104/555 95/102/555
-f 98/105/556 152/159/556 150/157/556
-f 99/106/557 97/104/557 151/158/557
-f 100/107/558 154/161/558 152/159/558
-f 101/108/559 99/106/559 153/160/559
-f 102/109/560 156/163/560 154/161/560
-f 103/110/561 101/108/561 155/162/561
-f 102/109/562 104/111/562 158/165/562
-f 159/166/563 105/112/563 103/110/563
-f 106/113/564 160/167/564 158/165/564
-f 107/114/565 105/112/565 159/166/565
-f 108/115/566 162/169/566 160/167/566
-f 109/116/567 107/114/567 161/168/567
-f 67/67/568 68/68/568 162/169/568
-f 67/67/569 109/116/569 163/170/569
-f 128/135/570 160/167/570 162/169/570
-f 129/136/571 111/118/571 163/170/571
-f 128/135/572 179/186/572 158/165/572
-f 159/166/573 180/187/573 129/136/573
-f 156/163/574 158/165/574 179/186/574
-f 157/164/575 127/134/575 180/187/575
-f 154/161/576 156/163/576 126/133/576
-f 155/162/577 125/132/577 127/134/577
-f 152/159/578 154/161/578 124/131/578
-f 153/160/579 123/130/579 125/132/579
-f 150/157/580 152/159/580 122/129/580
-f 151/158/581 121/128/581 123/130/581
-f 148/155/582 150/157/582 120/127/582
-f 149/156/583 119/126/583 121/128/583
-f 146/153/584 148/155/584 118/125/584
-f 147/154/585 117/124/585 119/126/585
-f 164/171/586 146/153/586 116/123/586
-f 165/172/587 115/122/587 117/124/587
-f 114/121/588 181/188/588 177/184/588
-f 177/184/589 182/189/589 115/122/589
-f 162/169/590 68/68/590 112/119/590
-f 163/170/591 111/118/591 113/120/591
-f 112/119/592 68/68/592 178/185/592
-f 178/185/593 68/68/593 113/120/593
-f 181/188/594 183/190/594 178/185/594
-f 182/189/595 177/184/595 178/185/595
-f 135/142/596 137/144/596 176/183/596
-f 176/183/597 137/144/597 136/143/597
-f 133/140/598 135/142/598 174/181/598
-f 175/182/599 136/143/599 134/141/599
-f 133/140/600 172/179/600 170/177/600
-f 134/141/601 132/139/601 171/178/601
-f 166/173/602 187/194/602 185/192/602
-f 186/193/603 188/195/603 167/174/603
-f 131/138/604 170/177/604 168/175/604
-f 169/176/605 171/178/605 132/139/605
-f 190/197/132 189/196/132 187/194/132
-f 190/197/606 145/152/606 188/195/606
-f 187/194/134 189/196/134 69/69/134
-f 188/195/607 186/193/607 69/69/607
-f 131/138/135 185/192/135 69/69/135
-f 132/139/135 130/137/135 69/69/135
-f 142/149/608 193/200/608 191/198/608
-f 192/199/609 194/201/609 143/150/609
-f 140/147/610 195/202/610 193/200/610
-f 194/201/611 196/203/611 141/148/611
-f 197/204/612 195/202/612 140/147/612
-f 198/205/613 139/146/613 141/148/613
-f 71/71/614 197/204/614 139/146/614
-f 144/151/615 191/198/615 70/70/615
-f 145/152/616 190/197/616 70/70/616
-f 191/198/146 206/213/146 208/215/146
-f 192/199/147 70/70/147 208/215/147
-f 71/71/617 199/206/617 200/207/617
-f 201/208/618 199/206/618 71/71/618
-f 197/204/619 200/207/619 202/209/619
-f 203/210/620 201/208/620 198/205/620
-f 202/209/621 204/211/621 193/200/621
-f 203/210/622 196/203/622 194/201/622
-f 193/200/623 204/211/623 206/213/623
-f 207/214/624 205/212/624 194/201/624
-f 204/211/625 202/209/625 200/207/625
-f 205/212/626 199/206/626 201/208/626
-f 199/206/627 208/215/627 206/213/627
-f 207/214/628 208/215/628 199/206/628
-f 139/146/629 140/147/629 164/171/629
-f 165/172/630 141/148/630 139/146/630
-f 140/147/631 142/149/631 211/218/631
-f 212/219/632 143/150/632 141/148/632
-f 144/151/633 213/220/633 211/218/633
-f 145/152/634 143/150/634 212/219/634
-f 187/194/635 166/173/635 213/220/635
-f 188/195/636 145/152/636 214/221/636
-f 209/216/637 213/220/637 166/173/637
-f 210/217/638 82/89/638 167/174/638
-f 215/222/639 211/218/639 213/220/639
-f 216/223/640 210/217/640 214/221/640
-f 79/86/641 164/171/641 211/218/641
-f 212/219/642 165/172/642 80/87/642
-f 130/137/643 72/72/643 222/229/643
-f 130/137/644 132/139/644 223/230/644
-f 133/140/645 131/138/645 222/229/645
-f 223/230/646 132/139/646 134/141/646
-f 135/142/647 133/140/647 220/227/647
-f 221/228/648 134/141/648 136/143/648
-f 137/144/649 135/142/649 218/225/649
-f 219/226/650 136/143/650 137/144/650
-f 218/225/180 229/236/180 231/238/180
-f 219/226/181 217/224/181 231/238/181
-f 218/225/651 220/227/651 227/234/651
-f 228/235/652 221/228/652 219/226/652
-f 220/227/142 222/229/142 225/232/142
-f 226/233/184 223/230/184 221/228/184
-f 72/72/185 224/231/185 225/232/185
-f 72/72/186 223/230/186 226/233/186
-f 224/231/653 231/238/653 229/236/653
-f 230/237/654 231/238/654 224/231/654
-f 183/190/655 181/188/655 234/241/655
-f 235/242/656 182/189/656 184/191/656
-f 112/119/657 183/190/657 232/239/657
-f 233/240/658 184/191/658 113/120/658
-f 112/119/659 254/261/659 256/263/659
-f 113/120/660 111/118/660 257/264/660
-f 114/121/661 252/259/661 234/241/661
-f 115/122/662 182/189/662 235/242/662
-f 114/121/663 116/123/663 250/257/663
-f 251/258/664 117/124/664 115/122/664
-f 116/123/665 118/125/665 248/255/665
-f 249/256/666 119/126/666 117/124/666
-f 118/125/667 120/127/667 246/253/667
-f 247/254/668 121/128/668 119/126/668
-f 120/127/669 122/129/669 244/251/669
-f 245/252/670 123/130/670 121/128/670
-f 124/131/671 242/249/671 244/251/671
-f 125/132/672 123/130/672 245/252/672
-f 126/133/673 240/247/673 242/249/673
-f 127/134/674 125/132/674 243/250/674
-f 126/133/675 179/186/675 236/243/675
-f 237/244/676 180/187/676 127/134/676
-f 179/186/677 128/135/677 238/245/677
-f 239/246/678 129/136/678 180/187/678
-f 128/135/679 110/117/679 256/263/679
-f 257/264/680 111/118/680 129/136/680
-f 256/263/681 258/265/681 276/283/681
-f 257/264/682 239/246/682 277/284/682
-f 236/243/683 238/245/683 276/283/683
-f 277/284/684 239/246/684 237/244/684
-f 236/243/685 278/285/685 274/281/685
-f 237/244/686 241/248/686 275/282/686
-f 240/247/687 274/281/687 272/279/687
-f 241/248/688 243/250/688 273/280/688
-f 244/251/689 242/249/689 272/279/689
-f 273/280/690 243/250/690 245/252/690
-f 244/251/691 270/277/691 268/275/691
-f 245/252/692 247/254/692 269/276/692
-f 248/255/693 246/253/693 268/275/693
-f 269/276/694 247/254/694 249/256/694
-f 248/255/695 266/273/695 264/271/695
-f 249/256/696 251/258/696 265/272/696
-f 250/257/697 264/271/697 262/269/697
-f 251/258/698 253/260/698 263/270/698
-f 234/241/235 252/259/235 262/269/235
-f 263/270/236 253/260/236 235/242/236
-f 256/263/699 254/261/699 260/267/699
-f 261/268/700 255/262/700 257/264/700
-f 254/261/701 232/239/701 282/289/701
-f 283/290/702 233/240/702 255/262/702
-f 232/239/703 234/241/703 280/287/703
-f 281/288/704 235/242/704 233/240/704
-f 67/67/705 108/115/705 284/291/705
-f 285/293/706 109/116/706 67/67/706
-f 108/115/707 106/113/707 286/295/707
-f 287/297/708 107/114/708 109/116/708
-f 104/111/709 288/299/709 286/295/709
-f 105/112/710 107/114/710 287/297/710
-f 102/109/711 290/303/711 288/299/711
-f 103/110/712 105/112/712 289/301/712
-f 100/107/713 292/307/713 290/303/713
-f 101/108/714 103/110/714 291/305/714
-f 100/107/715 98/105/715 294/311/715
-f 295/312/716 99/106/716 101/108/716
-f 96/103/717 296/313/717 294/311/717
-f 97/104/718 99/106/718 295/312/718
-f 96/103/719 94/101/719 298/315/719
-f 299/316/720 95/102/720 97/104/720
-f 94/101/721 92/99/721 300/317/721
-f 301/318/722 93/100/722 95/102/722
-f 309/332/723 328/358/723 338/368/723
-f 309/333/724 308/331/724 339/369/724
-f 308/330/725 338/368/725 336/366/725
-f 308/331/726 307/329/726 337/367/726
-f 307/328/727 336/366/727 340/370/727
-f 307/329/728 306/327/728 341/371/728
-f 89/96/729 91/98/729 306/327/729
-f 306/327/730 91/98/730 90/97/730
-f 87/94/731 89/96/731 340/370/731
-f 341/371/732 90/97/732 88/95/732
-f 85/92/733 87/94/733 334/364/733
-f 335/365/734 88/95/734 86/93/734
-f 83/90/735 85/92/735 330/360/735
-f 331/361/736 86/93/736 84/91/736
-f 330/360/737 336/366/737 338/368/737
-f 339/369/738 337/367/738 331/361/738
-f 334/364/739 340/370/739 336/366/739
-f 335/365/740 331/361/740 337/367/740
-f 332/362/741 338/368/741 328/358/741
-f 333/363/742 327/357/742 329/359/742
-f 81/88/743 83/90/743 332/362/743
-f 333/363/744 84/91/744 82/89/744
-f 342/372/745 344/374/745 215/222/745
-f 343/373/746 210/217/746 216/223/746
-f 326/356/747 342/372/747 209/216/747
-f 327/357/748 82/89/748 210/217/748
-f 215/222/749 344/374/749 346/376/749
-f 216/223/750 80/87/750 347/377/750
-f 346/376/751 300/317/751 92/99/751
-f 347/377/752 80/87/752 93/100/752
-f 324/354/753 352/382/753 304/323/753
-f 325/355/754 77/83/754 304/324/754
-f 352/382/755 350/380/755 78/84/755
-f 353/383/756 304/324/756 78/85/756
-f 78/84/757 350/380/757 348/378/757
-f 349/379/758 351/381/758 78/85/758
-f 305/325/759 348/378/759 328/358/759
-f 329/359/760 349/379/760 305/326/760
-f 328/358/761 348/378/761 342/372/761
-f 329/359/762 327/357/762 343/373/762
-f 296/313/763 298/315/763 318/344/763
-f 319/345/764 299/316/764 297/314/764
-f 316/342/765 324/354/765 77/82/765
-f 317/343/766 76/81/766 77/83/766
-f 358/388/767 356/386/767 303/321/767
-f 359/389/768 302/320/768 303/322/768
-f 303/321/769 356/386/769 354/384/769
-f 355/385/770 357/387/770 303/322/770
-f 75/78/771 354/384/771 316/342/771
-f 317/343/772 355/385/772 75/79/772
-f 292/308/773 294/311/773 362/392/773
-f 363/393/774 295/312/774 293/310/774
-f 364/394/775 362/392/775 368/398/775
-f 369/399/776 363/393/776 365/395/776
-f 366/396/777 368/398/777 370/400/777
-f 371/401/778 369/399/778 367/397/778
-f 372/402/779 370/400/779 376/406/779
-f 377/407/780 371/401/780 373/403/780
-f 378/408/781 374/404/781 376/406/781
-f 379/409/782 315/340/782 377/407/782
-f 316/342/783 354/384/783 374/404/783
-f 375/405/784 355/385/784 317/343/784
-f 354/384/785 356/386/785 372/402/785
-f 373/403/786 357/387/786 355/385/786
-f 356/386/787 358/388/787 366/396/787
-f 367/397/788 359/389/788 357/387/788
-f 358/388/789 360/390/789 364/394/789
-f 365/395/790 361/391/790 359/389/790
-f 292/308/791 364/394/791 360/390/791
-f 293/310/792 291/306/792 361/391/792
-f 360/390/793 358/388/793 302/319/793
-f 361/391/794 74/77/794 302/320/794
-f 284/292/795 286/296/795 288/300/795
-f 289/302/796 287/298/796 285/294/796
-f 284/292/797 290/304/797 360/390/797
-f 361/391/798 291/306/798 285/294/798
-f 296/313/799 310/334/799 362/392/799
-f 297/314/800 295/312/800 363/393/800
-f 310/334/801 312/336/801 368/398/801
-f 369/399/802 313/337/802 311/335/802
-f 312/336/803 382/413/803 370/400/803
-f 371/401/804 383/414/804 313/337/804
-f 376/406/805 370/400/805 382/413/805
-f 377/407/806 315/340/806 383/414/806
-f 350/380/807 386/419/807 384/417/807
-f 351/381/808 349/379/808 385/418/808
-f 384/417/809 386/419/809 320/346/809
-f 385/418/810 319/345/810 321/348/810
-f 298/315/811 300/317/811 384/417/811
-f 385/418/812 301/318/812 299/316/812
-f 300/317/813 344/374/813 342/372/813
-f 343/373/814 345/375/814 301/318/814
-f 322/350/815 380/410/815 378/408/815
-f 323/352/816 315/340/816 379/409/816
-f 378/408/817 380/410/817 324/354/817
-f 379/409/818 317/343/818 325/355/818
-f 386/419/819 380/410/819 322/350/819
-f 387/420/820 321/348/820 323/352/820
-f 352/382/821 380/410/821 386/419/821
-f 353/383/822 351/381/822 387/420/822
-f 388/422/823 414/454/823 402/442/823
-f 389/424/824 401/440/824 403/443/824
-f 400/438/825 402/442/825 404/444/825
-f 405/445/826 403/443/826 401/440/826
-f 404/444/827 406/446/827 396/432/827
-f 405/445/828 399/436/828 397/433/828
-f 406/446/829 408/448/829 394/430/829
-f 407/447/830 397/433/830 395/431/830
-f 408/448/831 410/450/831 392/428/831
-f 409/449/832 395/431/832 393/429/832
-f 392/428/833 410/450/833 412/452/833
-f 413/453/834 411/451/834 393/429/834
-f 410/450/835 420/460/835 418/458/835
-f 419/459/836 421/461/836 411/451/836
-f 408/448/837 422/462/837 420/460/837
-f 421/461/838 423/463/838 409/449/838
-f 424/464/839 422/462/839 408/448/839
-f 425/465/840 407/447/840 409/449/840
-f 426/466/841 424/464/841 406/446/841
-f 427/467/842 405/445/842 407/447/842
-f 428/468/843 426/466/843 404/444/843
-f 429/469/844 403/443/844 405/445/844
-f 402/442/845 414/454/845 416/456/845
-f 417/457/846 415/455/846 403/443/846
-f 320/346/847 444/486/847 442/484/847
-f 321/348/848 319/345/848 443/485/848
-f 390/426/849 412/452/849 444/487/849
-f 391/427/850 321/349/850 445/489/850
-f 310/334/851 318/344/851 442/484/851
-f 443/485/852 319/345/852 311/335/852
-f 382/412/853 430/470/853 414/454/853
-f 415/455/854 431/472/854 383/415/854
-f 412/452/855 418/458/855 440/482/855
-f 441/483/856 419/459/856 413/453/856
-f 446/490/857 444/487/857 440/482/857
-f 447/493/858 439/481/858 441/483/858
-f 434/476/859 446/490/859 438/480/859
-f 439/481/860 447/493/860 435/477/860
-f 448/494/861 446/490/861 434/476/861
-f 449/496/862 433/475/862 435/477/862
-f 448/494/863 432/474/863 450/498/863
-f 449/496/864 431/472/864 451/499/864
-f 430/470/865 450/498/865 416/456/865
-f 431/472/866 415/455/866 417/457/866
-f 312/336/867 448/495/867 430/471/867
-f 431/473/868 449/497/868 313/337/868
-f 442/484/869 446/491/869 448/495/869
-f 443/485/870 313/337/870 449/497/870
-f 416/456/871 450/498/871 452/500/871
-f 453/501/872 451/499/872 417/457/872
-f 432/474/873 462/510/873 452/500/873
-f 433/475/874 451/499/874 453/501/874
-f 432/474/421 434/476/421 460/508/421
-f 461/509/422 435/477/422 433/475/422
-f 436/478/875 458/506/875 460/508/875
-f 437/479/876 435/477/876 461/509/876
-f 438/480/877 456/504/877 458/506/877
-f 439/481/878 437/479/878 459/507/878
-f 438/480/879 440/482/879 454/502/879
-f 455/503/880 441/483/880 439/481/880
-f 440/482/881 418/458/881 474/522/881
-f 475/523/882 419/459/882 441/483/882
-f 428/468/883 416/456/883 476/524/883
-f 477/525/884 417/457/884 429/469/884
-f 426/466/885 428/468/885 464/512/885
-f 465/513/886 429/469/886 427/467/886
-f 424/464/887 426/466/887 466/514/887
-f 467/515/888 427/467/888 425/465/888
-f 424/464/889 468/516/889 470/518/889
-f 425/465/890 423/463/890 471/519/890
-f 422/462/891 470/518/891 472/520/891
-f 423/463/892 421/461/892 473/521/892
-f 420/460/893 472/520/893 474/522/893
-f 421/461/894 419/459/894 475/523/894
-f 456/504/895 480/528/895 478/526/895
-f 457/505/896 459/507/896 479/527/896
-f 480/528/897 482/530/897 484/532/897
-f 481/529/898 479/527/898 485/533/898
-f 484/532/899 482/530/899 488/536/899
-f 489/537/900 483/531/900 485/533/900
-f 488/536/901 490/538/901 492/540/901
-f 489/537/902 487/535/902 493/541/902
-f 464/512/903 476/524/903 486/534/903
-f 487/535/904 477/525/904 465/513/904
-f 484/532/905 486/534/905 476/524/905
-f 485/533/906 453/501/906 477/525/906
-f 462/510/907 478/526/907 484/532/907
-f 463/511/908 453/501/908 485/533/908
-f 458/506/909 478/526/909 462/510/909
-f 463/511/910 479/527/910 459/507/910
-f 474/522/911 480/528/911 456/504/911
-f 475/523/912 455/503/912 457/505/912
-f 472/520/913 482/530/913 480/528/913
-f 481/529/914 483/531/914 473/521/914
-f 488/536/915 482/530/915 472/520/915
-f 489/537/916 471/519/916 473/521/916
-f 490/538/917 488/536/917 470/518/917
-f 491/539/918 469/517/918 471/519/918
-f 466/514/919 492/540/919 490/538/919
-f 491/539/920 493/541/920 467/515/920
-f 392/428/921 390/426/921 504/552/921
-f 505/553/922 391/427/922 393/429/922
-f 394/430/923 392/428/923 502/550/923
-f 503/551/924 393/429/924 395/431/924
-f 394/430/925 500/548/925 498/546/925
-f 395/431/926 397/433/926 499/547/926
-f 396/432/927 498/546/927 496/544/927
-f 397/433/928 399/437/928 497/545/928
-f 398/435/929 496/544/929 494/542/929
-f 399/437/930 401/441/930 495/543/930
-f 400/439/931 494/542/931 506/555/931
-f 401/441/932 389/425/932 507/556/932
-f 502/550/933 504/552/933 506/555/933
-f 503/551/934 495/543/934 507/556/934
-f 494/542/935 496/544/935 500/548/935
-f 501/549/936 497/545/936 495/543/936
-f 382/413/937 388/423/937 506/554/937
-f 383/416/938 315/341/938 507/556/938
-f 314/339/939 506/555/939 504/552/939
-f 505/553/940 507/556/940 315/341/940
-f 320/347/941 322/351/941 504/552/941
-f 505/553/942 323/353/942 321/349/942
diff --git a/assets/plane.obj b/assets/plane.obj
deleted file mode 100644
index a602253..0000000
--- a/assets/plane.obj
+++ /dev/null
@@ -1,15 +0,0 @@
-# Blender 3.3.1
-# www.blender.org
-mtllib plane.mtl
-o Plane
-v 1.000000 0.000000 -1.000000
-v -1.000000 0.000000 -1.000000
-v 1.000000 0.000000 1.000000
-v -1.000000 0.000000 1.000000
-vn -0.0000 1.0000 -0.0000
-vt 0.000000 0.000000
-vt 1.000000 0.000000
-vt 0.000000 1.000000
-vt 1.000000 1.000000
-s 0
-f 1/1/1 2/2/1 4/4/1 3/3/1
diff --git a/assets/sphere.obj b/assets/sphere.obj
deleted file mode 100644
index 0918607..0000000
--- a/assets/sphere.obj
+++ /dev/null
@@ -1,2488 +0,0 @@
-# Blender 3.3.1
-# www.blender.org
-mtllib sphere.mtl
-o Sphere
-v 0.000000 0.831470 0.555570
-v 0.000000 0.555570 0.831470
-v 0.000000 0.195090 0.980785
-v 0.000000 0.000000 1.000000
-v 0.000000 -0.195090 0.980785
-v 0.000000 -0.555570 0.831470
-v -0.038060 0.980785 0.191342
-v -0.074658 0.923880 0.375330
-v -0.108386 0.831470 0.544895
-v -0.137950 0.707107 0.693520
-v -0.162212 0.555570 0.815493
-v -0.180240 0.382683 0.906127
-v -0.191342 0.195090 0.961940
-v -0.195090 0.000000 0.980785
-v -0.191342 -0.195090 0.961940
-v -0.180240 -0.382683 0.906127
-v -0.162212 -0.555570 0.815493
-v -0.137950 -0.707107 0.693520
-v -0.108386 -0.831470 0.544895
-v -0.074658 -0.923880 0.375330
-v -0.038060 -0.980785 0.191342
-v -0.074658 0.980785 0.180240
-v -0.146447 0.923880 0.353553
-v -0.212608 0.831470 0.513280
-v -0.270598 0.707107 0.653281
-v -0.318190 0.555570 0.768178
-v -0.353553 0.382683 0.853553
-v -0.375330 0.195090 0.906127
-v -0.382683 0.000000 0.923879
-v -0.375330 -0.195090 0.906127
-v -0.353553 -0.382683 0.853553
-v -0.318190 -0.555570 0.768178
-v -0.270598 -0.707107 0.653281
-v -0.212608 -0.831470 0.513280
-v -0.146447 -0.923880 0.353553
-v -0.074658 -0.980785 0.180240
-v -0.108386 0.980785 0.162212
-v -0.212608 0.923880 0.318190
-v -0.308658 0.831470 0.461940
-v -0.392847 0.707107 0.587938
-v -0.461940 0.555570 0.691342
-v -0.513280 0.382683 0.768178
-v -0.544895 0.195090 0.815493
-v -0.555570 0.000000 0.831469
-v -0.544895 -0.195090 0.815493
-v -0.513280 -0.382683 0.768178
-v -0.461940 -0.555570 0.691342
-v -0.392847 -0.707107 0.587938
-v -0.308658 -0.831470 0.461940
-v -0.212608 -0.923880 0.318190
-v -0.108386 -0.980785 0.162212
-v -0.137950 0.980785 0.137950
-v -0.270598 0.923880 0.270598
-v -0.392847 0.831470 0.392847
-v -0.500000 0.707107 0.500000
-v -0.587938 0.555570 0.587938
-v -0.653281 0.382683 0.653281
-v -0.693520 0.195090 0.693520
-v -0.707107 0.000000 0.707107
-v -0.693520 -0.195090 0.693520
-v -0.653281 -0.382683 0.653281
-v -0.587938 -0.555570 0.587938
-v -0.500000 -0.707107 0.500000
-v -0.392847 -0.831470 0.392847
-v -0.270598 -0.923880 0.270598
-v -0.137950 -0.980785 0.137950
-v -0.162212 0.980785 0.108386
-v -0.318190 0.923880 0.212608
-v -0.461940 0.831470 0.308658
-v -0.587938 0.707107 0.392847
-v -0.691342 0.555570 0.461940
-v -0.768178 0.382683 0.513280
-v -0.815493 0.195090 0.544895
-v -0.831470 0.000000 0.555570
-v -0.815493 -0.195090 0.544895
-v -0.768178 -0.382683 0.513280
-v -0.691342 -0.555570 0.461940
-v -0.587938 -0.707107 0.392847
-v -0.461940 -0.831470 0.308658
-v -0.318190 -0.923880 0.212608
-v -0.162212 -0.980785 0.108386
-v 0.000000 1.000000 0.000000
-v -0.180240 0.980785 0.074658
-v -0.353553 0.923880 0.146447
-v -0.513280 0.831470 0.212607
-v -0.653281 0.707107 0.270598
-v -0.768178 0.555570 0.318190
-v -0.853553 0.382683 0.353553
-v -0.906127 0.195090 0.375330
-v -0.923879 0.000000 0.382683
-v -0.906127 -0.195090 0.375330
-v -0.853553 -0.382683 0.353553
-v -0.768178 -0.555570 0.318190
-v -0.653281 -0.707107 0.270598
-v -0.513280 -0.831470 0.212607
-v -0.353553 -0.923880 0.146447
-v -0.180240 -0.980785 0.074658
-v -0.191342 0.980785 0.038060
-v -0.375330 0.923880 0.074658
-v -0.544895 0.831470 0.108386
-v -0.693520 0.707107 0.137950
-v -0.815493 0.555570 0.162212
-v -0.906127 0.382683 0.180240
-v -0.961940 0.195090 0.191342
-v -0.980785 0.000000 0.195090
-v -0.961940 -0.195090 0.191342
-v -0.906127 -0.382683 0.180240
-v -0.815493 -0.555570 0.162212
-v -0.693520 -0.707107 0.137950
-v -0.544895 -0.831470 0.108386
-v -0.375330 -0.923880 0.074658
-v -0.191342 -0.980785 0.038060
-v -0.195090 0.980785 -0.000000
-v -0.382683 0.923880 -0.000000
-v -0.555570 0.831470 -0.000000
-v -0.707107 0.707107 0.000000
-v -0.831469 0.555570 -0.000000
-v -0.923879 0.382683 0.000000
-v -0.980785 0.195090 -0.000000
-v -1.000000 0.000000 -0.000000
-v -0.980785 -0.195090 -0.000000
-v -0.923879 -0.382683 0.000000
-v -0.831469 -0.555570 -0.000000
-v -0.707107 -0.707107 0.000000
-v -0.555570 -0.831470 -0.000000
-v -0.382683 -0.923880 -0.000000
-v -0.195090 -0.980785 -0.000000
-v -0.191342 0.980785 -0.038060
-v -0.375330 0.923880 -0.074658
-v -0.544895 0.831470 -0.108386
-v -0.693520 0.707107 -0.137950
-v -0.815493 0.555570 -0.162212
-v -0.906127 0.382683 -0.180240
-v -0.961940 0.195090 -0.191342
-v -0.980785 0.000000 -0.195090
-v -0.961940 -0.195090 -0.191342
-v -0.906127 -0.382683 -0.180240
-v -0.815493 -0.555570 -0.162212
-v -0.693520 -0.707107 -0.137950
-v -0.544895 -0.831470 -0.108386
-v -0.375330 -0.923880 -0.074658
-v -0.191342 -0.980785 -0.038060
-v -0.180240 0.980785 -0.074658
-v -0.353553 0.923880 -0.146447
-v -0.513280 0.831470 -0.212608
-v -0.653281 0.707107 -0.270598
-v -0.768178 0.555570 -0.318190
-v -0.853553 0.382683 -0.353553
-v -0.906127 0.195090 -0.375330
-v -0.923879 0.000000 -0.382683
-v -0.906127 -0.195090 -0.375330
-v -0.853553 -0.382683 -0.353553
-v -0.768178 -0.555570 -0.318190
-v -0.653281 -0.707107 -0.270598
-v -0.513280 -0.831470 -0.212608
-v -0.353553 -0.923880 -0.146447
-v -0.180240 -0.980785 -0.074658
-v -0.162212 0.980785 -0.108386
-v -0.318190 0.923880 -0.212608
-v -0.461940 0.831470 -0.308658
-v -0.587938 0.707107 -0.392847
-v -0.691341 0.555570 -0.461940
-v -0.768178 0.382683 -0.513280
-v -0.815493 0.195090 -0.544895
-v -0.831469 0.000000 -0.555570
-v -0.815493 -0.195090 -0.544895
-v -0.768178 -0.382683 -0.513280
-v -0.691341 -0.555570 -0.461940
-v -0.587938 -0.707107 -0.392847
-v -0.461940 -0.831470 -0.308658
-v -0.318190 -0.923880 -0.212608
-v -0.162212 -0.980785 -0.108386
-v -0.137950 0.980785 -0.137950
-v -0.270598 0.923880 -0.270598
-v -0.392847 0.831470 -0.392847
-v -0.500000 0.707107 -0.500000
-v -0.587938 0.555570 -0.587938
-v -0.653281 0.382683 -0.653281
-v -0.693520 0.195090 -0.693520
-v -0.707106 0.000000 -0.707107
-v -0.693520 -0.195090 -0.693520
-v -0.653281 -0.382683 -0.653281
-v -0.587938 -0.555570 -0.587938
-v -0.500000 -0.707107 -0.500000
-v -0.392847 -0.831470 -0.392847
-v -0.270598 -0.923880 -0.270598
-v -0.137950 -0.980785 -0.137950
-v -0.108386 0.980785 -0.162212
-v -0.212607 0.923880 -0.318190
-v -0.308658 0.831470 -0.461940
-v -0.392847 0.707107 -0.587938
-v -0.461940 0.555570 -0.691342
-v -0.513280 0.382683 -0.768178
-v -0.544895 0.195090 -0.815493
-v -0.555570 0.000000 -0.831469
-v -0.544895 -0.195090 -0.815493
-v -0.513280 -0.382683 -0.768178
-v -0.461940 -0.555570 -0.691342
-v -0.392847 -0.707107 -0.587938
-v -0.308658 -0.831470 -0.461940
-v -0.212607 -0.923880 -0.318190
-v -0.108386 -0.980785 -0.162212
-v -0.074658 0.980785 -0.180240
-v -0.146447 0.923880 -0.353553
-v -0.212607 0.831470 -0.513280
-v -0.270598 0.707107 -0.653281
-v -0.318189 0.555570 -0.768178
-v -0.353553 0.382683 -0.853553
-v -0.375330 0.195090 -0.906127
-v -0.382683 0.000000 -0.923879
-v -0.375330 -0.195090 -0.906127
-v -0.353553 -0.382683 -0.853553
-v -0.318189 -0.555570 -0.768178
-v -0.270598 -0.707107 -0.653281
-v -0.212607 -0.831470 -0.513280
-v -0.146447 -0.923880 -0.353553
-v -0.074658 -0.980785 -0.180240
-v -0.038060 0.980785 -0.191342
-v -0.074658 0.923880 -0.375330
-v -0.108386 0.831470 -0.544895
-v -0.137950 0.707107 -0.693520
-v -0.162212 0.555570 -0.815493
-v -0.180240 0.382683 -0.906127
-v -0.191342 0.195090 -0.961939
-v -0.195090 0.000000 -0.980785
-v -0.191342 -0.195090 -0.961939
-v -0.180240 -0.382683 -0.906127
-v -0.162212 -0.555570 -0.815493
-v -0.137950 -0.707107 -0.693520
-v -0.108386 -0.831470 -0.544895
-v -0.074658 -0.923880 -0.375330
-v -0.038060 -0.980785 -0.191342
-v 0.000000 0.980785 -0.195090
-v 0.000000 0.923880 -0.382683
-v 0.000000 0.831470 -0.555570
-v 0.000000 0.707107 -0.707107
-v 0.000000 0.555570 -0.831469
-v -0.000000 0.382683 -0.923879
-v 0.000000 0.195090 -0.980785
-v 0.000000 0.000000 -0.999999
-v 0.000000 -0.195090 -0.980785
-v -0.000000 -0.382683 -0.923879
-v 0.000000 -0.555570 -0.831469
-v 0.000000 -0.707107 -0.707107
-v 0.000000 -0.831470 -0.555570
-v 0.000000 -0.923880 -0.382683
-v 0.000000 -0.980785 -0.195090
-v 0.038060 0.980785 -0.191342
-v 0.074658 0.923880 -0.375330
-v 0.108386 0.831470 -0.544895
-v 0.137950 0.707107 -0.693520
-v 0.162212 0.555570 -0.815493
-v 0.180240 0.382683 -0.906127
-v 0.191342 0.195090 -0.961939
-v 0.195091 0.000000 -0.980785
-v 0.191342 -0.195090 -0.961939
-v 0.180240 -0.382683 -0.906127
-v 0.162212 -0.555570 -0.815493
-v 0.137950 -0.707107 -0.693520
-v 0.108386 -0.831470 -0.544895
-v 0.074658 -0.923880 -0.375330
-v 0.038060 -0.980785 -0.191342
-v 0.074658 0.980785 -0.180240
-v 0.146447 0.923880 -0.353553
-v 0.212608 0.831470 -0.513280
-v 0.270598 0.707107 -0.653281
-v 0.318190 0.555570 -0.768177
-v 0.353553 0.382683 -0.853553
-v 0.375330 0.195090 -0.906127
-v 0.382683 0.000000 -0.923879
-v 0.375330 -0.195090 -0.906127
-v 0.353553 -0.382683 -0.853553
-v 0.318190 -0.555570 -0.768177
-v 0.270598 -0.707107 -0.653281
-v 0.212608 -0.831470 -0.513280
-v 0.146447 -0.923880 -0.353553
-v 0.074658 -0.980785 -0.180240
-v 0.108386 0.980785 -0.162212
-v 0.212608 0.923880 -0.318190
-v 0.308658 0.831470 -0.461939
-v 0.392847 0.707107 -0.587938
-v 0.461940 0.555570 -0.691341
-v 0.513280 0.382683 -0.768178
-v 0.544895 0.195090 -0.815493
-v 0.555570 0.000000 -0.831469
-v 0.544895 -0.195090 -0.815493
-v 0.513280 -0.382683 -0.768178
-v 0.461940 -0.555570 -0.691341
-v 0.392847 -0.707107 -0.587938
-v 0.308658 -0.831470 -0.461939
-v 0.212608 -0.923880 -0.318190
-v 0.108386 -0.980785 -0.162212
-v 0.137950 0.980785 -0.137950
-v 0.270598 0.923880 -0.270598
-v 0.392847 0.831470 -0.392847
-v 0.500000 0.707107 -0.500000
-v 0.587938 0.555570 -0.587937
-v 0.653281 0.382683 -0.653281
-v 0.693520 0.195090 -0.693520
-v 0.707106 0.000000 -0.707106
-v 0.693520 -0.195090 -0.693520
-v 0.653281 -0.382683 -0.653281
-v 0.587938 -0.555570 -0.587937
-v 0.500000 -0.707107 -0.500000
-v 0.392847 -0.831470 -0.392847
-v 0.270598 -0.923880 -0.270598
-v 0.137950 -0.980785 -0.137950
-v 0.000000 -1.000000 0.000000
-v 0.162212 0.980785 -0.108386
-v 0.318190 0.923880 -0.212607
-v 0.461940 0.831470 -0.308658
-v 0.587938 0.707107 -0.392847
-v 0.691341 0.555570 -0.461939
-v 0.768177 0.382683 -0.513280
-v 0.815493 0.195090 -0.544895
-v 0.831469 0.000000 -0.555569
-v 0.815493 -0.195090 -0.544895
-v 0.768177 -0.382683 -0.513280
-v 0.691341 -0.555570 -0.461939
-v 0.587938 -0.707107 -0.392847
-v 0.461940 -0.831470 -0.308658
-v 0.318190 -0.923880 -0.212607
-v 0.162212 -0.980785 -0.108386
-v 0.180240 0.980785 -0.074658
-v 0.353553 0.923880 -0.146447
-v 0.513280 0.831470 -0.212607
-v 0.653281 0.707107 -0.270598
-v 0.768177 0.555570 -0.318189
-v 0.853553 0.382683 -0.353553
-v 0.906127 0.195090 -0.375330
-v 0.923879 0.000000 -0.382683
-v 0.906127 -0.195090 -0.375330
-v 0.853553 -0.382683 -0.353553
-v 0.768177 -0.555570 -0.318189
-v 0.653281 -0.707107 -0.270598
-v 0.513280 -0.831470 -0.212607
-v 0.353553 -0.923880 -0.146447
-v 0.180240 -0.980785 -0.074658
-v 0.191342 0.980785 -0.038060
-v 0.375330 0.923880 -0.074658
-v 0.544895 0.831470 -0.108386
-v 0.693520 0.707107 -0.137950
-v 0.815493 0.555570 -0.162211
-v 0.906127 0.382683 -0.180240
-v 0.961939 0.195090 -0.191341
-v 0.980784 0.000000 -0.195090
-v 0.961939 -0.195090 -0.191341
-v 0.906127 -0.382683 -0.180240
-v 0.815493 -0.555570 -0.162211
-v 0.693520 -0.707107 -0.137950
-v 0.544895 -0.831470 -0.108386
-v 0.375330 -0.923880 -0.074658
-v 0.191342 -0.980785 -0.038060
-v 0.195090 0.980785 0.000000
-v 0.382683 0.923880 0.000000
-v 0.555570 0.831470 0.000000
-v 0.707107 0.707107 0.000000
-v 0.831469 0.555570 0.000000
-v 0.923879 0.382683 0.000000
-v 0.980785 0.195090 0.000000
-v 0.999999 0.000000 0.000000
-v 0.980785 -0.195090 0.000000
-v 0.923879 -0.382683 0.000000
-v 0.831469 -0.555570 0.000000
-v 0.707107 -0.707107 0.000000
-v 0.555570 -0.831470 0.000000
-v 0.382683 -0.923880 0.000000
-v 0.195090 -0.980785 0.000000
-v 0.191342 0.980785 0.038060
-v 0.375330 0.923880 0.074658
-v 0.544895 0.831470 0.108386
-v 0.693520 0.707107 0.137950
-v 0.815493 0.555570 0.162212
-v 0.906127 0.382683 0.180240
-v 0.961939 0.195090 0.191342
-v 0.980784 0.000000 0.195091
-v 0.961939 -0.195090 0.191342
-v 0.906127 -0.382683 0.180240
-v 0.815493 -0.555570 0.162212
-v 0.693520 -0.707107 0.137950
-v 0.544895 -0.831470 0.108386
-v 0.375330 -0.923880 0.074658
-v 0.191342 -0.980785 0.038060
-v 0.180240 0.980785 0.074658
-v 0.353553 0.923880 0.146447
-v 0.513279 0.831470 0.212607
-v 0.653281 0.707107 0.270598
-v 0.768177 0.555570 0.318190
-v 0.853553 0.382683 0.353553
-v 0.906127 0.195090 0.375330
-v 0.923878 0.000000 0.382683
-v 0.906127 -0.195090 0.375330
-v 0.853553 -0.382683 0.353553
-v 0.768177 -0.555570 0.318190
-v 0.653281 -0.707107 0.270598
-v 0.513279 -0.831470 0.212607
-v 0.353553 -0.923880 0.146447
-v 0.180240 -0.980785 0.074658
-v 0.162212 0.980785 0.108386
-v 0.318189 0.923880 0.212607
-v 0.461939 0.831470 0.308658
-v 0.587938 0.707107 0.392847
-v 0.691341 0.555570 0.461940
-v 0.768177 0.382683 0.513280
-v 0.815493 0.195090 0.544895
-v 0.831468 0.000000 0.555570
-v 0.815493 -0.195090 0.544895
-v 0.768177 -0.382683 0.513280
-v 0.691341 -0.555570 0.461940
-v 0.587938 -0.707107 0.392847
-v 0.461939 -0.831470 0.308658
-v 0.318189 -0.923880 0.212607
-v 0.162212 -0.980785 0.108386
-v 0.137950 0.980785 0.137950
-v 0.270598 0.923880 0.270598
-v 0.392847 0.831470 0.392847
-v 0.500000 0.707107 0.500000
-v 0.587937 0.555570 0.587938
-v 0.653281 0.382683 0.653281
-v 0.693519 0.195090 0.693520
-v 0.707106 0.000000 0.707106
-v 0.693519 -0.195090 0.693520
-v 0.653281 -0.382683 0.653281
-v 0.587937 -0.555570 0.587938
-v 0.500000 -0.707107 0.500000
-v 0.392847 -0.831470 0.392847
-v 0.270598 -0.923880 0.270598
-v 0.137950 -0.980785 0.137950
-v 0.108386 0.980785 0.162212
-v 0.212607 0.923880 0.318190
-v 0.308658 0.831470 0.461939
-v 0.392847 0.707107 0.587938
-v 0.461939 0.555570 0.691341
-v 0.513280 0.382683 0.768177
-v 0.544895 0.195090 0.815493
-v 0.555569 0.000000 0.831469
-v 0.544895 -0.195090 0.815493
-v 0.513280 -0.382683 0.768177
-v 0.461939 -0.555570 0.691341
-v 0.392847 -0.707107 0.587938
-v 0.308658 -0.831470 0.461939
-v 0.212607 -0.923880 0.318190
-v 0.108386 -0.980785 0.162212
-v 0.074658 0.980785 0.180240
-v 0.146446 0.923880 0.353553
-v 0.212607 0.831470 0.513279
-v 0.270598 0.707107 0.653281
-v 0.318189 0.555570 0.768177
-v 0.353553 0.382683 0.853553
-v 0.375330 0.195090 0.906127
-v 0.382683 0.000000 0.923879
-v 0.375330 -0.195090 0.906127
-v 0.353553 -0.382683 0.853553
-v 0.318189 -0.555570 0.768177
-v 0.270598 -0.707107 0.653281
-v 0.212607 -0.831470 0.513279
-v 0.146446 -0.923880 0.353553
-v 0.074658 -0.980785 0.180240
-v 0.038060 0.980785 0.191342
-v 0.074658 0.923880 0.375330
-v 0.108386 0.831470 0.544895
-v 0.137950 0.707107 0.693520
-v 0.162211 0.555570 0.815493
-v 0.180240 0.382683 0.906127
-v 0.191341 0.195090 0.961939
-v 0.195090 0.000000 0.980784
-v 0.191341 -0.195090 0.961939
-v 0.180240 -0.382683 0.906127
-v 0.162211 -0.555570 0.815493
-v 0.137950 -0.707107 0.693520
-v 0.108386 -0.831470 0.544895
-v 0.074658 -0.923880 0.375330
-v 0.038060 -0.980785 0.191342
-v -0.000000 0.980785 0.195090
-v -0.000000 0.923880 0.382683
-v -0.000000 0.707107 0.707107
-v -0.000000 0.382683 0.923879
-v -0.000000 -0.382683 0.923879
-v -0.000000 -0.707107 0.707107
-v -0.000000 -0.831470 0.555570
-v -0.000000 -0.923880 0.382683
-v -0.000000 -0.980785 0.195090
-vn -0.0000 -0.7041 0.7101
-vn -0.1092 -0.8286 0.5490
-vn -0.0000 -0.8286 0.5598
-vn -0.0000 0.3805 0.9248
-vn -0.1626 0.5528 0.8173
-vn -0.1804 0.3805 0.9070
-vn -0.0757 -0.9217 0.3804
-vn -0.0000 -0.9217 0.3879
-vn -0.0000 0.1939 0.9810
-vn -0.1914 0.1939 0.9622
-vn -0.0392 -0.9796 0.1971
-vn -0.0000 -0.9796 0.2010
-vn -0.1951 -0.0000 0.9808
-vn -0.0000 -0.0000 1.0000
-vn -0.0000 0.9796 0.2010
-vn -0.0000 1.0000 -0.0000
-vn -0.0392 0.9796 0.1971
-vn -0.0000 -1.0000 -0.0000
-vn -0.1914 -0.1939 0.9622
-vn -0.0000 -0.1939 0.9810
-vn -0.0000 0.9217 0.3879
-vn -0.0757 0.9217 0.3804
-vn -0.1804 -0.3805 0.9070
-vn -0.0000 -0.3805 0.9248
-vn -0.0000 0.8286 0.5598
-vn -0.1092 0.8286 0.5490
-vn -0.1626 -0.5528 0.8173
-vn -0.0000 -0.5528 0.8333
-vn -0.0000 0.7041 0.7101
-vn -0.1385 0.7041 0.6965
-vn -0.1385 -0.7041 0.6965
-vn -0.0000 0.5528 0.8333
-vn -0.2718 0.7041 0.6561
-vn -0.2718 -0.7041 0.6561
-vn -0.3189 0.5528 0.7699
-vn -0.2142 -0.8286 0.5172
-vn -0.3539 0.3805 0.8544
-vn -0.1484 -0.9217 0.3584
-vn -0.3754 0.1939 0.9063
-vn -0.0769 -0.9796 0.1857
-vn -0.3827 -0.0000 0.9239
-vn -0.0769 0.9796 0.1857
-vn -0.3754 -0.1939 0.9063
-vn -0.1484 0.9217 0.3584
-vn -0.3539 -0.3805 0.8544
-vn -0.2142 0.8286 0.5172
-vn -0.3189 -0.5528 0.7699
-vn -0.5556 -0.0000 0.8315
-vn -0.1117 0.9796 0.1671
-vn -0.1117 -0.9796 0.1671
-vn -0.5450 -0.1939 0.8157
-vn -0.2155 0.9217 0.3225
-vn -0.5138 -0.3805 0.7689
-vn -0.3110 0.8286 0.4654
-vn -0.4630 -0.5528 0.6929
-vn -0.3945 0.7041 0.5905
-vn -0.3945 -0.7041 0.5905
-vn -0.4630 0.5528 0.6929
-vn -0.3110 -0.8286 0.4654
-vn -0.5138 0.3805 0.7689
-vn -0.2155 -0.9217 0.3225
-vn -0.5450 0.1939 0.8157
-vn -0.5021 -0.7041 0.5021
-vn -0.5893 0.5528 0.5893
-vn -0.3958 -0.8286 0.3958
-vn -0.6539 0.3805 0.6539
-vn -0.2743 -0.9217 0.2743
-vn -0.6937 0.1939 0.6937
-vn -0.1421 -0.9796 0.1421
-vn -0.7071 -0.0000 0.7071
-vn -0.1421 0.9796 0.1421
-vn -0.6937 -0.1939 0.6937
-vn -0.2743 0.9217 0.2743
-vn -0.6539 -0.3805 0.6539
-vn -0.3958 0.8286 0.3958
-vn -0.5893 -0.5528 0.5893
-vn -0.5021 0.7041 0.5021
-vn -0.1671 -0.9796 0.1117
-vn -0.8157 -0.1939 0.5450
-vn -0.3225 0.9217 0.2155
-vn -0.7689 -0.3805 0.5138
-vn -0.4654 0.8286 0.3110
-vn -0.6929 -0.5528 0.4630
-vn -0.5905 0.7041 0.3945
-vn -0.5905 -0.7041 0.3945
-vn -0.6929 0.5528 0.4630
-vn -0.4654 -0.8286 0.3110
-vn -0.7689 0.3805 0.5138
-vn -0.3225 -0.9217 0.2155
-vn -0.8157 0.1939 0.5450
-vn -0.8315 -0.0000 0.5556
-vn -0.1671 0.9796 0.1117
-vn -0.5172 -0.8286 0.2142
-vn -0.8544 0.3805 0.3539
-vn -0.3584 -0.9217 0.1484
-vn -0.9063 0.1939 0.3754
-vn -0.1857 -0.9796 0.0769
-vn -0.9239 -0.0000 0.3827
-vn -0.1857 0.9796 0.0769
-vn -0.9063 -0.1939 0.3754
-vn -0.3584 0.9217 0.1484
-vn -0.8544 -0.3805 0.3539
-vn -0.5172 0.8286 0.2142
-vn -0.7699 -0.5528 0.3189
-vn -0.6561 0.7041 0.2718
-vn -0.6561 -0.7041 0.2718
-vn -0.7699 0.5528 0.3189
-vn -0.1971 0.9796 0.0392
-vn -0.3804 0.9217 0.0757
-vn -0.9070 -0.3805 0.1804
-vn -0.5490 0.8286 0.1092
-vn -0.8173 -0.5528 0.1626
-vn -0.6965 0.7041 0.1385
-vn -0.6965 -0.7041 0.1385
-vn -0.8173 0.5528 0.1626
-vn -0.5490 -0.8286 0.1092
-vn -0.9070 0.3805 0.1804
-vn -0.3804 -0.9217 0.0757
-vn -0.9622 0.1939 0.1914
-vn -0.1971 -0.9796 0.0392
-vn -0.9808 -0.0000 0.1951
-vn -0.9622 -0.1939 0.1914
-vn -0.9248 0.3805 -0.0000
-vn -0.3879 -0.9217 -0.0000
-vn -0.9810 0.1939 -0.0000
-vn -0.2010 -0.9796 -0.0000
-vn -1.0000 -0.0000 -0.0000
-vn -0.2010 0.9796 -0.0000
-vn -0.9810 -0.1939 -0.0000
-vn -0.3879 0.9217 -0.0000
-vn -0.9248 -0.3805 -0.0000
-vn -0.5598 0.8286 -0.0000
-vn -0.8333 -0.5528 -0.0000
-vn -0.7101 0.7041 -0.0000
-vn -0.7101 -0.7041 -0.0000
-vn -0.8333 0.5528 -0.0000
-vn -0.5598 -0.8286 -0.0000
-vn -0.9070 -0.3805 -0.1804
-vn -0.5490 0.8286 -0.1092
-vn -0.8173 -0.5528 -0.1626
-vn -0.6965 0.7041 -0.1385
-vn -0.6965 -0.7041 -0.1385
-vn -0.8173 0.5528 -0.1626
-vn -0.5490 -0.8286 -0.1092
-vn -0.9070 0.3805 -0.1804
-vn -0.3804 -0.9217 -0.0757
-vn -0.9622 0.1939 -0.1914
-vn -0.1971 -0.9796 -0.0392
-vn -0.9808 -0.0000 -0.1951
-vn -0.1971 0.9796 -0.0392
-vn -0.9622 -0.1939 -0.1914
-vn -0.3804 0.9217 -0.0757
-vn -0.3584 -0.9217 -0.1484
-vn -0.8544 0.3805 -0.3539
-vn -0.9063 0.1939 -0.3754
-vn -0.1857 -0.9796 -0.0769
-vn -0.9239 -0.0000 -0.3827
-vn -0.1857 0.9796 -0.0769
-vn -0.9063 -0.1939 -0.3754
-vn -0.3584 0.9217 -0.1484
-vn -0.8544 -0.3805 -0.3539
-vn -0.5172 0.8286 -0.2142
-vn -0.7699 -0.5528 -0.3189
-vn -0.6561 0.7041 -0.2718
-vn -0.6561 -0.7041 -0.2718
-vn -0.7699 0.5528 -0.3189
-vn -0.5172 -0.8286 -0.2142
-vn -0.3225 0.9217 -0.2155
-vn -0.4654 0.8286 -0.3110
-vn -0.7689 -0.3805 -0.5138
-vn -0.6929 -0.5528 -0.4630
-vn -0.5905 0.7041 -0.3945
-vn -0.5905 -0.7041 -0.3945
-vn -0.6929 0.5528 -0.4630
-vn -0.4654 -0.8286 -0.3110
-vn -0.7689 0.3805 -0.5138
-vn -0.3225 -0.9217 -0.2155
-vn -0.8157 0.1939 -0.5450
-vn -0.1671 -0.9796 -0.1117
-vn -0.8315 -0.0000 -0.5556
-vn -0.1671 0.9796 -0.1117
-vn -0.8157 -0.1939 -0.5450
-vn -0.6539 0.3805 -0.6539
-vn -0.6937 0.1939 -0.6937
-vn -0.2743 -0.9217 -0.2743
-vn -0.1421 -0.9796 -0.1421
-vn -0.7071 -0.0000 -0.7071
-vn -0.1421 0.9796 -0.1421
-vn -0.6937 -0.1939 -0.6937
-vn -0.2743 0.9217 -0.2743
-vn -0.6539 -0.3805 -0.6539
-vn -0.3958 0.8286 -0.3958
-vn -0.5893 -0.5528 -0.5893
-vn -0.5021 0.7041 -0.5021
-vn -0.5021 -0.7041 -0.5021
-vn -0.5893 0.5528 -0.5893
-vn -0.3958 -0.8286 -0.3958
-vn -0.5138 -0.3805 -0.7689
-vn -0.4630 -0.5528 -0.6929
-vn -0.3945 0.7041 -0.5905
-vn -0.3945 -0.7041 -0.5905
-vn -0.4630 0.5528 -0.6929
-vn -0.3110 -0.8286 -0.4654
-vn -0.5138 0.3805 -0.7689
-vn -0.2155 -0.9217 -0.3225
-vn -0.5450 0.1939 -0.8157
-vn -0.1117 -0.9796 -0.1671
-vn -0.5556 -0.0000 -0.8315
-vn -0.1117 0.9796 -0.1671
-vn -0.5450 -0.1939 -0.8157
-vn -0.2155 0.9217 -0.3225
-vn -0.3110 0.8286 -0.4654
-vn -0.0769 -0.9796 -0.1857
-vn -0.3754 0.1939 -0.9063
-vn -0.3827 -0.0000 -0.9239
-vn -0.0769 0.9796 -0.1857
-vn -0.3754 -0.1939 -0.9063
-vn -0.1484 0.9217 -0.3584
-vn -0.3539 -0.3805 -0.8544
-vn -0.2142 0.8286 -0.5172
-vn -0.3189 -0.5528 -0.7699
-vn -0.2718 0.7041 -0.6561
-vn -0.2718 -0.7041 -0.6561
-vn -0.3189 0.5528 -0.7699
-vn -0.2142 -0.8286 -0.5172
-vn -0.3539 0.3805 -0.8544
-vn -0.1484 -0.9217 -0.3584
-vn -0.1385 -0.7041 -0.6965
-vn -0.1385 0.7041 -0.6965
-vn -0.1626 0.5528 -0.8173
-vn -0.1092 -0.8286 -0.5490
-vn -0.1804 0.3805 -0.9070
-vn -0.0757 -0.9217 -0.3804
-vn -0.1914 0.1939 -0.9622
-vn -0.0392 -0.9796 -0.1971
-vn -0.1951 -0.0000 -0.9808
-vn -0.0392 0.9796 -0.1971
-vn -0.1914 -0.1939 -0.9622
-vn -0.0757 0.9217 -0.3804
-vn -0.1804 -0.3805 -0.9070
-vn -0.1092 0.8286 -0.5490
-vn -0.1626 -0.5528 -0.8173
-vn -0.0000 0.9796 -0.2010
-vn -0.0000 -0.9796 -0.2010
-vn -0.0000 -0.1939 -0.9810
-vn -0.0000 0.9217 -0.3879
-vn -0.0000 -0.3805 -0.9248
-vn -0.0000 0.8286 -0.5598
-vn -0.0000 -0.5528 -0.8333
-vn -0.0000 0.7041 -0.7101
-vn -0.0000 -0.7041 -0.7101
-vn -0.0000 0.5528 -0.8333
-vn -0.0000 -0.8286 -0.5598
-vn -0.0000 0.3805 -0.9248
-vn -0.0000 -0.9217 -0.3879
-vn -0.0000 0.1939 -0.9810
-vn -0.0000 -0.0000 -1.0000
-vn 0.1385 0.7041 -0.6965
-vn 0.1626 0.5528 -0.8173
-vn 0.1385 -0.7041 -0.6965
-vn 0.1092 -0.8286 -0.5490
-vn 0.1804 0.3805 -0.9070
-vn 0.0757 -0.9217 -0.3804
-vn 0.1914 0.1939 -0.9622
-vn 0.0392 -0.9796 -0.1971
-vn 0.1951 -0.0000 -0.9808
-vn 0.0392 0.9796 -0.1971
-vn 0.1914 -0.1939 -0.9622
-vn 0.0757 0.9217 -0.3804
-vn 0.1804 -0.3805 -0.9070
-vn 0.1092 0.8286 -0.5490
-vn 0.1626 -0.5528 -0.8173
-vn 0.3754 -0.1939 -0.9063
-vn 0.0769 0.9796 -0.1857
-vn 0.1484 0.9217 -0.3584
-vn 0.3539 -0.3805 -0.8544
-vn 0.2142 0.8286 -0.5172
-vn 0.3189 -0.5528 -0.7699
-vn 0.2718 0.7041 -0.6561
-vn 0.2718 -0.7041 -0.6561
-vn 0.3189 0.5528 -0.7699
-vn 0.2142 -0.8286 -0.5172
-vn 0.3539 0.3805 -0.8544
-vn 0.1484 -0.9217 -0.3584
-vn 0.3754 0.1939 -0.9063
-vn 0.0769 -0.9796 -0.1857
-vn 0.3827 -0.0000 -0.9239
-vn 0.3945 -0.7041 -0.5905
-vn 0.3110 -0.8286 -0.4654
-vn 0.5138 0.3805 -0.7689
-vn 0.2155 -0.9217 -0.3225
-vn 0.5450 0.1939 -0.8157
-vn 0.1117 -0.9796 -0.1671
-vn 0.5556 -0.0000 -0.8315
-vn 0.1117 0.9796 -0.1671
-vn 0.5450 -0.1939 -0.8157
-vn 0.2155 0.9217 -0.3225
-vn 0.5138 -0.3805 -0.7689
-vn 0.3110 0.8286 -0.4654
-vn 0.4630 -0.5528 -0.6929
-vn 0.3945 0.7041 -0.5905
-vn 0.4630 0.5528 -0.6929
-vn 0.2743 0.9217 -0.2743
-vn 0.6539 -0.3805 -0.6539
-vn 0.3958 0.8286 -0.3958
-vn 0.5893 -0.5528 -0.5893
-vn 0.5021 0.7041 -0.5021
-vn 0.5021 -0.7041 -0.5021
-vn 0.5893 0.5528 -0.5893
-vn 0.3958 -0.8286 -0.3958
-vn 0.6539 0.3805 -0.6539
-vn 0.2743 -0.9217 -0.2743
-vn 0.6937 0.1939 -0.6937
-vn 0.1421 -0.9796 -0.1421
-vn 0.7071 -0.0000 -0.7071
-vn 0.1421 0.9796 -0.1421
-vn 0.6937 -0.1939 -0.6937
-vn 0.7689 0.3805 -0.5138
-vn 0.3225 -0.9217 -0.2155
-vn 0.8157 0.1939 -0.5450
-vn 0.1671 -0.9796 -0.1117
-vn 0.8315 -0.0000 -0.5556
-vn 0.1671 0.9796 -0.1117
-vn 0.8157 -0.1939 -0.5450
-vn 0.3225 0.9217 -0.2155
-vn 0.7689 -0.3805 -0.5138
-vn 0.4654 0.8286 -0.3110
-vn 0.6929 -0.5528 -0.4630
-vn 0.5905 0.7041 -0.3945
-vn 0.5905 -0.7041 -0.3945
-vn 0.6929 0.5528 -0.4630
-vn 0.4654 -0.8286 -0.3110
-vn 0.8544 -0.3805 -0.3539
-vn 0.5172 0.8286 -0.2142
-vn 0.7699 -0.5528 -0.3189
-vn 0.6561 0.7041 -0.2718
-vn 0.6561 -0.7041 -0.2718
-vn 0.7699 0.5528 -0.3189
-vn 0.5172 -0.8286 -0.2142
-vn 0.8544 0.3805 -0.3539
-vn 0.3584 -0.9217 -0.1484
-vn 0.9063 0.1939 -0.3754
-vn 0.1857 -0.9796 -0.0769
-vn 0.9239 -0.0000 -0.3827
-vn 0.1857 0.9796 -0.0769
-vn 0.9063 -0.1939 -0.3754
-vn 0.3584 0.9217 -0.1484
-vn 0.3804 -0.9217 -0.0757
-vn 0.9070 0.3805 -0.1804
-vn 0.9622 0.1939 -0.1914
-vn 0.1971 -0.9796 -0.0392
-vn 0.9808 -0.0000 -0.1951
-vn 0.1971 0.9796 -0.0392
-vn 0.9622 -0.1939 -0.1914
-vn 0.3804 0.9217 -0.0757
-vn 0.9070 -0.3805 -0.1804
-vn 0.5490 0.8286 -0.1092
-vn 0.8173 -0.5528 -0.1626
-vn 0.6965 0.7041 -0.1385
-vn 0.6965 -0.7041 -0.1385
-vn 0.8173 0.5528 -0.1626
-vn 0.5490 -0.8286 -0.1092
-vn 0.9248 -0.3805 -0.0000
-vn 0.8333 -0.5528 -0.0000
-vn 0.7101 0.7041 -0.0000
-vn 0.7101 -0.7041 -0.0000
-vn 0.8333 0.5528 -0.0000
-vn 0.5598 -0.8286 -0.0000
-vn 0.9248 0.3805 -0.0000
-vn 0.3879 -0.9217 -0.0000
-vn 0.9810 0.1939 -0.0000
-vn 0.2010 -0.9796 -0.0000
-vn 1.0000 -0.0000 -0.0000
-vn 0.2010 0.9796 -0.0000
-vn 0.9810 -0.1939 -0.0000
-vn 0.3879 0.9217 -0.0000
-vn 0.5598 0.8286 -0.0000
-vn 0.1971 -0.9796 0.0392
-vn 0.9622 0.1939 0.1914
-vn 0.9808 -0.0000 0.1951
-vn 0.1971 0.9796 0.0392
-vn 0.9622 -0.1939 0.1914
-vn 0.3804 0.9217 0.0757
-vn 0.9070 -0.3805 0.1804
-vn 0.5490 0.8286 0.1092
-vn 0.8173 -0.5528 0.1626
-vn 0.6965 0.7041 0.1385
-vn 0.6965 -0.7041 0.1385
-vn 0.8173 0.5528 0.1626
-vn 0.5490 -0.8286 0.1092
-vn 0.9070 0.3805 0.1804
-vn 0.3804 -0.9217 0.0757
-vn 0.6561 0.7041 0.2718
-vn 0.6561 -0.7041 0.2718
-vn 0.7699 0.5528 0.3189
-vn 0.5172 -0.8286 0.2142
-vn 0.8544 0.3805 0.3539
-vn 0.3584 -0.9217 0.1484
-vn 0.9063 0.1939 0.3754
-vn 0.1857 -0.9796 0.0769
-vn 0.9239 -0.0000 0.3827
-vn 0.1857 0.9796 0.0769
-vn 0.9063 -0.1939 0.3754
-vn 0.3584 0.9217 0.1484
-vn 0.8544 -0.3805 0.3539
-vn 0.5172 0.8286 0.2142
-vn 0.7699 -0.5528 0.3189
-vn 0.8157 0.1939 0.5450
-vn 0.8315 -0.0000 0.5556
-vn 0.1671 0.9796 0.1117
-vn 0.1671 -0.9796 0.1117
-vn 0.8157 -0.1939 0.5450
-vn 0.3225 0.9217 0.2155
-vn 0.7689 -0.3805 0.5138
-vn 0.4654 0.8286 0.3110
-vn 0.6929 -0.5528 0.4630
-vn 0.5905 0.7041 0.3945
-vn 0.5905 -0.7041 0.3945
-vn 0.6929 0.5528 0.4630
-vn 0.4654 -0.8286 0.3110
-vn 0.7689 0.3805 0.5138
-vn 0.3225 -0.9217 0.2155
-vn 0.5021 -0.7041 0.5021
-vn 0.5021 0.7041 0.5021
-vn 0.5893 0.5528 0.5893
-vn 0.3958 -0.8286 0.3958
-vn 0.6539 0.3805 0.6539
-vn 0.2743 -0.9217 0.2743
-vn 0.6937 0.1939 0.6937
-vn 0.1421 -0.9796 0.1421
-vn 0.7071 -0.0000 0.7071
-vn 0.1421 0.9796 0.1421
-vn 0.6937 -0.1939 0.6937
-vn 0.2743 0.9217 0.2743
-vn 0.6539 -0.3805 0.6539
-vn 0.3958 0.8286 0.3958
-vn 0.5893 -0.5528 0.5893
-vn 0.1117 0.9796 0.1671
-vn 0.1117 -0.9796 0.1671
-vn 0.5450 -0.1939 0.8157
-vn 0.2155 0.9217 0.3225
-vn 0.5138 -0.3805 0.7689
-vn 0.3110 0.8286 0.4654
-vn 0.4630 -0.5528 0.6929
-vn 0.3945 0.7041 0.5905
-vn 0.3945 -0.7041 0.5905
-vn 0.4630 0.5528 0.6929
-vn 0.3110 -0.8286 0.4654
-vn 0.5138 0.3805 0.7689
-vn 0.2155 -0.9217 0.3225
-vn 0.5450 0.1939 0.8157
-vn 0.5556 -0.0000 0.8315
-vn 0.2718 0.7041 0.6561
-vn 0.3189 0.5528 0.7699
-vn 0.2718 -0.7041 0.6561
-vn 0.2142 -0.8286 0.5172
-vn 0.3539 0.3805 0.8544
-vn 0.1484 -0.9217 0.3584
-vn 0.3754 0.1939 0.9063
-vn 0.0769 -0.9796 0.1857
-vn 0.3827 -0.0000 0.9239
-vn 0.0769 0.9796 0.1857
-vn 0.3754 -0.1939 0.9063
-vn 0.1484 0.9217 0.3584
-vn 0.3539 -0.3805 0.8544
-vn 0.2142 0.8286 0.5172
-vn 0.3189 -0.5528 0.7699
-vn 0.1914 -0.1939 0.9622
-vn 0.0757 0.9217 0.3804
-vn 0.1804 -0.3805 0.9070
-vn 0.1092 0.8286 0.5490
-vn 0.1626 -0.5528 0.8173
-vn 0.1385 0.7041 0.6965
-vn 0.1385 -0.7041 0.6965
-vn 0.1626 0.5528 0.8173
-vn 0.1092 -0.8286 0.5490
-vn 0.1804 0.3805 0.9070
-vn 0.0757 -0.9217 0.3804
-vn 0.1914 0.1939 0.9622
-vn 0.0392 -0.9796 0.1971
-vn 0.1951 -0.0000 0.9808
-vn 0.0392 0.9796 0.1971
-vt 0.750000 0.812500
-vt 0.750000 0.687500
-vt 0.750000 0.562500
-vt 0.750000 0.500000
-vt 0.750000 0.437500
-vt 0.750000 0.312500
-vt 0.718750 0.937500
-vt 0.718750 0.875000
-vt 0.718750 0.812500
-vt 0.718750 0.750000
-vt 0.718750 0.687500
-vt 0.718750 0.625000
-vt 0.718750 0.562500
-vt 0.718750 0.500000
-vt 0.718750 0.437500
-vt 0.718750 0.375000
-vt 0.718750 0.312500
-vt 0.718750 0.250000
-vt 0.718750 0.187500
-vt 0.718750 0.125000
-vt 0.718750 0.062500
-vt 0.687500 0.937500
-vt 0.687500 0.875000
-vt 0.687500 0.812500
-vt 0.687500 0.750000
-vt 0.687500 0.687500
-vt 0.687500 0.625000
-vt 0.687500 0.562500
-vt 0.687500 0.500000
-vt 0.687500 0.437500
-vt 0.687500 0.375000
-vt 0.687500 0.312500
-vt 0.687500 0.250000
-vt 0.687500 0.187500
-vt 0.687500 0.125000
-vt 0.687500 0.062500
-vt 0.656250 0.937500
-vt 0.656250 0.875000
-vt 0.656250 0.812500
-vt 0.656250 0.750000
-vt 0.656250 0.687500
-vt 0.656250 0.625000
-vt 0.656250 0.562500
-vt 0.656250 0.500000
-vt 0.656250 0.437500
-vt 0.656250 0.375000
-vt 0.656250 0.312500
-vt 0.656250 0.250000
-vt 0.656250 0.187500
-vt 0.656250 0.125000
-vt 0.656250 0.062500
-vt 0.625000 0.937500
-vt 0.625000 0.875000
-vt 0.625000 0.812500
-vt 0.625000 0.750000
-vt 0.625000 0.687500
-vt 0.625000 0.625000
-vt 0.625000 0.562500
-vt 0.625000 0.500000
-vt 0.625000 0.437500
-vt 0.625000 0.375000
-vt 0.625000 0.312500
-vt 0.625000 0.250000
-vt 0.625000 0.187500
-vt 0.625000 0.125000
-vt 0.625000 0.062500
-vt 0.593750 0.937500
-vt 0.593750 0.875000
-vt 0.593750 0.812500
-vt 0.593750 0.750000
-vt 0.593750 0.687500
-vt 0.593750 0.625000
-vt 0.593750 0.562500
-vt 0.593750 0.500000
-vt 0.593750 0.437500
-vt 0.593750 0.375000
-vt 0.593750 0.312500
-vt 0.593750 0.250000
-vt 0.593750 0.187500
-vt 0.593750 0.125000
-vt 0.593750 0.062500
-vt 0.734375 1.000000
-vt 0.703125 1.000000
-vt 0.671875 1.000000
-vt 0.640625 1.000000
-vt 0.609375 1.000000
-vt 0.578125 1.000000
-vt 0.546875 1.000000
-vt 0.515625 1.000000
-vt 0.484375 1.000000
-vt 0.453125 1.000000
-vt 0.421875 1.000000
-vt 0.390625 1.000000
-vt 0.359375 1.000000
-vt 0.328125 1.000000
-vt 0.296875 1.000000
-vt 0.265625 1.000000
-vt 0.234375 1.000000
-vt 0.203125 1.000000
-vt 0.171875 1.000000
-vt 0.140625 1.000000
-vt 0.109375 1.000000
-vt 0.078125 1.000000
-vt 0.046875 1.000000
-vt 0.015625 1.000000
-vt 0.984375 1.000000
-vt 0.953125 1.000000
-vt 0.921875 1.000000
-vt 0.890625 1.000000
-vt 0.859375 1.000000
-vt 0.828125 1.000000
-vt 0.796875 1.000000
-vt 0.765625 1.000000
-vt 0.562500 0.937500
-vt 0.562500 0.875000
-vt 0.562500 0.812500
-vt 0.562500 0.750000
-vt 0.562500 0.687500
-vt 0.562500 0.625000
-vt 0.562500 0.562500
-vt 0.562500 0.500000
-vt 0.562500 0.437500
-vt 0.562500 0.375000
-vt 0.562500 0.312500
-vt 0.562500 0.250000
-vt 0.562500 0.187500
-vt 0.562500 0.125000
-vt 0.562500 0.062500
-vt 0.531250 0.937500
-vt 0.531250 0.875000
-vt 0.531250 0.812500
-vt 0.531250 0.750000
-vt 0.531250 0.687500
-vt 0.531250 0.625000
-vt 0.531250 0.562500
-vt 0.531250 0.500000
-vt 0.531250 0.437500
-vt 0.531250 0.375000
-vt 0.531250 0.312500
-vt 0.531250 0.250000
-vt 0.531250 0.187500
-vt 0.531250 0.125000
-vt 0.531250 0.062500
-vt 0.500000 0.937500
-vt 0.500000 0.875000
-vt 0.500000 0.812500
-vt 0.500000 0.750000
-vt 0.500000 0.687500
-vt 0.500000 0.625000
-vt 0.500000 0.562500
-vt 0.500000 0.500000
-vt 0.500000 0.437500
-vt 0.500000 0.375000
-vt 0.500000 0.312500
-vt 0.500000 0.250000
-vt 0.500000 0.187500
-vt 0.500000 0.125000
-vt 0.500000 0.062500
-vt 0.468750 0.937500
-vt 0.468750 0.875000
-vt 0.468750 0.812500
-vt 0.468750 0.750000
-vt 0.468750 0.687500
-vt 0.468750 0.625000
-vt 0.468750 0.562500
-vt 0.468750 0.500000
-vt 0.468750 0.437500
-vt 0.468750 0.375000
-vt 0.468750 0.312500
-vt 0.468750 0.250000
-vt 0.468750 0.187500
-vt 0.468750 0.125000
-vt 0.468750 0.062500
-vt 0.437500 0.937500
-vt 0.437500 0.875000
-vt 0.437500 0.812500
-vt 0.437500 0.750000
-vt 0.437500 0.687500
-vt 0.437500 0.625000
-vt 0.437500 0.562500
-vt 0.437500 0.500000
-vt 0.437500 0.437500
-vt 0.437500 0.375000
-vt 0.437500 0.312500
-vt 0.437500 0.250000
-vt 0.437500 0.187500
-vt 0.437500 0.125000
-vt 0.437500 0.062500
-vt 0.406250 0.937500
-vt 0.406250 0.875000
-vt 0.406250 0.812500
-vt 0.406250 0.750000
-vt 0.406250 0.687500
-vt 0.406250 0.625000
-vt 0.406250 0.562500
-vt 0.406250 0.500000
-vt 0.406250 0.437500
-vt 0.406250 0.375000
-vt 0.406250 0.312500
-vt 0.406250 0.250000
-vt 0.406250 0.187500
-vt 0.406250 0.125000
-vt 0.406250 0.062500
-vt 0.375000 0.937500
-vt 0.375000 0.875000
-vt 0.375000 0.812500
-vt 0.375000 0.750000
-vt 0.375000 0.687500
-vt 0.375000 0.625000
-vt 0.375000 0.562500
-vt 0.375000 0.500000
-vt 0.375000 0.437500
-vt 0.375000 0.375000
-vt 0.375000 0.312500
-vt 0.375000 0.250000
-vt 0.375000 0.187500
-vt 0.375000 0.125000
-vt 0.375000 0.062500
-vt 0.343750 0.937500
-vt 0.343750 0.875000
-vt 0.343750 0.812500
-vt 0.343750 0.750000
-vt 0.343750 0.687500
-vt 0.343750 0.625000
-vt 0.343750 0.562500
-vt 0.343750 0.500000
-vt 0.343750 0.437500
-vt 0.343750 0.375000
-vt 0.343750 0.312500
-vt 0.343750 0.250000
-vt 0.343750 0.187500
-vt 0.343750 0.125000
-vt 0.343750 0.062500
-vt 0.312500 0.937500
-vt 0.312500 0.875000
-vt 0.312500 0.812500
-vt 0.312500 0.750000
-vt 0.312500 0.687500
-vt 0.312500 0.625000
-vt 0.312500 0.562500
-vt 0.312500 0.500000
-vt 0.312500 0.437500
-vt 0.312500 0.375000
-vt 0.312500 0.312500
-vt 0.312500 0.250000
-vt 0.312500 0.187500
-vt 0.312500 0.125000
-vt 0.312500 0.062500
-vt 0.281250 0.937500
-vt 0.281250 0.875000
-vt 0.281250 0.812500
-vt 0.281250 0.750000
-vt 0.281250 0.687500
-vt 0.281250 0.625000
-vt 0.281250 0.562500
-vt 0.281250 0.500000
-vt 0.281250 0.437500
-vt 0.281250 0.375000
-vt 0.281250 0.312500
-vt 0.281250 0.250000
-vt 0.281250 0.187500
-vt 0.281250 0.125000
-vt 0.281250 0.062500
-vt 0.250000 0.937500
-vt 0.250000 0.875000
-vt 0.250000 0.812500
-vt 0.250000 0.750000
-vt 0.250000 0.687500
-vt 0.250000 0.625000
-vt 0.250000 0.562500
-vt 0.250000 0.500000
-vt 0.250000 0.437500
-vt 0.250000 0.375000
-vt 0.250000 0.312500
-vt 0.250000 0.250000
-vt 0.250000 0.187500
-vt 0.250000 0.125000
-vt 0.250000 0.062500
-vt 0.218750 0.937500
-vt 0.218750 0.875000
-vt 0.218750 0.812500
-vt 0.218750 0.750000
-vt 0.218750 0.687500
-vt 0.218750 0.625000
-vt 0.218750 0.562500
-vt 0.218750 0.500000
-vt 0.218750 0.437500
-vt 0.218750 0.375000
-vt 0.218750 0.312500
-vt 0.218750 0.250000
-vt 0.218750 0.187500
-vt 0.218750 0.125000
-vt 0.218750 0.062500
-vt 0.187500 0.937500
-vt 0.187500 0.875000
-vt 0.187500 0.812500
-vt 0.187500 0.750000
-vt 0.187500 0.687500
-vt 0.187500 0.625000
-vt 0.187500 0.562500
-vt 0.187500 0.500000
-vt 0.187500 0.437500
-vt 0.187500 0.375000
-vt 0.187500 0.312500
-vt 0.187500 0.250000
-vt 0.187500 0.187500
-vt 0.187500 0.125000
-vt 0.187500 0.062500
-vt 0.156250 0.937500
-vt 0.156250 0.875000
-vt 0.156250 0.812500
-vt 0.156250 0.750000
-vt 0.156250 0.687500
-vt 0.156250 0.625000
-vt 0.156250 0.562500
-vt 0.156250 0.500000
-vt 0.156250 0.437500
-vt 0.156250 0.375000
-vt 0.156250 0.312500
-vt 0.156250 0.250000
-vt 0.156250 0.187500
-vt 0.156250 0.125000
-vt 0.156250 0.062500
-vt 0.125000 0.937500
-vt 0.125000 0.875000
-vt 0.125000 0.812500
-vt 0.125000 0.750000
-vt 0.125000 0.687500
-vt 0.125000 0.625000
-vt 0.125000 0.562500
-vt 0.125000 0.500000
-vt 0.125000 0.437500
-vt 0.125000 0.375000
-vt 0.125000 0.312500
-vt 0.125000 0.250000
-vt 0.125000 0.187500
-vt 0.125000 0.125000
-vt 0.125000 0.062500
-vt 0.734375 0.000000
-vt 0.703125 0.000000
-vt 0.671875 0.000000
-vt 0.640625 0.000000
-vt 0.609375 0.000000
-vt 0.578125 0.000000
-vt 0.546875 0.000000
-vt 0.515625 0.000000
-vt 0.484375 0.000000
-vt 0.453125 0.000000
-vt 0.421875 0.000000
-vt 0.390625 0.000000
-vt 0.359375 0.000000
-vt 0.328125 0.000000
-vt 0.296875 0.000000
-vt 0.265625 0.000000
-vt 0.234375 0.000000
-vt 0.203125 0.000000
-vt 0.171875 0.000000
-vt 0.140625 0.000000
-vt 0.109375 0.000000
-vt 0.078125 0.000000
-vt 0.046875 0.000000
-vt 0.015625 0.000000
-vt 0.984375 0.000000
-vt 0.953125 0.000000
-vt 0.921875 0.000000
-vt 0.890625 0.000000
-vt 0.859375 0.000000
-vt 0.828125 0.000000
-vt 0.796875 0.000000
-vt 0.765625 0.000000
-vt 0.093750 0.937500
-vt 0.093750 0.875000
-vt 0.093750 0.812500
-vt 0.093750 0.750000
-vt 0.093750 0.687500
-vt 0.093750 0.625000
-vt 0.093750 0.562500
-vt 0.093750 0.500000
-vt 0.093750 0.437500
-vt 0.093750 0.375000
-vt 0.093750 0.312500
-vt 0.093750 0.250000
-vt 0.093750 0.187500
-vt 0.093750 0.125000
-vt 0.093750 0.062500
-vt 0.062500 0.937500
-vt 0.062500 0.875000
-vt 0.062500 0.812500
-vt 0.062500 0.750000
-vt 0.062500 0.687500
-vt 0.062500 0.625000
-vt 0.062500 0.562500
-vt 0.062500 0.500000
-vt 0.062500 0.437500
-vt 0.062500 0.375000
-vt 0.062500 0.312500
-vt 0.062500 0.250000
-vt 0.062500 0.187500
-vt 0.062500 0.125000
-vt 0.062500 0.062500
-vt 0.031250 0.937500
-vt 0.031250 0.875000
-vt 0.031250 0.812500
-vt 0.031250 0.750000
-vt 0.031250 0.687500
-vt 0.031250 0.625000
-vt 0.031250 0.562500
-vt 0.031250 0.500000
-vt 0.031250 0.437500
-vt 0.031250 0.375000
-vt 0.031250 0.312500
-vt 0.031250 0.250000
-vt 0.031250 0.187500
-vt 0.031250 0.125000
-vt 0.031250 0.062500
-vt 0.000000 0.937500
-vt 1.000000 0.937500
-vt 0.000000 0.875000
-vt 1.000000 0.875000
-vt 0.000000 0.812500
-vt 1.000000 0.812500
-vt 0.000000 0.750000
-vt 1.000000 0.750000
-vt 0.000000 0.687500
-vt 1.000000 0.687500
-vt 0.000000 0.625000
-vt 1.000000 0.625000
-vt 0.000000 0.562500
-vt 1.000000 0.562500
-vt 0.000000 0.500000
-vt 1.000000 0.500000
-vt 0.000000 0.437500
-vt 1.000000 0.437500
-vt 0.000000 0.375000
-vt 1.000000 0.375000
-vt 0.000000 0.312500
-vt 1.000000 0.312500
-vt 0.000000 0.250000
-vt 1.000000 0.250000
-vt 0.000000 0.187500
-vt 1.000000 0.187500
-vt 0.000000 0.125000
-vt 1.000000 0.125000
-vt 1.000000 0.062500
-vt 0.000000 0.062500
-vt 0.968750 0.937500
-vt 0.968750 0.875000
-vt 0.968750 0.812500
-vt 0.968750 0.750000
-vt 0.968750 0.687500
-vt 0.968750 0.625000
-vt 0.968750 0.562500
-vt 0.968750 0.500000
-vt 0.968750 0.437500
-vt 0.968750 0.375000
-vt 0.968750 0.312500
-vt 0.968750 0.250000
-vt 0.968750 0.187500
-vt 0.968750 0.125000
-vt 0.968750 0.062500
-vt 0.937500 0.937500
-vt 0.937500 0.875000
-vt 0.937500 0.812500
-vt 0.937500 0.750000
-vt 0.937500 0.687500
-vt 0.937500 0.625000
-vt 0.937500 0.562500
-vt 0.937500 0.500000
-vt 0.937500 0.437500
-vt 0.937500 0.375000
-vt 0.937500 0.312500
-vt 0.937500 0.250000
-vt 0.937500 0.187500
-vt 0.937500 0.125000
-vt 0.937500 0.062500
-vt 0.906250 0.937500
-vt 0.906250 0.875000
-vt 0.906250 0.812500
-vt 0.906250 0.750000
-vt 0.906250 0.687500
-vt 0.906250 0.625000
-vt 0.906250 0.562500
-vt 0.906250 0.500000
-vt 0.906250 0.437500
-vt 0.906250 0.375000
-vt 0.906250 0.312500
-vt 0.906250 0.250000
-vt 0.906250 0.187500
-vt 0.906250 0.125000
-vt 0.906250 0.062500
-vt 0.875000 0.937500
-vt 0.875000 0.875000
-vt 0.875000 0.812500
-vt 0.875000 0.750000
-vt 0.875000 0.687500
-vt 0.875000 0.625000
-vt 0.875000 0.562500
-vt 0.875000 0.500000
-vt 0.875000 0.437500
-vt 0.875000 0.375000
-vt 0.875000 0.312500
-vt 0.875000 0.250000
-vt 0.875000 0.187500
-vt 0.875000 0.125000
-vt 0.875000 0.062500
-vt 0.843750 0.937500
-vt 0.843750 0.875000
-vt 0.843750 0.812500
-vt 0.843750 0.750000
-vt 0.843750 0.687500
-vt 0.843750 0.625000
-vt 0.843750 0.562500
-vt 0.843750 0.500000
-vt 0.843750 0.437500
-vt 0.843750 0.375000
-vt 0.843750 0.312500
-vt 0.843750 0.250000
-vt 0.843750 0.187500
-vt 0.843750 0.125000
-vt 0.843750 0.062500
-vt 0.812500 0.937500
-vt 0.812500 0.875000
-vt 0.812500 0.812500
-vt 0.812500 0.750000
-vt 0.812500 0.687500
-vt 0.812500 0.625000
-vt 0.812500 0.562500
-vt 0.812500 0.500000
-vt 0.812500 0.437500
-vt 0.812500 0.375000
-vt 0.812500 0.312500
-vt 0.812500 0.250000
-vt 0.812500 0.187500
-vt 0.812500 0.125000
-vt 0.812500 0.062500
-vt 0.781250 0.937500
-vt 0.781250 0.875000
-vt 0.781250 0.812500
-vt 0.781250 0.750000
-vt 0.781250 0.687500
-vt 0.781250 0.625000
-vt 0.781250 0.562500
-vt 0.781250 0.500000
-vt 0.781250 0.437500
-vt 0.781250 0.375000
-vt 0.781250 0.312500
-vt 0.781250 0.250000
-vt 0.781250 0.187500
-vt 0.781250 0.125000
-vt 0.781250 0.062500
-vt 0.750000 0.937500
-vt 0.750000 0.875000
-vt 0.750000 0.750000
-vt 0.750000 0.625000
-vt 0.750000 0.375000
-vt 0.750000 0.250000
-vt 0.750000 0.187500
-vt 0.750000 0.125000
-vt 0.750000 0.062500
-s 1
-f 479/556/1 19/19/2 480/557/3
-f 477/554/4 11/11/5 12/12/6
-f 480/557/3 20/20/7 481/558/8
-f 3/3/9 12/12/6 13/13/10
-f 481/558/8 21/21/11 482/559/12
-f 3/3/9 14/14/13 4/4/14
-f 474/551/15 82/82/16 7/7/17
-f 308/339/18 482/559/12 21/21/11
-f 4/4/14 15/15/19 5/5/20
-f 475/552/21 7/7/17 8/8/22
-f 5/5/20 16/16/23 478/555/24
-f 1/1/25 8/8/22 9/9/26
-f 478/555/24 17/17/27 6/6/28
-f 476/553/29 9/9/26 10/10/30
-f 6/6/28 18/18/31 479/556/1
-f 2/2/32 10/10/30 11/11/5
-f 9/9/26 25/25/33 10/10/30
-f 17/17/27 33/33/34 18/18/31
-f 10/10/30 26/26/35 11/11/5
-f 19/19/2 33/33/34 34/34/36
-f 11/11/5 27/27/37 12/12/6
-f 20/20/7 34/34/36 35/35/38
-f 13/13/10 27/27/37 28/28/39
-f 20/20/7 36/36/40 21/21/11
-f 13/13/10 29/29/41 14/14/13
-f 7/7/17 82/83/16 22/22/42
-f 308/340/18 21/21/11 36/36/40
-f 14/14/13 30/30/43 15/15/19
-f 7/7/17 23/23/44 8/8/22
-f 15/15/19 31/31/45 16/16/23
-f 8/8/22 24/24/46 9/9/26
-f 16/16/23 32/32/47 17/17/27
-f 28/28/39 44/44/48 29/29/41
-f 22/22/42 82/84/16 37/37/49
-f 308/341/18 36/36/40 51/51/50
-f 30/30/43 44/44/48 45/45/51
-f 22/22/42 38/38/52 23/23/44
-f 30/30/43 46/46/53 31/31/45
-f 23/23/44 39/39/54 24/24/46
-f 32/32/47 46/46/53 47/47/55
-f 24/24/46 40/40/56 25/25/33
-f 33/33/34 47/47/55 48/48/57
-f 25/25/33 41/41/58 26/26/35
-f 34/34/36 48/48/57 49/49/59
-f 26/26/35 42/42/60 27/27/37
-f 34/34/36 50/50/61 35/35/38
-f 27/27/37 43/43/62 28/28/39
-f 35/35/38 51/51/50 36/36/40
-f 47/47/55 63/63/63 48/48/57
-f 40/40/56 56/56/64 41/41/58
-f 48/48/57 64/64/65 49/49/59
-f 41/41/58 57/57/66 42/42/60
-f 49/49/59 65/65/67 50/50/61
-f 43/43/62 57/57/66 58/58/68
-f 50/50/61 66/66/69 51/51/50
-f 44/44/48 58/58/68 59/59/70
-f 37/37/49 82/85/16 52/52/71
-f 308/342/18 51/51/50 66/66/69
-f 44/44/48 60/60/72 45/45/51
-f 37/37/49 53/53/73 38/38/52
-f 45/45/51 61/61/74 46/46/53
-f 38/38/52 54/54/75 39/39/54
-f 47/47/55 61/61/74 62/62/76
-f 39/39/54 55/55/77 40/40/56
-f 308/343/18 66/66/69 81/81/78
-f 59/59/70 75/75/79 60/60/72
-f 52/52/71 68/68/80 53/53/73
-f 60/60/72 76/76/81 61/61/74
-f 53/53/73 69/69/82 54/54/75
-f 62/62/76 76/76/81 77/77/83
-f 54/54/75 70/70/84 55/55/77
-f 62/62/76 78/78/85 63/63/63
-f 56/56/64 70/70/84 71/71/86
-f 63/63/63 79/79/87 64/64/65
-f 56/56/64 72/72/88 57/57/66
-f 65/65/67 79/79/87 80/80/89
-f 58/58/68 72/72/88 73/73/90
-f 65/65/67 81/81/78 66/66/69
-f 59/59/70 73/73/90 74/74/91
-f 52/52/71 82/86/16 67/67/92
-f 78/78/85 95/126/93 79/79/87
-f 71/71/86 88/119/94 72/72/88
-f 79/79/87 96/127/95 80/80/89
-f 73/73/90 88/119/94 89/120/96
-f 81/81/78 96/127/95 97/128/97
-f 74/74/91 89/120/96 90/121/98
-f 67/67/92 82/87/16 83/114/99
-f 308/344/18 81/81/78 97/128/97
-f 74/74/91 91/122/100 75/75/79
-f 67/67/92 84/115/101 68/68/80
-f 75/75/79 92/123/102 76/76/81
-f 68/68/80 85/116/103 69/69/82
-f 77/77/83 92/123/102 93/124/104
-f 69/69/82 86/117/105 70/70/84
-f 77/77/83 94/125/106 78/78/85
-f 71/71/86 86/117/105 87/118/107
-f 84/115/101 98/129/108 99/130/109
-f 91/122/100 107/138/110 92/123/102
-f 84/115/101 100/131/111 85/116/103
-f 93/124/104 107/138/110 108/139/112
-f 85/116/103 101/132/113 86/117/105
-f 93/124/104 109/140/114 94/125/106
-f 87/118/107 101/132/113 102/133/115
-f 95/126/93 109/140/114 110/141/116
-f 87/118/107 103/134/117 88/119/94
-f 96/127/95 110/141/116 111/142/118
-f 89/120/96 103/134/117 104/135/119
-f 96/127/95 112/143/120 97/128/97
-f 90/121/98 104/135/119 105/136/121
-f 83/114/99 82/88/16 98/129/108
-f 308/345/18 97/128/97 112/143/120
-f 90/121/98 106/137/122 91/122/100
-f 102/133/115 118/149/123 103/134/117
-f 110/141/116 126/157/124 111/142/118
-f 104/135/119 118/149/123 119/150/125
-f 111/142/118 127/158/126 112/143/120
-f 105/136/121 119/150/125 120/151/127
-f 98/129/108 82/89/16 113/144/128
-f 308/346/18 112/143/120 127/158/126
-f 105/136/121 121/152/129 106/137/122
-f 99/130/109 113/144/128 114/145/130
-f 106/137/122 122/153/131 107/138/110
-f 99/130/109 115/146/132 100/131/111
-f 108/139/112 122/153/131 123/154/133
-f 100/131/111 116/147/134 101/132/113
-f 108/139/112 124/155/135 109/140/114
-f 102/133/115 116/147/134 117/148/136
-f 110/141/116 124/155/135 125/156/137
-f 121/152/129 137/168/138 122/153/131
-f 114/145/130 130/161/139 115/146/132
-f 123/154/133 137/168/138 138/169/140
-f 115/146/132 131/162/141 116/147/134
-f 123/154/133 139/170/142 124/155/135
-f 117/148/136 131/162/141 132/163/143
-f 125/156/137 139/170/142 140/171/144
-f 117/148/136 133/164/145 118/149/123
-f 125/156/137 141/172/146 126/157/124
-f 119/150/125 133/164/145 134/165/147
-f 126/157/124 142/173/148 127/158/126
-f 120/151/127 134/165/147 135/166/149
-f 113/144/128 82/90/16 128/159/150
-f 308/347/18 127/158/126 142/173/148
-f 120/151/127 136/167/151 121/152/129
-f 113/144/128 129/160/152 114/145/130
-f 140/171/144 156/187/153 141/172/146
-f 134/165/147 148/179/154 149/180/155
-f 142/173/148 156/187/153 157/188/156
-f 135/166/149 149/180/155 150/181/157
-f 128/159/150 82/91/16 143/174/158
-f 308/348/18 142/173/148 157/188/156
-f 135/166/149 151/182/159 136/167/151
-f 128/159/150 144/175/160 129/160/152
-f 136/167/151 152/183/161 137/168/138
-f 130/161/139 144/175/160 145/176/162
-f 138/169/140 152/183/161 153/184/163
-f 130/161/139 146/177/164 131/162/141
-f 138/169/140 154/185/165 139/170/142
-f 132/163/143 146/177/164 147/178/166
-f 140/171/144 154/185/165 155/186/167
-f 132/163/143 148/179/154 133/164/145
-f 145/176/162 159/190/168 160/191/169
-f 153/184/163 167/198/170 168/199/171
-f 145/176/162 161/192/172 146/177/164
-f 153/184/163 169/200/173 154/185/165
-f 147/178/166 161/192/172 162/193/174
-f 155/186/167 169/200/173 170/201/175
-f 147/178/166 163/194/176 148/179/154
-f 155/186/167 171/202/177 156/187/153
-f 149/180/155 163/194/176 164/195/178
-f 156/187/153 172/203/179 157/188/156
-f 150/181/157 164/195/178 165/196/180
-f 143/174/158 82/92/16 158/189/181
-f 308/349/18 157/188/156 172/203/179
-f 150/181/157 166/197/182 151/182/159
-f 143/174/158 159/190/168 144/175/160
-f 151/182/159 167/198/170 152/183/161
-f 164/195/178 178/209/183 179/210/184
-f 172/203/179 186/217/185 187/218/186
-f 165/196/180 179/210/184 180/211/187
-f 158/189/181 82/93/16 173/204/188
-f 308/350/18 172/203/179 187/218/186
-f 165/196/180 181/212/189 166/197/182
-f 158/189/181 174/205/190 159/190/168
-f 166/197/182 182/213/191 167/198/170
-f 159/190/168 175/206/192 160/191/169
-f 168/199/171 182/213/191 183/214/193
-f 160/191/169 176/207/194 161/192/172
-f 168/199/171 184/215/195 169/200/173
-f 162/193/174 176/207/194 177/208/196
-f 169/200/173 185/216/197 170/201/175
-f 162/193/174 178/209/183 163/194/176
-f 171/202/177 185/216/197 186/217/185
-f 183/214/193 197/228/198 198/229/199
-f 175/206/192 191/222/200 176/207/194
-f 183/214/193 199/230/201 184/215/195
-f 177/208/196 191/222/200 192/223/202
-f 185/216/197 199/230/201 200/231/203
-f 177/208/196 193/224/204 178/209/183
-f 185/216/197 201/232/205 186/217/185
-f 179/210/184 193/224/204 194/225/206
-f 186/217/185 202/233/207 187/218/186
-f 180/211/187 194/225/206 195/226/208
-f 173/204/188 82/94/16 188/219/209
-f 308/351/18 187/218/186 202/233/207
-f 180/211/187 196/227/210 181/212/189
-f 174/205/190 188/219/209 189/220/211
-f 181/212/189 197/228/198 182/213/191
-f 175/206/192 189/220/211 190/221/212
-f 201/232/205 217/248/213 202/233/207
-f 195/226/208 209/240/214 210/241/215
-f 188/219/209 82/95/16 203/234/216
-f 308/352/18 202/233/207 217/248/213
-f 195/226/208 211/242/217 196/227/210
-f 188/219/209 204/235/218 189/220/211
-f 196/227/210 212/243/219 197/228/198
-f 189/220/211 205/236/220 190/221/212
-f 198/229/199 212/243/219 213/244/221
-f 190/221/212 206/237/222 191/222/200
-f 198/229/199 214/245/223 199/230/201
-f 192/223/202 206/237/222 207/238/224
-f 200/231/203 214/245/223 215/246/225
-f 192/223/202 208/239/226 193/224/204
-f 200/231/203 216/247/227 201/232/205
-f 194/225/206 208/239/226 209/240/214
-f 213/244/221 229/260/228 214/245/223
-f 207/238/224 221/252/229 222/253/230
-f 215/246/225 229/260/228 230/261/231
-f 207/238/224 223/254/232 208/239/226
-f 215/246/225 231/262/233 216/247/227
-f 209/240/214 223/254/232 224/255/234
-f 216/247/227 232/263/235 217/248/213
-f 210/241/215 224/255/234 225/256/236
-f 203/234/216 82/96/16 218/249/237
-f 308/353/18 217/248/213 232/263/235
-f 210/241/215 226/257/238 211/242/217
-f 203/234/216 219/250/239 204/235/218
-f 211/242/217 227/258/240 212/243/219
-f 204/235/218 220/251/241 205/236/220
-f 213/244/221 227/258/240 228/259/242
-f 205/236/220 221/252/229 206/237/222
-f 218/249/237 82/97/16 233/264/243
-f 308/354/18 232/263/235 247/278/244
-f 225/256/236 241/272/245 226/257/238
-f 218/249/237 234/265/246 219/250/239
-f 226/257/238 242/273/247 227/258/240
-f 220/251/241 234/265/246 235/266/248
-f 228/259/242 242/273/247 243/274/249
-f 220/251/241 236/267/250 221/252/229
-f 228/259/242 244/275/251 229/260/228
-f 222/253/230 236/267/250 237/268/252
-f 230/261/231 244/275/251 245/276/253
-f 222/253/230 238/269/254 223/254/232
-f 230/261/231 246/277/255 231/262/233
-f 224/255/234 238/269/254 239/270/256
-f 232/263/235 246/277/255 247/278/244
-f 225/256/236 239/270/256 240/271/257
-f 237/268/252 251/282/258 252/283/259
-f 245/276/253 259/290/260 260/291/261
-f 237/268/252 253/284/262 238/269/254
-f 245/276/253 261/292/263 246/277/255
-f 239/270/256 253/284/262 254/285/264
-f 246/277/255 262/293/265 247/278/244
-f 240/271/257 254/285/264 255/286/266
-f 233/264/243 82/98/16 248/279/267
-f 308/355/18 247/278/244 262/293/265
-f 240/271/257 256/287/268 241/272/245
-f 233/264/243 249/280/269 234/265/246
-f 241/272/245 257/288/270 242/273/247
-f 234/265/246 250/281/271 235/266/248
-f 243/274/249 257/288/270 258/289/272
-f 235/266/248 251/282/258 236/267/250
-f 243/274/249 259/290/260 244/275/251
-f 255/286/266 271/302/273 256/287/268
-f 249/280/269 263/294/274 264/295/275
-f 256/287/268 272/303/276 257/288/270
-f 249/280/269 265/296/277 250/281/271
-f 258/289/272 272/303/276 273/304/278
-f 250/281/271 266/297/279 251/282/258
-f 258/289/272 274/305/280 259/290/260
-f 252/283/259 266/297/279 267/298/281
-f 260/291/261 274/305/280 275/306/282
-f 252/283/259 268/299/283 253/284/262
-f 260/291/261 276/307/284 261/292/263
-f 254/285/264 268/299/283 269/300/285
-f 261/292/263 277/308/286 262/293/265
-f 255/286/266 269/300/285 270/301/287
-f 248/279/267 82/99/16 263/294/274
-f 308/356/18 262/293/265 277/308/286
-f 275/306/282 289/320/288 290/321/289
-f 267/298/281 283/314/290 268/299/283
-f 275/306/282 291/322/291 276/307/284
-f 269/300/285 283/314/290 284/315/292
-f 277/308/286 291/322/291 292/323/293
-f 270/301/287 284/315/292 285/316/294
-f 263/294/274 82/100/16 278/309/295
-f 308/357/18 277/308/286 292/323/293
-f 270/301/287 286/317/296 271/302/273
-f 264/295/275 278/309/295 279/310/297
-f 271/302/273 287/318/298 272/303/276
-f 264/295/275 280/311/299 265/296/277
-f 273/304/278 287/318/298 288/319/300
-f 265/296/277 281/312/301 266/297/279
-f 273/304/278 289/320/288 274/305/280
-f 267/298/281 281/312/301 282/313/302
-f 278/309/295 294/325/303 279/310/297
-f 286/317/296 302/333/304 287/318/298
-f 279/310/297 295/326/305 280/311/299
-f 288/319/300 302/333/304 303/334/306
-f 280/311/299 296/327/307 281/312/301
-f 288/319/300 304/335/308 289/320/288
-f 282/313/302 296/327/307 297/328/309
-f 290/321/289 304/335/308 305/336/310
-f 282/313/302 298/329/311 283/314/290
-f 290/321/289 306/337/312 291/322/291
-f 284/315/292 298/329/311 299/330/313
-f 292/323/293 306/337/312 307/338/314
-f 285/316/294 299/330/313 300/331/315
-f 278/309/295 82/101/16 293/324/316
-f 308/358/18 292/323/293 307/338/314
-f 285/316/294 301/332/317 286/317/296
-f 297/328/309 314/376/318 298/329/311
-f 305/336/310 322/384/319 306/337/312
-f 299/330/313 314/376/318 315/377/320
-f 306/337/312 323/385/321 307/338/314
-f 300/331/315 315/377/320 316/378/322
-f 293/324/316 82/102/16 309/371/323
-f 308/359/18 307/338/314 323/385/321
-f 300/331/315 317/379/324 301/332/317
-f 293/324/316 310/372/325 294/325/303
-f 301/332/317 318/380/326 302/333/304
-f 294/325/303 311/373/327 295/326/305
-f 303/334/306 318/380/326 319/381/328
-f 295/326/305 312/374/329 296/327/307
-f 303/334/306 320/382/330 304/335/308
-f 297/328/309 312/374/329 313/375/331
-f 305/336/310 320/382/330 321/383/332
-f 317/379/324 333/395/333 318/380/326
-f 310/372/325 326/388/334 311/373/327
-f 319/381/328 333/395/333 334/396/335
-f 311/373/327 327/389/336 312/374/329
-f 319/381/328 335/397/337 320/382/330
-f 312/374/329 328/390/338 313/375/331
-f 321/383/332 335/397/337 336/398/339
-f 313/375/331 329/391/340 314/376/318
-f 321/383/332 337/399/341 322/384/319
-f 315/377/320 329/391/340 330/392/342
-f 322/384/319 338/400/343 323/385/321
-f 316/378/322 330/392/342 331/393/344
-f 309/371/323 82/103/16 324/386/345
-f 308/360/18 323/385/321 338/400/343
-f 316/378/322 332/394/346 317/379/324
-f 309/371/323 325/387/347 310/372/325
-f 336/398/339 352/414/348 337/399/341
-f 330/392/342 344/406/349 345/407/350
-f 337/399/341 353/415/351 338/400/343
-f 331/393/344 345/407/350 346/408/352
-f 324/386/345 82/104/16 339/401/353
-f 308/361/18 338/400/343 353/415/351
-f 331/393/344 347/409/354 332/394/346
-f 324/386/345 340/402/355 325/387/347
-f 332/394/346 348/410/356 333/395/333
-f 325/387/347 341/403/357 326/388/334
-f 334/396/335 348/410/356 349/411/358
-f 326/388/334 342/404/359 327/389/336
-f 334/396/335 350/412/360 335/397/337
-f 328/390/338 342/404/359 343/405/361
-f 336/398/339 350/412/360 351/413/362
-f 328/390/338 344/406/349 329/391/340
-f 349/411/358 363/434/363 364/436/364
-f 341/403/357 357/422/365 342/404/359
-f 349/411/358 365/438/366 350/412/360
-f 343/405/361 357/422/365 358/424/367
-f 351/413/362 365/438/366 366/440/368
-f 343/405/361 359/426/369 344/406/349
-f 351/413/362 367/442/370 352/414/348
-f 345/407/350 359/426/369 360/428/371
-f 352/414/348 368/445/372 353/415/351
-f 346/408/352 360/428/371 361/430/373
-f 339/401/353 82/105/16 354/416/374
-f 308/362/18 353/415/351 368/445/372
-f 346/408/352 362/432/375 347/409/354
-f 339/401/353 355/418/376 340/402/355
-f 347/409/354 363/434/363 348/410/356
-f 341/403/357 355/418/376 356/420/377
-f 367/443/370 383/460/378 368/444/372
-f 361/431/373 375/452/379 376/453/380
-f 354/417/374 82/106/16 369/446/381
-f 308/363/18 368/444/372 383/460/378
-f 361/431/373 377/454/382 362/433/375
-f 354/417/374 370/447/383 355/419/376
-f 362/433/375 378/455/384 363/435/363
-f 356/421/377 370/447/383 371/448/385
-f 364/437/364 378/455/384 379/456/386
-f 356/421/377 372/449/387 357/423/365
-f 364/437/364 380/457/388 365/439/366
-f 358/425/367 372/449/387 373/450/389
-f 366/441/368 380/457/388 381/458/390
-f 358/425/367 374/451/391 359/427/369
-f 366/441/368 382/459/392 367/443/370
-f 360/429/371 374/451/391 375/452/379
-f 371/448/385 387/464/393 372/449/387
-f 379/456/386 395/472/394 380/457/388
-f 373/450/389 387/464/393 388/465/395
-f 381/458/390 395/472/394 396/473/396
-f 373/450/389 389/466/397 374/451/391
-f 381/458/390 397/474/398 382/459/392
-f 375/452/379 389/466/397 390/467/399
-f 382/459/392 398/475/400 383/460/378
-f 376/453/380 390/467/399 391/468/401
-f 369/446/381 82/107/16 384/461/402
-f 308/364/18 383/460/378 398/475/400
-f 376/453/380 392/469/403 377/454/382
-f 369/446/381 385/462/404 370/447/383
-f 377/454/382 393/470/405 378/455/384
-f 371/448/385 385/462/404 386/463/406
-f 379/456/386 393/470/405 394/471/407
-f 391/468/401 405/482/408 406/483/409
-f 384/461/402 82/108/16 399/476/410
-f 308/365/18 398/475/400 413/490/411
-f 391/468/401 407/484/412 392/469/403
-f 385/462/404 399/476/410 400/477/413
-f 392/469/403 408/485/414 393/470/405
-f 385/462/404 401/478/415 386/463/406
-f 394/471/407 408/485/414 409/486/416
-f 386/463/406 402/479/417 387/464/393
-f 394/471/407 410/487/418 395/472/394
-f 388/465/395 402/479/417 403/480/419
-f 396/473/396 410/487/418 411/488/420
-f 388/465/395 404/481/421 389/466/397
-f 397/474/398 411/488/420 412/489/422
-f 390/467/399 404/481/421 405/482/408
-f 397/474/398 413/490/411 398/475/400
-f 409/486/416 425/502/423 410/487/418
-f 403/480/419 417/494/424 418/495/425
-f 411/488/420 425/502/423 426/503/426
-f 403/480/419 419/496/427 404/481/421
-f 411/488/420 427/504/428 412/489/422
-f 405/482/408 419/496/427 420/497/429
-f 412/489/422 428/505/430 413/490/411
-f 406/483/409 420/497/429 421/498/431
-f 399/476/410 82/109/16 414/491/432
-f 308/366/18 413/490/411 428/505/430
-f 406/483/409 422/499/433 407/484/412
-f 399/476/410 415/492/434 400/477/413
-f 407/484/412 423/500/435 408/485/414
-f 401/478/415 415/492/434 416/493/436
-f 409/486/416 423/500/435 424/501/437
-f 401/478/415 417/494/424 402/479/417
-f 414/491/432 82/110/16 429/506/438
-f 308/367/18 428/505/430 443/520/439
-f 421/498/431 437/514/440 422/499/433
-f 414/491/432 430/507/441 415/492/434
-f 422/499/433 438/515/442 423/500/435
-f 416/493/436 430/507/441 431/508/443
-f 424/501/437 438/515/442 439/516/444
-f 416/493/436 432/509/445 417/494/424
-f 424/501/437 440/517/446 425/502/423
-f 418/495/425 432/509/445 433/510/447
-f 426/503/426 440/517/446 441/518/448
-f 418/495/425 434/511/449 419/496/427
-f 426/503/426 442/519/450 427/504/428
-f 420/497/429 434/511/449 435/512/451
-f 427/504/428 443/520/439 428/505/430
-f 421/498/431 435/512/451 436/513/452
-f 433/510/447 447/524/453 448/525/454
-f 441/518/448 455/532/455 456/533/456
-f 433/510/447 449/526/457 434/511/449
-f 441/518/448 457/534/458 442/519/450
-f 435/512/451 449/526/457 450/527/459
-f 442/519/450 458/535/460 443/520/439
-f 436/513/452 450/527/459 451/528/461
-f 429/506/438 82/111/16 444/521/462
-f 308/368/18 443/520/439 458/535/460
-f 436/513/452 452/529/463 437/514/440
-f 430/507/441 444/521/462 445/522/464
-f 437/514/440 453/530/465 438/515/442
-f 430/507/441 446/523/466 431/508/443
-f 439/516/444 453/530/465 454/531/467
-f 431/508/443 447/524/453 432/509/445
-f 439/516/444 455/532/455 440/517/446
-f 451/528/461 467/544/468 452/529/463
-f 444/521/462 460/537/469 445/522/464
-f 452/529/463 468/545/470 453/530/465
-f 446/523/466 460/537/469 461/538/471
-f 454/531/467 468/545/470 469/546/472
-f 446/523/466 462/539/473 447/524/453
-f 454/531/467 470/547/474 455/532/455
-f 448/525/454 462/539/473 463/540/475
-f 456/533/456 470/547/474 471/548/476
-f 448/525/454 464/541/477 449/526/457
-f 456/533/456 472/549/478 457/534/458
-f 450/527/459 464/541/477 465/542/479
-f 458/535/460 472/549/478 473/550/480
-f 451/528/461 465/542/479 466/543/481
-f 444/521/462 82/112/16 459/536/482
-f 308/369/18 458/535/460 473/550/480
-f 471/548/476 479/556/1 480/557/3
-f 464/541/477 2/2/32 477/554/4
-f 471/548/476 481/558/8 472/549/478
-f 465/542/479 477/554/4 3/3/9
-f 472/549/478 482/559/12 473/550/480
-f 466/543/481 3/3/9 4/4/14
-f 459/536/482 82/113/16 474/551/15
-f 308/370/18 473/550/480 482/559/12
-f 466/543/481 5/5/20 467/544/468
-f 460/537/469 474/551/15 475/552/21
-f 467/544/468 478/555/24 468/545/470
-f 461/538/471 475/552/21 1/1/25
-f 468/545/470 6/6/28 469/546/472
-f 462/539/473 1/1/25 476/553/29
-f 469/546/472 479/556/1 470/547/474
-f 463/540/475 476/553/29 2/2/32
-f 479/556/1 18/18/31 19/19/2
-f 477/554/4 2/2/32 11/11/5
-f 480/557/3 19/19/2 20/20/7
-f 3/3/9 477/554/4 12/12/6
-f 481/558/8 20/20/7 21/21/11
-f 3/3/9 13/13/10 14/14/13
-f 4/4/14 14/14/13 15/15/19
-f 475/552/21 474/551/15 7/7/17
-f 5/5/20 15/15/19 16/16/23
-f 1/1/25 475/552/21 8/8/22
-f 478/555/24 16/16/23 17/17/27
-f 476/553/29 1/1/25 9/9/26
-f 6/6/28 17/17/27 18/18/31
-f 2/2/32 476/553/29 10/10/30
-f 9/9/26 24/24/46 25/25/33
-f 17/17/27 32/32/47 33/33/34
-f 10/10/30 25/25/33 26/26/35
-f 19/19/2 18/18/31 33/33/34
-f 11/11/5 26/26/35 27/27/37
-f 20/20/7 19/19/2 34/34/36
-f 13/13/10 12/12/6 27/27/37
-f 20/20/7 35/35/38 36/36/40
-f 13/13/10 28/28/39 29/29/41
-f 14/14/13 29/29/41 30/30/43
-f 7/7/17 22/22/42 23/23/44
-f 15/15/19 30/30/43 31/31/45
-f 8/8/22 23/23/44 24/24/46
-f 16/16/23 31/31/45 32/32/47
-f 28/28/39 43/43/62 44/44/48
-f 30/30/43 29/29/41 44/44/48
-f 22/22/42 37/37/49 38/38/52
-f 30/30/43 45/45/51 46/46/53
-f 23/23/44 38/38/52 39/39/54
-f 32/32/47 31/31/45 46/46/53
-f 24/24/46 39/39/54 40/40/56
-f 33/33/34 32/32/47 47/47/55
-f 25/25/33 40/40/56 41/41/58
-f 34/34/36 33/33/34 48/48/57
-f 26/26/35 41/41/58 42/42/60
-f 34/34/36 49/49/59 50/50/61
-f 27/27/37 42/42/60 43/43/62
-f 35/35/38 50/50/61 51/51/50
-f 47/47/55 62/62/76 63/63/63
-f 40/40/56 55/55/77 56/56/64
-f 48/48/57 63/63/63 64/64/65
-f 41/41/58 56/56/64 57/57/66
-f 49/49/59 64/64/65 65/65/67
-f 43/43/62 42/42/60 57/57/66
-f 50/50/61 65/65/67 66/66/69
-f 44/44/48 43/43/62 58/58/68
-f 44/44/48 59/59/70 60/60/72
-f 37/37/49 52/52/71 53/53/73
-f 45/45/51 60/60/72 61/61/74
-f 38/38/52 53/53/73 54/54/75
-f 47/47/55 46/46/53 61/61/74
-f 39/39/54 54/54/75 55/55/77
-f 59/59/70 74/74/91 75/75/79
-f 52/52/71 67/67/92 68/68/80
-f 60/60/72 75/75/79 76/76/81
-f 53/53/73 68/68/80 69/69/82
-f 62/62/76 61/61/74 76/76/81
-f 54/54/75 69/69/82 70/70/84
-f 62/62/76 77/77/83 78/78/85
-f 56/56/64 55/55/77 70/70/84
-f 63/63/63 78/78/85 79/79/87
-f 56/56/64 71/71/86 72/72/88
-f 65/65/67 64/64/65 79/79/87
-f 58/58/68 57/57/66 72/72/88
-f 65/65/67 80/80/89 81/81/78
-f 59/59/70 58/58/68 73/73/90
-f 78/78/85 94/125/106 95/126/93
-f 71/71/86 87/118/107 88/119/94
-f 79/79/87 95/126/93 96/127/95
-f 73/73/90 72/72/88 88/119/94
-f 81/81/78 80/80/89 96/127/95
-f 74/74/91 73/73/90 89/120/96
-f 74/74/91 90/121/98 91/122/100
-f 67/67/92 83/114/99 84/115/101
-f 75/75/79 91/122/100 92/123/102
-f 68/68/80 84/115/101 85/116/103
-f 77/77/83 76/76/81 92/123/102
-f 69/69/82 85/116/103 86/117/105
-f 77/77/83 93/124/104 94/125/106
-f 71/71/86 70/70/84 86/117/105
-f 84/115/101 83/114/99 98/129/108
-f 91/122/100 106/137/122 107/138/110
-f 84/115/101 99/130/109 100/131/111
-f 93/124/104 92/123/102 107/138/110
-f 85/116/103 100/131/111 101/132/113
-f 93/124/104 108/139/112 109/140/114
-f 87/118/107 86/117/105 101/132/113
-f 95/126/93 94/125/106 109/140/114
-f 87/118/107 102/133/115 103/134/117
-f 96/127/95 95/126/93 110/141/116
-f 89/120/96 88/119/94 103/134/117
-f 96/127/95 111/142/118 112/143/120
-f 90/121/98 89/120/96 104/135/119
-f 90/121/98 105/136/121 106/137/122
-f 102/133/115 117/148/136 118/149/123
-f 110/141/116 125/156/137 126/157/124
-f 104/135/119 103/134/117 118/149/123
-f 111/142/118 126/157/124 127/158/126
-f 105/136/121 104/135/119 119/150/125
-f 105/136/121 120/151/127 121/152/129
-f 99/130/109 98/129/108 113/144/128
-f 106/137/122 121/152/129 122/153/131
-f 99/130/109 114/145/130 115/146/132
-f 108/139/112 107/138/110 122/153/131
-f 100/131/111 115/146/132 116/147/134
-f 108/139/112 123/154/133 124/155/135
-f 102/133/115 101/132/113 116/147/134
-f 110/141/116 109/140/114 124/155/135
-f 121/152/129 136/167/151 137/168/138
-f 114/145/130 129/160/152 130/161/139
-f 123/154/133 122/153/131 137/168/138
-f 115/146/132 130/161/139 131/162/141
-f 123/154/133 138/169/140 139/170/142
-f 117/148/136 116/147/134 131/162/141
-f 125/156/137 124/155/135 139/170/142
-f 117/148/136 132/163/143 133/164/145
-f 125/156/137 140/171/144 141/172/146
-f 119/150/125 118/149/123 133/164/145
-f 126/157/124 141/172/146 142/173/148
-f 120/151/127 119/150/125 134/165/147
-f 120/151/127 135/166/149 136/167/151
-f 113/144/128 128/159/150 129/160/152
-f 140/171/144 155/186/167 156/187/153
-f 134/165/147 133/164/145 148/179/154
-f 142/173/148 141/172/146 156/187/153
-f 135/166/149 134/165/147 149/180/155
-f 135/166/149 150/181/157 151/182/159
-f 128/159/150 143/174/158 144/175/160
-f 136/167/151 151/182/159 152/183/161
-f 130/161/139 129/160/152 144/175/160
-f 138/169/140 137/168/138 152/183/161
-f 130/161/139 145/176/162 146/177/164
-f 138/169/140 153/184/163 154/185/165
-f 132/163/143 131/162/141 146/177/164
-f 140/171/144 139/170/142 154/185/165
-f 132/163/143 147/178/166 148/179/154
-f 145/176/162 144/175/160 159/190/168
-f 153/184/163 152/183/161 167/198/170
-f 145/176/162 160/191/169 161/192/172
-f 153/184/163 168/199/171 169/200/173
-f 147/178/166 146/177/164 161/192/172
-f 155/186/167 154/185/165 169/200/173
-f 147/178/166 162/193/174 163/194/176
-f 155/186/167 170/201/175 171/202/177
-f 149/180/155 148/179/154 163/194/176
-f 156/187/153 171/202/177 172/203/179
-f 150/181/157 149/180/155 164/195/178
-f 150/181/157 165/196/180 166/197/182
-f 143/174/158 158/189/181 159/190/168
-f 151/182/159 166/197/182 167/198/170
-f 164/195/178 163/194/176 178/209/183
-f 172/203/179 171/202/177 186/217/185
-f 165/196/180 164/195/178 179/210/184
-f 165/196/180 180/211/187 181/212/189
-f 158/189/181 173/204/188 174/205/190
-f 166/197/182 181/212/189 182/213/191
-f 159/190/168 174/205/190 175/206/192
-f 168/199/171 167/198/170 182/213/191
-f 160/191/169 175/206/192 176/207/194
-f 168/199/171 183/214/193 184/215/195
-f 162/193/174 161/192/172 176/207/194
-f 169/200/173 184/215/195 185/216/197
-f 162/193/174 177/208/196 178/209/183
-f 171/202/177 170/201/175 185/216/197
-f 183/214/193 182/213/191 197/228/198
-f 175/206/192 190/221/212 191/222/200
-f 183/214/193 198/229/199 199/230/201
-f 177/208/196 176/207/194 191/222/200
-f 185/216/197 184/215/195 199/230/201
-f 177/208/196 192/223/202 193/224/204
-f 185/216/197 200/231/203 201/232/205
-f 179/210/184 178/209/183 193/224/204
-f 186/217/185 201/232/205 202/233/207
-f 180/211/187 179/210/184 194/225/206
-f 180/211/187 195/226/208 196/227/210
-f 174/205/190 173/204/188 188/219/209
-f 181/212/189 196/227/210 197/228/198
-f 175/206/192 174/205/190 189/220/211
-f 201/232/205 216/247/227 217/248/213
-f 195/226/208 194/225/206 209/240/214
-f 195/226/208 210/241/215 211/242/217
-f 188/219/209 203/234/216 204/235/218
-f 196/227/210 211/242/217 212/243/219
-f 189/220/211 204/235/218 205/236/220
-f 198/229/199 197/228/198 212/243/219
-f 190/221/212 205/236/220 206/237/222
-f 198/229/199 213/244/221 214/245/223
-f 192/223/202 191/222/200 206/237/222
-f 200/231/203 199/230/201 214/245/223
-f 192/223/202 207/238/224 208/239/226
-f 200/231/203 215/246/225 216/247/227
-f 194/225/206 193/224/204 208/239/226
-f 213/244/221 228/259/242 229/260/228
-f 207/238/224 206/237/222 221/252/229
-f 215/246/225 214/245/223 229/260/228
-f 207/238/224 222/253/230 223/254/232
-f 215/246/225 230/261/231 231/262/233
-f 209/240/214 208/239/226 223/254/232
-f 216/247/227 231/262/233 232/263/235
-f 210/241/215 209/240/214 224/255/234
-f 210/241/215 225/256/236 226/257/238
-f 203/234/216 218/249/237 219/250/239
-f 211/242/217 226/257/238 227/258/240
-f 204/235/218 219/250/239 220/251/241
-f 213/244/221 212/243/219 227/258/240
-f 205/236/220 220/251/241 221/252/229
-f 225/256/236 240/271/257 241/272/245
-f 218/249/237 233/264/243 234/265/246
-f 226/257/238 241/272/245 242/273/247
-f 220/251/241 219/250/239 234/265/246
-f 228/259/242 227/258/240 242/273/247
-f 220/251/241 235/266/248 236/267/250
-f 228/259/242 243/274/249 244/275/251
-f 222/253/230 221/252/229 236/267/250
-f 230/261/231 229/260/228 244/275/251
-f 222/253/230 237/268/252 238/269/254
-f 230/261/231 245/276/253 246/277/255
-f 224/255/234 223/254/232 238/269/254
-f 232/263/235 231/262/233 246/277/255
-f 225/256/236 224/255/234 239/270/256
-f 237/268/252 236/267/250 251/282/258
-f 245/276/253 244/275/251 259/290/260
-f 237/268/252 252/283/259 253/284/262
-f 245/276/253 260/291/261 261/292/263
-f 239/270/256 238/269/254 253/284/262
-f 246/277/255 261/292/263 262/293/265
-f 240/271/257 239/270/256 254/285/264
-f 240/271/257 255/286/266 256/287/268
-f 233/264/243 248/279/267 249/280/269
-f 241/272/245 256/287/268 257/288/270
-f 234/265/246 249/280/269 250/281/271
-f 243/274/249 242/273/247 257/288/270
-f 235/266/248 250/281/271 251/282/258
-f 243/274/249 258/289/272 259/290/260
-f 255/286/266 270/301/287 271/302/273
-f 249/280/269 248/279/267 263/294/274
-f 256/287/268 271/302/273 272/303/276
-f 249/280/269 264/295/275 265/296/277
-f 258/289/272 257/288/270 272/303/276
-f 250/281/271 265/296/277 266/297/279
-f 258/289/272 273/304/278 274/305/280
-f 252/283/259 251/282/258 266/297/279
-f 260/291/261 259/290/260 274/305/280
-f 252/283/259 267/298/281 268/299/283
-f 260/291/261 275/306/282 276/307/284
-f 254/285/264 253/284/262 268/299/283
-f 261/292/263 276/307/284 277/308/286
-f 255/286/266 254/285/264 269/300/285
-f 275/306/282 274/305/280 289/320/288
-f 267/298/281 282/313/302 283/314/290
-f 275/306/282 290/321/289 291/322/291
-f 269/300/285 268/299/283 283/314/290
-f 277/308/286 276/307/284 291/322/291
-f 270/301/287 269/300/285 284/315/292
-f 270/301/287 285/316/294 286/317/296
-f 264/295/275 263/294/274 278/309/295
-f 271/302/273 286/317/296 287/318/298
-f 264/295/275 279/310/297 280/311/299
-f 273/304/278 272/303/276 287/318/298
-f 265/296/277 280/311/299 281/312/301
-f 273/304/278 288/319/300 289/320/288
-f 267/298/281 266/297/279 281/312/301
-f 278/309/295 293/324/316 294/325/303
-f 286/317/296 301/332/317 302/333/304
-f 279/310/297 294/325/303 295/326/305
-f 288/319/300 287/318/298 302/333/304
-f 280/311/299 295/326/305 296/327/307
-f 288/319/300 303/334/306 304/335/308
-f 282/313/302 281/312/301 296/327/307
-f 290/321/289 289/320/288 304/335/308
-f 282/313/302 297/328/309 298/329/311
-f 290/321/289 305/336/310 306/337/312
-f 284/315/292 283/314/290 298/329/311
-f 292/323/293 291/322/291 306/337/312
-f 285/316/294 284/315/292 299/330/313
-f 285/316/294 300/331/315 301/332/317
-f 297/328/309 313/375/331 314/376/318
-f 305/336/310 321/383/332 322/384/319
-f 299/330/313 298/329/311 314/376/318
-f 306/337/312 322/384/319 323/385/321
-f 300/331/315 299/330/313 315/377/320
-f 300/331/315 316/378/322 317/379/324
-f 293/324/316 309/371/323 310/372/325
-f 301/332/317 317/379/324 318/380/326
-f 294/325/303 310/372/325 311/373/327
-f 303/334/306 302/333/304 318/380/326
-f 295/326/305 311/373/327 312/374/329
-f 303/334/306 319/381/328 320/382/330
-f 297/328/309 296/327/307 312/374/329
-f 305/336/310 304/335/308 320/382/330
-f 317/379/324 332/394/346 333/395/333
-f 310/372/325 325/387/347 326/388/334
-f 319/381/328 318/380/326 333/395/333
-f 311/373/327 326/388/334 327/389/336
-f 319/381/328 334/396/335 335/397/337
-f 312/374/329 327/389/336 328/390/338
-f 321/383/332 320/382/330 335/397/337
-f 313/375/331 328/390/338 329/391/340
-f 321/383/332 336/398/339 337/399/341
-f 315/377/320 314/376/318 329/391/340
-f 322/384/319 337/399/341 338/400/343
-f 316/378/322 315/377/320 330/392/342
-f 316/378/322 331/393/344 332/394/346
-f 309/371/323 324/386/345 325/387/347
-f 336/398/339 351/413/362 352/414/348
-f 330/392/342 329/391/340 344/406/349
-f 337/399/341 352/414/348 353/415/351
-f 331/393/344 330/392/342 345/407/350
-f 331/393/344 346/408/352 347/409/354
-f 324/386/345 339/401/353 340/402/355
-f 332/394/346 347/409/354 348/410/356
-f 325/387/347 340/402/355 341/403/357
-f 334/396/335 333/395/333 348/410/356
-f 326/388/334 341/403/357 342/404/359
-f 334/396/335 349/411/358 350/412/360
-f 328/390/338 327/389/336 342/404/359
-f 336/398/339 335/397/337 350/412/360
-f 328/390/338 343/405/361 344/406/349
-f 349/411/358 348/410/356 363/434/363
-f 341/403/357 356/420/377 357/422/365
-f 349/411/358 364/436/364 365/438/366
-f 343/405/361 342/404/359 357/422/365
-f 351/413/362 350/412/360 365/438/366
-f 343/405/361 358/424/367 359/426/369
-f 351/413/362 366/440/368 367/442/370
-f 345/407/350 344/406/349 359/426/369
-f 352/414/348 367/442/370 368/445/372
-f 346/408/352 345/407/350 360/428/371
-f 346/408/352 361/430/373 362/432/375
-f 339/401/353 354/416/374 355/418/376
-f 347/409/354 362/432/375 363/434/363
-f 341/403/357 340/402/355 355/418/376
-f 367/443/370 382/459/392 383/460/378
-f 361/431/373 360/429/371 375/452/379
-f 361/431/373 376/453/380 377/454/382
-f 354/417/374 369/446/381 370/447/383
-f 362/433/375 377/454/382 378/455/384
-f 356/421/377 355/419/376 370/447/383
-f 364/437/364 363/435/363 378/455/384
-f 356/421/377 371/448/385 372/449/387
-f 364/437/364 379/456/386 380/457/388
-f 358/425/367 357/423/365 372/449/387
-f 366/441/368 365/439/366 380/457/388
-f 358/425/367 373/450/389 374/451/391
-f 366/441/368 381/458/390 382/459/392
-f 360/429/371 359/427/369 374/451/391
-f 371/448/385 386/463/406 387/464/393
-f 379/456/386 394/471/407 395/472/394
-f 373/450/389 372/449/387 387/464/393
-f 381/458/390 380/457/388 395/472/394
-f 373/450/389 388/465/395 389/466/397
-f 381/458/390 396/473/396 397/474/398
-f 375/452/379 374/451/391 389/466/397
-f 382/459/392 397/474/398 398/475/400
-f 376/453/380 375/452/379 390/467/399
-f 376/453/380 391/468/401 392/469/403
-f 369/446/381 384/461/402 385/462/404
-f 377/454/382 392/469/403 393/470/405
-f 371/448/385 370/447/383 385/462/404
-f 379/456/386 378/455/384 393/470/405
-f 391/468/401 390/467/399 405/482/408
-f 391/468/401 406/483/409 407/484/412
-f 385/462/404 384/461/402 399/476/410
-f 392/469/403 407/484/412 408/485/414
-f 385/462/404 400/477/413 401/478/415
-f 394/471/407 393/470/405 408/485/414
-f 386/463/406 401/478/415 402/479/417
-f 394/471/407 409/486/416 410/487/418
-f 388/465/395 387/464/393 402/479/417
-f 396/473/396 395/472/394 410/487/418
-f 388/465/395 403/480/419 404/481/421
-f 397/474/398 396/473/396 411/488/420
-f 390/467/399 389/466/397 404/481/421
-f 397/474/398 412/489/422 413/490/411
-f 409/486/416 424/501/437 425/502/423
-f 403/480/419 402/479/417 417/494/424
-f 411/488/420 410/487/418 425/502/423
-f 403/480/419 418/495/425 419/496/427
-f 411/488/420 426/503/426 427/504/428
-f 405/482/408 404/481/421 419/496/427
-f 412/489/422 427/504/428 428/505/430
-f 406/483/409 405/482/408 420/497/429
-f 406/483/409 421/498/431 422/499/433
-f 399/476/410 414/491/432 415/492/434
-f 407/484/412 422/499/433 423/500/435
-f 401/478/415 400/477/413 415/492/434
-f 409/486/416 408/485/414 423/500/435
-f 401/478/415 416/493/436 417/494/424
-f 421/498/431 436/513/452 437/514/440
-f 414/491/432 429/506/438 430/507/441
-f 422/499/433 437/514/440 438/515/442
-f 416/493/436 415/492/434 430/507/441
-f 424/501/437 423/500/435 438/515/442
-f 416/493/436 431/508/443 432/509/445
-f 424/501/437 439/516/444 440/517/446
-f 418/495/425 417/494/424 432/509/445
-f 426/503/426 425/502/423 440/517/446
-f 418/495/425 433/510/447 434/511/449
-f 426/503/426 441/518/448 442/519/450
-f 420/497/429 419/496/427 434/511/449
-f 427/504/428 442/519/450 443/520/439
-f 421/498/431 420/497/429 435/512/451
-f 433/510/447 432/509/445 447/524/453
-f 441/518/448 440/517/446 455/532/455
-f 433/510/447 448/525/454 449/526/457
-f 441/518/448 456/533/456 457/534/458
-f 435/512/451 434/511/449 449/526/457
-f 442/519/450 457/534/458 458/535/460
-f 436/513/452 435/512/451 450/527/459
-f 436/513/452 451/528/461 452/529/463
-f 430/507/441 429/506/438 444/521/462
-f 437/514/440 452/529/463 453/530/465
-f 430/507/441 445/522/464 446/523/466
-f 439/516/444 438/515/442 453/530/465
-f 431/508/443 446/523/466 447/524/453
-f 439/516/444 454/531/467 455/532/455
-f 451/528/461 466/543/481 467/544/468
-f 444/521/462 459/536/482 460/537/469
-f 452/529/463 467/544/468 468/545/470
-f 446/523/466 445/522/464 460/537/469
-f 454/531/467 453/530/465 468/545/470
-f 446/523/466 461/538/471 462/539/473
-f 454/531/467 469/546/472 470/547/474
-f 448/525/454 447/524/453 462/539/473
-f 456/533/456 455/532/455 470/547/474
-f 448/525/454 463/540/475 464/541/477
-f 456/533/456 471/548/476 472/549/478
-f 450/527/459 449/526/457 464/541/477
-f 458/535/460 457/534/458 472/549/478
-f 451/528/461 450/527/459 465/542/479
-f 471/548/476 470/547/474 479/556/1
-f 464/541/477 463/540/475 2/2/32
-f 471/548/476 480/557/3 481/558/8
-f 465/542/479 464/541/477 477/554/4
-f 472/549/478 481/558/8 482/559/12
-f 466/543/481 465/542/479 3/3/9
-f 466/543/481 4/4/14 5/5/20
-f 460/537/469 459/536/482 474/551/15
-f 467/544/468 5/5/20 478/555/24
-f 461/538/471 460/537/469 475/552/21
-f 468/545/470 478/555/24 6/6/28
-f 462/539/473 461/538/471 1/1/25
-f 469/546/472 6/6/28 479/556/1
-f 463/540/475 462/539/473 476/553/29
diff --git a/assets/textures/plane.jpg b/assets/textures/plane.jpg
deleted file mode 100644
index 3fb0efb..0000000
Binary files a/assets/textures/plane.jpg and /dev/null differ
diff --git a/assets/textures/skysphere.jpg b/assets/textures/skysphere.jpg
deleted file mode 100644
index f2e075c..0000000
Binary files a/assets/textures/skysphere.jpg and /dev/null differ
diff --git a/engine/engine.sln b/engine/engine.sln
new file mode 100644
index 0000000..2c82b5e
--- /dev/null
+++ b/engine/engine.sln
@@ -0,0 +1,25 @@
+
+Microsoft Visual Studio Solution File, Format Version 12.00
+# Visual Studio Version 17
+VisualStudioVersion = 17.4.33110.190
+MinimumVisualStudioVersion = 10.0.40219.1
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "engine", "engine.vcxproj", "{CE66087C-D527-45C1-A97E-7530D9D6F2AE}"
+EndProject
+Global
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
+ Debug|x64 = Debug|x64
+ Release|x64 = Release|x64
+ EndGlobalSection
+ GlobalSection(ProjectConfigurationPlatforms) = postSolution
+ {CE66087C-D527-45C1-A97E-7530D9D6F2AE}.Debug|x64.ActiveCfg = Debug|x64
+ {CE66087C-D527-45C1-A97E-7530D9D6F2AE}.Debug|x64.Build.0 = Debug|x64
+ {CE66087C-D527-45C1-A97E-7530D9D6F2AE}.Release|x64.ActiveCfg = Release|x64
+ {CE66087C-D527-45C1-A97E-7530D9D6F2AE}.Release|x64.Build.0 = Release|x64
+ EndGlobalSection
+ GlobalSection(SolutionProperties) = preSolution
+ HideSolutionNode = FALSE
+ EndGlobalSection
+ GlobalSection(ExtensibilityGlobals) = postSolution
+ SolutionGuid = {59A54FC0-03D1-44FB-9513-B5B1DF38FD25}
+ EndGlobalSection
+EndGlobal
diff --git a/engine/engine.vcxproj b/engine/engine.vcxproj
new file mode 100644
index 0000000..8e3ecb8
--- /dev/null
+++ b/engine/engine.vcxproj
@@ -0,0 +1,199 @@
+
+
+
+
+ Debug
+ x64
+
+
+ Release
+ x64
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Create
+ Create
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 16.0
+ Win32Proj
+ {ce66087c-d527-45c1-a97e-7530d9d6f2ae}
+ engine
+ 10.0
+
+
+
+ StaticLibrary
+ true
+ v143
+ Unicode
+
+
+ StaticLibrary
+ false
+ v143
+ true
+ Unicode
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ $(SolutionDir)build\$(Configuration)\
+ build\$(Configuration)\obj\
+
+
+ $(SolutionDir)build\$(Configuration)\
+ build\$(Configuration)\obj\
+
+
+
+ Level3
+ true
+ _DEBUG;_LIB;%(PreprocessorDefinitions);
+_CRT_SECURE_NO_WARNINGS
+ true
+ Use
+ pch.hpp
+ stdcpp20
+ $(SolutionDir)src/;C:\VulkanSDK\1.3.231.1\Include/;$(SolutionDir)vendor/glfw/include/;$(SolutionDir)vendor/vma/include/;$(SolutionDir)vendor/glm/;$(SolutionDir)vendor/imgui/;$(SolutionDir)vendor/stb/;$(SolutionDir)vendor/assimp/include/;$(SolutionDir)vendor/volk/;%(AdditionalIncludeDirectories)
+ pch.hpp;%(ForcedIncludeFiles)
+ MultiThreadedDebug
+
+
+
+
+ true
+
+
+ true
+
+
+ glfw3_mt.lib;shaderc_shared.lib;assimp-vc143-mtd.lib;zlibstaticd.lib;xaudio2.lib;%(AdditionalDependencies)
+
+
+ C:\VulkanSDK\1.3.231.1\Lib;$(SolutionDir)vendor\glfw\lib\Release;$(SolutionDir)vendor\assimp\lib\$(Configuration);%(AdditionalLibraryDirectories)
+
+
+
+
+ Level3
+ true
+ true
+ true
+ NDEBUG;_LIB;%(PreprocessorDefinitions);
+_CRT_SECURE_NO_WARNINGS
+ true
+ Use
+ pch.hpp
+ stdcpp20
+ $(SolutionDir)src/;C:\VulkanSDK\1.3.231.1\Include/;$(SolutionDir)vendor/glfw/include/;$(SolutionDir)vendor/vma/include/;$(SolutionDir)vendor/glm/;$(SolutionDir)vendor/imgui/;$(SolutionDir)vendor/stb/;$(SolutionDir)vendor/assimp/include/;$(SolutionDir)vendor/volk/;%(AdditionalIncludeDirectories)
+ pch.hpp;%(ForcedIncludeFiles)
+ MultiThreaded
+
+
+
+
+ true
+ true
+ true
+
+
+ true
+
+
+ glfw3_mt.lib;shaderc_shared.lib;assimp-vc143-mt.lib;zlibstatic.lib;xaudio2.lib;%(AdditionalDependencies)
+
+
+ C:\VulkanSDK\1.3.231.1\Lib;$(SolutionDir)vendor\glfw\lib\Release;$(SolutionDir)vendor\assimp\lib\$(Configuration);%(AdditionalLibraryDirectories)
+
+
+
+
+
+
\ No newline at end of file
diff --git a/engine/engine.vcxproj.filters b/engine/engine.vcxproj.filters
new file mode 100644
index 0000000..b6c525b
--- /dev/null
+++ b/engine/engine.vcxproj.filters
@@ -0,0 +1,240 @@
+
+
+
+
+ {4FC737F1-C7A5-4376-A066-2A32D752A2FF}
+ cpp;c;cc;cxx;c++;cppm;ixx;def;odl;idl;hpj;bat;asm;asmx
+
+
+ {93995380-89BD-4b04-88EB-625FBE52EBFB}
+ h;hh;hpp;hxx;h++;hm;inl;inc;ipp;xsd
+
+
+ {67DA6AB6-F800-4c08-8B7A-83BB121AAD01}
+ rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms
+
+
+
+
+ Source Files
+
+
+ Source Files
+
+
+ Source Files
+
+
+ Source Files
+
+
+ Source Files
+
+
+ Source Files
+
+
+ Source Files
+
+
+ Source Files
+
+
+ Source Files
+
+
+ Source Files
+
+
+ Source Files
+
+
+ Source Files
+
+
+ Source Files
+
+
+ Source Files
+
+
+ Source Files
+
+
+ Source Files
+
+
+ Source Files
+
+
+ Source Files
+
+
+ Source Files
+
+
+ Source Files
+
+
+ Source Files
+
+
+ Source Files
+
+
+ Source Files
+
+
+ Source Files
+
+
+ Source Files
+
+
+ Source Files
+
+
+ Source Files
+
+
+ Source Files
+
+
+ Source Files
+
+
+ Source Files
+
+
+ Source Files
+
+
+ Source Files
+
+
+ Source Files
+
+
+ Source Files
+
+
+ Source Files
+
+
+ Source Files
+
+
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+
\ No newline at end of file
diff --git a/engine/engine.vcxproj.user b/engine/engine.vcxproj.user
new file mode 100644
index 0000000..966b4ff
--- /dev/null
+++ b/engine/engine.vcxproj.user
@@ -0,0 +1,6 @@
+
+
+
+ true
+
+
\ No newline at end of file
diff --git a/engine/include/engine.h b/engine/include/engine.h
new file mode 100644
index 0000000..35185b0
--- /dev/null
+++ b/engine/include/engine.h
@@ -0,0 +1,342 @@
+#ifndef ENGINE_H
+#define ENGINE_H
+
+
+// TODO: Find a better way of obtaining engine specific details without having
+// everything be a function. Maybe a single struct with everything combined?
+// The main problem is that I do not want to include various dependencies.
+
+// TODO: Functions should generally not use random values as input for example
+// for "modes" such as default or wireframe rendering a better system should
+// be used.
+
+
+//
+//
+//
+//
+struct Engine;
+
+// Core
+
+//
+// This is the first function that must be called. It initializes all systems
+// such as the window, renderer, audio etc. Takes an EngineInfo as a parameter
+// which provides the required information the engine needs to initialize.
+Engine* engine_initialize(const char* name, int width, int height);
+
+//
+// The final engine related function call that will terminate all sub-systems
+// and free all engine managed memory. Engine* should be a valid pointer
+// created by the EngineInitialize function. If NULL is passed then the function
+// simply does nothing.
+void engine_terminate(Engine* engine);
+
+// This should be called to change from running to a non-running state. Following
+// this call will result in the engine no longer updating and can begin to be
+// shutdown.
+void engine_should_terminate(Engine* engine);
+
+void engine_set_window_icon(Engine* engine, unsigned char* data, int width, int height);
+
+// Callbacks
+void engine_register_key_callback(Engine* engine, void (*KeyCallback)(Engine* engine, int keycode));
+
+// Rendering
+
+void engine_set_render_mode(Engine* engine, int mode);
+//
+// Updates the internal state of the engine. This is called every frame before
+// any rendering related function calls. The boolean return value returns true
+// if the engine is running as normal. On the other hand, if the engine is no
+// longer running i.e has been instructed to shutdown then the return value
+// will be false. This function should be used as the condition in a while loop.
+bool engine_update(Engine* engine);
+
+//
+// Obtains the next available frame in preparation for issuing rendering
+// commands to the engine. This must be the first rendering related function
+// call within the main loop.
+bool engine_begin_render(Engine* engine);
+
+//
+//
+//
+//
+void engine_render(Engine* engine);
+
+//
+// Executes all the rendering commands issued for the current frame and then
+// presents the results onto the screen.
+void engine_present(Engine* engine);
+
+// Environment
+
+//
+//
+//
+//
+void engine_set_environment_map(const char* path);
+
+// Models
+
+//
+// Loads a model and all associated resources.
+//
+//
+void engine_add_model(Engine* engine, const char* path, bool flipUVs);
+
+//
+// Removes a model by deallocating all resources a model.
+//
+//
+void engine_remove_model(Engine* engine, int modelID);
+
+//
+//
+//
+//
+int engine_get_model_count(Engine* engine);
+
+//
+//
+//
+//
+const char* engine_get_model_name(Engine* engine, int modelID);
+
+// Instances
+
+//
+//
+//
+//
+int engine_get_instance_count(Engine* engine);
+
+//
+//
+//
+//
+void engine_add_instance(Engine* engine, int modelID, float x, float y, float z);
+
+//
+//
+//
+//
+void engine_remove_instance(Engine* engine, int instanceID);
+
+//
+//
+//
+//
+int engine_get_instance_id(Engine* engine, int instanceIndex);
+
+
+
+//void EngineGetInstances(Engine* engine, Instance* instance, int* instanceCount);
+//
+//
+//
+//
+const char* engine_get_instance_name(Engine* engine, int instanceIndex);
+
+
+void engine_get_instance_matrix(Engine* engine, int instanceIndex, float*& matrix);
+//
+//
+//
+//
+void engine_get_instance_position(Engine* engine, int instanceIndex, float*& position);
+void engine_set_instance_position(Engine* engine, int instanceIndex, float x, float y, float z);
+//
+//
+//
+//
+void engine_get_instance_rotation(Engine* engine, int instanceIndex, float*& rotation);
+void engine_set_instance_rotation(Engine* engine, int instanceIndex, float x, float y, float z);
+//
+//
+//
+//
+void engine_get_instance_scale(Engine* engine, int instanceIndex, float* scale);
+void engine_set_instance_scale(Engine* engine, int instanceIndex, float scale);
+void engine_set_instance_scale(Engine* engine, int instanceIndex, float x, float y, float z);
+// Timing
+
+//
+//
+//
+//
+double engine_get_delta_time(Engine* engine);
+
+
+const char* engine_get_gpu_name(Engine* engine);
+//
+//
+//
+//
+void engine_get_uptime(Engine* engine, int* hours, int* minutes, int* seconds);
+
+
+// Memory
+
+//
+//
+//
+//
+void engine_get_memory_status(Engine* engine, float* memoryUsage, unsigned int* maxMemory);
+
+// Filesystem
+
+//
+//
+//
+//
+const char* engine_display_file_explorer(Engine* engine, const char* path); // TEMP: Must be moved to VMVE
+
+//
+//
+//
+//
+const char* engine_get_executable_directory(Engine* engine);
+
+// Input
+
+
+//
+//
+//
+void engine_set_cursor_mode(Engine* engine, int cursorMode);
+
+//
+//
+//
+//
+void engine_update_input(Engine* engine);
+
+// Camera
+
+//
+// Initializes a camera.
+//
+//
+void engine_create_camera(Engine* engine, float fovy, float speed);
+
+//
+//
+//
+//
+void engine_update_camera_view(Engine* engine);
+
+//
+//
+//
+//
+void engine_update_camera_projection(Engine* engine, int width, int height);
+
+
+float* engine_get_camera_view(Engine* engine);
+float* engine_get_camera_projection(Engine* engine);
+
+//
+//
+//
+//
+void engine_get_camera_position(Engine* engine, float* x, float* y, float* z);
+
+//
+//
+//
+//
+void engine_get_camera_front_vector(Engine* engine, float* x, float* y, float* z);
+
+//
+//
+//
+//
+float* engine_get_camera_fov(Engine* engine);
+
+//
+//
+//
+//
+float* engine_get_camera_speed(Engine* engine);
+
+//
+//
+//
+//
+float* engine_get_camera_near(Engine* engine);
+
+//
+//
+//
+//
+float* engine_get_camera_far(Engine* engine);
+
+//
+//
+//
+//
+void engine_set_camera_position(Engine* engine, float x, float y, float z);
+
+// Logs
+
+//
+//
+//
+//
+void engine_clear_logs(Engine* engine);
+
+//
+//
+//
+//
+void engine_export_logs_to_file(Engine* engine, const char* path);
+
+//
+//
+//
+//
+int engine_get_log_count(Engine* engine);
+
+//
+//
+//
+//
+int engine_get_log_type(Engine* engine, int logIndex);
+
+//
+//
+//
+//
+const char* engine_get_log(Engine* engine, int logIndex);
+
+
+// UI
+
+//
+//
+//
+//
+void engine_enable_ui(Engine* engine);
+
+//
+//
+//
+//
+void engine_begin_ui_pass();
+
+//
+//
+//
+//
+void engine_end_ui_pass();
+
+//
+//
+//
+//
+void engine_render_viewport_ui(int width, int height);
+
+
+#endif
\ No newline at end of file
diff --git a/engine/src/audio/audio.cpp b/engine/src/audio/audio.cpp
new file mode 100644
index 0000000..56d0dfd
--- /dev/null
+++ b/engine/src/audio/audio.cpp
@@ -0,0 +1,45 @@
+#include "audio.hpp"
+
+#include "logging.hpp"
+
+Audio* create_windows_audio() {
+ Logger::info("Initializing audio");
+
+ auto audio = new Audio();
+
+ // Initialize COM
+ HRESULT hr = S_OK;
+
+ hr = CoInitializeEx(nullptr, COINIT_MULTITHREADED);
+ if (FAILED(hr)) {
+ Logger::error("Failed to initialize COM");
+
+ return nullptr;
+ }
+
+ hr = XAudio2Create(&audio->ix_audio, 0, XAUDIO2_USE_DEFAULT_PROCESSOR);
+ if (FAILED(hr)) {
+ Logger::error("Failed to create xaudio2");
+ return nullptr;
+ }
+
+ hr = audio->ix_audio->CreateMasteringVoice(&audio->master_voice);
+ if (FAILED(hr)) {
+ Logger::error("Failed to create mastering voice");
+ return nullptr;
+ }
+
+ return audio;
+}
+
+void destroy_windows_audio(Audio* audio) {
+ if (!audio)
+ return;
+
+ Logger::info("Terminating audio");
+
+ audio->master_voice->DestroyVoice();
+ audio->ix_audio->Release();
+
+ CoUninitialize();
+}
diff --git a/engine/src/audio/audio.hpp b/engine/src/audio/audio.hpp
new file mode 100644
index 0000000..839743d
--- /dev/null
+++ b/engine/src/audio/audio.hpp
@@ -0,0 +1,14 @@
+#ifndef MY_ENGINE_AUDIO_HPP
+#define MY_ENGINE_AUDIO_HPP
+
+
+struct Audio {
+ IXAudio2* ix_audio;
+ IXAudio2MasteringVoice* master_voice;
+};
+
+
+Audio* create_windows_audio();
+void destroy_windows_audio(Audio* audio);
+
+#endif
\ No newline at end of file
diff --git a/src/input.cpp b/engine/src/core/input.cpp
similarity index 54%
rename from src/input.cpp
rename to engine/src/core/input.cpp
index 8b645d3..1bbb667 100644
--- a/src/input.cpp
+++ b/engine/src/core/input.cpp
@@ -1,12 +1,12 @@
#include "input.hpp"
-#include "renderer/renderer.hpp"
+#include "rendering/api/vulkan/renderer.hpp"
bool is_key_down(int keycode) {
// HACK: The renderer has a pointer to the window which we can use for now.
- const renderer_context_t* rc = get_renderer_context();
+ const Vulkan_Context& ctx = get_vulkan_context();
- const int state = glfwGetKey(rc->window->handle, keycode);
+ const int state = glfwGetKey(ctx.window->handle, keycode);
return state == GLFW_PRESS;
}
@@ -15,13 +15,12 @@ bool is_mouse_button_down(int buttoncode) {
return false;
}
-glm::vec2 get_mouse_position() {
+glm::vec2 get_cursor_position() {
// HACK: The renderer has a pointer to the window which we can use for now.
- const renderer_context_t* rc = get_renderer_context();
+ const Vulkan_Context& ctx = get_vulkan_context();
double x, y;
- glfwGetCursorPos(rc->window->handle, &x, &y);
-
+ glfwGetCursorPos(ctx.window->handle, &x, &y);
return { x, y };
}
diff --git a/src/input.hpp b/engine/src/core/input.hpp
similarity index 81%
rename from src/input.hpp
rename to engine/src/core/input.hpp
index 0269196..914107a 100644
--- a/src/input.hpp
+++ b/engine/src/core/input.hpp
@@ -6,7 +6,7 @@ bool is_key_down(int keycode);
bool is_mouse_button_down(int buttoncode);
-glm::vec2 get_mouse_position();
+glm::vec2 get_cursor_position();
#endif
diff --git a/engine/src/core/platform/windows.cpp b/engine/src/core/platform/windows.cpp
new file mode 100644
index 0000000..7687199
--- /dev/null
+++ b/engine/src/core/platform/windows.cpp
@@ -0,0 +1,9 @@
+#include "windows.hpp"
+
+MEMORYSTATUSEX get_windows_memory_status() {
+ MEMORYSTATUSEX memInfo{};
+ memInfo.dwLength = sizeof(MEMORYSTATUSEX);
+ GlobalMemoryStatusEx(&memInfo);
+
+ return memInfo;
+}
\ No newline at end of file
diff --git a/engine/src/core/platform/windows.hpp b/engine/src/core/platform/windows.hpp
new file mode 100644
index 0000000..91b88e3
--- /dev/null
+++ b/engine/src/core/platform/windows.hpp
@@ -0,0 +1,6 @@
+#ifndef MY_ENGINE_WINDOWS_HPP
+#define MY_ENGINE_WINDOWS_HPP
+
+MEMORYSTATUSEX get_windows_memory_status();
+
+#endif
\ No newline at end of file
diff --git a/engine/src/core/win32_window.cpp b/engine/src/core/win32_window.cpp
new file mode 100644
index 0000000..4fcaae7
--- /dev/null
+++ b/engine/src/core/win32_window.cpp
@@ -0,0 +1,89 @@
+#include "win32_window.hpp"
+
+
+#include "logging.hpp"
+
+static LRESULT CALLBACK win32_window_callback(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
+
+Win32_Window* create_win32_window(const char* title, int width, int height) {
+ Win32_Window* window = reinterpret_cast(malloc(sizeof(Win32_Window)));
+
+ WNDCLASSEXA wndClass = {};
+ wndClass.cbSize = sizeof(WNDCLASSEX);
+ wndClass.style = CS_HREDRAW | CS_VREDRAW;
+ wndClass.lpfnWndProc = win32_window_callback;
+ wndClass.cbClsExtra = 0;
+ wndClass.cbWndExtra = 0;
+ wndClass.hInstance = GetModuleHandleA(0);
+ wndClass.hIcon = nullptr;
+ wndClass.hbrBackground = reinterpret_cast(COLOR_BACKGROUND + 1);
+ wndClass.lpszMenuName = nullptr;
+ wndClass.lpszClassName = title;
+ wndClass.hIconSm = nullptr;
+
+ if (!RegisterClassExA(&wndClass)) {
+ Logger::error("Failed to register win32 window class");
+ return nullptr;
+ }
+
+ window->handle = CreateWindowExA(
+ WS_EX_OVERLAPPEDWINDOW,
+ wndClass.lpszClassName,
+ title,
+ WS_OVERLAPPEDWINDOW | WS_VISIBLE,
+ CW_USEDEFAULT,
+ CW_USEDEFAULT,
+ width,
+ height,
+ nullptr,
+ nullptr,
+ wndClass.hInstance,
+ nullptr
+ );
+
+ if (!window->handle) {
+ Logger::error("Failed to create win32 window");
+ return nullptr;
+ }
+
+ SetWindowLongPtrA(window->handle, GWLP_USERDATA, reinterpret_cast(window));
+
+ window->title = title;
+ window->width = width;
+ window->height = height;
+
+ return window;
+}
+
+void destroy_win32_window(Win32_Window* window) {
+ free(window);
+}
+
+LRESULT CALLBACK win32_window_callback(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) {
+ LRESULT result = 0;
+
+ Win32_Window* window = reinterpret_cast(GetWindowLongPtrA(hWnd, GWLP_USERDATA));
+
+ switch (uMsg) {
+ case WM_CREATE:
+ break;
+ case WM_SIZE:
+ if (!window)
+ break;
+ window->width = LOWORD(lParam);
+ window->height = HIWORD(lParam);
+
+ break;
+ case WM_CLOSE:
+ DestroyWindow(hWnd);
+ break;
+ case WM_DESTROY:
+ PostQuitMessage(0);
+ break;
+ default:
+ result = DefWindowProcA(hWnd, uMsg, wParam, lParam);
+ break;
+ }
+
+ return result;
+}
\ No newline at end of file
diff --git a/engine/src/core/win32_window.hpp b/engine/src/core/win32_window.hpp
new file mode 100644
index 0000000..3b38ff5
--- /dev/null
+++ b/engine/src/core/win32_window.hpp
@@ -0,0 +1,16 @@
+#ifndef MY_ENGINE_WIN32_WINDOW_HPP
+#define MY_ENGINE_WIN32_WINDOW_HPP
+
+struct Win32_Window {
+ HWND handle;
+ const char* title;
+ int width;
+ int height;
+};
+
+
+
+Win32_Window* create_win32_window(const char* title, int width, int height);
+void destroy_win32_window(Win32_Window* window);
+
+#endif
\ No newline at end of file
diff --git a/engine/src/core/window.cpp b/engine/src/core/window.cpp
new file mode 100644
index 0000000..8054bbf
--- /dev/null
+++ b/engine/src/core/window.cpp
@@ -0,0 +1,265 @@
+#include "window.hpp"
+
+#include "events/window_event.hpp"
+#include "events/key_event.hpp"
+#include "events/mouse_event.hpp"
+
+
+#include "logging.hpp"
+
+
+static void glfw_error_callback(int code, const char* description) {
+ Logger::error("GLFW error ({} : {})", code, description);
+}
+
+static void window_close_callback(GLFWwindow* window) {
+ Window* ptr = (Window*)glfwGetWindowUserPointer(window);
+
+ Window_Closed_Event e;
+ ptr->event_callback(e);
+}
+
+static void window_focus_callback(GLFWwindow* window, int focused) {
+ Window* ptr = (Window*)glfwGetWindowUserPointer(window);
+
+ if (focused) {
+ Window_Focused_Event e;
+ ptr->event_callback(e);
+ } else {
+ Window_Lost_Focus_Event e;
+ ptr->event_callback(e);
+ }
+}
+
+static void window_maximized_callback(GLFWwindow* window, int maximized) {
+ Window* ptr = (Window*)glfwGetWindowUserPointer(window);
+
+ if (maximized) {
+ Window_Maximized_Event e;
+ ptr->event_callback(e);
+ } else {
+ Window_Restored_Event e;
+ ptr->event_callback(e);
+ }
+}
+
+static void window_minimized_callback(GLFWwindow* window, int minimized) {
+ Window* ptr = (Window*)glfwGetWindowUserPointer(window);
+
+ if (minimized) {
+ Window_Minimized_Event e;
+ ptr->event_callback(e);
+ } else {
+ Window_Not_Minimized_Event e;
+ ptr->event_callback(e);
+ }
+}
+
+static void window_resize_callback(GLFWwindow* window, int width, int height) {
+ // todo: window resizing is done within the framebuffer callback since that
+ // todo: returns the actual pixel count of the display. This ensures that
+ // todo: for monitors with a high DPI we return the real pixels.
+}
+
+static void window_framebuffer_resize_callback(GLFWwindow* window, int width, int height) {
+ Window* ptr = (Window*)glfwGetWindowUserPointer(window);
+ ptr->width = width;
+ ptr->height = height;
+
+ Window_Resized_Event e(width, height);
+ ptr->event_callback(e);
+}
+
+static void window_drop_callback(GLFWwindow* window, int path_count, const char* in_paths[]) {
+ Window* ptr = (Window*)glfwGetWindowUserPointer(window);
+
+ // todo: should this be handled in the event?
+ std::vector paths(path_count);
+ for (std::size_t i = 0; i < paths.size(); ++i) {
+ paths[i] = in_paths[i];
+ }
+
+ Window_Dropped_Event e(paths);
+ ptr->event_callback(e);
+}
+
+static void window_key_callback(GLFWwindow* window, int key, int scancode, int action, int mods) {
+ Window* ptr = (Window*)glfwGetWindowUserPointer(window);
+
+ if (action == GLFW_PRESS) {
+ Key_Pressed_Event e(key);
+ ptr->event_callback(e);
+ } else if (action == GLFW_REPEAT) {
+ Key_Released_Event e(key);
+ ptr->event_callback(e);
+ } else if (action == GLFW_RELEASE) {
+ Key_Released_Event e(key);
+ ptr->event_callback(e);
+ }
+}
+
+static void window_mouse_button_callback(GLFWwindow* window, int button, int action, int mods) {
+ Window* ptr = (Window*)glfwGetWindowUserPointer(window);
+
+ if (action == GLFW_PRESS) {
+ Mouse_Button_Pressed_Event e(button);
+ ptr->event_callback(e);
+ } else if (action == GLFW_REPEAT) {
+ Mouse_Button_Pressed_Event e(button);
+ ptr->event_callback(e);
+ } else if (action == GLFW_RELEASE) {
+ Mouse_Button_Released_Event e(button);
+ ptr->event_callback(e);
+ }
+}
+
+static void window_mouse_scroll_callback(GLFWwindow* window, double xoffset, double yoffset) {
+ Window* ptr = (Window*)glfwGetWindowUserPointer(window);
+
+ if (yoffset == 1.0) {
+ Mouse_Scrolled_Up_Event e;
+ ptr->event_callback(e);
+ } else if (yoffset == -1.0) {
+ Mouse_Scrolled_Down_Event e;
+ ptr->event_callback(e);
+ }
+}
+
+static void window_cursor_position_callback(GLFWwindow* window, double xpos, double ypos) {
+ Window* ptr = (Window*)glfwGetWindowUserPointer(window);
+
+ Mouse_Moved_Event e(xpos, ypos);
+ ptr->event_callback(e);
+}
+
+static void window_cursor_enter_callback(GLFWwindow* window, int entered) {
+ Window* ptr = (Window*)glfwGetWindowUserPointer(window);
+
+ if (entered) {
+ Mouse_Entered_Event e;
+ ptr->event_callback(e);
+ } else {
+ Mouse_Left_Event e;
+ ptr->event_callback(e);
+ }
+}
+
+// Initialized the GLFW library and creates a window. Window callbacks send
+// events to the application callback.
+Window* create_window(const char* name, int width, int height) {
+ Logger::info("Initializing window ({}, {})", width, height);
+
+ assert(width > 0 && height > 0);
+
+ Window* window = new Window();
+
+ glfwSetErrorCallback(glfw_error_callback);
+
+ if (!glfwInit()) {
+ Logger::error("Failed to initialize GLFW");
+
+ delete window;
+
+ return nullptr;
+ }
+
+
+ glfwWindowHint(GLFW_CLIENT_API, GLFW_NO_API);
+ glfwWindowHint(GLFW_RESIZABLE, true);
+
+ window->handle = glfwCreateWindow(width, height, name, nullptr, nullptr);
+ window->name = name;
+ window->width = width;
+ window->height = height;
+
+ if (!window->handle) {
+ Logger::error("Failed to create GLFW window");
+
+ glfwTerminate();
+
+ delete window;
+
+ return nullptr;
+ }
+
+ //glfwSetInputMode(window->handle, GLFW_CURSOR, GLFW_CURSOR_DISABLED);
+
+ // window callbacks
+ glfwSetWindowUserPointer(window->handle, window);
+ glfwSetWindowCloseCallback(window->handle, window_close_callback);
+ glfwSetWindowFocusCallback(window->handle, window_focus_callback);
+ glfwSetWindowMaximizeCallback(window->handle, window_maximized_callback);
+ glfwSetWindowIconifyCallback(window->handle, window_minimized_callback);
+ glfwSetWindowSizeCallback(window->handle, window_resize_callback);
+ glfwSetFramebufferSizeCallback(window->handle, window_framebuffer_resize_callback);
+ glfwSetDropCallback(window->handle, window_drop_callback);
+
+ // input callbacks
+ glfwSetKeyCallback(window->handle, window_key_callback);
+ glfwSetMouseButtonCallback(window->handle, window_mouse_button_callback);
+ glfwSetScrollCallback(window->handle, window_mouse_scroll_callback);
+ glfwSetCursorPosCallback(window->handle, window_cursor_position_callback);
+ glfwSetCursorEnterCallback(window->handle, window_cursor_enter_callback);
+
+ return window;
+}
+
+void set_window_icon(const Window* window, const std::filesystem::path& iconPath)
+{
+ GLFWimage images[1]{};
+ images[0].pixels = stbi_load(iconPath.string().c_str(), &images[0].width, &images[0].height, 0, STBI_rgb_alpha);
+
+ if (!images[0].pixels) {
+ Logger::error("Failed to load window icon {}", iconPath.string());
+
+ stbi_image_free(images[0].pixels);
+ return;
+ }
+
+ glfwSetWindowIcon(window->handle, 1, images);
+
+ stbi_image_free(images[0].pixels);
+}
+
+void set_window_icon(const Window* window, unsigned char* data, int width, int height)
+{
+ GLFWimage image[1];
+ image[0].width = width;
+ image[0].height = height;
+ image[0].pixels = data;
+
+ glfwSetWindowIcon(window->handle, 1, image);
+}
+
+// Destroys the window and terminates the GLFW library.
+void destroy_window(Window* window)
+{
+ if (!window)
+ return;
+
+ Logger::info("Destroying window");
+
+ glfwDestroyWindow(window->handle);
+ glfwTerminate();
+
+ delete window;
+}
+
+// Updates a window by polling for any new events since the last window update
+// function call.
+void update_window(Window* window) {
+ glfwPollEvents();
+
+ // TODO: Possibly implement a better solution as this will not work if
+ // the client application requires continuous updates. For example,
+ // if networking is being used then waiting here is not possible since
+ // network updates must be sent/received.
+
+ // If the application is minimized then only wait for events and don't
+ // do anything else. This ensures the application does not waste resources
+ // performing other operations such as maths and rendering when the window
+ // is not visible.
+ while (window->minimized || (window->width == 0 || window->height == 0))
+ glfwWaitEvents();
+}
+
diff --git a/src/window.hpp b/engine/src/core/window.hpp
similarity index 61%
rename from src/window.hpp
rename to engine/src/core/window.hpp
index aafacd9..d5db3d2 100644
--- a/src/window.hpp
+++ b/engine/src/core/window.hpp
@@ -1,15 +1,18 @@
#ifndef MYENGINE_WINDOW_HPP
#define MYENGINE_WINDOW_HPP
+
#include "events/event.hpp"
-struct window_t {
+
+struct Window {
GLFWwindow* handle;
const char* name;
uint32_t width;
uint32_t height;
+ bool minimized;
- event_func event_callback;
+ Event_Func event_callback;
};
///
@@ -21,14 +24,25 @@ struct window_t {
/// @param width The window in pixels of the current window
/// @param height The height in pixels of the current window
///
-window_t* create_window(const char* name, uint32_t width, uint32_t height);
+Window* create_window(const char* name, int width, int height);
+
+
+///
+/// Loads an image to be used as an icon for the specified window handle.
+///
+void set_window_icon(const Window* window, const std::filesystem::path& iconPath);
+
+///
+/// Uses the data from an array as the icon for the specified window handle.
+///
+void set_window_icon(const Window* window, unsigned char* data, int width, int height);
///
/// Destroys the window and terminates the GLFW library.
///
/// @param window A valid pointer to a window structure to free resources.
///
-void destroy_window(window_t* window);
+void destroy_window(Window* window);
///
/// Updates a window by polling for any new events since the last window update
@@ -36,7 +50,7 @@ void destroy_window(window_t* window);
///
/// @param window A valid pointer to a window structure to update.
///
-void update_window(window_t* window);
+void update_window(Window* window);
diff --git a/engine/src/engine.cpp b/engine/src/engine.cpp
new file mode 100644
index 0000000..5a9480e
--- /dev/null
+++ b/engine/src/engine.cpp
@@ -0,0 +1,1156 @@
+#include "../include/engine.h"
+
+
+
+// Engine header files section
+#include "../src/core/window.hpp"
+#include "../src/core/win32_window.hpp"
+#include "../src/core/input.hpp"
+#if defined(_WIN32)
+#include "../src/core/platform/windows.hpp"
+#endif
+
+#include "../src/rendering/api/vulkan/common.hpp"
+#include "../src/rendering/api/vulkan/renderer.hpp"
+#include "../src/rendering/api/vulkan/buffer.hpp"
+#include "../src/rendering/api/vulkan/texture.hpp"
+#include "../src/rendering/api/vulkan/descriptor_sets.hpp"
+#include "../src/rendering/vertex.hpp"
+#include "../src/rendering/material.hpp"
+#include "../src/rendering/camera.hpp"
+#include "../src/rendering/entity.hpp"
+#include "../src/rendering/model.hpp"
+
+#include "../src/shaders/shaders.hpp"
+
+#include "../src/audio/audio.hpp"
+
+#include "../src/events/event.hpp"
+#include "../src/events/event_dispatcher.hpp"
+#include "../src/events/window_event.hpp"
+#include "../src/events/key_event.hpp"
+#include "../src/events/mouse_event.hpp"
+
+#include "../src/filesystem/vfs.hpp"
+#include "../src/filesystem/filesystem.hpp"
+
+#include "../src/ui/ui.hpp"
+
+#include "../src/utility.hpp"
+#include "../src/logging.hpp"
+#include "../src/time.hpp"
+
+struct Engine {
+ Window* window;
+ Win32_Window* newWindow; // TEMP
+ Vulkan_Renderer* renderer;
+ ImGuiContext* ui;
+ Audio* audio;
+
+ void (*KeyCallback)(Engine* engine, int keyCode);
+
+ std::string execPath;
+ bool running;
+ std::chrono::time_point startTime;
+ double deltaTime;
+
+ // Resources
+ Buffer sceneBuffer;
+ Buffer sunBuffer;
+ Buffer cameraBuffer;
+
+
+ // Scene information
+ Camera camera;
+
+
+ std::vector models;
+ std::vector instances;
+
+
+ bool swapchainReady;
+ bool uiPassEnabled;
+};
+
+// Just here for the time being as events don't have direct access to the engine
+// pointer.
+static Engine* gTempEnginePtr = nullptr;
+
+//
+// Global scene information that will be accessed by the shaders to perform
+// various computations. The order of the variables cannot be changed! This
+// is because the shaders themselves directly replicate this structs order.
+// Therefore, if this was to change then the shaders will set values for
+// the wrong variables.
+//
+// Padding is equally important and hence the usage of the "alignas" keyword.
+//
+struct Sandbox_Scene
+{
+ // ambient Strength, specular strength, specular shininess, empty
+ glm::vec4 ambientSpecular = glm::vec4(0.05f, 1.0f, 16.0f, 0.0f);
+ glm::vec4 cameraPosition = glm::vec4(0.0f, 2.0f, -5.0f, 0.0f);
+
+ glm::vec3 sunDirection = glm::vec3(0.01f, -1.0f, 0.01f);
+ glm::vec3 sunPosition = glm::vec3(0.01f, 200.0f, 0.01f);
+} scene;
+
+
+struct Sun_Data
+{
+ glm::mat4 viewProj;
+} sunData;
+
+
+static VkExtent2D shadowMapSize = { 2048, 2048 };
+
+// Default framebuffer at startup
+static VkExtent2D framebufferSize = { 1280, 720 };
+
+VkSampler gFramebufferSampler;
+VkSampler gTextureSampler;
+
+Render_Pass shadowPass{};
+Render_Pass skyboxPass{};
+Render_Pass offscreenPass{};
+Render_Pass compositePass{};
+
+VkDescriptorSetLayout shadowLayout;
+std::vector shadowSets;
+
+
+VkDescriptorSetLayout skyboxLayout;
+std::vector skyboxSets;
+std::vector skyboxDepths;
+
+VkDescriptorSetLayout offscreenLayout;
+std::vector offscreenSets;
+
+
+VkDescriptorSetLayout compositeLayout;
+std::vector compositeSets;
+std::vector viewport;
+
+std::vector positions;
+std::vector normals;
+std::vector colors;
+std::vector speculars;
+std::vector depths;
+std::vector shadow_depths;
+
+std::vector materialBindings;
+VkDescriptorSetLayout materialLayout;
+
+
+
+VkPipelineLayout shadowPipelineLayout;
+VkPipelineLayout skyspherePipelineLayout;
+VkPipelineLayout offscreenPipelineLayout;
+VkPipelineLayout compositePipelineLayout;
+
+Pipeline offscreenPipeline;
+Pipeline wireframePipeline;
+Pipeline compositePipeline;
+Pipeline shadowPipeline;
+Pipeline* currentPipeline = &offscreenPipeline;
+
+std::vector offscreenCmdBuffer;
+std::vector compositeCmdBuffer;
+
+// UI related stuff
+Render_Pass uiPass{};
+std::vector viewportUI;
+std::vector positionsUI;
+std::vector colorsUI;
+std::vector normalsUI;
+std::vector specularsUI;
+std::vector depthsUI;
+std::vector uiCmdBuffer;
+
+//VertexArray quad;
+
+float shadowNear = 1.0f, shadowFar = 2000.0f;
+float sunDistance = 400.0f;
+
+
+
+static void update_input(Camera& camera, double deltaTime) {
+ float dt = camera.speed * (float)deltaTime;
+ if (is_key_down(GLFW_KEY_W))
+ camera.position += camera.front_vector * dt;
+ if (is_key_down(GLFW_KEY_S))
+ camera.position -= camera.front_vector * dt;
+ if (is_key_down(GLFW_KEY_A))
+ camera.position -= camera.right_vector * dt;
+ if (is_key_down(GLFW_KEY_D))
+ camera.position += camera.right_vector * dt;
+ if (is_key_down(GLFW_KEY_SPACE))
+ camera.position += camera.up_vector * dt;
+ if (is_key_down(GLFW_KEY_LEFT_CONTROL) || is_key_down(GLFW_KEY_CAPS_LOCK))
+ camera.position -= camera.up_vector * dt;
+ /*if (is_key_down(GLFW_KEY_Q))
+ camera.roll -= camera.roll_speed * deltaTime;
+ if (is_key_down(GLFW_KEY_E))
+ camera.roll += camera.roll_speed * deltaTime;*/
+}
+
+
+static void event_callback(Basic_Event& e);
+
+Engine* engine_initialize(const char* name, int width, int height)
+{
+ auto engine = new Engine();
+
+ engine->startTime = std::chrono::high_resolution_clock::now();
+
+ // Get the current path of the executable
+ // TODO: MAX_PATH is ok to use however, for a long term solution another
+ // method should used since some paths can go beyond this limit.
+ wchar_t fileName[MAX_PATH];
+ GetModuleFileName(nullptr, fileName, sizeof(wchar_t) * MAX_PATH);
+ engine->execPath = std::filesystem::path(fileName).parent_path().string();
+
+ Logger::info("Initializing application ({})", engine->execPath);
+
+ // Initialize core systems
+ engine->window = create_window(name, width, height);
+ if (!engine->window) {
+ Logger::error("Failed to create window");
+ return nullptr;
+ }
+
+ engine->window->event_callback = event_callback;
+
+#if 0
+ engine->newWindow = CreateWin32Window(info.appName, info.windowWidth, info.windowHeight);
+ if (!engine->window)
+ {
+ Logger::Error("Failed to create window");
+ return nullptr;
+ }
+#endif
+
+ engine->renderer = create_vulkan_renderer(engine->window, Buffer_Mode::Double, VSync_Mode::enabled);
+ if (!engine->renderer) {
+ Logger::error("Failed to create renderer");
+ return nullptr;
+ }
+
+ engine->audio = create_windows_audio();
+ if (!engine->audio) {
+ Logger::error("Failed to initialize audio");
+ return nullptr;
+ }
+
+ // Mount specific VFS folders
+ //const std::string rootDir = "C:/Users/zakar/Projects/vmve/vmve/";
+ //const std::string rootDir1 = "C:/Users/zakar/Projects/vmve/engine/src";
+ //MountPath("models", rootDir + "assets/models");
+ //MountPath("textures", rootDir + "assets/textures");
+ //MountPath("fonts", rootDir + "assets/fonts");
+ //MountPath("shaders", rootDir1 + "/shaders");
+
+
+ // Create rendering passes and render targets
+ gFramebufferSampler = create_image_sampler(VK_FILTER_NEAREST, 1, VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_BORDER);
+ gTextureSampler = create_image_sampler(VK_FILTER_LINEAR);
+
+ {
+ add_framebuffer_attachment(shadowPass, VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT, VK_FORMAT_D32_SFLOAT, shadowMapSize);
+ create_render_pass_2(shadowPass);
+ }
+ {
+ add_framebuffer_attachment(skyboxPass, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_FORMAT_R8G8B8A8_SRGB, framebufferSize);
+ create_render_pass_2(skyboxPass);
+ }
+ {
+ add_framebuffer_attachment(offscreenPass, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_FORMAT_R32G32B32A32_SFLOAT, framebufferSize);
+ add_framebuffer_attachment(offscreenPass, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_FORMAT_R16G16B16A16_SFLOAT, framebufferSize);
+ add_framebuffer_attachment(offscreenPass, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_FORMAT_R8G8B8A8_SRGB, framebufferSize);
+ add_framebuffer_attachment(offscreenPass, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_FORMAT_R8_SRGB, framebufferSize);
+ add_framebuffer_attachment(offscreenPass, VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT, VK_FORMAT_D32_SFLOAT, framebufferSize);
+ create_render_pass(offscreenPass);
+ }
+ {
+ add_framebuffer_attachment(compositePass, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_FORMAT_R8G8B8A8_SRGB, framebufferSize);
+ create_render_pass_2(compositePass);
+ viewport = attachments_to_images(compositePass.attachments, 0);
+ }
+
+
+
+ engine->sunBuffer = create_uniform_buffer(sizeof(Sun_Data));
+ engine->cameraBuffer = create_uniform_buffer(sizeof(View_Projection));
+ engine->sceneBuffer = create_uniform_buffer(sizeof(Sandbox_Scene));
+
+ std::vector shadowBindings
+ {
+ { 0, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC, 1, VK_SHADER_STAGE_VERTEX_BIT }
+ };
+
+ shadowLayout = create_descriptor_layout(shadowBindings);
+ shadowSets = allocate_descriptor_sets(shadowLayout);
+ update_binding(shadowSets, shadowBindings[0], engine->sunBuffer, sizeof(Sun_Data));
+
+
+ std::vector skyboxBindings
+ {
+ { 0, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC, 1, VK_SHADER_STAGE_VERTEX_BIT },
+ { 1, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 1, VK_SHADER_STAGE_FRAGMENT_BIT }
+ };
+
+ skyboxLayout = create_descriptor_layout(skyboxBindings);
+ skyboxSets = allocate_descriptor_sets(skyboxLayout);
+ skyboxDepths = attachments_to_images(skyboxPass.attachments, 0);
+ update_binding(skyboxSets, skyboxBindings[0], engine->cameraBuffer, sizeof(View_Projection));
+ update_binding(skyboxSets, skyboxBindings[1], skyboxDepths, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, gFramebufferSampler);
+
+
+
+
+ std::vector offscreenBindings
+ {
+ { 0, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC, 1, VK_SHADER_STAGE_VERTEX_BIT }
+ };
+ offscreenLayout = create_descriptor_layout(offscreenBindings);
+ offscreenSets = allocate_descriptor_sets(offscreenLayout);
+ update_binding(offscreenSets, offscreenBindings[0], engine->cameraBuffer, sizeof(View_Projection));
+
+ //////////////////////////////////////////////////////////////////////////
+ std::vector compositeBindings
+ {
+ { 0, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 1, VK_SHADER_STAGE_FRAGMENT_BIT },
+ { 1, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 1, VK_SHADER_STAGE_FRAGMENT_BIT },
+ { 2, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 1, VK_SHADER_STAGE_FRAGMENT_BIT },
+ { 3, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 1, VK_SHADER_STAGE_FRAGMENT_BIT },
+ { 4, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 1, VK_SHADER_STAGE_FRAGMENT_BIT },
+ { 5, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 1, VK_SHADER_STAGE_FRAGMENT_BIT },
+ { 6, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC, 1, VK_SHADER_STAGE_FRAGMENT_BIT },
+ { 7, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, 1, VK_SHADER_STAGE_FRAGMENT_BIT },
+ };
+
+ compositeLayout = create_descriptor_layout(compositeBindings);
+ compositeSets = allocate_descriptor_sets(compositeLayout);
+ // Convert render target attachments into flat arrays for descriptor binding
+ positions = attachments_to_images(offscreenPass.attachments, 0);
+ normals = attachments_to_images(offscreenPass.attachments, 1);
+ colors = attachments_to_images(offscreenPass.attachments, 2);
+ speculars = attachments_to_images(offscreenPass.attachments, 3);
+ depths = attachments_to_images(offscreenPass.attachments, 4);
+ shadow_depths = attachments_to_images(shadowPass.attachments, 0);
+ update_binding(compositeSets, compositeBindings[0], positions, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, gFramebufferSampler);
+ update_binding(compositeSets, compositeBindings[1], normals, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, gFramebufferSampler);
+ update_binding(compositeSets, compositeBindings[2], colors, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, gFramebufferSampler);
+ update_binding(compositeSets, compositeBindings[3], speculars, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, gFramebufferSampler);
+ update_binding(compositeSets, compositeBindings[4], depths, VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL, gFramebufferSampler);
+ update_binding(compositeSets, compositeBindings[5], shadow_depths, VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL, gFramebufferSampler);
+ update_binding(compositeSets, compositeBindings[6], engine->sunBuffer, sizeof(Sun_Data));
+ update_binding(compositeSets, compositeBindings[7], engine->sceneBuffer, sizeof(Sandbox_Scene));
+
+
+ //////////////////////////////////////////////////////////////////////////
+ materialBindings = {
+ { 0, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 1, VK_SHADER_STAGE_FRAGMENT_BIT },
+ { 1, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 1, VK_SHADER_STAGE_FRAGMENT_BIT },
+ { 2, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 1, VK_SHADER_STAGE_FRAGMENT_BIT }
+ };
+ materialLayout = create_descriptor_layout(materialBindings);
+
+ //////////////////////////////////////////////////////////////////////////
+ shadowPipelineLayout = create_pipeline_layout(
+ { shadowLayout },
+ sizeof(glm::mat4),
+ VK_SHADER_STAGE_VERTEX_BIT
+ );
+
+ skyspherePipelineLayout = create_pipeline_layout(
+ { skyboxLayout }
+ );
+
+ offscreenPipelineLayout = create_pipeline_layout(
+ { offscreenLayout, materialLayout },
+ sizeof(glm::mat4),
+ VK_SHADER_STAGE_VERTEX_BIT
+ );
+
+ compositePipelineLayout = create_pipeline_layout(
+ { compositeLayout }
+ );
+
+ Vertex_Binding vertexBinding(VK_VERTEX_INPUT_RATE_VERTEX);
+ vertexBinding.add_attribute(VK_FORMAT_R32G32B32_SFLOAT, "Position");
+ vertexBinding.add_attribute(VK_FORMAT_R32G32B32_SFLOAT, "Normal");
+ vertexBinding.add_attribute(VK_FORMAT_R32G32_SFLOAT, "UV");
+ vertexBinding.add_attribute(VK_FORMAT_R32G32B32_SFLOAT, "Tangent");
+
+ Shader shadowMappingVS = create_vertex_shader(shadowMappingVSCode);
+ Shader shadowMappingFS = create_fragment_shader(shadowMappingFSCode);
+
+ Shader geometry_vs = create_vertex_shader(geometryVSCode);
+ Shader geometry_fs = create_fragment_shader(geometryFSCode);
+ Shader lighting_vs = create_vertex_shader(lightingVSCode);
+ Shader lighting_fs = create_fragment_shader(lightingFSCode);
+
+ //Shader skysphereVS = CreateVertexShader(LoadFile(GetVFSPath("/shaders/skysphere.vert")));
+ //Shader skysphereFS = CreateFragmentShader(LoadFile(GetVFSPath("/shaders/skysphere.frag")));
+
+ //Shader skysphereNewVS = CreateVertexShader(LoadFile(GetVFSPath("/shaders/skysphereNew.vert")));
+ //Shader skysphereNewFS = CreateFragmentShader(LoadFile(GetVFSPath("/shaders/skysphereNew.frag")));
+
+ //Pipeline offscreenPipeline(offscreenPipelineLayout, offscreenPass);
+ offscreenPipeline.m_Layout = offscreenPipelineLayout;
+ offscreenPipeline.m_RenderPass = &offscreenPass;
+ offscreenPipeline.enable_vertex_binding(vertexBinding);
+ offscreenPipeline.set_shader_pipeline({ geometry_vs, geometry_fs });
+ offscreenPipeline.set_input_assembly(VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST);
+ offscreenPipeline.set_rasterization(VK_POLYGON_MODE_FILL, VK_CULL_MODE_BACK_BIT, VK_FRONT_FACE_CLOCKWISE);
+ offscreenPipeline.enable_depth_stencil(VK_COMPARE_OP_LESS_OR_EQUAL);
+ offscreenPipeline.set_color_blend(4);
+ offscreenPipeline.create_pipeline();
+
+ //Pipeline wireframePipeline(offscreenPipelineLayout, offscreenPass);
+ wireframePipeline.m_Layout = offscreenPipelineLayout;
+ wireframePipeline.m_RenderPass = &offscreenPass;
+ wireframePipeline.enable_vertex_binding(vertexBinding);
+ wireframePipeline.set_shader_pipeline({ geometry_vs, geometry_fs });
+ wireframePipeline.set_input_assembly(VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST);
+ wireframePipeline.set_rasterization(VK_POLYGON_MODE_LINE, VK_CULL_MODE_BACK_BIT, VK_FRONT_FACE_CLOCKWISE);
+ wireframePipeline.enable_depth_stencil(VK_COMPARE_OP_LESS_OR_EQUAL);
+ wireframePipeline.set_color_blend(4);
+ wireframePipeline.create_pipeline();
+
+ //Pipeline shadowPipeline(shadowPipelineLayout, shadowPass);
+ shadowPipeline.m_Layout = shadowPipelineLayout;
+ shadowPipeline.m_RenderPass = &shadowPass;
+ shadowPipeline.enable_vertex_binding(vertexBinding);
+ shadowPipeline.set_shader_pipeline({ shadowMappingVS, shadowMappingFS });
+ shadowPipeline.set_input_assembly(VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST);
+ shadowPipeline.set_rasterization(VK_POLYGON_MODE_FILL, VK_CULL_MODE_BACK_BIT, VK_FRONT_FACE_CLOCKWISE);
+ shadowPipeline.enable_depth_stencil(VK_COMPARE_OP_LESS_OR_EQUAL);
+ shadowPipeline.set_color_blend(1);
+ shadowPipeline.create_pipeline();
+
+ //Pipeline compositePipeline(compositePipelineLayout, compositePass);
+ compositePipeline.m_Layout = compositePipelineLayout;
+ compositePipeline.m_RenderPass = &compositePass;
+ compositePipeline.set_shader_pipeline({ lighting_vs, lighting_fs });
+ compositePipeline.set_input_assembly(VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST);
+ compositePipeline.set_rasterization(VK_POLYGON_MODE_FILL, VK_CULL_MODE_BACK_BIT, VK_FRONT_FACE_CLOCKWISE);
+ compositePipeline.set_color_blend(1);
+ compositePipeline.create_pipeline();
+
+ // Delete all individual shaders since they are now part of the various pipelines
+ //DestroyShader(skysphereNewFS);
+ //DestroyShader(skysphereNewVS);
+ //DestroyShader(skysphereFS);
+ //DestroyShader(skysphereVS);
+ destroy_shader(lighting_fs);
+ destroy_shader(lighting_vs);
+ destroy_shader(geometry_fs);
+ destroy_shader(geometry_vs);
+ destroy_shader(shadowMappingFS);
+ destroy_shader(shadowMappingVS);
+
+
+ // Create required command buffers
+ offscreenCmdBuffer = create_command_buffers();
+ compositeCmdBuffer = create_command_buffers();
+
+
+
+ // Built-in resources
+ const std::vector quad_vertices{
+ {{ 0.5, 0.0, -0.5 }, { 0.0f, 1.0f, 0.0f }, {0.0f, 0.0f} },
+ {{ -0.5, 0.0, -0.5 }, { 0.0f, 1.0f, 0.0f }, {1.0f, 0.0f} },
+ {{ 0.5, 0.0, 0.5 }, { 0.0f, 1.0f, 0.0f }, {0.0f, 1.0f} },
+ {{ -0.5, 0.0, 0.5 }, { 0.0f, 1.0f, 0.0f }, {1.0f, 1.0f} }
+ };
+ const std::vector quad_indices{
+ 0, 1, 2,
+ 3, 2, 1
+ };
+
+
+ // create models
+ //quad = CreateVertexArray(quad_vertices, quad_indices);
+
+ // TEMP: Don't want to have to manually load the model each time so I will do it
+ // here instead for the time-being.
+ //futures.push_back(std::async(
+ // std::launch::async,
+ // load_mesh,
+ // std::ref(g_models),
+ // get_vfs_path("/models/backpack/backpack.obj"))
+ //);
+ //
+
+ engine->running = true;
+ engine->swapchainReady = true;
+
+ gTempEnginePtr = engine;
+
+ return engine;
+}
+
+
+void engine_set_render_mode(Engine* engine, int mode) {
+ if (mode == 0) {
+ currentPipeline = &offscreenPipeline;
+ } else if (mode == 1) {
+ currentPipeline = &wireframePipeline;
+ }
+}
+
+bool engine_update(Engine* engine)
+{
+ // Calculate the amount that has passed since the last frame. This value
+ // is then used with inputs and physics to ensure that the result is the
+ // same no matter how fast the CPU is running.
+ engine->deltaTime = get_delta_time();
+
+ // Set sun view matrix
+ glm::mat4 sunProjMatrix = glm::ortho(-sunDistance / 2.0f,
+ sunDistance / 2.0f,
+ sunDistance / 2.0f,
+ -sunDistance / 2.0f,
+ shadowNear, shadowFar);
+
+ // TODO: Construct a dummy sun "position" for the depth calculation based on the direction vector and some random distance
+ scene.sunPosition = -scene.sunDirection * sunDistance;
+
+ glm::mat4 sunViewMatrix = glm::lookAt(scene.sunPosition, glm::vec3(0.0f), glm::vec3(0.0f, 1.0f, 0.0f));
+ sunData.viewProj = sunProjMatrix * sunViewMatrix;
+
+ scene.cameraPosition = glm::vec4(engine->camera.position, 0.0f);
+
+ // copy data into uniform buffer
+ set_buffer_data(engine->sunBuffer, &sunData, sizeof(Sun_Data));
+ set_buffer_data(engine->cameraBuffer, &engine->camera.viewProj, sizeof(View_Projection));
+ set_buffer_data(engine->sceneBuffer, &scene);
+
+
+ return engine->running;
+}
+
+bool engine_begin_render(Engine* engine)
+{
+ engine->swapchainReady = get_next_swapchain_image();
+
+ // If the swapchain is not ready the swapchain will be resized and then we
+ // need to resize any framebuffers.
+ if (!engine->swapchainReady) {
+ wait_for_gpu();
+
+ resize_framebuffer(uiPass, { engine->window->width, engine->window->height });
+ }
+
+ return engine->swapchainReady;
+}
+
+void engine_render(Engine* engine)
+{
+ begin_command_buffer(offscreenCmdBuffer);
+ {
+ //auto skyboxCmdBuffer = BeginRenderPass2(skyboxPass);
+
+ //// Render the sky sphere
+ //BindPipeline(offscreenCmdBuffer, skyspherePipeline, geometry_sets);
+ //for (std::size_t i = 0; i < sphere.meshes.size(); ++i)
+ //{
+ // BindMaterial(offscreenCmdBuffer, rendering_pipeline_layout, skysphere_material);
+ // BindVertexArray(offscreenCmdBuffer, sphere.meshes[i].vertex_array);
+ // Render(offscreenCmdBuffer, rendering_pipeline_layout, sphere.meshes[i].vertex_array.index_count, skyboxsphere_instance);
+ //}
+
+ //EndRenderPass(skyboxCmdBuffer);
+
+ bind_descriptor_set(offscreenCmdBuffer, shadowPipelineLayout, shadowSets, { sizeof(Sun_Data) });
+ begin_render_pass(offscreenCmdBuffer, shadowPass, { 0.0f, 0.0f, 0.0f, 1.0f }, { 1.0f, 0.0f });
+
+ bind_pipeline(offscreenCmdBuffer, shadowPipeline);
+
+ for (auto& instance : engine->instances) {
+ translate_entity(instance, instance.position);
+ rotate_entity(instance, instance.rotation);
+ scale_entity(instance, instance.scale);
+
+ const std::vector& meshes = engine->models[instance.modelIndex].meshes;
+ for (std::size_t i = 0; i < meshes.size(); ++i) {
+ bind_vertex_array(offscreenCmdBuffer, meshes[i].vertex_array);
+ render(offscreenCmdBuffer, shadowPipelineLayout, meshes[i].vertex_array.index_count, instance.matrix);
+ }
+ }
+
+
+
+ end_render_pass(offscreenCmdBuffer);
+
+
+ bind_descriptor_set(offscreenCmdBuffer, offscreenPipelineLayout, offscreenSets, { sizeof(View_Projection) });
+ begin_render_pass(offscreenCmdBuffer, offscreenPass, { 0.0f, 0.0f, 0.0f, 1.0f }, { 1.0f, 0.0f });
+
+ bind_pipeline(offscreenCmdBuffer, *currentPipeline);
+
+ // TODO: Currently we are rendering each instance individually
+ // which is a very naive. Firstly, instances should be rendered
+ // in batches using instanced rendering. We are also constantly
+ // rebinding the descriptor sets (material) and vertex buffers
+ // for each instance even though the data is exactly the same.
+ //
+ // A proper solution should be designed and implemented in the
+ // near future.
+ for (std::size_t i = 0; i < engine->instances.size(); ++i) {
+ Entity& instance = engine->instances[i];
+
+ translate_entity(instance, instance.position);
+ rotate_entity(instance, instance.rotation);
+ scale_entity(instance, instance.scale);
+ render_model(engine->models[instance.modelIndex], instance.matrix, offscreenCmdBuffer, offscreenPipelineLayout);
+ }
+ end_render_pass(offscreenCmdBuffer);
+
+ }
+ end_command_buffer(offscreenCmdBuffer);
+
+ //////////////////////////////////////////////////////////////////////////
+
+ begin_command_buffer(compositeCmdBuffer);
+ {
+ begin_render_pass(compositeCmdBuffer, compositePass);
+
+ bind_descriptor_set(compositeCmdBuffer, compositePipelineLayout, compositeSets, { sizeof(Sun_Data) });
+
+ bind_pipeline(compositeCmdBuffer, compositePipeline);
+ render(compositeCmdBuffer);
+ end_render_pass(compositeCmdBuffer);
+ }
+ end_command_buffer(compositeCmdBuffer);
+
+}
+
+void engine_present(Engine* engine)
+{
+ if (engine->uiPassEnabled)
+ submit_gpu_work({ offscreenCmdBuffer, compositeCmdBuffer, uiCmdBuffer });
+ else
+ submit_gpu_work({ offscreenCmdBuffer, compositeCmdBuffer });
+
+ if (!present_swapchain_image()) {
+ // TODO: Resize framebuffers if unable to display to swapchain
+ assert("Code path not expected! Must implement framebuffer resizing");
+ }
+
+ update_window(engine->window);
+}
+
+void engine_terminate(Engine* engine)
+{
+ Logger::info("Terminating application");
+
+
+ // Wait until all GPU commands have finished
+ wait_for_gpu();
+
+ // TODO: Remove viewport ui destruction outside of here
+ //ImGui_ImplVulkan_RemoveTexture(skysphere_dset);
+ for (auto& framebuffer : viewportUI)
+ ImGui_ImplVulkan_RemoveTexture(framebuffer);
+
+ for (auto& model : engine->models)
+ destroy_model(model);
+
+ // TODO: Remove textures but not the fallback ones that these materials refer to
+ //DestroyMaterial(skysphere_material);
+
+ //DestroyVertexArray(quad);
+
+
+ // Destroy rendering resources
+ destroy_buffer(engine->cameraBuffer);
+ destroy_buffer(engine->sceneBuffer);
+ destroy_buffer(engine->sunBuffer);
+
+ destroy_descriptor_layout(materialLayout);
+ destroy_descriptor_layout(compositeLayout);
+ destroy_descriptor_layout(offscreenLayout);
+ destroy_descriptor_layout(skyboxLayout);
+ destroy_descriptor_layout(shadowLayout);
+
+ destroy_pipeline(wireframePipeline.m_Pipeline);
+ destroy_pipeline(compositePipeline.m_Pipeline);
+ destroy_pipeline(offscreenPipeline.m_Pipeline);
+ destroy_pipeline(shadowPipeline.m_Pipeline);
+
+ destroy_pipeline_layout(compositePipelineLayout);
+ destroy_pipeline_layout(offscreenPipelineLayout);
+ destroy_pipeline_layout(skyspherePipelineLayout);
+ destroy_pipeline_layout(shadowPipelineLayout);
+
+ destroy_render_pass(uiPass);
+ destroy_render_pass(compositePass);
+ destroy_render_pass(offscreenPass);
+ destroy_render_pass(skyboxPass);
+ destroy_render_pass(shadowPass);
+
+ destroy_image_sampler(gTextureSampler);
+ destroy_image_sampler(gFramebufferSampler);
+
+ // Destroy core systems
+ destroy_windows_audio(engine->audio);
+ destroy_ui(engine->ui);
+ destroy_vulkan_renderer(engine->renderer);
+#if 0
+ DestroyWin32Window(engine->newWindow);
+#endif
+ destroy_window(engine->window);
+
+
+ // TODO: Export all logs into a log file
+
+ delete engine;
+}
+
+void engine_should_terminate(Engine* engine)
+{
+ engine->running = false;
+}
+
+void engine_set_window_icon(Engine* engine, unsigned char* data, int width, int height)
+{
+ set_window_icon(engine->window, data, width, height);
+}
+
+void engine_register_key_callback(Engine* engine, void (*KeyCallback)(Engine* engine, int keycode)) {
+ engine->KeyCallback = KeyCallback;
+}
+
+void engine_add_model(Engine* engine, const char* path, bool flipUVs) {
+ Logger::info("Loading mesh {}", path);
+
+ Model model = load_model(path, flipUVs);
+ upload_model_to_gpu(model, materialLayout, materialBindings, gTextureSampler);
+
+ //std::lock_guard lock(model_mutex);
+ engine->models.push_back(model);
+
+ Logger::info("Successfully loaded model with {} meshes at path {}", model.meshes.size(), path);
+}
+
+void engine_remove_model(Engine* engine, int modelID) {
+ // Remove all instances which use the current model
+#if 0
+ std::size_t size = engine->instances.size();
+ for (std::size_t i = 0; i < size; ++i)
+ {
+ if (engine->instances[i].model == &engine->models[modelID])
+ {
+ engine->instances.erase(engine->instances.begin() + i);
+ size--;
+ }
+ }
+
+ // Remove model from list and memory
+ WaitForGPU();
+
+ DestroyModel(engine->models[modelID]);
+ engine->models.erase(engine->models.begin() + modelID);
+#endif
+}
+
+void engine_add_instance(Engine* engine, int modelID, float x, float y, float z) {
+ static int instanceID = 0;
+
+ Entity instance{};
+ instance.id = instanceID++;
+ instance.name = engine->models[modelID].name;
+ instance.modelIndex = modelID;
+ instance.position = glm::vec3(0.0f);
+ instance.rotation = glm::vec3(0.0f, 0.0f, 0.0f);
+ instance.scale = glm::vec3(1.0f, 1.0f, 1.0f);
+ instance.matrix = glm::mat4(1.0f);
+
+ engine->instances.push_back(instance);
+
+ Logger::info("Instance ({}) added", instance.id);
+}
+
+void engine_remove_instance(Engine* engine, int instanceID) {
+ assert(instanceID >= 0);
+
+//#define FIND_BY_ID
+#if defined(FIND_BY_ID)
+ const auto it = std::find_if(engine->instances.begin(), engine->instances.end(), [&](Entity& instance)
+ {
+ return instance.id == instanceID;
+ });
+
+ if (it == engine->instances.end())
+ {
+ Logger::warning("Unable to find instance with ID of {} to remove", instanceID);
+ return;
+ }
+
+ engine->instances.erase(it);
+#else
+ engine->instances.erase(engine->instances.begin() + instanceID);
+
+ Logger::info("Instance ({}) removed", instanceID);
+#endif
+
+
+}
+
+int engine_get_instance_id(Engine* engine, int instanceIndex) {
+ assert(instanceIndex >= 0);
+
+ return engine->instances[instanceIndex].id;
+}
+
+const char* engine_get_instance_name(Engine* engine, int instanceIndex) {
+ assert(instanceIndex >= 0);
+
+ return engine->instances[instanceIndex].name.c_str();
+}
+
+void engine_get_instance_matrix(Engine* engine, int instanceIndex, float*& matrix)
+{
+ assert(instanceIndex >= 0);
+
+ matrix = &engine->instances[instanceIndex].matrix[0][0];
+}
+
+void engine_get_instance_position(Engine* engine, int instanceIndex, float*& position) {
+ assert(instanceIndex >= 0);
+
+ position = &engine->instances[instanceIndex].position.x;
+}
+
+void engine_set_instance_position(Engine* engine, int instanceIndex, float x, float y, float z)
+{
+ assert(instanceIndex >= 0);
+
+ engine->instances[instanceIndex].position.x = x;
+ engine->instances[instanceIndex].position.y = y;
+ engine->instances[instanceIndex].position.z = z;
+}
+
+
+void engine_get_instance_rotation(Engine* engine, int instanceIndex, float*& rotation) {
+ assert(instanceIndex >= 0);
+
+ rotation = &engine->instances[instanceIndex].rotation.x;
+}
+
+void engine_set_instance_rotation(Engine* engine, int instanceIndex, float x, float y, float z)
+{
+ assert(instanceIndex >= 0);
+
+ engine->instances[instanceIndex].rotation.x = x;
+ engine->instances[instanceIndex].rotation.y = y;
+ engine->instances[instanceIndex].rotation.z = z;
+}
+
+void engine_get_instance_scale(Engine* engine, int instanceIndex, float* scale) {
+ assert(instanceIndex >= 0);
+
+ scale[0] = engine->instances[instanceIndex].scale.x;
+ scale[1] = engine->instances[instanceIndex].scale.y;
+ scale[2] = engine->instances[instanceIndex].scale.z;
+}
+
+void engine_set_environment_map(const char* path) {
+ // Delete existing environment map if any
+ // Load texture
+ // Update environment map
+}
+
+void engine_create_camera(Engine* engine, float fovy, float speed) {
+ engine->camera = create_perspective_camera(Camera_Type::first_person, { 0.0f, 0.0f, -2.0f }, fovy, speed);
+}
+
+void engine_update_input(Engine* engine) {
+ update_input(engine->camera, engine->deltaTime);
+}
+
+void engine_update_camera_view(Engine* engine) {
+ update_camera(engine->camera, get_cursor_position());
+}
+
+void engine_update_camera_projection(Engine* engine, int width, int height) {
+ update_projection(engine->camera, width, height);
+}
+
+
+float* engine_get_camera_view(Engine* engine)
+{
+ return glm::value_ptr(engine->camera.viewProj.view);
+}
+
+float* engine_get_camera_projection(Engine* engine)
+{
+ return glm::value_ptr(engine->camera.viewProj.proj);
+}
+
+void engine_get_camera_position(Engine* engine, float* x, float* y, float* z) {
+ *x = engine->camera.position.x;
+ *y = engine->camera.position.y;
+ *z = engine->camera.position.z;
+}
+
+void engine_get_camera_front_vector(Engine* engine, float* x, float* y, float* z) {
+ *x = engine->camera.front_vector.x;
+ *y = engine->camera.front_vector.y;
+ *z = engine->camera.front_vector.z;
+}
+
+float* engine_get_camera_fov(Engine* engine) {
+ return &engine->camera.fov;
+}
+
+float* engine_get_camera_speed(Engine* engine) {
+ return &engine->camera.speed;
+}
+
+float* engine_get_camera_near(Engine* engine) {
+ return &engine->camera.near;
+}
+
+float* engine_get_camera_far(Engine* engine) {
+ return &engine->camera.far;
+}
+
+void engine_set_camera_position(Engine* engine, float x, float y, float z) {
+ engine->camera.position = glm::vec3(x, y, z);
+}
+
+void engine_enable_ui(Engine* engine) {
+ engine->uiPassEnabled = true;
+
+
+ {
+ add_framebuffer_attachment(uiPass, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_FORMAT_R8G8B8A8_SRGB, framebufferSize);
+ create_render_pass_2(uiPass, true);
+ }
+
+ engine->ui = create_gui(engine->renderer, uiPass.render_pass);
+
+
+ for (std::size_t i = 0; i < get_swapchain_image_count(); ++i)
+ viewportUI.push_back(ImGui_ImplVulkan_AddTexture(gFramebufferSampler, viewport[i].view, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL));
+
+ // Create descriptor sets for g-buffer images for UI
+ for (std::size_t i = 0; i < positions.size(); ++i) {
+ positionsUI.push_back(ImGui_ImplVulkan_AddTexture(gFramebufferSampler, positions[i].view, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL));
+ normalsUI.push_back(ImGui_ImplVulkan_AddTexture(gFramebufferSampler, normals[i].view, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL));
+ colorsUI.push_back(ImGui_ImplVulkan_AddTexture(gFramebufferSampler, colors[i].view, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL));
+ specularsUI.push_back(ImGui_ImplVulkan_AddTexture(gFramebufferSampler, speculars[i].view, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL));
+ depthsUI.push_back(ImGui_ImplVulkan_AddTexture(gFramebufferSampler, depths[i].view, VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL));
+ }
+
+ uiCmdBuffer = create_command_buffers();
+}
+
+void engine_begin_ui_pass() {
+ begin_command_buffer(uiCmdBuffer);
+ begin_render_pass(uiCmdBuffer, uiPass);
+ begin_ui();
+}
+
+void engine_end_ui_pass() {
+ end_ui(uiCmdBuffer);
+ end_render_pass(uiCmdBuffer);
+ end_command_buffer(uiCmdBuffer);
+}
+
+void engine_render_viewport_ui(int width, int height) {
+ const uint32_t currentImage = get_swapchain_frame_index();
+ ImGui::Image(viewportUI[currentImage], ImVec2((float)width, (float)height));
+}
+
+int engine_get_model_count(Engine* engine) {
+ return static_cast(engine->models.size());
+}
+
+int engine_get_instance_count(Engine* engine) {
+ return static_cast(engine->instances.size());
+}
+
+const char* engine_get_model_name(Engine* engine, int modelID) {
+ return engine->models[modelID].name.c_str();
+}
+
+void engine_set_instance_scale(Engine* engine, int instanceIndex, float scale) {
+ engine->instances[instanceIndex].scale = glm::vec3(scale);
+}
+
+void engine_set_instance_scale(Engine* engine, int instanceIndex, float x, float y, float z) {
+ engine->instances[instanceIndex].scale = glm::vec3(x, y, z);
+}
+
+double engine_get_delta_time(Engine* engine) {
+ return engine->deltaTime;
+}
+
+const char* engine_get_gpu_name(Engine* engine) {
+ return engine->renderer->ctx.device.gpu_name.c_str();
+}
+
+void engine_get_uptime(Engine* engine, int* hours, int* minutes, int* seconds) {
+ const auto [h, m, s] = get_duration(engine->startTime);
+
+ *hours = h;
+ *minutes = m;
+ *seconds = s;
+}
+
+void engine_get_memory_status(Engine* engine, float* memoryUsage, unsigned int* maxMemory) {
+ const MEMORYSTATUSEX memoryStatus = get_windows_memory_status();
+
+ *memoryUsage = memoryStatus.dwMemoryLoad / 100.0f;
+ *maxMemory = static_cast(memoryStatus.ullTotalPhys / 1'000'000'000);
+}
+
+const char* engine_display_file_explorer(Engine* engine, const char* path) {
+ // TODO: Clean up this function and ensure that no bugs exist
+ static std::string current_dir = path;
+ static std::string fullPath;
+
+ static std::vector items = get_directory_items(current_dir);
+ static int currentlySelected = 0;
+
+ //ImGui::SameLine();
+ //ImGui::Text("[%d]", items.size());
+
+
+ // TODO: Convert to ImGuiClipper
+ if (ImGui::BeginListBox("##empty", ImVec2(-FLT_MIN, 250))) {
+ for (std::size_t i = 0; i < items.size(); ++i) {
+ Directory_Item item = items[i];
+
+ const ImVec2 combo_pos = ImGui::GetCursorScreenPos();
+ ImGui::SetCursorScreenPos(ImVec2(combo_pos.x + ImGui::GetStyle().FramePadding.x, combo_pos.y));
+
+ const bool selected = ImGui::Selectable(std::string("##" + item.name).c_str(), currentlySelected == i);
+ ImGui::SameLine();
+
+
+
+ if (item.type == Item_Type::file) {
+ if (selected) {
+ currentlySelected = static_cast(i);
+ fullPath = current_dir + '/' + item.name;
+ }
+ ImGui::TextColored(ImVec4(1.0, 1.0, 1.0, 1.0), item.name.c_str());
+ } else if (item.type == Item_Type::folder) {
+ if (selected) {
+ current_dir = items[i].path;
+ fullPath = current_dir;
+ items = get_directory_items(current_dir);
+ item = items[0];
+ currentlySelected = 0;
+ }
+ ImGui::TextColored(ImVec4(0.5, 0.5, 0.5, 1.0), item.name.c_str());
+ }
+
+ // Set the initial focus when opening the combo (scrolling + keyboard navigation focus)
+ if (selected)
+ ImGui::SetItemDefaultFocus();
+
+
+ }
+ ImGui::EndListBox();
+ }
+
+ return fullPath.c_str();
+}
+
+const char* engine_get_executable_directory(Engine* engine) {
+ return engine->execPath.c_str();
+}
+
+void engine_set_cursor_mode(Engine* engine, int cursorMode) {
+ int mode = (cursorMode == 0) ? GLFW_CURSOR_NORMAL : GLFW_CURSOR_DISABLED;
+ engine->camera.first_mouse = true;
+ glfwSetInputMode(engine->window->handle, GLFW_CURSOR, mode);
+}
+
+void engine_clear_logs(Engine* engine) {
+ Logger::clear_logs();
+}
+
+void engine_export_logs_to_file(Engine* engine, const char* path) {
+ std::ofstream output(path);
+
+ for (auto& message : Logger::get_logs())
+ output << message.message << "\n";
+}
+
+int engine_get_log_count(Engine* engine) {
+ return static_cast(Logger::get_logs().size());
+}
+
+int engine_get_log_type(Engine* engine, int logIndex) {
+ return static_cast(Logger::get_logs()[logIndex].type);
+}
+
+const char* engine_get_log(Engine* engine, int logIndex) {
+ return Logger::get_logs()[logIndex].message.c_str();
+}
+
+// TODO: Event system stuff
+static bool press(Key_Pressed_Event& e) {
+ gTempEnginePtr->KeyCallback(gTempEnginePtr, e.get_key_code());
+
+ return true;
+}
+
+static bool mouse_button_press(Mouse_Button_Pressed_Event& e) {
+
+ return true;
+}
+
+static bool mouse_button_release(Mouse_Button_Released_Event& e) {
+
+ return true;
+}
+
+static bool mouse_moved(Mouse_Moved_Event& e) {
+ //update_camera_view(camera, event.GetX(), event.GetY());
+
+ return true;
+}
+
+
+static bool resize(Window_Resized_Event& e) {
+ return true;
+}
+
+static bool close_window(Window_Closed_Event& e) {
+ gTempEnginePtr->running = false;
+
+ return true;
+}
+
+static bool minimized_window(Window_Minimized_Event& e) {
+ gTempEnginePtr->window->minimized = true;
+
+ return true;
+}
+
+static bool not_minimized_window(Window_Not_Minimized_Event& e) {
+ gTempEnginePtr->window->minimized = false;
+ return true;
+}
+
+static void event_callback(Basic_Event& e) {
+ Event_Dispatcher dispatcher(e);
+
+ dispatcher.dispatch(press);
+ dispatcher.dispatch(mouse_button_press);
+ dispatcher.dispatch(mouse_button_release);
+ dispatcher.dispatch(mouse_moved);
+ dispatcher.dispatch(resize);
+ dispatcher.dispatch(close_window);
+ dispatcher.dispatch(minimized_window);
+ dispatcher.dispatch(not_minimized_window);
+}
diff --git a/engine/src/events/event.hpp b/engine/src/events/event.hpp
new file mode 100644
index 0000000..e809cf1
--- /dev/null
+++ b/engine/src/events/event.hpp
@@ -0,0 +1,51 @@
+#ifndef MYENGINE_EVENT_HPP
+#define MYENGINE_EVENT_HPP
+
+
+enum class Event_Type {
+ none = 0,
+
+ key_pressed,
+ key_released,
+
+ mouse_button_pressed,
+ mouse_button_released,
+ mouse_moved,
+ mouse_entered,
+ mouse_left,
+ mouse_scrolled_up,
+ mouse_scrolled_down,
+
+ window_closed,
+ window_focused,
+ window_lost_focus,
+ window_maximized,
+ window_restored,
+ window_minimized,
+ window_not_minimized,
+ window_resized,
+ window_dropped
+};
+
+
+
+
+#define EVENT_CLASS_TYPE(type) static Event_Type get_static_type() { return Event_Type::type; } \
+Event_Type get_type() const override { return get_static_type(); } \
+const char* get_name() const override { return #type; }
+
+
+struct Basic_Event {
+ virtual Event_Type get_type() const = 0;
+ virtual const char* get_name() const = 0;
+
+ bool Handled = false;
+};
+
+
+
+using Event_Func = std::function;
+//void (*EventFunc)(event&);
+//#define BIND_EVENT(x) std::bind(&x, this, std::placeholders::_1)
+
+#endif
\ No newline at end of file
diff --git a/src/events/event_dispatcher.hpp b/engine/src/events/event_dispatcher.hpp
similarity index 81%
rename from src/events/event_dispatcher.hpp
rename to engine/src/events/event_dispatcher.hpp
index fd58191..7d3f193 100644
--- a/src/events/event_dispatcher.hpp
+++ b/engine/src/events/event_dispatcher.hpp
@@ -3,8 +3,8 @@
#include "event.hpp"
-struct event_dispatcher {
- event_dispatcher(event& e)
+struct Event_Dispatcher {
+ Event_Dispatcher(Basic_Event& e)
: m_Event(e)
{}
@@ -19,7 +19,7 @@ struct event_dispatcher {
}
private:
- event& m_Event;
+ Basic_Event& m_Event;
};
#endif
\ No newline at end of file
diff --git a/src/events/key_event.hpp b/engine/src/events/key_event.hpp
similarity index 52%
rename from src/events/key_event.hpp
rename to engine/src/events/key_event.hpp
index 04d7a9e..97beb2c 100644
--- a/src/events/key_event.hpp
+++ b/engine/src/events/key_event.hpp
@@ -3,11 +3,11 @@
#include "event.hpp"
-struct key_event : public event {
+struct Key_Event : public Basic_Event {
int get_key_code() const { return m_KeyCode; }
protected:
- key_event(int keycode)
+ Key_Event(int keycode)
: m_KeyCode(keycode)
{}
@@ -15,17 +15,17 @@ struct key_event : public event {
int m_KeyCode;
};
-struct key_pressed_event : public key_event {
- key_pressed_event(int keycode)
- : key_event(keycode)
+struct Key_Pressed_Event : public Key_Event {
+ Key_Pressed_Event(int keycode)
+ : Key_Event(keycode)
{}
EVENT_CLASS_TYPE(key_pressed);
};
-struct key_released_event : public key_event {
- key_released_event(int keycode)
- : key_event(keycode)
+struct Key_Released_Event : public Key_Event {
+ Key_Released_Event(int keycode)
+ : Key_Event(keycode)
{}
EVENT_CLASS_TYPE(key_released);
diff --git a/src/events/mouse_event.hpp b/engine/src/events/mouse_event.hpp
similarity index 51%
rename from src/events/mouse_event.hpp
rename to engine/src/events/mouse_event.hpp
index 6a4348c..b3b2004 100644
--- a/src/events/mouse_event.hpp
+++ b/engine/src/events/mouse_event.hpp
@@ -3,11 +3,11 @@
#include "event.hpp"
-struct mouse_button_event : public event {
+struct Mouse_Button_Event : public Basic_Event {
int get_button_code() const { return m_ButtonCode; }
protected:
- mouse_button_event(int buttonCode)
+ Mouse_Button_Event(int buttonCode)
: m_ButtonCode(buttonCode)
{}
@@ -15,25 +15,25 @@ struct mouse_button_event : public event {
int m_ButtonCode;
};
-struct mouse_button_pressed_event : public mouse_button_event {
- mouse_button_pressed_event(int buttonCode)
- : mouse_button_event(buttonCode)
+struct Mouse_Button_Pressed_Event : public Mouse_Button_Event {
+ Mouse_Button_Pressed_Event(int buttonCode)
+ : Mouse_Button_Event(buttonCode)
{}
EVENT_CLASS_TYPE(mouse_button_pressed);
};
-struct mouse_button_released_event : public mouse_button_event {
- mouse_button_released_event(int buttonCode)
- : mouse_button_event(buttonCode)
+struct Mouse_Button_Released_Event : public Mouse_Button_Event {
+ Mouse_Button_Released_Event(int buttonCode)
+ : Mouse_Button_Event(buttonCode)
{}
EVENT_CLASS_TYPE(mouse_button_released);
};
-struct mouse_moved_event : public event {
- mouse_moved_event(double x, double y)
+struct Mouse_Moved_Event : public Basic_Event {
+ Mouse_Moved_Event(double x, double y)
: m_XPos(x), m_YPos(y)
{}
@@ -47,19 +47,19 @@ struct mouse_moved_event : public event {
double m_YPos;
};
-struct mouse_entered_event : public event {
+struct Mouse_Entered_Event : public Basic_Event {
EVENT_CLASS_TYPE(mouse_entered);
};
-struct mouse_left_event : public event {
+struct Mouse_Left_Event : public Basic_Event {
EVENT_CLASS_TYPE(mouse_left);
};
-struct mouse_scrolled_up_event : public event {
+struct Mouse_Scrolled_Up_Event : public Basic_Event {
EVENT_CLASS_TYPE(mouse_scrolled_up);
};
-struct mouse_scrolled_down_event : public event {
+struct Mouse_Scrolled_Down_Event : public Basic_Event {
EVENT_CLASS_TYPE(mouse_scrolled_down);
};
diff --git a/engine/src/events/window_event.hpp b/engine/src/events/window_event.hpp
new file mode 100644
index 0000000..90b05db
--- /dev/null
+++ b/engine/src/events/window_event.hpp
@@ -0,0 +1,58 @@
+#ifndef MYENGINE_WINDOWEVENT_HPP
+#define MYENGINE_WINDOWEVENT_HPP
+
+#include "event.hpp"
+
+struct Window_Closed_Event : public Basic_Event {
+ EVENT_CLASS_TYPE(window_closed);
+};
+
+struct Window_Focused_Event : public Basic_Event {
+ EVENT_CLASS_TYPE(window_focused);
+};
+
+struct Window_Lost_Focus_Event : public Basic_Event {
+ EVENT_CLASS_TYPE(window_lost_focus);
+};
+
+struct Window_Maximized_Event : public Basic_Event {
+ EVENT_CLASS_TYPE(window_maximized);
+};
+
+struct Window_Restored_Event : public Basic_Event {
+ EVENT_CLASS_TYPE(window_restored);
+};
+
+struct Window_Minimized_Event : public Basic_Event {
+ EVENT_CLASS_TYPE(window_minimized);
+};
+
+struct Window_Not_Minimized_Event : public Basic_Event {
+ EVENT_CLASS_TYPE(window_not_minimized);
+};
+
+struct Window_Resized_Event : public Basic_Event {
+ Window_Resized_Event(uint32_t width, uint32_t height)
+ : m_Width(width), m_Height(height)
+ {}
+
+ uint32_t get_width() const { return m_Width; }
+ uint32_t get_height() const { return m_Height; }
+
+ EVENT_CLASS_TYPE(window_resized);
+private:
+ uint32_t m_Width;
+ uint32_t m_Height;
+};
+
+struct Window_Dropped_Event : public Basic_Event {
+ Window_Dropped_Event(const std::vector& paths)
+ : m_Paths(paths)
+ {}
+
+ EVENT_CLASS_TYPE(window_dropped);
+private:
+ std::vector m_Paths;
+};
+
+#endif
\ No newline at end of file
diff --git a/engine/src/filesystem/filesystem.cpp b/engine/src/filesystem/filesystem.cpp
new file mode 100644
index 0000000..bc23dc4
--- /dev/null
+++ b/engine/src/filesystem/filesystem.cpp
@@ -0,0 +1,47 @@
+#include "filesystem.hpp"
+
+
+std::vector get_directory_items(const std::string& directory) {
+ std::vector items;
+
+ std::filesystem::path current_path(directory);
+
+ if (current_path.has_parent_path()) {
+ Directory_Item item{};
+
+ // TODO: Check if this creates a copy of the string or if the string
+ // becomes invalid after std::filesystem::path goes out of scope.
+ item.path = current_path.parent_path().string();
+ item.name = "..";
+ item.type = Item_Type::folder;
+ item.size = 0;
+
+ items.push_back(item);
+ }
+
+
+ for (const auto& entry : std::filesystem::directory_iterator(directory)) {
+ Directory_Item item{};
+
+ current_path = entry.path();
+
+ item.path = current_path.string();
+ item.name = current_path.filename().string();
+
+ // Note that the function std::filesystem::directory_entry::file_size
+ // cannot be called on a directory as this results in an exception.
+ // Therefore, we need to check if the current entry is a directory or
+ // file and set the file size accordingly.
+ if (entry.is_directory()) {
+ item.type = Item_Type::folder;
+ item.size = 0;
+ } else {
+ item.type = Item_Type::file;
+ item.size = entry.file_size();
+ }
+
+ items.push_back(item);
+ }
+
+ return items;
+}
diff --git a/engine/src/filesystem/filesystem.hpp b/engine/src/filesystem/filesystem.hpp
new file mode 100644
index 0000000..51de304
--- /dev/null
+++ b/engine/src/filesystem/filesystem.hpp
@@ -0,0 +1,21 @@
+#ifndef MYENGINE_FILESYSTEM_HPP
+#define MYENGINE_FILESYSTEM_HPP
+
+
+enum class Item_Type {
+ unknown,
+ file,
+ folder,
+};
+
+struct Directory_Item {
+ Item_Type type;
+
+ std::string name;
+ std::string path;
+ std::size_t size;
+};
+
+std::vector get_directory_items(const std::string& directory);
+
+#endif
diff --git a/engine/src/filesystem/vfs.cpp b/engine/src/filesystem/vfs.cpp
new file mode 100644
index 0000000..d0097de
--- /dev/null
+++ b/engine/src/filesystem/vfs.cpp
@@ -0,0 +1,96 @@
+#include "vfs.hpp"
+
+VFS& VFS::get()
+{
+ static VFS instance;
+
+ return instance;
+}
+
+
+void VFS::mount(const std::string& virtual_path, const std::filesystem::path& real_path)
+{
+ mount_points[virtual_path].push_back(real_path);
+}
+
+void VFS::unmount(const std::string& virtual_path)
+{
+ mount_points[virtual_path].clear();
+}
+
+std::filesystem::path VFS::get_path(const std::string& virtual_path)
+{
+
+ std::string full_path = virtual_path;
+ std::string mount_point;
+ std::string remaining_path;
+
+ if (full_path.empty()) {
+ throw std::runtime_error("Virtual path is empty!");
+ }
+
+
+ // If a leading slash is found then simply remove it in order to evaluate
+ // the mount point.
+ if (full_path[0] == '/') {
+ full_path = full_path.erase(0, 1);
+ }
+
+ // todo: A path such as "/example_path" causes a substr position error.
+ // todo: This is due to the "/" not being present at the end.
+
+ // Find the next slash and everything before it will be considered the
+ // mount point.
+ std::string::size_type pos = full_path.find('/');
+ if (pos != std::string::npos)
+ mount_point = full_path.substr(0, pos);
+ else
+ mount_point = full_path;
+
+ // Once the mount point has been set then we store the rest of the path
+ // so that it can be combined with each real path for a given virtual
+ // mount point.
+ remaining_path = full_path.substr(mount_point.size(), full_path.size());
+
+
+ // Check if virtual mount point exists or if any real paths are mounted to
+ // the virtual mount point.
+ if (mount_points.find(mount_point) == mount_points.end() || mount_points[mount_point].empty()) {
+ throw std::runtime_error("Virtual mount point not found!");
+ }
+
+
+ // If multiple real paths exist for the mount point then for each one check
+ // if the file exists.
+ std::string file_path;
+ for (const std::filesystem::path& real_path : mount_points[mount_point]) {
+ std::filesystem::path path(real_path.string() + remaining_path);
+
+ // todo: This only checks for the first file which is found and
+ // todo: therefore, does not take into account that the same
+ // todo: path may exist at different real paths.
+ if (std::filesystem::exists(path)) {
+ file_path = path.string();
+ break;
+ }
+ }
+
+
+
+ if (file_path.empty()) {
+ throw std::runtime_error("File could not be found at any mount point!");
+ }
+
+ return file_path;
+}
+
+
+void mount_path(const std::string& virtual_path, const std::filesystem::path& real_path)
+{
+ VFS::get().mount(virtual_path, real_path);
+}
+
+std::filesystem::path get_vfs_path(const std::string& virtual_path)
+{
+ return VFS::get().get_path(virtual_path);
+}
diff --git a/engine/src/filesystem/vfs.hpp b/engine/src/filesystem/vfs.hpp
new file mode 100644
index 0000000..1819de8
--- /dev/null
+++ b/engine/src/filesystem/vfs.hpp
@@ -0,0 +1,27 @@
+#ifndef MYENGINE_VFS_HPP
+#define MYENGINE_VFS_HPP
+
+class VFS {
+public:
+ VFS(VFS const&) = delete;
+ void operator=(VFS const&) = delete;
+
+
+ static VFS& get();
+
+ void mount(const std::string& virtual_path, const std::filesystem::path& real_path);
+ void unmount(const std::string& virtual_path);
+
+ std::filesystem::path get_path(const std::string& virtual_path);
+
+private:
+ VFS() = default;
+
+private:
+ std::unordered_map> mount_points;
+};
+
+void mount_path(const std::string& virtual_path, const std::filesystem::path& real_path);
+std::filesystem::path get_vfs_path(const std::string& virtual_path);
+
+#endif
\ No newline at end of file
diff --git a/engine/src/logging.cpp b/engine/src/logging.cpp
new file mode 100644
index 0000000..842dd42
--- /dev/null
+++ b/engine/src/logging.cpp
@@ -0,0 +1,40 @@
+#include "logging.hpp"
+
+
+std::vector Logger::m_Logs;
+
+void Logger::check_log_limit() {
+ if (m_Logs.size() < m_LogLimit)
+ return;
+
+ // At this point, the number of logs have reached their maximum limit.
+ // So we will remove the first element of the vector or in other words,
+ // the oldest log message.
+ m_Logs.erase(m_Logs.begin());
+}
+
+void Logger::log(Log_Type type, const std::string& message) {
+ check_log_limit();
+
+ Log_Message msg{};
+ msg.type = type;
+ msg.message = message;
+
+ m_Logs.push_back(msg);
+
+#if defined(_DEBUG)
+ printf("%s\n", message.c_str());
+#endif
+}
+
+std::vector& Logger::get_logs() {
+ return m_Logs;
+}
+
+std::size_t Logger::get_log_limit() {
+ return m_LogLimit;
+}
+
+void Logger::clear_logs() {
+ m_Logs.clear();
+}
\ No newline at end of file
diff --git a/engine/src/logging.hpp b/engine/src/logging.hpp
new file mode 100644
index 0000000..e0b5f32
--- /dev/null
+++ b/engine/src/logging.hpp
@@ -0,0 +1,49 @@
+#ifndef MY_ENGINE_LOGGING_HPP
+#define MY_ENGINE_LOGGING_HPP
+
+
+enum class Log_Type {
+ info = 0,
+ warning,
+ error
+};
+
+struct Log_Message {
+ Log_Type type;
+ std::string message;
+};
+
+class Logger {
+public:
+ template
+ static void info(std::string_view fmt, Args&&... args)
+ {
+ log(Log_Type::info, "[INFO]: " + std::vformat(fmt, std::make_format_args(std::forward(args)...)));
+ }
+
+ template
+ static void warning(std::string_view fmt, Args&&... args)
+ {
+ log(Log_Type::warning, "[WARN]: " + std::vformat(fmt, std::make_format_args(std::forward(args)...)));
+ }
+
+ template
+ static void error(std::string_view fmt, Args&&... args)
+ {
+ log(Log_Type::error, "[ERROR]: " + std::vformat(fmt, std::make_format_args(std::forward(args)...)));
+ }
+
+ static std::vector& get_logs();
+ static std::size_t get_log_limit();
+
+ static void clear_logs();
+private:
+ static void check_log_limit();
+ static void log(Log_Type type, const std::string& message);
+private:
+ static const std::size_t m_LogLimit = 10'000;
+
+ static std::vector m_Logs;
+};
+
+#endif
\ No newline at end of file
diff --git a/src/pch.cpp b/engine/src/pch.cpp
similarity index 69%
rename from src/pch.cpp
rename to engine/src/pch.cpp
index 1e51a2f..969bb2c 100644
--- a/src/pch.cpp
+++ b/engine/src/pch.cpp
@@ -1,3 +1,6 @@
+#define VOLK_IMPLEMENTATION
+#include
+
#define STB_IMAGE_IMPLEMENTATION
#include
diff --git a/src/pch.hpp b/engine/src/pch.hpp
similarity index 68%
rename from src/pch.hpp
rename to engine/src/pch.hpp
index 86e8943..9a571e1 100644
--- a/src/pch.hpp
+++ b/engine/src/pch.hpp
@@ -20,9 +20,35 @@
#include
#include
#include