From f413bf886b9935b9f81806187323b00f2d94c31c Mon Sep 17 00:00:00 2001 From: Bram Verhulst Date: Fri, 17 Jan 2025 18:13:36 +0100 Subject: [PATCH] Add shadows, fi other stuff --- .gitignore | 3 +- project/CMakeLists.txt | 20 +- project/resources/ShadingDemo.mtl | 2 + project/resources/ShadingDemo.obj | 4919 +++++++++++++++++++++++ project/resources/SuperSimpleDiffuse.fx | 131 + project/resources/shadowEffect.fx | 47 + project/src/BRDF.h | 25 + project/src/Buffers/DX11Viewport.cpp | 35 + project/src/Buffers/DX11Viewport.h | 24 + project/src/Buffers/DepthBuffer.cpp | 50 + project/src/Buffers/DepthBuffer.h | 31 + project/src/Buffers/SamplerState.cpp | 29 + project/src/Buffers/SamplerState.h | 19 + project/src/Buffers/ShadowMapBuffer.cpp | 50 + project/src/Buffers/ShadowMapBuffer.h | 37 + project/src/DirectionalLight.cpp | 45 + project/src/DirectionalLight.h | 34 + project/src/Effects/Effect.cpp | 3 +- project/src/Effects/Effect.h | 5 +- project/src/Effects/FireEffect.h | 7 +- project/src/Effects/ShadowDiffuse.cpp | 235 ++ project/src/Effects/ShadowDiffuse.h | 70 + project/src/Effects/ShadowEffect.cpp | 64 + project/src/Effects/ShadowEffect.h | 23 + project/src/GamePadController.cpp | 5 +- project/src/HitTest.cpp | 3 - project/src/HitTest.h | 3 +- project/src/Math/Matrix.cpp | 9 + project/src/Math/Matrix.h | 2 +- project/src/RenderSettings.h | 26 + project/src/Renderer.cpp | 32 +- project/src/Scenes/ShadowTestScene.cpp | 162 + project/src/Scenes/ShadowTestScene.h | 41 + project/src/ShadowMesh.cpp | 118 + project/src/ShadowMesh.h | 63 + project/src/Singleton.h | 30 + project/src/main.cpp | 8 +- 37 files changed, 6379 insertions(+), 31 deletions(-) create mode 100644 project/resources/ShadingDemo.mtl create mode 100644 project/resources/ShadingDemo.obj create mode 100644 project/resources/SuperSimpleDiffuse.fx create mode 100644 project/resources/shadowEffect.fx create mode 100644 project/src/BRDF.h create mode 100644 project/src/Buffers/DX11Viewport.cpp create mode 100644 project/src/Buffers/DX11Viewport.h create mode 100644 project/src/Buffers/DepthBuffer.cpp create mode 100644 project/src/Buffers/DepthBuffer.h create mode 100644 project/src/Buffers/SamplerState.cpp create mode 100644 project/src/Buffers/SamplerState.h create mode 100644 project/src/Buffers/ShadowMapBuffer.cpp create mode 100644 project/src/Buffers/ShadowMapBuffer.h create mode 100644 project/src/DirectionalLight.cpp create mode 100644 project/src/DirectionalLight.h create mode 100644 project/src/Effects/ShadowDiffuse.cpp create mode 100644 project/src/Effects/ShadowDiffuse.h create mode 100644 project/src/Effects/ShadowEffect.cpp create mode 100644 project/src/Effects/ShadowEffect.h create mode 100644 project/src/RenderSettings.h create mode 100644 project/src/Scenes/ShadowTestScene.cpp create mode 100644 project/src/Scenes/ShadowTestScene.h create mode 100644 project/src/ShadowMesh.cpp create mode 100644 project/src/ShadowMesh.h create mode 100644 project/src/Singleton.h diff --git a/.gitignore b/.gitignore index f9934e8..96518fa 100644 --- a/.gitignore +++ b/.gitignore @@ -25,4 +25,5 @@ bld/ .vs cmake-build-debug cmake-build-release -cmake-build-debug-visual-studio \ No newline at end of file +cmake-build-debug-visual-studio +cmake-** diff --git a/project/CMakeLists.txt b/project/CMakeLists.txt index 5f0fda5..04671a6 100644 --- a/project/CMakeLists.txt +++ b/project/CMakeLists.txt @@ -5,6 +5,7 @@ set(SOURCES "src/Renderer.cpp" "src/Timer.cpp" "src/Mesh.cpp" + "src/ShadowMesh.cpp" "src/InstancedMesh.cpp" "src/Camera.cpp" "src/Texture.cpp" @@ -12,13 +13,23 @@ set(SOURCES "src/Utils.cpp" "src/HitTest.cpp" "src/Material.cpp" - "src/Math/Vector2.cpp" + "src/DirectionalLight.cpp" + + "src/Math/Vector2.cpp" "src/Math/Vector3.cpp" "src/Math/Vector4.cpp" "src/Math/Matrix.cpp" + + "src/BRDF.h" + "src/Effects/Effect.cpp" "src/Effects/BaseEffect.cpp" "src/Effects/FireEffect.cpp" + "src/Effects/ShadowEffect.cpp" + "src/Effects/ShadowDiffuse.cpp" + + "src/Singleton.h" + "src/RenderSettings.h" "src/PerlinNoise.hpp" @@ -27,6 +38,12 @@ set(SOURCES "src/Scenes/DioramaScene.cpp" "src/Scenes/InstancedScene.cpp" "src/Scenes/PlanetScene.cpp" + "src/Scenes/ShadowTestScene.cpp" + + "src/Buffers/ShadowMapBuffer.cpp" + "src/Buffers/SamplerState.cpp" + "src/Buffers/DepthBuffer.cpp" + "src/Buffers/DX11Viewport.cpp" ) SET(INCLUDE_DIRS @@ -34,6 +51,7 @@ SET(INCLUDE_DIRS "src/Math" "src/Effects" "src/Scenes" + "src/Buffers" ) # Create the executable diff --git a/project/resources/ShadingDemo.mtl b/project/resources/ShadingDemo.mtl new file mode 100644 index 0000000..24c0d6a --- /dev/null +++ b/project/resources/ShadingDemo.mtl @@ -0,0 +1,2 @@ +# Blender 4.3.2 MTL File: 'None' +# www.blender.org diff --git a/project/resources/ShadingDemo.obj b/project/resources/ShadingDemo.obj new file mode 100644 index 0000000..b503dac --- /dev/null +++ b/project/resources/ShadingDemo.obj @@ -0,0 +1,4919 @@ +# Blender 4.3.2 +# www.blender.org +mtllib ShadingDemo.mtl +o Plane +v -44.164467 0.000008 44.164467 +v 44.164467 0.000008 44.164467 +v -44.164467 -0.000008 -44.164467 +v 44.164467 -0.000008 -44.164467 +vn -0.0000 1.0000 -0.0000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +s 1 +f 1/1/1 2/2/1 4/3/1 3/4/1 +o Suzanne +v -4.760355 6.505108 6.627264 +v -6.708143 6.505108 5.348475 +v -4.569673 6.241455 6.640080 +v -6.795715 6.241455 5.178607 +v -4.351874 6.011415 6.535782 +v -6.786608 6.011415 4.937294 +v -4.891175 5.877893 6.409549 +v -6.456361 5.877893 5.381948 +v -4.983722 6.134636 6.550511 +v -6.548909 6.134636 5.522913 +v -4.993467 6.451702 6.565353 +v -6.558653 6.451702 5.537755 +v -5.165739 6.544693 6.448684 +v -6.383106 6.544693 5.649438 +v -5.300833 6.310722 6.313291 +v -6.205163 6.310722 5.719564 +v -5.311813 6.100474 6.102571 +v -6.007451 6.100474 5.645863 +v -5.365422 6.549570 5.805161 +v -5.713242 6.549570 5.576806 +v -5.336772 6.658422 6.064775 +v -5.962847 6.658422 5.653737 +v -5.180993 6.727692 6.320291 +v -6.259233 6.727692 5.612389 +v -5.051689 6.928989 6.274968 +v -6.269056 6.928989 5.475724 +v -5.094456 7.006119 5.998947 +v -5.998785 7.006119 5.405221 +v -5.045695 6.997169 5.697237 +v -5.741333 6.997169 5.240526 +v -4.516438 7.140586 5.838768 +v -6.081624 7.140586 4.811169 +v -4.690449 7.122830 6.103815 +v -6.255636 7.122830 5.076213 +v -4.835968 6.982399 6.325459 +v -6.401155 6.982399 5.297862 +v -4.646305 6.889408 6.453549 +v -6.594092 6.889408 5.174758 +v -4.363296 6.936851 6.325737 +v -6.589338 6.936851 4.864264 +v -4.085756 6.908111 6.130445 +v -6.520490 6.908111 4.531959 +v -4.027534 6.430820 6.420834 +v -6.810088 6.430820 4.593988 +v -4.307270 6.569359 6.543656 +v -6.811568 6.569359 4.899498 +v -4.626439 6.678214 6.574916 +v -6.713354 6.678214 5.204783 +v -4.629135 6.698003 6.616930 +v -6.750831 6.698003 5.223961 +v -4.643570 6.927498 6.487289 +v -6.626139 6.927498 5.185665 +v -4.855237 7.048686 6.354810 +v -6.420423 7.048686 5.327209 +v -5.093779 6.976976 6.301169 +v -6.276364 6.976976 5.524762 +v -5.245905 6.757380 6.343348 +v -6.254581 6.757380 5.681117 +v -5.218691 6.556078 6.491431 +v -6.401277 6.556078 5.715023 +v -4.977694 6.767273 6.541328 +v -6.542880 6.767273 5.513731 +v -5.034459 6.444788 6.627790 +v -6.599645 6.444788 5.600193 +v -4.768482 6.506600 6.677552 +v -6.751052 6.506600 5.375926 +v -5.519466 7.097620 5.660724 +v -5.674210 7.013577 5.896420 +v -6.280622 4.489139 6.820076 +v -6.091057 5.390306 6.531342 +v -6.018817 5.721198 6.421309 +v -6.325706 4.249746 6.888748 +v -5.354977 6.864596 5.410182 +v -5.200753 7.209311 5.175278 +v -3.536445 6.562824 2.640290 +v -3.378284 5.389997 2.399388 +v -3.750566 4.266790 2.966429 +v -4.678211 3.809032 4.379367 +v -5.265350 5.424325 6.259243 +v -6.169680 5.424325 5.665520 +v -5.205711 4.848626 6.699100 +v -6.596988 4.848626 5.785677 +v -5.297979 4.244729 7.029171 +v -6.863165 4.244729 6.001573 +v -5.348754 3.737751 7.182323 +v -6.983504 3.737751 6.109054 +v -5.463683 3.599756 7.167841 +v -6.924523 3.599756 6.208748 +v -5.850577 3.584440 7.036911 +v -6.650561 3.584440 6.511693 +v -6.291562 3.577528 6.836740 +v -4.670862 5.494544 6.490952 +v -6.618649 5.494544 5.212162 +v -4.175529 5.742336 6.684155 +v -6.992864 5.742336 4.834476 +v -3.489890 6.062788 6.587499 +v -7.176773 6.062788 4.166931 +v -3.415636 6.909600 6.626025 +v -7.241646 6.909600 4.114115 +v -3.748220 7.077282 6.412373 +v -6.913375 7.077282 4.334338 +v -4.234050 7.430946 6.090971 +v -6.425311 7.430946 4.652331 +v -4.568292 7.856318 5.766122 +v -5.994350 7.856318 4.829865 +v -4.990787 7.794508 5.613604 +v -5.686425 7.794508 5.156891 +v -5.346934 7.253913 5.701187 +v -5.625189 7.253913 5.518502 +v -5.205291 7.100603 5.978230 +v -5.935711 7.100603 5.498684 +v -5.358236 6.834507 6.021656 +v -5.914747 6.834507 5.656288 +v -5.300833 6.310722 6.313291 +v -6.205163 6.310722 5.719564 +v -4.922325 6.078247 6.570714 +v -6.591856 6.078247 5.474607 +v -4.588701 6.148461 6.631156 +v -6.779962 6.148461 5.192519 +v -4.176029 6.411573 6.647013 +v -6.958582 6.411573 4.820168 +v -4.065213 6.667771 6.554038 +v -6.917330 6.667771 4.681521 +v -4.117945 6.870564 6.444820 +v -6.796153 6.870564 4.686483 +v -4.527402 7.086233 6.234537 +v -6.440407 7.086233 4.978580 +v -4.955887 7.208910 6.015326 +v -6.068908 7.208910 5.284588 +v -6.340362 4.287838 6.911069 +v -6.064303 4.397637 7.021286 +v -6.551250 4.397637 6.701589 +v -6.098247 4.093451 7.110894 +v -6.619975 4.093451 6.768361 +v -6.232482 3.963861 7.050006 +v -6.510737 3.963861 6.867322 +v -6.366998 3.935665 6.951641 +v -5.963987 5.643522 6.337797 +v -5.915927 5.761725 6.264594 +v -5.695276 5.743425 6.421297 +v -6.147441 5.743425 6.124434 +v -5.707456 5.570323 6.553568 +v -6.263967 5.570323 6.188200 +v -5.827815 5.414029 6.547359 +v -6.210416 5.414029 6.296170 +v -4.873426 5.892263 6.609954 +v -6.647304 5.892263 5.445343 +v -4.255616 6.070787 6.730330 +v -7.003387 6.070787 4.926322 +v -3.878824 6.388801 6.687112 +v -7.113542 6.388801 4.563406 +v -3.794864 6.860666 6.635044 +v -7.099146 6.860666 4.465668 +v -3.979836 7.041227 6.651438 +v -7.040645 7.041227 4.641910 +v -4.534411 7.441388 6.283120 +v -6.482198 7.441388 5.004329 +v -4.797712 7.710464 6.077657 +v -6.188989 7.710464 5.164236 +v -5.077565 7.675355 5.973218 +v -5.981895 7.675355 5.379496 +v -5.423947 7.226264 6.008024 +v -5.876112 7.226264 5.711162 +v -5.700908 5.942286 6.543594 +v -6.257419 5.942286 6.178226 +v -5.618006 5.008448 6.834299 +v -6.557117 5.008448 6.217739 +v -5.680143 4.374865 7.118475 +v -6.793164 4.374865 6.387739 +v -5.696696 4.070677 7.219501 +v -6.879281 4.070677 6.443092 +v -5.791258 3.811496 7.211905 +v -6.834715 3.811496 6.526841 +v -5.958638 3.774896 7.125690 +v -6.689058 3.774896 6.646143 +v -6.344754 3.748194 6.917758 +v -5.765497 6.181131 6.035466 +v -5.701663 6.614910 5.938238 +v -4.756460 7.207417 6.090638 +v -6.217300 7.207417 5.131545 +v -5.365245 6.430418 6.221866 +v -6.095665 6.430418 5.742320 +v -5.395974 6.605012 6.117043 +v -5.987266 6.605012 5.728837 +v -6.025188 4.470839 6.999616 +v -6.546917 4.470839 6.657083 +v -5.963869 5.057927 6.716682 +v -6.311688 5.057927 6.488328 +v -6.137779 5.057927 6.602507 +v -6.046271 5.322528 6.463126 +v -5.849780 5.500105 6.618721 +v -6.267162 5.500105 6.344696 +v -5.750326 5.629696 6.656773 +v -6.341618 5.629696 6.268569 +v -5.717240 5.829504 6.492659 +v -6.204186 5.829504 6.172961 +v -5.868328 5.847806 6.381626 +v -6.042237 5.847806 6.267447 +v -6.069852 5.724179 6.499043 +v -5.907403 5.832489 6.479051 +v -6.116095 5.832489 6.342038 +v -5.808488 5.814188 6.555830 +v -6.225871 5.814188 6.281803 +v -5.842672 5.669281 6.683710 +v -6.329619 5.669281 6.364013 +v -5.898398 5.584692 6.616961 +v -6.246218 5.584692 6.388608 +v -6.099463 5.493195 6.544146 +v -5.220465 5.121633 6.456224 +v -6.368268 5.121633 5.702652 +v -5.581146 5.484244 6.550714 +v -6.311566 5.484244 6.071167 +v -5.595243 5.319545 6.647998 +v -6.395227 5.319545 6.122783 +v -5.229190 5.268032 6.355793 +v -6.272648 5.268032 5.670729 +v -6.356135 3.972265 6.935094 +v -6.246359 3.990566 6.995329 +v -6.455050 3.990566 6.858315 +v -6.139557 4.130054 7.060097 +v -6.556940 4.130054 6.786068 +v -6.105334 4.332842 7.007968 +v -6.522717 4.332842 6.733943 +v -6.250790 4.152281 6.774640 +v -6.030418 4.235376 6.893860 +v -6.447801 4.235376 6.619833 +v -6.043736 4.059290 6.914145 +v -6.461119 4.059290 6.640120 +v -6.165193 3.957896 6.871703 +v -6.373884 3.957896 6.734690 +v -6.274970 3.939595 6.811469 +v -5.333718 6.652999 6.211751 +v -6.098920 6.652999 5.709370 +v -5.332341 6.496706 6.285468 +v -6.167107 6.496706 5.737413 +v -4.791741 7.117412 6.182281 +v -6.287364 7.117412 5.200355 +v -4.956387 7.118901 6.129807 +v -6.173754 7.118901 5.330564 +v -4.642251 7.064003 6.371562 +v -6.520475 7.064003 5.138443 +v -4.261366 6.855247 6.473740 +v -6.765664 6.855247 4.829579 +v -4.242598 6.698950 6.558873 +v -6.851241 6.698950 4.846208 +v -4.315117 6.469458 6.631423 +v -6.888979 6.469458 4.941594 +v -4.656588 6.299335 6.658748 +v -6.778285 6.299335 5.265779 +v -4.939956 6.237525 6.597569 +v -6.609488 6.237525 5.501462 +v -5.288015 6.396801 6.407485 +v -6.296691 6.396801 5.745255 +v -5.262017 6.835999 6.140448 +v -6.062001 6.835999 5.615231 +v -5.138144 7.018999 6.103395 +v -6.077255 7.018999 5.486835 +v -5.066702 6.952712 6.108302 +v -6.110160 6.952712 5.423234 +v -5.197105 6.806313 6.117391 +v -6.066653 6.806313 5.546502 +v -5.212241 6.403715 6.367886 +v -6.290481 6.403715 5.659984 +v -4.903576 6.272633 6.542159 +v -6.573108 6.272633 5.446052 +v -4.660421 6.316144 6.588770 +v -6.712554 6.316144 5.241475 +v -4.363775 6.496161 6.553911 +v -6.798510 6.496161 4.955421 +v -4.297506 6.660861 6.490880 +v -6.767022 6.660861 4.869555 +v -4.321705 6.798854 6.414018 +v -6.686875 6.798854 4.861199 +v -4.634943 7.016016 6.322525 +v -6.478385 7.016016 5.112239 +v -4.945245 7.054108 6.150743 +v -6.197394 7.054108 5.328666 +v -4.797991 7.052616 6.191803 +v -6.293613 7.052616 5.209874 +v -5.256567 6.503617 6.245864 +v -6.160896 6.503617 5.652142 +v -5.235941 6.631716 6.176543 +v -6.105489 6.631716 5.605655 +v -5.083530 7.002593 5.527423 +v -5.570477 7.002593 5.207726 +v -4.761068 7.488286 5.453239 +v -5.630616 7.488286 4.882351 +v -4.401608 7.513497 5.588050 +v -5.897230 7.513497 4.606122 +v -4.113289 7.152920 5.869129 +v -6.269768 7.152920 4.453323 +v -3.668771 6.835855 6.139729 +v -6.694797 6.835855 4.153039 +v -3.400318 6.686474 6.299438 +v -6.948073 6.686474 3.970215 +v -3.510374 6.010324 6.353351 +v -6.953784 6.010324 4.092630 +v -4.057243 5.675507 6.352364 +v -6.735450 5.675507 4.594027 +v -4.557929 5.525177 6.318940 +v -6.505715 5.525177 5.040150 +v -4.611090 7.621664 4.277133 +v -4.079309 7.357864 3.467152 +v -4.136088 3.842507 3.553635 +v -5.425516 4.308836 5.517622 +v -6.135479 3.447392 6.599002 +v -5.865347 3.701555 6.187551 +v -5.672287 4.220864 5.893494 +v -5.562329 4.372684 5.726012 +v -2.875806 5.769300 5.765878 +v -6.667035 5.769300 3.276803 +v -2.668110 5.841957 5.487432 +v -6.494121 5.841955 2.975523 +v -2.395257 5.219071 4.654861 +v -5.838667 5.219072 2.394144 +v -2.629938 5.285216 3.496046 +v -4.682071 5.285216 2.148749 +v -3.352273 5.130295 5.923005 +v -6.621773 5.130295 3.776464 +v -3.418318 4.650425 5.341279 +v -6.061743 4.650425 3.605778 +v -2.891031 4.588471 4.765584 +v -5.743148 4.588471 2.893070 +v -3.224529 4.438002 3.795187 +v -4.720151 4.438000 2.813258 +v -5.108969 4.842113 6.172678 +v -6.152426 4.842113 5.487613 +v -5.083328 4.507698 5.868279 +v -5.883312 4.507698 5.343060 +v -5.206927 3.970631 6.587232 +v -6.493857 3.970631 5.742314 +v -5.157289 4.474626 6.322091 +v -6.270309 4.474626 5.591352 +v -5.281264 3.514627 6.889993 +v -6.742105 3.514627 5.930900 +v -5.549854 3.841040 6.389330 +v -6.175928 3.841040 5.978292 +v -5.422525 4.343544 6.119576 +v -5.979035 4.343544 5.754209 +v -5.718415 3.490906 6.759796 +v -6.448835 3.490906 6.280250 +v -5.125002 5.036500 6.121285 +v -6.098896 5.036500 5.481892 +v -5.154593 5.214077 6.128450 +v -6.093705 5.214077 5.511890 +v -5.174140 5.381762 6.120317 +v -6.078470 5.381762 5.526595 +v -4.876951 4.443850 5.705562 +v -5.816062 4.443850 5.089002 +v -4.078953 4.082584 4.907066 +v -5.400666 4.082584 4.039317 +v -3.509037 4.120533 4.266441 +v -5.039442 4.120533 3.261679 +v -2.760405 6.697433 3.656857 +v -4.777756 6.697433 2.332397 +v -3.118693 7.239660 4.202586 +v -5.136045 7.239660 2.878124 +v -3.564696 7.442595 4.881914 +v -5.582047 7.442595 3.557451 +v -4.026491 6.921391 5.623201 +v -6.078624 6.921391 4.275906 +v -3.396142 6.528143 5.951919 +v -6.630861 6.528143 3.828212 +v -3.501944 6.568674 5.658187 +v -6.319280 6.568674 3.808510 +v -3.019503 6.867294 4.961267 +v -5.871620 6.867294 3.088752 +v -2.859833 6.626957 5.476200 +v -6.407588 6.626957 3.146975 +v -2.510470 6.448290 4.944067 +v -6.058225 6.448290 2.614844 +v -2.665528 6.660432 4.422111 +v -5.517645 6.660432 2.549596 +v -2.393018 6.179070 4.007038 +v -5.245135 6.179070 2.134521 +v -2.253434 5.958527 4.552566 +v -5.801189 5.958525 2.223341 +v -2.508804 5.177454 4.069674 +v -5.256575 5.177453 2.265666 +v -3.066475 4.513237 4.274675 +v -5.222954 4.513235 2.858873 +v -2.548766 5.662344 5.116118 +v -6.200867 5.662342 2.718388 +v -4.270022 4.936454 5.728788 +v -6.078682 4.936454 4.541339 +v -3.772146 4.426353 5.084168 +v -5.685151 4.426353 3.828215 +v -2.297764 5.805758 5.074966 +v -6.262902 5.805758 2.471714 +v -3.079404 4.663304 5.696918 +v -6.522814 4.663304 3.436202 +v -2.199828 4.497518 5.646026 +v -6.825823 4.497516 2.608899 +v -1.421525 4.734870 5.635664 +v -7.125759 4.734870 1.890636 +v -1.090396 5.366962 5.472466 +v -7.107668 5.366962 1.521919 +v -1.220917 5.806160 5.102667 +v -6.716460 5.806160 1.494653 +v -1.852805 5.871500 5.041644 +v -6.409235 5.871500 2.050188 +v -1.943774 5.754787 5.142295 +v -6.465423 5.754788 2.173676 +v -1.414315 5.681046 5.169803 +v -6.701166 5.681044 1.698799 +v -1.323508 5.313554 5.410554 +v -6.958178 5.313554 1.711198 +v -1.591881 4.819458 5.553979 +v -6.983078 4.819457 2.014472 +v -2.203902 4.673604 5.614324 +v -6.795115 4.673602 2.600032 +v -2.898746 4.818110 5.687098 +v -6.585629 4.818110 3.266530 +v -2.280873 5.715752 5.200867 +v -6.385139 5.715750 2.506273 +v -2.176326 5.498590 5.155345 +v -6.384938 5.498589 2.392246 +v -2.643989 4.828950 5.564413 +v -6.574346 4.828950 2.983994 +v -2.079009 4.685936 5.461998 +v -6.705003 4.685936 2.424873 +v -1.582975 4.806580 5.426693 +v -6.869826 4.806578 1.955693 +v -1.370009 5.172576 5.329759 +v -6.865552 5.172576 1.721742 +v -1.443147 5.438672 5.137903 +v -6.660434 5.438671 1.712572 +v -1.884871 5.501029 5.090486 +v -6.441302 5.501028 2.099030 +v -2.513704 5.560946 5.176435 +v -6.270151 5.560946 2.710196 +v -2.532213 5.207283 5.166719 +v -6.253878 5.207282 2.723318 +v -2.760432 5.024283 5.135263 +v -6.134278 5.024283 2.920218 +v -2.626736 5.005983 5.234879 +v -6.278837 5.005983 2.837147 +v -2.623442 4.841284 5.343582 +v -6.379889 4.841284 2.877342 +v -2.714729 4.768085 5.330998 +v -6.332048 4.768085 2.956103 +v -3.156296 5.061974 5.586596 +v -6.391015 5.061974 3.462892 +v -3.059416 4.878428 5.401126 +v -6.259352 4.878428 3.300256 +v -2.995881 5.005036 5.304355 +v -6.195817 5.005036 3.203485 +v -2.677791 5.359647 5.198924 +v -6.225546 5.359647 2.869699 +v -2.371641 5.381877 5.187491 +v -6.336779 5.381877 2.584239 +v -2.306768 5.294309 5.088682 +v -6.271906 5.294307 2.485430 +v -2.654469 4.708713 5.239213 +v -6.271788 4.708711 2.864318 +v -2.545790 4.781910 5.263215 +v -6.337019 4.781910 2.774138 +v -2.554515 4.928309 5.162784 +v -6.241398 4.928309 2.742216 +v -2.682781 4.964911 5.054895 +v -6.091409 4.964909 2.817014 +v -2.454561 5.147910 5.086351 +v -6.211008 5.147908 2.620114 +v -1.790647 5.395158 5.022780 +v -6.416642 5.395158 1.985655 +v -1.358966 5.342698 5.085495 +v -6.645817 5.342697 1.614495 +v -1.263007 5.094903 5.280499 +v -6.862895 5.094902 1.603976 +v -1.486016 4.738801 5.392733 +v -6.877213 4.738800 1.853224 +v -1.991314 4.616666 5.366333 +v -6.652091 4.616666 2.306372 +v -2.568254 4.777980 5.449058 +v -6.498610 4.777980 2.868639 +v -2.099493 5.392719 5.076226 +v -6.342887 5.392720 2.290290 +v -2.383620 4.991613 5.205739 +v -6.348759 4.991613 2.602488 +v -2.301817 4.871920 5.308580 +v -6.475647 4.871918 2.568316 +v -2.079068 4.978734 5.272554 +v -6.531153 4.978734 2.349607 +v -2.153523 5.108325 5.196427 +v -6.431699 5.108325 2.387655 +v -1.958209 5.225039 5.164281 +v -6.479857 5.225038 2.195662 +v -1.893796 5.105342 5.255708 +v -6.589355 5.105342 2.172909 +v -1.745723 5.150346 5.295516 +v -6.684755 5.150346 2.052871 +v -1.754448 5.296746 5.195086 +v -6.589135 5.296746 2.020947 +v -1.659005 5.562295 4.746458 +v -6.215436 5.562295 1.755002 +v -1.052596 5.556329 4.922102 +v -6.617702 5.556329 1.268417 +v -0.971473 5.213108 5.367144 +v -7.058309 5.213106 1.370924 +v -1.221396 4.606226 5.482467 +v -7.064759 4.606226 1.646096 +v -1.978055 4.326306 5.308230 +v -6.604050 4.326306 2.271105 +v -2.772632 4.442616 5.305472 +v -6.285605 4.442616 2.999084 +v -2.192796 5.562840 4.763459 +v -6.018806 5.562840 2.251549 +vn 0.1562 0.1656 0.9737 +vn -0.9556 0.1656 0.2438 +vn 0.3877 -0.0440 0.9207 +vn -0.9990 -0.0440 0.0103 +vn -0.0745 -0.4862 0.8707 +vn -0.7693 -0.4862 0.4145 +vn -0.2094 -0.0757 0.9749 +vn -0.8112 -0.0757 0.5798 +vn -0.6113 -0.0757 0.7878 +vn -0.4798 -0.0757 0.8741 +vn -0.6712 -0.5172 0.5311 +vn -0.2204 -0.5172 0.8270 +vn -0.9934 -0.0371 0.1088 +vn 0.2951 -0.0371 0.9548 +vn -0.8586 0.2392 0.4534 +vn -0.0746 0.2392 0.9681 +vn -0.7630 0.5759 0.2935 +vn 0.0340 0.5759 0.8168 +vn -0.8227 0.5497 -0.1449 +vn 0.4600 0.5497 0.6973 +vn -0.2474 0.9654 -0.0822 +vn 0.1738 0.9654 0.1943 +vn -0.3248 0.8894 0.3217 +vn -0.1661 0.8894 0.4259 +vn 0.0800 0.8337 0.5464 +vn -0.5331 0.8337 0.1438 +vn 0.3099 0.9079 0.2824 +vn -0.3823 0.9079 -0.1721 +vn 0.5387 0.4867 0.6877 +vn -0.8452 0.4867 -0.2208 +vn 0.2677 0.5132 0.8154 +vn -0.8547 0.5132 0.0785 +vn 0.9977 0.0539 -0.0417 +vn -0.3584 0.0539 -0.9320 +vn 0.6432 0.4681 -0.6059 +vn 0.3002 0.4681 -0.8311 +vn 0.0732 0.4675 -0.8809 +vn 0.7792 0.4675 -0.4174 +vn -0.3798 0.0621 -0.9230 +vn 0.9979 0.0621 -0.0184 +vn -0.5468 -0.5279 -0.6498 +vn 0.8137 -0.5279 0.2434 +vn -0.3344 -0.9058 -0.2601 +vn 0.3717 -0.9058 0.2034 +vn 0.2148 -0.9755 0.0467 +vn -0.1282 -0.9755 -0.1785 +vn 0.8120 -0.5406 0.2199 +vn -0.5246 -0.5406 -0.6577 +vn -0.1233 0.3801 0.9167 +vn -0.7921 0.3801 0.4776 +vn -0.2408 0.2907 0.9260 +vn -0.7540 0.2907 0.5891 +vn -0.4413 0.3040 0.8443 +vn -0.5993 0.3040 0.7406 +vn -0.5411 0.4496 0.7106 +vn -0.4369 0.4496 0.7791 +vn -0.5270 0.4974 0.6891 +vn -0.4227 0.4974 0.7575 +vn -0.3447 0.6182 0.7064 +vn -0.5111 0.6182 0.5971 +vn -0.1560 0.5920 0.7907 +vn -0.6635 0.5920 0.4575 +vn -0.0921 0.4854 0.8695 +vn -0.7612 0.4853 0.4302 +vn -0.3597 -0.5237 0.7722 +vn -0.5655 -0.5237 0.6371 +vn -0.2609 -0.5456 0.7964 +vn -0.6270 -0.5456 0.5560 +vn 0.0527 -0.0831 0.9951 +vn -0.9341 -0.0831 0.3473 +vn 0.3218 0.2587 0.9108 +vn -0.9637 0.2587 0.0668 +vn 0.3760 0.3739 0.8478 +vn -0.9274 0.3739 -0.0080 +vn -0.1715 -0.4948 0.8519 +vn -0.7135 -0.4948 0.4961 +vn -0.1604 -0.2779 0.9471 +vn -0.8053 -0.2779 0.5237 +vn 0.1818 -0.0879 0.9794 +vn -0.9709 -0.0879 0.2226 +vn 0.1378 -0.0064 0.9904 +vn -0.9636 -0.0064 0.2674 +vn 0.1911 0.6833 0.7047 +vn -0.7226 0.6833 0.1048 +vn 0.3166 0.8401 0.4405 +vn -0.5301 0.8401 -0.1154 +vn 0.3538 0.7406 0.5712 +vn -0.6648 0.7406 -0.0975 +vn -0.2259 0.9377 0.2638 +vn -0.1523 0.9377 0.3122 +vn -0.8175 0.5710 -0.0751 +vn 0.3940 0.5710 0.7202 +vn -0.6305 0.7682 -0.1112 +vn 0.3527 0.7682 0.5343 +vn -0.0151 0.0121 0.9998 +vn -0.9114 0.0121 0.4114 +vn -0.3508 -0.0057 0.9364 +vn -0.7198 -0.0057 0.6942 +vn -0.6122 -0.0671 0.7878 +vn -0.4795 -0.0671 0.8750 +vn -0.6021 -0.2221 0.7669 +vn -0.4643 -0.2221 0.8574 +vn -0.5069 -0.1072 0.8553 +vn -0.5833 -0.1072 0.8052 +vn -0.2750 0.2581 0.9262 +vn -0.7405 0.2581 0.6205 +vn -0.1664 0.2707 0.9482 +vn -0.8039 0.2707 0.5296 +vn -0.2275 0.1735 0.9582 +vn -0.7888 0.1735 0.5897 +vn -0.1161 0.4928 0.8624 +vn -0.7451 0.4928 0.4494 +vn -0.5036 0.6894 0.5206 +vn -0.2775 0.6894 0.6691 +vn -0.1728 0.0053 0.9849 +vn -0.8350 0.0053 0.5502 +vn -0.3686 0.2347 0.8995 +vn -0.6788 0.2347 0.6958 +vn -0.5161 0.2951 0.8041 +vn -0.5326 0.2951 0.7932 +vn -0.4662 -0.2733 0.8414 +vn -0.5867 -0.2733 0.7623 +vn -0.3792 -0.1236 0.9170 +vn -0.6907 -0.1236 0.7125 +vn -0.2458 0.1943 0.9496 +vn -0.7736 0.1943 0.6031 +vn -0.2102 0.4293 0.8783 +vn -0.7223 0.4293 0.5421 +vn -0.2130 0.3304 0.9195 +vn -0.7590 0.3304 0.5611 +vn -0.4784 0.5254 0.7037 +vn -0.4555 0.5254 0.7187 +vn -0.5010 0.4169 0.7584 +vn -0.4989 0.4169 0.7598 +vn -0.4967 0.4169 0.7613 +vn -0.4828 0.4757 0.7353 +vn 0.5547 -0.5263 0.6445 +vn -0.8119 -0.5263 -0.2527 +vn 0.9571 0.1001 0.2721 +vn -0.6302 0.1001 -0.7700 +vn 0.5049 0.6019 -0.6187 +vn 0.3670 0.6019 -0.7093 +vn -0.7930 0.4576 -0.4023 +vn 0.6844 0.4576 0.5677 +vn 0.0150 -0.6683 0.7438 +vn -0.6884 -0.6683 0.2820 +vn -0.2797 -0.1410 0.9497 +vn -0.7602 -0.1410 0.6343 +vn -0.6109 0.7473 -0.2616 +vn 0.4829 0.7473 0.4565 +vn 0.0019 0.9820 0.1889 +vn -0.1740 0.9820 0.0733 +vn 0.4284 0.5339 0.7290 +vn -0.8392 0.5339 -0.1032 +vn -0.1427 -0.3497 0.9259 +vn -0.7929 -0.3497 0.4990 +vn -0.3701 0.6657 0.6480 +vn -0.4474 0.6658 0.5972 +vn -0.5187 0.0819 0.8510 +vn -0.5747 0.0819 0.8143 +vn -0.8394 0.2773 0.4674 +vn -0.0951 0.2774 0.9560 +vn -0.7177 0.0313 0.6956 +vn -0.3529 0.0313 0.9351 +vn -0.1013 0.3106 0.9451 +vn -0.8270 0.3106 0.4687 +vn -0.1953 0.4971 0.8454 +vn -0.6981 0.4971 0.5153 +vn 0.5164 0.5024 0.6934 +vn -0.8416 0.5024 -0.1982 +vn 0.6013 0.4212 0.6790 +vn -0.8621 0.4212 -0.2818 +vn 0.6786 0.2864 0.6764 +vn -0.8904 0.2864 -0.3537 +vn -0.3326 -0.2314 0.9142 +vn -0.7066 -0.2314 0.6687 +vn -0.6477 0.2847 0.7067 +vn -0.3909 0.2847 0.8753 +vn -0.7169 0.3648 0.5941 +vn -0.2600 0.3648 0.8940 +vn -0.5018 0.6359 0.5864 +vn -0.3386 0.6359 0.6935 +vn -0.0154 0.9642 -0.2649 +vn 0.2492 0.9642 -0.0912 +vn -0.4589 0.6861 -0.5645 +vn 0.7004 0.6861 0.1966 +vn -0.8359 -0.0000 -0.5488 +vn 0.8359 -0.0000 0.5488 +vn -0.0486 -0.7750 0.6301 +vn -0.5588 -0.7750 0.2951 +vn -0.5135 0.1916 0.8364 +vn -0.5633 0.1916 0.8037 +vn -0.4256 0.1353 0.8947 +vn -0.6518 0.1353 0.7462 +vn -0.8908 0.1457 0.4303 +vn -0.0406 0.1457 0.9885 +vn -0.7774 0.4018 0.4839 +vn -0.1349 0.4018 0.9057 +vn -0.6362 0.4978 0.5895 +vn -0.2880 0.4978 0.8181 +vn -0.9249 -0.1019 0.3664 +vn 0.0316 -0.1019 0.9943 +vn -0.6217 -0.3563 0.6975 +vn -0.3928 -0.3563 0.8478 +vn -0.1457 -0.2099 0.9668 +vn -0.8292 -0.2099 0.5181 +vn 0.0307 -0.0270 0.9992 +vn -0.9290 -0.0270 0.3691 +vn 0.0532 0.3041 0.9512 +vn -0.8939 0.3041 0.3293 +vn 0.1151 0.4905 0.8638 +vn -0.8384 0.4905 0.2378 +vn 0.2256 0.8140 0.5352 +vn -0.5808 0.8140 0.0058 +vn 0.0165 0.8932 0.4493 +vn -0.4188 0.8932 0.1634 +vn -0.2120 0.7540 0.6217 +vn -0.4861 0.7540 0.4417 +vn -0.4172 0.6800 0.6030 +vn -0.3874 0.6800 0.6225 +vn -0.2446 0.0369 0.9689 +vn -0.7918 0.0369 0.6096 +vn -0.2790 0.2097 0.9371 +vn -0.7489 0.2097 0.6286 +vn -0.7277 -0.2329 0.6452 +vn -0.3027 -0.2329 0.9242 +vn -0.4999 -0.4900 0.7141 +vn -0.4564 -0.4901 0.7426 +vn -0.7962 0.1984 0.5716 +vn -0.2080 0.1984 0.9578 +vn -0.7492 0.4354 0.4992 +vn -0.1601 0.4354 0.8859 +vn -0.4135 0.8228 0.3899 +vn -0.1934 0.8228 0.5344 +vn -0.2478 0.9162 0.3150 +vn -0.1906 0.9162 0.3526 +vn 0.1022 0.8595 0.5008 +vn -0.5001 0.8595 0.1053 +vn 0.2242 0.7924 0.5673 +vn -0.6097 0.7924 0.0198 +vn 0.1484 0.0239 0.9886 +vn -0.9662 0.0239 0.2569 +vn 0.3869 0.2081 0.8983 +vn -0.9781 0.2081 0.0021 +vn 0.3913 0.3922 0.8325 +vn -0.9194 0.3922 -0.0281 +vn -0.1130 0.5964 -0.7947 +vn 0.7741 0.5964 -0.2123 +vn -0.4350 0.1476 -0.8883 +vn 0.9880 0.1476 0.0460 +vn 0.2311 0.5571 -0.7977 +vn 0.6400 0.5571 -0.5292 +vn 0.8364 0.5125 -0.1945 +vn -0.1540 0.5125 -0.8447 +vn 0.6872 0.6220 -0.3752 +vn 0.0711 0.6220 -0.7797 +vn 0.6138 0.6680 -0.4208 +vn 0.1421 0.6680 -0.7305 +vn 0.9916 -0.1195 0.0496 +vn -0.4398 -0.1195 -0.8901 +vn 0.4690 -0.8444 0.2590 +vn -0.4241 -0.8444 -0.3274 +vn 0.3204 -0.9230 0.2133 +vn -0.3231 -0.9230 -0.2091 +vn 0.4202 -0.8817 -0.2146 +vn 0.0298 -0.8817 -0.4709 +vn 0.6567 -0.5116 -0.5541 +vn 0.2473 -0.5116 -0.8228 +vn 0.4054 -0.8192 -0.4057 +vn 0.2110 -0.8192 -0.5333 +vn -0.0935 -0.9312 0.3522 +vn -0.2860 -0.9312 0.2258 +vn -0.0444 -0.9580 0.2833 +vn -0.2423 -0.9580 0.1533 +vn 0.9356 -0.1410 0.3237 +vn -0.6690 -0.1410 -0.7298 +vn 0.9780 -0.0110 0.2083 +vn -0.5800 -0.0110 -0.8146 +vn 0.6176 -0.4510 -0.6444 +vn 0.3457 -0.4510 -0.8228 +vn 0.3986 -0.6557 -0.6413 +vn 0.4300 -0.6557 -0.6207 +vn 0.8378 -0.5373 0.0974 +vn -0.4224 -0.5373 -0.7300 +vn 0.9823 -0.0536 0.1794 +vn -0.5551 -0.0536 -0.8300 +vn 0.9527 0.1826 0.2430 +vn -0.6017 0.1826 -0.7776 +vn 0.9629 0.1862 0.1951 +vn -0.5618 0.1862 -0.8060 +vn 0.9028 0.2647 0.3389 +vn -0.6699 0.2648 -0.6936 +vn 0.1299 -0.9839 0.1230 +vn -0.1645 -0.9839 -0.0703 +vn 0.5722 -0.7964 -0.1959 +vn -0.0477 -0.7964 -0.6029 +vn 0.2684 -0.9504 0.1573 +vn -0.2510 -0.9504 -0.1838 +vn 0.0472 -0.8982 0.4370 +vn -0.4198 -0.8982 0.1304 +vn 0.1063 -0.9059 0.4100 +vn -0.4185 -0.9059 0.0655 +vn 0.7910 -0.2122 0.5738 +vn -0.8410 -0.2122 -0.4977 +vn 0.4407 -0.3292 0.8351 +vn -0.9415 -0.3292 -0.0723 +vn 0.7077 -0.5449 -0.4496 +vn 0.1312 -0.5449 -0.8282 +vn 0.2386 0.9603 -0.1443 +vn 0.0375 0.9603 -0.2763 +vn 0.4503 0.7691 -0.4536 +vn 0.2372 0.7691 -0.5936 +vn 0.7968 0.1787 -0.5773 +vn 0.2129 0.1787 -0.9606 +vn 0.6515 0.7211 -0.2357 +vn -0.0427 0.7211 -0.6915 +vn 0.0066 0.9453 0.3261 +vn -0.3019 0.9453 0.1236 +vn 0.6320 0.7621 0.1407 +vn -0.3804 0.7621 -0.5240 +vn 0.8647 0.5011 -0.0356 +vn -0.3111 0.5011 -0.8075 +vn 0.9567 -0.1643 -0.2402 +vn -0.1600 -0.1643 -0.9733 +vn 0.8904 0.0239 -0.4546 +vn 0.0632 0.0239 -0.9977 +vn 0.8167 0.5724 -0.0736 +vn -0.2572 0.5724 -0.7786 +vn 0.7037 0.6698 0.2368 +vn -0.4970 0.6698 -0.5516 +vn 0.4585 0.6084 0.6478 +vn -0.7767 0.6084 -0.1632 +vn 0.6045 0.7395 -0.2962 +vn 0.0314 0.7395 -0.6724 +vn -0.0402 0.8792 0.4748 +vn -0.4197 0.8792 0.2257 +vn 0.3562 -0.3739 -0.8563 +vn 0.6441 -0.3739 -0.6673 +vn 0.0806 0.9957 -0.0454 +vn 0.0096 0.9957 -0.0920 +vn -0.5549 0.6235 0.5507 +vn -0.2847 0.6235 0.7281 +vn 0.8467 0.1965 0.4945 +vn -0.7903 0.1965 -0.5803 +vn 0.6669 0.2273 0.7096 +vn -0.9163 0.2273 -0.3298 +vn 0.9004 0.1361 0.4132 +vn -0.7371 0.1361 -0.6619 +vn 0.8905 -0.0234 0.4544 +vn -0.7710 -0.0234 -0.6365 +vn 0.3877 -0.5927 0.7060 +vn -0.8019 -0.5927 -0.0750 +vn 0.0289 -0.7728 0.6340 +vn -0.5933 -0.7728 0.2255 +vn 0.0361 -0.6505 0.7586 +vn -0.7105 -0.6505 0.2685 +vn 0.1931 -0.5522 0.8110 +vn -0.8210 -0.5522 0.1452 +vn 0.3299 -0.4457 0.8322 +vn -0.8947 -0.4457 0.0282 +vn -0.3089 0.0101 0.9510 +vn -0.7498 0.0101 0.6616 +vn 0.7529 -0.6448 -0.1322 +vn -0.1781 -0.6448 -0.7434 +vn 0.7404 -0.6365 -0.2160 +vn -0.0962 -0.6365 -0.7652 +vn 0.2479 -0.9472 0.2036 +vn -0.2854 -0.9472 -0.1465 +vn 0.5706 -0.6919 0.4424 +vn -0.6328 -0.6919 -0.3477 +vn 0.6614 -0.7432 -0.1014 +vn -0.1699 -0.7432 -0.6471 +vn -0.0206 0.7419 0.6702 +vn -0.6067 0.7419 0.2854 +vn 0.0050 0.5661 0.8243 +vn -0.7583 0.5661 0.3232 +vn -0.2202 0.5496 0.8059 +vn -0.6519 0.5496 0.5224 +vn -0.2821 0.3889 0.8770 +vn -0.6926 0.3889 0.6075 +vn -0.0541 0.3676 0.9284 +vn -0.8304 0.3676 0.4188 +vn 0.0928 0.0751 0.9929 +vn -0.9479 0.0751 0.3096 +vn 0.2573 0.8663 0.4281 +vn -0.4951 0.8663 -0.0658 +vn -0.2418 0.9632 -0.1176 +vn 0.2040 0.9632 0.1751 +vn -0.8794 0.4447 -0.1699 +vn 0.5055 0.4447 0.7394 +vn -0.9051 0.0538 0.4218 +vn -0.0272 0.0538 0.9982 +vn -0.0996 -0.1714 0.9801 +vn -0.8597 -0.1714 0.4811 +vn 0.1994 -0.1315 0.9711 +vn -0.9703 -0.1315 0.2031 +vn 0.4797 -0.6541 0.5849 +vn -0.7274 -0.6541 -0.2076 +vn -0.5390 0.6981 0.4713 +vn -0.2181 0.6981 0.6819 +vn 0.7577 -0.4258 0.4945 +vn -0.7550 -0.4258 -0.4987 +vn -0.3474 0.6038 0.7175 +vn -0.5203 0.6038 0.6040 +vn 0.1431 0.9876 -0.0648 +vn 0.0026 0.9876 -0.1571 +vn 0.1492 0.2835 0.9473 +vn -0.9285 0.2835 0.2397 +vn 0.1133 0.7822 0.6126 +vn -0.6072 0.7822 0.1396 +vn 0.3778 -0.2617 0.8881 +vn -0.9651 -0.2617 0.0065 +vn 0.0394 -0.0295 0.9988 +vn -0.9321 -0.0295 0.3609 +vn 0.0523 -0.0542 0.9972 +vn -0.9358 -0.0542 0.3485 +vn 0.8022 -0.1868 0.5671 +vn -0.8393 -0.1868 -0.5106 +vn 0.7143 -0.4047 0.5710 +vn -0.8079 -0.4047 -0.4284 +vn 0.8639 -0.0505 0.5012 +vn -0.8033 -0.0504 -0.5934 +vn 0.3476 -0.4840 0.8031 +vn -0.8751 -0.4840 0.0003 +vn 0.4472 -0.4837 0.7524 +vn -0.8681 -0.4837 -0.1112 +vn 0.3472 -0.5620 0.7507 +vn -0.8269 -0.5620 -0.0201 +vn 0.4348 0.8391 -0.3269 +vn 0.1271 0.8391 -0.5289 +vn 0.8060 0.3514 0.4764 +vn -0.7576 0.3514 -0.5501 +vn 0.3330 -0.6302 0.7014 +vn -0.7760 -0.6301 -0.0267 +vn 0.2161 0.9135 -0.3447 +vn 0.2304 0.9135 -0.3354 +vn 0.1751 -0.4615 0.8697 +vn -0.8676 -0.4615 0.1851 +vn -0.1777 -0.6145 0.7687 +vn -0.6347 -0.6145 0.4687 +vn -0.7226 -0.5515 -0.4168 +vn 0.6697 -0.5515 0.4973 +vn -0.3946 -0.0278 -0.9184 +vn 0.9996 -0.0278 -0.0031 +vn -0.1453 0.5695 -0.8091 +vn 0.8001 0.5695 -0.1884 +vn 0.1808 0.9082 -0.3774 +vn 0.2744 0.9082 -0.3160 +vn -0.3510 0.4901 0.7979 +vn -0.5926 0.4901 0.6393 +vn -0.1645 0.5051 0.8472 +vn -0.7120 0.5051 0.4878 +vn -0.1910 0.4720 0.8606 +vn -0.7137 0.4721 0.5174 +vn -0.3254 0.4925 0.8072 +vn -0.6113 0.4925 0.6195 +vn -0.0652 0.6753 0.7346 +vn -0.6481 0.6753 0.3519 +vn -0.1161 0.4053 0.9068 +vn -0.7859 0.4053 0.4671 +vn -0.2663 0.4057 0.8743 +vn -0.6963 0.4057 0.5920 +vn -0.4313 0.4653 0.7730 +vn -0.5378 0.4653 0.7030 +vn -0.4148 0.9094 -0.0309 +vn 0.1933 0.9094 0.3683 +vn 0.1612 0.4002 0.9021 +vn -0.8919 0.4002 0.2107 +vn -0.0993 0.2385 0.9661 +vn -0.8469 0.2385 0.4752 +vn -0.0350 0.2088 0.9773 +vn -0.8829 0.2088 0.4206 +vn 0.1173 0.6153 0.7795 +vn -0.7619 0.6153 0.2023 +vn 0.0346 0.8709 0.4902 +vn -0.4635 0.8709 0.1631 +vn -0.1424 -0.9112 0.3865 +vn -0.2980 -0.9112 0.2843 +vn 0.1886 -0.7577 0.6248 +vn -0.6483 -0.7577 0.0753 +vn 0.5783 -0.0889 0.8109 +vn -0.9740 -0.0889 -0.2082 +vn 0.8614 0.4592 0.2171 +vn -0.5417 0.4592 -0.7041 +vn 0.1726 0.7008 -0.6921 +vn 0.5664 0.7008 -0.4336 +vn -0.0833 0.7162 -0.6929 +vn 0.6689 0.7162 -0.1990 +vn -0.0458 -0.4094 -0.9112 +vn 0.8543 -0.4094 -0.3203 +vn 0.3077 -0.4880 -0.8168 +vn 0.6271 -0.4880 -0.6071 +vn 0.7865 -0.4114 -0.4606 +vn 0.1100 -0.4114 -0.9048 +vn -0.5004 0.5575 -0.6624 +vn 0.8068 0.5575 0.1958 +vn 0.7929 -0.5687 -0.2188 +vn -0.1145 -0.5687 -0.8145 +vn -0.3056 -0.9520 0.0147 +vn 0.1080 -0.9520 0.2862 +vt 0.121833 0.958901 +vt 0.118411 0.964462 +vt 0.108468 0.960458 +vt 0.114890 0.949624 +vt 0.057213 0.947581 +vt 0.062891 0.955867 +vt 0.057703 0.961221 +vt 0.047094 0.957637 +vt 0.098027 0.955968 +vt 0.106446 0.942429 +vt 0.050262 0.942429 +vt 0.037721 0.955169 +vt 0.108414 0.975412 +vt 0.098027 0.975453 +vt 0.807621 0.960667 +vt 0.816393 0.963199 +vt 0.816239 0.976908 +vt 0.807621 0.978414 +vt 0.118465 0.972890 +vt 0.071442 0.947882 +vt 0.070858 0.956450 +vt 0.121833 0.978387 +vt 0.114523 0.985619 +vt 0.907462 0.619505 +vt 0.916739 0.619552 +vt 0.917899 0.627007 +vt 0.910030 0.633750 +vt 0.105874 0.989043 +vt 0.897274 0.619907 +vt 0.900753 0.638423 +vt 0.138978 0.947074 +vt 0.130329 0.957832 +vt 0.121833 0.956030 +vt 0.132351 0.942429 +vt 0.900505 0.603674 +vt 0.909533 0.606703 +vt 0.144815 0.955198 +vt 0.140387 0.960912 +vt 0.917899 0.612929 +vt 0.140455 0.969250 +vt 0.131089 0.972501 +vt 0.172315 0.959341 +vt 0.166006 0.958422 +vt 0.166260 0.950547 +vt 0.172900 0.945255 +vt 0.122178 0.975217 +vt 0.181666 0.960795 +vt 0.181666 0.942429 +vt 0.139565 0.982541 +vt 0.133422 0.988075 +vt 0.181364 0.977649 +vt 0.172068 0.972369 +vt 0.144815 0.974399 +vt 0.057558 0.983075 +vt 0.063402 0.975349 +vt 0.070800 0.975644 +vt 0.071442 0.983365 +vt 0.876360 0.629171 +vt 0.877995 0.621868 +vt 0.886410 0.622091 +vt 0.883326 0.635325 +vt 0.047442 0.972346 +vt 0.057492 0.969553 +vt 0.897274 0.621950 +vt 0.893342 0.639064 +vt 0.037664 0.974363 +vt 0.051018 0.988134 +vt 0.886156 0.607995 +vt 0.896466 0.603674 +vt 0.877699 0.614004 +vt 0.876770 0.622050 +vt 0.876360 0.613641 +vt 0.416977 0.915262 +vt 0.418706 0.915435 +vt 0.420224 0.922339 +vt 0.418695 0.922575 +vt 0.530487 0.805174 +vt 0.527222 0.811308 +vt 0.524668 0.811049 +vt 0.528957 0.804454 +vt 0.418012 0.906006 +vt 0.420224 0.907310 +vt 0.526835 0.819103 +vt 0.524576 0.819775 +vt 0.164068 0.958343 +vt 0.166165 0.965190 +vt 0.164118 0.966107 +vt 0.530487 0.824842 +vt 0.528524 0.826445 +vt 0.164430 0.949470 +vt 0.680476 0.902450 +vt 0.681746 0.895485 +vt 0.684025 0.895711 +vt 0.682656 0.903678 +vt 0.634588 0.969362 +vt 0.632687 0.969724 +vt 0.629692 0.962659 +vt 0.631545 0.961310 +vt 0.680476 0.888273 +vt 0.682854 0.887496 +vt 0.631641 0.977382 +vt 0.629692 0.976757 +vt 0.680475 0.886695 +vt 0.683161 0.879964 +vt 0.684738 0.879883 +vt 0.682359 0.887496 +vt 0.684754 0.761030 +vt 0.683184 0.761292 +vt 0.682660 0.753720 +vt 0.684754 0.752350 +vt 0.680475 0.872760 +vt 0.681634 0.872120 +vt 0.684641 0.768713 +vt 0.683083 0.768461 +vt 0.834694 0.972673 +vt 0.825577 0.968034 +vt 0.828935 0.961895 +vt 0.661845 0.959024 +vt 0.667138 0.952882 +vt 0.673463 0.963420 +vt 0.826604 0.977483 +vt 0.676277 0.952882 +vt 0.755527 0.971309 +vt 0.751095 0.961230 +vt 0.757917 0.960667 +vt 0.682090 0.959186 +vt 0.745812 0.967318 +vt 0.682319 0.967791 +vt 0.746172 0.976574 +vt 0.676556 0.974320 +vt 0.750854 0.982682 +vt 0.668337 0.974596 +vt 0.757917 0.982379 +vt 0.661604 0.968016 +vt 0.834694 0.960667 +vt 0.009734 0.960539 +vt 0.016884 0.964236 +vt 0.013433 0.977878 +vt 0.006998 0.976058 +vt 0.010938 0.990300 +vt 0.003221 0.989085 +vt 0.011893 0.947037 +vt 0.019135 0.958360 +vt 0.010640 0.995594 +vt 0.000000 0.999165 +vt 0.016519 0.943234 +vt 0.027559 0.955405 +vt 0.951822 0.774834 +vt 0.949458 0.782274 +vt 0.936598 0.775178 +vt 0.940077 0.771157 +vt 0.030941 0.942429 +vt 0.036099 0.955419 +vt 0.950153 0.792774 +vt 0.936932 0.792475 +vt 0.882310 0.967036 +vt 0.886912 0.952851 +vt 0.902783 0.965720 +vt 0.899505 0.978266 +vt 0.950835 0.816203 +vt 0.936598 0.816102 +vt 0.425257 0.995532 +vt 0.420730 0.974616 +vt 0.436545 0.974729 +vt 0.449671 1.000000 +vt 0.391449 0.702840 +vt 0.383645 0.711302 +vt 0.367393 0.703256 +vt 0.376400 0.684987 +vt 0.422499 0.954697 +vt 0.433753 0.952496 +vt 0.652606 0.782340 +vt 0.652614 0.793986 +vt 0.638836 0.797917 +vt 0.639020 0.782340 +vt 0.420730 0.930121 +vt 0.437030 0.937050 +vt 0.326357 0.929401 +vt 0.320102 0.943170 +vt 0.307687 0.920465 +vt 0.315767 0.917175 +vt 0.444780 0.916413 +vt 0.449079 0.928648 +vt 0.340751 0.931320 +vt 0.343159 0.944177 +vt 0.495765 0.818613 +vt 0.482710 0.817709 +vt 0.483753 0.807040 +vt 0.491093 0.811998 +vt 0.345048 0.924684 +vt 0.351292 0.932219 +vt 0.460697 0.815916 +vt 0.458693 0.805058 +vt 0.362214 0.904503 +vt 0.366392 0.914536 +vt 0.439214 0.816409 +vt 0.444273 0.804454 +vt 0.373175 0.894735 +vt 0.383908 0.901895 +vt 0.979078 0.152550 +vt 0.985432 0.164289 +vt 0.973055 0.167288 +vt 0.968672 0.159643 +vt 0.373615 0.885100 +vt 0.384224 0.887374 +vt 0.978383 0.185517 +vt 0.968672 0.186244 +vt 0.853936 0.615154 +vt 0.863521 0.616907 +vt 0.864796 0.638269 +vt 0.854641 0.634236 +vt 0.978804 0.193549 +vt 0.971130 0.197825 +vt 0.856020 0.603674 +vt 0.864027 0.608857 +vt 0.470666 0.973719 +vt 0.470487 0.964352 +vt 0.485534 0.962269 +vt 0.477887 0.978566 +vt 0.360037 0.890185 +vt 0.357175 0.881815 +vt 0.359599 0.874147 +vt 0.468212 0.957683 +vt 0.483418 0.952430 +vt 0.358966 0.897101 +vt 0.462664 0.951169 +vt 0.473635 0.946352 +vt 0.989277 0.586949 +vt 0.988489 0.601573 +vt 0.978783 0.608320 +vt 0.977596 0.598652 +vt 0.452317 0.939859 +vt 0.457274 0.931837 +vt 0.989277 0.627621 +vt 0.979793 0.624691 +vt 0.446665 0.940096 +vt 0.985035 0.634669 +vt 0.977699 0.632068 +vt 0.441726 0.946184 +vt 0.327106 0.919149 +vt 0.336344 0.922336 +vt 0.440012 0.962448 +vt 0.319130 0.905517 +vt 0.442331 0.974076 +vt 0.311745 0.896238 +vt 0.317600 0.894168 +vt 0.337935 0.848784 +vt 0.318492 0.848285 +vt 0.330644 0.834097 +vt 0.335387 0.835683 +vt 0.312563 0.867780 +vt 0.328300 0.880463 +vt 0.341078 0.852332 +vt 0.329095 0.864463 +vt 0.333297 0.877919 +vt 0.474297 0.989885 +vt 0.465580 0.981599 +vt 0.355288 0.865846 +vt 0.348540 0.877142 +vt 0.463448 0.995663 +vt 0.460358 0.985071 +vt 0.343269 0.865707 +vt 0.340167 0.876406 +vt 0.346466 0.855692 +vt 0.021967 0.973978 +vt 0.019847 0.978770 +vt 0.019702 0.983907 +vt 0.026887 0.969398 +vt 0.022639 0.988015 +vt 0.035568 0.968791 +vt 0.963444 0.783390 +vt 0.963521 0.793737 +vt 0.984219 0.824440 +vt 0.975403 0.821516 +vt 0.981035 0.800932 +vt 0.989720 0.802536 +vt 0.962488 0.796356 +vt 0.963038 0.818466 +vt 0.037664 0.967588 +vt 0.973606 0.835592 +vt 0.967325 0.830450 +vt 0.969220 0.819991 +vt 0.960005 0.832237 +vt 0.971657 0.799337 +vt 0.972799 0.791716 +vt 0.980832 0.798008 +vt 0.692402 0.964641 +vt 0.695688 0.965480 +vt 0.691564 0.969435 +vt 0.687891 0.969266 +vt 0.847706 0.970485 +vt 0.848632 0.976103 +vt 0.844383 0.975310 +vt 0.844415 0.968746 +vt 0.618156 0.969356 +vt 0.614829 0.969494 +vt 0.614039 0.961310 +vt 0.618040 0.962392 +vt 0.625773 0.975691 +vt 0.623945 0.969694 +vt 0.627835 0.969765 +vt 0.629692 0.975076 +vt 0.684385 0.936523 +vt 0.680475 0.933757 +vt 0.680595 0.928191 +vt 0.684385 0.928377 +vt 0.625139 0.963734 +vt 0.629692 0.961310 +vt 0.678025 0.796329 +vt 0.678309 0.794399 +vt 0.684737 0.792775 +vt 0.682948 0.797363 +vt 0.649297 0.969839 +vt 0.649151 0.962997 +vt 0.653313 0.963309 +vt 0.653731 0.967336 +vt 0.684987 0.977305 +vt 0.688144 0.978320 +vt 0.844383 0.960667 +vt 0.847742 0.961400 +vt 0.694463 0.970803 +vt 0.691613 0.978207 +vt 0.693395 0.983488 +vt 0.690282 0.984657 +vt 0.676649 0.792847 +vt 0.682532 0.790504 +vt 0.646479 0.968021 +vt 0.646479 0.961310 +vt 0.613364 0.973941 +vt 0.610778 0.971408 +vt 0.611758 0.968258 +vt 0.601283 0.967984 +vt 0.601093 0.964041 +vt 0.603793 0.963851 +vt 0.604410 0.969656 +vt 0.610778 0.962174 +vt 0.595157 0.970657 +vt 0.596432 0.973609 +vt 0.697683 0.968365 +vt 0.849286 0.971099 +vt 0.851237 0.974766 +vt 0.676649 0.783880 +vt 0.682730 0.786690 +vt 0.595157 0.961310 +vt 0.698325 0.976607 +vt 0.696187 0.986124 +vt 0.312527 0.860405 +vt 0.314249 0.852344 +vt 0.735557 0.977000 +vt 0.727710 0.978500 +vt 0.724260 0.970691 +vt 0.729879 0.960667 +vt 0.307894 0.848769 +vt 0.307687 0.847150 +vt 0.724260 0.988423 +vt 0.726328 0.984368 +vt 0.684987 0.961310 +vt 0.689049 0.960667 +vt 0.951543 0.828592 +vt 0.956422 0.836951 +vt 0.951845 0.835133 +vt 0.979982 0.835608 +vt 0.871749 0.961053 +vt 0.877636 0.946558 +vt 0.938587 0.828388 +vt 0.867056 0.957694 +vt 0.872760 0.943269 +vt 0.939611 0.834388 +vt 0.862511 0.953431 +vt 0.868447 0.929229 +vt 0.957470 0.847508 +vt 0.941592 0.840475 +vt 0.030656 0.978352 +vt 0.029169 0.977861 +vt 0.033321 0.970150 +vt 0.031604 0.986167 +vt 0.029923 0.985044 +vt 0.800507 0.967849 +vt 0.807184 0.963270 +vt 0.802702 0.968392 +vt 0.024041 0.985862 +vt 0.800807 0.974560 +vt 0.802917 0.974760 +vt 0.020463 0.982057 +vt 0.803740 0.979213 +vt 0.804760 0.978252 +vt 0.807621 0.980782 +vt 0.807079 0.982590 +vt 0.653731 0.971405 +vt 0.655213 0.967532 +vt 0.659056 0.967607 +vt 0.657574 0.971479 +vt 0.610476 0.964601 +vt 0.605289 0.964601 +vt 0.605068 0.961310 +vt 0.610255 0.961310 +vt 0.653731 0.961310 +vt 0.659025 0.962028 +vt 0.610778 0.970130 +vt 0.604411 0.970950 +vt 0.236837 0.963742 +vt 0.241899 0.963702 +vt 0.240963 0.969144 +vt 0.236837 0.970152 +vt 0.610253 0.974752 +vt 0.604955 0.976467 +vt 0.024688 0.975459 +vt 0.028840 0.967748 +vt 0.231518 0.963702 +vt 0.236837 0.965185 +vt 0.236837 0.973376 +vt 0.231518 0.971893 +vt 0.822932 0.968882 +vt 0.816393 0.970473 +vt 0.817090 0.966587 +vt 0.825577 0.960667 +vt 0.817090 0.974228 +vt 0.825577 0.975950 +vt 0.684778 0.768713 +vt 0.684778 0.778881 +vt 0.682660 0.773689 +vt 0.820433 0.977410 +vt 0.342863 0.849760 +vt 0.347936 0.851762 +vt 0.679899 0.697745 +vt 0.676649 0.697607 +vt 0.677664 0.691215 +vt 0.681442 0.692849 +vt 0.354469 0.857647 +vt 0.354984 0.852559 +vt 0.680435 0.684987 +vt 0.683957 0.688743 +vt 0.364957 0.856228 +vt 0.362589 0.851528 +vt 0.346461 0.880583 +vt 0.352584 0.884426 +vt 0.339624 0.845529 +vt 0.681038 0.702941 +vt 0.676649 0.703129 +vt 0.452249 0.984562 +vt 0.447516 0.972324 +vt 0.455497 0.982337 +vt 0.683957 0.716355 +vt 0.679825 0.719944 +vt 0.445706 0.962346 +vt 0.322645 0.902952 +vt 0.321478 0.893304 +vt 0.445337 0.949814 +vt 0.328712 0.914268 +vt 0.450264 0.945103 +vt 0.336715 0.916222 +vt 0.681137 0.719944 +vt 0.683023 0.727560 +vt 0.680002 0.729437 +vt 0.678186 0.723956 +vt 0.342714 0.915178 +vt 0.344038 0.920013 +vt 0.682511 0.743247 +vt 0.676650 0.743134 +vt 0.349688 0.901638 +vt 0.353270 0.905343 +vt 0.683023 0.752350 +vt 0.679974 0.749531 +vt 0.354567 0.896183 +vt 0.374530 0.845926 +vt 0.371895 0.851194 +vt 0.368237 0.847840 +vt 0.370502 0.843790 +vt 0.355267 0.890485 +vt 0.231118 0.965354 +vt 0.229263 0.972221 +vt 0.226631 0.970310 +vt 0.229227 0.965339 +vt 0.350799 0.886997 +vt 0.353071 0.891014 +vt 0.230237 0.959641 +vt 0.228370 0.960262 +vt 0.352556 0.896103 +vt 0.229373 0.954068 +vt 0.227268 0.954434 +vt 0.676649 0.753945 +vt 0.677802 0.752350 +vt 0.682436 0.759390 +vt 0.680161 0.759911 +vt 0.220704 0.942429 +vt 0.218800 0.945149 +vt 0.682660 0.773104 +vt 0.679579 0.772402 +vt 0.417326 0.896374 +vt 0.413738 0.900596 +vt 0.411392 0.898021 +vt 0.414697 0.894440 +vt 0.681695 0.778557 +vt 0.678811 0.777385 +vt 0.419822 0.888347 +vt 0.416688 0.888362 +vt 0.678381 0.783880 +vt 0.676649 0.781114 +vt 0.417710 0.876751 +vt 0.415344 0.877361 +vt 0.330874 0.912454 +vt 0.324484 0.902698 +vt 0.412929 0.869589 +vt 0.411392 0.871461 +vt 0.323633 0.894409 +vt 0.524576 0.838899 +vt 0.527685 0.826446 +vt 0.529535 0.827853 +vt 0.527026 0.838751 +vt 0.328877 0.880863 +vt 0.330023 0.883388 +vt 0.526044 0.844311 +vt 0.528493 0.844164 +vt 0.333970 0.879003 +vt 0.335116 0.881528 +vt 0.225012 0.977432 +vt 0.223273 0.975623 +vt 0.346234 0.882826 +vt 0.220693 0.980734 +vt 0.218800 0.977843 +vt 0.340105 0.881903 +vt 0.339783 0.878568 +vt 0.526514 0.849608 +vt 0.529535 0.848366 +vt 0.151428 0.982758 +vt 0.150462 0.974891 +vt 0.164068 0.973792 +vt 0.163435 0.984926 +vt 0.875307 0.616934 +vt 0.876360 0.606698 +vt 0.144815 0.956831 +vt 0.158994 0.957448 +vt 0.876360 0.636199 +vt 0.150025 0.942429 +vt 0.164068 0.945604 +vt 0.669333 0.703932 +vt 0.660419 0.692756 +vt 0.669302 0.684987 +vt 0.676650 0.696544 +vt 0.466226 0.826270 +vt 0.447844 0.826763 +vt 0.663726 0.721474 +vt 0.654054 0.713282 +vt 0.485824 0.828537 +vt 0.656547 0.740818 +vt 0.645540 0.734813 +vt 0.496518 0.829726 +vt 0.651720 0.751334 +vt 0.638836 0.747492 +vt 0.669753 0.872120 +vt 0.677040 0.895791 +vt 0.669933 0.898845 +vt 0.661604 0.879286 +vt 0.660678 0.767872 +vt 0.652727 0.768640 +vt 0.680475 0.918549 +vt 0.670979 0.919457 +vt 0.397202 0.728803 +vt 0.401799 0.717646 +vt 0.420730 0.735531 +vt 0.415443 0.740976 +vt 0.674630 0.936817 +vt 0.669252 0.934475 +vt 0.383802 0.718174 +vt 0.922000 0.956928 +vt 0.913578 0.955969 +vt 0.909924 0.940745 +vt 0.922553 0.944789 +vt 0.342353 0.718982 +vt 0.328037 0.711541 +vt 0.324913 0.705080 +vt 0.336007 0.705081 +vt 0.942578 0.962607 +vt 0.941615 0.949380 +vt 0.918390 0.964442 +vt 0.936931 0.971489 +vt 0.960549 0.963085 +vt 0.959952 0.950180 +vt 0.954488 0.975974 +vt 0.000000 0.971136 +vt 0.003430 0.956566 +vt 0.203827 0.944874 +vt 0.214141 0.942429 +vt 0.216383 0.954815 +vt 0.205692 0.957333 +vt 0.835412 0.963584 +vt 0.844383 0.971550 +vt 0.834694 0.975312 +vt 0.217187 0.965935 +vt 0.206181 0.970049 +vt 0.961390 0.929229 +vt 0.965159 0.934114 +vt 0.958906 0.937850 +vt 0.940556 0.935826 +vt 0.218799 0.971785 +vt 0.203827 0.981267 +vt 0.909802 0.988868 +vt 0.887527 0.989103 +vt 0.873633 0.979044 +vt 0.985270 0.042695 +vt 0.972068 0.051061 +vt 0.968672 0.037256 +vt 0.985270 0.028015 +vt 0.922217 0.932720 +vt 0.930928 0.981274 +vt 0.913891 0.972026 +vt 0.947977 0.989439 +vt 0.909802 0.929229 +vt 0.347226 0.706017 +vt 0.354749 0.710175 +vt 0.864873 0.971799 +vt 0.968791 0.020210 +vt 0.983866 0.017915 +vt 0.861320 0.966870 +vt 0.859895 0.961777 +vt 0.979972 0.006715 +vt 0.982616 0.011981 +vt 0.972072 0.010608 +vt 0.972947 0.005691 +vt 0.858030 0.957230 +vt 0.973768 0.000000 +vt 0.977856 0.001784 +vt 0.665242 0.952883 +vt 0.661604 0.952726 +vt 0.365881 0.708933 +vt 0.619970 0.757675 +vt 0.596371 0.733099 +vt 0.606028 0.714469 +vt 0.633391 0.734124 +vt 0.337063 0.796501 +vt 0.342724 0.814303 +vt 0.316011 0.822910 +vt 0.307687 0.800054 +vt 0.613675 0.694799 +vt 0.638585 0.708657 +vt 0.335582 0.767262 +vt 0.309698 0.766852 +vt 0.931743 0.586949 +vt 0.930105 0.560722 +vt 0.962678 0.567496 +vt 0.969455 0.586497 +vt 0.342074 0.727992 +vt 0.325769 0.720056 +vt 0.970000 0.570232 +vt 0.975651 0.586949 +vt 0.858253 0.981977 +vt 0.852705 0.989103 +vt 0.358391 0.710712 +vt 0.978696 0.494680 +vt 0.981795 0.515742 +vt 0.949407 0.511534 +vt 0.954352 0.487952 +vt 0.390243 0.757052 +vt 0.412144 0.770934 +vt 0.589679 0.790111 +vt 0.565336 0.753001 +vt 0.638836 0.766439 +vt 0.623601 0.798747 +vt 0.420731 0.859773 +vt 0.451770 0.862176 +vt 0.453257 0.890824 +vt 0.423065 0.894078 +vt 0.493424 0.722219 +vt 0.506247 0.704731 +vt 0.530748 0.734324 +vt 0.514818 0.755362 +vt 0.530748 0.787146 +vt 0.509311 0.804454 +vt 0.483115 0.781359 +vt 0.471986 0.739527 +vt 0.562468 0.798747 +vt 0.532440 0.767357 +vt 0.428450 0.755101 +vt 0.446238 0.797026 +vt 0.495092 0.840800 +vt 0.487656 0.847047 +vt 0.664394 0.753047 +vt 0.673492 0.747639 +vt 0.493530 0.863177 +vt 0.476556 0.873435 +vt 0.962774 0.754555 +vt 0.943174 0.744498 +vt 0.947443 0.737944 +vt 0.974820 0.741513 +vt 0.495201 0.885751 +vt 0.478913 0.896482 +vt 0.458441 0.698855 +vt 0.469064 0.684987 +vt 0.479662 0.700756 +vt 0.468140 0.715029 +vt 0.505639 0.904793 +vt 0.489005 0.916413 +vt 0.440102 0.712138 +vt 0.449810 0.728786 +vt 0.550916 0.715327 +vt 0.559909 0.733324 +vt 0.533584 0.748704 +vt 0.530748 0.728346 +vt 0.422338 0.736832 +vt 0.420731 0.717011 +vt 0.464196 0.916413 +vt 0.469631 0.836397 +vt 0.947846 0.717106 +vt 0.981071 0.716577 +vt 0.673729 0.727559 +vt 0.942873 0.673767 +vt 0.936598 0.642813 +vt 0.970012 0.643543 +vt 0.978288 0.677033 +vt 0.982790 0.322536 +vt 0.968672 0.308201 +vt 0.969530 0.297385 +vt 0.982790 0.292276 +vt 0.341644 0.966012 +vt 0.340636 0.953727 +vt 0.356449 0.944177 +vt 0.356449 0.977086 +vt 0.449082 0.819933 +vt 0.436256 0.826519 +vt 0.383176 0.969504 +vt 0.371808 0.972521 +vt 0.371808 0.944177 +vt 0.377622 0.945837 +vt 0.653931 0.787017 +vt 0.663645 0.782340 +vt 0.665969 0.796348 +vt 0.652614 0.796348 +vt 0.512994 0.830836 +vt 0.519950 0.860445 +vt 0.676650 0.782340 +vt 0.516953 0.871569 +vt 0.946648 0.771157 +vt 0.936598 0.768645 +vt 0.517538 0.885498 +vt 0.435786 0.700740 +vt 0.442627 0.689115 +vt 0.524007 0.904390 +vt 0.340636 0.944177 +vt 0.340636 0.965503 +vt 0.322947 0.973841 +vt 0.324886 0.951971 +vt 0.933748 0.544230 +vt 0.962511 0.541572 +vt 0.352353 0.769404 +vt 0.365609 0.740723 +vt 0.933953 0.528047 +vt 0.368315 0.770883 +vt 0.988374 0.532310 +vt 0.991651 0.556022 +vt 0.986417 0.558736 +vt 0.362283 0.709505 +vt 0.996296 0.553377 +vt 0.524576 0.872310 +vt 0.529432 0.871661 +vt 0.529432 0.892763 +vt 0.576245 0.704117 +vt 0.586555 0.718802 +vt 0.354906 0.805937 +vt 0.367584 0.797694 +vt 0.390356 0.810890 +vt 0.378173 0.822867 +vt 0.369669 0.834098 +vt 0.581120 0.687771 +vt 0.596840 0.693394 +vt 0.528314 0.849608 +vt 0.529597 0.860864 +vt 0.524576 0.862463 +vt 0.524576 0.854327 +vt 0.979024 0.892733 +vt 0.984032 0.893283 +vt 0.983078 0.908696 +vt 0.978649 0.904490 +vt 0.634588 0.961310 +vt 0.639433 0.961556 +vt 0.638864 0.975650 +vt 0.634588 0.977441 +vt 0.972074 0.921589 +vt 0.975307 0.929121 +vt 0.970952 0.104631 +vt 0.970242 0.097114 +vt 0.978779 0.086370 +vt 0.984026 0.091473 +vt 0.956721 0.921277 +vt 0.955211 0.929121 +vt 0.979140 0.066539 +vt 0.984026 0.066496 +vt 0.942523 0.908612 +vt 0.937345 0.913415 +vt 0.396101 0.850874 +vt 0.399244 0.856372 +vt 0.400358 0.877342 +vt 0.395156 0.878241 +vt 0.942043 0.887003 +vt 0.936597 0.885904 +vt 0.411392 0.899012 +vt 0.408129 0.906006 +vt 0.949879 0.864380 +vt 0.946842 0.857341 +vt 0.745812 0.983325 +vt 0.740940 0.987648 +vt 0.741905 0.969925 +vt 0.745812 0.962789 +vt 0.950596 0.873493 +vt 0.944360 0.891920 +vt 0.975282 0.067435 +vt 0.969328 0.054940 +vt 0.972321 0.051061 +vt 0.922809 0.608264 +vt 0.924953 0.624527 +vt 0.921072 0.623781 +vt 0.917899 0.603674 +vt 0.975504 0.082296 +vt 0.922437 0.638056 +vt 0.917899 0.641589 +vt 0.968672 0.090096 +vt 0.618683 0.977286 +vt 0.618156 0.966510 +vt 0.623945 0.961309 +vt 0.623945 0.975669 +vt 0.386025 0.941332 +vt 0.394154 0.945225 +vt 0.392376 0.960446 +vt 0.384224 0.959572 +vt 0.966294 0.919259 +vt 0.972273 0.905106 +vt 0.388920 0.930358 +vt 0.395506 0.935499 +vt 0.973178 0.895074 +vt 0.932598 0.513507 +vt 0.940825 0.510796 +vt 0.381405 0.777383 +vt 0.386969 0.770149 +vt 0.769503 0.980737 +vt 0.769503 0.964517 +vt 0.776490 0.960667 +vt 0.780040 0.971311 +vt 0.955917 0.847508 +vt 0.958253 0.860648 +vt 0.411392 0.861897 +vt 0.411392 0.834097 +vt 0.419846 0.838005 +vt 0.417966 0.869589 +vt 0.413419 0.782598 +vt 0.528596 0.869943 +vt 0.525460 0.871661 +vt 0.977044 0.884103 +vt 0.981239 0.883828 +vt 0.735557 0.972074 +vt 0.736044 0.960667 +vt 0.707936 0.969911 +vt 0.699363 0.970470 +vt 0.698325 0.966566 +vt 0.708076 0.960667 +vt 0.524576 0.906651 +vt 0.526568 0.892980 +vt 0.529983 0.892763 +vt 0.528243 0.905137 +vt 0.977747 0.929229 +vt 0.982767 0.932276 +vt 0.975377 0.943972 +vt 0.974118 0.940592 +vt 0.665969 0.790960 +vt 0.668063 0.782340 +vt 0.676417 0.791823 +vt 0.670091 0.791868 +vt 0.985259 0.940870 +vt 0.982059 0.944977 +vt 0.406979 0.925812 +vt 0.402868 0.919793 +vt 0.414892 0.911834 +vt 0.414692 0.919577 +vt 0.384158 0.781042 +vt 0.397017 0.790459 +vt 0.395487 0.794962 +vt 0.386339 0.790737 +vt 0.395702 0.923755 +vt 0.400139 0.929853 +vt 0.967722 0.881328 +vt 0.972368 0.877273 +vt 0.970863 0.887684 +vt 0.524576 0.882913 +vt 0.521671 0.885083 +vt 0.404593 0.794488 +vt 0.405481 0.794976 +vt 0.384224 0.916429 +vt 0.410796 0.906006 +vt 0.680476 0.916903 +vt 0.684127 0.925006 +vt 0.680476 0.928191 +vt 0.403620 0.932696 +vt 0.399231 0.938877 +vt 0.400548 0.802029 +vt 0.403019 0.797883 +vt 0.408960 0.803044 +vt 0.406568 0.807015 +vt 0.409264 0.928866 +vt 0.394224 0.798896 +vt 0.416977 0.922631 +vt 0.385076 0.794670 +vt 0.670849 0.796149 +vt 0.666172 0.795285 +vt 0.528572 0.915949 +vt 0.524576 0.915662 +vt 0.524662 0.910229 +vt 0.528305 0.910229 +vt 0.676620 0.796149 +vt 0.974864 0.946584 +vt 0.980910 0.947293 +vt 0.529983 0.908234 +vt 0.525898 0.910229 +vt 0.853936 0.638269 +vt 0.858132 0.638359 +vt 0.858046 0.642388 +vt 0.853936 0.642804 +vt 0.973600 0.247720 +vt 0.968672 0.243984 +vt 0.972346 0.242177 +vt 0.977096 0.246352 +vt 0.702700 0.972843 +vt 0.710802 0.972335 +vt 0.397615 0.949183 +vt 0.413380 0.811490 +vt 0.411486 0.815585 +vt 0.395413 0.963991 +vt 0.420730 0.820789 +vt 0.419130 0.824249 +vt 0.684805 0.905817 +vt 0.684613 0.916903 +vt 0.680475 0.914769 +vt 0.680475 0.903678 +vt 0.783291 0.983991 +vt 0.780040 0.985001 +vt 0.784683 0.974468 +vt 0.788599 0.974045 +vt 0.977188 0.208970 +vt 0.968672 0.200907 +vt 0.972347 0.197825 +vt 0.980280 0.206117 +vt 0.780040 0.961191 +vt 0.783605 0.960667 +vt 0.977621 0.225965 +vt 0.981624 0.223727 +vt 0.927804 0.626101 +vt 0.927362 0.609916 +vt 0.701140 0.987795 +vt 0.698325 0.984597 +vt 0.318316 0.972464 +vt 0.313562 0.975700 +vt 0.311497 0.967852 +vt 0.316513 0.966916 +vt 0.975085 0.955092 +vt 0.980854 0.953218 +vt 0.312349 0.960350 +vt 0.316560 0.958889 +vt 0.977476 0.963228 +vt 0.982956 0.961559 +vt 0.313015 0.953072 +vt 0.317556 0.951711 +vt 0.980251 0.970125 +vt 0.985699 0.968801 +vt 0.311270 0.948511 +vt 0.316024 0.945275 +vt 0.979881 0.975205 +vt 0.985927 0.975914 +vt 0.322777 0.944177 +vt 0.322947 0.950760 +vt 0.992841 0.965090 +vt 0.992203 0.975708 +vt 0.407008 0.939206 +vt 0.402375 0.944852 +vt 0.991054 0.957593 +vt 0.322842 0.957798 +vt 0.322361 0.964853 +vt 0.987894 0.951933 +vt 0.322947 0.974732 +vt 0.984746 0.943482 +vt 0.314272 0.980076 +vt 0.307687 0.975555 +vt 0.639433 0.972107 +vt 0.639433 0.961310 +vt 0.646479 0.961470 +vt 0.643691 0.964959 +vt 0.968672 0.274668 +vt 0.979700 0.275613 +vt 0.978568 0.283536 +vt 0.979355 0.292276 +vt 0.965159 0.964214 +vt 0.971264 0.945200 +vt 0.968672 0.256945 +vt 0.981971 0.268698 +vt 0.965159 0.981760 +vt 0.976773 0.247720 +vt 0.982616 0.263274 +vt 0.975913 0.991304 +vt 0.791022 0.971538 +vt 0.795336 0.962110 +vt 0.800506 0.964675 +vt 0.800506 0.977573 +vt 0.987092 0.989843 +vt 0.788599 0.960667 +vt 0.394353 0.899388 +vt 0.384224 0.873824 +vt 0.666381 0.807019 +vt 0.682700 0.798747 +vt 0.675182 0.822539 +vt 0.661604 0.828708 +vt 0.388728 0.845918 +vt 0.676683 0.849414 +vt 0.669237 0.854357 +vt 0.411392 0.836440 +vt 0.404425 0.834098 +vt 0.682700 0.870307 +vt 0.676424 0.872120 +vt 0.757917 0.981094 +vt 0.762122 0.961537 +vt 0.769503 0.960667 +vt 0.769503 0.980093 +vt 0.974521 0.142748 +vt 0.968672 0.138559 +vt 0.969364 0.120349 +vt 0.979168 0.126477 +vt 0.487272 0.945072 +vt 0.485534 0.923316 +vt 0.495156 0.916413 +vt 0.500363 0.937049 +vt 0.970940 0.104631 +vt 0.985014 0.110769 +vt 0.490676 0.959792 +vt 0.502410 0.955122 +vt 0.199328 0.968791 +vt 0.184085 0.967300 +vt 0.181666 0.953461 +vt 0.195584 0.953837 +vt 0.530279 0.941321 +vt 0.530279 0.968824 +vt 0.977596 0.586949 +vt 0.976788 0.614408 +vt 0.930105 0.618121 +vt 0.933150 0.600085 +vt 0.098027 0.988969 +vt 0.082571 0.994431 +vt 0.077605 0.957612 +vt 0.098027 0.942429 +vt 0.968721 0.639040 +vt 0.930670 0.639040 +vt 0.071442 0.979128 +vt 0.985014 0.152550 +vt 0.515361 0.960267 +vt 0.495456 0.967543 +vt 0.181666 0.943502 +vt 0.203827 0.942429 +vt 0.537044 0.716248 +vt 0.572119 0.684987 +vt 0.374587 0.787311 +vt 0.404142 0.812289 +vt 0.371808 0.947813 +vt 0.371808 0.974009 +vt 0.356449 0.962466 +vt 0.359668 0.944177 +vt 0.710802 0.979121 +vt 0.710802 0.960667 +vt 0.722877 0.967777 +vt 0.724260 0.983967 +s 1 +f 51/5/2 5/6/2 7/7/2 49/8/2 +f 8/9/3 6/10/3 52/11/3 50/12/3 +f 49/8/4 7/7/4 9/13/4 47/14/4 +f 10/15/5 8/9/5 50/12/5 48/16/5 +f 7/7/6 13/17/6 11/18/6 9/13/6 +f 12/19/7 14/20/7 8/21/7 10/22/7 +f 5/6/8 15/23/8 13/17/8 7/7/8 +f 14/24/9 16/25/9 6/10/9 8/9/9 +f 15/23/10 17/26/10 19/27/10 13/17/10 +f 20/28/11 18/29/11 16/30/11 14/31/11 +f 13/17/12 19/27/12 21/32/12 11/18/12 +f 22/33/13 20/28/13 14/31/13 12/34/13 +f 19/35/14 25/36/14 23/37/14 21/38/14 +f 24/39/15 26/40/15 20/28/15 22/33/15 +f 17/41/16 27/42/16 25/36/16 19/35/16 +f 26/40/17 28/43/17 18/29/17 20/28/17 +f 27/42/18 29/44/18 31/45/18 25/36/18 +f 32/46/19 30/47/19 28/48/19 26/49/19 +f 25/36/20 31/45/20 33/50/20 23/37/20 +f 34/51/21 32/46/21 26/49/21 24/52/21 +f 31/45/22 37/53/22 35/54/22 33/50/22 +f 36/55/23 38/56/23 32/46/23 34/51/23 +f 29/44/24 39/57/24 37/53/24 31/45/24 +f 38/58/25 40/59/25 30/60/25 32/61/25 +f 39/62/26 41/63/26 43/64/26 37/65/26 +f 44/66/27 42/67/27 40/59/27 38/58/27 +f 37/65/28 43/64/28 45/68/28 35/69/28 +f 46/70/29 44/66/29 38/58/29 36/71/29 +f 43/64/30 49/72/30 47/73/30 45/68/30 +f 48/16/31 50/12/31 44/66/31 46/70/31 +f 41/63/32 51/74/32 49/72/32 43/64/32 +f 50/12/33 52/11/33 42/67/33 44/66/33 +f 51/74/34 41/63/34 55/75/34 53/76/34 +f 56/77/35 42/78/35 52/79/35 54/80/35 +f 41/81/36 39/82/36 57/83/36 55/84/36 +f 58/85/37 40/86/37 42/78/37 56/77/37 +f 39/82/38 29/87/38 59/88/38 57/83/38 +f 60/89/39 30/47/39 40/90/39 58/91/39 +f 29/87/40 27/92/40 61/93/40 59/88/40 +f 62/94/41 28/48/41 30/47/41 60/89/41 +f 27/95/42 17/96/42 63/97/42 61/98/42 +f 64/99/43 18/100/43 28/101/43 62/102/43 +f 17/96/44 15/103/44 67/104/44 63/97/44 +f 68/105/45 16/106/45 18/100/45 64/99/45 +f 15/107/46 5/108/46 69/109/46 67/110/46 +f 70/111/47 6/112/47 16/113/47 68/114/47 +f 5/108/48 51/115/48 53/116/48 69/109/48 +f 54/117/49 52/118/49 6/112/49 70/111/49 +f 65/119/50 69/120/50 53/121/50 +f 54/122/51 70/123/51 66/124/51 +f 67/125/52 69/120/52 65/119/52 +f 66/124/53 70/123/53 68/126/53 +f 65/127/54 63/128/54 67/129/54 +f 68/126/55 64/130/55 66/124/55 +f 65/127/56 61/131/56 63/128/56 +f 64/130/57 62/132/57 66/124/57 +f 65/127/58 59/133/58 61/131/58 +f 62/132/59 60/134/59 66/124/59 +f 65/127/60 57/135/60 59/133/60 +f 60/134/61 58/136/61 66/124/61 +f 65/127/62 55/137/62 57/135/62 +f 58/136/63 56/138/63 66/124/63 +f 65/119/64 53/121/64 55/139/64 +f 56/138/65 54/122/65 66/124/65 +f 93/140/66 178/141/66 180/142/66 95/143/66 +f 180/142/67 179/144/67 94/145/67 95/143/67 +f 91/146/68 176/147/68 178/141/68 93/140/68 +f 179/144/69 177/148/69 92/149/69 94/145/69 +f 89/150/70 174/151/70 176/147/70 91/146/70 +f 177/152/71 175/153/71 90/154/71 92/155/71 +f 87/156/72 172/157/72 174/151/72 89/150/72 +f 175/153/73 173/158/73 88/159/73 90/154/73 +f 85/160/74 170/161/74 172/162/74 87/163/74 +f 173/158/75 171/164/75 86/165/75 88/159/75 +f 83/166/76 96/167/76 150/168/76 168/169/76 +f 151/170/77 97/171/77 84/172/77 169/173/77 +f 96/167/78 98/174/78 152/175/78 150/168/78 +f 153/176/79 99/177/79 97/178/79 151/179/79 +f 98/174/80 100/180/80 154/181/80 152/175/80 +f 155/182/81 101/183/81 99/184/81 153/185/81 +f 100/180/82 102/186/82 156/187/82 154/181/82 +f 157/188/83 103/189/83 101/183/83 155/182/83 +f 102/190/84 104/191/84 158/192/84 156/193/84 +f 159/194/85 105/195/85 103/189/85 157/188/85 +f 104/191/86 106/196/86 160/197/86 158/192/86 +f 161/198/87 107/199/87 105/195/87 159/194/87 +f 106/196/88 108/200/88 162/201/88 160/197/88 +f 163/202/89 109/203/89 107/199/89 161/198/89 +f 108/204/90 110/205/90 164/206/90 162/207/90 +f 165/208/91 111/209/91 109/203/91 163/202/91 +f 110/205/92 112/210/92 166/211/92 164/206/92 +f 167/212/93 113/213/93 111/214/93 165/215/93 +f 112/210/94 71/216/94 72/217/94 166/211/94 +f 72/218/95 71/219/95 113/213/95 167/212/95 +f 114/220/96 132/221/96 164/222/96 166/223/96 +f 165/208/97 133/224/97 115/225/97 167/226/97 +f 132/221/98 183/227/98 162/228/98 164/222/98 +f 163/202/99 184/229/99 133/224/99 165/208/99 +f 130/230/100 160/231/100 162/228/100 183/227/100 +f 163/232/101 161/233/101 131/234/101 184/235/101 +f 128/236/102 158/237/102 160/231/102 130/230/102 +f 161/233/103 159/238/103 129/239/103 131/234/103 +f 126/240/104 156/187/104 158/237/104 128/236/104 +f 159/238/105 157/241/105 127/242/105 129/239/105 +f 124/243/106 154/181/106 156/187/106 126/240/106 +f 157/188/107 155/182/107 125/244/107 127/245/107 +f 122/246/108 152/175/108 154/181/108 124/243/108 +f 155/182/109 153/185/109 123/247/109 125/244/109 +f 120/248/110 150/168/110 152/175/110 122/246/110 +f 153/185/111 151/249/111 121/250/111 123/247/111 +f 118/251/112 168/252/112 150/253/112 120/254/112 +f 151/249/113 169/255/113 119/256/113 121/250/113 +f 118/251/114 185/257/114 181/258/114 168/252/114 +f 181/258/115 186/259/115 119/256/115 169/255/115 +f 114/220/116 166/223/116 72/260/116 116/261/116 +f 72/262/117 167/226/117 115/225/117 117/263/117 +f 116/261/118 72/260/118 182/264/118 187/265/118 +f 182/266/119 72/262/119 117/263/119 188/267/119 +f 181/258/120 185/257/120 187/268/120 182/266/120 +f 188/267/121 186/259/121 181/258/121 182/266/121 +f 139/269/122 141/270/122 180/142/122 178/141/122 +f 180/142/123 141/270/123 140/271/123 179/144/123 +f 137/272/124 139/269/124 178/141/124 176/147/124 +f 179/144/125 140/271/125 138/273/125 177/148/125 +f 135/274/126 137/272/126 176/147/126 174/151/126 +f 177/152/127 138/275/127 136/276/127 175/153/127 +f 170/277/128 191/278/128 189/279/128 172/280/128 +f 190/281/129 192/282/129 171/164/129 173/158/129 +f 135/274/130 174/151/130 172/157/130 189/283/130 +f 173/158/131 175/153/131 136/276/131 190/281/131 +f 148/284/132 194/285/132 193/286/132 191/278/132 +f 193/286/133 194/285/133 149/287/133 192/282/133 +f 189/279/134 191/278/134 193/286/135 73/288/135 +f 193/286/135 192/282/136 190/281/136 73/288/135 +f 134/289/137 135/290/137 189/279/137 73/288/137 +f 190/281/137 136/276/137 134/289/137 73/288/137 +f 146/291/138 197/292/138 195/293/138 148/294/138 +f 196/295/139 198/296/139 147/297/139 149/298/139 +f 144/299/140 199/300/140 197/301/140 146/302/140 +f 198/303/141 200/304/141 145/305/141 147/306/141 +f 143/307/142 201/308/142 199/309/142 144/310/142 +f 200/304/143 202/311/143 143/312/143 145/305/143 +f 142/313/144 75/314/144 201/315/144 143/316/144 +f 202/317/145 75/318/145 142/319/145 143/320/145 +f 194/321/146 148/294/146 195/293/146 74/322/146 +f 196/295/147 149/298/147 194/323/147 74/324/147 +f 74/322/148 195/293/148 210/325/148 212/326/148 +f 211/327/149 196/328/149 74/322/149 212/326/149 +f 75/314/150 203/329/150 204/330/150 201/315/150 +f 205/331/151 203/332/151 75/318/151 202/317/151 +f 201/333/152 204/334/152 206/335/152 199/300/152 +f 207/336/153 205/337/153 202/338/153 200/339/153 +f 199/300/154 206/335/154 208/340/154 197/301/154 +f 209/341/155 207/336/155 200/339/155 198/342/155 +f 197/292/156 208/343/156 210/325/156 195/293/156 +f 211/344/157 209/345/157 198/296/157 196/295/157 +f 203/329/158 208/346/158 206/347/158 204/330/158 +f 207/336/159 209/341/159 203/348/159 205/337/159 +f 203/349/160 212/326/160 210/325/160 208/343/160 +f 211/327/161 212/326/161 203/349/161 209/350/161 +f 143/351/162 144/352/162 168/252/162 181/258/162 +f 169/353/163 145/354/163 143/355/163 181/356/163 +f 144/352/164 146/357/164 215/358/164 168/252/164 +f 216/359/165 147/360/165 145/354/165 169/353/165 +f 146/291/166 148/294/166 217/361/166 215/362/166 +f 218/363/167 149/287/167 147/364/167 216/365/167 +f 148/284/168 191/278/168 170/277/168 217/366/168 +f 171/164/169 192/282/169 149/287/169 218/363/169 +f 85/160/170 213/367/170 217/368/170 170/161/170 +f 218/363/171 214/369/171 86/165/171 171/164/171 +f 213/367/172 219/370/172 215/371/172 217/368/172 +f 216/365/173 220/372/173 214/369/173 218/363/173 +f 83/373/174 168/374/174 215/371/174 219/370/174 +f 216/365/175 169/375/175 84/376/175 220/372/175 +f 135/274/176 134/377/176 76/378/176 226/379/176 +f 76/378/177 134/377/177 136/380/177 227/381/177 +f 137/382/178 135/19/178 226/383/178 224/384/178 +f 227/381/179 136/380/179 138/273/179 225/385/179 +f 139/386/180 137/382/180 224/384/180 222/387/180 +f 225/385/181 138/273/181 140/271/181 223/388/181 +f 141/389/182 139/386/182 222/387/182 221/390/182 +f 223/391/183 140/392/183 141/389/183 221/390/183 +f 221/393/184 222/394/184 233/395/184 235/396/184 +f 234/397/185 223/398/185 221/399/185 235/400/185 +f 222/394/186 224/401/186 231/402/186 233/395/186 +f 232/403/187 225/404/187 223/398/187 234/397/187 +f 224/405/188 226/406/188 229/407/188 231/408/188 +f 230/409/189 227/410/189 225/404/189 232/403/189 +f 226/379/190 76/378/190 228/411/190 229/412/190 +f 228/413/191 76/414/191 227/415/191 230/416/191 +f 228/417/192 235/418/192 233/419/192 229/420/192 +f 234/421/193 235/418/193 228/417/193 230/422/193 +f 229/423/194 233/424/194 231/425/194 +f 232/426/195 234/421/195 230/422/195 +f 187/268/196 185/257/196 238/427/196 236/428/196 +f 239/429/197 186/430/197 188/431/197 237/432/197 +f 116/433/198 187/268/198 236/428/198 258/434/198 +f 237/432/199 188/431/199 117/435/199 259/436/199 +f 114/437/200 116/433/200 258/434/200 260/438/200 +f 259/439/201 117/263/201 115/225/201 261/440/201 +f 185/257/202 118/251/202 256/441/202 238/427/202 +f 257/442/203 119/443/203 186/430/203 239/429/203 +f 118/444/204 120/248/204 254/445/204 256/446/204 +f 255/447/205 121/448/205 119/443/205 257/442/205 +f 120/248/206 122/246/206 252/449/206 254/445/206 +f 253/450/207 123/247/207 121/250/207 255/451/207 +f 122/246/208 124/243/208 250/452/208 252/449/208 +f 251/453/209 125/244/209 123/247/209 253/450/209 +f 124/243/210 126/240/210 248/454/210 250/452/210 +f 249/455/211 127/245/211 125/244/211 251/453/211 +f 126/456/212 128/457/212 246/458/212 248/459/212 +f 247/460/213 129/461/213 127/245/213 249/455/213 +f 128/457/214 130/462/214 244/463/214 246/458/214 +f 245/464/215 131/465/215 129/461/215 247/460/215 +f 130/462/216 183/466/216 240/467/216 244/463/216 +f 241/468/217 184/229/217 131/465/217 245/464/217 +f 183/469/218 132/470/218 242/471/218 240/472/218 +f 243/473/219 133/224/219 184/229/219 241/468/219 +f 132/470/220 114/437/220 260/438/220 242/471/220 +f 261/440/221 115/225/221 133/224/221 243/473/221 +f 242/474/222 260/475/222 262/476/222 280/477/222 +f 263/478/223 261/440/223 243/473/223 281/479/223 +f 240/480/224 242/474/224 280/477/224 282/481/224 +f 281/479/225 243/473/225 241/468/225 283/482/225 +f 244/483/226 240/480/226 282/481/226 278/484/226 +f 283/485/227 241/486/227 245/487/227 279/488/227 +f 246/489/228 244/483/228 278/484/228 276/490/228 +f 279/488/229 245/487/229 247/491/229 277/492/229 +f 248/493/230 246/494/230 276/495/230 274/496/230 +f 277/492/231 247/491/231 249/497/231 275/498/231 +f 250/499/232 248/493/232 274/496/232 272/500/232 +f 275/498/233 249/497/233 251/501/233 273/502/233 +f 252/503/234 250/499/234 272/500/234 270/504/234 +f 273/505/235 251/453/235 253/450/235 271/506/235 +f 254/507/236 252/503/236 270/504/236 268/508/236 +f 271/506/237 253/450/237 255/451/237 269/509/237 +f 256/510/238 254/511/238 268/512/238 266/513/238 +f 269/509/239 255/451/239 257/514/239 267/515/239 +f 238/516/240 256/510/240 266/513/240 284/517/240 +f 267/515/241 257/514/241 239/518/241 285/519/241 +f 260/475/242 258/520/242 264/521/242 262/476/242 +f 265/522/243 259/439/243 261/440/243 263/478/243 +f 258/520/244 236/523/244 286/524/244 264/521/244 +f 287/525/245 237/526/245 259/439/245 265/522/245 +f 236/527/246 238/516/246 284/517/246 286/528/246 +f 285/519/247 239/518/247 237/526/247 287/525/247 +f 71/529/248 112/530/248 288/531/248 77/532/248 +f 289/533/249 113/213/249 71/219/249 77/534/249 +f 112/530/250 110/535/250 290/536/250 288/531/250 +f 291/537/251 111/214/251 113/213/251 289/533/251 +f 110/535/252 108/538/252 292/539/252 290/536/252 +f 293/540/253 109/541/253 111/542/253 291/543/253 +f 108/200/254 106/196/254 294/544/254 292/545/254 +f 295/546/255 107/547/255 109/541/255 293/540/255 +f 106/196/256 104/191/256 296/548/256 294/544/256 +f 297/549/257 105/550/257 107/547/257 295/546/257 +f 104/191/258 102/190/258 298/551/258 296/548/258 +f 299/552/259 103/553/259 105/550/259 297/549/259 +f 102/554/260 100/555/260 300/556/260 298/557/260 +f 301/558/261 101/559/261 103/553/261 299/552/261 +f 100/555/262 98/560/262 302/561/262 300/556/262 +f 303/562/263 99/563/263 101/564/263 301/565/263 +f 98/560/264 96/566/264 304/567/264 302/561/264 +f 305/568/265 97/171/265 99/563/265 303/562/265 +f 312/569/266 313/570/266 332/571/266 342/572/266 +f 333/573/267 313/574/267 312/575/267 343/576/267 +f 311/577/268 312/569/268 342/572/268 340/578/268 +f 343/579/269 312/569/269 311/577/269 341/580/269 +f 310/581/270 311/577/270 340/578/270 344/582/270 +f 341/580/271 311/577/271 310/581/271 345/583/271 +f 93/140/272 95/143/272 310/584/272 344/585/272 +f 310/586/273 95/587/273 94/588/273 345/589/273 +f 91/590/274 93/323/274 344/591/274 338/592/274 +f 345/589/275 94/588/275 92/593/275 339/594/275 +f 89/595/276 91/596/276 338/597/276 334/598/276 +f 339/594/277 92/593/277 90/599/277 335/600/277 +f 87/163/278 89/601/278 334/602/278 336/603/278 +f 335/604/279 90/605/279 88/606/279 337/607/279 +f 334/598/280 340/578/280 342/572/280 336/608/280 +f 343/579/281 341/580/281 335/609/281 337/610/281 +f 334/598/282 338/597/282 344/582/282 340/578/282 +f 345/583/283 339/611/283 335/609/283 341/580/283 +f 330/612/284 336/608/284 342/572/284 332/571/284 +f 343/576/285 337/613/285 331/614/285 333/573/285 +f 85/160/286 87/163/286 336/603/286 330/615/286 +f 337/607/287 88/606/287 86/616/287 331/617/287 +f 213/367/288 346/618/288 348/619/288 219/370/288 +f 349/620/289 347/621/289 214/622/289 220/623/289 +f 85/160/290 330/615/290 346/618/290 213/367/290 +f 347/621/291 331/617/291 86/616/291 214/622/291 +f 83/373/292 219/370/292 348/619/292 350/624/292 +f 349/620/293 220/623/293 84/625/293 351/626/293 +f 83/627/294 350/628/294 304/567/294 96/566/294 +f 305/568/295 351/629/295 84/172/295 97/171/295 +f 81/630/296 328/631/296 356/632/296 308/633/296 +f 357/634/297 329/635/297 81/636/297 308/637/297 +f 308/633/298 356/632/298 354/638/298 82/639/298 +f 355/640/299 357/634/299 308/637/299 82/641/299 +f 82/642/300 354/643/300 352/644/300 309/645/300 +f 353/646/301 355/640/301 82/641/301 309/647/301 +f 309/645/302 352/644/302 332/648/302 313/649/302 +f 333/573/303 353/646/303 309/647/303 313/574/303 +f 330/615/304 332/650/304 352/651/304 346/618/304 +f 353/646/305 333/573/305 331/614/305 347/652/305 +f 300/653/306 302/654/306 322/655/306 314/656/306 +f 323/657/307 303/562/307 301/565/307 315/658/307 +f 80/659/308 320/660/308 328/631/308 81/630/308 +f 329/661/309 321/662/309 80/659/309 81/630/309 +f 306/663/310 362/664/310 360/665/310 307/666/310 +f 361/667/311 363/668/311 306/669/311 307/670/311 +f 307/670/312 360/671/312 358/672/312 79/673/312 +f 359/674/313 361/667/313 307/670/313 79/673/313 +f 79/675/314 358/676/314 320/660/314 80/659/314 +f 321/677/315 359/674/315 79/673/315 80/678/315 +f 296/548/316 298/551/316 366/679/316 368/680/316 +f 367/681/317 299/552/317 297/549/317 369/682/317 +f 368/680/318 366/679/318 372/683/318 370/684/318 +f 373/685/319 367/686/319 369/687/319 371/688/319 +f 370/684/320 372/683/320 374/689/320 376/690/320 +f 375/691/321 373/692/321 371/693/321 377/694/321 +f 376/690/322 374/689/322 380/695/322 378/696/322 +f 381/697/323 375/691/323 377/694/323 379/698/323 +f 318/699/324 382/700/324 378/701/324 380/702/324 +f 379/698/325 383/703/325 319/704/325 381/697/325 +f 320/660/326 358/676/326 378/701/326 382/700/326 +f 379/698/327 359/674/327 321/677/327 383/703/327 +f 358/705/328 360/665/328 376/690/328 378/696/328 +f 377/694/329 361/667/329 359/674/329 379/698/329 +f 360/665/330 362/664/330 370/684/330 376/690/330 +f 371/693/331 363/668/331 361/667/331 377/694/331 +f 362/664/332 364/706/332 368/680/332 370/684/332 +f 369/687/333 365/707/333 363/708/333 371/688/333 +f 294/544/334 296/548/334 368/680/334 364/706/334 +f 369/682/335 297/549/335 295/546/335 365/709/335 +f 78/710/336 364/711/336 362/712/336 306/713/336 +f 363/708/337 365/707/337 78/710/337 306/713/337 +f 288/714/338 290/715/338 292/716/338 294/717/338 +f 293/718/339 291/719/339 289/720/339 295/721/339 +f 288/722/340 294/544/340 364/706/340 78/723/340 +f 365/724/341 295/725/341 289/726/341 78/727/341 +f 77/728/342 288/729/342 78/730/342 +f 78/730/343 289/731/343 77/728/343 +f 298/551/344 300/732/344 314/733/344 366/679/344 +f 315/734/345 301/558/345 299/552/345 367/681/345 +f 314/733/346 316/735/346 372/683/346 366/679/346 +f 373/685/347 317/736/347 315/737/347 367/686/347 +f 316/735/348 386/738/348 374/689/348 372/683/348 +f 375/691/349 387/739/349 317/740/349 373/692/349 +f 318/741/350 380/695/350 374/689/350 386/738/350 +f 375/742/351 381/743/351 319/744/351 387/745/351 +f 352/644/352 354/643/352 390/746/352 388/747/352 +f 391/748/353 355/640/353 353/646/353 389/749/353 +f 322/655/354 388/747/354 390/746/354 324/750/354 +f 391/748/355 389/749/355 323/657/355 325/751/355 +f 302/654/356 304/752/356 388/747/356 322/655/356 +f 389/749/357 305/568/357 303/562/357 323/657/357 +f 304/752/358 348/753/358 346/754/358 388/747/358 +f 347/652/359 349/755/359 305/568/359 389/749/359 +f 346/754/360 352/644/360 388/747/360 +f 389/749/361 353/646/361 347/652/361 +f 304/752/362 350/756/362 348/753/362 +f 349/757/363 351/758/363 305/759/363 +f 318/699/364 326/760/364 384/761/364 382/700/364 +f 385/762/365 327/763/365 319/764/365 383/765/365 +f 320/660/366 382/700/366 384/761/366 328/631/366 +f 385/762/367 383/765/367 321/766/367 329/635/367 +f 324/767/368 390/768/368 384/761/368 326/760/368 +f 385/762/369 391/748/369 325/751/369 327/763/369 +f 354/638/370 356/632/370 384/761/370 390/768/370 +f 385/762/371 357/634/371 355/640/371 391/748/371 +f 328/631/372 384/761/372 356/632/372 +f 357/634/373 385/762/373 329/635/373 +f 404/769/374 392/770/374 418/771/374 406/772/374 +f 419/773/375 393/774/375 405/775/375 407/776/375 +f 404/777/376 406/778/376 408/779/376 402/780/376 +f 409/781/377 407/776/377 405/775/377 403/782/377 +f 402/783/378 408/784/378 410/785/378 400/786/378 +f 411/787/379 409/781/379 403/782/379 401/788/379 +f 400/786/380 410/785/380 412/789/380 398/790/380 +f 413/791/381 411/787/381 401/788/381 399/792/381 +f 398/793/382 412/794/382 414/795/382 396/796/382 +f 415/797/383 413/791/383 399/792/383 397/798/383 +f 396/796/384 414/795/384 416/799/384 394/800/384 +f 417/801/385 415/797/385 397/798/385 395/802/385 +f 414/803/386 424/804/386 422/805/386 416/806/386 +f 423/807/387 425/808/387 415/797/387 417/801/387 +f 412/789/388 426/809/388 424/810/388 414/811/388 +f 425/812/389 427/813/389 413/814/389 415/815/389 +f 410/785/390 428/816/390 426/809/390 412/789/390 +f 427/813/391 429/817/391 411/818/391 413/814/391 +f 408/784/392 430/819/392 428/816/392 410/785/392 +f 429/820/393 431/821/393 409/822/393 411/823/393 +f 406/824/394 432/825/394 430/826/394 408/827/394 +f 431/828/395 433/829/395 407/776/395 409/781/395 +f 406/824/396 418/830/396 420/831/396 432/825/396 +f 421/832/397 419/773/397 407/776/397 433/829/397 +f 322/655/398 324/750/398 448/833/398 446/834/398 +f 449/835/399 325/751/399 323/657/399 447/836/399 +f 324/837/400 394/838/400 416/839/400 448/840/400 +f 417/801/401 395/802/401 325/841/401 449/842/401 +f 314/843/402 322/844/402 446/845/402 316/846/402 +f 447/836/403 323/657/403 315/658/403 317/847/403 +f 386/848/404 434/849/404 418/771/404 392/770/404 +f 419/773/405 435/850/405 387/851/405 393/774/405 +f 416/806/406 422/805/406 444/852/406 448/853/406 +f 445/854/407 423/855/407 417/856/407 449/857/407 +f 442/858/408 450/859/408 448/860/408 444/861/408 +f 449/862/409 451/863/409 443/864/409 445/865/409 +f 438/866/410 450/867/410 442/868/410 440/869/410 +f 443/864/411 451/863/411 439/870/411 441/871/411 +f 436/872/412 452/873/412 450/874/412 438/875/412 +f 451/876/413 453/877/413 437/878/413 439/879/413 +f 434/880/414 452/873/414 436/872/414 454/881/414 +f 437/882/415 453/883/415 435/850/415 455/884/415 +f 418/830/416 434/880/416 454/881/416 420/831/416 +f 455/884/417 435/850/417 419/773/417 421/832/417 +f 316/735/418 452/885/418 434/886/418 386/738/418 +f 435/887/419 453/877/419 317/847/419 387/888/419 +f 316/889/420 446/890/420 450/874/420 452/873/420 +f 451/876/421 447/836/421 317/847/421 453/877/421 +f 446/891/422 448/892/422 450/893/422 +f 451/876/423 449/835/423 447/836/423 +f 420/831/424 454/881/424 456/894/424 480/895/424 +f 457/896/425 455/897/425 421/898/425 481/899/425 +f 454/881/426 436/872/426 466/900/426 456/894/426 +f 467/901/427 437/878/427 455/897/427 457/896/427 +f 436/872/428 438/875/428 464/902/428 466/900/428 +f 465/903/429 439/879/429 437/878/429 467/901/429 +f 438/866/430 440/869/430 462/904/430 464/905/430 +f 463/906/431 441/907/431 439/908/431 465/909/431 +f 440/869/432 442/868/432 460/910/432 462/904/432 +f 461/911/433 443/864/433 441/871/433 463/912/433 +f 442/858/434 444/861/434 458/913/434 460/914/434 +f 459/915/435 445/916/435 443/917/435 461/918/435 +f 444/919/436 422/920/436 478/921/436 458/922/436 +f 479/923/437 423/855/437 445/854/437 459/924/437 +f 432/825/438 420/831/438 480/895/438 468/925/438 +f 481/899/439 421/898/439 433/926/439 469/927/439 +f 430/826/440 432/825/440 468/925/440 470/928/440 +f 469/927/441 433/926/441 431/929/441 471/930/441 +f 428/931/442 430/932/442 470/933/442 472/934/442 +f 471/935/443 431/936/443 429/937/443 473/938/443 +f 426/939/444 428/940/444 472/941/444 474/942/444 +f 473/938/445 429/937/445 427/943/445 475/944/445 +f 424/945/446 426/939/446 474/942/446 476/946/446 +f 475/947/447 427/813/447 425/812/447 477/948/447 +f 422/920/448 424/945/448 476/946/448 478/921/448 +f 477/949/449 425/950/449 423/855/449 479/923/449 +f 462/951/450 460/952/450 484/953/450 482/954/450 +f 485/955/451 461/911/451 463/912/451 483/956/451 +f 482/954/452 484/953/452 486/957/452 488/958/452 +f 487/959/453 485/955/453 483/956/453 489/960/453 +f 488/958/454 486/957/454 492/961/454 490/962/454 +f 493/963/455 487/959/455 489/960/455 491/964/455 +f 490/962/456 492/961/456 494/965/456 496/966/456 +f 495/967/457 493/963/457 491/964/457 497/968/457 +f 468/969/458 480/970/458 490/962/458 496/966/458 +f 491/964/459 481/971/459 469/972/459 497/968/459 +f 456/894/460 488/973/460 490/974/460 480/895/460 +f 491/964/461 489/960/461 457/975/461 481/971/461 +f 456/976/462 466/977/462 482/954/462 488/958/462 +f 483/956/463 467/978/463 457/975/463 489/960/463 +f 462/951/464 482/954/464 466/977/464 464/979/464 +f 467/978/465 483/956/465 463/912/465 465/980/465 +f 458/981/466 478/982/466 484/953/466 460/952/466 +f 485/983/467 479/984/467 459/985/467 461/986/467 +f 476/987/468 486/988/468 484/989/468 478/990/468 +f 485/955/469 487/959/469 477/991/469 479/992/469 +f 474/993/470 492/994/470 486/988/470 476/987/470 +f 487/959/471 493/963/471 475/995/471 477/991/471 +f 472/996/472 494/997/472 492/994/472 474/993/472 +f 493/963/473 495/967/473 473/998/473 475/995/473 +f 470/999/474 496/1000/474 494/1001/474 472/1002/474 +f 495/967/475 497/968/475 471/1003/475 473/998/475 +f 468/1004/476 496/1000/476 470/999/476 +f 471/1003/477 497/968/477 469/972/477 +f 396/796/478 394/800/478 508/1005/478 506/1006/478 +f 509/1007/479 395/1008/479 397/1009/479 507/1010/479 +f 398/793/480 396/796/480 506/1006/480 504/1011/480 +f 507/1010/481 397/1009/481 399/1012/481 505/1013/481 +f 400/1014/482 398/793/482 504/1011/482 502/1015/482 +f 505/1013/483 399/1012/483 401/1016/483 503/1017/483 +f 402/1018/484 400/1019/484 502/1020/484 500/1021/484 +f 503/1022/485 401/1023/485 403/1024/485 501/1025/485 +f 404/1026/486 402/1027/486 500/1028/486 498/1029/486 +f 501/1025/487 403/1024/487 405/1030/487 499/1031/487 +f 392/1032/488 404/1026/488 498/1029/488 510/1033/488 +f 499/1034/489 405/1035/489 393/1036/489 511/1037/489 +f 498/1029/490 506/1038/490 508/1039/490 510/1033/490 +f 509/1040/491 507/1041/491 499/1042/491 511/1043/491 +f 498/1044/492 500/1045/492 504/1046/492 506/1047/492 +f 505/1048/493 501/1049/493 499/1042/493 507/1041/493 +f 500/1045/494 502/1050/494 504/1046/494 +f 505/1051/495 503/1022/495 501/1025/495 +f 318/1052/496 386/1053/496 392/1032/496 510/1033/496 +f 393/1036/497 387/1054/497 319/1055/497 511/1037/497 +f 318/699/498 510/1056/498 508/1057/498 326/760/498 +f 509/1058/499 511/1059/499 319/764/499 327/763/499 +f 324/1060/500 326/1061/500 508/1062/500 394/1063/500 +f 509/1064/501 327/1065/501 325/1066/501 395/1067/501 +o Torus +v 7.274135 11.314750 -6.305354 +v 6.959822 11.826303 -6.040284 +v 6.428581 12.077795 -5.748260 +v 5.822757 12.001837 -5.507531 +v 5.304680 11.618782 -5.382600 +v 5.013169 11.031269 -5.406942 +v 5.026333 10.396722 -5.574033 +v 5.340646 9.885167 -5.839104 +v 5.871887 9.633676 -6.131127 +v 6.477711 9.709632 -6.371856 +v 6.995788 10.092690 -6.496788 +v 7.287299 10.680200 -6.472446 +v 6.977272 11.451650 -6.893372 +v 6.672764 11.958683 -6.608882 +v 6.168308 12.197824 -6.263802 +v 5.599074 12.104991 -5.950596 +v 5.117587 11.705061 -5.753188 +v 4.852862 11.105196 -5.724473 +v 4.875831 10.466127 -5.872145 +v 5.180339 9.959095 -6.156635 +v 5.684794 9.719953 -6.501715 +v 6.254028 9.812786 -6.814921 +v 6.735515 10.212716 -7.012329 +v 7.000240 10.812581 -7.041044 +v 6.607479 11.554349 -7.445948 +v 6.315184 12.057990 -7.143208 +v 5.844094 12.287863 -6.748269 +v 5.320439 12.182372 -6.366955 +v 4.884532 11.769786 -6.101439 +v 4.653172 11.160654 -6.022865 +v 4.688354 10.518194 -6.152288 +v 4.980649 10.014551 -6.455028 +v 5.451738 9.784678 -6.849967 +v 5.975393 9.890169 -7.231280 +v 6.411301 10.302757 -7.496797 +v 6.642661 10.911889 -7.575371 +v 6.171083 11.621089 -7.953628 +v 5.893200 12.122526 -7.634121 +v 5.461487 12.346376 -7.193375 +v 4.991620 12.232659 -6.749486 +v 4.609501 11.811846 -6.421396 +v 4.417518 11.196693 -6.297014 +v 4.467112 10.552028 -6.409670 +v 4.744994 10.050591 -6.729177 +v 5.176708 9.826740 -7.169923 +v 5.646574 9.940456 -7.613812 +v 6.028694 10.361271 -7.941902 +v 6.220677 10.976424 -8.066284 +v 5.675550 11.650727 -8.407726 +v 5.414033 12.151186 -8.073221 +v 5.027031 12.372362 -7.591502 +v 4.618242 12.254991 -7.091644 +v 4.297200 11.830524 -6.707583 +v 4.149928 11.212697 -6.542229 +v 4.215888 10.567054 -6.639887 +v 4.477406 10.066595 -6.974391 +v 4.864407 9.845419 -7.456111 +v 5.273196 9.962789 -7.955969 +v 5.594238 10.387256 -8.340030 +v 5.741510 11.005084 -8.505383 +v 5.129363 11.642757 -8.800470 +v 4.885883 12.143478 -8.452995 +v 4.548164 12.365376 -7.935839 +v 4.206696 12.248986 -7.387572 +v 3.952975 11.825502 -6.955103 +v 3.854985 11.208393 -6.754312 +v 3.938983 10.563013 -6.838999 +v 4.182462 10.062291 -7.186474 +v 4.520182 9.840396 -7.703631 +v 4.861650 9.956783 -8.251897 +v 5.115371 10.380268 -8.684366 +v 5.213361 10.997377 -8.885158 +v 4.541861 11.597314 -9.125143 +v 4.317784 12.099537 -8.766945 +v 4.033075 12.325532 -8.220493 +v 3.764020 12.214746 -7.632209 +v 3.582712 11.796862 -7.159722 +v 3.537732 11.183853 -6.929636 +v 3.641134 10.539974 -7.003601 +v 3.865209 10.037752 -7.361798 +v 4.149919 9.811756 -7.908250 +v 4.418974 9.922542 -8.496534 +v 4.600282 10.340426 -8.969021 +v 4.645261 10.953435 -9.199107 +v 3.923101 11.515177 -9.376186 +v 3.719460 12.020112 -9.009698 +v 3.490582 12.253519 -8.440595 +v 3.297792 12.152857 -7.821368 +v 3.192750 11.745096 -7.317938 +v 3.203600 11.139500 -7.065200 +v 3.327437 10.498333 -7.130874 +v 3.531077 9.993398 -7.497363 +v 3.759956 9.759991 -8.066465 +v 3.952746 9.860654 -8.685693 +v 4.057788 10.268412 -9.189122 +v 4.046937 10.874010 -9.441860 +v 3.283667 11.397750 -9.549309 +v 3.101144 11.906563 -9.177103 +v 2.929961 12.150565 -8.592379 +v 2.815986 12.064377 -7.951813 +v 2.789757 11.671091 -7.427046 +v 2.858304 11.076088 -7.158687 +v 3.003259 10.438800 -7.218643 +v 3.185781 9.929987 -7.590849 +v 3.356964 9.685987 -8.175573 +v 3.470940 9.772174 -8.816138 +v 3.497168 10.165460 -9.340906 +v 3.428621 10.760462 -9.609264 +v 2.634504 11.247046 -9.641544 +v 2.473421 11.760834 -9.266293 +v 2.360811 12.018434 -8.673246 +v 2.326849 11.950821 -8.021312 +v 2.380634 11.576111 -7.485176 +v 2.507754 10.994706 -7.208494 +v 2.674148 10.362395 -7.265405 +v 2.835231 9.848605 -7.640657 +v 2.947840 9.591004 -8.233704 +v 2.981803 9.658618 -8.885637 +v 2.928018 10.033328 -9.421774 +v 2.800898 10.614733 -9.698454 +v 1.986714 11.065635 -9.651318 +v 1.847025 11.585417 -9.275743 +v 1.792865 11.859384 -8.681814 +v 1.838747 11.814131 -8.028675 +v 1.972376 11.461782 -7.491335 +v 2.157946 10.896745 -7.213772 +v 2.345734 10.270426 -7.270359 +v 2.485423 9.750644 -7.645934 +v 2.539582 9.476675 -8.239861 +v 2.493701 9.521929 -8.893001 +v 2.360072 9.874279 -9.430342 +v 2.174502 10.439315 -9.707905 +v 1.351384 10.856628 -9.578459 +v 1.232678 11.383312 -9.205290 +v 1.235844 11.676140 -8.617936 +v 1.360033 11.656647 -7.973778 +v 1.571970 11.330058 -7.445417 +v 1.814865 10.783880 -7.174428 +v 2.023636 10.164464 -7.233421 +v 2.142342 9.637779 -7.606590 +v 2.139177 9.344952 -8.193945 +v 2.014987 9.364445 -8.838102 +v 1.803051 9.691034 -9.366464 +v 1.560155 10.237211 -9.637453 +v 0.739387 10.623601 -9.424217 +v 0.640893 11.157982 -9.056143 +v 0.699279 11.471834 -8.482705 +v 0.898900 11.481064 -7.857558 +v 1.186269 11.183197 -7.348209 +v 1.484385 10.658046 -7.091137 +v 1.713368 10.046325 -7.155224 +v 1.811862 9.511944 -7.523299 +v 1.753476 9.198092 -8.096736 +v 1.553854 9.188862 -8.721884 +v 1.266485 9.486729 -9.231233 +v 0.968370 10.011880 -9.488304 +v 0.161189 10.370539 -9.191229 +v 0.081791 10.913277 -8.830849 +v 0.192347 11.249964 -8.278435 +v 0.463235 11.290384 -7.682005 +v 0.821870 11.023708 -7.201373 +v 1.172157 10.521391 -6.965323 +v 1.420235 9.918028 -7.037105 +v 1.499634 9.375290 -7.397484 +v 1.389077 9.038603 -7.949898 +v 1.118189 8.998182 -8.546329 +v 0.759554 9.264858 -9.026962 +v 0.409268 9.767176 -9.263012 +v -0.373312 10.101773 -8.883485 +v -0.435058 10.653388 -8.533268 +v -0.276273 11.014325 -8.008621 +v 0.060495 11.087873 -7.450123 +v 0.485011 10.854323 -7.007422 +v 0.883524 10.376257 -6.799140 +v 1.149256 9.781770 -6.881085 +v 1.211001 9.230156 -7.231300 +v 1.052217 8.869218 -7.755949 +v 0.715449 8.795671 -8.314445 +v 0.290934 9.029220 -8.757149 +v -0.107581 9.507286 -8.965431 +v -0.854974 9.821901 -8.506247 +v -0.900812 10.382759 -8.168488 +v -0.698568 10.768950 -7.677879 +v -0.302432 10.876992 -7.165877 +v 0.181451 10.677939 -6.769673 +v 0.623425 10.225125 -6.595430 +v 0.905064 9.639881 -6.689834 +v 0.950902 9.079023 -7.027590 +v 0.748658 8.692833 -7.518199 +v 0.352522 8.584790 -8.030203 +v -0.131361 8.783843 -8.426407 +v -0.573335 9.236657 -8.600651 +v -1.275553 9.535713 -8.065971 +v -1.307501 10.106023 -7.742753 +v -1.067308 10.518035 -7.291870 +v -0.619333 10.661353 -6.834135 +v -0.083611 10.497574 -6.492197 +v 0.396312 10.070582 -6.357679 +v 0.691840 9.494791 -6.466625 +v 0.723789 8.924481 -6.789842 +v 0.483596 8.512468 -7.240725 +v 0.035621 8.369150 -7.698460 +v -0.500101 8.532929 -8.040398 +v -0.980024 8.959921 -8.174915 +v -1.627855 9.248104 -7.570188 +v -1.648167 9.827911 -7.263344 +v -1.376187 10.265876 -6.857195 +v -0.884789 10.444643 -6.460569 +v -0.305643 10.316316 -6.179739 +v 0.206068 9.915275 -6.089955 +v 0.513232 9.348981 -6.215272 +v 0.533545 8.769172 -6.522118 +v 0.261564 8.331207 -6.928267 +v -0.229835 8.152440 -7.324893 +v -0.808980 8.280769 -7.605721 +v -1.320691 8.681810 -7.695507 +v -1.905851 8.963995 -7.027381 +v -1.916982 9.553186 -6.738467 +v -1.619918 10.016785 -6.381294 +v -1.094255 10.230573 -6.051572 +v -0.480845 10.137260 -5.837646 +v 0.055949 9.761855 -5.796839 +v 0.372294 9.204945 -5.940084 +v 0.383426 8.615754 -6.229002 +v 0.086361 8.152153 -6.586173 +v -0.439301 7.938370 -6.915895 +v -1.052711 8.031679 -7.129820 +v -1.589506 8.407085 -7.170630 +v -2.104783 8.688249 -6.446846 +v -2.109345 9.286550 -6.177103 +v -1.794331 9.775029 -5.872313 +v -1.244149 10.022801 -5.614143 +v -0.606219 9.963477 -5.471772 +v -0.051476 9.612952 -5.483348 +v 0.271440 9.065148 -5.645764 +v 0.276001 8.466850 -5.915508 +v -0.039012 7.978372 -6.220298 +v -0.589195 7.730597 -6.478467 +v -1.227124 7.789923 -6.620840 +v -1.781868 8.140447 -6.609263 +v -2.221250 8.425587 -5.838508 +v -2.221965 9.032559 -5.588854 +v -1.896442 9.544739 -5.338955 +v -1.331905 9.824886 -5.155768 +v -0.679620 9.797936 -5.088378 +v -0.114368 9.471111 -5.154841 +v 0.212394 8.931983 -5.337351 +v 0.213109 8.325010 -5.587006 +v -0.112413 7.812829 -5.836905 +v -0.676951 7.532681 -6.020092 +v -1.329236 7.559630 -6.087481 +v -1.894488 7.886456 -6.021018 +v -2.253258 8.180494 -5.212773 +v -2.252916 8.795562 -4.983788 +v -1.924505 9.329856 -4.790348 +v -1.356023 9.640212 -4.684285 +v -0.699793 9.643472 -4.694021 +v -0.131652 9.338761 -4.816945 +v 0.196167 8.807728 -5.020121 +v 0.195825 8.192660 -5.249106 +v -0.132586 7.658366 -5.442546 +v -0.701068 7.348010 -5.548609 +v -1.357298 7.344748 -5.538875 +v -1.925439 7.649459 -5.415949 +v -2.200258 7.957170 -4.580356 +v -2.201667 8.579614 -4.372254 +v -1.878038 9.134058 -4.235878 +v -1.316088 9.471940 -4.207765 +v -0.666390 9.502727 -4.295450 +v -0.103032 9.218165 -4.475435 +v 0.223036 8.694508 -4.699500 +v 0.224445 8.072064 -4.907598 +v -0.099184 7.517621 -5.043975 +v -0.661134 7.179738 -5.072088 +v -1.310831 7.148952 -4.984406 +v -1.874190 7.433512 -4.804419 +v -2.063159 7.759437 -3.952072 +v -2.069095 8.388411 -3.764724 +v -1.757837 8.960695 -3.685036 +v -1.212785 9.322950 -3.734362 +v -0.579987 9.378108 -3.899486 +v -0.028998 9.111389 -4.136161 +v 0.292542 8.594261 -4.380973 +v 0.298479 7.965288 -4.568326 +v -0.012780 7.393002 -4.648014 +v -0.557831 7.030746 -4.598685 +v -1.190630 6.975590 -4.433561 +v -1.741619 7.242309 -4.196887 +v -1.844306 7.590673 -3.338675 +v -1.857470 8.225222 -3.171584 +v -1.565959 8.812735 -3.147242 +v -1.047882 9.195790 -3.272174 +v -0.442058 9.271749 -3.512903 +v 0.089183 9.020257 -3.804926 +v 0.403496 8.508702 -4.069994 +v 0.416660 7.874156 -4.237087 +v 0.125149 7.286643 -4.261428 +v -0.392928 6.903585 -4.136497 +v -0.998752 6.827629 -3.895768 +v -1.529993 7.079121 -3.603745 +v -1.547442 7.453773 -2.750655 +v -1.570410 8.092841 -2.602985 +v -1.305685 8.692706 -2.631700 +v -0.824199 9.092636 -2.829109 +v -0.254965 9.185469 -3.142314 +v 0.249490 8.946329 -3.487394 +v 0.553999 8.439297 -3.771885 +v 0.576967 7.800228 -3.919555 +v 0.312242 7.200362 -3.890841 +v -0.169245 6.800433 -3.693434 +v -0.738479 6.707601 -3.380226 +v -1.242934 6.946740 -3.035146 +v -1.177650 7.351073 -2.198081 +v -1.212831 7.993533 -2.068659 +v -0.981472 8.602665 -2.147233 +v -0.545564 9.015253 -2.412749 +v -0.021910 9.120744 -2.794063 +v 0.449179 8.890871 -3.189002 +v 0.741475 8.387230 -3.491742 +v 0.776656 7.744770 -3.621162 +v 0.545297 7.135638 -3.542589 +v 0.109390 6.723051 -3.277072 +v -0.414265 6.617559 -2.895761 +v -0.885355 6.847432 -2.500820 +v -0.741255 7.284333 -1.690403 +v -0.790849 7.928998 -1.577747 +v -0.598866 8.544151 -1.702129 +v -0.216746 8.964966 -2.030219 +v 0.253120 9.078682 -2.474107 +v 0.684834 8.854832 -2.914854 +v 0.962717 8.353395 -3.234361 +v 1.012311 7.708731 -3.347014 +v 0.820327 7.093575 -3.222633 +v 0.438208 6.672763 -2.894542 +v -0.031659 6.559046 -2.450655 +v -0.463372 6.782896 -2.009908 +v -0.245723 7.254695 -1.236305 +v -0.311682 7.900338 -1.138646 +v -0.164410 8.518167 -1.304001 +v 0.156632 8.942633 -1.688062 +v 0.565421 9.060003 -2.187920 +v 0.952423 8.838827 -2.669639 +v 1.213940 8.338368 -3.004143 +v 1.279900 7.692725 -3.101800 +v 1.132628 7.074897 -2.936445 +v 0.811586 6.650431 -2.552387 +v 0.402797 6.533061 -2.052526 +v 0.015795 6.754237 -1.570807 +v 0.300467 7.262665 -0.843559 +v 0.216469 7.908045 -0.758872 +v 0.314459 8.525154 -0.959663 +v 0.568180 8.948639 -1.392133 +v 0.909648 9.065026 -1.940399 +v 1.247367 8.843131 -2.457555 +v 1.490846 8.342409 -2.805031 +v 1.574844 7.697030 -2.889716 +v 1.476855 7.079920 -2.688926 +v 1.223134 6.656436 -2.256456 +v 0.881666 6.540049 -1.708189 +v 0.543946 6.761944 -1.191033 +v 0.887967 7.308108 -0.518888 +v 0.784566 7.951987 -0.444923 +v 0.829546 8.564996 -0.675010 +v 1.010854 8.982880 -1.147496 +v 1.279910 9.093666 -1.735780 +v 1.564619 8.867670 -2.282232 +v 1.788695 8.365448 -2.640430 +v 1.892096 7.721569 -2.714392 +v 1.847116 7.108560 -2.484308 +v 1.665808 6.690677 -2.011819 +v 1.396752 6.579890 -1.423535 +v 1.112043 6.805885 -0.877086 +v 1.506727 7.390245 -0.267843 +v 1.382890 8.031411 -0.202170 +v 1.372039 8.637009 -0.454908 +v 1.477082 9.044768 -0.958337 +v 1.669872 9.145432 -1.577564 +v 1.898751 8.912024 -2.146667 +v 2.102391 8.407089 -2.513156 +v 2.226228 7.765923 -2.578830 +v 2.237078 7.160326 -2.326089 +v 2.132036 6.752566 -1.822660 +v 1.939246 6.651903 -1.203434 +v 1.710367 6.885310 -0.634332 +v 2.146163 7.507672 -0.094721 +v 2.001208 8.144960 -0.034765 +v 1.932662 8.739963 -0.303124 +v 1.958890 9.133248 -0.827891 +v 2.072865 9.219438 -1.468457 +v 2.244049 8.975435 -2.053181 +v 2.426571 8.466622 -2.425387 +v 2.571526 7.829334 -2.485343 +v 2.640072 7.234332 -2.216982 +v 2.613844 6.841046 -1.692214 +v 2.499868 6.754857 -1.051649 +v 2.328685 6.998859 -0.466927 +v 2.795326 7.658379 -0.002485 +v 2.628932 8.290689 0.054425 +v 2.501812 8.872094 -0.222256 +v 2.448027 9.246804 -0.758392 +v 2.481989 9.314418 -1.410327 +v 2.594599 9.056818 -2.003373 +v 2.755682 8.543027 -2.378625 +v 2.922076 7.910716 -2.435536 +v 3.049196 7.329312 -2.158854 +v 3.102981 6.954602 -1.622716 +v 3.069018 6.886988 -0.970784 +v 2.956409 7.144588 -0.377738 +v 3.443114 7.839787 0.007288 +v 3.255325 8.466106 0.063875 +v 3.069756 9.031142 -0.213688 +v 2.936127 9.383493 -0.751029 +v 2.890246 9.428747 -1.404168 +v 2.944406 9.154778 -1.998095 +v 3.084095 8.634996 -2.373671 +v 3.271883 8.008677 -2.430258 +v 3.457453 7.443642 -2.152694 +v 3.591081 7.091290 -1.615353 +v 3.636962 7.046037 -0.962216 +v 3.582802 7.320005 -0.368287 +v 4.078442 8.048793 -0.065570 +v 3.869670 8.668210 -0.006577 +v 3.626775 9.214387 -0.277566 +v 3.414839 9.540977 -0.805926 +v 3.290650 9.560470 -1.450085 +v 3.287485 9.267642 -2.037439 +v 3.406191 8.740957 -2.410608 +v 3.614962 8.121541 -2.469601 +v 3.857857 7.575364 -2.198611 +v 4.069793 7.248774 -1.670251 +v 4.193982 7.229281 -1.026094 +v 4.197147 7.522108 -0.438739 +v 4.690443 8.281821 -0.219812 +v 4.461460 8.893542 -0.155725 +v 4.163344 9.418694 -0.412797 +v 3.875975 9.716561 -0.922146 +v 3.676353 9.707332 -1.547294 +v 3.617968 9.393478 -2.120730 +v 3.716462 8.859097 -2.488805 +v 3.945445 8.247377 -2.552893 +v 4.243560 7.722226 -2.295820 +v 4.530930 7.424358 -1.786471 +v 4.730551 7.433588 -1.161325 +v 4.788938 7.747441 -0.587887 +v 5.268639 8.534883 -0.452799 +v 5.020560 9.138246 -0.381017 +v 4.670274 9.640563 -0.617066 +v 4.311639 9.907240 -1.097699 +v 4.040751 9.866819 -1.694129 +v 3.930195 9.530132 -2.246544 +v 4.009593 8.987394 -2.606924 +v 4.257672 8.384031 -2.678707 +v 4.607958 7.881713 -2.442657 +v 4.966593 7.615037 -1.962024 +v 5.237481 7.655457 -1.365594 +v 5.348037 7.992145 -0.813180 +v 5.803140 8.803648 -0.760544 +v 5.537408 9.398135 -0.678598 +v 5.138895 9.876202 -0.886880 +v 4.714379 10.109752 -1.329582 +v 4.377611 10.036203 -1.888080 +v 4.218827 9.675266 -2.412727 +v 4.280573 9.123652 -2.762944 +v 4.546304 8.529165 -2.844890 +v 4.944818 8.051098 -2.636608 +v 5.369333 7.817549 -2.193907 +v 5.706101 7.891096 -1.635408 +v 5.864885 8.252033 -1.110761 +v 6.284803 9.083522 -1.137785 +v 6.003165 9.668765 -1.043380 +v 5.561191 10.121579 -1.217624 +v 5.077308 10.320633 -1.613828 +v 4.681171 10.212589 -2.125829 +v 4.478927 9.826399 -2.616438 +v 4.524765 9.265541 -2.954196 +v 4.806404 8.680297 -3.048601 +v 5.248378 8.227484 -2.874357 +v 5.732262 8.028430 -2.478153 +v 6.128397 8.136474 -1.966151 +v 6.330642 8.522664 -1.475543 +v 6.705382 9.369710 -1.578060 +v 6.409853 9.945501 -1.469115 +v 5.929930 10.372493 -1.603633 +v 5.394208 10.536272 -1.945570 +v 4.946234 10.392954 -2.403305 +v 4.706040 9.980941 -2.854188 +v 4.737988 9.410632 -3.177405 +v 5.033518 8.834840 -3.286351 +v 5.513441 8.407848 -3.151833 +v 6.049162 8.244069 -2.809895 +v 6.497137 8.387387 -2.352160 +v 6.737330 8.799400 -1.901277 +v 7.057683 9.657318 -2.073841 +v 6.750519 10.223611 -1.948521 +v 6.238808 10.624652 -2.038306 +v 5.659663 10.752981 -2.319136 +v 5.168265 10.574214 -2.715762 +v 4.896284 10.136250 -3.121911 +v 4.916597 9.556442 -3.428755 +v 5.223761 8.990149 -3.554074 +v 5.735472 8.589108 -3.464290 +v 6.314617 8.460779 -3.183461 +v 6.806015 8.639546 -2.786833 +v 7.077995 9.077510 -2.380684 +v 7.335679 9.941425 -2.616643 +v 7.019333 10.498336 -2.473397 +v 6.482539 10.873741 -2.514204 +v 5.869129 10.967053 -2.728130 +v 5.343467 10.753268 -3.057854 +v 5.046403 10.289669 -3.415026 +v 5.057534 9.700479 -3.703943 +v 5.373879 9.143568 -3.847189 +v 5.910674 8.768162 -3.806382 +v 6.524083 8.674850 -3.592455 +v 7.049746 8.888636 -3.262732 +v 7.346810 9.352234 -2.905560 +v 7.534613 10.217173 -3.197185 +v 7.211698 10.764977 -3.034765 +v 6.656954 11.115501 -3.023191 +v 6.019024 11.174826 -3.165562 +v 5.468842 10.927053 -3.423730 +v 5.153828 10.438574 -3.728520 +v 5.158389 9.840276 -3.998264 +v 5.481305 9.292473 -4.160681 +v 6.036048 8.941947 -4.172256 +v 6.673978 8.882623 -4.029884 +v 7.224160 9.130396 -3.771718 +v 7.539174 9.618875 -3.466928 +v 7.651079 10.479838 -3.805523 +v 7.324317 11.018967 -3.623012 +v 6.759065 11.345792 -3.556547 +v 6.106780 11.372741 -3.623937 +v 5.542243 11.092593 -3.807125 +v 5.216720 10.580414 -4.057025 +v 5.217435 9.973441 -4.306677 +v 5.544197 9.434313 -4.489185 +v 6.109449 9.107488 -4.555652 +v 6.761734 9.080538 -4.488260 +v 7.326271 9.360686 -4.305073 +v 7.651794 9.872866 -4.055175 +v 7.683086 10.724929 -4.431253 +v 7.355268 11.255963 -4.228078 +v 6.787127 11.560674 -4.105153 +v 6.130898 11.557414 -4.095418 +v 5.562415 11.247057 -4.201480 +v 5.234004 10.712764 -4.394921 +v 5.233663 10.097696 -4.623908 +v 5.561481 9.566663 -4.827084 +v 6.129622 9.261951 -4.950006 +v 6.785851 9.265211 -4.959743 +v 7.354334 9.575568 -4.853681 +v 7.682745 10.109861 -4.660240 +v 7.630087 10.948254 -5.063675 +v 7.304018 11.471912 -4.839612 +v 6.740661 11.756473 -4.659625 +v 6.090963 11.725687 -4.571940 +v 5.529013 11.387804 -4.600053 +v 5.205384 10.833360 -4.736430 +v 5.206793 10.210917 -4.944531 +v 5.532861 9.687259 -5.168593 +v 6.096220 9.402699 -5.348578 +v 6.745916 9.433484 -5.436265 +v 7.307867 9.771366 -5.408152 +v 7.631495 10.325810 -5.271774 +v 7.492989 11.145988 -5.691956 +v 7.171448 11.663116 -5.447144 +v 6.620460 11.929834 -5.210467 +v 5.987660 11.874677 -5.045343 +v 5.442609 11.512423 -4.996017 +v 5.131351 10.940137 -5.075705 +v 5.137287 10.311163 -5.263055 +v 5.458827 9.794035 -5.507867 +v 6.009815 9.527316 -5.744544 +v 6.642614 9.582474 -5.909668 +v 7.187666 9.944729 -5.958995 +v 7.498924 10.517015 -5.879307 +vn 0.7635 0.5969 -0.2465 +vn 0.4259 0.9048 -0.0044 +vn -0.0266 0.9706 0.2394 +vn -0.4723 0.7755 0.4190 +vn -0.7908 0.3722 0.4859 +vn -0.8970 -0.1299 0.4226 +vn -0.7635 -0.5969 0.2465 +vn -0.4259 -0.9048 0.0044 +vn 0.0266 -0.9706 -0.2394 +vn 0.4723 -0.7755 -0.4190 +vn 0.7908 -0.3722 -0.4859 +vn 0.8970 0.1299 -0.4226 +vn 0.7008 0.6194 -0.3539 +vn 0.3799 0.9213 -0.0830 +vn -0.0434 0.9766 0.2106 +vn -0.4555 0.7694 0.4478 +vn -0.7448 0.3557 0.5646 +vn -0.8342 -0.1524 0.5299 +vn -0.7008 -0.6194 0.3539 +vn -0.3799 -0.9213 0.0830 +vn 0.0434 -0.9766 -0.2106 +vn 0.4555 -0.7694 -0.4478 +vn 0.7448 -0.3557 -0.5646 +vn 0.8342 0.1524 -0.5299 +vn 0.6249 0.6354 -0.4536 +vn 0.3243 0.9330 -0.1561 +vn -0.0638 0.9809 0.1838 +vn -0.4351 0.7651 0.4746 +vn -0.6892 0.3440 0.6377 +vn -0.7583 -0.1684 0.6297 +vn -0.6249 -0.6354 0.4536 +vn -0.3243 -0.9330 0.1562 +vn 0.0638 -0.9809 -0.1838 +vn 0.4351 -0.7651 -0.4746 +vn 0.6892 -0.3440 -0.6377 +vn 0.7583 0.1684 -0.6297 +vn 0.5372 0.6444 -0.5442 +vn 0.2601 0.9396 -0.2225 +vn -0.0873 0.9833 0.1595 +vn -0.4116 0.7627 0.4989 +vn -0.6250 0.3374 0.7040 +vn -0.6706 -0.1775 0.7202 +vn -0.5372 -0.6444 0.5442 +vn -0.2601 -0.9396 0.2225 +vn 0.0873 -0.9833 -0.1595 +vn 0.4116 -0.7627 -0.4989 +vn 0.6249 -0.3374 -0.7040 +vn 0.6706 0.1775 -0.7202 +vn 0.4392 0.6465 -0.6239 +vn 0.1882 0.9411 -0.2809 +vn -0.1136 0.9839 0.1381 +vn -0.3852 0.7622 0.5203 +vn -0.5531 0.3359 0.7624 +vn -0.5726 -0.1795 0.7999 +vn -0.4392 -0.6465 0.6239 +vn -0.1882 -0.9411 0.2809 +vn 0.1136 -0.9839 -0.1381 +vn 0.3852 -0.7622 -0.5203 +vn 0.5531 -0.3359 -0.7624 +vn 0.5726 0.1795 -0.7999 +vn 0.3325 0.6414 -0.6914 +vn 0.1101 0.9374 -0.3304 +vn -0.1423 0.9825 0.1200 +vn -0.3566 0.7635 0.5384 +vn -0.4749 0.3396 0.8119 +vn -0.4659 -0.1745 0.8675 +vn -0.3325 -0.6414 0.6914 +vn -0.1101 -0.9374 0.3303 +vn 0.1423 -0.9825 -0.1200 +vn 0.3566 -0.7635 -0.5384 +vn 0.4749 -0.3396 -0.8119 +vn 0.4659 0.1745 -0.8675 +vn 0.2189 0.6294 -0.7456 +vn 0.0269 0.9286 -0.3701 +vn -0.1728 0.9793 0.1054 +vn -0.3261 0.7667 0.5530 +vn -0.3917 0.3484 0.8516 +vn -0.3524 -0.1625 0.9217 +vn -0.2189 -0.6294 0.7456 +vn -0.0269 -0.9286 0.3701 +vn 0.1728 -0.9793 -0.1054 +vn 0.3261 -0.7667 -0.5530 +vn 0.3917 -0.3484 -0.8516 +vn 0.3524 0.1625 -0.9217 +vn 0.1005 0.6107 -0.7855 +vn -0.0599 0.9149 -0.3993 +vn -0.2046 0.9743 0.0947 +vn -0.2943 0.7718 0.5637 +vn -0.3050 0.3621 0.8808 +vn -0.2340 -0.1437 0.9616 +vn -0.1005 -0.6107 0.7855 +vn 0.0599 -0.9149 0.3993 +vn 0.2046 -0.9743 -0.0947 +vn 0.2943 -0.7718 -0.5637 +vn 0.3050 -0.3621 -0.8808 +vn 0.2340 0.1437 -0.9616 +vn -0.0208 0.5854 -0.8105 +vn -0.1488 0.8964 -0.4176 +vn -0.2371 0.9675 0.0880 +vn -0.2618 0.7785 0.5704 +vn -0.2161 0.3806 0.8991 +vn -0.1127 -0.1184 0.9865 +vn 0.0208 -0.5854 0.8105 +vn 0.1488 -0.8964 0.4176 +vn 0.2371 -0.9675 -0.0880 +vn 0.2618 -0.7785 -0.5704 +vn 0.2161 -0.3806 -0.8991 +vn 0.1127 0.1184 -0.9865 +vn -0.1428 0.5542 -0.8201 +vn -0.2382 0.8735 -0.4246 +vn -0.2699 0.9591 0.0854 +vn -0.2290 0.7869 0.5730 +vn -0.1267 0.4035 0.9062 +vn 0.0094 -0.0872 0.9961 +vn 0.1428 -0.5542 0.8201 +vn 0.2382 -0.8735 0.4246 +vn 0.2699 -0.9591 -0.0854 +vn 0.2290 -0.7869 -0.5730 +vn 0.1267 -0.4035 -0.9062 +vn -0.0094 0.0872 -0.9961 +vn -0.2636 0.5174 -0.8141 +vn -0.3267 0.8465 -0.4203 +vn -0.3023 0.9492 0.0870 +vn -0.1966 0.7968 0.5714 +vn -0.0382 0.4305 0.9018 +vn 0.1302 -0.0504 0.9902 +vn 0.2636 -0.5174 0.8141 +vn 0.3267 -0.8465 0.4203 +vn 0.3023 -0.9492 -0.0870 +vn 0.1966 -0.7968 -0.5714 +vn 0.0382 -0.4305 -0.9018 +vn -0.1302 0.0504 -0.9902 +vn -0.3810 0.4758 -0.7928 +vn -0.4127 0.8161 -0.4046 +vn -0.3338 0.9381 0.0927 +vn -0.1651 0.8080 0.5656 +vn 0.0478 0.4609 0.8861 +vn 0.2475 -0.0088 0.9688 +vn 0.3810 -0.4758 0.7928 +vn 0.4127 -0.8161 0.4046 +vn 0.3338 -0.9381 -0.0927 +vn 0.1651 -0.8080 -0.5656 +vn -0.0478 -0.4609 -0.8861 +vn -0.2475 0.0088 -0.9688 +vn -0.4930 0.4301 -0.7563 +vn -0.4948 0.7825 -0.3779 +vn -0.3639 0.9258 0.1025 +vn -0.1350 0.8202 0.5559 +vn 0.1299 0.4945 0.8594 +vn 0.3596 0.0369 0.9324 +vn 0.4930 -0.4301 0.7563 +vn 0.4948 -0.7825 0.3779 +vn 0.3639 -0.9258 -0.1025 +vn 0.1350 -0.8202 -0.5559 +vn -0.1299 -0.4945 -0.8594 +vn -0.3596 -0.0369 -0.9324 +vn -0.5977 0.3810 -0.7054 +vn -0.5715 0.7466 -0.3406 +vn -0.3920 0.9126 0.1162 +vn -0.1069 0.8334 0.5422 +vn 0.2066 0.5304 0.8222 +vn 0.4643 0.0860 0.8815 +vn 0.5977 -0.3810 0.7054 +vn 0.5715 -0.7466 0.3406 +vn 0.3920 -0.9126 -0.1162 +vn 0.1069 -0.8334 -0.5422 +vn -0.2066 -0.5304 -0.8222 +vn -0.4643 -0.0860 -0.8815 +vn -0.6933 0.3293 -0.6409 +vn -0.6416 0.7087 -0.2934 +vn -0.4177 0.8987 0.1335 +vn -0.0812 0.8473 0.5249 +vn 0.2767 0.5683 0.7749 +vn 0.5599 0.1377 0.8170 +vn 0.6933 -0.3293 0.6409 +vn 0.6416 -0.7087 0.2934 +vn 0.4177 -0.8987 -0.1335 +vn 0.0812 -0.8473 -0.5249 +vn -0.2767 -0.5683 -0.7749 +vn -0.5599 -0.1377 -0.8170 +vn -0.7783 0.2760 -0.5640 +vn -0.7038 0.6697 -0.2370 +vn -0.4405 0.8844 0.1541 +vn -0.0584 0.8616 0.5042 +vn 0.3389 0.6073 0.7185 +vn 0.6448 0.1909 0.7401 +vn 0.7783 -0.2760 0.5640 +vn 0.7038 -0.6697 0.2370 +vn 0.4405 -0.8844 -0.1541 +vn 0.0584 -0.8616 -0.5042 +vn -0.3389 -0.6073 -0.7185 +vn -0.6448 -0.1909 -0.7401 +vn -0.8510 0.2220 -0.4759 +vn -0.7571 0.6301 -0.1725 +vn -0.4600 0.8699 0.1778 +vn -0.0389 0.8761 0.4806 +vn 0.3922 0.6469 0.6540 +vn 0.7176 0.2449 0.6520 +vn 0.8510 -0.2220 0.4759 +vn 0.7571 -0.6301 0.1725 +vn 0.4600 -0.8699 -0.1778 +vn 0.0389 -0.8761 -0.4806 +vn -0.3922 -0.6469 -0.6540 +vn -0.7176 -0.2449 -0.6520 +vn -0.9103 0.1682 -0.3782 +vn -0.8006 0.5907 -0.1008 +vn -0.4759 0.8555 0.2040 +vn -0.0230 0.8905 0.4543 +vn 0.4357 0.6863 0.5824 +vn 0.7769 0.2987 0.5542 +vn 0.9103 -0.1682 0.3782 +vn 0.8006 -0.5907 0.1008 +vn 0.4759 -0.8555 -0.2040 +vn 0.0230 -0.8905 -0.4543 +vn -0.4357 -0.6863 -0.5824 +vn -0.7769 -0.2987 -0.5542 +vn -0.9552 0.1155 -0.2724 +vn -0.8335 0.5521 -0.0234 +vn -0.4880 0.8414 0.2324 +vn -0.0109 0.9047 0.4260 +vn 0.4686 0.7249 0.5049 +vn 0.8218 0.3514 0.4485 +vn 0.9552 -0.1155 0.2724 +vn 0.8335 -0.5521 0.0234 +vn 0.4880 -0.8414 -0.2324 +vn 0.0109 -0.9047 -0.4260 +vn -0.4686 -0.7249 -0.5049 +vn -0.8218 -0.3514 -0.4485 +vn -0.9849 0.0649 -0.1605 +vn -0.8552 0.5149 0.0586 +vn -0.4959 0.8277 0.2625 +vn -0.0030 0.9183 0.3959 +vn 0.4903 0.7620 0.4229 +vn 0.8515 0.4021 0.3366 +vn 0.9849 -0.0649 0.1605 +vn 0.8552 -0.5149 -0.0586 +vn 0.4959 -0.8277 -0.2625 +vn 0.0030 -0.9183 -0.3959 +vn -0.4903 -0.7620 -0.4229 +vn -0.8515 -0.4021 -0.3366 +vn -0.9989 0.0171 -0.0444 +vn -0.8655 0.4799 0.1437 +vn -0.4997 0.8149 0.2936 +vn 0.0008 0.9311 0.3647 +vn 0.5006 0.7971 0.3378 +vn 0.8654 0.4499 0.2205 +vn 0.9989 -0.0171 0.0444 +vn 0.8655 -0.4799 -0.1437 +vn 0.4997 -0.8149 -0.2936 +vn -0.0008 -0.9311 -0.3647 +vn -0.5006 -0.7971 -0.3378 +vn -0.8654 -0.4499 -0.2205 +vn -0.9969 -0.0270 0.0740 +vn -0.8640 0.4476 0.2305 +vn -0.4992 0.8031 0.3254 +vn 0.0003 0.9429 0.3330 +vn 0.4991 0.8294 0.2510 +vn 0.8635 0.4940 0.1021 +vn 0.9969 0.0270 -0.0740 +vn 0.8640 -0.4476 -0.2305 +vn 0.4992 -0.8031 -0.3254 +vn -0.0003 -0.9429 -0.3330 +vn -0.4991 -0.8294 -0.2510 +vn -0.8635 -0.4940 -0.1021 +vn -0.9790 -0.0666 0.1927 +vn -0.8509 0.4186 0.3174 +vn -0.4943 0.7924 0.3573 +vn -0.0045 0.9536 0.3011 +vn 0.4860 0.8584 0.1641 +vn 0.8456 0.5336 -0.0166 +vn 0.9790 0.0666 -0.1927 +vn 0.8509 -0.4186 -0.3174 +vn 0.4943 -0.7924 -0.3573 +vn 0.0045 -0.9536 -0.3011 +vn -0.4860 -0.8584 -0.1641 +vn -0.8456 -0.5336 0.0166 +vn -0.9455 -0.1011 0.3095 +vn -0.8264 0.3933 0.4030 +vn -0.4854 0.7832 0.3886 +vn -0.0135 0.9628 0.2697 +vn 0.4615 0.8837 0.0785 +vn 0.8121 0.5681 -0.1334 +vn 0.9455 0.1011 -0.3095 +vn 0.8264 -0.3933 -0.4030 +vn 0.4854 -0.7832 -0.3886 +vn 0.0135 -0.9628 -0.2697 +vn -0.4615 -0.8837 -0.0785 +vn -0.8121 -0.5681 0.1334 +vn 0.1101 0.9374 -0.3303 +vn 0.1301 -0.0504 0.9902 +vn -0.1301 0.0504 -0.9902 +vn -0.4959 0.8278 0.2625 +vn 0.4959 -0.8278 -0.2625 +vn 0.4991 -0.8031 -0.3254 +vt 0.894502 0.573606 +vt 0.888785 0.589780 +vt 0.867121 0.584938 +vt 0.872649 0.569298 +vt 0.878144 0.000000 +vt 0.893206 0.010366 +vt 0.876283 0.022721 +vt 0.862626 0.013322 +vt 0.862930 0.040751 +vt 0.851193 0.032673 +vt 0.856725 0.059626 +vt 0.846908 0.052870 +vt 0.589026 0.825583 +vt 0.591436 0.837220 +vt 0.571711 0.845203 +vt 0.569646 0.835233 +vt 0.549498 0.847475 +vt 0.547559 0.838114 +vt 0.645039 0.936725 +vt 0.647759 0.944985 +vt 0.625995 0.949359 +vt 0.623097 0.940561 +vt 0.607536 0.961309 +vt 0.604154 0.951041 +vt 0.060074 0.715889 +vt 0.050812 0.722948 +vt 0.035680 0.706329 +vt 0.046753 0.697889 +vt 0.787928 0.405116 +vt 0.777265 0.418187 +vt 0.761367 0.404542 +vt 0.773775 0.389333 +vt 0.743019 0.391953 +vt 0.756704 0.375179 +vt 0.727135 0.383793 +vt 0.741287 0.366446 +vt 0.882463 0.603674 +vt 0.861007 0.598373 +vt 0.906955 0.023210 +vt 0.888749 0.034366 +vt 0.873644 0.050759 +vt 0.865686 0.067997 +vt 0.593281 0.849888 +vt 0.573292 0.856058 +vt 0.550982 0.857666 +vt 0.532329 0.854281 +vt 0.530748 0.843427 +vt 0.068716 0.732833 +vt 0.061659 0.740213 +vt 0.042576 0.731561 +vt 0.025833 0.716626 +vt 0.767913 0.432549 +vt 0.750486 0.421253 +vt 0.731018 0.410384 +vt 0.714724 0.402853 +vt 0.923382 0.020280 +vt 0.936000 0.035897 +vt 0.919156 0.038310 +vt 0.899812 0.048057 +vt 0.883151 0.062526 +vt 0.873638 0.077839 +vt 0.594528 0.863371 +vt 0.574361 0.867610 +vt 0.551985 0.868512 +vt 0.533398 0.865834 +vt 0.055602 0.748798 +vt 0.035507 0.741581 +vt 0.017381 0.728605 +vt 0.760034 0.447956 +vt 0.741317 0.439181 +vt 0.720905 0.430157 +vt 0.704266 0.423301 +vt 0.946801 0.053580 +vt 0.929601 0.055410 +vt 0.909282 0.063561 +vt 0.891290 0.075850 +vt 0.880446 0.088984 +vt 0.595157 0.877439 +vt 0.574900 0.879664 +vt 0.552491 0.879828 +vt 0.533937 0.877888 +vt 0.050647 0.758441 +vt 0.029724 0.752835 +vt 0.010467 0.742061 +vt 0.753760 0.464145 +vt 0.734018 0.458019 +vt 0.712855 0.450933 +vt 0.695941 0.444787 +vt 0.955601 0.073028 +vt 0.938110 0.074216 +vt 0.916997 0.080612 +vt 0.897921 0.090504 +vt 0.885991 0.101241 +vt 0.595157 0.891850 +vt 0.574900 0.892012 +vt 0.552491 0.891421 +vt 0.533937 0.890236 +vt 0.046880 0.768977 +vt 0.025328 0.765132 +vt 0.005211 0.756763 +vt 0.749201 0.480839 +vt 0.728713 0.477443 +vt 0.707004 0.472357 +vt 0.689890 0.466943 +vt 0.962249 0.093908 +vt 0.944538 0.094406 +vt 0.922826 0.098918 +vt 0.902929 0.106237 +vt 0.890181 0.114400 +vt 0.594528 0.906358 +vt 0.574361 0.904443 +vt 0.551985 0.903092 +vt 0.533398 0.902667 +vt 0.044365 0.780227 +vt 0.022393 0.778261 +vt 0.001702 0.772460 +vt 0.746434 0.497753 +vt 0.725494 0.497123 +vt 0.703453 0.494062 +vt 0.686218 0.489390 +vt 0.966631 0.115863 +vt 0.948775 0.115635 +vt 0.926667 0.118167 +vt 0.906231 0.122779 +vt 0.892943 0.128236 +vt 0.593281 0.920716 +vt 0.573292 0.916745 +vt 0.550982 0.914642 +vt 0.532329 0.914969 +vt 0.043145 0.791997 +vt 0.020969 0.791998 +vt -0.000000 0.788882 +vt 0.745507 0.514596 +vt 0.724414 0.516722 +vt 0.702263 0.515678 +vt 0.684987 0.511743 +vt 0.968672 0.138516 +vt 0.950749 0.137541 +vt 0.928457 0.138028 +vt 0.907769 0.139848 +vt 0.894229 0.142513 +vt 0.591436 0.934676 +vt 0.571711 0.928707 +vt 0.549498 0.925872 +vt 0.530748 0.926931 +vt 0.043242 0.804085 +vt 0.021082 0.806107 +vt 0.000135 0.805751 +vt 0.746434 0.531081 +vt 0.725494 0.535903 +vt 0.703453 0.536833 +vt 0.686218 0.533621 +vt 0.968337 0.161481 +vt 0.950425 0.159747 +vt 0.928163 0.158162 +vt 0.907517 0.157152 +vt 0.894018 0.156986 +vt 0.589026 0.948001 +vt 0.569646 0.940124 +vt 0.547559 0.936590 +vt 0.060677 0.800228 +vt 0.062002 0.811683 +vt 0.044653 0.816287 +vt 0.022728 0.820347 +vt 0.002103 0.822775 +vt 0.749201 0.546925 +vt 0.728713 0.554339 +vt 0.707004 0.557167 +vt 0.689890 0.554649 +vt 0.965632 0.184364 +vt 0.947810 0.181874 +vt 0.925792 0.178225 +vt 0.905479 0.174394 +vt 0.892313 0.171408 +vt 0.586092 0.960462 +vt 0.567132 0.950801 +vt 0.545199 0.946615 +vt 0.064538 0.823048 +vt 0.047354 0.828391 +vt 0.025881 0.834474 +vt 0.005872 0.839665 +vt 0.753760 0.561858 +vt 0.734018 0.571715 +vt 0.712855 0.576330 +vt 0.695941 0.574467 +vt 0.960604 0.206774 +vt 0.942947 0.203544 +vt 0.921383 0.197872 +vt 0.901690 0.191279 +vt 0.889144 0.185531 +vt 0.582684 0.971846 +vt 0.564212 0.960555 +vt 0.542457 0.955772 +vt 0.068242 0.834127 +vt 0.051299 0.840192 +vt 0.030485 0.848246 +vt 0.011377 0.856132 +vt 0.760034 0.575624 +vt 0.741317 0.587733 +vt 0.720905 0.593996 +vt 0.704266 0.592737 +vt 0.953338 0.228327 +vt 0.935921 0.224385 +vt 0.915013 0.216769 +vt 0.896215 0.207520 +vt 0.884565 0.199115 +vt 0.578860 0.981958 +vt 0.560936 0.969220 +vt 0.539381 0.963907 +vt 0.073050 0.844731 +vt 0.056421 0.851487 +vt 0.036462 0.861429 +vt 0.018523 0.871893 +vt 0.767913 0.587987 +vt 0.750486 0.602118 +vt 0.731018 0.609863 +vt 0.238589 0.958400 +vt 0.244703 0.944965 +vt 0.266367 0.949808 +vt 0.260045 0.963702 +vt 0.943958 0.248655 +vt 0.926851 0.244042 +vt 0.906789 0.234592 +vt 0.889148 0.222836 +vt 0.878654 0.211926 +vt 0.944439 0.487952 +vt 0.940836 0.477759 +vt 0.959549 0.466873 +vt 0.962636 0.475607 +vt 0.981402 0.462564 +vt 0.984301 0.470764 +vt 0.078881 0.854680 +vt 0.062631 0.862084 +vt 0.043711 0.873796 +vt 0.027189 0.886678 +vt 0.777265 0.598736 +vt 0.761368 0.614626 +vt 0.743019 0.623657 +vt 0.250231 0.929325 +vt 0.272084 0.933634 +vt 0.932626 0.267409 +vt 0.915893 0.262177 +vt 0.896854 0.251035 +vt 0.880609 0.236968 +vt 0.871511 0.223746 +vt 0.937676 0.466304 +vt 0.956841 0.457057 +vt 0.978860 0.453349 +vt 0.085634 0.863802 +vt 0.069824 0.871800 +vt 0.052106 0.885136 +vt 0.037226 0.900236 +vt 0.787928 0.607687 +vt 0.773775 0.625041 +vt 0.231518 0.918439 +vt 0.235914 0.902503 +vt 0.255079 0.911749 +vt 0.277098 0.915457 +vt 0.281323 0.895589 +vt 0.300156 0.893421 +vt 0.296071 0.912634 +vt 0.903234 0.278481 +vt 0.885376 0.265817 +vt 0.870744 0.249672 +vt 0.863261 0.234372 +vt 0.935013 0.453782 +vt 0.954560 0.446328 +vt 0.976719 0.443276 +vt 0.093195 0.871942 +vt 0.077877 0.880470 +vt 0.061504 0.895255 +vt 0.048463 0.912334 +vt 0.799721 0.614687 +vt 0.787497 0.633186 +vt 0.239617 0.885083 +vt 0.259164 0.892536 +vt 0.284686 0.874368 +vt 0.303408 0.872901 +vt 0.889091 0.292674 +vt 0.872552 0.278686 +vt 0.859724 0.260732 +vt 0.854043 0.243622 +vt 0.932894 0.440408 +vt 0.952744 0.434869 +vt 0.975014 0.432518 +vt 0.993736 0.433984 +vt 0.995552 0.445443 +vt 0.086652 0.887946 +vt 0.071745 0.903979 +vt 0.060706 0.922764 +vt 0.812442 0.619616 +vt 0.802299 0.638921 +vt 0.242566 0.866478 +vt 0.262416 0.872017 +vt 0.287130 0.852158 +vt 0.305772 0.851425 +vt 0.873705 0.304514 +vt 0.858602 0.289421 +vt 0.847735 0.269958 +vt 0.844015 0.251339 +vt 0.931353 0.426411 +vt 0.951424 0.422876 +vt 0.973774 0.421258 +vt 0.992416 0.421991 +vt 0.095998 0.894098 +vt 0.082653 0.911160 +vt 0.073747 0.931349 +vt 0.825872 0.622390 +vt 0.817926 0.642149 +vt 0.244709 0.847006 +vt 0.264780 0.850540 +vt 0.288614 0.829340 +vt 0.307206 0.829360 +vt 0.857340 0.313798 +vt 0.843764 0.297839 +vt 0.834983 0.277192 +vt 0.833349 0.257390 +vt 0.930418 0.412030 +vt 0.950623 0.410554 +vt 0.973022 0.409690 +vt 0.991615 0.409669 +vt 0.105756 0.898823 +vt 0.094041 0.916674 +vt 0.087363 0.937942 +vt 0.839783 0.622961 +vt 0.834112 0.642813 +vt 0.246010 0.827000 +vt 0.266214 0.828476 +vt 0.289111 0.806303 +vt 0.307687 0.807084 +vt 0.840277 0.320367 +vt 0.828293 0.303795 +vt 0.821687 0.282311 +vt 0.822228 0.261672 +vt 0.930105 0.397511 +vt 0.950354 0.398114 +vt 0.972770 0.398010 +vt 0.991346 0.397229 +vt 0.115759 0.902039 +vt 0.105716 0.920427 +vt 0.101320 0.942429 +vt 0.853936 0.621320 +vt 0.850580 0.640903 +vt 0.246446 0.806802 +vt 0.266695 0.806199 +vt 0.288614 0.783442 +vt 0.307206 0.784978 +vt 0.822806 0.324109 +vt 0.812452 0.307187 +vt 0.808073 0.285227 +vt 0.810841 0.264110 +vt 0.930418 0.383103 +vt 0.950623 0.385769 +vt 0.973022 0.386420 +vt 0.991615 0.384884 +vt 0.125762 0.898823 +vt 0.137476 0.916674 +vt 0.125802 0.920427 +vt 0.144155 0.937942 +vt 0.130197 0.942429 +vt 0.684987 0.939173 +vt 0.699140 0.940815 +vt 0.704811 0.960667 +vt 0.688343 0.958757 +vt 0.246010 0.786759 +vt 0.266214 0.784093 +vt 0.287130 0.761147 +vt 0.305772 0.763420 +vt 0.805227 0.324960 +vt 0.796514 0.307959 +vt 0.794375 0.285889 +vt 0.799384 0.264665 +vt 0.931353 0.369052 +vt 0.951424 0.373729 +vt 0.973774 0.375117 +vt 0.992416 0.372845 +vt 0.135520 0.894098 +vt 0.148865 0.911160 +vt 0.157770 0.931349 +vt 0.713051 0.940244 +vt 0.720997 0.960003 +vt 0.244709 0.767212 +vt 0.264780 0.762535 +vt 0.284686 0.739801 +vt 0.303408 0.742779 +vt 0.918673 0.929229 +vt 0.912806 0.917823 +vt 0.931278 0.905396 +vt 0.936598 0.915738 +vt 0.780750 0.306096 +vt 0.780827 0.284288 +vt 0.788052 0.263325 +vt 0.932894 0.355599 +vt 0.952744 0.362203 +vt 0.975014 0.364296 +vt 0.993736 0.361318 +vt 0.144866 0.887946 +vt 0.159773 0.903979 +vt 0.170811 0.922764 +vt 0.726481 0.937470 +vt 0.736624 0.956775 +vt 0.242566 0.748497 +vt 0.262416 0.741894 +vt 0.281323 0.719769 +vt 0.300156 0.723408 +vt 0.907577 0.904020 +vt 0.926537 0.892881 +vt 0.765430 0.301630 +vt 0.767661 0.280450 +vt 0.777040 0.260115 +vt 0.935013 0.342974 +vt 0.954560 0.351385 +vt 0.976719 0.354140 +vt 0.995552 0.350500 +vt 0.153640 0.880470 +vt 0.170013 0.895255 +vt 0.183055 0.912334 +vt 0.739202 0.932541 +vt 0.751426 0.951040 +vt 0.239617 0.730934 +vt 0.259164 0.722523 +vt 0.885644 0.907447 +vt 0.880988 0.890936 +vt 0.903075 0.888055 +vt 0.922455 0.878405 +vt 0.750817 0.294637 +vt 0.755103 0.274441 +vt 0.766536 0.255089 +vt 0.937676 0.331393 +vt 0.956841 0.341462 +vt 0.978860 0.344823 +vt 0.138323 0.871942 +vt 0.145884 0.863802 +vt 0.161693 0.871800 +vt 0.179412 0.885136 +vt 0.194291 0.900236 +vt 0.750995 0.925541 +vt 0.765148 0.942895 +vt 0.235914 0.714823 +vt 0.255079 0.704754 +vt 0.277098 0.701392 +vt 0.877164 0.872473 +vt 0.899377 0.870201 +vt 0.919102 0.862217 +vt 0.737161 0.285238 +vt 0.743366 0.266363 +vt 0.756719 0.248332 +vt 0.773642 0.235978 +vt 0.782053 0.241767 +vt 0.959549 0.332603 +vt 0.981402 0.336506 +vt 0.152637 0.854680 +vt 0.168887 0.862084 +vt 0.187807 0.873796 +vt 0.204329 0.886678 +vt 0.761658 0.916590 +vt 0.777555 0.932480 +vt 0.231518 0.700439 +vt 0.250231 0.688890 +vt 0.272084 0.684987 +vt 0.874237 0.852372 +vt 0.896547 0.850764 +vt 0.916536 0.844594 +vt 0.724694 0.273593 +vt 0.732652 0.256355 +vt 0.747758 0.239962 +vt 0.765963 0.228806 +vt 0.962636 0.324960 +vt 0.984301 0.329330 +vt 0.158468 0.844731 +vt 0.175097 0.851488 +vt 0.195055 0.861429 +vt 0.212994 0.871893 +vt 0.771010 0.905841 +vt 0.788437 0.919972 +vt 0.807905 0.927716 +vt 0.795904 0.941511 +vt 0.858414 0.868424 +vt 0.855584 0.848987 +vt 0.872258 0.830978 +vt 0.894633 0.830076 +vt 0.914801 0.825837 +vt 0.713632 0.259902 +vt 0.723145 0.244588 +vt 0.739806 0.230120 +vt 0.759150 0.220373 +vt 0.775994 0.217959 +vt 0.782391 0.225877 +vt 0.163276 0.834127 +vt 0.180219 0.840192 +vt 0.201033 0.848247 +vt 0.220141 0.856132 +vt 0.778889 0.893478 +vt 0.797606 0.905586 +vt 0.818018 0.911850 +vt 0.853670 0.828300 +vt 0.871259 0.808656 +vt 0.893668 0.808492 +vt 0.913925 0.806267 +vt 0.704162 0.244398 +vt 0.715006 0.231264 +vt 0.732998 0.218975 +vt 0.753317 0.210824 +vt 0.770518 0.208994 +vt 0.166980 0.823048 +vt 0.184164 0.828391 +vt 0.205637 0.834474 +vt 0.225646 0.839665 +vt 0.785163 0.879712 +vt 0.804905 0.889569 +vt 0.826068 0.894184 +vt 0.852705 0.806716 +vt 0.871259 0.785790 +vt 0.893668 0.786380 +vt 0.913925 0.786218 +vt 0.696447 0.227347 +vt 0.708376 0.216610 +vt 0.727452 0.206718 +vt 0.748565 0.200322 +vt 0.766056 0.199135 +vt 0.169516 0.811683 +vt 0.186865 0.816287 +vt 0.208790 0.820347 +vt 0.229415 0.822775 +vt 0.789722 0.864779 +vt 0.810210 0.872193 +vt 0.831919 0.875020 +vt 0.852705 0.784604 +vt 0.872258 0.762769 +vt 0.894633 0.764120 +vt 0.914801 0.766035 +vt 0.690618 0.209040 +vt 0.703367 0.200877 +vt 0.723263 0.193559 +vt 0.744975 0.189047 +vt 0.762686 0.188549 +vt 0.170840 0.800228 +vt 0.188276 0.804085 +vt 0.210436 0.806107 +vt 0.231383 0.805751 +vt 0.792489 0.848934 +vt 0.813429 0.853757 +vt 0.835470 0.854687 +vt 0.853670 0.762344 +vt 0.874237 0.739988 +vt 0.896547 0.742092 +vt 0.916536 0.746062 +vt 0.686777 0.189792 +vt 0.700065 0.184335 +vt 0.720501 0.179723 +vt 0.742609 0.177191 +vt 0.760465 0.177419 +vt 0.170931 0.788879 +vt 0.188372 0.791997 +vt 0.210549 0.791998 +vt 0.231518 0.788883 +vt 0.793416 0.832450 +vt 0.814509 0.834576 +vt 0.836660 0.833531 +vt 0.855584 0.740315 +vt 0.877164 0.717837 +vt 0.899377 0.720672 +vt 0.919102 0.726641 +vt 0.684987 0.169931 +vt 0.698527 0.167266 +vt 0.719215 0.165446 +vt 0.741507 0.164958 +vt 0.759430 0.165934 +vt 0.169786 0.777829 +vt 0.187153 0.780227 +vt 0.209125 0.778261 +vt 0.229816 0.772460 +vt 0.792489 0.815606 +vt 0.813429 0.814977 +vt 0.835470 0.811916 +vt 0.858414 0.718896 +vt 0.880988 0.696694 +vt 0.903075 0.700228 +vt 0.922455 0.708105 +vt 0.685281 0.149797 +vt 0.698779 0.149962 +vt 0.719426 0.150973 +vt 0.741688 0.152557 +vt 0.759600 0.154291 +vt 0.167425 0.767267 +vt 0.184638 0.768977 +vt 0.206190 0.765132 +vt 0.226307 0.756763 +vt 0.789722 0.798693 +vt 0.810210 0.795297 +vt 0.831919 0.790211 +vt 0.849033 0.784797 +vt 0.852705 0.807243 +vt 0.885644 0.676922 +vt 0.907577 0.681109 +vt 0.926537 0.690770 +vt 0.687652 0.129734 +vt 0.700817 0.132720 +vt 0.721130 0.136551 +vt 0.743148 0.140200 +vt 0.760971 0.142690 +vt 0.163888 0.757375 +vt 0.180871 0.758441 +vt 0.201794 0.752835 +vt 0.221051 0.742061 +vt 0.785163 0.781999 +vt 0.804905 0.775872 +vt 0.826068 0.768787 +vt 0.842982 0.762641 +vt 0.891051 0.658859 +vt 0.912806 0.663642 +vt 0.931278 0.674933 +vt 0.692061 0.110086 +vt 0.704606 0.115835 +vt 0.724300 0.122428 +vt 0.745864 0.128099 +vt 0.763520 0.131329 +vt 0.159236 0.748322 +vt 0.175916 0.748798 +vt 0.196011 0.741581 +vt 0.214137 0.728605 +vt 0.778889 0.765810 +vt 0.797606 0.757035 +vt 0.818018 0.748011 +vt 0.834657 0.741155 +vt 0.897119 0.642813 +vt 0.918673 0.648126 +vt 0.936598 0.660865 +vt 0.698431 0.091190 +vt 0.710081 0.099594 +vt 0.728879 0.108844 +vt 0.749787 0.116460 +vt 0.767204 0.120402 +vt 0.650812 0.803585 +vt 0.647759 0.810696 +vt 0.625995 0.806322 +vt 0.629247 0.798747 +vt 0.169858 0.740213 +vt 0.188941 0.731561 +vt 0.205685 0.716626 +vt 0.771010 0.750402 +vt 0.788437 0.739107 +vt 0.807905 0.728238 +vt 0.824199 0.720707 +vt 0.894503 0.324960 +vt 0.899516 0.341365 +vt 0.877497 0.344726 +vt 0.872649 0.328863 +vt 0.858332 0.354795 +vt 0.853936 0.340412 +vt 0.706655 0.073367 +vt 0.717149 0.084278 +vt 0.734790 0.096033 +vt 0.754852 0.105483 +vt 0.771959 0.110096 +vt 0.645039 0.818957 +vt 0.623097 0.815121 +vt 0.162802 0.732833 +vt 0.180705 0.722948 +vt 0.195838 0.706329 +vt 0.761658 0.736041 +vt 0.777555 0.722396 +vt 0.795904 0.709807 +vt 0.811788 0.701646 +vt 0.903741 0.359741 +vt 0.881582 0.362496 +vt 0.862036 0.370906 +vt 0.716590 0.056924 +vt 0.725688 0.070146 +vt 0.741932 0.084213 +vt 0.760972 0.095355 +vt 0.777704 0.100588 +vt 0.642696 0.828224 +vt 0.620602 0.824992 +vt 0.601242 0.816162 +vt 0.604154 0.804641 +vt 0.171444 0.715889 +vt 0.184765 0.697889 +vt 0.750995 0.722970 +vt 0.765148 0.707187 +vt 0.782219 0.693033 +vt 0.797636 0.684300 +vt 0.907104 0.379774 +vt 0.884834 0.381867 +vt 0.864984 0.388470 +vt 0.728068 0.042142 +vt 0.735552 0.057442 +vt 0.750183 0.073587 +vt 0.768041 0.086251 +vt 0.661604 0.824992 +vt 0.659554 0.835768 +vt 0.640772 0.838341 +vt 0.618553 0.835768 +vt 0.598850 0.828738 +vt 0.161316 0.710505 +vt 0.172656 0.691451 +vt 0.739202 0.711414 +vt 0.751426 0.693741 +vt 0.767085 0.678203 +vt 0.781984 0.668963 +vt 0.909548 0.401120 +vt 0.887198 0.402508 +vt 0.867127 0.407185 +vt 0.740892 0.029273 +vt 0.746573 0.046382 +vt 0.759401 0.064336 +vt 0.775940 0.078325 +vt 0.657986 0.847264 +vt 0.639300 0.849134 +vt 0.616985 0.847264 +vt 0.597020 0.842155 +vt 0.150494 0.706887 +vt 0.159718 0.687126 +vt 0.726481 0.701571 +vt 0.736624 0.682287 +vt 0.750761 0.665571 +vt 0.925826 0.382752 +vt 0.928190 0.403393 +vt 0.911032 0.423414 +vt 0.888632 0.424066 +vt 0.868428 0.426731 +vt 0.754842 0.018538 +vt 0.758561 0.037156 +vt 0.769429 0.056620 +vt 0.784532 0.071713 +vt 0.656925 0.859283 +vt 0.638304 0.860418 +vt 0.615924 0.859283 +vt 0.595782 0.856182 +vt 0.139164 0.705098 +vt 0.146172 0.684987 +vt 0.713051 0.693609 +vt 0.720997 0.673023 +vt 0.733525 0.655353 +vt 0.929624 0.424951 +vt 0.911529 0.446275 +vt 0.889113 0.446172 +vt 0.868864 0.446775 +vt 0.769679 0.010120 +vt 0.771313 0.029922 +vt 0.780094 0.050569 +vt 0.793670 0.066528 +vt 0.656390 0.871619 +vt 0.637802 0.872000 +vt 0.615389 0.871619 +vt 0.595157 0.870580 +vt 0.127519 0.705168 +vt 0.132250 0.685071 +vt 0.699140 0.687664 +vt 0.704811 0.666105 +vt 0.715673 0.647723 +vt 0.930105 0.447057 +vt 0.911032 0.469312 +vt 0.888632 0.468448 +vt 0.868428 0.466972 +vt 0.785151 0.004164 +vt 0.784610 0.024803 +vt 0.791216 0.046287 +vt 0.803200 0.062859 +vt 0.656390 0.884062 +vt 0.637802 0.883682 +vt 0.615389 0.884062 +vt 0.595157 0.885102 +vt 0.115759 0.707096 +vt 0.118190 0.687376 +vt 0.684987 0.683838 +vt 0.688343 0.661654 +vt 0.697510 0.642813 +vt 0.929624 0.469333 +vt 0.909548 0.492131 +vt 0.887198 0.490513 +vt 0.867127 0.486978 +vt 0.800991 0.000771 +vt 0.798223 0.021887 +vt 0.802603 0.043848 +vt 0.812956 0.060770 +vt 0.656925 0.896399 +vt 0.638304 0.895264 +vt 0.615924 0.896399 +vt 0.595782 0.899500 +vt 0.103999 0.705168 +vt 0.099268 0.685071 +vt 0.113328 0.687376 +vt 0.853936 0.365984 +vt 0.839783 0.369810 +vt 0.834112 0.348252 +vt 0.850580 0.343800 +vt 0.823250 0.329870 +vt 0.841413 0.324960 +vt 0.928190 0.491398 +vt 0.907104 0.514340 +vt 0.884834 0.511989 +vt 0.864984 0.506450 +vt 0.816930 0.000000 +vt 0.811921 0.021225 +vt 0.814060 0.043294 +vt 0.822773 0.060295 +vt 0.657986 0.908418 +vt 0.639300 0.906548 +vt 0.616985 0.908418 +vt 0.597020 0.913527 +vt 0.092354 0.705098 +vt 0.085346 0.684987 +vt 0.825872 0.375755 +vt 0.817926 0.355169 +vt 0.805398 0.337499 +vt 0.925826 0.512874 +vt 0.903741 0.535561 +vt 0.881582 0.532509 +vt 0.862036 0.525055 +vt 0.832694 0.001863 +vt 0.825469 0.022826 +vt 0.825391 0.044633 +vt 0.578860 0.798747 +vt 0.582684 0.806181 +vt 0.564212 0.818608 +vt 0.560936 0.812239 +vt 0.659554 0.919913 +vt 0.640772 0.917340 +vt 0.618553 0.919913 +vt 0.598850 0.926943 +vt 0.081024 0.706887 +vt 0.071800 0.687126 +vt 0.812442 0.383717 +vt 0.802299 0.364434 +vt 0.788162 0.347717 +vt 0.922574 0.533394 +vt 0.899516 0.555430 +vt 0.877497 0.551722 +vt 0.858332 0.542475 +vt 0.848013 0.006329 +vt 0.838635 0.026664 +vt 0.836404 0.047844 +vt 0.586092 0.815178 +vt 0.567132 0.826317 +vt 0.661604 0.930689 +vt 0.642696 0.927457 +vt 0.620602 0.930689 +vt 0.601242 0.939520 +vt 0.070202 0.710505 +vt 0.058862 0.691451 +vt 0.799721 0.393560 +vt 0.787497 0.375887 +vt 0.771838 0.360349 +vt 0.918489 0.552606 +vt 0.853936 0.558411 +vt 0.545199 0.829744 +vt 0.756938 0.351109 +s 1 +f 512/1068/502 524/1069/502 525/1070/502 513/1071/502 +f 513/1072/503 525/1073/503 526/1074/503 514/1075/503 +f 514/1075/504 526/1074/504 527/1076/504 515/1077/504 +f 515/1077/505 527/1076/505 528/1078/505 516/1079/505 +f 516/1080/506 528/1081/506 529/1082/506 517/1083/506 +f 517/1083/507 529/1082/507 530/1084/507 518/1085/507 +f 518/1086/508 530/1087/508 531/1088/508 519/1089/508 +f 519/1089/509 531/1088/509 532/1090/509 520/1091/509 +f 520/1092/510 532/1093/510 533/1094/510 521/1095/510 +f 521/1096/511 533/1097/511 534/1098/511 522/1099/511 +f 522/1099/512 534/1098/512 535/1100/512 523/1101/512 +f 523/1101/513 535/1100/513 524/1102/513 512/1103/513 +f 524/1069/514 536/1104/514 537/1105/514 525/1070/514 +f 525/1073/515 537/1106/515 538/1107/515 526/1074/515 +f 526/1074/516 538/1107/516 539/1108/516 527/1076/516 +f 527/1076/517 539/1108/517 540/1109/517 528/1078/517 +f 528/1081/518 540/1110/518 541/1111/518 529/1082/518 +f 529/1082/519 541/1111/519 542/1112/519 530/1084/519 +f 530/1084/520 542/1112/520 543/1113/520 531/1114/520 +f 531/1115/521 543/1116/521 544/1117/521 532/1093/521 +f 532/1093/522 544/1117/522 545/1118/522 533/1094/522 +f 533/1097/523 545/1119/523 546/1120/523 534/1098/523 +f 534/1098/524 546/1120/524 547/1121/524 535/1100/524 +f 535/1100/525 547/1121/525 536/1122/525 524/1102/525 +f 536/1123/526 548/1124/526 549/1125/526 537/1106/526 +f 537/1106/527 549/1125/527 550/1126/527 538/1107/527 +f 538/1107/528 550/1126/528 551/1127/528 539/1108/528 +f 539/1108/529 551/1127/529 552/1128/529 540/1109/529 +f 540/1110/530 552/1129/530 553/1130/530 541/1111/530 +f 541/1111/531 553/1130/531 554/1131/531 542/1112/531 +f 542/1112/532 554/1131/532 555/1132/532 543/1113/532 +f 543/1116/533 555/1133/533 556/1134/533 544/1117/533 +f 544/1117/534 556/1134/534 557/1135/534 545/1118/534 +f 545/1119/535 557/1136/535 558/1137/535 546/1120/535 +f 546/1120/536 558/1137/536 559/1138/536 547/1121/536 +f 547/1121/537 559/1138/537 548/1139/537 536/1122/537 +f 548/1124/538 560/1140/538 561/1141/538 549/1125/538 +f 549/1125/539 561/1141/539 562/1142/539 550/1126/539 +f 550/1126/540 562/1142/540 563/1143/540 551/1127/540 +f 551/1127/541 563/1143/541 564/1144/541 552/1128/541 +f 552/1129/542 564/1145/542 565/1146/542 553/1130/542 +f 553/1130/543 565/1146/543 566/1147/543 554/1131/543 +f 554/1131/544 566/1147/544 567/1148/544 555/1132/544 +f 555/1133/545 567/1149/545 568/1150/545 556/1134/545 +f 556/1134/546 568/1150/546 569/1151/546 557/1135/546 +f 557/1136/547 569/1152/547 570/1153/547 558/1137/547 +f 558/1137/548 570/1153/548 571/1154/548 559/1138/548 +f 559/1138/549 571/1154/549 560/1155/549 548/1139/549 +f 560/1140/550 572/1156/550 573/1157/550 561/1141/550 +f 561/1141/551 573/1157/551 574/1158/551 562/1142/551 +f 562/1142/552 574/1158/552 575/1159/552 563/1143/552 +f 563/1143/553 575/1159/553 576/1160/553 564/1144/553 +f 564/1145/554 576/1161/554 577/1162/554 565/1146/554 +f 565/1146/555 577/1162/555 578/1163/555 566/1147/555 +f 566/1147/556 578/1163/556 579/1164/556 567/1148/556 +f 567/1149/557 579/1165/557 580/1166/557 568/1150/557 +f 568/1150/558 580/1166/558 581/1167/558 569/1151/558 +f 569/1152/559 581/1168/559 582/1169/559 570/1153/559 +f 570/1153/560 582/1169/560 583/1170/560 571/1154/560 +f 571/1154/561 583/1170/561 572/1171/561 560/1155/561 +f 572/1156/562 584/1172/562 585/1173/562 573/1157/562 +f 573/1157/563 585/1173/563 586/1174/563 574/1158/563 +f 574/1158/564 586/1174/564 587/1175/564 575/1159/564 +f 575/1159/565 587/1175/565 588/1176/565 576/1160/565 +f 576/1161/566 588/1177/566 589/1178/566 577/1162/566 +f 577/1162/567 589/1178/567 590/1179/567 578/1163/567 +f 578/1163/568 590/1179/568 591/1180/568 579/1164/568 +f 579/1165/569 591/1181/569 592/1182/569 580/1166/569 +f 580/1166/570 592/1182/570 593/1183/570 581/1167/570 +f 581/1168/571 593/1184/571 594/1185/571 582/1169/571 +f 582/1169/572 594/1185/572 595/1186/572 583/1170/572 +f 583/1170/573 595/1186/573 584/1187/573 572/1171/573 +f 584/1172/574 596/1188/574 597/1189/574 585/1173/574 +f 585/1173/575 597/1189/575 598/1190/575 586/1174/575 +f 586/1174/576 598/1190/576 599/1191/576 587/1175/576 +f 587/1175/577 599/1191/577 600/1192/577 588/1176/577 +f 588/1177/578 600/1193/578 601/1194/578 589/1178/578 +f 589/1178/579 601/1194/579 602/1195/579 590/1179/579 +f 590/1179/580 602/1195/580 603/1196/580 591/1180/580 +f 591/1181/581 603/1197/581 604/1198/581 592/1182/581 +f 592/1182/582 604/1198/582 605/1199/582 593/1183/582 +f 593/1184/583 605/1200/583 606/1201/583 594/1185/583 +f 594/1185/584 606/1201/584 607/1202/584 595/1186/584 +f 595/1186/585 607/1202/585 596/1203/585 584/1187/585 +f 596/1188/586 608/1204/586 609/1205/586 597/1189/586 +f 597/1189/587 609/1205/587 610/1206/587 598/1190/587 +f 598/1190/588 610/1206/588 611/1207/588 599/1191/588 +f 599/1191/589 611/1207/589 612/1208/589 600/1192/589 +f 600/1193/590 612/1209/590 613/1210/590 601/1194/590 +f 601/1194/591 613/1210/591 614/1211/591 602/1195/591 +f 602/1195/592 614/1211/592 615/1212/592 603/1196/592 +f 603/1197/593 615/1213/593 616/1214/593 604/1198/593 +f 604/1198/594 616/1214/594 617/1215/594 605/1199/594 +f 605/1200/595 617/1216/595 618/1217/595 606/1201/595 +f 606/1201/596 618/1217/596 619/1218/596 607/1202/596 +f 607/1202/597 619/1218/597 608/1219/597 596/1203/597 +f 608/1204/598 620/1220/598 621/1221/598 609/1205/598 +f 609/1205/599 621/1221/599 622/1222/599 610/1206/599 +f 610/1206/600 622/1222/600 623/1223/600 611/1207/600 +f 611/1207/601 623/1223/601 624/1224/601 612/1208/601 +f 612/1209/602 624/1225/602 625/1226/602 613/1210/602 +f 613/1210/603 625/1226/603 626/1227/603 614/1211/603 +f 614/1228/604 626/1229/604 627/1230/604 615/1213/604 +f 615/1213/605 627/1230/605 628/1231/605 616/1214/605 +f 616/1214/606 628/1231/606 629/1232/606 617/1215/606 +f 617/1216/607 629/1233/607 630/1234/607 618/1217/607 +f 618/1217/608 630/1234/608 631/1235/608 619/1218/608 +f 619/1218/609 631/1235/609 620/1236/609 608/1219/609 +f 620/1220/610 632/1237/610 633/1238/610 621/1221/610 +f 621/1221/611 633/1238/611 634/1239/611 622/1222/611 +f 622/1222/612 634/1239/612 635/1240/612 623/1223/612 +f 623/1223/613 635/1240/613 636/1241/613 624/1224/613 +f 624/1225/614 636/1242/614 637/1243/614 625/1226/614 +f 625/1226/615 637/1243/615 638/1244/615 626/1227/615 +f 626/1229/616 638/1245/616 639/1246/616 627/1230/616 +f 627/1230/617 639/1246/617 640/1247/617 628/1231/617 +f 628/1231/618 640/1247/618 641/1248/618 629/1232/618 +f 629/1233/619 641/1249/619 642/1250/619 630/1234/619 +f 630/1234/620 642/1250/620 643/1251/620 631/1235/620 +f 631/1235/621 643/1251/621 632/1252/621 620/1236/621 +f 632/1237/622 644/1253/622 645/1254/622 633/1238/622 +f 633/1238/623 645/1254/623 646/1255/623 634/1239/623 +f 634/1239/624 646/1255/624 647/1256/624 635/1240/624 +f 635/1240/625 647/1256/625 648/1257/625 636/1241/625 +f 636/1242/626 648/1258/626 649/1259/626 637/1243/626 +f 637/1243/627 649/1259/627 650/1260/627 638/1244/627 +f 638/1245/628 650/1261/628 651/1262/628 639/1246/628 +f 639/1246/629 651/1262/629 652/1263/629 640/1247/629 +f 640/1247/630 652/1263/630 653/1264/630 641/1248/630 +f 641/1249/631 653/1265/631 654/1266/631 642/1250/631 +f 642/1250/632 654/1266/632 655/1267/632 643/1251/632 +f 643/1251/633 655/1267/633 644/1268/633 632/1252/633 +f 644/1253/634 656/1269/634 657/1270/634 645/1254/634 +f 645/1254/635 657/1270/635 658/1271/635 646/1255/635 +f 646/1255/636 658/1271/636 659/1272/636 647/1256/636 +f 647/1256/637 659/1272/637 660/1273/637 648/1257/637 +f 648/1258/638 660/1274/638 661/1275/638 649/1259/638 +f 649/1259/639 661/1275/639 662/1276/639 650/1260/639 +f 650/1261/640 662/1277/640 663/1278/640 651/1262/640 +f 651/1262/641 663/1278/641 664/1279/641 652/1263/641 +f 652/1263/642 664/1279/642 665/1280/642 653/1264/642 +f 653/1265/643 665/1281/643 666/1282/643 654/1266/643 +f 654/1266/644 666/1282/644 667/1283/644 655/1267/644 +f 655/1284/645 667/1285/645 656/1286/645 644/1287/645 +f 656/1269/646 668/1288/646 669/1289/646 657/1270/646 +f 657/1270/647 669/1289/647 670/1290/647 658/1271/647 +f 658/1271/648 670/1290/648 671/1291/648 659/1272/648 +f 659/1272/649 671/1291/649 672/1292/649 660/1273/649 +f 660/1293/650 672/1294/650 673/1295/650 661/1296/650 +f 661/1296/651 673/1295/651 674/1297/651 662/1298/651 +f 662/1277/652 674/1299/652 675/1300/652 663/1278/652 +f 663/1278/653 675/1300/653 676/1301/653 664/1279/653 +f 664/1279/654 676/1301/654 677/1302/654 665/1280/654 +f 665/1281/655 677/1303/655 678/1304/655 666/1282/655 +f 666/1282/656 678/1304/656 679/1305/656 667/1283/656 +f 667/1285/657 679/1306/657 668/1307/657 656/1286/657 +f 668/1288/658 680/1308/658 681/1309/658 669/1289/658 +f 669/1289/659 681/1309/659 682/1310/659 670/1290/659 +f 670/1290/660 682/1310/660 683/1311/660 671/1291/660 +f 671/1291/661 683/1311/661 684/1312/661 672/1292/661 +f 672/1294/662 684/1313/662 685/1314/662 673/1295/662 +f 673/1295/663 685/1314/663 686/1315/663 674/1297/663 +f 674/1299/664 686/1316/664 687/1317/664 675/1300/664 +f 675/1300/665 687/1317/665 688/1318/665 676/1301/665 +f 676/1301/666 688/1318/666 689/1319/666 677/1302/666 +f 677/1303/667 689/1320/667 690/1321/667 678/1304/667 +f 678/1322/668 690/1323/668 691/1324/668 679/1306/668 +f 679/1306/669 691/1324/669 680/1325/669 668/1307/669 +f 680/1325/670 692/1326/670 693/1327/670 681/1328/670 +f 681/1309/671 693/1329/671 694/1330/671 682/1310/671 +f 682/1310/672 694/1330/672 695/1331/672 683/1311/672 +f 683/1311/673 695/1331/673 696/1332/673 684/1312/673 +f 684/1313/674 696/1333/674 697/1334/674 685/1314/674 +f 685/1314/675 697/1334/675 698/1335/675 686/1315/675 +f 686/1316/676 698/1336/676 699/1337/676 687/1317/676 +f 687/1317/677 699/1337/677 700/1338/677 688/1318/677 +f 688/1318/678 700/1338/678 701/1339/678 689/1319/678 +f 689/1320/679 701/1340/679 702/1341/679 690/1321/679 +f 690/1323/680 702/1342/680 703/1343/680 691/1324/680 +f 691/1324/681 703/1343/681 692/1326/681 680/1325/681 +f 692/1326/682 704/1344/682 705/1345/682 693/1327/682 +f 693/1329/683 705/1346/683 706/1347/683 694/1330/683 +f 694/1330/684 706/1347/684 707/1348/684 695/1331/684 +f 695/1331/685 707/1348/685 708/1349/685 696/1332/685 +f 696/1333/686 708/1350/686 709/1351/686 697/1334/686 +f 697/1334/687 709/1351/687 710/1352/687 698/1335/687 +f 698/1335/688 710/1352/688 711/1353/688 699/1354/688 +f 699/1337/689 711/1355/689 712/1356/689 700/1338/689 +f 700/1338/690 712/1356/690 713/1357/690 701/1339/690 +f 701/1340/691 713/1358/691 714/1359/691 702/1341/691 +f 702/1342/692 714/1360/692 715/1361/692 703/1343/692 +f 703/1343/693 715/1361/693 704/1344/693 692/1326/693 +f 704/1344/694 716/1362/694 717/1363/694 705/1345/694 +f 705/1346/695 717/1364/695 718/1365/695 706/1347/695 +f 706/1347/696 718/1365/696 719/1366/696 707/1348/696 +f 707/1348/697 719/1366/697 720/1367/697 708/1349/697 +f 708/1350/698 720/1368/698 721/1369/698 709/1351/698 +f 709/1351/699 721/1369/699 722/1370/699 710/1352/699 +f 710/1352/700 722/1370/700 723/1371/700 711/1353/700 +f 711/1355/701 723/1372/701 724/1373/701 712/1356/701 +f 712/1356/702 724/1373/702 725/1374/702 713/1357/702 +f 713/1358/703 725/1375/703 726/1376/703 714/1359/703 +f 714/1360/704 726/1377/704 727/1378/704 715/1361/704 +f 715/1361/705 727/1378/705 716/1362/705 704/1344/705 +f 716/1362/706 728/1379/706 729/1380/706 717/1363/706 +f 717/1364/707 729/1381/707 730/1382/707 718/1365/707 +f 718/1365/708 730/1382/708 731/1383/708 719/1366/708 +f 719/1366/709 731/1383/709 732/1384/709 720/1367/709 +f 720/1368/710 732/1385/710 733/1386/710 721/1369/710 +f 721/1369/711 733/1386/711 734/1387/711 722/1370/711 +f 722/1370/712 734/1387/712 735/1388/712 723/1371/712 +f 723/1372/713 735/1389/713 736/1390/713 724/1373/713 +f 724/1373/714 736/1390/714 737/1391/714 725/1374/714 +f 725/1375/715 737/1392/715 738/1393/715 726/1376/715 +f 726/1377/716 738/1394/716 739/1395/716 727/1378/716 +f 727/1378/717 739/1395/717 728/1379/717 716/1362/717 +f 728/1379/718 740/1396/718 741/1397/718 729/1380/718 +f 729/1381/719 741/1398/719 742/1399/719 730/1382/719 +f 730/1382/720 742/1399/720 743/1400/720 731/1383/720 +f 731/1383/721 743/1400/721 744/1401/721 732/1384/721 +f 732/1385/722 744/1402/722 745/1403/722 733/1386/722 +f 733/1386/723 745/1403/723 746/1404/723 734/1387/723 +f 734/1387/724 746/1404/724 747/1405/724 735/1388/724 +f 735/1389/725 747/1406/725 748/1407/725 736/1390/725 +f 736/1390/726 748/1407/726 749/1408/726 737/1391/726 +f 737/1392/727 749/1409/727 750/1410/727 738/1393/727 +f 738/1394/728 750/1411/728 751/1412/728 739/1395/728 +f 739/1395/729 751/1412/729 740/1396/729 728/1379/729 +f 740/1396/730 752/1413/730 753/1414/730 741/1397/730 +f 741/1398/731 753/1415/731 754/1416/731 742/1399/731 +f 742/1399/732 754/1416/732 755/1417/732 743/1400/732 +f 743/1400/733 755/1417/733 756/1418/733 744/1401/733 +f 744/1402/734 756/1419/734 757/1420/734 745/1403/734 +f 745/1403/735 757/1420/735 758/1421/735 746/1404/735 +f 746/1404/736 758/1421/736 759/1422/736 747/1405/736 +f 747/1406/737 759/1423/737 760/1424/737 748/1425/737 +f 748/1425/738 760/1424/738 761/1426/738 749/1427/738 +f 749/1428/739 761/1429/739 762/1430/739 750/1431/739 +f 750/1411/740 762/1432/740 763/1433/740 751/1412/740 +f 751/1412/741 763/1433/741 752/1413/741 740/1396/741 +f 752/1413/742 764/1434/742 765/1435/742 753/1414/742 +f 753/1415/743 765/1436/743 766/1437/743 754/1416/743 +f 754/1416/744 766/1437/744 767/1438/744 755/1417/744 +f 755/1417/745 767/1438/745 768/1439/745 756/1418/745 +f 756/1419/746 768/1440/746 769/1441/746 757/1420/746 +f 757/1420/747 769/1441/747 770/1442/747 758/1421/747 +f 758/1421/748 770/1442/748 771/1443/748 759/1422/748 +f 759/1423/749 771/1444/749 772/1445/749 760/1424/749 +f 760/1424/750 772/1445/750 773/1446/750 761/1426/750 +f 761/1429/751 773/1447/751 774/1448/751 762/1430/751 +f 762/1432/752 774/1449/752 775/1450/752 763/1433/752 +f 763/1433/753 775/1450/753 764/1434/753 752/1413/753 +f 764/1434/754 776/1451/754 777/1452/754 765/1435/754 +f 765/1453/755 777/1454/755 778/1455/755 766/1456/755 +f 766/1437/756 778/1457/756 779/1458/756 767/1438/756 +f 767/1438/757 779/1458/757 780/1459/757 768/1439/757 +f 768/1440/758 780/1460/758 781/1461/758 769/1441/758 +f 769/1441/759 781/1461/759 782/1462/759 770/1442/759 +f 770/1442/760 782/1462/760 783/1463/760 771/1443/760 +f 771/1444/761 783/1464/761 784/1465/761 772/1445/761 +f 772/1445/762 784/1465/762 785/1466/762 773/1446/762 +f 773/1447/763 785/1467/763 786/1468/763 774/1448/763 +f 774/1449/764 786/1469/764 787/1470/764 775/1450/764 +f 775/1450/765 787/1470/765 776/1451/765 764/1434/765 +f 776/1451/766 788/1471/766 789/1472/766 777/1452/766 +f 777/1454/767 789/1473/767 790/1474/767 778/1455/767 +f 778/1457/768 790/1475/768 791/1476/768 779/1458/768 +f 779/1458/769 791/1476/769 792/1477/769 780/1459/769 +f 780/1460/770 792/1478/770 793/1479/770 781/1461/770 +f 781/1461/771 793/1479/771 794/1480/771 782/1462/771 +f 782/1462/772 794/1480/772 795/1481/772 783/1463/772 +f 783/1464/773 795/1482/773 796/1483/773 784/1465/773 +f 784/1465/774 796/1483/774 797/1484/774 785/1466/774 +f 785/1467/775 797/1485/775 798/1486/775 786/1468/775 +f 786/1469/776 798/1487/776 799/1488/776 787/1470/776 +f 787/1470/777 799/1488/777 788/1471/777 776/1451/777 +f 788/1489/778 800/1490/778 801/1491/778 789/1473/778 +f 789/1473/779 801/1491/779 802/1492/779 790/1474/779 +f 790/1475/780 802/1493/780 803/1494/780 791/1476/780 +f 791/1476/781 803/1494/781 804/1495/781 792/1477/781 +f 792/1478/782 804/1496/782 805/1497/782 793/1479/782 +f 793/1479/783 805/1497/783 806/1498/783 794/1480/783 +f 794/1499/784 806/1500/784 807/1501/784 795/1482/784 +f 795/1482/785 807/1501/785 808/1502/785 796/1483/785 +f 796/1483/786 808/1502/786 809/1503/786 797/1484/786 +f 797/1485/787 809/1504/787 810/1505/787 798/1486/787 +f 798/1487/788 810/1506/788 811/1507/788 799/1488/788 +f 799/1488/789 811/1507/789 800/1508/789 788/1471/789 +f 800/1490/507 812/1509/507 813/1510/507 801/1491/507 +f 801/1491/506 813/1510/506 814/1511/506 802/1492/506 +f 802/1493/505 814/1512/505 815/1513/505 803/1494/505 +f 803/1494/504 815/1513/504 816/1514/504 804/1495/504 +f 804/1495/503 816/1514/503 817/1515/503 805/1516/503 +f 805/1497/502 817/1517/502 818/1518/502 806/1498/502 +f 806/1500/513 818/1519/513 819/1520/513 807/1501/513 +f 807/1501/512 819/1520/512 820/1521/512 808/1502/512 +f 808/1502/511 820/1521/511 821/1522/511 809/1503/511 +f 809/1504/510 821/1523/510 822/1524/510 810/1505/510 +f 810/1506/509 822/1525/509 823/1526/509 811/1507/509 +f 811/1507/508 823/1526/508 812/1527/508 800/1508/508 +f 812/1509/519 824/1528/519 825/1529/519 813/1510/519 +f 813/1510/518 825/1529/518 826/1530/518 814/1511/518 +f 814/1512/517 826/1531/517 827/1532/517 815/1513/517 +f 815/1513/516 827/1532/516 828/1533/516 816/1514/516 +f 816/1514/515 828/1533/515 829/1534/515 817/1515/515 +f 817/1517/514 829/1535/514 830/1536/514 818/1518/514 +f 818/1519/525 830/1537/525 831/1538/525 819/1520/525 +f 819/1520/524 831/1538/524 832/1539/524 820/1521/524 +f 820/1521/523 832/1539/523 833/1540/523 821/1522/523 +f 821/1523/522 833/1541/522 834/1542/522 822/1524/522 +f 822/1524/521 834/1542/521 835/1543/521 823/1544/521 +f 823/1545/520 835/1546/520 824/1528/520 812/1509/520 +f 824/1528/531 836/1547/531 837/1548/531 825/1529/531 +f 825/1529/530 837/1548/530 838/1549/530 826/1530/530 +f 826/1531/529 838/1550/529 839/1551/529 827/1532/529 +f 827/1532/528 839/1551/528 840/1552/528 828/1533/528 +f 828/1533/527 840/1552/527 841/1553/527 829/1534/527 +f 829/1534/526 841/1553/526 842/1554/526 830/1555/526 +f 830/1537/537 842/1556/537 843/1557/537 831/1538/537 +f 831/1538/536 843/1557/536 844/1558/536 832/1539/536 +f 832/1539/535 844/1558/535 845/1559/535 833/1540/535 +f 833/1541/534 845/1560/534 846/1561/534 834/1542/534 +f 834/1542/533 846/1561/533 847/1562/533 835/1543/533 +f 835/1546/532 847/1563/532 836/1547/532 824/1528/532 +f 836/1547/543 848/1564/543 849/1565/543 837/1548/543 +f 837/1548/542 849/1565/542 850/1566/542 838/1549/542 +f 838/1550/541 850/1567/541 851/1568/541 839/1551/541 +f 839/1551/540 851/1568/540 852/1569/540 840/1552/540 +f 840/1552/539 852/1569/539 853/1570/539 841/1553/539 +f 841/1553/538 853/1570/538 854/1571/538 842/1554/538 +f 842/1556/549 854/1572/549 855/1573/549 843/1557/549 +f 843/1557/548 855/1573/548 856/1574/548 844/1558/548 +f 844/1558/547 856/1574/547 857/1575/547 845/1559/547 +f 845/1560/546 857/1576/546 858/1577/546 846/1561/546 +f 846/1561/545 858/1577/545 859/1578/545 847/1562/545 +f 847/1563/544 859/1579/544 848/1564/544 836/1547/544 +f 848/1564/555 860/1580/555 861/1581/555 849/1565/555 +f 849/1565/554 861/1581/554 862/1582/554 850/1566/554 +f 850/1567/553 862/1583/553 863/1584/553 851/1568/553 +f 851/1568/552 863/1584/552 864/1585/552 852/1569/552 +f 852/1569/551 864/1585/551 865/1586/551 853/1570/551 +f 853/1570/550 865/1586/550 866/1587/550 854/1571/550 +f 854/1572/561 866/1588/561 867/1589/561 855/1573/561 +f 855/1573/560 867/1589/560 868/1590/560 856/1574/560 +f 856/1574/559 868/1590/559 869/1591/559 857/1575/559 +f 857/1576/558 869/1592/558 870/1593/558 858/1577/558 +f 858/1577/557 870/1593/557 871/1594/557 859/1578/557 +f 859/1579/556 871/1595/556 860/1580/556 848/1564/556 +f 860/1580/567 872/1596/567 873/1597/567 861/1581/567 +f 861/1581/566 873/1597/566 874/1598/566 862/1582/566 +f 862/1583/565 874/1599/565 875/1600/565 863/1584/565 +f 863/1584/564 875/1600/564 876/1601/564 864/1585/564 +f 864/1585/790 876/1601/790 877/1602/790 865/1586/790 +f 865/1586/562 877/1602/562 878/1603/562 866/1587/562 +f 866/1588/573 878/1604/573 879/1605/573 867/1589/573 +f 867/1589/572 879/1605/572 880/1606/572 868/1590/572 +f 868/1590/571 880/1606/571 881/1607/571 869/1591/571 +f 869/1592/570 881/1608/570 882/1609/570 870/1593/570 +f 870/1593/569 882/1609/569 883/1610/569 871/1594/569 +f 871/1595/568 883/1611/568 872/1596/568 860/1580/568 +f 872/1596/579 884/1612/579 885/1613/579 873/1597/579 +f 873/1597/578 885/1613/578 886/1614/578 874/1598/578 +f 874/1599/577 886/1615/577 887/1616/577 875/1600/577 +f 875/1600/576 887/1616/576 888/1617/576 876/1601/576 +f 876/1601/575 888/1617/575 889/1618/575 877/1602/575 +f 877/1602/574 889/1618/574 890/1619/574 878/1603/574 +f 878/1604/585 890/1620/585 891/1621/585 879/1605/585 +f 879/1605/584 891/1621/584 892/1622/584 880/1606/584 +f 880/1606/583 892/1622/583 893/1623/583 881/1607/583 +f 881/1608/582 893/1624/582 894/1625/582 882/1609/582 +f 882/1609/581 894/1625/581 895/1626/581 883/1610/581 +f 883/1611/580 895/1627/580 884/1612/580 872/1596/580 +f 884/1612/591 896/1628/591 897/1629/591 885/1613/591 +f 885/1613/590 897/1629/590 898/1630/590 886/1614/590 +f 886/1615/589 898/1631/589 899/1632/589 887/1616/589 +f 887/1616/588 899/1632/588 900/1633/588 888/1617/588 +f 888/1617/587 900/1633/587 901/1634/587 889/1618/587 +f 889/1618/586 901/1634/586 902/1635/586 890/1619/586 +f 890/1620/597 902/1636/597 903/1637/597 891/1621/597 +f 891/1621/596 903/1637/596 904/1638/596 892/1622/596 +f 892/1622/595 904/1638/595 905/1639/595 893/1623/595 +f 893/1624/594 905/1640/594 906/1641/594 894/1625/594 +f 894/1625/593 906/1641/593 907/1642/593 895/1626/593 +f 895/1627/592 907/1643/592 896/1628/592 884/1612/592 +f 896/1628/603 908/1644/603 909/1645/603 897/1629/603 +f 897/1629/602 909/1645/602 910/1646/602 898/1630/602 +f 898/1631/601 910/1647/601 911/1648/601 899/1632/601 +f 899/1632/600 911/1648/600 912/1649/600 900/1633/600 +f 900/1633/599 912/1649/599 913/1650/599 901/1634/599 +f 901/1634/598 913/1650/598 914/1651/598 902/1635/598 +f 902/1636/609 914/1652/609 915/1653/609 903/1637/609 +f 903/1637/608 915/1653/608 916/1654/608 904/1638/608 +f 904/1638/607 916/1654/607 917/1655/607 905/1639/607 +f 905/1640/606 917/1656/606 918/1657/606 906/1641/606 +f 906/1641/605 918/1657/605 919/1658/605 907/1642/605 +f 907/1642/604 919/1658/604 908/1659/604 896/1660/604 +f 908/1644/615 920/1661/615 921/1662/615 909/1645/615 +f 909/1645/614 921/1662/614 922/1663/614 910/1646/614 +f 910/1647/613 922/1664/613 923/1665/613 911/1648/613 +f 911/1648/612 923/1665/612 924/1666/612 912/1649/612 +f 912/1649/611 924/1666/611 925/1667/611 913/1650/611 +f 913/1650/610 925/1667/610 926/1668/610 914/1651/610 +f 914/1652/621 926/1669/621 927/1670/621 915/1653/621 +f 915/1653/620 927/1670/620 928/1671/620 916/1654/620 +f 916/1654/619 928/1671/619 929/1672/619 917/1655/619 +f 917/1656/618 929/1673/618 930/1674/618 918/1657/618 +f 918/1657/617 930/1674/617 931/1675/617 919/1658/617 +f 919/1658/616 931/1675/616 920/1676/616 908/1659/616 +f 920/1661/791 932/1677/791 933/1678/791 921/1662/791 +f 921/1662/626 933/1678/626 934/1679/626 922/1663/626 +f 922/1664/625 934/1680/625 935/1681/625 923/1665/625 +f 923/1665/624 935/1681/624 936/1682/624 924/1666/624 +f 924/1666/623 936/1682/623 937/1683/623 925/1667/623 +f 925/1667/622 937/1683/622 938/1684/622 926/1668/622 +f 926/1669/792 938/1685/792 939/1686/792 927/1670/792 +f 927/1670/632 939/1686/632 940/1687/632 928/1671/632 +f 928/1671/631 940/1687/631 941/1688/631 929/1672/631 +f 929/1673/630 941/1689/630 942/1690/630 930/1674/630 +f 930/1674/629 942/1690/629 943/1691/629 931/1675/629 +f 931/1675/628 943/1691/628 932/1692/628 920/1676/628 +f 932/1677/639 944/1693/639 945/1694/639 933/1678/639 +f 933/1678/638 945/1694/638 946/1695/638 934/1679/638 +f 934/1680/637 946/1696/637 947/1697/637 935/1681/637 +f 935/1681/636 947/1697/636 948/1698/636 936/1682/636 +f 936/1682/635 948/1698/635 949/1699/635 937/1683/635 +f 937/1683/634 949/1699/634 950/1700/634 938/1684/634 +f 938/1701/645 950/1702/645 951/1703/645 939/1704/645 +f 939/1686/644 951/1705/644 952/1706/644 940/1687/644 +f 940/1687/643 952/1706/643 953/1707/643 941/1688/643 +f 941/1689/642 953/1708/642 954/1709/642 942/1690/642 +f 942/1690/641 954/1709/641 955/1710/641 943/1691/641 +f 943/1691/640 955/1710/640 944/1711/640 932/1692/640 +f 944/1712/651 956/1713/651 957/1714/651 945/1715/651 +f 945/1715/650 957/1714/650 958/1716/650 946/1717/650 +f 946/1696/649 958/1718/649 959/1719/649 947/1697/649 +f 947/1697/648 959/1719/648 960/1720/648 948/1698/648 +f 948/1698/647 960/1720/647 961/1721/647 949/1699/647 +f 949/1699/646 961/1721/646 962/1722/646 950/1700/646 +f 950/1702/657 962/1723/657 963/1724/657 951/1703/657 +f 951/1705/656 963/1725/656 964/1726/656 952/1706/656 +f 952/1706/655 964/1726/655 965/1727/655 953/1707/655 +f 953/1708/654 965/1728/654 966/1729/654 954/1709/654 +f 954/1709/653 966/1729/653 967/1730/653 955/1710/653 +f 955/1710/652 967/1730/652 956/1731/652 944/1711/652 +f 956/1713/663 968/1732/663 969/1733/663 957/1714/663 +f 957/1714/662 969/1733/662 970/1734/662 958/1716/662 +f 958/1718/661 970/1735/661 971/1736/661 959/1719/661 +f 959/1719/660 971/1736/660 972/1737/660 960/1720/660 +f 960/1720/659 972/1737/659 973/1738/659 961/1721/659 +f 961/1721/658 973/1738/658 974/1739/658 962/1722/658 +f 962/1723/669 974/1740/669 975/1741/669 963/1724/669 +f 963/1724/668 975/1741/668 976/1742/668 964/1743/668 +f 964/1726/667 976/1744/667 977/1745/667 965/1727/667 +f 965/1728/666 977/1746/666 978/1747/666 966/1729/666 +f 966/1729/665 978/1747/665 979/1748/665 967/1730/665 +f 967/1730/664 979/1748/664 968/1749/664 956/1731/664 +f 968/1732/675 980/1750/675 981/1751/675 969/1733/675 +f 969/1733/674 981/1751/674 982/1752/674 970/1734/674 +f 970/1735/673 982/1753/673 983/1754/673 971/1736/673 +f 971/1736/672 983/1754/672 984/1755/672 972/1737/672 +f 972/1737/671 984/1755/671 985/1756/671 973/1738/671 +f 973/1757/670 985/1758/670 986/1759/670 974/1740/670 +f 974/1740/681 986/1759/681 987/1760/681 975/1741/681 +f 975/1741/680 987/1760/680 988/1761/680 976/1742/680 +f 976/1744/679 988/1762/679 989/1763/679 977/1745/679 +f 977/1746/678 989/1764/678 990/1765/678 978/1747/678 +f 978/1747/677 990/1765/677 991/1766/677 979/1748/677 +f 979/1748/676 991/1766/676 980/1767/676 968/1749/676 +f 980/1750/687 992/1768/687 993/1769/687 981/1751/687 +f 981/1751/686 993/1769/686 994/1770/686 982/1752/686 +f 982/1753/685 994/1771/685 995/1772/685 983/1754/685 +f 983/1754/684 995/1772/684 996/1773/684 984/1755/684 +f 984/1755/683 996/1773/683 997/1774/683 985/1756/683 +f 985/1758/682 997/1775/682 998/1776/682 986/1759/682 +f 986/1759/693 998/1776/693 999/1777/693 987/1760/693 +f 987/1760/692 999/1777/692 1000/1778/692 988/1761/692 +f 988/1762/691 1000/1779/691 1001/1780/691 989/1763/691 +f 989/1764/690 1001/1781/690 1002/1782/690 990/1765/690 +f 990/1765/689 1002/1782/689 1003/1783/689 991/1766/689 +f 991/1784/688 1003/1785/688 992/1768/688 980/1750/688 +f 992/1768/699 1004/1786/699 1005/1787/699 993/1769/699 +f 993/1769/698 1005/1787/698 1006/1788/698 994/1770/698 +f 994/1771/697 1006/1789/697 1007/1790/697 995/1772/697 +f 995/1772/696 1007/1790/696 1008/1791/696 996/1773/696 +f 996/1773/695 1008/1791/695 1009/1792/695 997/1774/695 +f 997/1775/694 1009/1793/694 1010/1794/694 998/1776/694 +f 998/1776/705 1010/1794/705 1011/1795/705 999/1777/705 +f 999/1777/704 1011/1795/704 1012/1796/704 1000/1778/704 +f 1000/1779/703 1012/1797/703 1013/1798/703 1001/1780/703 +f 1001/1781/702 1013/1799/702 1014/1800/702 1002/1782/702 +f 1002/1782/701 1014/1800/701 1015/1801/701 1003/1783/701 +f 1003/1785/700 1015/1802/700 1004/1786/700 992/1768/700 +f 1004/1786/711 1016/1803/711 1017/1804/711 1005/1787/711 +f 1005/1787/710 1017/1804/710 1018/1805/710 1006/1788/710 +f 1006/1789/709 1018/1806/709 1019/1807/709 1007/1790/709 +f 1007/1790/708 1019/1807/708 1020/1808/708 1008/1791/708 +f 1008/1791/707 1020/1808/707 1021/1809/707 1009/1792/707 +f 1009/1793/706 1021/1810/706 1022/1811/706 1010/1794/706 +f 1010/1794/717 1022/1811/717 1023/1812/717 1011/1795/717 +f 1011/1795/716 1023/1812/716 1024/1813/716 1012/1796/716 +f 1012/1797/715 1024/1814/715 1025/1815/715 1013/1798/715 +f 1013/1799/714 1025/1816/714 1026/1817/714 1014/1800/714 +f 1014/1800/713 1026/1817/713 1027/1818/713 1015/1801/713 +f 1015/1802/712 1027/1819/712 1016/1803/712 1004/1786/712 +f 1016/1803/723 1028/1820/723 1029/1821/723 1017/1804/723 +f 1017/1804/722 1029/1821/722 1030/1822/722 1018/1805/722 +f 1018/1806/721 1030/1823/721 1031/1824/721 1019/1807/721 +f 1019/1807/720 1031/1824/720 1032/1825/720 1020/1808/720 +f 1020/1808/719 1032/1825/719 1033/1826/719 1021/1809/719 +f 1021/1810/718 1033/1827/718 1034/1828/718 1022/1811/718 +f 1022/1811/729 1034/1828/729 1035/1829/729 1023/1812/729 +f 1023/1812/728 1035/1829/728 1036/1830/728 1024/1813/728 +f 1024/1814/727 1036/1831/727 1037/1832/727 1025/1815/727 +f 1025/1816/726 1037/1833/726 1038/1834/726 1026/1817/726 +f 1026/1817/725 1038/1834/725 1039/1835/725 1027/1818/725 +f 1027/1819/724 1039/1836/724 1028/1820/724 1016/1803/724 +f 1028/1820/735 1040/1837/735 1041/1838/735 1029/1821/735 +f 1029/1821/734 1041/1838/734 1042/1839/734 1030/1822/734 +f 1030/1823/733 1042/1840/733 1043/1841/733 1031/1824/733 +f 1031/1824/793 1043/1841/793 1044/1842/793 1032/1825/793 +f 1032/1825/731 1044/1842/731 1045/1843/731 1033/1826/731 +f 1033/1827/730 1045/1844/730 1046/1845/730 1034/1828/730 +f 1034/1828/741 1046/1845/741 1047/1846/741 1035/1829/741 +f 1035/1829/740 1047/1846/740 1048/1847/740 1036/1830/740 +f 1036/1831/739 1048/1848/739 1049/1849/739 1037/1850/739 +f 1037/1851/794 1049/1852/794 1050/1853/794 1038/1854/794 +f 1038/1854/737 1050/1853/737 1051/1855/737 1039/1856/737 +f 1039/1836/736 1051/1857/736 1040/1837/736 1028/1820/736 +f 1040/1837/747 1052/1858/747 1053/1859/747 1041/1838/747 +f 1041/1838/746 1053/1859/746 1054/1860/746 1042/1839/746 +f 1042/1840/745 1054/1861/745 1055/1862/745 1043/1841/745 +f 1043/1841/744 1055/1862/744 1056/1863/744 1044/1842/744 +f 1044/1842/743 1056/1863/743 1057/1864/743 1045/1843/743 +f 1045/1844/742 1057/1865/742 1058/1866/742 1046/1845/742 +f 1046/1845/753 1058/1866/753 1059/1867/753 1047/1846/753 +f 1047/1846/752 1059/1867/752 1060/1868/752 1048/1847/752 +f 1048/1848/751 1060/1869/751 1061/1870/751 1049/1849/751 +f 1049/1852/750 1061/1871/750 1062/1872/750 1050/1853/750 +f 1050/1853/749 1062/1872/749 1063/1873/749 1051/1855/749 +f 1051/1857/748 1063/1874/748 1052/1858/748 1040/1837/748 +f 1052/1858/759 1064/1875/759 1065/1876/759 1053/1859/759 +f 1053/1859/758 1065/1876/758 1066/1877/758 1054/1860/758 +f 1054/1861/757 1066/1878/757 1067/1879/757 1055/1862/757 +f 1055/1862/756 1067/1879/756 1068/1880/756 1056/1863/756 +f 1056/1881/755 1068/1882/755 1069/1883/755 1057/1884/755 +f 1057/1865/754 1069/1885/754 1070/1886/754 1058/1866/754 +f 1058/1866/765 1070/1886/765 1071/1887/765 1059/1867/765 +f 1059/1867/764 1071/1887/764 1072/1888/764 1060/1868/764 +f 1060/1869/763 1072/1889/763 1073/1890/763 1061/1870/763 +f 1061/1871/795 1073/1891/795 1074/1892/795 1062/1872/795 +f 1062/1872/761 1074/1892/761 1075/1893/761 1063/1873/761 +f 1063/1874/760 1075/1894/760 1064/1875/760 1052/1858/760 +f 1064/1875/771 1076/1895/771 1077/1896/771 1065/1876/771 +f 1065/1876/770 1077/1896/770 1078/1897/770 1066/1877/770 +f 1066/1878/769 1078/1898/769 1079/1899/769 1067/1879/769 +f 1067/1879/768 1079/1899/768 1080/1900/768 1068/1880/768 +f 1068/1882/767 1080/1901/767 1081/1902/767 1069/1883/767 +f 1069/1885/766 1081/1903/766 1082/1904/766 1070/1886/766 +f 1070/1886/777 1082/1904/777 1083/1905/777 1071/1887/777 +f 1071/1887/776 1083/1905/776 1084/1906/776 1072/1888/776 +f 1072/1889/775 1084/1907/775 1085/1908/775 1073/1890/775 +f 1073/1891/774 1085/1909/774 1086/1910/774 1074/1892/774 +f 1074/1892/773 1086/1910/773 1087/1911/773 1075/1893/773 +f 1075/1894/772 1087/1912/772 1076/1895/772 1064/1875/772 +f 1076/1895/783 512/1068/783 513/1071/783 1077/1896/783 +f 1077/1896/782 513/1071/782 514/1913/782 1078/1897/782 +f 1078/1898/781 514/1075/781 515/1077/781 1079/1899/781 +f 1079/1899/780 515/1077/780 516/1079/780 1080/1900/780 +f 1080/1901/779 516/1080/779 517/1083/779 1081/1902/779 +f 1081/1902/778 517/1083/778 518/1085/778 1082/1914/778 +f 1082/1904/789 518/1086/789 519/1089/789 1083/1905/789 +f 1083/1905/788 519/1089/788 520/1091/788 1084/1906/788 +f 1084/1907/787 520/1092/787 521/1095/787 1085/1908/787 +f 1085/1909/786 521/1096/786 522/1099/786 1086/1910/786 +f 1086/1910/785 522/1099/785 523/1101/785 1087/1911/785 +f 1087/1911/784 523/1101/784 512/1103/784 1076/1915/784 +o Cube +v -20.367279 -3.449784 -1.168174 +v -20.367279 3.449784 -1.168174 +v -20.367279 -3.449784 -8.067741 +v -20.367279 3.449784 -8.067741 +v -13.467712 -3.449784 -1.168174 +v -13.467712 3.449784 -1.168174 +v -13.467712 -3.449784 -8.067741 +v -13.467712 3.449784 -8.067741 +vn -1.0000 -0.0000 -0.0000 +vn -0.0000 -0.0000 -1.0000 +vn 1.0000 -0.0000 -0.0000 +vn -0.0000 -0.0000 1.0000 +vn -0.0000 -1.0000 -0.0000 +vn -0.0000 1.0000 -0.0000 +vt 0.375000 0.000000 +vt 0.625000 0.000000 +vt 0.625000 0.250000 +vt 0.375000 0.250000 +vt 0.625000 0.500000 +vt 0.375000 0.500000 +vt 0.625000 0.750000 +vt 0.375000 0.750000 +vt 0.625000 1.000000 +vt 0.375000 1.000000 +vt 0.125000 0.500000 +vt 0.125000 0.750000 +vt 0.875000 0.500000 +vt 0.875000 0.750000 +s 0 +f 1088/1916/796 1089/1917/796 1091/1918/796 1090/1919/796 +f 1090/1919/797 1091/1918/797 1095/1920/797 1094/1921/797 +f 1094/1921/798 1095/1920/798 1093/1922/798 1092/1923/798 +f 1092/1923/799 1093/1922/799 1089/1924/799 1088/1925/799 +f 1090/1926/800 1094/1921/800 1092/1923/800 1088/1927/800 +f 1095/1920/801 1091/1928/801 1089/1929/801 1093/1922/801 diff --git a/project/resources/SuperSimpleDiffuse.fx b/project/resources/SuperSimpleDiffuse.fx new file mode 100644 index 0000000..cb98c81 --- /dev/null +++ b/project/resources/SuperSimpleDiffuse.fx @@ -0,0 +1,131 @@ + +texture2D gShadowMap : ShadowMap; +float4x4 gLightWorldViewProj : LightViewProjection; + +DepthStencilState ShadowDepthStencilState +{ + DepthEnable = true; + DepthWriteMask = ALL; // Write depth to the shadow map + DepthFunc = LESS_EQUAL; // Compare depth in the shadow map + StencilEnable = false; // We don't need stencil operations here +}; + +SamplerState gShadowSampler2 : ShadowSampler { + Filter = MIN_MAG_MIP_POINT; + AddressU = CLAMP; + AddressV = CLAMP; + ComparisonFunc = LESS_EQUAL; +}; + + +SamplerState gSampleState : SampleState; + +RasterizerState gRasterizerState : RastState; + +float4x4 gWorldViewProj : WorldViewProjection; +float4x4 gWorldMatrix : WorldMatrix; + +texture2D gDiffuseMap : DiffuseMap; +texture2D gNormalMap : Normal; +texture2D gSpecularMap : Specular; +texture2D gGlossMap : Gloss; + +float3 gLightDirection : LightDirection; +float3 gLightColor : LightColor; +float3 gCameraPosition : CameraPosition; +bool gUseNormal : UseNormal; + +static const float3 gAmbient = float3(.03f, .03f, .03f); + +// Input output structures +struct VS_INPUT { + float3 Position : POSITION; + float2 TexCoord : TEXCOORD; + float3 Normal : NORMAL; + float3 Tangent : TANGENT; +}; + +struct VS_OUTPUT { + float4 Position : SV_POSITION; + float4 WorldPosition : WORLDPOSITION; + float2 TexCoord : TEXCOORD; + float3 Normal : NORMAL; + float3 Tangent : TANGENT; + float4 ShadowCoord : SHADOWCOORD; // Add this to store shadow map coordinates +}; + +// Vertex shader +VS_OUTPUT VS(VS_INPUT input) { + VS_OUTPUT output = (VS_OUTPUT)0; + + output.WorldPosition = mul(float4(input.Position, 1.f), gWorldMatrix); + output.Position = mul(float4(input.Position, 1.f), gWorldViewProj); + + + output.TexCoord = input.TexCoord; + output.Normal = mul(input.Normal, (float3x3) gWorldMatrix); + output.Tangent = mul(input.Tangent, (float3x3) gWorldMatrix); + + // Calculate shadow map coordinates + // lightSpaceMatrix * vec4(vs_out.FragPos, 1.0); + output.ShadowCoord = mul(float4(input.Position, 1.f) , gLightWorldViewProj); + return output; +} + +// Shadow sampling function +float ShadowCalculation(float4 shadowCoord, float3 normal) { + // Normalize the depth by dividing by the w component + float3 projCoord = shadowCoord.xyz / shadowCoord.w; + + // Convert from [-1, 1] to [0, 1] + float2 UVCoords; + UVCoords.x = 0.5f * projCoord.x + 0.5f; + UVCoords.y = -0.5f * projCoord.y + 0.5f; +// float z = 0.5 * projCoord.z + 0.5; + float z = projCoord.z; + // Sample the shadow map + float shadowDepth = gShadowMap.Sample(gShadowSampler2, UVCoords.xy).r; + +// float bias = 0.0025f; + + float bias = max(0.05 * (1.0 - dot(normal, gLightDirection)), 0.005); + +// return gShadowMap.Sample(gShadowSampler2, UVCoords.xy).r; + // Check if the current fragment is in shadow + if (shadowDepth + bias < z) + return 0.5f; + else + return 1.0f; + +} +// Pixel shader +float4 PS(VS_OUTPUT input) : SV_TARGET { + float shadowFactor = ShadowCalculation(input.ShadowCoord, input.Normal); + + float3 diffuseColor = gDiffuseMap.Sample(gSampleState, input.TexCoord).rgb; + + float3 finalColor = float3(1.f, 1.f, 1.f) * shadowFactor; + finalColor += gAmbient; + + return float4(finalColor, 1.0f); +} + +// DepthStencilState +DepthStencilState gDepthStencilState { + DepthEnable = true; + DepthWriteMask = ALL; + DepthFunc = LESS; + StencilEnable = true; +}; + + +// Technique +technique11 DefaultTechnique { + pass P0 { + SetDepthStencilState(ShadowDepthStencilState, 0); + SetRasterizerState(gRasterizerState); + SetVertexShader(CompileShader(vs_5_0, VS())); + SetGeometryShader(NULL); + SetPixelShader(CompileShader(ps_5_0, PS())); + } +} diff --git a/project/resources/shadowEffect.fx b/project/resources/shadowEffect.fx new file mode 100644 index 0000000..8df2396 --- /dev/null +++ b/project/resources/shadowEffect.fx @@ -0,0 +1,47 @@ +float4x4 gLightWorldViewProj : WorldViewProjection; +float4x4 gWorldViewProj: WorldViewProjection; //For compatibility sake + +struct VS_Input { + float3 Position : POSITION; + float2 TexCoord : TEXCOORD; + float3 Normal : NORMAL; + float3 Tangent : TANGENT; +}; +struct VS_Output +{ + float4 Position : SV_POSITION; +}; + +VS_Output VS_Shadow(VS_Input input) +{ + VS_Output output; + // Transform vertex position to light's clip space + output.Position = mul(float4(input.Position, 1.0f), gLightWorldViewProj); + return output; +} + +float4 PS_Shadow(VS_Output input) : SV_TARGET +{ + // Output depth information (Z/W in clip space) + // // gl_FragDepth = gl_FragCoord.z; + return float4(input.Position.z / input.Position.w, 0.0f, 0.0f, input.Position.z / input.Position.w); +} + +// Rasterizer state for front face culling +RasterizerState FrontFaceCull +{ + FrontCounterClockwise = FALSE; + CullMode = FRONT; +}; + +// Technique for rendering shadow map +technique11 DefaultTechnique +{ + pass P0 + { + //Set FrontFaceCulling + SetRasterizerState(FrontFaceCull); + SetVertexShader(CompileShader(vs_5_0, VS_Shadow())); + SetPixelShader(CompileShader(ps_5_0, PS_Shadow())); + } +} diff --git a/project/src/BRDF.h b/project/src/BRDF.h new file mode 100644 index 0000000..63573ac --- /dev/null +++ b/project/src/BRDF.h @@ -0,0 +1,25 @@ +// +// Created by Bram on 17/01/2025. +// + +#ifndef GP1_DIRECTX_BRDF_H +#define GP1_DIRECTX_BRDF_H + +#include "ColorRGB.h" +#include "./math/Vector3.h" + +namespace dae{ + static ColorRGB Phong(const ColorRGB& specularReflectance, float exp, const Vector3& lightDir, const Vector3& viewDir, const Vector3& normal) + { + const Vector3 reflect{ Vector3::Reflect(lightDir, normal) }; + const float dot{ Saturate(Vector3::Dot(reflect, -viewDir)) }; + return specularReflectance * powf(dot, exp); + } + + static ColorRGB Lambert(float kd, const ColorRGB& diffuse) + { + return kd * diffuse; + } +} + +#endif //GP1_DIRECTX_BRDF_H diff --git a/project/src/Buffers/DX11Viewport.cpp b/project/src/Buffers/DX11Viewport.cpp new file mode 100644 index 0000000..ac36912 --- /dev/null +++ b/project/src/Buffers/DX11Viewport.cpp @@ -0,0 +1,35 @@ +// +// Created by Bram on 16/01/2025. +// + +#include "DX11Viewport.h" + +DX11Viewport::DX11Viewport(float width, float height, float topLeftX, float topLeftY, float minDepth, float maxDepth) { + viewport.Width = width; + viewport.Height = height; + viewport.TopLeftX = topLeftX; + viewport.TopLeftY = topLeftY; + viewport.MinDepth = minDepth; + viewport.MaxDepth = maxDepth; +} + +void DX11Viewport::Apply(ID3D11DeviceContext *context) { + if (context) { + context->RSSetViewports(1, &viewport); + } +} + +void DX11Viewport::SetDimensions(float width, float height) { + viewport.Width = width; + viewport.Height = height; +} + +void DX11Viewport::SetPosition(float topLeftX, float topLeftY) { + viewport.TopLeftX = topLeftX; + viewport.TopLeftY = topLeftY; +} + +void DX11Viewport::SetDepthRange(float minDepth, float maxDepth) { + viewport.MinDepth = minDepth; + viewport.MaxDepth = maxDepth; +} diff --git a/project/src/Buffers/DX11Viewport.h b/project/src/Buffers/DX11Viewport.h new file mode 100644 index 0000000..d929232 --- /dev/null +++ b/project/src/Buffers/DX11Viewport.h @@ -0,0 +1,24 @@ +#ifndef GP1_DIRECTX_DX11VIEWPORT_H +#define GP1_DIRECTX_DX11VIEWPORT_H + +#include + +class DX11Viewport { +public: + DX11Viewport(float width, float height, float topLeftX = 0.0f, float topLeftY = 0.0f, float minDepth = 0.0f, float maxDepth = 1.0f); + + void Apply(ID3D11DeviceContext *context); + + void SetDimensions(float width, float height); + + void SetPosition(float topLeftX, float topLeftY); + + void SetDepthRange(float minDepth, float maxDepth); + + const D3D11_VIEWPORT &GetViewport() const { return viewport; } + +private: + D3D11_VIEWPORT viewport; +}; + +#endif //GP1_DIRECTX_DX11VIEWPORT_H diff --git a/project/src/Buffers/DepthBuffer.cpp b/project/src/Buffers/DepthBuffer.cpp new file mode 100644 index 0000000..fce605b --- /dev/null +++ b/project/src/Buffers/DepthBuffer.cpp @@ -0,0 +1,50 @@ +#include "DepthBuffer.h" + +DepthBuffer::DepthBuffer(ID3D11Device *device, UINT width, UINT height) + : m_device(device), m_width(width), m_height(height), m_depthBuffer(nullptr), m_depthStencilView(nullptr) { +} + +DepthBuffer::~DepthBuffer() { + if (m_depthStencilView) m_depthStencilView->Release(); + if (m_depthBuffer) m_depthBuffer->Release(); +} + +bool DepthBuffer::Initialize() { + // Create a depth buffer with a typeless format + D3D11_TEXTURE2D_DESC desc = {}; + desc.Width = m_width; + desc.Height = m_height; + desc.MipLevels = 1; + desc.ArraySize = 1; + desc.Format = DXGI_FORMAT_R32_TYPELESS; // Typeless format + desc.SampleDesc.Count = 1; + desc.Usage = D3D11_USAGE_DEFAULT; + desc.BindFlags = D3D11_BIND_DEPTH_STENCIL | D3D11_BIND_SHADER_RESOURCE; // Add shader resource binding + desc.CPUAccessFlags = 0; + desc.MiscFlags = 0; + + HRESULT hr = m_device->CreateTexture2D(&desc, nullptr, &m_depthBuffer); + if (FAILED(hr)) { + return false; + } + + // Create DepthStencilView + D3D11_DEPTH_STENCIL_VIEW_DESC dsvDesc = {}; + dsvDesc.Format = DXGI_FORMAT_D32_FLOAT; // Depth format + dsvDesc.ViewDimension = D3D11_DSV_DIMENSION_TEXTURE2D; + dsvDesc.Texture2D.MipSlice = 0; + hr = m_device->CreateDepthStencilView(m_depthBuffer, &dsvDesc, &m_depthStencilView); + if (FAILED(hr)) { + return false; + } + + return true; +} + +ID3D11Texture2D *DepthBuffer::GetDepthBuffer() { + return m_depthBuffer; +} + +ID3D11DepthStencilView *DepthBuffer::GetDepthStencilView() { + return m_depthStencilView; +} diff --git a/project/src/Buffers/DepthBuffer.h b/project/src/Buffers/DepthBuffer.h new file mode 100644 index 0000000..0b97f68 --- /dev/null +++ b/project/src/Buffers/DepthBuffer.h @@ -0,0 +1,31 @@ +#ifndef GP1_DIRECTX_DEPTHBUFFER_H +#define GP1_DIRECTX_DEPTHBUFFER_H + +#include + +class DepthBuffer +{ +public: + DepthBuffer(ID3D11Device* device, UINT width, UINT height); + ~DepthBuffer(); + + bool Initialize(); + ID3D11Texture2D* GetDepthBuffer() const { return m_depthBuffer; } + ID3D11DepthStencilView* GetDepthStencilView() const { return m_depthStencilView; } + + ID3D11DepthStencilView *GetDepthStencilView(); + + ID3D11Texture2D *GetDepthBuffer(); + +private: + ID3D11Device* m_device; + UINT m_width; + UINT m_height; + + ID3D11Texture2D* m_depthBuffer; + ID3D11DepthStencilView* m_depthStencilView; + +}; + + +#endif //GP1_DIRECTX_DEPTHBUFFER_H diff --git a/project/src/Buffers/SamplerState.cpp b/project/src/Buffers/SamplerState.cpp new file mode 100644 index 0000000..3c9cefa --- /dev/null +++ b/project/src/Buffers/SamplerState.cpp @@ -0,0 +1,29 @@ +#include "SamplerState.h" + +SamplerState::SamplerState(ID3D11Device *device) + : m_device(device), m_samplerState(nullptr) { +} + +SamplerState::~SamplerState() { + if (m_samplerState) m_samplerState->Release(); +} +bool SamplerState::Initialize() { + D3D11_SAMPLER_DESC samplerDesc = {}; + samplerDesc.Filter = D3D11_FILTER_MIN_MAG_MIP_LINEAR; + samplerDesc.AddressU = D3D11_TEXTURE_ADDRESS_CLAMP; + samplerDesc.AddressV = D3D11_TEXTURE_ADDRESS_CLAMP; + samplerDesc.AddressW = D3D11_TEXTURE_ADDRESS_CLAMP; +// samplerDesc.AddressU = D3D11_TEXTURE_ADDRESS_WRAP; +// samplerDesc.AddressV = D3D11_TEXTURE_ADDRESS_WRAP; +// samplerDesc.AddressW = D3D11_TEXTURE_ADDRESS_WRAP; + samplerDesc.ComparisonFunc = D3D11_COMPARISON_LESS_EQUAL; + samplerDesc.MinLOD = 0; + samplerDesc.MaxLOD = D3D11_FLOAT32_MAX; + + HRESULT hr = m_device->CreateSamplerState(&samplerDesc, &m_samplerState); + if (FAILED(hr)) { + return false; + } + + return true; +} \ No newline at end of file diff --git a/project/src/Buffers/SamplerState.h b/project/src/Buffers/SamplerState.h new file mode 100644 index 0000000..e876a2e --- /dev/null +++ b/project/src/Buffers/SamplerState.h @@ -0,0 +1,19 @@ +#ifndef GP1_DIRECTX_SAMPLERSTATE_H +#define GP1_DIRECTX_SAMPLERSTATE_H + +#include + +class SamplerState +{ +public: + SamplerState(ID3D11Device* device); + ~SamplerState(); + + bool Initialize(); + ID3D11SamplerState* GetSamplerState() const { return m_samplerState; } +private: + ID3D11Device* m_device; + ID3D11SamplerState* m_samplerState; +}; + +#endif //GP1_DIRECTX_SAMPLERSTATE_H diff --git a/project/src/Buffers/ShadowMapBuffer.cpp b/project/src/Buffers/ShadowMapBuffer.cpp new file mode 100644 index 0000000..d330d6b --- /dev/null +++ b/project/src/Buffers/ShadowMapBuffer.cpp @@ -0,0 +1,50 @@ +#include "ShadowMapBuffer.h" + +ShadowMapBuffer::ShadowMapBuffer(ID3D11Device *device, UINT width, UINT height) + : m_device(device), m_width(width), m_height(height), m_shaderResourceView(nullptr), + m_depthBuffer(device, width, height), m_samplerState(device) { +} + +ShadowMapBuffer::~ShadowMapBuffer() { + if (m_shaderResourceView) m_shaderResourceView->Release(); +} +bool ShadowMapBuffer::Initialize() { + if (!m_depthBuffer.Initialize()) { + return false; + } + + if (!m_samplerState.Initialize()) { + return false; + } + + // Create ShaderResourceView for the depth buffer + D3D11_SHADER_RESOURCE_VIEW_DESC srvDesc = {}; + srvDesc.Format = DXGI_FORMAT_R32_FLOAT; // Shader-readable format + srvDesc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURE2D; + srvDesc.Texture2D.MipLevels = 1; + srvDesc.Texture2D.MostDetailedMip = 0; + + HRESULT hr = m_device->CreateShaderResourceView(m_depthBuffer.GetDepthBuffer(), &srvDesc, &m_shaderResourceView); + if (FAILED(hr)) + { + OutputDebugStringA("Failed to create ShaderResourceView for ShadowMapBuffer.\n"); + return false; + } + + return true; +} + + +void ShadowMapBuffer::SetRenderTarget(ID3D11DeviceContext *deviceContext) { + deviceContext->OMSetRenderTargets(0, nullptr, m_depthBuffer.GetDepthStencilView()); +} + + +void ShadowMapBuffer::ResetRenderTarget(ID3D11DeviceContext *deviceContext) { + ID3D11RenderTargetView *nullRTV = nullptr; + deviceContext->OMSetRenderTargets(1, &nullRTV, nullptr); +} + +ID3D11DepthStencilView *ShadowMapBuffer::GetDepthStencilView() { + return m_depthBuffer.GetDepthStencilView(); +} diff --git a/project/src/Buffers/ShadowMapBuffer.h b/project/src/Buffers/ShadowMapBuffer.h new file mode 100644 index 0000000..447d684 --- /dev/null +++ b/project/src/Buffers/ShadowMapBuffer.h @@ -0,0 +1,37 @@ +#ifndef GP1_DIRECTX_SHADOWMAPBUFFER_H +#define GP1_DIRECTX_SHADOWMAPBUFFER_H + +#include +#include +#include "DepthBuffer.h" +#include "SamplerState.h" + +class ShadowMapBuffer { +public: + ShadowMapBuffer(ID3D11Device *device, UINT width, UINT height); + + ~ShadowMapBuffer(); + + bool Initialize(); + + void SetRenderTarget(ID3D11DeviceContext *deviceContext); + + void ResetRenderTarget(ID3D11DeviceContext *deviceContext); + + ID3D11ShaderResourceView *GetShaderResourceView() const { return m_shaderResourceView; } + + ID3D11SamplerState *GetSamplerState() const { return m_samplerState.GetSamplerState(); } + + ID3D11DepthStencilView *GetDepthStencilView(); +private: + ID3D11Device *m_device; + UINT m_width; + UINT m_height; + + DepthBuffer m_depthBuffer; + SamplerState m_samplerState; + + ID3D11ShaderResourceView *m_shaderResourceView; +}; + +#endif //GP1_DIRECTX_SHADOWMAPBUFFER_H diff --git a/project/src/DirectionalLight.cpp b/project/src/DirectionalLight.cpp new file mode 100644 index 0000000..5d141f9 --- /dev/null +++ b/project/src/DirectionalLight.cpp @@ -0,0 +1,45 @@ +#include "DirectionalLight.h" +#include + +DirectionalLight::DirectionalLight() + : m_Position(0.0f, 10.0f, 0.0f), + m_Target(0.0f, 0.0f, 0.0f), + m_Up(0.0f, 1.0f, 0.0f), + m_ViewMatrix(dae::Matrix()), + m_ProjectionMatrix(dae::Matrix()) {} + +void DirectionalLight::SetPosition(const dae::Vector3 &position) { + m_Position = position; +} + +void DirectionalLight::SetTarget(const dae::Vector3 &target) { + m_Target = target; +} + +void DirectionalLight::SetUp(const dae::Vector3 &up) { + m_Up = up; +} + +dae::Matrix DirectionalLight::GetViewMatrix() const { + return dae::Matrix::CreateLookAtLH(m_Position, m_Target, m_Up); +} + +dae::Matrix DirectionalLight::GetProjectionMatrix(float nearPlane, float farPlane, float size) const { + return dae::Matrix::CreateOrthographic(size, size, nearPlane, farPlane); +} +dae::Matrix DirectionalLight::GetViewProjectionMatrix(float nearPlane, float farPlane, float size) const { + return GetViewMatrix() * GetProjectionMatrix(nearPlane, farPlane, size); +} +void DirectionalLight::Update() { + // If the light position or target changes dynamically, this is where updates would be managed. +// m_ViewMatrix = dae::Matrix::CreateLookAtLH(m_Position, m_Target, m_Up); +// m_ProjectionMatrix = dae::Matrix::CreateOrthographic(size, size, nearPlane, farPlane); +} + +dae::Vector3 DirectionalLight::GetTarget() { + return m_Target; +} + +dae::Vector3 DirectionalLight::GetPosition() { + return m_Position; +} diff --git a/project/src/DirectionalLight.h b/project/src/DirectionalLight.h new file mode 100644 index 0000000..0f86397 --- /dev/null +++ b/project/src/DirectionalLight.h @@ -0,0 +1,34 @@ +#ifndef GP1_DIRECTX_DIRECTIONALLIGHT_H +#define GP1_DIRECTX_DIRECTIONALLIGHT_H + + +#include "Math/Vector3.h" +#include "Math/Matrix.h" + +class DirectionalLight { +public: + DirectionalLight(); + ~DirectionalLight() = default; + + void SetPosition(const dae::Vector3 &position); + void SetTarget(const dae::Vector3 &target); + void SetUp(const dae::Vector3 &up); + + dae::Matrix GetViewMatrix() const; + dae::Matrix GetProjectionMatrix(float nearPlane = 0.1f, float farPlane = 100.0f, float size = 50.0f) const; + dae::Matrix GetViewProjectionMatrix(float nearPlane = 0.1f, float farPlane = 100.0f, float size = 50.0f) const; + + void Update(); + + dae::Vector3 GetTarget(); + dae::Vector3 GetPosition(); +private: + dae::Vector3 m_Position; + dae::Vector3 m_Target; + dae::Vector3 m_Up; + + dae::Matrix m_ViewMatrix; + dae::Matrix m_ProjectionMatrix; +}; + +#endif //GP1_DIRECTX_DIRECTIONALLIGHT_H \ No newline at end of file diff --git a/project/src/Effects/Effect.cpp b/project/src/Effects/Effect.cpp index 027bc90..25baaf3 100644 --- a/project/src/Effects/Effect.cpp +++ b/project/src/Effects/Effect.cpp @@ -52,6 +52,7 @@ Effect::Effect(ID3D11Device *devicePtr, const std::wstring &filePath) if(!m_RasterizerVariablePtr->IsValid()) std::wcout << L"gRasterizerState Rasterizer is not valid" << std::endl; + m_UseNormalMapVariablePtr->SetBool(m_UseNormalMap); @@ -201,4 +202,4 @@ void Effect::InitRasterizer(ID3D11Device *devicePtr) { rasterDesc.CullMode = D3D11_CULL_NONE; devicePtr->CreateRasterizerState(&rasterDesc, &m_RasterizerStates[static_cast(CullMode::None)]); -} +} \ No newline at end of file diff --git a/project/src/Effects/Effect.h b/project/src/Effects/Effect.h index b5cc3e8..8b40e81 100644 --- a/project/src/Effects/Effect.h +++ b/project/src/Effects/Effect.h @@ -3,15 +3,12 @@ #include "BaseEffect.h" #include - - enum class CullMode { None = 0, Front = 1, Back = 2 }; - class Effect final: public BaseEffect { public: Effect(ID3D11Device *devicePtr, const std::wstring &filePath); @@ -60,4 +57,4 @@ private: CullMode m_CullMode{ CullMode::Back }; bool m_UseNormalMap{true}; -}; +}; \ No newline at end of file diff --git a/project/src/Effects/FireEffect.h b/project/src/Effects/FireEffect.h index dd3c6c2..85f5e00 100644 --- a/project/src/Effects/FireEffect.h +++ b/project/src/Effects/FireEffect.h @@ -9,7 +9,7 @@ #include #include "BaseEffect.h" -class FireEffect final: public BaseEffect { +class FireEffect final : public BaseEffect { public: FireEffect(ID3D11Device *devicePtr, const std::wstring &filePath); @@ -20,14 +20,13 @@ public: void NextSamplingState() override; private: - void InitSamplers(ID3D11Device* devicePtr); - + void InitSamplers(ID3D11Device *devicePtr); ID3DX11EffectShaderResourceVariable *m_DiffuseMapVariablePtr{}; ID3DX11EffectSamplerVariable *m_SamplerVariablePtr{}; - std::array m_SamplerStates{}; + std::array m_SamplerStates{}; TechniqueType m_TechniqueType{TechniqueType::Linear}; diff --git a/project/src/Effects/ShadowDiffuse.cpp b/project/src/Effects/ShadowDiffuse.cpp new file mode 100644 index 0000000..7c2fe65 --- /dev/null +++ b/project/src/Effects/ShadowDiffuse.cpp @@ -0,0 +1,235 @@ +#include "../pch.h" +#include "ShadowDiffuse.h" +#include "../Utils.h" + +#include + +ShadowDiffuse::ShadowDiffuse(ID3D11Device *devicePtr, const std::wstring &filePath) + : BaseEffect(devicePtr, filePath) { + + m_LightPosVariablePtr = m_EffectPtr->GetVariableByName("gLightDirection")->AsVector(); + if(!m_LightPosVariablePtr->IsValid()) + std::wcout << L"gLightDirection Vector is not valid" << std::endl; + + + m_SamplerVariablePtr = m_EffectPtr->GetVariableByName("gSampleState")->AsSampler(); + if(!m_SamplerVariablePtr->IsValid()) + std::wcout << L"gSampleState Sampler is not valid" << std::endl; + + m_MatWorldVariablePtr = m_EffectPtr->GetVariableByName("gWorldMatrix")->AsMatrix(); + if(!m_MatWorldVariablePtr->IsValid()) + std::wcout << L"gWorld Matrix is not valid" << std::endl; + + m_DiffuseMapVariablePtr = m_EffectPtr->GetVariableByName("gDiffuseMap")->AsShaderResource(); + if(!m_DiffuseMapVariablePtr->IsValid()) + std::wcout << L"gDiffuseMap ShaderResource is not valid" << std::endl; + + m_NormalMapVariablePtr = m_EffectPtr->GetVariableByName("gNormalMap")->AsShaderResource(); + if(!m_NormalMapVariablePtr->IsValid()) + std::wcout << L"gNormalMap ShaderResource is not valid" << std::endl; + + m_SpecularMapVariablePtr = m_EffectPtr->GetVariableByName("gSpecularMap")->AsShaderResource(); + if(!m_SpecularMapVariablePtr->IsValid()) + std::wcout << L"gSpecularMap ShaderResource is not valid" << std::endl; + + m_GlossMapVariablePtr = m_EffectPtr->GetVariableByName("gGlossMap")->AsShaderResource(); + if(!m_GlossMapVariablePtr->IsValid()) + std::wcout << L"gGlossMap ShaderResource is not valid" << std::endl; + + m_CameraPosVariablePtr = m_EffectPtr->GetVariableByName("gCameraPosition")->AsVector(); + if(!m_CameraPosVariablePtr->IsValid()) + std::wcout << L"gCameraPos Vector is not valid" << std::endl; + + m_LightColorVariablePtr = m_EffectPtr->GetVariableByName("gLightColor")->AsVector(); + if(!m_LightColorVariablePtr->IsValid()) + std::wcout << L"gLightColor Vector is not valid" << std::endl; + + m_UseNormalMapVariablePtr = m_EffectPtr->GetVariableByName("gUseNormal")->AsScalar(); + if(!m_UseNormalMapVariablePtr->IsValid()) + std::wcout << L"gUseNormalMap Scalar is not valid" << std::endl; + + m_RasterizerVariablePtr = m_EffectPtr->GetVariableByName("gRasterizerState")->AsRasterizer(); + if(!m_RasterizerVariablePtr->IsValid()) + std::wcout << L"gRasterizerState Rasterizer is not valid" << std::endl; + + m_ShadowMapVariablePtr = m_EffectPtr->GetVariableByName("gShadowMap")->AsShaderResource(); + if(!m_ShadowMapVariablePtr->IsValid()) + std::wcout << L"gShadowMapSampler Sampler is not valid" << std::endl; + + m_LightWorldViewProjVariablePtr = m_EffectPtr->GetVariableByName("gLightWorldViewProj")->AsMatrix(); + if(!m_LightWorldViewProjVariablePtr->IsValid()) + std::wcout << L"gLightWorldViewProj Matrix is not valid" << std::endl; + + + m_UseNormalMapVariablePtr->SetBool(m_UseNormalMap); + + + constexpr int vectorSize{ 4 }; + constexpr float lightDirection[vectorSize]{ .577f, -.577f, .577f, 0.f }; + m_LightPosVariablePtr->SetFloatVector(lightDirection); + + constexpr float lightColor[vectorSize]{ 1.f, 1.f, 1.f, 1.f }; + m_LightColorVariablePtr->SetFloatVector(lightColor); + + this->InitSamplers(devicePtr); + this->InitRasterizer(devicePtr); + + m_SamplerVariablePtr->SetSampler(0,m_SamplerStates[static_cast(m_TechniqueType)]); + m_RasterizerVariablePtr->SetRasterizerState(0,m_RasterizerStates[static_cast(m_CullMode)]); +} + +ShadowDiffuse::~ShadowDiffuse() { + m_MatWorldVariablePtr->Release(); + m_MatWorldVariablePtr = nullptr; + + m_DiffuseMapVariablePtr->Release(); + m_DiffuseMapVariablePtr = nullptr; + + m_NormalMapVariablePtr->Release(); + m_NormalMapVariablePtr = nullptr; + + m_SpecularMapVariablePtr->Release(); + m_SpecularMapVariablePtr = nullptr; + + m_GlossMapVariablePtr->Release(); + m_GlossMapVariablePtr = nullptr; + + m_CameraPosVariablePtr->Release(); + m_CameraPosVariablePtr = nullptr; + + m_LightPosVariablePtr->Release(); + m_LightPosVariablePtr = nullptr; + + m_LightColorVariablePtr->Release(); + m_LightColorVariablePtr = nullptr; + + m_UseNormalMapVariablePtr->Release(); + m_UseNormalMapVariablePtr = nullptr; + + m_SamplerVariablePtr->Release(); + m_SamplerVariablePtr = nullptr; + + m_RasterizerVariablePtr->Release(); + m_RasterizerVariablePtr = nullptr; + + if(m_ShadowMapVariablePtr){ + m_ShadowMapVariablePtr->Release(); + m_ShadowMapVariablePtr = nullptr; + } + + if(m_LightWorldViewProjVariablePtr){ + m_LightWorldViewProjVariablePtr->Release(); + m_LightWorldViewProjVariablePtr = nullptr; + } + + for(auto sampler : m_SamplerStates){ + sampler->Release(); + } + + for(auto rasterizer : m_RasterizerStates){ + rasterizer->Release(); + } + + m_EffectPtr->Release(); + m_EffectPtr = nullptr; +} + +void ShadowDiffuse::SetWorldMatrix(const dae::Matrix &world) const { + m_MatWorldVariablePtr->SetMatrix(reinterpret_cast(&world)); +} + +void ShadowDiffuse::SetMaterial(Material* material) { + if(material->diffuseTexturePtr) + m_DiffuseMapVariablePtr->SetResource(material->diffuseTexturePtr->GetSrv()); + if(material->normalTexturePtr) + m_NormalMapVariablePtr->SetResource(material->normalTexturePtr->GetSrv()); + if(material->specularTexturePtr) + m_SpecularMapVariablePtr->SetResource(material->specularTexturePtr->GetSrv()); + if(material->glossTexturePtr) + m_GlossMapVariablePtr->SetResource(material->glossTexturePtr->GetSrv()); +} + + +void ShadowDiffuse::SetCameraPos(const dae::Vector3 &pos) const { + m_CameraPosVariablePtr->SetFloatVector(reinterpret_cast(&pos)); +} + +void ShadowDiffuse::NextSamplingState() { + switch(m_TechniqueType){ + case TechniqueType::Point: + m_TechniqueType = TechniqueType::Linear; + break; + case TechniqueType::Linear: + m_TechniqueType = TechniqueType::Anisotropic; + break; + case TechniqueType::Anisotropic: + m_TechniqueType = TechniqueType::Point; + break; + } + m_SamplerVariablePtr->SetSampler(0,m_SamplerStates[static_cast(m_TechniqueType)]); +} + +void ShadowDiffuse::ToggleNormals() { + m_UseNormalMap = !m_UseNormalMap; + m_UseNormalMapVariablePtr->SetBool(m_UseNormalMap); +} + +void ShadowDiffuse::InitSamplers(ID3D11Device *devicePtr) { + D3D11_SAMPLER_DESC samplerDesc{}; + samplerDesc.Filter = D3D11_FILTER_ANISOTROPIC; + samplerDesc.AddressU = D3D11_TEXTURE_ADDRESS_WRAP; + samplerDesc.AddressV = D3D11_TEXTURE_ADDRESS_WRAP; + samplerDesc.AddressW = D3D11_TEXTURE_ADDRESS_WRAP; + samplerDesc.ComparisonFunc = D3D11_COMPARISON_NEVER; + + devicePtr->CreateSamplerState(&samplerDesc, &m_SamplerStates[static_cast(TechniqueType::Anisotropic)]); + + samplerDesc.Filter = D3D11_FILTER_MIN_MAG_MIP_LINEAR; + devicePtr->CreateSamplerState(&samplerDesc, &m_SamplerStates[static_cast(TechniqueType::Linear)]); + + samplerDesc.Filter = D3D11_FILTER_MIN_MAG_MIP_POINT; + devicePtr->CreateSamplerState(&samplerDesc, &m_SamplerStates[static_cast(TechniqueType::Point)]); + + m_SamplerVariablePtr->SetSampler(0,m_SamplerStates[static_cast(m_TechniqueType)]); +} + +void ShadowDiffuse::NextCullMode() { + m_CullMode = static_cast((static_cast(m_CullMode) + 1) % 3); + m_RasterizerVariablePtr->SetRasterizerState(0,m_RasterizerStates[static_cast(m_CullMode)]); +} + +void ShadowDiffuse::InitRasterizer(ID3D11Device *devicePtr) { + D3D11_RASTERIZER_DESC rasterDesc = {}; + rasterDesc.FillMode = D3D11_FILL_SOLID; // Solid fill + rasterDesc.FrontCounterClockwise = FALSE; + rasterDesc.DepthBias = D3D11_DEFAULT_DEPTH_BIAS; + rasterDesc.SlopeScaledDepthBias = D3D11_DEFAULT_SLOPE_SCALED_DEPTH_BIAS; + rasterDesc.DepthClipEnable = TRUE; + rasterDesc.ScissorEnable = FALSE; + rasterDesc.MultisampleEnable = FALSE; + rasterDesc.AntialiasedLineEnable = FALSE; + + rasterDesc.CullMode = D3D11_CULL_BACK; // Cull back faces + + devicePtr->CreateRasterizerState(&rasterDesc, &m_RasterizerStates[static_cast(CullMode::Back)]); + + rasterDesc.CullMode = D3D11_CULL_FRONT; + + devicePtr->CreateRasterizerState(&rasterDesc, &m_RasterizerStates[static_cast(CullMode::Front)]); + + rasterDesc.CullMode = D3D11_CULL_NONE; + + devicePtr->CreateRasterizerState(&rasterDesc, &m_RasterizerStates[static_cast(CullMode::None)]); +} + +void ShadowDiffuse::SetShadowMap(ID3D11ShaderResourceView *shadowMapSRV) { + m_ShadowMapVariablePtr->SetResource(shadowMapSRV); +} + +void ShadowDiffuse::SetLightViewProjMatrix(Matrix matrix) { + m_LightWorldViewProjVariablePtr->SetMatrix(reinterpret_cast(&matrix)); +} + +void ShadowDiffuse::SetLightDirection(Vector3 direction) { + +} diff --git a/project/src/Effects/ShadowDiffuse.h b/project/src/Effects/ShadowDiffuse.h new file mode 100644 index 0000000..ee1d28e --- /dev/null +++ b/project/src/Effects/ShadowDiffuse.h @@ -0,0 +1,70 @@ +#pragma once + +#include "BaseEffect.h" +#include + +enum class CullMode { + None = 0, + Front = 1, + Back = 2 +}; + +class ShadowDiffuse final: public BaseEffect { +public: + ShadowDiffuse(ID3D11Device *devicePtr, const std::wstring &filePath); + + virtual ~ShadowDiffuse() override; + + void SetWorldMatrix(const dae::Matrix &world) const override; + + void SetCameraPos(const dae::Vector3 &pos) const override; + + void SetMaterial(Material *material) override; + + void ToggleNormals() override; + + void NextSamplingState() override; + + void NextCullMode() override; + + void SetShadowMap(ID3D11ShaderResourceView* shadowMapSRV); + + void SetLightViewProjMatrix(Matrix matrix); + + void SetLightDirection(Vector3 direction); + +private: + + void InitSamplers(ID3D11Device* devicePtr); + void InitRasterizer(ID3D11Device* devicePtr); + + ID3DX11EffectMatrixVariable *m_MatWorldVariablePtr{}; + + ID3DX11EffectShaderResourceVariable *m_DiffuseMapVariablePtr{}; + ID3DX11EffectShaderResourceVariable *m_NormalMapVariablePtr{}; + ID3DX11EffectShaderResourceVariable *m_SpecularMapVariablePtr{}; + ID3DX11EffectShaderResourceVariable *m_GlossMapVariablePtr{}; + + ID3DX11EffectVectorVariable *m_CameraPosVariablePtr{}; + ID3DX11EffectVectorVariable *m_LightPosVariablePtr{}; + ID3DX11EffectVectorVariable *m_LightColorVariablePtr{}; + + ID3DX11EffectScalarVariable *m_UseNormalMapVariablePtr{}; + + ID3DX11EffectSamplerVariable *m_SamplerVariablePtr{}; + + ID3DX11EffectRasterizerVariable* m_RasterizerVariablePtr{}; + + ID3DX11EffectMatrixVariable* m_LightWorldViewProjVariablePtr{}; + + ID3DX11EffectShaderResourceVariable* m_ShadowMapVariablePtr{}; + + TechniqueType m_TechniqueType{TechniqueType::Linear}; + + std::array m_SamplerStates{}; + std::array m_RasterizerStates{}; + + CullMode m_CullMode{ CullMode::Back }; + + bool m_UseNormalMap{true}; +}; diff --git a/project/src/Effects/ShadowEffect.cpp b/project/src/Effects/ShadowEffect.cpp new file mode 100644 index 0000000..5fb4960 --- /dev/null +++ b/project/src/Effects/ShadowEffect.cpp @@ -0,0 +1,64 @@ +// +// Created by Bram on 13/01/2025. +// + +#include "ShadowEffect.h" + +ShadowEffect::ShadowEffect(ID3D11Device *devicePtr, const std::wstring &filePath) + : BaseEffect(devicePtr, filePath) { + // Retrieve shadow-specific variables + m_LightWorldViewProjVariable = m_EffectPtr->GetVariableByName("gLightWorldViewProj")->AsMatrix(); + if (!m_LightWorldViewProjVariable->IsValid()) { + throw std::runtime_error("Failed to retrieve gLightWorldViewProj variable in ShadowEffect."); + } + + +// m_ShadowMapVariable = m_EffectPtr->GetVariableByName("gShadowMap")->AsShaderResource(); +// if (!m_ShadowMapVariable->IsValid()) { +// throw std::runtime_error("Failed to retrieve gShadowMap variable in ShadowEffect."); +// } +// + +// m_ShadowMapSamplerVariable = m_EffectPtr->GetVariableByName("gShadowMapSampler")->AsSampler(); +// if (!m_ShadowMapSamplerVariable->IsValid()) { +// throw std::runtime_error("Failed to retrieve gShadowMapSampler variable in ShadowEffect."); +// } +} + +void ShadowEffect::SetLightWorldViewProjMatrix(const Matrix &matrix) { + if (m_LightWorldViewProjVariable) { + m_LightWorldViewProjVariable->SetMatrix(reinterpret_cast(&matrix)); + } +} + +void ShadowEffect::SetShadowMap(ID3D11ShaderResourceView *shadowMapSRV) { + if (m_ShadowMapVariable) { + m_ShadowMapVariable->SetResource(shadowMapSRV); + } +} +void ShadowEffect::SetShadowMapSampler(ID3D11SamplerState *samplerState) { + if (m_ShadowMapSamplerVariable) { + m_ShadowMapSamplerVariable->SetSampler(0, samplerState); + } +} + +ShadowEffect::~ShadowEffect() { + if (m_LightWorldViewProjVariable) { + m_LightWorldViewProjVariable->Release(); + m_LightWorldViewProjVariable = nullptr; + } + + if (m_ShadowMapVariable) { + m_ShadowMapVariable->Release(); + m_ShadowMapVariable = nullptr; + } + + if (m_ShadowMapSamplerVariable) { + m_ShadowMapSamplerVariable->Release(); + m_ShadowMapSamplerVariable = nullptr; + } + + m_EffectPtr->Release(); + m_EffectPtr = nullptr; +} + diff --git a/project/src/Effects/ShadowEffect.h b/project/src/Effects/ShadowEffect.h new file mode 100644 index 0000000..3dc6da7 --- /dev/null +++ b/project/src/Effects/ShadowEffect.h @@ -0,0 +1,23 @@ + +#ifndef GP1_DIRECTX_SHADOWEFFECT_H +#define GP1_DIRECTX_SHADOWEFFECT_H + +#include "BaseEffect.h" + +class ShadowEffect : public BaseEffect { +public: + ShadowEffect(ID3D11Device* devicePtr, const std::wstring& filePath); + + ~ShadowEffect() override; + + void SetLightWorldViewProjMatrix(const dae::Matrix& matrix); + void SetShadowMap(ID3D11ShaderResourceView* shadowMapSRV); + void SetShadowMapSampler(ID3D11SamplerState* samplerState); + +private: + ID3DX11EffectMatrixVariable* m_LightWorldViewProjVariable{nullptr}; + ID3DX11EffectShaderResourceVariable* m_ShadowMapVariable{nullptr}; + ID3DX11EffectSamplerVariable* m_ShadowMapSamplerVariable{nullptr}; +}; + +#endif //GP1_DIRECTX_SHADOWEFFECT_H \ No newline at end of file diff --git a/project/src/GamePadController.cpp b/project/src/GamePadController.cpp index fb67f8d..d4a0b8a 100644 --- a/project/src/GamePadController.cpp +++ b/project/src/GamePadController.cpp @@ -21,7 +21,7 @@ void GamePadController::Init() { SDL_GameController *pController = SDL_GameControllerOpen(i); if (pController) { m_pGameControllers.push_back(pController); - m_GamePads.emplace_back(); + m_GamePads.push_back(GamePad()); } } } @@ -46,7 +46,7 @@ void GamePadController::Update() { SDL_GameController *pController = SDL_GameControllerOpen(i); if (pController) { m_pGameControllers.push_back(pController); - m_GamePads.emplace_back(); + m_GamePads.push_back(GamePad()); std::cout << GREEN << "New Controller Connected" << RESET << std::endl; } @@ -64,6 +64,7 @@ void GamePadController::Update() { std::cout << RED << "Controller Disconnected" << RESET << std::endl; --i; // Adjust index after removing the controller } + } diff --git a/project/src/HitTest.cpp b/project/src/HitTest.cpp index 526e8d1..9dd8f9d 100644 --- a/project/src/HitTest.cpp +++ b/project/src/HitTest.cpp @@ -1,7 +1,5 @@ #include "HitTest.h" - - float CrossZ(const Vector3& p0, const Vector3& p1, const Vector3& point) { return (p1.x - p0.x) * (point.y - p0.y) @@ -70,4 +68,3 @@ std::optional TriangleHitTest(const Vector3& fragPos, const VertexOut& v .mesh = v0.mesh }; } - diff --git a/project/src/HitTest.h b/project/src/HitTest.h index 09d7b9b..c9ef7f8 100644 --- a/project/src/HitTest.h +++ b/project/src/HitTest.h @@ -7,6 +7,7 @@ #include "Math/Vector3.h" #include "Math/Vector2.h" #include "Mesh.h" +#include "Effects/Effect.h" using namespace dae; @@ -23,6 +24,6 @@ struct Sample final }; -std::optional TriangleHitTest(const Vector3& fragPos, const VertexOut& v0, const VertexOut& v1, const VertexOut& v2); +std::optional TriangleHitTest(const Vector3 &fragPos, const VertexOut &v0, const VertexOut &v1, const VertexOut &v2); #endif //GP1_DIRECTX_HITTEST_H diff --git a/project/src/Math/Matrix.cpp b/project/src/Math/Matrix.cpp index 49a961f..8e4b63e 100644 --- a/project/src/Math/Matrix.cpp +++ b/project/src/Math/Matrix.cpp @@ -302,5 +302,14 @@ namespace dae { data[3] = {vector3, 1}; } + Matrix Matrix::CreateOrthographic(float width, float height, float zn, float zf) { + return Matrix( + {2.f / width, 0, 0, 0}, + {0, 2.f / height, 0, 0}, + {0, 0, 1.f / (zf - zn), 0}, + {0, 0, -zn / (zf - zn), 1} + ); + } + #pragma endregion } \ No newline at end of file diff --git a/project/src/Math/Matrix.h b/project/src/Math/Matrix.h index 39768cc..cbadfa8 100644 --- a/project/src/Math/Matrix.h +++ b/project/src/Math/Matrix.h @@ -50,7 +50,7 @@ namespace dae { static Matrix CreateLookAtLH(const Vector3& origin, const Vector3& forward, const Vector3& up); static Matrix CreatePerspectiveFovLH(float fovy, float aspect, float zn, float zf); - + static Matrix CreateOrthographic(float width, float height, float zn, float zf); Vector4& operator[](int index); Vector4 operator[](int index) const; Matrix operator*(const Matrix& m) const; diff --git a/project/src/RenderSettings.h b/project/src/RenderSettings.h new file mode 100644 index 0000000..2920045 --- /dev/null +++ b/project/src/RenderSettings.h @@ -0,0 +1,26 @@ +// +// Created by Bram on 16/01/2025. +// + +#ifndef GP1_DIRECTX_RENDERSETTINGS_H +#define GP1_DIRECTX_RENDERSETTINGS_H + +#include "Singleton.h" + +class RenderSettings : public Singleton { +public: + void setWidth(int w) { width = w; } + void setHeight(int h) { height = h; } + int getWidth() const { return width; } + int getHeight() const { return height; } + +private: + friend class Singleton; + RenderSettings() : width(1920), height(1080) {} // Default values + + int width; + int height; +}; + + +#endif //GP1_DIRECTX_RENDERSETTINGS_H diff --git a/project/src/Renderer.cpp b/project/src/Renderer.cpp index b6d8561..ce2ff4d 100644 --- a/project/src/Renderer.cpp +++ b/project/src/Renderer.cpp @@ -10,6 +10,8 @@ #include "Scenes/DioramaScene.h" #include "Scenes/InstancedScene.h" #include "Scenes/PlanetScene.h" +#include "Scenes/ShadowTestScene.h" +#include "BRDF.h" namespace dae { @@ -36,7 +38,7 @@ namespace dae { InitializeSDLRasterizer(); - m_pScene = std::make_unique(); + m_pScene = std::make_unique(); m_pScene->Initialize(m_DevicePtr, m_DeviceContextPtr, nullptr); if (!m_pScene->GetMeshes().empty()) { @@ -148,14 +150,14 @@ namespace dae { m_VerticiesScreenSpace.clear(); - for (auto& currentMesh: m_pScene->GetMeshes()) { - + for (auto& currentMeshUP: m_pScene->GetMeshes()) { + Mesh* currentMesh = currentMeshUP.get(); if (!currentMesh->GetShouldRender()) { continue; } const Matrix worldViewProjectionMatrix{currentMesh->GetWorldMatrix() * m_Camera.GetViewProjectionMatrix()}; - VertexTransformationFunction(worldViewProjectionMatrix, currentMesh.get(), currentMesh->GetVertices(), m_VerticiesScreenSpace); + VertexTransformationFunction(worldViewProjectionMatrix, currentMesh, currentMesh->GetVertices(), m_VerticiesScreenSpace); int numTriangles{}; @@ -199,14 +201,12 @@ namespace dae { continue; } - const float minX{std::min(vertex0.position.x, std::min(vertex1.position.x, vertex2.position.x))}; const float minY{std::min(vertex0.position.y, std::min(vertex1.position.y, vertex2.position.y))}; const float maxX{std::max(vertex0.position.x, std::max(vertex1.position.x, vertex2.position.x))}; const float maxY{std::max(vertex0.position.y, std::max(vertex1.position.y, vertex2.position.y))}; - const Vector3 side1{vertex1.position - vertex0.position}; const Vector3 side2{vertex2.position - vertex0.position}; @@ -282,6 +282,7 @@ namespace dae { SDL_UpdateWindowSurface(m_pWindow); } + HRESULT Renderer::InitializeDirectX() { //1. Create device & deviceContext //===== @@ -434,13 +435,14 @@ namespace dae { vertex_out.mesh = mesh; vertex_out.valid = isValid; vertex_out.viewDir = (mesh->GetWorldMatrix().TransformPoint(vertex_out.position) - - m_Camera.GetPosition().ToPoint4()).Normalized().GetXYZ(); + - m_Camera.GetPosition().ToPoint4()).Normalized().GetXYZ(); vertices_out.push_back(vertex_out); } } + void Renderer::ToggleDepthBuffer() { m_isDepthBuffer = !m_isDepthBuffer; @@ -469,10 +471,10 @@ namespace dae { const Vector3 biNormal{Vector3::Cross(normal, sample.tangent)}; const Matrix tangentToWorld{ - sample.tangent, - biNormal, - normal, - {0.f, 0.f, 0.f} + sample.tangent, + biNormal, + normal, + {0.f, 0.f, 0.f} }; const ColorRGB normalSample{sample.mesh->GetMaterial()->normalTexturePtr->Sample(sample.uv)}; @@ -533,6 +535,8 @@ namespace dae { return color; } + + void Renderer::CycleCullMode() { for (auto& mesh: m_pScene->GetMeshes()) { mesh->CycleCullMode(); @@ -691,6 +695,12 @@ namespace dae { std::cout << MAGENTA << "This could take a second" << RESET << std::endl; break; + case SceneNames::ShadowTest: + m_pScene = std::make_unique(); + + std::cout << MAGENTA << "[SHARED]" << BLUE << " Scene = ShadowTest" << RESET << std::endl; + std::cout << MAGENTA << "This could take a second" << RESET << std::endl; + case SceneNames::Count: break; } diff --git a/project/src/Scenes/ShadowTestScene.cpp b/project/src/Scenes/ShadowTestScene.cpp new file mode 100644 index 0000000..48de79d --- /dev/null +++ b/project/src/Scenes/ShadowTestScene.cpp @@ -0,0 +1,162 @@ +// +// Created by Bram on 14/01/2025. +// + +#include "ShadowTestScene.h" +#include "../Utils.h" +#include "../Effects/ShadowEffect.h" +#include "../Effects/Effect.h" +#include "../Buffers/DX11Viewport.h" +#include "../RenderSettings.h" + +void ShadowTestScene::Initialize(ID3D11Device *DevicePtr, ID3D11DeviceContext *DeviceContextPtr, Camera *camera) { + // Initialize shadow map buffer + m_ShadowMapBuffer = new ShadowMapBuffer(DevicePtr, 1024 * 4, 1024 * 4); // Example resolution: 1024x1024 + if(!m_ShadowMapBuffer->Initialize()){ + assert(true && "Shadow map buffer failed to initialize"); + } + // Initialize light source + m_Light.SetPosition({-20.0f, 30.0f, 0.0f}); + m_Light.SetTarget({0, -5, 40}); + m_Light.SetUp({0.0f, 1.0f, 0.0f}); + + std::vector vertices{}; + std::vector indices{}; + if(!Utils::ParseOBJNew("resources/ShadingDemo.obj", vertices, indices, true)){ + assert(true && "Model failed to load"); + } + + auto material = std::make_shared(); +// material->diffuseTexturePtr = Texture::LoadFromFile("resources/vehicle_diffuse.png", DevicePtr); + + auto shadowEffect = new ShadowEffect(DevicePtr, L"resources/shadowEffect.fx"); + auto otherEffect = new Effect(DevicePtr, L"resources/SuperSimpleDiffuse.fx"); + + auto shadowMesh = new ShadowMesh(DevicePtr, vertices, indices, material, shadowEffect, otherEffect); + + +// std::vector> materialMeshes; +// Utils::LoadObjWithMaterials("resources/scene.obj", materialMeshes, true, DevicePtr); +// for (const auto &mesh: materialMeshes) { +// if (mesh->vertices.size() > 0) { +// std::shared_ptr material = std::make_shared(); +// BaseEffect *effect = new Effect(DevicePtr, L"resources/SuperSimpleDiffuse.fx"); +// ShadowEffect* shadowEffect = new ShadowEffect(DevicePtr, L"resources/shadowEffect.fx"); +// material->diffuseTexturePtr = Texture::LoadFromFile("./resources/diorama/" + mesh->diffuse_texture, DevicePtr); +// +// if (mesh->opacity_map != "") { +//// continue; +//// effect = new FireEffect(DevicePtr, L"resources/Fire.fx"); +//// material->diffuseTexturePtr = Texture::LoadFromFile("./resources/diorama/" + mesh->diffuse_texture, DevicePtr); +// } else { +// } +// +// m_shadowMeshes.push_back(new ShadowMesh(DevicePtr, mesh->vertices, mesh->indices, material, shadowEffect, effect)); +// +// Matrix worldMatrix = m_shadowMeshes.back()->GetWorldMatrix(); +// worldMatrix *= Matrix::CreateScale(2.f, 2.f, 2.f); +// worldMatrix *= Matrix::CreateScale(-1.f, 1.f, 1.f); // Mirror the model (Possible loading fault) +// m_shadowMeshes.back()->SetWorldMatrix(worldMatrix); +// } +// } + + + //Move forward 100 + shadowMesh->SetWorldMatrix(Matrix::CreateTranslation(Vector3(0, -5, 40))); +// + m_shadowMeshes.push_back(shadowMesh); +// m_shadowMaterials.push_back(material); +} + +void ShadowTestScene::Update() { + +// m_Light.SetTarget(lightTarget); + Vector3 pos = m_Light.GetPosition(); + pos.y = sin(SDL_GetTicks() / 1000.f) * 10.f + 10.f; + m_Light.SetPosition(pos); + + + m_Light.Update(); +} + +void ShadowTestScene::Render(ID3D11DeviceContext *devicePtr, ID3D11RenderTargetView *renderTargetViewPtr, + ID3D11DepthStencilView *depthStencilViewPtr, const Camera &camera) { +// Shadow map pass + + // Set the viewport to match the shadow map size + DX11Viewport ShadowViewport(1024 * 4, 1024 * 4); + ShadowViewport.Apply(devicePtr); + + devicePtr->OMSetRenderTargets(0, nullptr, m_ShadowMapBuffer->GetDepthStencilView()); // Set the shadow map as the render target + devicePtr->ClearDepthStencilView(m_ShadowMapBuffer->GetDepthStencilView(), D3D11_CLEAR_DEPTH, 1.0f, 0); // Clear the shadow map + ID3D11ShaderResourceView* shadowMap = m_ShadowMapBuffer->GetShaderResourceView(); // Get the shadow map shader resource view + devicePtr->PSSetShaderResources(0, 1, &shadowMap); // Set the shadow map as a shader resource + + devicePtr->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST); + + ID3D11SamplerState* shadowSampler = m_ShadowMapBuffer->GetSamplerState(); + devicePtr->PSSetSamplers(0, 1, &shadowSampler); + + auto lightViewProjection = m_Light.GetViewProjectionMatrix(); + + for (auto* mesh : m_shadowMeshes) { + Matrix lightWorldViewProj = mesh->GetWorldMatrix() * lightViewProjection; + dynamic_cast(mesh)->RenderShadow(devicePtr, lightWorldViewProj); + } + + ID3D11DepthStencilView* nullDepthStencilView = nullptr; + devicePtr->OMSetRenderTargets(1, &renderTargetViewPtr, nullDepthStencilView); + +// Set the depthmap correctly + + DX11Viewport ColorViewport(RenderSettings::GetInstance().getWidth(), RenderSettings::GetInstance().getHeight()); + ColorViewport.Apply(devicePtr); + + + devicePtr->OMSetRenderTargets(1, &renderTargetViewPtr, depthStencilViewPtr); + ColorRGB DirectXClearColor{ .39f * 255.f, .59f * 255.f, .93f * 255.f }; + + const float clearColor[] = { + static_cast(DirectXClearColor.r) / 255.f, + static_cast(DirectXClearColor.g) / 255.f, + static_cast(DirectXClearColor.b) / 255.f, + 1.0f + }; + devicePtr->ClearRenderTargetView(renderTargetViewPtr, clearColor); + devicePtr->ClearDepthStencilView(depthStencilViewPtr, D3D11_CLEAR_DEPTH | D3D11_CLEAR_STENCIL, 1.0f, 0); + for (auto* mesh : m_shadowMeshes) { + Matrix worldViewProj = mesh->GetWorldMatrix() * camera.GetViewProjectionMatrix(); + Matrix lightWorldViewProj = mesh->GetWorldMatrix() * lightViewProjection; + + auto* effect = dynamic_cast(mesh)->GetColorEffectPtr() ; + + dynamic_cast(effect)->SetWorldViewProjMatrix(worldViewProj); + dynamic_cast(effect)->SetWorldMatrix(mesh->GetWorldMatrix()); + dynamic_cast(effect)->SetShadowMap(shadowMap); + dynamic_cast(effect)->SetLightViewProjMatrix(lightWorldViewProj); + + + dynamic_cast(mesh)->RenderFinal(devicePtr, worldViewProj); + } +} + +void ShadowTestScene::Cleanup() { + + + for (auto *mesh : m_shadowMeshes) { + delete mesh; + } + + m_shadowMeshes.clear(); + + delete m_ShadowMapBuffer; + +} + +std::vector> & ShadowTestScene::GetMeshes() { + return m_Meshes; +} + +std::vector> &ShadowTestScene::GetMaterials() { + return m_Materials; +} diff --git a/project/src/Scenes/ShadowTestScene.h b/project/src/Scenes/ShadowTestScene.h new file mode 100644 index 0000000..0b2865e --- /dev/null +++ b/project/src/Scenes/ShadowTestScene.h @@ -0,0 +1,41 @@ +#ifndef GP1_DIRECTX_SHADOWTESTSCENE_H +#define GP1_DIRECTX_SHADOWTESTSCENE_H + +#include "BaseScene.h" +#include "../Buffers/ShadowMapBuffer.h" +#include "../DirectionalLight.h" +#include "../ShadowMesh.h" + +class ShadowTestScene: public BaseScene { +public: + void Initialize(ID3D11Device *DevicePtr, ID3D11DeviceContext *DeviceContextPtr, Camera *camera) override; + + void Update() override; + + void Render(ID3D11DeviceContext *devicePtr, ID3D11RenderTargetView *renderTargetViewPtr, ID3D11DepthStencilView *depthStencilViewPtr, + const Camera &camera) override; + + void Cleanup() override; + + std::vector>& GetMeshes() override; + + std::vector> &GetMaterials() override; + +private: + + std::vector> m_Meshes; + std::vector> m_Materials; + + std::vector m_shadowMeshes; + std::vector> m_shadowMaterials; + + ShadowMapBuffer *m_ShadowMapBuffer{nullptr}; + DirectionalLight m_Light; + + float angle = 0.0f; + + void RenderShadowMapToScreen(ID3D11DeviceContext *devicePtr, ID3D11RenderTargetView *renderTargetViewPtr); +}; + + +#endif //GP1_DIRECTX_SHADOWTESTSCENE_H diff --git a/project/src/ShadowMesh.cpp b/project/src/ShadowMesh.cpp new file mode 100644 index 0000000..2681c85 --- /dev/null +++ b/project/src/ShadowMesh.cpp @@ -0,0 +1,118 @@ +#include "ShadowMesh.h" +#include +#include +#include + +ShadowMesh::ShadowMesh(ID3D11Device* devicePtr, + const std::vector& verticesIn, + const std::vector& indices, + std::shared_ptr material, + ShadowEffect* shadowEffectPtr, + BaseEffect* colorEffectPtr) + : m_ShadowEffectPtr(shadowEffectPtr), + m_ColorEffectPtr(colorEffectPtr), + m_VerticesIn(verticesIn), + m_Indices(indices), + m_IndicesCount(static_cast(indices.size())) { + + HRESULT result; + + m_Material = material; + + m_ColorEffectPtr->SetMaterial(material.get()); + + + // Create input layout + D3D11_INPUT_ELEMENT_DESC vertexDesc[] = { + {"POSITION", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 0, D3D11_INPUT_PER_VERTEX_DATA, 0}, + {"TEXCOORD", 0, DXGI_FORMAT_R32G32_FLOAT, 0, static_cast(offsetof(VertexIn, uv)), D3D11_INPUT_PER_VERTEX_DATA, 0}, + {"NORMAL", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, static_cast(offsetof(VertexIn, normal)), D3D11_INPUT_PER_VERTEX_DATA, 0}, + {"TANGENT", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, static_cast(offsetof(VertexIn, tangent)), D3D11_INPUT_PER_VERTEX_DATA, 0}, + }; + + D3DX11_PASS_DESC passDesc; + ID3DX11EffectTechnique* techniquePtr = m_ColorEffectPtr->GetTechniquePtr(); + techniquePtr->GetPassByIndex(0)->GetDesc(&passDesc); + + result = devicePtr->CreateInputLayout(vertexDesc, ARRAYSIZE(vertexDesc), + passDesc.pIAInputSignature, passDesc.IAInputSignatureSize, + &m_InputLayoutPtr); + assert(result == S_OK && "Creating input layout failed"); + + + // Create vertex buffer + D3D11_BUFFER_DESC bufferDesc = {}; + bufferDesc.Usage = D3D11_USAGE_IMMUTABLE; + bufferDesc.ByteWidth = sizeof(VertexIn) * static_cast(verticesIn.size()); + bufferDesc.BindFlags = D3D11_BIND_VERTEX_BUFFER; + bufferDesc.CPUAccessFlags = 0; + + D3D11_SUBRESOURCE_DATA subresourceData = {}; + subresourceData.pSysMem = verticesIn.data(); + + result = devicePtr->CreateBuffer(&bufferDesc, &subresourceData, &m_VertexBufferPtr); + assert(result == S_OK && "Creating vertex buffer failed"); + + // Create index buffer + bufferDesc.Usage = D3D11_USAGE_IMMUTABLE; + bufferDesc.ByteWidth = sizeof(Uint32) * m_IndicesCount; + bufferDesc.BindFlags = D3D11_BIND_INDEX_BUFFER; + + subresourceData.pSysMem = m_Indices.data(); + + result = devicePtr->CreateBuffer(&bufferDesc, &subresourceData, &m_IndexBufferPtr); + assert(result == S_OK && "Creating index buffer failed"); +} + +ShadowMesh::~ShadowMesh() { + if (m_InputLayoutPtr) m_InputLayoutPtr->Release(); + if (m_VertexBufferPtr) m_VertexBufferPtr->Release(); + if (m_IndexBufferPtr) m_IndexBufferPtr->Release(); + + delete m_ShadowEffectPtr; + delete m_ColorEffectPtr; +} + +void ShadowMesh::RenderShadow(ID3D11DeviceContext* deviceContextPtr, const Matrix& lightWorldViewProj) { + m_ShadowEffectPtr->SetLightWorldViewProjMatrix(lightWorldViewProj); + deviceContextPtr->IASetInputLayout(m_InputLayoutPtr); + + const UINT stride = sizeof(VertexIn); + const UINT offset = 0; + deviceContextPtr->IASetVertexBuffers(0, 1, &m_VertexBufferPtr, &stride, &offset); + deviceContextPtr->IASetIndexBuffer(m_IndexBufferPtr, DXGI_FORMAT_R32_UINT, 0); + + D3DX11_TECHNIQUE_DESC techniqueDesc; + m_ShadowEffectPtr->GetTechniquePtr()->GetDesc(&techniqueDesc); + + for (UINT p = 0; p < techniqueDesc.Passes; ++p) { + m_ShadowEffectPtr->GetTechniquePtr()->GetPassByIndex(p)->Apply(0, deviceContextPtr); + deviceContextPtr->DrawIndexed(m_IndicesCount, 0, 0); + } +} + +void ShadowMesh::RenderFinal(ID3D11DeviceContext* deviceContextPtr, const Matrix& worldViewProj) { + m_ColorEffectPtr->SetWorldViewProjMatrix(worldViewProj); + deviceContextPtr->IASetInputLayout(m_InputLayoutPtr); + + const UINT stride = sizeof(VertexIn); + const UINT offset = 0; + deviceContextPtr->IASetVertexBuffers(0, 1, &m_VertexBufferPtr, &stride, &offset); + deviceContextPtr->IASetIndexBuffer(m_IndexBufferPtr, DXGI_FORMAT_R32_UINT, 0); + + D3DX11_TECHNIQUE_DESC techniqueDesc; + m_ColorEffectPtr->GetTechniquePtr()->GetDesc(&techniqueDesc); + for (UINT p = 0; p < techniqueDesc.Passes; ++p) { + m_ColorEffectPtr->GetTechniquePtr()->GetPassByIndex(p)->Apply(0, deviceContextPtr); + deviceContextPtr->DrawIndexed(m_IndicesCount, 0, 0); + } + +} + +void ShadowMesh::SetWorldMatrix(const Matrix& matrix) { + m_WorldMatrix = matrix; +} + +Matrix ShadowMesh::GetWorldMatrix() const { + return m_WorldMatrix; +} diff --git a/project/src/ShadowMesh.h b/project/src/ShadowMesh.h new file mode 100644 index 0000000..526f51c --- /dev/null +++ b/project/src/ShadowMesh.h @@ -0,0 +1,63 @@ +#ifndef SHADOW_MESH_H +#define SHADOW_MESH_H + +#include +#include +#include +#include "Effects/ShadowEffect.h" +#include "Material.h" +#include "Mesh.h" + +class ShadowMesh { +public: + ShadowMesh(ID3D11Device* devicePtr, + const std::vector& verticesIn, + const std::vector& indices, + std::shared_ptr material, + ShadowEffect* shadowEffectPtr, + BaseEffect* colorEffectPtr); + + ~ShadowMesh(); + + void RenderShadow(ID3D11DeviceContext* deviceContextPtr, const Matrix& lightWorldViewProj); + void RenderFinal(ID3D11DeviceContext* deviceContextPtr, const Matrix& worldViewProj); + + void SetWorldMatrix(const Matrix& matrix); + Matrix GetWorldMatrix() const; + + ShadowEffect* GetShadowEffectPtr(){ return m_ShadowEffectPtr; } + BaseEffect* GetColorEffectPtr(){ return m_ColorEffectPtr; } + + +private: + // Shadow effect + ShadowEffect* m_ShadowEffectPtr; + + // Color effect for final render + BaseEffect* m_ColorEffectPtr; + + // Buffers + ID3D11InputLayout* m_InputLayoutPtr; + ID3D11Buffer* m_VertexBufferPtr; + ID3D11Buffer* m_IndexBufferPtr; + + + //Shadow buffers + ID3D11InputLayout* m_ShadowInputLayoutPtr; + ID3D11Buffer* m_ShadowVertexBufferPtr; + ID3D11Buffer* m_ShadowIndexBufferPtr; + + + // Material and mesh data + std::shared_ptr m_Material; + std::vector m_VerticesIn; + std::vector m_Indices; + + // Matrix transformations + Matrix m_WorldMatrix; + + // Indices count + UINT m_IndicesCount; +}; + +#endif // SHADOW_MESH_H \ No newline at end of file diff --git a/project/src/Singleton.h b/project/src/Singleton.h new file mode 100644 index 0000000..f45924f --- /dev/null +++ b/project/src/Singleton.h @@ -0,0 +1,30 @@ +// +// Created by Bram on 16/01/2025. +// + +#ifndef GP1_DIRECTX_SINGLETON_H +#define GP1_DIRECTX_SINGLETON_H + +template +class Singleton { +public: + static T &GetInstance() { + static T instance{}; + return instance; + } + + virtual ~Singleton() = default; + + Singleton(Singleton &&other) = delete; + + Singleton(const Singleton &other) = delete; + + Singleton &operator=(Singleton &&other) = delete; + + Singleton &operator=(const Singleton &other) = delete; + +protected: + Singleton() = default; +}; + +#endif //GP1_DIRECTX_SINGLETON_H diff --git a/project/src/main.cpp b/project/src/main.cpp index 2ff4a15..c31639f 100644 --- a/project/src/main.cpp +++ b/project/src/main.cpp @@ -11,6 +11,7 @@ #include "Renderer.h" #include "GamePadController.h" #include "Utils.h" +#include "RenderSettings.h" using namespace dae; @@ -129,8 +130,11 @@ int main(int argc, char *args[]) { //Create window + surfaces SDL_Init(SDL_INIT_VIDEO | SDL_INIT_JOYSTICK); - const uint32_t width = 1600; - const uint32_t height = 900; + const uint32_t width = 640; + const uint32_t height = 480; + + RenderSettings::GetInstance().setHeight(height); + RenderSettings::GetInstance().setWidth(width); //// const uint32_t width = 640; //// const uint32_t height = 480;