diff --git a/.gitignore b/.gitignore index 4dd52f7..db4d37d 100755 --- a/.gitignore +++ b/.gitignore @@ -2,4 +2,5 @@ /bin/ /lib/ # CLion -.idea/ \ No newline at end of file +.idea/ +.orig \ No newline at end of file diff --git a/CMakeLists.txt b/CMakeLists.txt index 2c56989..0db10d3 100755 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -15,11 +15,11 @@ else() endif() if(CMAKE_COMPILER_IS_GNUCXX) - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++14 -fpermissive") if(UNIX) # Needed to link with debug version of bgfx on linux set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -ldl") endif() + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++14") endif() set(BUILD_SHARED_LIBS FALSE) @@ -31,7 +31,7 @@ include_directories(${PROJECT_SOURCE_DIR}/include) #set(GLFW_INCLUDE_DIR ${daydream_SOURCE_DIR}/libs/glfw-3.0.4/include) #set(GLFW_LIBRARY ${daydream_SOURCE_DIR}/libs/glfw-3.0.4/lib/Release/glfw3dll.lib) -set(Boost_DEBUG ON) +#set(Boost_DEBUG ON) set(Boost_USE_STATIC_LIBS on) add_definitions(-DBOOST_ALL_NO_LIB) #set(BOOST_INCLUDEDIR ${BOOST_ROOT}/boost) @@ -40,9 +40,15 @@ set(BOOST_LIBRARYDIR $ENV{BOOST_ROOT}/lib64-msvc-12.0) #add_definitions(-DGLEW_MX) -set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${PROJECT_SOURCE_DIR}/lib) -set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${PROJECT_SOURCE_DIR}/lib) set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${PROJECT_SOURCE_DIR}/bin) +set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${PROJECT_SOURCE_DIR}/lib) +set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${PROJECT_SOURCE_DIR}/lib) +foreach(OUTPUTCONFIG ${CMAKE_CONFIGURATION_TYPES}) + string(TOUPPER ${OUTPUTCONFIG} OUTPUTCONFIG) + set(CMAKE_RUNTIME_OUTPUT_DIRECTORY_${OUTPUTCONFIG} ${CMAKE_RUNTIME_OUTPUT_DIRECTORY} ) + set(CMAKE_LIBRARY_OUTPUT_DIRECTORY_${OUTPUTCONFIG} ${CMAKE_LIBRARY_OUTPUT_DIRECTORY} ) + set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY_${OUTPUTCONFIG} ${CMAKE_ARCHIVE_OUTPUT_DIRECTORY} ) +endforeach(OUTPUTCONFIG CMAKE_CONFIGURATION_TYPES) add_subdirectory(src/game) add_subdirectory(src/tests) diff --git a/assets/Models/Brick/IceBrick.mtl b/assets/Models/Brick/IceBrick.mtl new file mode 100644 index 0000000..2e11d41 --- /dev/null +++ b/assets/Models/Brick/IceBrick.mtl @@ -0,0 +1,12 @@ +# Blender MTL File: 'Bricks.blend' +# Material Count: 1 + +newmtl Material.002 +Ns 96.078431 +Ka 0.000000 0.000000 0.000000 +Kd 0.640000 0.640000 0.640000 +Ks 0.500000 0.500000 0.500000 +Ni 1.000000 +d 1.000000 +illum 2 +map_Kd IceBrick_Diffuse.png diff --git a/assets/Models/Brick/IceBrick.obj b/assets/Models/Brick/IceBrick.obj new file mode 100644 index 0000000..5c23327 --- /dev/null +++ b/assets/Models/Brick/IceBrick.obj @@ -0,0 +1,1244 @@ +# Blender v2.75 (sub 0) OBJ File: 'Bricks.blend' +# www.blender.org +mtllib IceBrick.mtl +o IceBrick_Cube.001 +v 0.416831 0.151033 0.189181 +v 0.383408 0.157820 0.197587 +v 0.427870 0.161626 0.161784 +v 0.383408 0.180019 0.161784 +v 0.432728 0.125635 0.202365 +v 0.383408 0.126019 0.215784 +v 0.449949 0.126019 0.161784 +v -0.416933 0.151033 0.189181 +v -0.000051 0.166679 0.197587 +v -0.383510 0.157820 0.197587 +v -0.427973 0.161626 0.161784 +v -0.000051 0.188879 0.161784 +v -0.383510 0.180019 0.161784 +v -0.432830 0.125635 0.202365 +v -0.000051 0.126019 0.215784 +v -0.383510 0.126019 0.215784 +v -0.450051 0.126019 0.161784 +v 0.427870 0.161626 -0.000000 +v 0.416831 0.151033 -0.189181 +v 0.383408 0.180019 -0.000000 +v 0.383408 0.157820 -0.197587 +v 0.427870 0.161626 -0.161784 +v 0.383408 0.180019 -0.161784 +v 0.449949 0.126019 -0.000000 +v 0.432728 0.125635 -0.202365 +v 0.383408 0.126019 -0.215784 +v 0.449949 0.126019 -0.161784 +v -0.000051 0.188879 -0.000000 +v -0.427973 0.161626 -0.000000 +v -0.416933 0.151033 -0.189181 +v -0.000051 0.166679 -0.197587 +v -0.383510 0.180019 -0.000000 +v -0.383510 0.157820 -0.197587 +v -0.427973 0.161626 -0.161784 +v -0.000051 0.188879 -0.161784 +v -0.383510 0.180019 -0.161784 +v -0.450051 0.126019 -0.000000 +v -0.432830 0.125635 -0.202365 +v -0.000051 0.126019 -0.215784 +v -0.383510 0.126019 -0.215784 +v -0.450051 0.126019 -0.161784 +v 0.416831 -0.150994 0.189181 +v 0.383408 -0.157781 0.197587 +v 0.427870 -0.161587 0.161784 +v 0.383408 -0.179981 0.161784 +v 0.417419 -0.125596 0.202365 +v 0.383408 -0.125981 0.215784 +v 0.434640 -0.125981 0.161784 +v 0.432672 0.000019 0.202132 +v 0.383408 0.000019 0.215784 +v 0.449949 0.000019 0.161784 +v -0.416933 -0.150994 0.189181 +v -0.000051 -0.157781 0.197587 +v -0.383510 -0.157781 0.197587 +v -0.427973 -0.161587 0.161784 +v -0.000051 -0.179981 0.161784 +v -0.383510 -0.179981 0.161784 +v -0.432830 -0.125596 0.202365 +v -0.000051 -0.125981 0.215784 +v -0.383510 -0.125981 0.215784 +v -0.450051 -0.125981 0.161784 +v -0.432774 0.000019 0.202132 +v -0.000051 0.000019 0.215784 +v -0.383510 0.000019 0.215784 +v -0.450051 0.000019 0.161784 +v 0.427870 -0.161587 -0.000000 +v 0.416831 -0.150994 -0.189181 +v 0.383408 -0.179981 -0.000000 +v 0.383408 -0.157781 -0.197587 +v 0.427870 -0.161587 -0.161784 +v 0.383408 -0.179981 -0.161784 +v 0.434640 -0.125981 -0.000000 +v 0.417419 -0.125596 -0.202365 +v 0.383408 -0.125981 -0.215784 +v 0.434640 -0.125981 -0.161784 +v 0.449949 0.000019 -0.000000 +v 0.432672 0.000019 -0.202132 +v 0.383408 0.000019 -0.215784 +v 0.449949 0.000019 -0.161784 +v -0.000051 -0.179981 -0.000000 +v -0.427973 -0.161587 -0.000000 +v -0.416933 -0.150994 -0.189181 +v -0.000051 -0.157781 -0.197587 +v -0.383510 -0.179981 -0.000000 +v -0.383510 -0.157781 -0.197587 +v -0.427973 -0.161587 -0.161784 +v -0.000051 -0.179981 -0.161784 +v -0.383510 -0.179981 -0.161784 +v -0.450051 -0.125981 -0.000000 +v -0.432830 -0.125596 -0.202365 +v -0.000051 -0.125981 -0.215784 +v -0.383510 -0.125981 -0.215784 +v -0.450051 -0.125981 -0.161784 +v -0.450051 0.000019 -0.000000 +v -0.432774 0.000019 -0.202132 +v -0.000051 0.000019 -0.215784 +v -0.383510 0.000019 -0.215784 +v -0.450051 0.000019 -0.161784 +v 0.191678 0.188879 -0.000000 +v 0.191678 0.166679 0.197587 +v 0.191678 0.188879 0.161784 +v 0.191678 0.126019 0.215784 +v 0.191678 0.000019 0.215784 +v 0.191678 0.166679 -0.197587 +v 0.191678 0.188879 -0.161784 +v 0.191678 0.126019 -0.215784 +v 0.191678 0.000019 -0.215784 +v 0.191678 -0.168907 -0.000000 +v 0.191678 -0.146707 0.197587 +v 0.191678 -0.168907 0.161784 +v 0.191678 -0.125981 0.215784 +v 0.191678 -0.146707 -0.197587 +v 0.191678 -0.168907 -0.161784 +v 0.191678 -0.125981 -0.215784 +v -0.191781 0.180019 -0.000000 +v -0.191781 0.157820 0.197587 +v -0.191781 0.180019 0.161784 +v -0.191781 0.126019 0.215784 +v -0.191781 0.000019 0.215784 +v -0.191781 0.157820 -0.197587 +v -0.191781 0.180019 -0.161784 +v -0.191781 0.126019 -0.215784 +v -0.191781 0.000019 -0.215784 +v -0.191781 -0.179981 -0.000000 +v -0.191781 -0.157781 0.197587 +v -0.191781 -0.179981 0.161784 +v -0.191781 -0.125981 0.215784 +v -0.191781 -0.157781 -0.197587 +v -0.191781 -0.179981 -0.161784 +v -0.191781 -0.125981 -0.215784 +v 0.095814 0.180019 -0.000000 +v 0.095814 0.157820 0.197587 +v 0.095814 0.180019 0.161784 +v 0.095814 0.157820 -0.197587 +v 0.095814 0.180019 -0.161784 +v 0.095814 -0.185887 -0.000000 +v 0.095814 -0.163687 0.197587 +v 0.095814 -0.185887 0.161784 +v 0.095814 -0.163687 -0.197587 +v 0.095814 -0.185887 -0.161784 +v 0.095814 0.126019 0.215784 +v 0.095814 0.000019 0.215784 +v 0.095814 0.126019 -0.215784 +v 0.095814 0.000019 -0.215784 +v 0.095814 -0.125981 0.215784 +v 0.095814 -0.125981 -0.215784 +v -0.100346 0.175590 -0.000000 +v -0.100346 0.153390 0.197587 +v -0.100346 0.175590 0.161784 +v -0.100346 0.153390 -0.197587 +v -0.100346 0.175590 -0.161784 +v -0.095916 -0.171121 -0.000000 +v -0.095916 -0.148922 0.197587 +v -0.095916 -0.171121 0.161784 +v -0.095916 -0.148922 -0.197587 +v -0.095916 -0.171121 -0.161784 +v -0.095916 0.126019 0.215784 +v -0.095916 0.000019 0.215784 +v -0.095916 0.126019 -0.215784 +v -0.095916 0.000019 -0.215784 +v -0.095916 -0.125981 0.215784 +v -0.095916 -0.125981 -0.215784 +v -0.287646 0.126019 0.215784 +v -0.287646 0.000019 0.215784 +v -0.287646 0.126019 -0.215784 +v -0.287646 0.000019 -0.215784 +v -0.287646 -0.125981 0.215784 +v -0.287646 -0.125981 -0.215784 +v -0.291189 0.200396 0.000000 +v -0.291189 0.178196 0.197587 +v -0.291189 0.200396 0.161784 +v -0.291189 0.178196 -0.197587 +v -0.291189 0.200396 -0.161784 +v -0.287646 -0.210102 -0.000000 +v -0.287646 -0.187902 0.197587 +v -0.287646 -0.210102 0.161784 +v -0.287646 -0.187902 -0.197587 +v -0.287646 -0.210102 -0.161784 +v 0.287543 0.126019 0.215784 +v 0.287543 0.000019 0.215784 +v 0.287543 0.126019 -0.215784 +v 0.287543 0.000019 -0.215784 +v 0.287543 -0.125981 0.215784 +v 0.287543 -0.125981 -0.215784 +v 0.287543 0.170422 -0.000000 +v 0.287543 0.157820 0.197587 +v 0.287543 0.170422 0.161784 +v 0.287543 0.157820 -0.197587 +v 0.287543 0.170422 -0.161784 +v 0.287543 -0.191055 -0.000000 +v 0.287543 -0.157781 0.197587 +v 0.287543 -0.191055 0.161784 +v 0.287543 -0.157781 -0.197587 +v 0.287543 -0.191055 -0.161784 +v 0.461431 -0.062981 -0.000000 +v 0.444181 -0.062788 0.202249 +v -0.000051 -0.062981 0.215784 +v 0.383408 -0.062981 0.215784 +v 0.461431 -0.062981 0.161784 +v -0.440306 -0.062095 -0.000000 +v -0.423057 -0.061903 0.202249 +v -0.383510 -0.062981 0.215784 +v -0.440306 -0.062095 0.161784 +v 0.444181 -0.062788 -0.202249 +v -0.000051 -0.062981 -0.215784 +v 0.383408 -0.062981 -0.215784 +v 0.461431 -0.062981 -0.161784 +v -0.423057 -0.061903 -0.202249 +v -0.383510 -0.062981 -0.215784 +v -0.440306 -0.062095 -0.161784 +v 0.191678 -0.062981 -0.215784 +v 0.191678 -0.062981 0.215784 +v -0.191781 -0.062981 -0.215784 +v -0.191781 -0.062981 0.215784 +v 0.095814 -0.062981 -0.215784 +v 0.095814 -0.062981 0.215784 +v -0.095916 -0.062981 -0.215784 +v -0.095916 -0.062981 0.215784 +v -0.287646 -0.062981 0.215784 +v -0.287646 -0.062981 -0.215784 +v 0.287543 -0.062981 0.215784 +v 0.287543 -0.062981 -0.215784 +v 0.442295 0.063019 -0.000000 +v 0.425045 0.062827 0.202249 +v -0.000051 0.063019 0.215784 +v 0.383408 0.063019 0.215784 +v 0.442295 0.063019 0.161784 +v -0.463340 0.065677 -0.000000 +v -0.446091 0.065485 0.202249 +v -0.383510 0.063019 0.215784 +v -0.463340 0.065677 0.161784 +v 0.425045 0.062827 -0.202249 +v -0.000051 0.063019 -0.215784 +v 0.383408 0.063019 -0.215784 +v 0.442295 0.063019 -0.161784 +v -0.446091 0.065485 -0.202249 +v -0.383510 0.063019 -0.215784 +v -0.463340 0.065677 -0.161784 +v 0.191678 0.063019 -0.215784 +v 0.191678 0.063019 0.215784 +v -0.191781 0.063019 -0.215784 +v -0.191781 0.063019 0.215784 +v 0.095814 0.063019 -0.215784 +v 0.095814 0.063019 0.215784 +v -0.095916 0.063019 -0.215784 +v -0.095916 0.063019 0.215784 +v -0.287646 0.063019 0.215784 +v -0.287646 0.063019 -0.215784 +v 0.287543 0.063019 0.215784 +v 0.287543 0.063019 -0.215784 +vt 0.647208 0.589782 +vt 0.614977 0.620190 +vt 0.567364 0.568022 +vt 0.749248 0.473609 +vt 0.735182 0.491870 +vt 0.679386 0.451880 +vt 0.676607 0.432409 +vt 0.688475 0.435522 +vt 0.596441 0.538535 +vt 0.555442 0.555020 +vt 0.692698 0.415871 +vt 0.761994 0.456567 +vt 0.667380 0.441938 +vt 0.657886 0.432128 +vt 0.583721 0.525133 +vt 0.542694 0.541272 +vt 0.672954 0.420873 +vt 0.674105 0.388606 +vt 0.656836 0.400946 +vt 0.640286 0.378419 +vt 0.524505 0.521510 +vt 0.506359 0.501708 +vt 0.536432 0.474247 +vt 0.642268 0.412948 +vt 0.624739 0.393460 +vt 0.654950 0.365112 +vt 0.711807 0.311530 +vt 0.580007 0.651299 +vt 0.442234 0.668320 +vt 0.475986 0.729050 +vt 0.456768 0.741218 +vt 0.422453 0.663520 +vt 0.433030 0.655095 +vt 0.533112 0.595285 +vt 0.438449 0.752493 +vt 0.404003 0.678624 +vt 0.424492 0.675995 +vt 0.411018 0.658431 +vt 0.424114 0.644951 +vt 0.512605 0.569304 +vt 0.358660 0.638584 +vt 0.373446 0.625344 +vt 0.390382 0.647401 +vt 0.476203 0.529351 +vt 0.388879 0.610121 +vt 0.406886 0.628051 +vt 0.299965 0.690996 +vt 0.378570 0.661344 +vt 0.666618 0.676144 +vt 0.790644 0.538695 +vt 0.813966 0.534694 +vt 0.806203 0.549401 +vt 0.680403 0.691160 +vt 0.701717 0.644815 +vt 0.821127 0.510901 +vt 0.804992 0.523196 +vt 0.830142 0.532316 +vt 0.822330 0.558082 +vt 0.716952 0.659696 +vt 0.730382 0.672800 +vt 0.695502 0.707778 +vt 0.794363 0.274974 +vt 0.769278 0.252929 +vt 0.784565 0.236246 +vt 0.904410 0.106140 +vt 0.938376 0.068842 +vt 0.962886 0.091170 +vt 0.810612 0.257532 +vt 0.802793 0.217436 +vt 0.519092 0.788513 +vt 0.512398 0.811725 +vt 0.501871 0.801545 +vt 0.630966 0.711040 +vt 0.488013 0.816411 +vt 0.528077 0.805769 +vt 0.534432 0.822852 +vt 0.657338 0.739312 +vt 0.508233 0.827485 +vt 0.249212 0.785387 +vt 0.223655 0.764326 +vt 0.240040 0.748374 +vt 0.080673 0.940616 +vt 0.058486 0.916816 +vt 0.094701 0.883050 +vt 0.225367 0.805915 +vt 0.203781 0.781735 +vt 0.264657 0.771054 +vt 0.447464 0.436625 +vt 0.398715 0.384059 +vt 0.431413 0.354993 +vt 0.571633 0.335093 +vt 0.537727 0.275192 +vt 0.556918 0.262892 +vt 0.591027 0.339123 +vt 0.581030 0.347697 +vt 0.488702 0.421777 +vt 0.459700 0.450051 +vt 0.572937 0.252869 +vt 0.606651 0.326327 +vt 0.588574 0.327284 +vt 0.599251 0.347214 +vt 0.589707 0.357998 +vt 0.500507 0.434726 +vt 0.470081 0.461783 +vt 0.624112 0.357603 +vt 0.488219 0.481835 +vt 0.606906 0.375185 +vt 0.635931 0.343877 +vt 0.366398 0.414466 +vt 0.264746 0.530294 +vt 0.278226 0.512660 +vt 0.334856 0.550715 +vt 0.337537 0.570570 +vt 0.325696 0.567383 +vt 0.417603 0.466672 +vt 0.321413 0.586825 +vt 0.252152 0.547257 +vt 0.347041 0.561155 +vt 0.356154 0.571301 +vt 0.430468 0.480283 +vt 0.341010 0.582139 +vt 0.340044 0.614658 +vt 0.357549 0.602404 +vt 0.371373 0.590712 +vt 0.346901 0.326628 +vt 0.495145 0.216869 +vt 0.502206 0.195043 +vt 0.511852 0.204672 +vt 0.369801 0.281442 +vt 0.382743 0.297094 +vt 0.522292 0.190422 +vt 0.486907 0.199910 +vt 0.480444 0.182909 +vt 0.500180 0.180590 +vt 0.332756 0.311251 +vt 0.319927 0.297819 +vt 0.356590 0.264904 +vt 0.759540 0.218090 +vt 0.913859 0.046513 +vt 0.779200 0.195380 +vt 0.745317 0.232717 +vt 0.223953 0.464833 +vt 0.200423 0.469395 +vt 0.207643 0.454370 +vt 0.311089 0.358711 +vt 0.193743 0.493002 +vt 0.209548 0.480650 +vt 0.184539 0.472199 +vt 0.191197 0.446735 +vt 0.295798 0.343577 +vt 0.285063 0.332866 +vt 0.215798 0.725264 +vt 0.036298 0.893018 +vt 0.198448 0.741957 +vt 0.845978 0.121142 +vt 0.870474 0.143418 +vt 0.836601 0.180611 +vt 0.405364 0.247232 +vt 0.396931 0.235617 +vt 0.437322 0.206266 +vt 0.447179 0.221685 +vt 0.459966 0.241053 +vt 0.418318 0.264764 +vt 0.501038 0.300421 +vt 0.466275 0.326490 +vt 0.595695 0.420219 +vt 0.566220 0.446942 +vt 0.548490 0.427292 +vt 0.561759 0.381851 +vt 0.530736 0.407213 +vt 0.522959 0.398193 +vt 0.552558 0.370389 +vt 0.510993 0.383860 +vt 0.894949 0.165726 +vt 0.779519 0.587247 +vt 0.794425 0.598169 +vt 0.764474 0.637081 +vt 0.747534 0.622493 +vt 0.732289 0.609297 +vt 0.764689 0.575627 +vt 0.677379 0.558883 +vt 0.707363 0.525561 +vt 0.584067 0.466352 +vt 0.641407 0.469099 +vt 0.614811 0.498667 +vt 0.602057 0.485464 +vt 0.653010 0.480057 +vt 0.626855 0.510954 +vt 0.167215 0.815481 +vt 0.130929 0.849273 +vt 0.108717 0.825457 +vt 0.215379 0.404166 +vt 0.249806 0.368009 +vt 0.263304 0.381202 +vt 0.240069 0.422866 +vt 0.279339 0.395259 +vt 0.336066 0.445426 +vt 0.307091 0.477590 +vt 0.428451 0.537543 +vt 0.446465 0.556739 +vt 0.417574 0.583407 +vt 0.398749 0.507934 +vt 0.409919 0.518668 +vt 0.383114 0.546908 +vt 0.366128 0.530230 +vt 0.354960 0.519975 +vt 0.386053 0.494964 +vt 0.153117 0.873088 +vt 0.606891 0.756135 +vt 0.618655 0.771000 +vt 0.578855 0.801555 +vt 0.562957 0.779127 +vt 0.552491 0.763026 +vt 0.594185 0.738885 +vt 0.511900 0.704532 +vt 0.547849 0.677578 +vt 0.464132 0.576233 +vt 0.451124 0.620768 +vt 0.481459 0.596221 +vt 0.491298 0.608186 +vt 0.463453 0.637890 +vt 0.503026 0.622045 +vt 0.879896 0.083827 +vt 0.518425 0.454517 +vt 0.477223 0.408668 +vt 0.928912 0.128459 +vt 0.554547 0.493916 +vt 0.572880 0.513620 +vt 0.072507 0.859250 +vt 0.457928 0.509571 +vt 0.439304 0.489640 +vt 0.116891 0.906854 +vt 0.644742 0.727614 +vt 0.494359 0.549189 +vt 0.520778 0.581266 +vt 0.473102 0.650496 +vt 0.434698 0.602109 +vt 0.189343 0.839345 +vt 0.400206 0.564808 +vt 0.254326 0.434154 +vt 0.144959 0.791569 +vt 0.630853 0.458225 +vt 0.613262 0.439348 +vt 0.860984 0.202944 +vt 0.540939 0.355056 +vt 0.578405 0.401080 +vt 0.812226 0.158437 +vt 0.787533 0.136334 +vt 0.181553 0.757202 +vt 0.122621 0.767859 +vt 0.050313 0.835461 +vt 0.855360 0.061510 +vt 0.086501 0.801686 +vt 0.821407 0.098863 +vt 0.278642 0.667330 +vt 0.193282 0.699204 +vt 0.158400 0.733719 +vt 0.014110 0.869226 +vt 0.176782 0.715058 +vt 0.724052 0.205427 +vt 0.688273 0.288182 +vt 0.741838 0.189347 +vt 0.754088 0.174339 +vt 0.889331 0.024186 +vt 0.826764 0.240213 +vt 0.885411 0.225266 +vt 0.211547 0.863140 +vt 0.139078 0.930659 +vt 0.953409 0.150789 +vt 0.175306 0.896903 +vt 0.919417 0.188056 +vt 0.284336 0.795514 +vt 0.323865 0.716053 +vt 0.266533 0.810692 +vt 0.247689 0.829204 +vt 0.102859 0.964418 +vt 0.734014 0.334755 +vt 0.817856 0.299266 +vt 0.851502 0.262445 +vt 0.987391 0.113500 +vt 0.833766 0.282375 +vt 0.256397 0.641974 +vt 0.663190 0.263839 +vt 0.345876 0.738588 +vt 0.756611 0.359002 +vn 0.000000 1.000000 0.000000 +vn -0.019800 0.999800 0.000000 +vn -0.018700 0.963000 0.268900 +vn 0.647300 0.762200 0.000000 +vn 0.145700 0.989300 0.000000 +vn 0.131700 0.957300 0.257200 +vn 0.457300 0.661600 0.594300 +vn 0.631200 0.737600 0.239800 +vn 0.000000 0.960500 0.278300 +vn -0.004000 0.675400 0.737400 +vn 0.954100 0.219100 0.204000 +vn 0.976500 0.215300 0.000000 +vn 0.135100 0.696300 0.704900 +vn 0.140600 0.253500 0.957000 +vn 0.000000 0.676600 0.736400 +vn 0.007400 0.214400 0.976700 +vn 0.650500 0.265900 0.711400 +vn 0.979200 -0.000500 0.203100 +vn 0.648800 -0.000900 0.760900 +vn 0.644000 0.089900 0.759700 +vn 0.000000 0.000000 1.000000 +vn 0.156500 0.000000 0.987700 +vn 0.139000 0.004700 0.990300 +vn 0.968700 0.147800 0.199300 +vn 0.988700 0.150000 0.000000 +vn -0.041600 0.999100 0.000000 +vn -0.281700 0.924400 0.256900 +vn -0.300000 0.953900 0.000000 +vn -0.647300 0.762200 0.000000 +vn -0.457300 0.661600 0.594300 +vn -0.201400 0.656600 0.726900 +vn -0.040600 0.959700 0.278000 +vn -0.926500 0.376400 0.000000 +vn -0.904600 0.377200 0.198600 +vn -0.631200 0.737600 0.239800 +vn -0.591400 0.360300 0.721300 +vn -0.135500 0.258500 0.956400 +vn -0.015200 0.276200 0.961000 +vn -0.964500 -0.173900 0.198400 +vn -0.642900 -0.106800 0.758400 +vn -0.670300 0.004900 0.742100 +vn -0.140300 -0.006300 0.990100 +vn -0.118200 -0.000700 0.993000 +vn -0.984300 -0.176700 0.000000 +vn -0.980700 0.008400 0.195100 +vn -0.018700 0.963000 -0.268900 +vn 0.131700 0.957300 -0.257200 +vn 0.457300 0.661600 -0.594300 +vn 0.135100 0.696300 -0.704900 +vn -0.004000 0.675400 -0.737400 +vn 0.000000 0.960500 -0.278300 +vn 0.954100 0.219100 -0.204000 +vn 0.631200 0.737600 -0.239800 +vn 0.650500 0.265900 -0.711400 +vn 0.140600 0.253500 -0.957000 +vn 0.000000 0.676600 -0.736400 +vn 0.000000 0.256900 -0.966400 +vn 0.007400 0.214400 -0.976700 +vn 0.979200 -0.000500 -0.203100 +vn 0.968700 0.147800 -0.199300 +vn 0.644000 0.089900 -0.759700 +vn 0.000000 0.000000 -1.000000 +vn 0.648800 -0.000900 -0.760900 +vn 0.139000 0.004700 -0.990300 +vn -0.281700 0.924400 -0.256900 +vn -0.457300 0.661600 -0.594300 +vn -0.631200 0.737600 -0.239800 +vn -0.040600 0.959700 -0.278000 +vn -0.904600 0.377200 -0.198600 +vn -0.201400 0.656600 -0.726900 +vn -0.135500 0.258500 -0.956400 +vn -0.015200 0.276200 -0.961000 +vn -0.591400 0.360300 -0.721300 +vn -0.670300 0.004900 -0.742100 +vn -0.642900 -0.106800 -0.758400 +vn -0.964500 -0.173900 -0.198400 +vn -0.118200 -0.000700 -0.993000 +vn -0.140300 -0.006300 -0.990100 +vn -0.980700 0.008400 -0.195100 +vn -0.073700 -0.959300 0.272600 +vn -0.076800 -0.997000 0.000000 +vn 0.056900 -0.998400 0.000000 +vn 0.214600 -0.937500 0.273800 +vn 0.250900 -0.968000 0.000000 +vn 0.775500 -0.631300 0.000000 +vn 0.594100 -0.528500 0.606400 +vn 0.155300 -0.682400 0.714300 +vn 0.039100 -0.679500 0.732600 +vn -0.047200 -0.691400 0.720900 +vn 0.956800 -0.290700 0.000000 +vn 0.934800 -0.293500 0.199800 +vn 0.751200 -0.616900 0.234600 +vn 0.594100 -0.288600 0.750800 +vn 0.177700 -0.247200 0.952500 +vn 0.011000 -0.238400 0.971100 +vn -0.009600 -0.263700 0.964500 +vn 0.680600 -0.077700 0.728500 +vn 0.127900 -0.009400 0.991700 +vn 0.975600 -0.105700 0.192600 +vn 0.000000 -1.000000 0.000000 +vn -0.647300 -0.762200 0.000000 +vn -0.341300 -0.939900 0.000000 +vn -0.323300 -0.911100 0.255500 +vn -0.457300 -0.661600 0.594300 +vn -0.631200 -0.737600 0.239800 +vn 0.000000 -0.960500 0.278300 +vn -0.957200 -0.204800 0.204200 +vn -0.979700 -0.200400 0.000000 +vn -0.219500 -0.644300 0.732600 +vn -0.141900 -0.252100 0.957200 +vn 0.000000 -0.730100 0.683300 +vn -0.654800 -0.255900 0.711100 +vn -0.979000 -0.001500 0.203900 +vn -0.647100 -0.000400 0.762300 +vn -0.164100 0.000000 0.986400 +vn -0.073700 -0.959300 -0.272600 +vn 0.214600 -0.937500 -0.273800 +vn 0.594100 -0.528500 -0.606400 +vn 0.751200 -0.616900 -0.234600 +vn 0.039100 -0.679500 -0.732600 +vn 0.053800 -0.961800 -0.268300 +vn 0.934800 -0.293500 -0.199800 +vn 0.155300 -0.682400 -0.714300 +vn 0.177700 -0.247200 -0.952500 +vn 0.594100 -0.288600 -0.750800 +vn -0.047200 -0.691400 -0.720900 +vn -0.009600 -0.263700 -0.964500 +vn 0.011000 -0.238400 -0.971100 +vn 0.680600 -0.077700 -0.728500 +vn 0.127900 -0.009400 -0.991700 +vn 0.975600 -0.105700 -0.192600 +vn -0.323300 -0.911100 -0.255500 +vn -0.457300 -0.661600 -0.594300 +vn -0.219500 -0.644300 -0.732600 +vn 0.000000 -0.960500 -0.278300 +vn -0.957200 -0.204800 -0.204200 +vn -0.631200 -0.737600 -0.239800 +vn -0.654800 -0.255900 -0.711100 +vn -0.141900 -0.252100 -0.957200 +vn 0.000000 -0.730100 -0.683300 +vn 0.000000 -0.329000 -0.944300 +vn -0.979000 -0.001500 -0.203900 +vn -0.647100 -0.000400 -0.762300 +vn 0.013500 -0.737100 -0.675600 +vn 0.000000 -0.352500 -0.935800 +vn -0.012200 -0.265500 -0.964000 +vn -0.038000 -0.644200 -0.763900 +vn -0.051000 -0.934400 -0.352500 +vn -0.005200 -0.954400 -0.298300 +vn -0.056000 -0.998400 0.000000 +vn -0.025800 -0.999700 0.000000 +vn -0.012200 -0.265500 0.964000 +vn 0.000000 -0.352500 0.935800 +vn 0.013500 -0.737100 0.675600 +vn -0.038000 -0.644200 0.763900 +vn -0.005200 -0.954400 0.298300 +vn 0.025500 0.759000 -0.650500 +vn 0.000000 0.220000 -0.975500 +vn 0.018300 0.676800 -0.735900 +vn 0.046300 0.962400 -0.267500 +vn 0.044800 0.978900 -0.199400 +vn 0.049000 0.998800 0.000000 +vn 0.045200 0.999000 0.000000 +vn 0.025500 0.759000 0.650500 +vn 0.018300 0.676800 0.735900 +vn 0.000000 0.220000 0.975500 +vn 0.044800 0.978900 0.199400 +vn 0.046300 0.962400 0.267500 +vn 0.000000 -0.169000 -0.985600 +vn 0.009600 -0.263700 -0.964500 +vn 0.101000 -0.663500 -0.741300 +vn 0.000000 -0.645900 -0.763400 +vn 0.192700 -0.942100 -0.274200 +vn 0.197000 -0.980400 0.000000 +vn 0.101000 -0.663500 0.741300 +vn 0.009600 -0.263700 0.964500 +vn 0.000000 -0.169000 0.985600 +vn 0.000000 -0.645900 0.763400 +vn 0.000000 -0.965300 0.261100 +vn 0.192700 -0.942100 0.274200 +vn 0.064000 0.674900 -0.735100 +vn 0.004900 0.260500 -0.965500 +vn 0.000800 0.187900 -0.982200 +vn -0.006200 0.650900 -0.759100 +vn -0.007000 0.964300 -0.264800 +vn 0.121600 0.953500 -0.275700 +vn -0.007500 1.000000 0.000000 +vn 0.124900 0.992200 0.000000 +vn 0.000800 0.187900 0.982200 +vn 0.004900 0.260500 0.965500 +vn 0.064000 0.674900 0.735100 +vn -0.006200 0.650900 0.759100 +vn 0.121600 0.953500 0.275700 +vn 0.053800 -0.961800 0.268300 +vn 0.000000 0.256900 0.966400 +vn 0.000000 -0.329000 0.944300 +vn -0.033400 0.707200 -0.706200 +vn -0.033400 0.707200 0.706200 +vn -0.007000 0.964300 0.264800 +vn 0.000000 -0.965300 -0.261100 +vn -0.051000 -0.934400 0.352500 +vn -0.164100 0.000000 -0.986400 +vn -1.000000 -0.002100 0.000000 +vn 0.993800 -0.110700 0.000000 +vn 0.156500 0.000000 -0.987700 +vn -0.999900 0.008500 0.000000 +vn 1.000000 0.000000 0.000000 +usemtl Material.002 +s 1 +f 131/1/1 28/2/2 12/3/3 +f 18/4/4 20/5/5 4/6/6 +f 1/7/7 3/8/8 4/6/6 +f 133/9/9 12/3/3 9/10/10 +f 3/8/8 7/11/11 24/12/12 +f 1/7/7 2/13/13 6/14/14 +f 132/15/15 9/10/10 15/16/16 +f 1/7/7 5/17/17 7/11/11 +f 227/18/18 224/19/19 49/20/20 +f 225/21/21 63/22/21 142/23/21 +f 224/19/19 226/24/22 50/25/23 +f 227/18/18 51/26/24 76/27/25 +f 12/3/3 28/2/2 147/28/26 +f 13/29/27 32/30/28 29/31/29 +f 8/32/30 10/33/31 13/29/27 +f 9/10/10 12/3/3 149/34/32 +f 37/35/33 17/36/34 11/37/35 +f 8/32/30 14/38/36 16/39/37 +f 157/40/38 15/16/16 9/10/10 +f 17/36/34 14/38/36 8/32/30 +f 65/41/39 62/42/40 229/43/41 +f 158/44/21 63/22/21 225/21/21 +f 62/42/40 64/45/42 230/46/43 +f 94/47/44 65/41/39 231/48/45 +f 35/49/46 28/2/2 131/1/1 +f 23/50/47 20/5/5 18/4/4 +f 19/51/48 21/52/49 23/50/47 +f 31/53/50 35/49/46 135/54/51 +f 24/12/12 27/55/52 22/56/53 +f 19/51/48 25/57/54 26/58/55 +f 134/59/56 143/60/57 39/61/58 +f 27/55/52 25/57/54 19/51/48 +f 235/62/59 79/63/60 77/64/61 +f 144/65/62 96/66/62 233/67/62 +f 232/68/63 77/64/61 78/69/64 +f 76/27/25 79/63/60 235/62/59 +f 147/28/26 28/2/2 35/49/46 +f 29/31/29 32/30/28 36/70/65 +f 30/71/66 34/72/67 36/70/65 +f 151/73/68 35/49/46 31/53/50 +f 34/72/67 41/74/69 37/35/33 +f 30/71/66 33/75/70 40/76/71 +f 31/53/50 39/61/58 159/77/72 +f 30/71/66 38/78/73 41/74/69 +f 236/79/74 95/80/75 98/81/76 +f 233/82/62 96/83/62 160/84/62 +f 237/85/77 97/86/78 95/80/75 +f 238/87/79 98/81/76 94/47/44 +f 56/88/80 80/89/81 136/90/82 +f 45/91/83 68/92/84 66/93/85 +f 42/94/86 43/95/87 45/91/83 +f 137/96/88 53/97/89 56/88/80 +f 72/98/90 48/99/91 44/100/92 +f 46/101/93 47/102/94 43/95/87 +f 145/103/95 59/104/96 53/97/89 +f 48/99/91 46/101/93 42/94/86 +f 51/26/24 49/20/20 196/105/97 +f 142/23/21 63/22/21 197/106/21 +f 49/20/20 50/25/23 198/107/98 +f 76/27/25 51/26/24 199/108/99 +f 152/109/100 80/89/81 56/88/80 +f 81/110/101 84/111/102 57/112/103 +f 52/113/104 55/114/105 57/112/103 +f 154/115/106 56/88/80 53/97/89 +f 55/114/105 61/116/107 89/117/108 +f 52/113/104 54/118/109 60/119/110 +f 153/120/111 53/97/89 59/104/96 +f 52/113/104 58/121/112 61/116/107 +f 203/122/113 201/123/114 62/42/40 +f 197/106/21 63/22/21 158/44/21 +f 201/123/114 202/124/115 64/45/42 +f 203/122/113 65/41/39 94/47/44 +f 136/90/82 80/89/81 87/125/116 +f 66/93/85 68/92/84 71/126/117 +f 67/127/118 70/128/119 71/126/117 +f 139/129/120 140/130/121 87/125/116 +f 70/128/119 75/131/122 72/98/90 +f 69/132/123 74/133/124 73/134/125 +f 83/135/126 91/136/127 146/137/128 +f 67/127/118 73/134/125 75/131/122 +f 204/138/129 77/64/61 79/63/60 +f 205/139/62 96/66/62 144/65/62 +f 206/140/130 78/69/64 77/64/61 +f 207/141/131 79/63/60 76/27/25 +f 87/125/116 80/89/81 152/109/100 +f 88/142/132 84/111/102 81/110/101 +f 82/143/133 85/144/134 88/142/132 +f 83/135/126 87/125/116 156/145/135 +f 89/117/108 93/146/136 86/147/137 +f 82/143/133 90/148/138 92/149/139 +f 155/150/140 162/151/141 91/136/127 +f 93/146/136 90/148/138 82/143/133 +f 210/152/142 98/81/76 95/80/75 +f 160/84/62 96/83/62 205/153/62 +f 208/154/143 95/80/75 97/86/78 +f 94/47/44 98/81/76 210/152/142 +f 211/155/62 107/156/62 182/157/62 +f 112/158/144 114/159/145 184/160/146 +f 193/161/147 194/162/148 113/163/149 +f 190/164/150 108/165/151 113/163/149 +f 180/166/21 103/167/21 212/168/21 +f 183/169/152 111/170/153 109/171/154 +f 191/172/155 109/171/154 110/173/156 +f 110/173/156 108/165/151 190/164/150 +f 182/157/62 107/156/62 239/174/62 +f 188/175/157 181/176/57 106/177/158 +f 104/178/159 105/179/160 189/180/161 +f 105/179/160 99/181/162 185/182/163 +f 240/183/21 103/167/21 180/166/21 +f 186/184/164 100/185/165 102/186/166 +f 187/187/167 101/188/168 100/185/165 +f 185/182/163 99/181/162 101/188/168 +f 166/189/62 123/190/62 213/191/62 +f 168/192/169 130/193/170 128/194/171 +f 177/195/172 128/194/171 129/196/173 +f 129/196/173 124/197/174 174/198/100 +f 214/199/21 119/200/21 164/201/21 +f 125/202/175 127/203/176 167/204/177 +f 175/205/178 176/206/179 126/207/180 +f 174/198/100 124/197/174 126/207/180 +f 241/208/62 123/190/62 166/189/62 +f 120/209/181 122/210/182 165/211/183 +f 172/212/184 173/213/185 121/214/186 +f 169/215/187 115/216/188 121/214/186 +f 164/201/21 119/200/21 242/217/21 +f 163/218/189 118/219/190 116/220/191 +f 170/221/192 116/220/191 117/222/193 +f 117/222/193 115/216/188 169/215/187 +f 215/223/62 144/65/62 107/156/62 +f 112/158/144 139/129/120 146/137/128 +f 113/163/149 140/130/121 139/129/120 +f 108/165/151 136/90/82 140/130/121 +f 103/167/21 142/23/21 216/224/21 +f 109/171/154 111/170/153 145/103/95 +f 137/96/88 138/225/194 110/173/156 +f 138/225/194 136/90/82 108/165/151 +f 107/156/62 144/65/62 243/226/62 +f 106/177/158 143/60/57 134/59/56 +f 104/178/159 134/59/56 135/54/51 +f 135/54/51 131/1/1 99/181/162 +f 244/227/21 142/23/21 103/167/21 +f 132/15/15 141/228/195 102/186/166 +f 100/185/165 101/188/168 133/9/9 +f 99/181/162 131/1/1 133/9/9 +f 123/190/62 160/84/62 217/229/62 +f 130/193/170 162/151/141 155/150/140 +f 128/194/171 155/150/140 156/145/135 +f 156/145/135 152/109/100 124/197/174 +f 218/230/21 158/44/21 119/200/21 +f 153/120/111 161/231/196 127/203/176 +f 125/202/175 126/207/180 154/115/106 +f 124/197/174 152/109/100 154/115/106 +f 245/232/62 160/84/62 123/190/62 +f 150/233/197 159/77/72 122/210/182 +f 120/209/181 121/214/186 151/73/68 +f 115/216/188 147/28/26 151/73/68 +f 119/200/21 158/44/21 246/234/21 +f 118/219/190 157/40/38 148/235/198 +f 116/220/191 148/235/198 149/34/32 +f 149/34/32 147/28/26 115/216/188 +f 171/236/199 169/215/187 32/30/28 +f 170/221/192 171/236/199 13/29/27 +f 10/33/31 16/39/37 163/218/189 +f 64/45/42 164/201/21 247/237/21 +f 32/30/28 169/215/187 173/213/185 +f 36/70/65 173/213/185 172/212/184 +f 33/75/70 172/212/184 165/211/183 +f 248/238/62 166/189/62 97/86/78 +f 84/111/102 174/198/100 176/206/179 +f 57/112/103 176/206/179 175/205/178 +f 54/118/109 175/205/178 167/204/177 +f 219/239/21 164/201/21 64/45/42 +f 178/240/200 174/198/100 84/111/102 +f 177/195/172 178/240/200 88/142/132 +f 85/144/134 92/149/139 168/192/169 +f 97/86/78 166/189/62 220/241/62 +f 20/5/5 185/182/163 187/187/167 +f 2/13/13 4/6/6 187/187/167 +f 186/184/164 179/242/195 6/14/14 +f 249/243/21 180/166/21 50/25/23 +f 189/180/161 185/182/163 20/5/5 +f 21/52/49 188/175/157 189/180/161 +f 26/58/55 181/176/57 188/175/157 +f 78/69/64 182/157/62 250/244/62 +f 192/245/201 190/164/150 68/92/84 +f 191/172/155 192/245/201 45/91/83 +f 47/102/94 183/169/152 191/172/155 +f 50/25/23 180/166/21 221/246/21 +f 68/92/84 190/164/150 194/162/148 +f 71/126/117 194/162/148 193/161/147 +f 193/161/147 184/160/146 74/133/124 +f 222/247/62 182/157/62 78/69/64 +f 184/248/146 222/247/62 206/140/130 +f 198/107/98 221/246/21 183/169/152 +f 209/249/202 220/241/62 168/250/169 +f 167/204/177 219/239/21 202/124/115 +f 161/231/196 218/230/21 214/199/21 +f 213/191/62 217/229/62 162/251/141 +f 212/168/21 216/224/21 145/103/95 +f 146/252/128 215/223/62 211/155/62 +f 127/203/176 214/199/21 219/239/21 +f 220/241/62 213/191/62 130/253/170 +f 221/246/21 212/168/21 111/170/153 +f 114/254/145 211/155/62 222/247/62 +f 200/255/203 210/152/142 93/256/136 +f 208/154/143 209/249/202 92/257/139 +f 217/229/62 205/153/62 91/258/127 +f 210/152/142 208/154/143 90/259/138 +f 75/260/122 207/141/131 195/261/204 +f 73/262/125 74/263/124 206/140/130 +f 91/264/127 205/139/62 215/223/62 +f 75/260/122 73/262/125 204/138/129 +f 61/116/107 203/122/113 200/255/203 +f 60/119/110 202/124/115 201/123/114 +f 59/104/96 197/106/21 218/230/21 +f 58/121/112 201/123/114 203/122/113 +f 195/261/204 199/108/99 48/99/91 +f 46/101/93 196/105/97 198/107/98 +f 216/224/21 197/106/21 59/104/96 +f 48/99/91 199/108/99 196/105/97 +f 234/265/205 250/244/62 181/266/57 +f 179/242/195 249/243/21 226/24/22 +f 165/267/183 248/238/62 237/85/77 +f 230/46/43 247/237/21 163/218/189 +f 242/217/21 246/234/21 157/40/38 +f 159/268/72 245/232/62 241/208/62 +f 141/228/195 244/227/21 240/183/21 +f 239/174/62 243/226/62 143/269/57 +f 247/237/21 242/217/21 118/219/190 +f 122/270/182 241/208/62 248/238/62 +f 102/186/166 240/183/21 249/243/21 +f 250/244/62 239/174/62 106/271/158 +f 41/272/69 238/87/79 228/273/206 +f 38/274/73 40/275/71 237/85/77 +f 39/276/58 233/82/62 245/232/62 +f 41/272/69 38/274/73 236/79/74 +f 223/277/207 235/62/59 27/278/52 +f 232/68/63 234/265/205 26/279/55 +f 243/226/62 233/67/62 39/280/58 +f 235/62/59 232/68/63 25/281/54 +f 228/273/206 231/48/45 17/36/34 +f 14/38/36 229/43/41 230/46/43 +f 246/234/21 225/21/21 15/16/16 +f 17/36/34 231/48/45 229/43/41 +f 7/11/11 227/18/18 223/277/207 +f 6/14/14 226/24/22 224/19/19 +f 15/16/16 225/21/21 244/227/21 +f 5/17/17 224/19/19 227/18/18 +f 133/9/9 131/1/1 12/3/3 +f 3/8/8 18/4/4 4/6/6 +f 2/13/13 1/7/7 4/6/6 +f 132/15/15 133/9/9 9/10/10 +f 18/4/4 3/8/8 24/12/12 +f 5/17/17 1/7/7 6/14/14 +f 141/228/195 132/15/15 15/16/16 +f 3/8/8 1/7/7 7/11/11 +f 51/26/24 227/18/18 49/20/20 +f 244/227/21 225/21/21 142/23/21 +f 49/20/20 224/19/19 50/25/23 +f 223/277/207 227/18/18 76/27/25 +f 149/34/32 12/3/3 147/28/26 +f 11/37/35 13/29/27 29/31/29 +f 11/37/35 8/32/30 13/29/27 +f 148/235/198 9/10/10 149/34/32 +f 29/31/29 37/35/33 11/37/35 +f 10/33/31 8/32/30 16/39/37 +f 148/235/198 157/40/38 9/10/10 +f 11/37/35 17/36/34 8/32/30 +f 231/48/45 65/41/39 229/43/41 +f 246/234/21 158/44/21 225/21/21 +f 229/43/41 62/42/40 230/46/43 +f 228/273/206 94/47/44 231/48/45 +f 135/54/51 35/49/46 131/1/1 +f 22/56/53 23/50/47 18/4/4 +f 22/56/53 19/51/48 23/50/47 +f 134/59/56 31/53/50 135/54/51 +f 18/4/4 24/12/12 22/56/53 +f 21/52/49 19/51/48 26/58/55 +f 31/53/50 134/59/56 39/61/58 +f 22/56/53 27/55/52 19/51/48 +f 232/68/63 235/62/59 77/64/61 +f 243/226/62 144/65/62 233/67/62 +f 234/265/205 232/68/63 78/69/64 +f 223/277/207 76/27/25 235/62/59 +f 151/73/68 147/28/26 35/49/46 +f 34/72/67 29/31/29 36/70/65 +f 33/75/70 30/71/66 36/70/65 +f 150/233/197 151/73/68 31/53/50 +f 29/31/29 34/72/67 37/35/33 +f 38/78/73 30/71/66 40/76/71 +f 150/233/197 31/53/50 159/77/72 +f 34/72/67 30/71/66 41/74/69 +f 238/87/79 236/79/74 98/81/76 +f 245/232/62 233/82/62 160/84/62 +f 236/79/74 237/85/77 95/80/75 +f 228/273/206 238/87/79 94/47/44 +f 138/225/194 56/88/80 136/90/82 +f 44/100/92 45/91/83 66/93/85 +f 44/100/92 42/94/86 45/91/83 +f 138/225/194 137/96/88 56/88/80 +f 66/93/85 72/98/90 44/100/92 +f 42/94/86 46/101/93 43/95/87 +f 137/96/88 145/103/95 53/97/89 +f 44/100/92 48/99/91 42/94/86 +f 199/108/99 51/26/24 196/105/97 +f 216/224/21 142/23/21 197/106/21 +f 196/105/97 49/20/20 198/107/98 +f 195/261/204 76/27/25 199/108/99 +f 154/115/106 152/109/100 56/88/80 +f 55/114/105 81/110/101 57/112/103 +f 54/118/109 52/113/104 57/112/103 +f 153/120/111 154/115/106 53/97/89 +f 81/110/101 55/114/105 89/117/108 +f 58/121/112 52/113/104 60/119/110 +f 161/231/196 153/120/111 59/104/96 +f 55/114/105 52/113/104 61/116/107 +f 65/41/39 203/122/113 62/42/40 +f 218/230/21 197/106/21 158/44/21 +f 62/42/40 201/123/114 64/45/42 +f 200/255/203 203/122/113 94/47/44 +f 140/130/121 136/90/82 87/125/116 +f 70/128/119 66/93/85 71/126/117 +f 69/132/123 67/127/118 71/126/117 +f 83/135/126 139/129/120 87/125/116 +f 66/93/85 70/128/119 72/98/90 +f 67/127/118 69/132/123 73/134/125 +f 139/129/120 83/135/126 146/137/128 +f 70/128/119 67/127/118 75/131/122 +f 207/141/131 204/138/129 79/63/60 +f 215/223/62 205/139/62 144/65/62 +f 204/138/129 206/140/130 77/64/61 +f 195/261/204 207/141/131 76/27/25 +f 156/145/135 87/125/116 152/109/100 +f 86/147/137 88/142/132 81/110/101 +f 86/147/137 82/143/133 88/142/132 +f 155/150/140 83/135/126 156/145/135 +f 81/110/101 89/117/108 86/147/137 +f 85/144/134 82/143/133 92/149/139 +f 83/135/126 155/150/140 91/136/127 +f 86/147/137 93/146/136 82/143/133 +f 208/154/143 210/152/142 95/80/75 +f 217/229/62 160/84/62 205/153/62 +f 209/249/202 208/154/143 97/86/78 +f 200/255/203 94/47/44 210/152/142 +f 222/247/62 211/155/62 182/157/62 +f 193/161/147 112/158/144 184/160/146 +f 112/158/144 193/161/147 113/163/149 +f 194/162/148 190/164/150 113/163/149 +f 221/246/21 180/166/21 212/168/21 +f 191/172/155 183/169/152 109/171/154 +f 192/245/201 191/172/155 110/173/156 +f 192/245/201 110/173/156 190/164/150 +f 250/244/62 182/157/62 239/174/62 +f 104/178/159 188/175/157 106/177/158 +f 188/175/157 104/178/159 189/180/161 +f 189/180/161 105/179/160 185/182/163 +f 249/243/21 240/183/21 180/166/21 +f 179/242/195 186/184/164 102/186/166 +f 186/184/164 187/187/167 100/185/165 +f 187/187/167 185/182/163 101/188/168 +f 220/241/62 166/189/62 213/191/62 +f 177/195/172 168/192/169 128/194/171 +f 178/240/200 177/195/172 129/196/173 +f 178/240/200 129/196/173 174/198/100 +f 219/239/21 214/199/21 164/201/21 +f 175/205/178 125/202/175 167/204/177 +f 125/202/175 175/205/178 126/207/180 +f 176/206/179 174/198/100 126/207/180 +f 248/238/62 241/208/62 166/189/62 +f 172/212/184 120/209/181 165/211/183 +f 120/209/181 172/212/184 121/214/186 +f 173/213/185 169/215/187 121/214/186 +f 247/237/21 164/201/21 242/217/21 +f 170/221/192 163/218/189 116/220/191 +f 171/236/199 170/221/192 117/222/193 +f 171/236/199 117/222/193 169/215/187 +f 211/155/62 215/223/62 107/156/62 +f 114/159/145 112/158/144 146/137/128 +f 112/158/144 113/163/149 139/129/120 +f 113/163/149 108/165/151 140/130/121 +f 212/168/21 103/167/21 216/224/21 +f 137/96/88 109/171/154 145/103/95 +f 109/171/154 137/96/88 110/173/156 +f 110/173/156 138/225/194 108/165/151 +f 239/174/62 107/156/62 243/226/62 +f 104/178/159 106/177/158 134/59/56 +f 105/179/160 104/178/159 135/54/51 +f 105/179/160 135/54/51 99/181/162 +f 240/183/21 244/227/21 103/167/21 +f 100/185/165 132/15/15 102/186/166 +f 132/15/15 100/185/165 133/9/9 +f 101/188/168 99/181/162 133/9/9 +f 213/191/62 123/190/62 217/229/62 +f 128/194/171 130/193/170 155/150/140 +f 129/196/173 128/194/171 156/145/135 +f 129/196/173 156/145/135 124/197/174 +f 214/199/21 218/230/21 119/200/21 +f 125/202/175 153/120/111 127/203/176 +f 153/120/111 125/202/175 154/115/106 +f 126/207/180 124/197/174 154/115/106 +f 241/208/62 245/232/62 123/190/62 +f 120/209/181 150/233/197 122/210/182 +f 150/233/197 120/209/181 151/73/68 +f 121/214/186 115/216/188 151/73/68 +f 242/217/21 119/200/21 246/234/21 +f 116/220/191 118/219/190 148/235/198 +f 117/222/193 116/220/191 149/34/32 +f 117/222/193 149/34/32 115/216/188 +f 13/29/27 171/236/199 32/30/28 +f 10/33/31 170/221/192 13/29/27 +f 170/221/192 10/33/31 163/218/189 +f 230/46/43 64/45/42 247/237/21 +f 36/70/65 32/30/28 173/213/185 +f 33/75/70 36/70/65 172/212/184 +f 40/76/71 33/75/70 165/211/183 +f 237/85/77 248/238/62 97/86/78 +f 57/112/103 84/111/102 176/206/179 +f 54/118/109 57/112/103 175/205/178 +f 60/119/110 54/118/109 167/204/177 +f 202/124/115 219/239/21 64/45/42 +f 88/142/132 178/240/200 84/111/102 +f 85/144/134 177/195/172 88/142/132 +f 177/195/172 85/144/134 168/192/169 +f 209/249/202 97/86/78 220/241/62 +f 4/6/6 20/5/5 187/187/167 +f 186/184/164 2/13/13 187/187/167 +f 2/13/13 186/184/164 6/14/14 +f 226/24/22 249/243/21 50/25/23 +f 23/50/47 189/180/161 20/5/5 +f 23/50/47 21/52/49 189/180/161 +f 21/52/49 26/58/55 188/175/157 +f 234/265/205 78/69/64 250/244/62 +f 45/91/83 192/245/201 68/92/84 +f 43/95/87 191/172/155 45/91/83 +f 43/95/87 47/102/94 191/172/155 +f 198/107/98 50/25/23 221/246/21 +f 71/126/117 68/92/84 194/162/148 +f 69/132/123 71/126/117 193/161/147 +f 69/132/123 193/161/147 74/133/124 +f 206/140/130 222/247/62 78/69/64 +f 74/263/124 184/248/146 206/140/130 +f 47/102/94 198/107/98 183/169/152 +f 92/257/139 209/249/202 168/250/169 +f 60/119/110 167/204/177 202/124/115 +f 127/203/176 161/231/196 214/199/21 +f 130/253/170 213/191/62 162/251/141 +f 111/170/153 212/168/21 145/103/95 +f 114/254/145 146/252/128 211/155/62 +f 167/204/177 127/203/176 219/239/21 +f 168/250/169 220/241/62 130/253/170 +f 183/169/152 221/246/21 111/170/153 +f 184/248/146 114/254/145 222/247/62 +f 89/282/108 200/255/203 93/256/136 +f 90/259/138 208/154/143 92/257/139 +f 162/251/141 217/229/62 91/258/127 +f 93/256/136 210/152/142 90/259/138 +f 72/283/90 75/260/122 195/261/204 +f 204/138/129 73/262/125 206/140/130 +f 146/252/128 91/264/127 215/223/62 +f 207/141/131 75/260/122 204/138/129 +f 89/282/108 61/116/107 200/255/203 +f 58/121/112 60/119/110 201/123/114 +f 161/231/196 59/104/96 218/230/21 +f 61/116/107 58/121/112 203/122/113 +f 72/283/90 195/261/204 48/99/91 +f 47/102/94 46/101/93 198/107/98 +f 145/103/95 216/224/21 59/104/96 +f 46/101/93 48/99/91 196/105/97 +f 26/279/55 234/265/205 181/266/57 +f 6/14/14 179/242/195 226/24/22 +f 40/275/71 165/267/183 237/85/77 +f 16/39/37 230/46/43 163/218/189 +f 118/219/190 242/217/21 157/40/38 +f 122/270/182 159/268/72 241/208/62 +f 102/186/166 141/228/195 240/183/21 +f 106/271/158 239/174/62 143/269/57 +f 163/218/189 247/237/21 118/219/190 +f 165/267/183 122/270/182 248/238/62 +f 179/242/195 102/186/166 249/243/21 +f 181/266/57 250/244/62 106/271/158 +f 37/284/33 41/272/69 228/273/206 +f 236/79/74 38/274/73 237/85/77 +f 159/268/72 39/276/58 245/232/62 +f 238/87/79 41/272/69 236/79/74 +f 24/285/12 223/277/207 27/278/52 +f 25/281/54 232/68/63 26/279/55 +f 143/269/57 243/226/62 39/280/58 +f 27/278/52 235/62/59 25/281/54 +f 37/284/33 228/273/206 17/36/34 +f 16/39/37 14/38/36 230/46/43 +f 157/40/38 246/234/21 15/16/16 +f 14/38/36 17/36/34 229/43/41 +f 24/285/12 7/11/11 223/277/207 +f 5/17/17 6/14/14 224/19/19 +f 141/228/195 15/16/16 244/227/21 +f 7/11/11 5/17/17 227/18/18 diff --git a/assets/Models/Brick/IceBrick_Diffuse.png b/assets/Models/Brick/IceBrick_Diffuse.png new file mode 100644 index 0000000..caeb95f Binary files /dev/null and b/assets/Models/Brick/IceBrick_Diffuse.png differ diff --git a/assets/Models/Brick/TurquoiseBrick.mtl b/assets/Models/Brick/TurquoiseBrick.mtl new file mode 100644 index 0000000..e8cff6f --- /dev/null +++ b/assets/Models/Brick/TurquoiseBrick.mtl @@ -0,0 +1,12 @@ +# Blender MTL File: 'Bricks.blend' +# Material Count: 1 + +newmtl Material.004 +Ns 96.078431 +Ka 0.000000 0.000000 0.000000 +Kd 0.640000 0.640000 0.640000 +Ks 0.500000 0.500000 0.500000 +Ni 1.000000 +d 1.000000 +illum 2 +map_Kd turquoise.png diff --git a/assets/Models/Brick/TurquoiseBrick.obj b/assets/Models/Brick/TurquoiseBrick.obj new file mode 100644 index 0000000..ef5b0fc --- /dev/null +++ b/assets/Models/Brick/TurquoiseBrick.obj @@ -0,0 +1,513 @@ +# Blender v2.75 (sub 0) OBJ File: 'Bricks.blend' +# www.blender.org +mtllib TurquoiseBrick.mtl +o OriginalBrick_Cube.002 +v 0.416882 0.151013 0.189181 +v 0.383459 0.157800 0.197587 +v 0.427922 0.161606 0.161784 +v 0.383459 0.180000 0.161784 +v 0.432779 0.125616 0.202365 +v 0.383459 0.126000 0.215784 +v 0.450000 0.126000 0.161784 +v -0.416882 0.151013 0.189181 +v 0.000000 0.157800 0.197587 +v -0.383459 0.157800 0.197587 +v -0.427922 0.161606 0.161784 +v 0.000000 0.180000 0.161784 +v -0.383459 0.180000 0.161784 +v -0.432779 0.125616 0.202365 +v 0.000000 0.126000 0.215784 +v -0.383459 0.126000 0.215784 +v -0.450000 0.126000 0.161784 +v 0.427922 0.161606 0.000000 +v 0.416882 0.151013 -0.189181 +v 0.383459 0.180000 0.000000 +v 0.383459 0.157800 -0.197587 +v 0.427922 0.161606 -0.161784 +v 0.383459 0.180000 -0.161784 +v 0.450000 0.126000 0.000000 +v 0.432779 0.125616 -0.202365 +v 0.383459 0.126000 -0.215784 +v 0.450000 0.126000 -0.161784 +v 0.000000 0.180000 0.000000 +v -0.427922 0.161606 0.000000 +v -0.416882 0.151013 -0.189181 +v 0.000000 0.157800 -0.197587 +v -0.383459 0.180000 0.000000 +v -0.383459 0.157800 -0.197587 +v -0.427922 0.161606 -0.161784 +v 0.000000 0.180000 -0.161784 +v -0.383459 0.180000 -0.161784 +v -0.450000 0.126000 0.000000 +v -0.432779 0.125616 -0.202365 +v 0.000000 0.126000 -0.215784 +v -0.383459 0.126000 -0.215784 +v -0.450000 0.126000 -0.161784 +v 0.416882 -0.151013 0.189181 +v 0.383459 -0.157800 0.197587 +v 0.427922 -0.161606 0.161784 +v 0.383459 -0.180000 0.161784 +v 0.432779 -0.125616 0.202365 +v 0.383459 -0.126000 0.215784 +v 0.450000 -0.126000 0.161784 +v 0.432723 0.000000 0.202132 +v 0.383459 0.000000 0.215784 +v 0.450000 0.000000 0.161784 +v -0.416882 -0.151013 0.189181 +v 0.000000 -0.157800 0.197587 +v -0.383459 -0.157800 0.197587 +v -0.427922 -0.161606 0.161784 +v 0.000000 -0.180000 0.161784 +v -0.383459 -0.180000 0.161784 +v -0.432779 -0.125616 0.202365 +v 0.000000 -0.126000 0.215784 +v -0.383459 -0.126000 0.215784 +v -0.450000 -0.126000 0.161784 +v -0.432723 0.000000 0.202132 +v 0.000000 0.000000 0.215784 +v -0.383459 0.000000 0.215784 +v -0.450000 0.000000 0.161784 +v 0.427922 -0.161606 0.000000 +v 0.416882 -0.151013 -0.189181 +v 0.383459 -0.180000 0.000000 +v 0.383459 -0.157800 -0.197587 +v 0.427922 -0.161606 -0.161784 +v 0.383459 -0.180000 -0.161784 +v 0.450000 -0.126000 0.000000 +v 0.432779 -0.125616 -0.202365 +v 0.383459 -0.126000 -0.215784 +v 0.450000 -0.126000 -0.161784 +v 0.450000 0.000000 0.000000 +v 0.432723 0.000000 -0.202132 +v 0.383459 0.000000 -0.215784 +v 0.450000 0.000000 -0.161784 +v 0.000000 -0.180000 0.000000 +v -0.427922 -0.161606 0.000000 +v -0.416882 -0.151013 -0.189181 +v 0.000000 -0.157800 -0.197587 +v -0.383459 -0.180000 0.000000 +v -0.383459 -0.157800 -0.197587 +v -0.427922 -0.161606 -0.161784 +v 0.000000 -0.180000 -0.161784 +v -0.383459 -0.180000 -0.161784 +v -0.450000 -0.126000 0.000000 +v -0.432779 -0.125616 -0.202365 +v 0.000000 -0.126000 -0.215784 +v -0.383459 -0.126000 -0.215784 +v -0.450000 -0.126000 -0.161784 +v -0.450000 0.000000 0.000000 +v -0.432723 0.000000 -0.202132 +v 0.000000 0.000000 -0.215784 +v -0.383459 0.000000 -0.215784 +v -0.450000 0.000000 -0.161784 +vt 0.732824 0.651596 +vt 0.497063 0.656145 +vt 0.498352 0.561696 +vt 0.835737 0.544092 +vt 0.832410 0.574334 +vt 0.728776 0.549797 +vt 0.733409 0.516110 +vt 0.747921 0.523504 +vt 0.498691 0.536867 +vt 0.754013 0.503366 +vt 0.838288 0.518944 +vt 0.716137 0.523643 +vt 0.711494 0.504530 +vt 0.498984 0.515399 +vt 0.734485 0.500579 +vt 0.734742 0.443967 +vt 0.756687 0.444264 +vt 0.500002 0.440769 +vt 0.708811 0.443615 +vt 0.842574 0.445423 +vt 0.261516 0.645162 +vt 0.268342 0.543511 +vt 0.164088 0.565217 +vt 0.161584 0.534899 +vt 0.264629 0.509713 +vt 0.281689 0.517713 +vt 0.159717 0.509691 +vt 0.244381 0.496413 +vt 0.249922 0.516708 +vt 0.263977 0.494158 +vt 0.286851 0.498734 +vt 0.243317 0.437260 +vt 0.265263 0.437561 +vt 0.291193 0.437916 +vt 0.157430 0.436083 +vt 0.495722 0.754363 +vt 0.939579 0.572784 +vt 0.950008 0.538976 +vt 0.966270 0.556108 +vt 0.495366 0.780443 +vt 0.733578 0.753608 +vt 0.929866 0.518425 +vt 0.931317 0.541897 +vt 0.953950 0.520177 +vt 0.983612 0.534778 +vt 0.733699 0.802691 +vt 0.495056 0.803167 +vt 0.935351 0.446668 +vt 0.962999 0.447038 +vt 0.733787 0.881463 +vt 0.493987 0.881463 +vt 0.999906 0.447531 +vt 0.057009 0.560761 +vt 0.047501 0.526686 +vt 0.066106 0.530111 +vt 0.257977 0.747114 +vt 0.068193 0.506688 +vt 0.030782 0.543370 +vt 0.014024 0.521580 +vt 0.256516 0.796175 +vt 0.044070 0.507787 +vt 0.037002 0.434429 +vt 0.064650 0.434809 +vt 0.254277 0.874915 +vt 0.000094 0.433923 +vt 0.501652 0.319843 +vt 0.502941 0.225399 +vt 0.738475 0.236380 +vt 0.731650 0.338024 +vt 0.835884 0.316299 +vt 0.838396 0.346613 +vt 0.735366 0.371817 +vt 0.718307 0.363820 +vt 0.501313 0.344671 +vt 0.840268 0.371818 +vt 0.755614 0.385114 +vt 0.750071 0.364821 +vt 0.736021 0.387371 +vt 0.713148 0.382798 +vt 0.501020 0.366139 +vt 0.267194 0.229946 +vt 0.164293 0.337419 +vt 0.167628 0.307183 +vt 0.271241 0.331739 +vt 0.266605 0.365420 +vt 0.252095 0.358025 +vt 0.246001 0.378160 +vt 0.161736 0.362565 +vt 0.283877 0.357890 +vt 0.288517 0.377003 +vt 0.265527 0.380951 +vt 0.504282 0.127186 +vt 0.942953 0.320724 +vt 0.952471 0.354792 +vt 0.933866 0.351373 +vt 0.742013 0.134433 +vt 0.504638 0.101108 +vt 0.931787 0.374794 +vt 0.969182 0.338104 +vt 0.985946 0.359886 +vt 0.504948 0.078385 +vt 0.743473 0.085376 +vt 0.955907 0.373688 +vt 0.506017 0.000095 +vt 0.745712 0.006641 +vt 0.060470 0.308697 +vt 0.050030 0.342497 +vt 0.033776 0.325361 +vt 0.266441 0.127940 +vt 0.070165 0.363055 +vt 0.068721 0.339584 +vt 0.046081 0.361294 +vt 0.016425 0.346681 +vt 0.266320 0.078861 +vt 0.266232 0.000094 +vt 0.733646 0.779865 +vt 0.257192 0.773359 +vt 0.742798 0.108190 +vt 0.266373 0.101685 +vn 0.194900 0.980800 0.000000 +vn 0.000000 1.000000 0.000000 +vn 0.000000 0.961700 0.273900 +vn 0.647300 0.762200 0.000000 +vn 0.178700 0.949500 0.257800 +vn 0.457300 0.661600 0.594300 +vn 0.631200 0.737600 0.239800 +vn 0.000000 0.694500 0.719500 +vn 0.939500 0.276000 0.202600 +vn 0.961700 0.274000 0.000000 +vn 0.151600 0.685100 0.712500 +vn 0.135500 0.258500 0.956400 +vn 0.000000 0.256900 0.966400 +vn 0.632300 0.305000 0.712100 +vn 0.658300 0.000000 0.752800 +vn 0.979700 0.000000 0.200600 +vn 0.000000 0.000000 1.000000 +vn 0.134200 0.000000 0.990900 +vn 1.000000 0.000000 0.000000 +vn -0.194900 0.980800 0.000000 +vn -0.178700 0.949500 0.257800 +vn -0.647300 0.762200 0.000000 +vn -0.457300 0.661600 0.594300 +vn -0.151600 0.685100 0.712500 +vn -0.961700 0.274000 0.000000 +vn -0.939500 0.276000 0.202600 +vn -0.631200 0.737600 0.239800 +vn -0.632300 0.305000 0.712100 +vn -0.135500 0.258500 0.956400 +vn -0.979700 0.000000 0.200600 +vn -0.658300 0.000000 0.752800 +vn -0.134200 0.000000 0.990900 +vn -1.000000 0.000000 0.000000 +vn 0.000000 0.961700 -0.273900 +vn 0.178700 0.949500 -0.257800 +vn 0.457300 0.661600 -0.594300 +vn 0.151600 0.685100 -0.712500 +vn 0.000000 0.694500 -0.719500 +vn 0.939500 0.276000 -0.202600 +vn 0.631200 0.737600 -0.239800 +vn 0.632300 0.305000 -0.712100 +vn 0.135500 0.258500 -0.956400 +vn 0.000000 0.256900 -0.966400 +vn 0.979700 0.000000 -0.200600 +vn 0.658300 0.000000 -0.752800 +vn 0.134200 0.000000 -0.990900 +vn 0.000000 0.000000 -1.000000 +vn -0.178700 0.949500 -0.257800 +vn -0.457300 0.661600 -0.594300 +vn -0.631200 0.737600 -0.239800 +vn -0.939500 0.276000 -0.202600 +vn -0.151600 0.685100 -0.712500 +vn -0.135500 0.258500 -0.956400 +vn -0.632300 0.305000 -0.712100 +vn -0.658300 0.000000 -0.752800 +vn -0.979700 0.000000 -0.200600 +vn -0.134200 0.000000 -0.990900 +vn 0.000000 -0.961700 0.273900 +vn 0.000000 -1.000000 0.000000 +vn 0.194900 -0.980800 0.000000 +vn 0.178700 -0.949500 0.257800 +vn 0.647300 -0.762200 0.000000 +vn 0.457300 -0.661600 0.594300 +vn 0.151600 -0.685100 0.712500 +vn 0.000000 -0.694500 0.719500 +vn 0.961700 -0.274000 0.000000 +vn 0.939500 -0.276000 0.202600 +vn 0.631200 -0.737600 0.239800 +vn 0.632300 -0.305000 0.712100 +vn 0.135500 -0.258500 0.956400 +vn 0.000000 -0.256900 0.966400 +vn -0.194900 -0.980800 0.000000 +vn -0.647300 -0.762200 0.000000 +vn -0.178700 -0.949500 0.257800 +vn -0.457300 -0.661600 0.594300 +vn -0.631200 -0.737600 0.239800 +vn -0.939500 -0.276000 0.202600 +vn -0.961700 -0.274000 0.000000 +vn -0.151600 -0.685100 0.712500 +vn -0.135500 -0.258500 0.956400 +vn -0.632300 -0.305000 0.712100 +vn 0.000000 -0.961700 -0.273900 +vn 0.178700 -0.949500 -0.257800 +vn 0.457300 -0.661600 -0.594300 +vn 0.631200 -0.737600 -0.239800 +vn 0.000000 -0.694500 -0.719500 +vn 0.939500 -0.276000 -0.202600 +vn 0.151600 -0.685100 -0.712500 +vn 0.135500 -0.258500 -0.956400 +vn 0.000000 -0.256900 -0.966400 +vn 0.632300 -0.305000 -0.712100 +vn -0.178700 -0.949500 -0.257800 +vn -0.457300 -0.661600 -0.594300 +vn -0.151600 -0.685100 -0.712500 +vn -0.939500 -0.276000 -0.202600 +vn -0.631200 -0.737600 -0.239800 +vn -0.632300 -0.305000 -0.712100 +vn -0.135500 -0.258500 -0.956400 +usemtl Material.004 +s 1 +f 20/1/1 28/2/2 12/3/3 +f 18/4/4 20/5/1 4/6/5 +f 1/7/6 3/8/7 4/6/5 +f 4/6/5 12/3/3 9/9/8 +f 3/8/7 7/10/9 24/11/10 +f 1/7/6 2/12/11 6/13/12 +f 9/9/8 15/14/13 6/13/12 +f 1/7/6 5/15/14 7/10/9 +f 5/15/14 49/16/15 51/17/16 +f 15/14/13 63/18/17 50/19/18 +f 5/15/14 6/13/12 50/19/18 +f 7/10/9 51/17/16 76/20/19 +f 12/3/3 28/2/2 32/21/20 +f 13/22/21 32/23/20 29/24/22 +f 8/25/23 10/26/24 13/22/21 +f 9/9/8 12/3/3 13/22/21 +f 37/27/25 17/28/26 11/29/27 +f 8/25/23 14/30/28 16/31/29 +f 16/31/29 15/14/13 9/9/8 +f 17/28/26 14/30/28 8/25/23 +f 65/32/30 62/33/31 14/30/28 +f 64/34/32 63/18/17 15/14/13 +f 14/30/28 62/33/31 64/34/32 +f 94/35/33 65/32/30 17/28/26 +f 35/36/34 28/2/2 20/1/1 +f 23/37/35 20/5/1 18/4/4 +f 19/38/36 21/39/37 23/37/35 +f 31/40/38 35/36/34 23/41/35 +f 24/11/10 27/42/39 22/43/40 +f 19/38/36 25/44/41 26/45/42 +f 26/46/42 39/47/43 31/40/38 +f 27/42/39 25/44/41 19/38/36 +f 79/48/44 77/49/45 25/44/41 +f 78/50/46 96/51/47 39/47/43 +f 25/44/41 77/49/45 78/52/46 +f 76/20/19 79/48/44 27/42/39 +f 32/21/20 28/2/2 35/36/34 +f 29/24/22 32/23/20 36/53/48 +f 30/54/49 34/55/50 36/53/48 +f 36/56/48 35/36/34 31/40/38 +f 34/55/50 41/57/51 37/27/25 +f 30/54/49 33/58/52 40/59/53 +f 31/40/38 39/47/43 40/60/53 +f 30/54/49 38/61/54 41/57/51 +f 38/61/54 95/62/55 98/63/56 +f 39/47/43 96/51/47 97/64/57 +f 38/61/54 40/59/53 97/65/57 +f 41/57/51 98/63/56 94/35/33 +f 56/66/58 80/67/59 68/68/60 +f 45/69/61 68/70/60 66/71/62 +f 42/72/63 43/73/64 45/69/61 +f 53/74/65 56/66/58 45/69/61 +f 72/75/66 48/76/67 44/77/68 +f 42/72/63 46/78/69 47/79/70 +f 47/79/70 59/80/71 53/74/65 +f 48/76/67 46/78/69 42/72/63 +f 51/17/16 49/16/15 46/78/69 +f 50/19/18 63/18/17 59/80/71 +f 46/78/69 49/16/15 50/19/18 +f 76/20/19 51/17/16 48/76/67 +f 84/81/72 80/67/59 56/66/58 +f 81/82/73 84/83/72 57/84/74 +f 52/85/75 55/86/76 57/84/74 +f 57/84/74 56/66/58 53/74/65 +f 55/86/76 61/87/77 89/88/78 +f 52/85/75 54/89/79 60/90/80 +f 53/74/65 59/80/71 60/90/80 +f 52/85/75 58/91/81 61/87/77 +f 58/91/81 62/33/31 65/32/30 +f 59/80/71 63/18/17 64/34/32 +f 58/91/81 60/90/80 64/34/32 +f 61/87/77 65/32/30 94/35/33 +f 68/68/60 80/67/59 87/92/82 +f 66/71/62 68/70/60 71/93/83 +f 67/94/84 70/95/85 71/93/83 +f 71/96/83 87/92/82 83/97/86 +f 70/95/85 75/98/87 72/75/66 +f 67/94/84 69/99/88 74/100/89 +f 83/97/86 91/101/90 74/102/89 +f 67/94/84 73/103/91 75/98/87 +f 73/103/91 77/49/45 79/48/44 +f 91/101/90 96/104/47 78/105/46 +f 73/103/91 74/100/89 78/52/46 +f 75/98/87 79/48/44 76/20/19 +f 87/92/82 80/67/59 84/81/72 +f 88/106/92 84/83/72 81/82/73 +f 82/107/93 85/108/94 88/106/92 +f 83/97/86 87/92/82 88/109/92 +f 89/88/78 93/110/95 86/111/96 +f 82/107/93 90/112/97 92/113/98 +f 92/114/98 91/101/90 83/97/86 +f 93/110/95 90/112/97 82/107/93 +f 98/63/56 95/62/55 90/112/97 +f 97/115/57 96/104/47 91/101/90 +f 90/112/97 95/62/55 97/65/57 +f 94/35/33 98/63/56 93/110/95 +f 4/6/5 20/1/1 12/3/3 +f 3/8/7 18/4/4 4/6/5 +f 2/12/11 1/7/6 4/6/5 +f 2/12/11 4/6/5 9/9/8 +f 18/4/4 3/8/7 24/11/10 +f 5/15/14 1/7/6 6/13/12 +f 2/12/11 9/9/8 6/13/12 +f 3/8/7 1/7/6 7/10/9 +f 7/10/9 5/15/14 51/17/16 +f 6/13/12 15/14/13 50/19/18 +f 49/16/15 5/15/14 50/19/18 +f 24/11/10 7/10/9 76/20/19 +f 13/22/21 12/3/3 32/21/20 +f 11/29/27 13/22/21 29/24/22 +f 11/29/27 8/25/23 13/22/21 +f 10/26/24 9/9/8 13/22/21 +f 29/24/22 37/27/25 11/29/27 +f 10/26/24 8/25/23 16/31/29 +f 10/26/24 16/31/29 9/9/8 +f 11/29/27 17/28/26 8/25/23 +f 17/28/26 65/32/30 14/30/28 +f 16/31/29 64/34/32 15/14/13 +f 16/31/29 14/30/28 64/34/32 +f 37/27/25 94/35/33 17/28/26 +f 23/41/35 35/36/34 20/1/1 +f 22/43/40 23/37/35 18/4/4 +f 22/43/40 19/38/36 23/37/35 +f 21/116/37 31/40/38 23/41/35 +f 18/4/4 24/11/10 22/43/40 +f 21/39/37 19/38/36 26/45/42 +f 21/116/37 26/46/42 31/40/38 +f 22/43/40 27/42/39 19/38/36 +f 27/42/39 79/48/44 25/44/41 +f 26/46/42 78/50/46 39/47/43 +f 26/45/42 25/44/41 78/52/46 +f 24/11/10 76/20/19 27/42/39 +f 36/56/48 32/21/20 35/36/34 +f 34/55/50 29/24/22 36/53/48 +f 33/58/52 30/54/49 36/53/48 +f 33/117/52 36/56/48 31/40/38 +f 29/24/22 34/55/50 37/27/25 +f 38/61/54 30/54/49 40/59/53 +f 33/117/52 31/40/38 40/60/53 +f 34/55/50 30/54/49 41/57/51 +f 41/57/51 38/61/54 98/63/56 +f 40/60/53 39/47/43 97/64/57 +f 95/62/55 38/61/54 97/65/57 +f 37/27/25 41/57/51 94/35/33 +f 45/69/61 56/66/58 68/68/60 +f 44/77/68 45/69/61 66/71/62 +f 44/77/68 42/72/63 45/69/61 +f 43/73/64 53/74/65 45/69/61 +f 66/71/62 72/75/66 44/77/68 +f 43/73/64 42/72/63 47/79/70 +f 43/73/64 47/79/70 53/74/65 +f 44/77/68 48/76/67 42/72/63 +f 48/76/67 51/17/16 46/78/69 +f 47/79/70 50/19/18 59/80/71 +f 47/79/70 46/78/69 50/19/18 +f 72/75/66 76/20/19 48/76/67 +f 57/84/74 84/81/72 56/66/58 +f 55/86/76 81/82/73 57/84/74 +f 54/89/79 52/85/75 57/84/74 +f 54/89/79 57/84/74 53/74/65 +f 81/82/73 55/86/76 89/88/78 +f 58/91/81 52/85/75 60/90/80 +f 54/89/79 53/74/65 60/90/80 +f 55/86/76 52/85/75 61/87/77 +f 61/87/77 58/91/81 65/32/30 +f 60/90/80 59/80/71 64/34/32 +f 62/33/31 58/91/81 64/34/32 +f 89/88/78 61/87/77 94/35/33 +f 71/96/83 68/68/60 87/92/82 +f 70/95/85 66/71/62 71/93/83 +f 69/99/88 67/94/84 71/93/83 +f 69/118/88 71/96/83 83/97/86 +f 66/71/62 70/95/85 72/75/66 +f 73/103/91 67/94/84 74/100/89 +f 69/118/88 83/97/86 74/102/89 +f 70/95/85 67/94/84 75/98/87 +f 75/98/87 73/103/91 79/48/44 +f 74/102/89 91/101/90 78/105/46 +f 77/49/45 73/103/91 78/52/46 +f 72/75/66 75/98/87 76/20/19 +f 88/109/92 87/92/82 84/81/72 +f 86/111/96 88/106/92 81/82/73 +f 86/111/96 82/107/93 88/106/92 +f 85/119/94 83/97/86 88/109/92 +f 81/82/73 89/88/78 86/111/96 +f 85/108/94 82/107/93 92/113/98 +f 85/119/94 92/114/98 83/97/86 +f 86/111/96 93/110/95 82/107/93 +f 93/110/95 98/63/56 90/112/97 +f 92/114/98 97/115/57 91/101/90 +f 92/113/98 90/112/97 97/65/57 +f 89/88/78 94/35/33 93/110/95 diff --git a/assets/Models/Brick/turquoise.png b/assets/Models/Brick/turquoise.png new file mode 100644 index 0000000..d284755 Binary files /dev/null and b/assets/Models/Brick/turquoise.png differ diff --git a/assets/Models/submarine2.mtl b/assets/Models/Submarine2.mtl similarity index 100% rename from assets/Models/submarine2.mtl rename to assets/Models/Submarine2.mtl diff --git a/assets/Models/submarine2.obj b/assets/Models/Submarine2.obj similarity index 99% rename from assets/Models/submarine2.obj rename to assets/Models/Submarine2.obj index 5796eba..144e0ad 100644 --- a/assets/Models/submarine2.obj +++ b/assets/Models/Submarine2.obj @@ -1,6 +1,6 @@ # Blender v2.75 (sub 0) OBJ File: 'submarine.blend' # www.blender.org -mtllib submarine2.mtl +mtllib Submarine2.mtl o Cube v -0.378953 -0.002680 -0.065172 v 0.212611 0.044805 -0.044067 diff --git a/assets/Models/Test/Ball/Sid.mtl b/assets/Models/Test/Ball/Sid.mtl new file mode 100644 index 0000000..a32169c --- /dev/null +++ b/assets/Models/Test/Ball/Sid.mtl @@ -0,0 +1,21 @@ +# Blender MTL File: 'Sid.blend' +# Material Count: 2 + +newmtl Derp +Ns 96.078431 +Ka 0.000000 0.000000 0.000000 +Kd 0.800000 0.800000 0.800000 +Ks 0.500000 0.500000 0.500000 +Ni 1.000000 +d 1.000000 +illum 2 +map_Kd SquidTexture.png + +newmtl None +Ns 0 +Ka 0.000000 0.000000 0.000000 +Kd 0.8 0.8 0.8 +Ks 0.8 0.8 0.8 +d 1 +illum 2 +map_Kd SquidTexture.png diff --git a/assets/Models/Test/Ball/Sid.obj b/assets/Models/Test/Ball/Sid.obj new file mode 100644 index 0000000..0d13a53 --- /dev/null +++ b/assets/Models/Test/Ball/Sid.obj @@ -0,0 +1,5707 @@ +# Blender v2.75 (sub 0) OBJ File: 'Sid.blend' +# www.blender.org +mtllib Sid.mtl +o Plane +v -0.203014 -1.568914 -0.038551 +v -0.170206 -1.573657 -0.051347 +v -0.137398 -1.568914 -0.038551 +v -0.170206 -1.329666 -0.062822 +v -0.170206 -1.081658 -0.075595 +v -0.170206 -0.833955 -0.091461 +v -0.214628 -1.329667 -0.044422 +v -0.223660 -1.081658 -0.053454 +v -0.234877 -0.834010 -0.064670 +v -0.105535 -0.834010 -0.064670 +v -0.116752 -1.081658 -0.053454 +v -0.125784 -1.329667 -0.044422 +v -0.215218 -1.581564 -0.039319 +v -0.170206 -1.585965 -0.050777 +v -0.125194 -1.581564 -0.039319 +v -0.203069 -1.807691 -0.036413 +v -0.170206 -1.805778 -0.044109 +v -0.137343 -1.807691 -0.036413 +v -0.109466 -1.735929 -0.049091 +v -0.170206 -1.734486 -0.062521 +v -0.230946 -1.735929 -0.049091 +v -0.107408 -1.658198 -0.050283 +v -0.233003 -1.658198 -0.050283 +v -0.170206 -1.659148 -0.063997 +v -0.197852 -1.834679 -0.035428 +v -0.170206 -1.834800 -0.041302 +v -0.142559 -1.834679 -0.035428 +v -0.170206 -0.702509 -0.102028 +v -0.238654 -0.704428 -0.075576 +v -0.101758 -0.704428 -0.075576 +v -0.170206 -0.957708 -0.083536 +v -0.229275 -0.957710 -0.059069 +v -0.111137 -0.957710 -0.059069 +v -0.170206 -1.205601 -0.069212 +v -0.219146 -1.205601 -0.048940 +v -0.121266 -1.205601 -0.048940 +v -0.129916 -1.453529 -0.040444 +v -0.170206 -1.453770 -0.057073 +v -0.210496 -1.453529 -0.040444 +v -0.341813 -0.710253 -0.150945 +v -0.272561 -0.658812 -0.092734 +v -0.036081 -0.720854 -0.139280 +v -0.128678 -0.779623 -0.235449 +v -0.388081 -0.832059 -0.455676 +v -0.401540 -0.902034 -0.372530 +v -0.506558 -0.155320 -0.140329 +v -0.508012 0.107512 -0.060636 +v -0.504835 -0.022067 -0.150114 +v -0.574786 0.171938 -0.058641 +v -0.430283 0.244035 -0.159538 +v -0.527065 0.308595 -0.075310 +v -0.422455 0.480248 -0.083128 +v -0.132715 0.690575 -0.128448 +v -0.453503 -0.386439 -0.112009 +v -0.355113 -0.651476 -0.207466 +v -0.308675 -0.567122 -0.153987 +v -0.423777 -0.555532 -0.122375 +v -0.046467 -0.612898 -0.256224 +v -0.134734 -0.706985 -0.334305 +v -0.300478 -0.854331 -0.426651 +v -0.426839 -0.792083 -0.374661 +v -0.371537 -0.415842 -0.195995 +v -0.125795 -0.463615 -0.286598 +v -0.401722 -0.474641 -0.118123 +v -0.092070 -0.539436 -0.263820 +v -0.320983 -0.497731 -0.177106 +v -0.160875 0.359568 -0.291545 +v -0.156049 -0.033330 -0.386138 +v -0.471693 0.156455 -0.112886 +v -0.159953 -0.253099 -0.370082 +v -0.318445 0.584377 -0.098975 +v -0.369430 0.296429 -0.185319 +v -0.433894 -0.019103 -0.264046 +v -0.438824 -0.216490 -0.247697 +v -0.457925 0.149735 -0.155887 +v -0.170102 0.200036 -0.338946 +v -0.396432 0.171844 -0.241860 +v -0.489718 -0.287734 -0.125482 +v -0.153029 -0.375387 -0.329175 +v -0.412681 -0.327049 -0.221873 +v -0.220244 -0.762136 -0.151721 +v -0.152856 -0.713654 -0.071905 +v -0.310065 -0.889590 -0.358944 +v -0.269368 -0.629062 -0.297587 +v -0.207486 -0.554538 -0.242931 +v -0.426650 -0.830609 -0.332566 +v -0.260057 -0.439506 -0.253489 +v -0.222452 -0.512276 -0.232450 +v -0.282831 0.328709 -0.261116 +v -0.317505 -0.025351 -0.341713 +v -0.316960 -0.235961 -0.326909 +v -0.232748 0.641194 -0.114121 +v -0.306841 0.186428 -0.308977 +v -0.298015 -0.353400 -0.290148 +v -0.561240 0.123005 -0.061111 +v -0.147714 0.495362 -0.247057 +v -0.417708 0.349651 -0.140899 +v -0.506409 0.252027 -0.113375 +v -0.343159 0.425040 -0.168987 +v -0.259670 0.460606 -0.225043 +v -0.326345 -0.670190 -0.094407 +v -0.457605 -0.689737 -0.110517 +v -0.506214 -0.614689 -0.103857 +v -0.622611 -0.754139 -0.066227 +v -0.643732 -0.708888 -0.065265 +v 0.203014 -1.568914 -0.038551 +v 0.170206 -1.573657 -0.051347 +v 0.137398 -1.568914 -0.038551 +v 0.170206 -1.329666 -0.062822 +v 0.170206 -1.081658 -0.075595 +v 0.170206 -0.833955 -0.091461 +v 0.214628 -1.329667 -0.044422 +v 0.223660 -1.081658 -0.053454 +v 0.234877 -0.834010 -0.064670 +v 0.105535 -0.834010 -0.064670 +v 0.116752 -1.081658 -0.053454 +v 0.125784 -1.329667 -0.044422 +v 0.215218 -1.581564 -0.039319 +v 0.170206 -1.585965 -0.050777 +v 0.125194 -1.581564 -0.039319 +v 0.203069 -1.807691 -0.036413 +v 0.170206 -1.805778 -0.044109 +v 0.137343 -1.807691 -0.036413 +v 0.109466 -1.735929 -0.049091 +v 0.170206 -1.734486 -0.062521 +v 0.230946 -1.735929 -0.049091 +v 0.107409 -1.658198 -0.050283 +v 0.233003 -1.658198 -0.050283 +v 0.170206 -1.659148 -0.063997 +v 0.197852 -1.834679 -0.035428 +v 0.170206 -1.834800 -0.041302 +v 0.142559 -1.834679 -0.035428 +v 0.170206 -0.702509 -0.102028 +v 0.238654 -0.704428 -0.075576 +v 0.101758 -0.704428 -0.075576 +v 0.170206 -0.957708 -0.083536 +v 0.229275 -0.957710 -0.059068 +v 0.111137 -0.957710 -0.059068 +v 0.170206 -1.205601 -0.069212 +v 0.219146 -1.205601 -0.048940 +v 0.121266 -1.205601 -0.048940 +v 0.129916 -1.453529 -0.040444 +v 0.170206 -1.453770 -0.057073 +v 0.210496 -1.453529 -0.040444 +v 0.341813 -0.710253 -0.150945 +v 0.272561 -0.658812 -0.092734 +v 0.036081 -0.720854 -0.139280 +v 0.128678 -0.779623 -0.235449 +v 0.388081 -0.832059 -0.455675 +v 0.401540 -0.902034 -0.372530 +v 0.506558 -0.155320 -0.140329 +v 0.508012 0.107512 -0.060636 +v 0.504835 -0.022067 -0.150114 +v 0.574786 0.171938 -0.058641 +v 0.430283 0.244035 -0.159538 +v 0.527065 0.308595 -0.075310 +v 0.422455 0.480248 -0.083128 +v 0.132715 0.690575 -0.128448 +v 0.453503 -0.386439 -0.112009 +v 0.355113 -0.651476 -0.207466 +v 0.308675 -0.567122 -0.153987 +v 0.423777 -0.555532 -0.122375 +v 0.046467 -0.612898 -0.256224 +v 0.134735 -0.706985 -0.334305 +v 0.300479 -0.854331 -0.426651 +v 0.426839 -0.792083 -0.374661 +v 0.371537 -0.415842 -0.195995 +v 0.125795 -0.463615 -0.286598 +v 0.401722 -0.474641 -0.118123 +v 0.092070 -0.539436 -0.263820 +v 0.320983 -0.497731 -0.177106 +v 0.160875 0.359568 -0.291545 +v 0.156049 -0.033330 -0.386138 +v 0.471693 0.156455 -0.112886 +v 0.159953 -0.253099 -0.370082 +v 0.318445 0.584377 -0.098975 +v 0.369430 0.296429 -0.185319 +v 0.433894 -0.019103 -0.264046 +v 0.438824 -0.216490 -0.247697 +v 0.457925 0.149735 -0.155887 +v 0.170102 0.200036 -0.338946 +v 0.396432 0.171844 -0.241860 +v 0.489718 -0.287734 -0.125482 +v 0.153029 -0.375387 -0.329175 +v 0.412681 -0.327049 -0.221873 +v 0.220244 -0.762136 -0.151721 +v 0.152856 -0.713654 -0.071905 +v 0.310065 -0.889590 -0.358944 +v 0.269368 -0.629062 -0.297587 +v 0.207486 -0.554538 -0.242930 +v 0.426650 -0.830609 -0.332565 +v 0.260057 -0.439506 -0.253489 +v 0.222452 -0.512276 -0.232450 +v 0.282831 0.328709 -0.261116 +v 0.317505 -0.025351 -0.341713 +v 0.316960 -0.235961 -0.326909 +v 0.232748 0.641194 -0.114121 +v 0.306842 0.186428 -0.308977 +v 0.298015 -0.353400 -0.290148 +v 0.561240 0.123005 -0.061111 +v 0.147714 0.495362 -0.247057 +v 0.417708 0.349651 -0.140899 +v 0.506409 0.252027 -0.113375 +v 0.343159 0.425040 -0.168986 +v 0.259670 0.460606 -0.225043 +v 0.326345 -0.670190 -0.094407 +v 0.457605 -0.689737 -0.110516 +v 0.506214 -0.614689 -0.103857 +v 0.622611 -0.754139 -0.066227 +v 0.643732 -0.708888 -0.065265 +v 0.000000 -0.701395 -0.129000 +v 0.000000 0.735176 -0.119139 +v 0.000000 -0.613126 -0.251227 +v 0.000000 -0.478324 -0.301106 +v 0.000000 -0.551876 -0.270303 +v 0.000000 0.384353 -0.290575 +v 0.000000 -0.037916 -0.387735 +v 0.000000 -0.262565 -0.381055 +v 0.000000 0.205094 -0.348652 +v 0.000000 -0.386491 -0.345103 +v 0.000000 0.522768 -0.242150 +v -0.057236 -0.580283 -0.000000 +v -0.083363 -0.569494 -0.000000 +v -0.170206 -0.550679 -0.000000 +v -0.257049 -0.569494 -0.000000 +v -0.283176 -0.580283 -0.000000 +v -0.219975 -1.565353 -0.000000 +v -0.203014 -1.568914 0.038551 +v -0.170206 -1.573657 0.051347 +v -0.137398 -1.568914 0.038551 +v -0.120437 -1.565353 -0.000000 +v -0.261661 -0.834060 -0.000000 +v -0.245801 -1.081658 -0.000000 +v -0.233028 -1.329668 -0.000000 +v -0.170206 -1.329666 0.062822 +v -0.170206 -1.081658 0.075595 +v -0.170206 -0.833955 0.091461 +v -0.214628 -1.329667 0.044422 +v -0.223660 -1.081658 0.053454 +v -0.234877 -0.834010 0.064670 +v -0.107384 -1.329668 -0.000000 +v -0.094611 -1.081658 -0.000000 +v -0.078751 -0.834060 -0.000000 +v -0.105535 -0.834010 0.064670 +v -0.116752 -1.081658 0.053454 +v -0.125784 -1.329667 0.044422 +v -0.238421 -1.576705 -0.000000 +v -0.215218 -1.581564 0.039319 +v -0.170206 -1.585965 0.050777 +v -0.125194 -1.581564 0.039319 +v -0.101991 -1.576705 -0.000000 +v -0.225642 -1.811924 -0.000000 +v -0.203069 -1.807691 0.036413 +v -0.170206 -1.805778 0.044109 +v -0.137343 -1.807691 0.036413 +v -0.114770 -1.811924 -0.000000 +v -0.075662 -1.738041 -0.000000 +v -0.109466 -1.735929 0.049091 +v -0.170206 -1.734486 0.062521 +v -0.230946 -1.735929 0.049091 +v -0.264750 -1.738041 -0.000000 +v -0.107409 -1.658198 0.050283 +v -0.233003 -1.658198 0.050283 +v -0.268017 -1.656752 -0.000000 +v -0.072395 -1.656752 -0.000000 +v -0.170206 -1.659148 0.063997 +v -0.220889 -1.837135 -0.000000 +v -0.197852 -1.834679 0.035428 +v -0.170206 -1.834800 0.041302 +v -0.142559 -1.834679 0.035428 +v -0.119523 -1.837135 -0.000000 +v -0.211154 -1.860929 -0.000000 +v -0.198535 -1.870912 -0.000000 +v -0.170206 -1.877319 -0.000000 +v -0.141877 -1.870912 -0.000000 +v -0.129258 -1.860929 -0.000000 +v -0.170206 -0.702509 0.102028 +v -0.238654 -0.704428 0.075576 +v -0.067878 -0.707656 -0.000000 +v -0.272533 -0.707656 -0.000000 +v -0.101758 -0.704428 0.075576 +v -0.253742 -0.957712 -0.000000 +v -0.170206 -0.957708 0.083536 +v -0.229275 -0.957710 0.059068 +v -0.086670 -0.957712 -0.000000 +v -0.111137 -0.957710 0.059068 +v -0.239418 -1.205601 -0.000000 +v -0.170206 -1.205601 0.069212 +v -0.219146 -1.205601 0.048940 +v -0.100994 -1.205601 -0.000000 +v -0.121266 -1.205601 0.048940 +v -0.227309 -1.453327 -0.000000 +v -0.129916 -1.453529 0.040444 +v -0.170206 -1.453770 0.057073 +v -0.210496 -1.453529 0.040444 +v -0.113102 -1.453327 -0.000000 +v -0.341813 -0.710253 0.150945 +v -0.272561 -0.658812 0.092734 +v -0.036081 -0.720854 0.139280 +v -0.128678 -0.779623 0.235449 +v -0.388081 -0.832059 0.455675 +v -0.401540 -0.902034 0.372530 +v -0.506558 -0.155320 0.140329 +v -0.508012 0.107512 0.060636 +v -0.504835 -0.022067 0.150114 +v -0.574786 0.171938 0.058641 +v -0.430283 0.244035 0.159538 +v -0.527065 0.308595 0.075310 +v -0.422455 0.480248 0.083128 +v -0.132715 0.690575 0.128448 +v -0.453503 -0.386439 0.112009 +v -0.355113 -0.651476 0.207466 +v -0.308675 -0.567122 0.153987 +v -0.423777 -0.555532 0.122375 +v -0.046467 -0.612898 0.256224 +v -0.134735 -0.706985 0.334305 +v -0.300479 -0.854331 0.426651 +v -0.426839 -0.792083 0.374661 +v -0.371537 -0.415842 0.195995 +v -0.125795 -0.463615 0.286598 +v -0.401722 -0.474641 0.118123 +v -0.092070 -0.539436 0.263820 +v -0.320983 -0.497731 0.177106 +v -0.160875 0.359568 0.291545 +v -0.156049 -0.033330 0.386138 +v -0.471693 0.156455 0.112886 +v -0.159953 -0.253099 0.370082 +v -0.318445 0.584377 0.098975 +v -0.369430 0.296429 0.185319 +v -0.433894 -0.019103 0.264046 +v -0.438824 -0.216490 0.247697 +v -0.457925 0.149735 0.155887 +v -0.170102 0.200036 0.338946 +v -0.396432 0.171844 0.241860 +v -0.489718 -0.287734 0.125482 +v -0.153029 -0.375387 0.329175 +v -0.412681 -0.327049 0.221873 +v -0.220244 -0.762136 0.151721 +v -0.152856 -0.713654 0.071905 +v -0.310065 -0.889590 0.358944 +v -0.269368 -0.629062 0.297587 +v -0.207486 -0.554538 0.242930 +v -0.426650 -0.830609 0.332565 +v -0.260057 -0.439506 0.253489 +v -0.222452 -0.512276 0.232450 +v -0.282831 0.328709 0.261116 +v -0.317505 -0.025351 0.341713 +v -0.316960 -0.235961 0.326909 +v -0.232748 0.641194 0.114121 +v -0.306842 0.186428 0.308977 +v -0.298015 -0.353400 0.290148 +v -0.561240 0.123005 0.061111 +v -0.147714 0.495362 0.247057 +v -0.417708 0.349651 0.140899 +v -0.506409 0.252027 0.113375 +v -0.343159 0.425040 0.168986 +v -0.259670 0.460606 0.225043 +v -0.326345 -0.670190 0.094407 +v -0.457605 -0.689737 0.110516 +v -0.506214 -0.614689 0.103857 +v -0.622611 -0.754139 0.066227 +v -0.643732 -0.708888 0.065265 +v -0.523231 -0.130116 -0.000000 +v -0.519517 0.086785 -0.000000 +v -0.509674 -0.035365 -0.000000 +v -0.591977 0.165066 -0.000000 +v -0.468473 0.098814 -0.000000 +v -0.540888 0.361809 -0.000000 +v -0.438119 0.520819 -0.000000 +v -0.149793 0.746870 -0.000000 +v -0.499173 -0.355046 -0.000000 +v -0.452856 0.121278 -0.000000 +v -0.322514 0.626321 -0.000000 +v -0.470241 0.113956 -0.000000 +v -0.517998 -0.253650 -0.000000 +v -0.233790 0.690042 -0.000000 +v -0.576326 0.106563 -0.000000 +v -0.450562 -0.441349 -0.000000 +v -0.505692 -0.497249 -0.000000 +v -0.295176 -0.686480 -0.000000 +v -0.392392 -0.737880 -0.000000 +v -0.545410 -0.543096 -0.000000 +v -0.653121 -0.775965 -0.000000 +v -0.687859 -0.680204 -0.000000 +v -0.116707 -0.634022 -0.000000 +v 0.057236 -0.580283 0.000000 +v 0.083363 -0.569494 0.000000 +v 0.170206 -0.550679 0.000000 +v 0.257049 -0.569494 0.000000 +v 0.283176 -0.580283 0.000000 +v 0.219975 -1.565353 0.000000 +v 0.203014 -1.568914 0.038551 +v 0.170206 -1.573657 0.051347 +v 0.137398 -1.568914 0.038551 +v 0.120437 -1.565353 0.000000 +v 0.261661 -0.834060 0.000000 +v 0.245801 -1.081658 0.000000 +v 0.233028 -1.329668 0.000000 +v 0.170206 -1.329666 0.062822 +v 0.170206 -1.081658 0.075595 +v 0.170206 -0.833955 0.091461 +v 0.214628 -1.329667 0.044422 +v 0.223660 -1.081658 0.053454 +v 0.234877 -0.834010 0.064670 +v 0.107384 -1.329668 0.000000 +v 0.094611 -1.081658 0.000000 +v 0.078751 -0.834060 0.000000 +v 0.105535 -0.834010 0.064670 +v 0.116752 -1.081658 0.053454 +v 0.125784 -1.329667 0.044422 +v 0.238421 -1.576705 0.000000 +v 0.215218 -1.581564 0.039319 +v 0.170206 -1.585965 0.050777 +v 0.125194 -1.581564 0.039319 +v 0.101991 -1.576705 0.000000 +v 0.225642 -1.811924 0.000000 +v 0.203069 -1.807691 0.036413 +v 0.170206 -1.805778 0.044109 +v 0.137343 -1.807691 0.036413 +v 0.114770 -1.811924 0.000000 +v 0.075662 -1.738041 0.000000 +v 0.109466 -1.735929 0.049091 +v 0.170206 -1.734486 0.062521 +v 0.230946 -1.735929 0.049091 +v 0.264750 -1.738041 0.000000 +v 0.107408 -1.658198 0.050283 +v 0.233003 -1.658198 0.050283 +v 0.268017 -1.656752 0.000000 +v 0.072395 -1.656752 0.000000 +v 0.170206 -1.659148 0.063997 +v 0.220889 -1.837135 0.000000 +v 0.197852 -1.834679 0.035428 +v 0.170206 -1.834800 0.041302 +v 0.142559 -1.834679 0.035428 +v 0.119523 -1.837135 0.000000 +v 0.211154 -1.860929 0.000000 +v 0.198535 -1.870912 0.000000 +v 0.170206 -1.877319 0.000000 +v 0.141877 -1.870912 0.000000 +v 0.129258 -1.860929 0.000000 +v 0.170206 -0.702509 0.102028 +v 0.238654 -0.704428 0.075576 +v 0.067878 -0.707656 0.000000 +v 0.272533 -0.707656 0.000000 +v 0.101758 -0.704428 0.075576 +v 0.253742 -0.957712 0.000000 +v 0.170206 -0.957708 0.083536 +v 0.229275 -0.957710 0.059069 +v 0.086670 -0.957712 0.000000 +v 0.111137 -0.957710 0.059069 +v 0.239418 -1.205601 0.000000 +v 0.170206 -1.205601 0.069212 +v 0.219146 -1.205601 0.048940 +v 0.100994 -1.205601 0.000000 +v 0.121266 -1.205601 0.048940 +v 0.227309 -1.453327 0.000000 +v 0.129916 -1.453529 0.040444 +v 0.170206 -1.453770 0.057073 +v 0.210496 -1.453529 0.040444 +v 0.113102 -1.453327 0.000000 +v 0.341813 -0.710253 0.150945 +v 0.272561 -0.658812 0.092734 +v 0.036081 -0.720854 0.139280 +v 0.128678 -0.779623 0.235449 +v 0.388081 -0.832059 0.455676 +v 0.401540 -0.902034 0.372530 +v 0.506558 -0.155320 0.140329 +v 0.508012 0.107512 0.060636 +v 0.504835 -0.022067 0.150114 +v 0.574786 0.171938 0.058641 +v 0.430283 0.244035 0.159538 +v 0.527065 0.308595 0.075310 +v 0.422455 0.480248 0.083128 +v 0.132715 0.690575 0.128448 +v 0.453503 -0.386439 0.112009 +v 0.355113 -0.651476 0.207466 +v 0.308675 -0.567122 0.153987 +v 0.423777 -0.555532 0.122375 +v 0.046467 -0.612898 0.256224 +v 0.134734 -0.706985 0.334305 +v 0.300478 -0.854331 0.426651 +v 0.426839 -0.792083 0.374661 +v 0.371537 -0.415842 0.195995 +v 0.125795 -0.463615 0.286598 +v 0.401722 -0.474641 0.118123 +v 0.092070 -0.539436 0.263820 +v 0.320983 -0.497731 0.177106 +v 0.160875 0.359568 0.291545 +v 0.156049 -0.033330 0.386138 +v 0.471693 0.156455 0.112886 +v 0.159953 -0.253099 0.370082 +v 0.318445 0.584377 0.098975 +v 0.369430 0.296429 0.185319 +v 0.433894 -0.019103 0.264046 +v 0.438824 -0.216490 0.247697 +v 0.457925 0.149735 0.155887 +v 0.170102 0.200036 0.338946 +v 0.396432 0.171844 0.241860 +v 0.489718 -0.287734 0.125482 +v 0.153029 -0.375387 0.329175 +v 0.412681 -0.327049 0.221873 +v 0.220244 -0.762136 0.151721 +v 0.152856 -0.713654 0.071905 +v 0.310065 -0.889590 0.358944 +v 0.269368 -0.629062 0.297587 +v 0.207486 -0.554538 0.242931 +v 0.426650 -0.830609 0.332566 +v 0.260057 -0.439506 0.253489 +v 0.222452 -0.512276 0.232450 +v 0.282831 0.328709 0.261116 +v 0.317505 -0.025351 0.341713 +v 0.316960 -0.235961 0.326909 +v 0.232748 0.641194 0.114121 +v 0.306841 0.186428 0.308977 +v 0.298015 -0.353400 0.290148 +v 0.561240 0.123005 0.061111 +v 0.147714 0.495362 0.247057 +v 0.417708 0.349651 0.140899 +v 0.506409 0.252027 0.113375 +v 0.343159 0.425040 0.168987 +v 0.259670 0.460606 0.225043 +v 0.326345 -0.670190 0.094407 +v 0.457605 -0.689737 0.110517 +v 0.506214 -0.614689 0.103857 +v 0.622611 -0.754139 0.066227 +v 0.643732 -0.708888 0.065265 +v -0.000000 -0.701395 0.129000 +v -0.000000 0.735176 0.119139 +v -0.000000 -0.613126 0.251227 +v -0.000000 -0.478324 0.301106 +v -0.000000 -0.551876 0.270303 +v -0.000000 0.384353 0.290575 +v -0.000000 -0.037916 0.387735 +v -0.000000 -0.262565 0.381055 +v -0.000000 0.205094 0.348652 +v -0.000000 -0.386491 0.345103 +v -0.000000 0.522768 0.242150 +v 0.523231 -0.130116 0.000000 +v 0.519517 0.086785 0.000000 +v 0.509674 -0.035365 0.000000 +v 0.591977 0.165066 0.000000 +v 0.468473 0.098814 0.000000 +v 0.540888 0.361809 0.000000 +v 0.438119 0.520819 0.000000 +v 0.149793 0.746870 0.000000 +v 0.499173 -0.355046 0.000000 +v 0.452856 0.121278 0.000000 +v 0.322514 0.626321 0.000000 +v 0.470241 0.113956 0.000000 +v 0.517998 -0.253650 0.000000 +v 0.233790 0.690042 0.000000 +v 0.576326 0.106563 0.000000 +v 0.450562 -0.441349 0.000000 +v 0.505692 -0.497249 0.000000 +v 0.295176 -0.686480 0.000000 +v 0.392392 -0.737880 0.000000 +v 0.545410 -0.543096 0.000000 +v 0.653121 -0.775965 0.000000 +v 0.687859 -0.680204 0.000000 +v 0.116707 -0.634022 0.000000 +v 0.000000 0.802606 0.000000 +v 0.000000 -0.622545 0.000000 +v -0.183536 -1.576375 -0.013330 +v -0.170206 -1.576375 -0.018852 +v -0.156875 -1.576375 -0.013330 +v -0.170206 -1.328077 -0.030354 +v -0.170206 -1.079780 -0.043143 +v -0.170206 -0.831483 -0.059049 +v -0.191670 -1.328077 -0.021464 +v -0.200712 -1.079780 -0.030506 +v -0.211960 -0.831483 -0.041754 +v -0.128452 -0.831483 -0.041754 +v -0.139699 -1.079780 -0.030506 +v -0.148742 -1.328077 -0.021464 +v -0.197800 -1.591893 -0.013272 +v -0.170206 -1.591893 -0.018769 +v -0.142611 -1.591893 -0.013272 +v -0.187911 -1.800411 -0.008515 +v -0.170206 -1.800411 -0.012043 +v -0.152501 -1.800411 -0.008515 +v -0.125646 -1.730117 -0.021432 +v -0.170206 -1.730117 -0.030309 +v -0.214766 -1.730117 -0.021432 +v -0.123758 -1.661727 -0.022339 +v -0.216654 -1.661727 -0.022339 +v -0.170206 -1.661727 -0.031593 +v -0.184172 -1.826993 -0.006717 +v -0.170206 -1.826993 -0.009499 +v -0.156240 -1.826993 -0.006717 +v -0.170206 -0.707334 -0.069814 +v -0.219572 -0.707334 -0.049366 +v -0.120840 -0.707334 -0.049366 +v -0.170206 -0.955631 -0.051096 +v -0.206336 -0.955631 -0.036130 +v -0.134076 -0.955631 -0.036130 +v -0.170206 -1.203929 -0.036748 +v -0.196191 -1.203929 -0.025985 +v -0.144221 -1.203929 -0.025985 +v -0.152809 -1.452226 -0.017397 +v -0.170206 -1.452226 -0.024603 +v -0.187603 -1.452226 -0.017397 +v -0.318182 -0.698659 -0.170534 +v -0.253084 -0.632106 -0.088812 +v -0.049415 -0.691270 -0.141206 +v -0.146482 -0.752407 -0.235877 +v -0.373708 -0.831169 -0.426532 +v -0.386636 -0.873150 -0.371511 +v -0.475795 -0.153344 -0.130011 +v -0.511181 0.133658 -0.041556 +v -0.474008 -0.026440 -0.140771 +v -0.547109 0.169169 -0.041778 +v -0.407220 0.241402 -0.136457 +v -0.502461 0.298857 -0.056423 +v -0.401276 0.465145 -0.063620 +v -0.123020 0.668310 -0.106835 +v -0.426513 -0.373429 -0.099366 +v -0.325640 -0.665741 -0.205271 +v -0.285292 -0.562974 -0.131193 +v -0.408944 -0.558046 -0.093502 +v -0.054897 -0.604433 -0.225989 +v -0.153080 -0.706313 -0.307471 +v -0.314944 -0.843130 -0.399746 +v -0.397477 -0.803904 -0.367138 +v -0.351881 -0.400999 -0.174779 +v -0.118729 -0.449925 -0.257974 +v -0.378223 -0.469231 -0.096314 +v -0.087215 -0.532533 -0.232413 +v -0.303330 -0.488303 -0.151478 +v -0.155619 0.349414 -0.261115 +v -0.151426 -0.035196 -0.354016 +v -0.466339 0.183429 -0.087694 +v -0.154209 -0.246960 -0.338681 +v -0.299184 0.565350 -0.080979 +v -0.349004 0.286941 -0.161878 +v -0.410575 -0.021796 -0.241559 +v -0.415381 -0.210880 -0.225887 +v -0.427537 0.143688 -0.144557 +v -0.165232 0.192110 -0.307798 +v -0.373920 0.162750 -0.220245 +v -0.460314 -0.279533 -0.114308 +v -0.146187 -0.362564 -0.300099 +v -0.390694 -0.314888 -0.201248 +v -0.217959 -0.735870 -0.170757 +v -0.154713 -0.685814 -0.088694 +v -0.322379 -0.859443 -0.358710 +v -0.261395 -0.650783 -0.274753 +v -0.196626 -0.564669 -0.213930 +v -0.397877 -0.821175 -0.344509 +v -0.247173 -0.424395 -0.227753 +v -0.209314 -0.503712 -0.203917 +v -0.267288 0.318178 -0.234579 +v -0.304094 -0.027205 -0.312160 +v -0.303272 -0.229573 -0.298125 +v -0.217053 0.619927 -0.095195 +v -0.292385 0.177670 -0.281210 +v -0.284530 -0.340079 -0.263740 +v -0.540254 0.138453 -0.041667 +v -0.141675 0.481710 -0.218180 +v -0.399981 0.341326 -0.114954 +v -0.487629 0.248649 -0.086988 +v -0.324094 0.414198 -0.144993 +v -0.244923 0.447954 -0.198982 +v -0.323285 -0.645710 -0.072713 +v -0.459726 -0.672791 -0.082858 +v -0.494470 -0.622863 -0.074666 +v -0.613801 -0.735057 -0.041385 +v -0.623846 -0.711319 -0.039635 +v 0.183536 -1.576375 -0.013330 +v 0.170206 -1.576375 -0.018852 +v 0.156875 -1.576375 -0.013330 +v 0.170206 -1.328077 -0.030354 +v 0.170206 -1.079780 -0.043142 +v 0.170206 -0.831483 -0.059049 +v 0.191670 -1.328077 -0.021464 +v 0.200712 -1.079780 -0.030506 +v 0.211960 -0.831483 -0.041754 +v 0.128452 -0.831483 -0.041754 +v 0.139699 -1.079780 -0.030506 +v 0.148742 -1.328077 -0.021464 +v 0.197800 -1.591893 -0.013272 +v 0.170206 -1.591893 -0.018769 +v 0.142611 -1.591893 -0.013272 +v 0.187911 -1.800411 -0.008515 +v 0.170206 -1.800411 -0.012043 +v 0.152501 -1.800411 -0.008515 +v 0.125646 -1.730117 -0.021431 +v 0.170206 -1.730117 -0.030309 +v 0.214766 -1.730117 -0.021431 +v 0.123758 -1.661727 -0.022339 +v 0.216654 -1.661727 -0.022339 +v 0.170206 -1.661727 -0.031593 +v 0.184172 -1.826993 -0.006717 +v 0.170206 -1.826993 -0.009499 +v 0.156240 -1.826993 -0.006717 +v 0.170206 -0.707334 -0.069814 +v 0.219572 -0.707334 -0.049366 +v 0.120840 -0.707334 -0.049366 +v 0.170206 -0.955631 -0.051096 +v 0.206336 -0.955631 -0.036130 +v 0.134076 -0.955631 -0.036130 +v 0.170206 -1.203929 -0.036748 +v 0.196191 -1.203929 -0.025985 +v 0.144221 -1.203929 -0.025985 +v 0.152809 -1.452226 -0.017397 +v 0.170206 -1.452226 -0.024603 +v 0.187603 -1.452226 -0.017397 +v 0.318182 -0.698659 -0.170534 +v 0.253084 -0.632106 -0.088812 +v 0.049415 -0.691270 -0.141206 +v 0.146482 -0.752407 -0.235877 +v 0.373708 -0.831169 -0.426532 +v 0.386636 -0.873150 -0.371511 +v 0.475795 -0.153344 -0.130011 +v 0.511181 0.133658 -0.041556 +v 0.474008 -0.026440 -0.140771 +v 0.547109 0.169169 -0.041778 +v 0.407220 0.241402 -0.136457 +v 0.502461 0.298857 -0.056423 +v 0.401276 0.465145 -0.063620 +v 0.123020 0.668310 -0.106835 +v 0.426513 -0.373429 -0.099366 +v 0.325640 -0.665741 -0.205271 +v 0.285292 -0.562974 -0.131193 +v 0.408944 -0.558046 -0.093502 +v 0.054898 -0.604433 -0.225989 +v 0.153080 -0.706313 -0.307471 +v 0.314944 -0.843130 -0.399746 +v 0.397477 -0.803904 -0.367137 +v 0.351881 -0.400999 -0.174779 +v 0.118729 -0.449925 -0.257974 +v 0.378223 -0.469231 -0.096314 +v 0.087215 -0.532533 -0.232413 +v 0.303330 -0.488303 -0.151478 +v 0.155619 0.349414 -0.261115 +v 0.151427 -0.035196 -0.354015 +v 0.466339 0.183429 -0.087694 +v 0.154209 -0.246960 -0.338681 +v 0.299184 0.565350 -0.080979 +v 0.349004 0.286941 -0.161877 +v 0.410575 -0.021796 -0.241559 +v 0.415381 -0.210880 -0.225887 +v 0.427537 0.143688 -0.144557 +v 0.165232 0.192110 -0.307798 +v 0.373920 0.162750 -0.220245 +v 0.460314 -0.279533 -0.114308 +v 0.146187 -0.362564 -0.300099 +v 0.390694 -0.314888 -0.201248 +v 0.217959 -0.735870 -0.170757 +v 0.154713 -0.685814 -0.088694 +v 0.322380 -0.859443 -0.358710 +v 0.261395 -0.650783 -0.274753 +v 0.196627 -0.564669 -0.213930 +v 0.397878 -0.821175 -0.344508 +v 0.247173 -0.424395 -0.227753 +v 0.209314 -0.503712 -0.203917 +v 0.267288 0.318178 -0.234579 +v 0.304094 -0.027205 -0.312159 +v 0.303272 -0.229573 -0.298125 +v 0.217053 0.619927 -0.095195 +v 0.292385 0.177670 -0.281210 +v 0.284530 -0.340079 -0.263740 +v 0.540254 0.138453 -0.041667 +v 0.141675 0.481710 -0.218180 +v 0.399981 0.341326 -0.114954 +v 0.487629 0.248649 -0.086988 +v 0.324094 0.414198 -0.144993 +v 0.244923 0.447954 -0.198982 +v 0.323285 -0.645710 -0.072712 +v 0.459726 -0.672791 -0.082857 +v 0.494470 -0.622863 -0.074666 +v 0.613801 -0.735057 -0.041385 +v 0.623846 -0.711319 -0.039635 +v 0.000000 -0.668841 -0.128750 +v 0.000000 0.711039 -0.097357 +v 0.000000 -0.598862 -0.221815 +v 0.000000 -0.465157 -0.271386 +v 0.000000 -0.543316 -0.238939 +v 0.000000 0.374270 -0.259671 +v 0.000000 -0.039945 -0.355292 +v 0.000000 -0.256691 -0.349083 +v 0.000000 0.197303 -0.317093 +v 0.000000 -0.374165 -0.315024 +v 0.000000 0.508964 -0.212719 +v -0.089627 -0.583185 -0.000000 +v -0.113228 -0.583185 -0.000000 +v -0.170206 -0.583185 -0.000000 +v -0.227184 -0.583185 -0.000000 +v -0.250785 -0.583185 -0.000000 +v -0.189058 -1.576375 -0.000000 +v -0.183536 -1.576375 0.013330 +v -0.170206 -1.576375 0.018852 +v -0.156875 -1.576375 0.013330 +v -0.151354 -1.576375 -0.000000 +v -0.229255 -0.831483 -0.000000 +v -0.213349 -1.079780 -0.000000 +v -0.200560 -1.328077 -0.000000 +v -0.170206 -1.328077 0.030354 +v -0.170206 -1.079780 0.043142 +v -0.170206 -0.831483 0.059049 +v -0.191670 -1.328077 0.021464 +v -0.200712 -1.079780 0.030506 +v -0.211960 -0.831483 0.041754 +v -0.139852 -1.328077 -0.000000 +v -0.127063 -1.079780 -0.000000 +v -0.111157 -0.831483 -0.000000 +v -0.128452 -0.831483 0.041754 +v -0.139699 -1.079780 0.030506 +v -0.148742 -1.328077 0.021464 +v -0.209230 -1.591893 -0.000000 +v -0.197800 -1.591893 0.013272 +v -0.170206 -1.591893 0.018769 +v -0.142611 -1.591893 0.013272 +v -0.131181 -1.591893 -0.000000 +v -0.195245 -1.800411 -0.000000 +v -0.187911 -1.800411 0.008515 +v -0.170206 -1.800411 0.012043 +v -0.152501 -1.800411 0.008515 +v -0.145167 -1.800411 -0.000000 +v -0.107188 -1.730117 -0.000000 +v -0.125646 -1.730117 0.021431 +v -0.170206 -1.730117 0.030309 +v -0.214766 -1.730117 0.021431 +v -0.233223 -1.730117 -0.000000 +v -0.123758 -1.661727 0.022339 +v -0.216654 -1.661727 0.022339 +v -0.235893 -1.661727 -0.000000 +v -0.104519 -1.661727 -0.000000 +v -0.170206 -1.661727 0.031593 +v -0.189957 -1.826993 -0.000000 +v -0.184172 -1.826993 0.006717 +v -0.170206 -1.826993 0.009499 +v -0.156240 -1.826993 0.006717 +v -0.150455 -1.826993 -0.000000 +v -0.182840 -1.844812 -0.000000 +v -0.179139 -1.844812 -0.000000 +v -0.170206 -1.844812 -0.000000 +v -0.161272 -1.844812 -0.000000 +v -0.157572 -1.844812 -0.000000 +v -0.170206 -0.707334 0.069814 +v -0.219572 -0.707334 0.049366 +v -0.100392 -0.707334 -0.000000 +v -0.240020 -0.707334 -0.000000 +v -0.120840 -0.707334 0.049366 +v -0.221302 -0.955631 -0.000000 +v -0.170206 -0.955631 0.051096 +v -0.206336 -0.955631 0.036130 +v -0.119110 -0.955631 -0.000000 +v -0.134076 -0.955631 0.036130 +v -0.206954 -1.203929 -0.000000 +v -0.170206 -1.203929 0.036748 +v -0.196191 -1.203929 0.025985 +v -0.133457 -1.203929 -0.000000 +v -0.144221 -1.203929 0.025985 +v -0.194809 -1.452226 -0.000000 +v -0.152809 -1.452226 0.017397 +v -0.170206 -1.452226 0.024603 +v -0.187603 -1.452226 0.017397 +v -0.145603 -1.452226 -0.000000 +v -0.318182 -0.698659 0.170534 +v -0.253084 -0.632106 0.088812 +v -0.049415 -0.691270 0.141206 +v -0.146482 -0.752407 0.235877 +v -0.373708 -0.831169 0.426532 +v -0.386636 -0.873150 0.371511 +v -0.475795 -0.153344 0.130011 +v -0.511181 0.133658 0.041556 +v -0.474008 -0.026440 0.140771 +v -0.547109 0.169169 0.041778 +v -0.407220 0.241402 0.136457 +v -0.502461 0.298857 0.056423 +v -0.401276 0.465145 0.063620 +v -0.123020 0.668310 0.106835 +v -0.426513 -0.373429 0.099366 +v -0.325640 -0.665741 0.205271 +v -0.285292 -0.562974 0.131193 +v -0.408944 -0.558046 0.093502 +v -0.054898 -0.604433 0.225989 +v -0.153080 -0.706313 0.307471 +v -0.314944 -0.843130 0.399746 +v -0.397477 -0.803904 0.367137 +v -0.351881 -0.400999 0.174779 +v -0.118729 -0.449925 0.257974 +v -0.378223 -0.469231 0.096314 +v -0.087215 -0.532533 0.232413 +v -0.303330 -0.488303 0.151478 +v -0.155619 0.349414 0.261115 +v -0.151427 -0.035196 0.354015 +v -0.466339 0.183429 0.087694 +v -0.154209 -0.246960 0.338681 +v -0.299184 0.565350 0.080979 +v -0.349004 0.286941 0.161877 +v -0.410575 -0.021796 0.241559 +v -0.415381 -0.210880 0.225887 +v -0.427537 0.143688 0.144557 +v -0.165232 0.192110 0.307798 +v -0.373920 0.162750 0.220245 +v -0.460314 -0.279533 0.114308 +v -0.146187 -0.362564 0.300099 +v -0.390694 -0.314888 0.201248 +v -0.217959 -0.735870 0.170757 +v -0.154713 -0.685814 0.088694 +v -0.322380 -0.859443 0.358710 +v -0.261395 -0.650783 0.274753 +v -0.196627 -0.564669 0.213930 +v -0.397878 -0.821175 0.344508 +v -0.247173 -0.424395 0.227753 +v -0.209314 -0.503712 0.203917 +v -0.267288 0.318178 0.234579 +v -0.304094 -0.027205 0.312159 +v -0.303272 -0.229573 0.298125 +v -0.217053 0.619927 0.095195 +v -0.292385 0.177670 0.281210 +v -0.284530 -0.340079 0.263740 +v -0.540254 0.138453 0.041667 +v -0.141675 0.481710 0.218180 +v -0.399981 0.341326 0.114954 +v -0.487629 0.248649 0.086988 +v -0.324094 0.414198 0.144993 +v -0.244923 0.447954 0.198982 +v -0.323285 -0.645710 0.072712 +v -0.459726 -0.672791 0.082857 +v -0.494470 -0.622863 0.074666 +v -0.613801 -0.735057 0.041385 +v -0.623846 -0.711319 0.039635 +v -0.490724 -0.130016 -0.000000 +v -0.523394 0.119072 -0.000000 +v -0.477580 -0.040527 -0.000000 +v -0.559464 0.164297 -0.000000 +v -0.420224 0.176511 -0.000000 +v -0.511808 0.347278 -0.000000 +v -0.413141 0.500016 -0.000000 +v -0.135771 0.717541 -0.000000 +v -0.468569 -0.344054 -0.000000 +v -0.466104 0.155368 -0.000000 +v -0.301750 0.601310 -0.000000 +v -0.437352 0.109415 -0.000000 +v -0.485942 -0.248253 -0.000000 +v -0.215674 0.663051 -0.000000 +v -0.552538 0.128724 -0.000000 +v -0.418273 -0.437503 -0.000000 +v -0.478798 -0.515592 -0.000000 +v -0.297263 -0.654020 -0.000000 +v -0.402165 -0.706866 -0.000000 +v -0.522051 -0.565707 -0.000000 +v -0.634745 -0.749150 -0.000000 +v -0.656862 -0.690032 -0.000000 +v -0.123954 -0.602300 -0.000000 +v 0.089627 -0.583185 0.000000 +v 0.113228 -0.583185 0.000000 +v 0.170206 -0.583185 0.000000 +v 0.227184 -0.583185 0.000000 +v 0.250785 -0.583185 0.000000 +v 0.189058 -1.576375 0.000000 +v 0.183536 -1.576375 0.013330 +v 0.170206 -1.576375 0.018852 +v 0.156875 -1.576375 0.013330 +v 0.151354 -1.576375 0.000000 +v 0.229255 -0.831483 0.000000 +v 0.213349 -1.079780 0.000000 +v 0.200560 -1.328077 0.000000 +v 0.170206 -1.328077 0.030354 +v 0.170206 -1.079780 0.043143 +v 0.170206 -0.831483 0.059049 +v 0.191670 -1.328077 0.021464 +v 0.200712 -1.079780 0.030506 +v 0.211960 -0.831483 0.041754 +v 0.139852 -1.328077 0.000000 +v 0.127063 -1.079780 0.000000 +v 0.111157 -0.831483 0.000000 +v 0.128452 -0.831483 0.041754 +v 0.139699 -1.079780 0.030506 +v 0.148742 -1.328077 0.021464 +v 0.209230 -1.591893 0.000000 +v 0.197800 -1.591893 0.013272 +v 0.170206 -1.591893 0.018769 +v 0.142611 -1.591893 0.013272 +v 0.131181 -1.591893 0.000000 +v 0.195245 -1.800411 0.000000 +v 0.187911 -1.800411 0.008515 +v 0.170206 -1.800411 0.012043 +v 0.152501 -1.800411 0.008515 +v 0.145167 -1.800411 0.000000 +v 0.107188 -1.730117 0.000000 +v 0.125646 -1.730117 0.021432 +v 0.170206 -1.730117 0.030309 +v 0.214766 -1.730117 0.021432 +v 0.233223 -1.730117 0.000000 +v 0.123758 -1.661727 0.022339 +v 0.216654 -1.661727 0.022339 +v 0.235893 -1.661727 0.000000 +v 0.104519 -1.661727 0.000000 +v 0.170206 -1.661727 0.031593 +v 0.189957 -1.826993 0.000000 +v 0.184172 -1.826993 0.006717 +v 0.170206 -1.826993 0.009499 +v 0.156240 -1.826993 0.006717 +v 0.150455 -1.826993 0.000000 +v 0.182840 -1.844812 0.000000 +v 0.179139 -1.844812 0.000000 +v 0.170206 -1.844812 0.000000 +v 0.161272 -1.844812 0.000000 +v 0.157572 -1.844812 0.000000 +v 0.170206 -0.707334 0.069814 +v 0.219572 -0.707334 0.049366 +v 0.100392 -0.707334 0.000000 +v 0.240020 -0.707334 0.000000 +v 0.120840 -0.707334 0.049366 +v 0.221302 -0.955631 0.000000 +v 0.170206 -0.955631 0.051096 +v 0.206336 -0.955631 0.036130 +v 0.119110 -0.955631 0.000000 +v 0.134076 -0.955631 0.036130 +v 0.206954 -1.203929 0.000000 +v 0.170206 -1.203929 0.036748 +v 0.196191 -1.203929 0.025985 +v 0.133457 -1.203929 0.000000 +v 0.144221 -1.203929 0.025985 +v 0.194809 -1.452226 0.000000 +v 0.152809 -1.452226 0.017397 +v 0.170206 -1.452226 0.024603 +v 0.187603 -1.452226 0.017397 +v 0.145603 -1.452226 0.000000 +v 0.318182 -0.698659 0.170534 +v 0.253084 -0.632106 0.088812 +v 0.049415 -0.691270 0.141206 +v 0.146482 -0.752407 0.235877 +v 0.373708 -0.831169 0.426532 +v 0.386636 -0.873150 0.371511 +v 0.475795 -0.153344 0.130011 +v 0.511181 0.133658 0.041556 +v 0.474008 -0.026440 0.140771 +v 0.547109 0.169169 0.041778 +v 0.407220 0.241402 0.136457 +v 0.502461 0.298857 0.056423 +v 0.401276 0.465145 0.063620 +v 0.123020 0.668310 0.106835 +v 0.426513 -0.373429 0.099366 +v 0.325640 -0.665741 0.205271 +v 0.285292 -0.562974 0.131193 +v 0.408944 -0.558046 0.093502 +v 0.054897 -0.604433 0.225989 +v 0.153080 -0.706313 0.307471 +v 0.314944 -0.843130 0.399746 +v 0.397477 -0.803904 0.367138 +v 0.351881 -0.400999 0.174779 +v 0.118729 -0.449925 0.257974 +v 0.378223 -0.469231 0.096314 +v 0.087215 -0.532533 0.232413 +v 0.303330 -0.488303 0.151478 +v 0.155619 0.349414 0.261115 +v 0.151426 -0.035196 0.354016 +v 0.466339 0.183429 0.087694 +v 0.154209 -0.246960 0.338681 +v 0.299184 0.565350 0.080979 +v 0.349004 0.286941 0.161878 +v 0.410575 -0.021796 0.241559 +v 0.415381 -0.210880 0.225887 +v 0.427537 0.143688 0.144557 +v 0.165232 0.192110 0.307798 +v 0.373920 0.162750 0.220245 +v 0.460314 -0.279533 0.114308 +v 0.146187 -0.362564 0.300099 +v 0.390694 -0.314888 0.201248 +v 0.217959 -0.735870 0.170757 +v 0.154713 -0.685814 0.088694 +v 0.322379 -0.859443 0.358710 +v 0.261395 -0.650783 0.274753 +v 0.196626 -0.564669 0.213930 +v 0.397877 -0.821175 0.344509 +v 0.247173 -0.424395 0.227753 +v 0.209314 -0.503712 0.203917 +v 0.267288 0.318178 0.234579 +v 0.304094 -0.027205 0.312160 +v 0.303272 -0.229573 0.298125 +v 0.217053 0.619927 0.095195 +v 0.292385 0.177670 0.281210 +v 0.284530 -0.340079 0.263740 +v 0.540254 0.138453 0.041667 +v 0.141675 0.481710 0.218180 +v 0.399981 0.341326 0.114954 +v 0.487629 0.248649 0.086988 +v 0.324094 0.414198 0.144993 +v 0.244923 0.447954 0.198982 +v 0.323285 -0.645710 0.072713 +v 0.459726 -0.672791 0.082858 +v 0.494470 -0.622863 0.074666 +v 0.613801 -0.735057 0.041385 +v 0.623846 -0.711319 0.039635 +v -0.000000 -0.668841 0.128750 +v -0.000000 0.711039 0.097357 +v -0.000000 -0.598862 0.221815 +v -0.000000 -0.465157 0.271386 +v -0.000000 -0.543316 0.238939 +v -0.000000 0.374270 0.259671 +v -0.000000 -0.039945 0.355292 +v -0.000000 -0.256691 0.349083 +v -0.000000 0.197303 0.317093 +v -0.000000 -0.374165 0.315024 +v -0.000000 0.508964 0.212719 +v 0.490724 -0.130016 0.000000 +v 0.523394 0.119072 0.000000 +v 0.477580 -0.040527 0.000000 +v 0.559464 0.164297 0.000000 +v 0.420224 0.176511 0.000000 +v 0.511808 0.347278 0.000000 +v 0.413141 0.500016 0.000000 +v 0.135771 0.717541 0.000000 +v 0.468569 -0.344054 0.000000 +v 0.466104 0.155368 0.000000 +v 0.301750 0.601310 0.000000 +v 0.437352 0.109415 0.000000 +v 0.485942 -0.248253 0.000000 +v 0.215674 0.663051 0.000000 +v 0.552538 0.128724 0.000000 +v 0.418273 -0.437503 0.000000 +v 0.478798 -0.515592 0.000000 +v 0.297263 -0.654020 0.000000 +v 0.402165 -0.706866 0.000000 +v 0.522051 -0.565707 0.000000 +v 0.634745 -0.749150 0.000000 +v 0.656862 -0.690032 0.000000 +v 0.123954 -0.602300 0.000000 +v 0.000000 0.770099 0.000000 +v 0.000000 -0.590038 0.000000 +vt 0.765667 0.847851 +vt 0.781406 0.881190 +vt 0.757326 0.897740 +vt 0.820730 0.960391 +vt 0.802617 0.952261 +vt 0.541679 0.522282 +vt 0.503869 0.505868 +vt 0.534446 0.481536 +vt 0.813702 0.879176 +vt 0.828604 0.944627 +vt 0.348861 0.273078 +vt 0.327204 0.236304 +vt 0.348470 0.229238 +vt 0.523775 0.470642 +vt 0.379614 0.360342 +vt 0.368479 0.327104 +vt 0.402840 0.321660 +vt 0.196117 0.168219 +vt 0.207618 0.212142 +vt 0.153801 0.203441 +vt 0.592581 0.524769 +vt 0.573477 0.533686 +vt 0.576737 0.501503 +vt 0.147971 0.164759 +vt 0.117999 0.200664 +vt 0.253544 0.157057 +vt 0.246687 0.159448 +vt 0.243896 0.147003 +vt 0.556820 0.495176 +vt 0.561521 0.456032 +vt 0.287378 0.190075 +vt 0.310344 0.186756 +vt 0.008155 0.307394 +vt 0.034796 0.301414 +vt 0.030874 0.334151 +vt 0.568960 0.457867 +vt 0.575756 0.461730 +vt 0.081702 0.200796 +vt 0.052650 0.204107 +vt 0.054548 0.172529 +vt 0.558976 0.447837 +vt 0.574977 0.446772 +vt 0.488321 0.506845 +vt 0.488454 0.478851 +vt 0.246940 0.180887 +vt 0.246421 0.215578 +vt 0.217765 0.169501 +vt 0.261128 0.160439 +vt 0.266041 0.149090 +vt 0.510862 0.526170 +vt 0.562570 0.551870 +vt 0.592250 0.559761 +vt 0.048126 0.233678 +vt 0.018481 0.240712 +vt 0.022196 0.213642 +vt 0.016085 0.271814 +vt 0.488146 0.522567 +vt 0.272640 0.352308 +vt 0.266285 0.309796 +vt 0.306509 0.317265 +vt 0.219390 0.348309 +vt 0.218504 0.304402 +vt 0.097073 0.300587 +vt 0.154005 0.305479 +vt 0.152365 0.343275 +vt 0.259571 0.241715 +vt 0.284232 0.228202 +vt 0.228105 0.159529 +vt 0.267650 0.189263 +vt 0.156116 0.266050 +vt 0.063491 0.298386 +vt 0.093667 0.338867 +vt 0.101905 0.262714 +vt 0.156504 0.233886 +vt 0.105516 0.229954 +vt 0.212060 0.239792 +vt 0.260313 0.276531 +vt 0.299464 0.259009 +vt 0.359509 0.299307 +vt 0.374862 0.266999 +vt 0.075719 0.230415 +vt 0.070080 0.261898 +vt 0.059995 0.336338 +vt 0.084177 0.167430 +vt 0.042328 0.265609 +vt 0.214589 0.269155 +vt 0.390637 0.295167 +vt 0.300579 0.287682 +vt 0.541593 0.537835 +vt 0.580964 0.460070 +vt 0.800982 0.844542 +vt 0.313721 0.355393 +vt 0.023567 0.182058 +vt 0.595587 0.583529 +vt 0.579256 0.583190 +vt 0.575877 0.565793 +vt 0.598951 0.536440 +vt 0.616408 0.555802 +vt 0.811548 0.811816 +vt 0.821678 0.836571 +vt 0.850639 0.811816 +vt 0.612502 0.566147 +vt 0.640763 0.574032 +vt 0.607645 0.583771 +vt 0.636557 0.577063 +vt 0.923996 0.811816 +vt 0.916944 0.825389 +vt 0.645790 0.584535 +vt 0.634813 0.584315 +vt 0.716415 0.855602 +vt 0.716415 0.811816 +vt 0.752707 0.811816 +vt 0.667162 0.847851 +vt 0.701030 0.862184 +vt 0.675503 0.897740 +vt 0.630213 0.952261 +vt 0.612100 0.960391 +vt 0.651423 0.881190 +vt 0.435661 0.521616 +vt 0.420646 0.494770 +vt 0.442807 0.481307 +vt 0.604225 0.944627 +vt 0.345060 0.486512 +vt 0.324023 0.476269 +vt 0.346611 0.442818 +vt 0.472887 0.505628 +vt 0.453425 0.470551 +vt 0.401769 0.402432 +vt 0.367621 0.391842 +vt 0.191393 0.524548 +vt 0.143252 0.520777 +vt 0.150095 0.483047 +vt 0.400890 0.501018 +vt 0.404023 0.532867 +vt 0.385154 0.524054 +vt 0.115791 0.516551 +vt 0.114290 0.480446 +vt 0.238516 0.552891 +vt 0.241631 0.540890 +vt 0.248411 0.544306 +vt 0.408681 0.457781 +vt 0.416057 0.455978 +vt 0.305884 0.523188 +vt 0.283052 0.516430 +vt 0.033922 0.367412 +vt 0.007492 0.357446 +vt 0.401939 0.461597 +vt 0.050220 0.499004 +vt 0.049163 0.467204 +vt 0.078069 0.474868 +vt 0.402740 0.446772 +vt 0.418597 0.447861 +vt 0.213033 0.526517 +vt 0.242852 0.484832 +vt 0.242451 0.519531 +vt 0.260672 0.554132 +vt 0.256070 0.542068 +vt 0.465725 0.525575 +vt 0.414679 0.550862 +vt 0.401598 0.564665 +vt 0.385436 0.558614 +vt 0.045431 0.437013 +vt 0.019022 0.453118 +vt 0.014463 0.394145 +vt 0.305513 0.392363 +vt 0.265172 0.393781 +vt 0.153001 0.381243 +vt 0.096052 0.377581 +vt 0.280922 0.477906 +vt 0.256668 0.460719 +vt 0.223088 0.538020 +vt 0.154063 0.420909 +vt 0.217343 0.391995 +vt 0.062479 0.374739 +vt 0.099871 0.416105 +vt 0.102608 0.449341 +vt 0.153598 0.453068 +vt 0.204035 0.482438 +vt 0.296940 0.449447 +vt 0.258330 0.426084 +vt 0.372400 0.452786 +vt 0.357933 0.418238 +vt 0.072882 0.444410 +vt 0.209200 0.455510 +vt 0.212503 0.426585 +vt 0.068088 0.412143 +vt 0.079656 0.508539 +vt 0.040490 0.404276 +vt 0.388889 0.427042 +vt 0.298812 0.420997 +vt 0.016031 0.425545 +vt 0.435834 0.536932 +vt 0.396779 0.459941 +vt 0.631847 0.844542 +vt 0.263342 0.514280 +vt 0.248478 0.556199 +vt 0.019553 0.484844 +vt 0.381930 0.582105 +vt 0.378876 0.535598 +vt 0.365480 0.564740 +vt 0.361742 0.554580 +vt 0.611151 0.836571 +vt 0.621281 0.811816 +vt 0.567553 0.841240 +vt 0.582190 0.811816 +vt 0.370025 0.582122 +vt 0.341824 0.575112 +vt 0.337758 0.572098 +vt 0.343422 0.582222 +vt 0.515886 0.825389 +vt 0.508833 0.811816 +vt 0.332714 0.582275 +vt 0.680122 0.811816 +vt 0.765667 0.775781 +vt 0.731799 0.761448 +vt 0.757326 0.725892 +vt 0.802617 0.671371 +vt 0.820730 0.663242 +vt 0.781406 0.742443 +vt 0.539594 0.643435 +vt 0.554193 0.670622 +vt 0.531837 0.683699 +vt 0.828604 0.679006 +vt 0.479666 0.083641 +vt 0.499691 0.092947 +vt 0.474072 0.127737 +vt 0.502214 0.659084 +vt 0.521087 0.694243 +vt 0.415338 0.171083 +vt 0.448404 0.180106 +vt 0.433529 0.212420 +vt 0.636397 0.037914 +vt 0.684045 0.039393 +vt 0.673728 0.077735 +vt 0.574070 0.664748 +vt 0.571561 0.632605 +vt 0.590374 0.642096 +vt 0.711032 0.042327 +vt 0.709184 0.078629 +vt 0.592040 0.011631 +vt 0.587823 0.023872 +vt 0.581379 0.020757 +vt 0.565451 0.707786 +vt 0.558059 0.709446 +vt 0.522121 0.044803 +vt 0.544260 0.050511 +vt 0.778801 0.221997 +vt 0.778844 0.188635 +vt 0.804271 0.197401 +vt 0.572250 0.704105 +vt 0.774782 0.056845 +vt 0.772891 0.088832 +vt 0.744781 0.082503 +vt 0.571169 0.718879 +vt 0.555377 0.717492 +vt 0.486415 0.685497 +vt 0.486873 0.657751 +vt 0.615004 0.036973 +vt 0.581414 0.080407 +vt 0.585026 0.045429 +vt 0.570065 0.011449 +vt 0.573536 0.023381 +vt 0.509527 0.639229 +vt 0.561148 0.614017 +vt 0.575139 0.600508 +vt 0.591299 0.607170 +vt 0.773815 0.119068 +vt 0.801637 0.101570 +vt 0.800720 0.160764 +vt 0.487143 0.642136 +vt 0.510375 0.176588 +vt 0.550726 0.173214 +vt 0.539440 0.215358 +vt 0.592160 0.216820 +vt 0.658518 0.218661 +vt 0.661401 0.180440 +vt 0.717840 0.181384 +vt 0.542815 0.089220 +vt 0.565405 0.105366 +vt 0.606044 0.025869 +vt 0.664016 0.140528 +vt 0.598247 0.172708 +vt 0.716633 0.220273 +vt 0.751050 0.182629 +vt 0.717601 0.142757 +vt 0.717951 0.109404 +vt 0.667458 0.108107 +vt 0.619892 0.080948 +vt 0.524209 0.118664 +vt 0.560540 0.140340 +vt 0.449284 0.118937 +vt 0.460508 0.153045 +vt 0.747131 0.112939 +vt 0.612248 0.108327 +vt 0.606277 0.137627 +vt 0.748922 0.145216 +vt 0.749970 0.221197 +vt 0.746318 0.048657 +vt 0.775710 0.151812 +vt 0.430460 0.145669 +vt 0.519708 0.147416 +vt 0.802065 0.129205 +vt 0.539592 0.628021 +vt 0.577368 0.705857 +vt 0.800982 0.779090 +vt 0.563712 0.051727 +vt 0.498767 0.214229 +vt 0.582414 0.008778 +vt 0.804046 0.069632 +vt 0.597108 0.630696 +vt 0.611792 0.601578 +vt 0.615284 0.612064 +vt 0.821678 0.787061 +vt 0.865276 0.782392 +vt 0.636265 0.591632 +vt 0.640346 0.594828 +vt 0.916944 0.798243 +vt 0.716415 0.768030 +vt 0.667162 0.775781 +vt 0.651423 0.742443 +vt 0.675503 0.725892 +vt 0.612100 0.663242 +vt 0.630213 0.671371 +vt 0.434314 0.642430 +vt 0.471474 0.658610 +vt 0.441087 0.682242 +vt 0.619127 0.744456 +vt 0.604225 0.679006 +vt 0.456108 0.298854 +vt 0.474294 0.334858 +vt 0.452437 0.343002 +vt 0.451406 0.693085 +vt 0.441552 0.245369 +vt 0.406790 0.252510 +vt 0.598684 0.397134 +vt 0.591285 0.353437 +vt 0.644135 0.359609 +vt 0.385062 0.639373 +vt 0.403731 0.630839 +vt 0.400085 0.662191 +vt 0.646365 0.398300 +vt 0.679573 0.360682 +vt 0.540393 0.411148 +vt 0.547452 0.408408 +vt 0.549081 0.420811 +vt 0.419371 0.668626 +vt 0.414221 0.706770 +vt 0.509720 0.379513 +vt 0.486514 0.383964 +vt 0.798974 0.247859 +vt 0.771859 0.255168 +vt 0.406981 0.704864 +vt 0.400405 0.700987 +vt 0.715774 0.358799 +vt 0.745046 0.354062 +vt 0.740229 0.385968 +vt 0.416583 0.714824 +vt 0.400931 0.715608 +vt 0.549185 0.386821 +vt 0.552916 0.351846 +vt 0.577219 0.396886 +vt 0.533146 0.408106 +vt 0.527196 0.419776 +vt 0.464588 0.638573 +vt 0.414699 0.613138 +vt 0.385481 0.605425 +vt 0.752295 0.324053 +vt 0.782503 0.315537 +vt 0.776291 0.342988 +vt 0.787773 0.284087 +vt 0.541838 0.257881 +vt 0.502426 0.252295 +vt 0.588976 0.261012 +vt 0.709692 0.259003 +vt 0.653382 0.256819 +vt 0.542226 0.326147 +vt 0.516387 0.340950 +vt 0.565986 0.407430 +vt 0.529313 0.379380 +vt 0.647626 0.296644 +vt 0.742969 0.259602 +vt 0.701367 0.297392 +vt 0.644260 0.329067 +vt 0.694732 0.330570 +vt 0.589417 0.325794 +vt 0.544711 0.291106 +vt 0.504054 0.310647 +vt 0.447921 0.272942 +vt 0.429621 0.306232 +vt 0.724482 0.328670 +vt 0.733021 0.296680 +vt 0.710215 0.392534 +vt 0.761034 0.291604 +vt 0.589615 0.296334 +vt 0.416502 0.278614 +vt 0.505598 0.281813 +vt 0.434384 0.627385 +vt 0.395297 0.702524 +vt 0.631847 0.779090 +vt 0.772000 0.374874 +vt 0.398255 0.582155 +vt 0.401609 0.599424 +vt 0.379009 0.628098 +vt 0.361983 0.609576 +vt 0.611151 0.787061 +vt 0.365609 0.599452 +vt 0.337869 0.592387 +vt 0.341895 0.589336 +vt 0.515886 0.798243 +vt 0.731799 0.862184 +vt 0.498552 0.476686 +vt 0.412977 0.362847 +vt 0.586244 0.501621 +vt 0.120453 0.164856 +vt 0.253926 0.145197 +vt 0.005191 0.332222 +vt 0.865276 0.841240 +vt 0.619127 0.879176 +vt 0.478394 0.476642 +vt 0.391466 0.501119 +vt 0.813702 0.744456 +vt 0.496368 0.687823 +vt 0.400498 0.211503 +vt 0.583493 0.664861 +vt 0.804229 0.222703 +vt 0.701030 0.761448 +vt 0.476382 0.687504 +vt 0.390838 0.661924 +vt 0.673810 0.396875 +vt 0.538914 0.423115 +vt 0.567553 0.782393 +vt 0.945666 0.143947 +vt 0.945489 0.098242 +vt 0.951021 0.098065 +vt 0.952286 0.143864 +vt 0.956543 0.097871 +vt 0.939254 0.143829 +vt 0.940254 0.099324 +vt 0.958711 0.143591 +vt 0.961748 0.098620 +vt 0.973390 0.398424 +vt 0.972632 0.358389 +vt 0.988248 0.357454 +vt 0.969929 0.315651 +vt 0.966895 0.272634 +vt 0.978299 0.271606 +vt 0.973823 0.228802 +vt 0.964123 0.229615 +vt 0.961401 0.186635 +vt 0.942008 0.398315 +vt 0.924803 0.400421 +vt 0.926568 0.358437 +vt 0.942944 0.316265 +vt 0.929471 0.315650 +vt 0.932532 0.272721 +vt 0.944664 0.230083 +vt 0.934934 0.229740 +vt 0.937267 0.186773 +vt 0.957768 0.397050 +vt 0.957114 0.358821 +vt 0.956428 0.316261 +vt 0.955436 0.273164 +vt 0.954398 0.230042 +vt 0.953357 0.186980 +vt 0.941852 0.358896 +vt 0.943968 0.273194 +vt 0.945304 0.187029 +vt 0.950833 0.092354 +vt 0.941012 0.092015 +vt 0.935215 0.092715 +vt 0.960586 0.091424 +vt 0.935811 0.048146 +vt 0.926562 0.047366 +vt 0.938955 0.023641 +vt 0.949535 0.047881 +vt 0.948865 0.024328 +vt 0.955013 0.023871 +vt 0.963251 0.047365 +vt 0.958720 0.023080 +vt 0.942701 0.024221 +vt 0.950131 0.068696 +vt 0.935498 0.069102 +vt 0.964757 0.068265 +vt 0.972437 0.046061 +vt 0.926131 0.069827 +vt 0.966386 0.091789 +vt 0.944144 0.015494 +vt 0.941306 0.014974 +vt 0.948616 0.015564 +vt 0.953077 0.015241 +vt 0.955881 0.014560 +vt 0.944193 0.009260 +vt 0.948432 0.009066 +vt 0.951431 0.009015 +vt 0.952674 0.009019 +vt 0.945435 0.009186 +vt 0.957639 0.441808 +vt 0.937632 0.441435 +vt 0.929668 0.443051 +vt 0.977636 0.441438 +vt 0.990439 0.400511 +vt 0.965339 0.143105 +vt 0.950445 0.098240 +vt 0.944914 0.098430 +vt 0.945193 0.144134 +vt 0.955967 0.098033 +vt 0.951813 0.144035 +vt 0.939681 0.099524 +vt 0.938780 0.144031 +vt 0.961175 0.098769 +vt 0.958237 0.143748 +vt 0.990531 0.400594 +vt 0.972632 0.358513 +vt 0.978109 0.271718 +vt 0.966706 0.272772 +vt 0.969835 0.315781 +vt 0.973538 0.228924 +vt 0.969047 0.186122 +vt 0.961023 0.186786 +vt 0.941853 0.359091 +vt 0.926568 0.358667 +vt 0.924895 0.400654 +vt 0.942851 0.316458 +vt 0.943781 0.273385 +vt 0.932344 0.272938 +vt 0.944927 0.187217 +vt 0.936889 0.186979 +vt 0.934651 0.229951 +vt 0.957114 0.358981 +vt 0.957853 0.397208 +vt 0.955249 0.273328 +vt 0.956335 0.316423 +vt 0.963840 0.229759 +vt 0.952979 0.187150 +vt 0.942095 0.398509 +vt 0.954116 0.230209 +vt 0.959996 0.091576 +vt 0.950245 0.092529 +vt 0.940423 0.092212 +vt 0.934628 0.092926 +vt 0.965797 0.091927 +vt 0.935124 0.048356 +vt 0.941961 0.024414 +vt 0.938214 0.023843 +vt 0.954272 0.024035 +vt 0.948125 0.024507 +vt 0.948848 0.048058 +vt 0.957977 0.023235 +vt 0.962563 0.047511 +vt 0.949490 0.068872 +vt 0.971746 0.046185 +vt 0.964116 0.068407 +vt 0.934858 0.069313 +vt 0.925874 0.047597 +vt 0.925493 0.070059 +vt 0.973502 0.068574 +vt 0.947857 0.015744 +vt 0.943384 0.015684 +vt 0.940546 0.015170 +vt 0.952317 0.015410 +vt 0.955119 0.014722 +vt 0.944661 0.009372 +vt 0.943420 0.009450 +vt 0.950656 0.009188 +vt 0.947658 0.009246 +vt 0.951901 0.009189 +vt 0.957822 0.441966 +vt 0.973477 0.398546 +vt 0.937813 0.441639 +vt 0.977817 0.441551 +vt 0.929377 0.315873 +vt 0.983326 0.314513 +vt 0.944382 0.230273 +vt 0.964865 0.143247 +vt 0.860080 0.103791 +vt 0.854567 0.103877 +vt 0.853871 0.149397 +vt 0.865583 0.103687 +vt 0.860466 0.149422 +vt 0.849333 0.104869 +vt 0.847488 0.149175 +vt 0.870753 0.104517 +vt 0.866870 0.149255 +vt 0.894670 0.405584 +vt 0.892345 0.362658 +vt 0.876818 0.363511 +vt 0.883940 0.277072 +vt 0.872561 0.277912 +vt 0.874783 0.320817 +vt 0.880297 0.234367 +vt 0.876734 0.191655 +vt 0.868728 0.192167 +vt 0.845961 0.363577 +vt 0.830654 0.362763 +vt 0.827503 0.404782 +vt 0.847870 0.321000 +vt 0.849714 0.278099 +vt 0.838331 0.277440 +vt 0.852689 0.192298 +vt 0.844689 0.191912 +vt 0.841544 0.234669 +vt 0.861218 0.363771 +vt 0.861256 0.402659 +vt 0.861138 0.278255 +vt 0.861313 0.321217 +vt 0.870620 0.235018 +vt 0.860710 0.192380 +vt 0.844975 0.403784 +vt 0.860925 0.235286 +vt 0.869733 0.097332 +vt 0.860002 0.098100 +vt 0.850228 0.097602 +vt 0.844442 0.098206 +vt 0.875502 0.097790 +vt 0.845886 0.053831 +vt 0.853205 0.030117 +vt 0.849486 0.029479 +vt 0.865472 0.029969 +vt 0.859341 0.030324 +vt 0.859559 0.053790 +vt 0.869179 0.029241 +vt 0.873227 0.053500 +vt 0.859755 0.074528 +vt 0.882400 0.052350 +vt 0.874328 0.074337 +vt 0.845175 0.074695 +vt 0.836691 0.052904 +vt 0.835832 0.075264 +vt 0.883671 0.074677 +vt 0.859261 0.021593 +vt 0.854808 0.021451 +vt 0.851992 0.020886 +vt 0.863710 0.021343 +vt 0.866514 0.020711 +vt 0.856214 0.015189 +vt 0.854977 0.015243 +vt 0.862188 0.015117 +vt 0.859201 0.015119 +vt 0.863427 0.015141 +vt 0.860523 0.448005 +vt 0.877327 0.404235 +vt 0.840734 0.447625 +vt 0.880299 0.448055 +vt 0.834451 0.320155 +vt 0.888240 0.319781 +vt 0.851229 0.235170 +vt 0.873481 0.148879 +vt 0.852940 0.149178 +vt 0.853392 0.103656 +vt 0.858904 0.103556 +vt 0.859534 0.149186 +vt 0.864407 0.103439 +vt 0.846555 0.148972 +vt 0.848164 0.104662 +vt 0.865937 0.149004 +vt 0.869581 0.104256 +vt 0.877759 0.403963 +vt 0.877032 0.363239 +vt 0.892554 0.362347 +vt 0.874768 0.320549 +vt 0.872317 0.277649 +vt 0.883691 0.276780 +vt 0.879819 0.234083 +vt 0.870146 0.234759 +vt 0.868025 0.191912 +vt 0.845405 0.403592 +vt 0.827939 0.404635 +vt 0.830865 0.362606 +vt 0.847857 0.320799 +vt 0.834434 0.319987 +vt 0.838085 0.277262 +vt 0.850757 0.234958 +vt 0.841069 0.234482 +vt 0.843986 0.191717 +vt 0.861680 0.402427 +vt 0.861434 0.363538 +vt 0.861301 0.320983 +vt 0.860896 0.278021 +vt 0.860453 0.235051 +vt 0.860008 0.192145 +vt 0.846176 0.363382 +vt 0.849471 0.277892 +vt 0.851987 0.192083 +vt 0.858796 0.097865 +vt 0.849020 0.097392 +vt 0.843237 0.098010 +vt 0.868522 0.097073 +vt 0.844444 0.053632 +vt 0.835244 0.052727 +vt 0.847913 0.029271 +vt 0.858116 0.053557 +vt 0.857773 0.030092 +vt 0.863902 0.029721 +vt 0.871782 0.053232 +vt 0.867604 0.028984 +vt 0.851636 0.029899 +vt 0.858423 0.074294 +vt 0.843844 0.074498 +vt 0.872994 0.074066 +vt 0.880949 0.052059 +vt 0.834505 0.075090 +vt 0.874293 0.097516 +vt 0.853193 0.021229 +vt 0.850374 0.020672 +vt 0.857645 0.021360 +vt 0.862093 0.021099 +vt 0.864894 0.020460 +vt 0.853328 0.015021 +vt 0.857551 0.014886 +vt 0.860538 0.014877 +vt 0.861777 0.014898 +vt 0.854565 0.014964 +vt 0.861190 0.447776 +vt 0.841399 0.447445 +vt 0.833364 0.447147 +vt 0.880966 0.447776 +vt 0.895109 0.405268 +vt 0.872546 0.148611 +vt 0.983423 0.314413 +vt 0.969427 0.185990 +vt 0.974143 0.068454 +vt 0.985583 0.443051 +vt 0.929853 0.443272 +vt 0.985768 0.443145 +vt 0.832700 0.447307 +vt 0.888323 0.447927 +vt 0.888219 0.319480 +vt 0.876028 0.191380 +vt 0.882339 0.074384 +vt 0.888989 0.447628 +vt 0.197547 0.846046 +vt 0.171566 0.833295 +vt 0.188233 0.809071 +vt 0.220904 0.771567 +vt 0.238829 0.765317 +vt 0.209453 0.823639 +vt 0.257384 0.841416 +vt 0.280868 0.854949 +vt 0.267232 0.884706 +vt 0.247978 0.780082 +vt 0.288302 0.924148 +vt 0.268096 0.914751 +vt 0.283816 0.888329 +vt 0.230321 0.881363 +vt 0.265981 0.906142 +vt 0.326853 0.855017 +vt 0.296199 0.847160 +vt 0.303303 0.821266 +vt 0.170767 0.964265 +vt 0.135547 0.963014 +vt 0.138799 0.932592 +vt 0.301905 0.837333 +vt 0.285036 0.813229 +vt 0.314584 0.811028 +vt 0.114049 0.960949 +vt 0.110845 0.931955 +vt 0.194306 0.980885 +vt 0.197767 0.967718 +vt 0.208222 0.971190 +vt 0.310489 0.882803 +vt 0.303160 0.890450 +vt 0.259440 0.954403 +vt 0.238483 0.947021 +vt 0.038742 0.819414 +vt 0.042909 0.845500 +vt 0.024565 0.838964 +vt 0.315911 0.873535 +vt 0.062629 0.950547 +vt 0.060051 0.924255 +vt 0.082637 0.929108 +vt 0.326500 0.893341 +vt 0.307417 0.903751 +vt 0.245242 0.916923 +vt 0.237095 0.920499 +vt 0.218942 0.888083 +vt 0.179293 0.969537 +vt 0.173947 0.965916 +vt 0.206710 0.924713 +vt 0.223563 0.981051 +vt 0.217817 0.968490 +vt 0.229931 0.857282 +vt 0.265521 0.805135 +vt 0.267955 0.781799 +vt 0.286340 0.780963 +vt 0.055238 0.899701 +vt 0.039160 0.913825 +vt 0.031562 0.867642 +vt 0.210260 0.872421 +vt 0.248526 0.849853 +vt 0.218462 0.852715 +vt 0.221368 0.820693 +vt 0.181901 0.820416 +vt 0.131495 0.820063 +vt 0.134254 0.849197 +vt 0.090683 0.849584 +vt 0.234412 0.916565 +vt 0.216798 0.905726 +vt 0.198235 0.951069 +vt 0.137576 0.880501 +vt 0.183138 0.853825 +vt 0.086625 0.819749 +vt 0.064479 0.849436 +vt 0.095792 0.879705 +vt 0.099912 0.906629 +vt 0.139429 0.906984 +vt 0.180079 0.930008 +vt 0.245527 0.895342 +vt 0.215880 0.879072 +vt 0.307551 0.896194 +vt 0.290922 0.868606 +vt 0.076404 0.904264 +vt 0.182239 0.905752 +vt 0.182224 0.881781 +vt 0.070747 0.878445 +vt 0.060412 0.819566 +vt 0.085980 0.956486 +vt 0.049610 0.873925 +vt 0.318525 0.875214 +vt 0.245434 0.873184 +vt 0.034409 0.891963 +vt 0.253097 0.830667 +vt 0.326550 0.873283 +vt 0.226479 0.844619 +vt 0.221202 0.944492 +vt 0.252274 0.820909 +vt 0.208907 0.984473 +vt 0.040953 0.942235 +vt 0.271969 0.750066 +vt 0.313102 0.800840 +vt 0.300480 0.762946 +vt 0.315967 0.772707 +vt 0.237458 0.845449 +vt 0.229674 0.867391 +vt 0.265440 0.841019 +vt 0.254553 0.867391 +vt 0.281756 0.743864 +vt 0.315675 0.736101 +vt 0.326549 0.736414 +vt 0.307464 0.727263 +vt 0.302572 0.852525 +vt 0.309877 0.867391 +vt 0.324088 0.716419 +vt 0.163724 0.837161 +vt 0.187274 0.867391 +vt 0.129901 0.846046 +vt 0.117994 0.823639 +vt 0.139215 0.809071 +vt 0.088618 0.765317 +vt 0.106543 0.771567 +vt 0.158029 0.896522 +vt 0.207200 0.894196 +vt 0.190784 0.927687 +vt 0.090686 0.826125 +vt 0.079469 0.780082 +vt 0.274939 0.753868 +vt 0.255715 0.727202 +vt 0.274699 0.718080 +vt 0.209848 0.937673 +vt 0.292773 0.795249 +vt 0.322416 0.787814 +vt 0.151755 0.676278 +vt 0.165601 0.710698 +vt 0.123942 0.707533 +vt 0.102732 0.931898 +vt 0.119097 0.906616 +vt 0.131930 0.933683 +vt 0.096046 0.707779 +vt 0.095423 0.678803 +vt 0.188330 0.669872 +vt 0.178324 0.673200 +vt 0.173121 0.659974 +vt 0.157906 0.924189 +vt 0.177400 0.961641 +vt 0.221812 0.694488 +vt 0.241813 0.687392 +vt 0.021970 0.799648 +vt 0.039467 0.793362 +vt 0.167074 0.964099 +vt 0.156313 0.964100 +vt 0.068188 0.710233 +vt 0.046222 0.714774 +vt 0.045330 0.688495 +vt 0.186697 0.972057 +vt 0.168072 0.983232 +vt 0.229789 0.925582 +vt 0.159593 0.671121 +vt 0.180992 0.689872 +vt 0.192956 0.716371 +vt 0.198291 0.672709 +vt 0.202383 0.660217 +vt 0.186745 0.880974 +vt 0.121727 0.884755 +vt 0.089260 0.892859 +vt 0.044648 0.739284 +vt 0.024822 0.746737 +vt 0.026690 0.724921 +vt 0.025185 0.771041 +vt 0.214229 0.788600 +vt 0.244699 0.791886 +vt 0.178726 0.786994 +vt 0.086746 0.789944 +vt 0.130409 0.790941 +vt 0.205561 0.735516 +vt 0.221760 0.724915 +vt 0.204849 0.696776 +vt 0.129598 0.759655 +vt 0.060537 0.789725 +vt 0.087881 0.759866 +vt 0.127955 0.733174 +vt 0.088448 0.732976 +vt 0.170967 0.735006 +vt 0.208163 0.762182 +vt 0.235689 0.746313 +vt 0.284657 0.773709 +vt 0.297658 0.746329 +vt 0.065231 0.735013 +vt 0.154720 0.674671 +vt 0.062979 0.760777 +vt 0.067918 0.682877 +vt 0.042420 0.765005 +vt 0.174118 0.758999 +vt 0.311413 0.767482 +vt 0.238522 0.768490 +vt 0.150709 0.887065 +vt 0.150738 0.973167 +vt 0.100969 0.844619 +vt 0.024732 0.696510 +vt 0.069135 0.867563 +vt 0.080942 0.861581 +vt 0.097735 0.876730 +vt 0.094461 0.925729 +vt 0.068275 0.915163 +vt 0.097773 0.867391 +vt 0.089989 0.845449 +vt 0.072895 0.867391 +vt 0.066996 0.897070 +vt 0.031541 0.906901 +vt 0.059522 0.872469 +vt 0.036590 0.897310 +vt 0.017570 0.867391 +vt 0.024876 0.852525 +vt 0.015378 0.894892 +vt 0.033062 0.885929 +vt 0.163724 0.867391 +vt 0.140174 0.867391 +vt 0.197547 0.888735 +vt 0.209453 0.911142 +vt 0.188233 0.925710 +vt 0.238829 0.969465 +vt 0.220904 0.963214 +vt 0.186652 0.725195 +vt 0.141369 0.728704 +vt 0.155494 0.697401 +vt 0.236761 0.908656 +vt 0.247978 0.954699 +vt 0.278956 0.730041 +vt 0.261664 0.704553 +vt 0.281370 0.694182 +vt 0.137903 0.688925 +vt 0.302387 0.795768 +vt 0.293761 0.770368 +vt 0.324028 0.761001 +vt 0.161234 0.660224 +vt 0.172559 0.693832 +vt 0.131035 0.693351 +vt 0.236093 0.689058 +vt 0.222748 0.713718 +vt 0.209183 0.689316 +vt 0.103054 0.695400 +vt 0.104580 0.666395 +vt 0.198372 0.651439 +vt 0.188095 0.655422 +vt 0.183861 0.642500 +vt 0.185720 0.699412 +vt 0.166264 0.665958 +vt 0.230107 0.673951 +vt 0.250683 0.665546 +vt 0.021984 0.792275 +vt 0.039989 0.784844 +vt 0.037329 0.811005 +vt 0.175536 0.663254 +vt 0.185333 0.662751 +vt 0.074947 0.699660 +vt 0.052592 0.705631 +vt 0.053647 0.679346 +vt 0.157392 0.656933 +vt 0.173746 0.645952 +vt 0.120368 0.700009 +vt 0.130599 0.734495 +vt 0.169473 0.654548 +vt 0.189531 0.671961 +vt 0.199559 0.697751 +vt 0.208146 0.653639 +vt 0.213174 0.640853 +vt 0.160631 0.740493 +vt 0.221978 0.734217 +vt 0.251157 0.724477 +vt 0.049195 0.730301 +vt 0.028769 0.739053 +vt 0.032260 0.717064 +vt 0.027329 0.763392 +vt 0.138864 0.748922 +vt 0.220298 0.800487 +vt 0.215523 0.768778 +vt 0.245822 0.770103 +vt 0.180757 0.802760 +vt 0.180055 0.769463 +vt 0.087635 0.778362 +vt 0.131328 0.776541 +vt 0.130256 0.805663 +vt 0.210774 0.716128 +vt 0.227797 0.704454 +vt 0.212934 0.677341 +vt 0.132837 0.745232 +vt 0.061380 0.779836 +vt 0.085302 0.808247 +vt 0.091004 0.748140 +vt 0.133155 0.718794 +vt 0.093568 0.721148 +vt 0.176135 0.717851 +vt 0.211403 0.742689 +vt 0.240172 0.725004 +vt 0.287225 0.749301 +vt 0.302288 0.721016 +vt 0.070144 0.724691 +vt 0.164325 0.658421 +vt 0.065975 0.750661 +vt 0.059041 0.809757 +vt 0.076706 0.672256 +vt 0.045053 0.756227 +vt 0.177513 0.741698 +vt 0.314507 0.741330 +vt 0.241367 0.747050 +vt 0.193818 0.733777 +vt 0.189956 0.654232 +vt 0.226479 0.890162 +vt 0.251262 0.798707 +vt 0.032405 0.688712 +vt 0.259230 0.757676 +vt 0.243362 0.739710 +vt 0.244172 0.694100 +vt 0.269818 0.701783 +vt 0.237458 0.889332 +vt 0.272464 0.719291 +vt 0.306763 0.706262 +vt 0.302729 0.716252 +vt 0.302572 0.882256 +vt 0.163724 0.897621 +vt 0.129901 0.888735 +vt 0.155882 0.901486 +vt 0.139215 0.925710 +vt 0.106543 0.963214 +vt 0.088618 0.969464 +vt 0.117994 0.911142 +vt 0.094105 0.778402 +vt 0.071929 0.764480 +vt 0.085793 0.736939 +vt 0.079469 0.954699 +vt 0.279717 0.899865 +vt 0.260159 0.891750 +vt 0.277877 0.864250 +vt 0.120112 0.740836 +vt 0.087605 0.717238 +vt 0.323489 0.828077 +vt 0.293345 0.822182 +vt 0.158923 0.947672 +vt 0.123712 0.948694 +vt 0.129229 0.917988 +vt 0.050817 0.780010 +vt 0.065425 0.804726 +vt 0.036477 0.803882 +vt 0.102316 0.948012 +vt 0.101255 0.919156 +vt 0.181286 0.962810 +vt 0.185731 0.949389 +vt 0.195954 0.952193 +vt 0.045444 0.736669 +vt 0.052662 0.729933 +vt 0.248540 0.932057 +vt 0.228080 0.926011 +vt 0.039571 0.836884 +vt 0.021668 0.831517 +vt 0.039880 0.745034 +vt 0.051544 0.940908 +vt 0.050911 0.914720 +vt 0.073191 0.918125 +vt 0.031153 0.726038 +vt 0.049383 0.717432 +vt 0.106295 0.707964 +vt 0.113729 0.704678 +vt 0.167078 0.952406 +vt 0.161988 0.949121 +vt 0.197887 0.905703 +vt 0.210600 0.961087 +vt 0.205772 0.948867 +vt 0.120620 0.763618 +vt 0.084389 0.814120 +vt 0.078883 0.838360 +vt 0.060476 0.836406 +vt 0.047908 0.890418 +vt 0.030744 0.905615 +vt 0.026554 0.859812 +vt 0.245357 0.827962 +vt 0.215009 0.832774 +vt 0.130861 0.834688 +vt 0.087156 0.837891 +vt 0.226260 0.895746 +vt 0.209408 0.886019 +vt 0.187436 0.932669 +vt 0.131868 0.865852 +vt 0.179518 0.836168 +vt 0.060901 0.839435 +vt 0.090043 0.867754 +vt 0.092175 0.894476 +vt 0.131760 0.892278 +vt 0.170799 0.912731 +vt 0.238977 0.873753 +vt 0.210465 0.859360 +vt 0.301085 0.870600 +vt 0.286463 0.844021 +vt 0.068786 0.893624 +vt 0.174764 0.888278 +vt 0.176527 0.864251 +vt 0.065031 0.868109 +vt 0.074510 0.945353 +vt 0.044179 0.864944 +vt 0.313642 0.848861 +vt 0.240527 0.851549 +vt 0.027604 0.884008 +vt 0.097873 0.788843 +vt 0.029941 0.744644 +vt 0.100969 0.890162 +vt 0.210946 0.924593 +vt 0.195656 0.965464 +vt 0.030433 0.933977 +vt 0.036814 0.813780 +vt 0.044078 0.852024 +vt 0.030330 0.840518 +vt 0.089989 0.889332 +vt 0.062008 0.893763 +vt 0.025981 0.876374 +vt 0.015296 0.874779 +vt 0.024876 0.882256 +vt 0.236761 0.826125 +vt 0.332951 0.821474 +vt 0.317536 0.831563 +vt 0.020935 0.819289 +vt 0.155882 0.833295 +vt 0.116668 0.677037 +vt 0.119163 0.944480 +vt 0.187262 0.656586 +vt 0.062008 0.841019 +vt 0.171566 0.901486 +vt 0.332090 0.794060 +vt 0.126006 0.663252 +vt 0.220230 0.678637 +vt 0.198287 0.638191 +vt 0.019489 0.812030 +vt 0.265440 0.893763 +vt 0.090686 0.908656 +vt 0.035529 0.784217 +vt 0.201678 0.776313 +vt 0.201997 0.748197 +vt 0.210664 0.749216 +vt 0.193309 0.749019 +vt 0.211043 0.776395 +vt 0.220151 0.751735 +vt 0.183767 0.751323 +vt 0.192314 0.776183 +vt 0.170465 0.935233 +vt 0.171099 0.908138 +vt 0.185746 0.908551 +vt 0.173330 0.881717 +vt 0.175988 0.855272 +vt 0.188356 0.856185 +vt 0.178408 0.828810 +vt 0.180732 0.802312 +vt 0.191042 0.802969 +vt 0.214560 0.908887 +vt 0.229212 0.908818 +vt 0.229212 0.935919 +vt 0.213178 0.856477 +vt 0.225561 0.855854 +vt 0.227599 0.882352 +vt 0.211708 0.803204 +vt 0.222032 0.802781 +vt 0.223757 0.829333 +vt 0.186876 0.933547 +vt 0.200153 0.908672 +vt 0.186910 0.882647 +vt 0.200764 0.856574 +vt 0.189720 0.829602 +vt 0.201373 0.803259 +vt 0.212845 0.933850 +vt 0.214002 0.882964 +vt 0.212418 0.829865 +vt 0.191163 0.745575 +vt 0.202028 0.745390 +vt 0.212887 0.745820 +vt 0.222780 0.747749 +vt 0.181229 0.747279 +vt 0.214438 0.713771 +vt 0.209608 0.698673 +vt 0.218269 0.695029 +vt 0.195508 0.698514 +vt 0.202547 0.699511 +vt 0.202382 0.714108 +vt 0.186931 0.694674 +vt 0.190337 0.713499 +vt 0.202214 0.729014 +vt 0.177918 0.711287 +vt 0.189178 0.728769 +vt 0.215252 0.729064 +vt 0.226904 0.711842 +vt 0.227975 0.729651 +vt 0.176445 0.729068 +vt 0.202614 0.693627 +vt 0.207891 0.693445 +vt 0.215953 0.689800 +vt 0.197342 0.693326 +vt 0.189365 0.689499 +vt 0.209242 0.682898 +vt 0.212629 0.684673 +vt 0.196231 0.682751 +vt 0.202750 0.681560 +vt 0.192804 0.684449 +vt 0.199456 0.968320 +vt 0.199869 0.933012 +vt 0.224723 0.963363 +vt 0.174312 0.962774 +vt 0.200454 0.883025 +vt 0.201066 0.829954 +vt 0.182761 0.775829 +vt 0.220603 0.776258 +vt 0.067832 0.776312 +vt 0.058468 0.776175 +vt 0.059483 0.749012 +vt 0.068171 0.748196 +vt 0.076838 0.749221 +vt 0.048914 0.775814 +vt 0.049939 0.751309 +vt 0.077197 0.776401 +vt 0.086323 0.751748 +vt 0.095322 0.935918 +vt 0.078955 0.933849 +vt 0.080669 0.908886 +vt 0.093709 0.882350 +vt 0.080111 0.882962 +vt 0.079284 0.856474 +vt 0.089869 0.829339 +vt 0.078542 0.829866 +vt 0.077843 0.803209 +vt 0.036575 0.935231 +vt 0.037209 0.908137 +vt 0.051856 0.908549 +vt 0.039440 0.881716 +vt 0.042097 0.855273 +vt 0.054462 0.856185 +vt 0.044521 0.828802 +vt 0.046865 0.802297 +vt 0.057177 0.802961 +vt 0.065978 0.933011 +vt 0.066263 0.908670 +vt 0.066562 0.883024 +vt 0.066871 0.856573 +vt 0.067191 0.829953 +vt 0.067508 0.803258 +vt 0.052986 0.933545 +vt 0.053019 0.882646 +vt 0.055843 0.829598 +vt 0.068205 0.745389 +vt 0.057340 0.745566 +vt 0.047404 0.747263 +vt 0.079063 0.745828 +vt 0.056538 0.713489 +vt 0.044121 0.711269 +vt 0.053147 0.694662 +vt 0.068583 0.714108 +vt 0.068759 0.699511 +vt 0.075820 0.698678 +vt 0.080639 0.713780 +vt 0.084484 0.695040 +vt 0.061720 0.698508 +vt 0.068403 0.729013 +vt 0.055367 0.728759 +vt 0.081441 0.729074 +vt 0.093106 0.711860 +vt 0.042634 0.729048 +vt 0.088955 0.747764 +vt 0.063558 0.693322 +vt 0.055584 0.689489 +vt 0.068830 0.693627 +vt 0.074108 0.693449 +vt 0.082172 0.689810 +vt 0.059027 0.684441 +vt 0.068976 0.681560 +vt 0.075466 0.682903 +vt 0.078852 0.684680 +vt 0.062455 0.682746 +vt 0.065566 0.968319 +vt 0.046484 0.963810 +vt 0.040422 0.962772 +vt 0.090832 0.963362 +vt 0.084748 0.964257 +vt 0.095322 0.908816 +vt 0.086756 0.776271 +vt 0.082706 0.776064 +vt 0.073373 0.775847 +vt 0.074617 0.748779 +vt 0.083285 0.748040 +vt 0.091915 0.749136 +vt 0.063852 0.775406 +vt 0.065084 0.750986 +vt 0.092041 0.776232 +vt 0.101349 0.751736 +vt 0.109353 0.935439 +vt 0.092822 0.933861 +vt 0.094454 0.908472 +vt 0.107630 0.881987 +vt 0.094057 0.882517 +vt 0.093441 0.856078 +vt 0.104221 0.829112 +vt 0.092924 0.829542 +vt 0.092455 0.802962 +vt 0.049582 0.934229 +vt 0.050901 0.907203 +vt 0.065560 0.907887 +vt 0.053467 0.880891 +vt 0.056369 0.854556 +vt 0.068690 0.855579 +vt 0.059017 0.828188 +vt 0.061583 0.801787 +vt 0.071856 0.802538 +vt 0.079507 0.932881 +vt 0.080007 0.908184 +vt 0.080527 0.882479 +vt 0.081061 0.856074 +vt 0.081607 0.829532 +vt 0.082152 0.802923 +vt 0.066164 0.933321 +vt 0.067007 0.881970 +vt 0.070298 0.829081 +vt 0.083343 0.745242 +vt 0.072511 0.745325 +vt 0.062592 0.746931 +vt 0.094163 0.745772 +vt 0.071986 0.713344 +vt 0.059629 0.711024 +vt 0.068769 0.694551 +vt 0.083987 0.714064 +vt 0.084288 0.699514 +vt 0.091338 0.698747 +vt 0.096008 0.713841 +vt 0.099999 0.695197 +vt 0.077276 0.698457 +vt 0.083680 0.728920 +vt 0.070688 0.728555 +vt 0.096677 0.729092 +vt 0.108451 0.712033 +vt 0.057993 0.728733 +vt 0.104007 0.747787 +vt 0.079144 0.693299 +vt 0.071243 0.689421 +vt 0.084409 0.693648 +vt 0.089685 0.693517 +vt 0.097739 0.689969 +vt 0.074955 0.684644 +vt 0.084659 0.681560 +vt 0.091150 0.682962 +vt 0.094227 0.685043 +vt 0.078116 0.682692 +vt 0.078784 0.968608 +vt 0.059808 0.964108 +vt 0.054343 0.961605 +vt 0.103488 0.962600 +vt 0.097926 0.964880 +vt 0.109129 0.908382 +vt 0.101571 0.776185 +vt 0.068117 0.788798 +vt 0.068685 0.760774 +vt 0.077315 0.761867 +vt 0.060017 0.761516 +vt 0.077452 0.788963 +vt 0.086751 0.764462 +vt 0.050485 0.763728 +vt 0.058784 0.788585 +vt 0.034975 0.946950 +vt 0.036305 0.919924 +vt 0.050964 0.920615 +vt 0.038882 0.893613 +vt 0.041796 0.867277 +vt 0.054119 0.868306 +vt 0.044451 0.840922 +vt 0.047005 0.814529 +vt 0.057277 0.815275 +vt 0.079858 0.921212 +vt 0.094533 0.921128 +vt 0.094746 0.948186 +vt 0.078871 0.868819 +vt 0.091223 0.868302 +vt 0.093045 0.894733 +vt 0.077876 0.815693 +vt 0.088172 0.815363 +vt 0.089655 0.841848 +vt 0.051557 0.946049 +vt 0.065411 0.920918 +vt 0.052423 0.894698 +vt 0.066490 0.868809 +vt 0.055721 0.841814 +vt 0.067573 0.815657 +vt 0.078215 0.946600 +vt 0.079472 0.895258 +vt 0.078347 0.842278 +vt 0.057909 0.758063 +vt 0.068742 0.757976 +vt 0.079562 0.758502 +vt 0.089406 0.760512 +vt 0.047991 0.759674 +vt 0.081394 0.726569 +vt 0.076716 0.711478 +vt 0.085376 0.707924 +vt 0.062655 0.711193 +vt 0.069667 0.712248 +vt 0.069373 0.726797 +vt 0.054146 0.707291 +vt 0.057371 0.726083 +vt 0.069072 0.741654 +vt 0.045013 0.723768 +vt 0.056080 0.741294 +vt 0.082068 0.741820 +vt 0.093835 0.724756 +vt 0.094745 0.742518 +vt 0.043385 0.741478 +vt 0.069786 0.706381 +vt 0.075062 0.706248 +vt 0.083114 0.702696 +vt 0.064520 0.706035 +vt 0.056618 0.702160 +vt 0.076523 0.695692 +vt 0.079600 0.697772 +vt 0.063488 0.695428 +vt 0.070031 0.694293 +vt 0.060328 0.697382 +vt 0.064162 0.981341 +vt 0.064901 0.945614 +vt 0.088869 0.975344 +vt 0.039724 0.974328 +vt 0.065943 0.895214 +vt 0.067029 0.842266 +vt 0.049264 0.788147 +vt 0.086982 0.788911 +vt 0.218638 0.964258 +vt 0.180374 0.963811 +vt 0.091670 0.855850 +vt 0.088166 0.802794 +vt 0.094164 0.729670 +vt 0.105797 0.855554 +vt 0.102749 0.802636 +vt 0.109353 0.729795 +vt 0.083306 0.977621 +vt 0.045189 0.976834 +vn 0.049000 -0.848100 0.527500 +vn -0.058500 -0.810400 0.583000 +vn 0.566800 -0.823600 -0.020500 +vn -0.528500 -0.848800 -0.014900 +vn 0.354100 -0.931200 0.086200 +vn -0.329400 0.354000 -0.875300 +vn 0.253100 -0.286000 -0.924200 +vn 0.541900 -0.002200 -0.840400 +vn -0.706200 -0.279500 0.650400 +vn -0.900600 -0.211700 0.379500 +vn -0.577300 0.604900 -0.548400 +vn -0.656300 0.458500 -0.599200 +vn -0.773000 0.634400 0.000000 +vn 0.000000 0.742000 -0.670300 +vn -0.298100 0.694200 -0.655100 +vn -0.441800 0.897100 0.000000 +vn -0.966800 0.255500 0.000000 +vn -0.929800 0.235800 -0.282400 +vn -0.952700 0.119100 -0.279500 +vn -0.520700 -0.853400 -0.023300 +vn -0.640600 -0.170200 -0.748800 +vn -0.875400 0.483200 0.011400 +vn -0.986300 0.164800 0.000000 +vn -0.949100 -0.049400 -0.311100 +vn -0.561000 -0.561200 -0.608500 +vn 0.198400 -0.856000 -0.477300 +vn 0.074900 -0.997200 0.000000 +vn -0.288900 0.692700 -0.660800 +vn 0.540300 -0.408900 -0.735400 +vn -0.759800 0.298700 -0.577500 +vn -0.902900 0.429800 0.000000 +vn -0.159700 -0.232700 -0.959300 +vn -0.219700 -0.420300 -0.880400 +vn 0.000000 -0.398000 -0.917400 +vn -0.314200 -0.044200 -0.948300 +vn -0.886500 0.369400 -0.278500 +vn -0.902000 -0.255100 -0.348200 +vn -0.824400 -0.416600 -0.382900 +vn -0.938200 -0.346000 0.000000 +vn 0.000000 -0.568400 -0.822700 +vn 0.000000 -0.999600 0.026300 +vn 0.021100 -0.641300 -0.767000 +vn -0.681400 0.155600 -0.715200 +vn -0.731200 -0.682100 0.000000 +vn -0.829000 0.009900 -0.559200 +vn -0.999700 0.025800 0.000000 +vn -0.494000 -0.353000 -0.794500 +vn -0.432500 0.057600 -0.899800 +vn -0.596100 -0.468900 -0.651700 +vn -0.759700 -0.090900 -0.643800 +vn -0.432600 -0.246200 -0.867300 +vn 0.000000 -0.287900 -0.957600 +vn 0.000000 0.315500 -0.948900 +vn -0.172100 0.305000 -0.936600 +vn -0.178000 0.427300 -0.886400 +vn 0.000000 0.241100 -0.970500 +vn -0.158000 0.245200 -0.956500 +vn -0.175200 -0.192300 -0.965500 +vn -0.137100 0.052300 -0.989200 +vn 0.000000 0.050200 -0.998700 +vn -0.616700 0.298400 -0.728400 +vn -0.548200 0.262500 -0.794000 +vn 0.511100 -0.859500 0.000000 +vn -0.598200 0.092700 -0.796000 +vn -0.411500 0.059100 -0.909500 +vn -0.207800 -0.397400 -0.893800 +vn 0.000000 -0.168900 -0.985600 +vn -0.420600 -0.197400 -0.885500 +vn -0.711800 0.088400 -0.696800 +vn -0.722600 -0.170000 -0.670000 +vn -0.689400 0.284700 -0.666100 +vn -0.494700 0.308500 -0.812500 +vn -0.602800 0.318900 -0.731300 +vn -0.465500 0.671800 -0.576200 +vn -0.626200 0.779600 0.000000 +vn -0.667700 -0.383600 -0.638000 +vn -0.412900 -0.411500 -0.812500 +vn 0.000000 -0.366200 -0.930500 +vn -0.991900 -0.126700 0.000000 +vn -0.391100 -0.471900 -0.790100 +vn -0.440300 0.269900 -0.856300 +vn -0.553700 0.832700 0.000000 +vn -0.449600 0.394100 -0.801600 +vn 0.000000 0.432600 -0.901600 +vn -0.999700 -0.023600 0.000000 +vn -0.807600 0.589700 0.000000 +vn 0.104600 -0.758500 -0.643100 +vn 0.020400 -0.474900 -0.879800 +vn 0.182800 -0.983100 0.000000 +vn 0.283700 -0.958900 0.000000 +vn -0.420900 0.280300 -0.862700 +vn -0.292400 -0.637600 -0.712700 +vn -0.732800 0.680400 0.000000 +vn -0.611000 0.064800 -0.788900 +vn -0.556800 -0.830600 0.000000 +vn -0.956500 0.291600 0.000000 +vn 0.000000 -1.000000 0.000000 +vn 0.235300 -0.971900 0.000000 +vn -0.049000 -0.848100 0.527500 +vn -0.479000 -0.876200 0.053100 +vn -0.566800 -0.823600 -0.020500 +vn -0.354100 -0.931200 0.086300 +vn 0.528500 -0.848800 -0.014900 +vn 0.058500 -0.810400 0.583000 +vn 0.329400 0.354000 -0.875300 +vn 0.288900 0.692700 -0.660800 +vn -0.541900 -0.002200 -0.840400 +vn 0.900600 -0.211700 0.379500 +vn 0.773000 0.634400 0.000000 +vn 0.656300 0.458500 -0.599200 +vn 0.577300 0.604900 -0.548400 +vn -0.253100 -0.286000 -0.924200 +vn 0.441800 0.897100 0.000000 +vn 0.298100 0.694200 -0.655100 +vn 0.966800 0.255500 0.000000 +vn 0.986300 0.164800 0.000000 +vn 0.952700 0.119100 -0.279500 +vn 0.875400 0.483200 0.011400 +vn 0.640600 -0.170200 -0.748800 +vn 0.520700 -0.853400 -0.023300 +vn 0.998000 0.062600 0.000000 +vn 0.949100 -0.049400 -0.311100 +vn -0.074900 -0.997200 0.000000 +vn -0.198400 -0.856000 -0.477300 +vn 0.561000 -0.561200 -0.608500 +vn 0.314200 -0.044200 -0.948300 +vn -0.540300 -0.408900 -0.735400 +vn 0.902900 0.429800 0.000000 +vn 0.759800 0.298700 -0.577500 +vn 0.219700 -0.420300 -0.880400 +vn 0.159700 -0.232700 -0.959300 +vn 0.886500 0.369400 -0.278500 +vn 0.938200 -0.346000 0.000000 +vn 0.824400 -0.416600 -0.382900 +vn 0.902000 -0.255100 -0.348200 +vn 0.731200 -0.682100 0.000000 +vn 0.681400 0.155600 -0.715200 +vn -0.021100 -0.641300 -0.767000 +vn 0.999700 0.025800 0.000000 +vn 0.829000 0.009900 -0.559200 +vn 0.494000 -0.353000 -0.794500 +vn 0.759700 -0.090900 -0.643800 +vn 0.432500 0.057600 -0.899800 +vn 0.596100 -0.468900 -0.651700 +vn 0.432600 -0.246200 -0.867300 +vn 0.178000 0.427300 -0.886400 +vn 0.172100 0.305000 -0.936600 +vn 0.137100 0.052300 -0.989200 +vn 0.175200 -0.192300 -0.965500 +vn 0.548200 0.262500 -0.794000 +vn 0.616700 0.298400 -0.728400 +vn -0.511100 -0.859500 0.000000 +vn 0.411500 0.059100 -0.909500 +vn 0.158000 0.245200 -0.956500 +vn 0.207800 -0.397400 -0.893800 +vn 0.420600 -0.197400 -0.885500 +vn 0.722600 -0.170000 -0.670000 +vn 0.711800 0.088400 -0.696800 +vn 0.929800 0.235800 -0.282400 +vn 0.602800 0.318900 -0.731300 +vn 0.494700 0.308500 -0.812500 +vn 0.626200 0.779600 0.000000 +vn 0.465500 0.671800 -0.576200 +vn 0.667700 -0.383600 -0.638000 +vn 0.689400 0.284700 -0.666100 +vn 0.440300 0.269900 -0.856300 +vn 0.412900 -0.411500 -0.812500 +vn 0.991900 -0.126700 0.000000 +vn 0.391100 -0.471900 -0.790100 +vn 0.553700 0.832700 0.000000 +vn 0.449600 0.394100 -0.801600 +vn 0.598200 0.092700 -0.796000 +vn 0.754000 -0.656800 0.000000 +vn 0.999700 -0.023600 0.000000 +vn 0.807600 0.589700 0.000000 +vn -0.104600 -0.758500 -0.643100 +vn 0.420900 0.280300 -0.862700 +vn -0.020400 -0.474900 -0.879800 +vn -0.182800 -0.983100 0.000000 +vn -0.283700 -0.958900 0.000000 +vn 0.732800 0.680400 0.000000 +vn 0.611000 0.064800 -0.788900 +vn 0.292400 -0.637600 -0.712700 +vn 0.956500 0.291600 0.000000 +vn 0.556800 -0.830600 0.000000 +vn -0.235300 -0.971900 0.000000 +vn 0.049000 -0.848100 -0.527500 +vn 0.479000 -0.876200 -0.053100 +vn 0.566800 -0.823600 0.020500 +vn 0.354100 -0.931200 -0.086300 +vn -0.528500 -0.848800 0.014900 +vn -0.058500 -0.810400 -0.583000 +vn -0.329400 0.354000 0.875300 +vn -0.288900 0.692700 0.660800 +vn 0.541900 -0.002200 0.840400 +vn -0.900600 -0.211700 -0.379500 +vn -0.656300 0.458500 0.599200 +vn -0.577300 0.604900 0.548400 +vn 0.253100 -0.286000 0.924200 +vn -0.298100 0.694200 0.655100 +vn 0.000000 0.742000 0.670300 +vn -0.952700 0.119100 0.279500 +vn -0.875400 0.483200 -0.011400 +vn -0.640600 -0.170200 0.748800 +vn -0.520700 -0.853400 0.023300 +vn -0.998000 0.062600 0.000000 +vn -0.949100 -0.049400 0.311100 +vn 0.198400 -0.856000 0.477300 +vn -0.561000 -0.561200 0.608500 +vn -0.314200 -0.044200 0.948300 +vn 0.540300 -0.408900 0.735400 +vn -0.759800 0.298700 0.577500 +vn 0.000000 -0.398000 0.917400 +vn -0.219700 -0.420300 0.880400 +vn -0.159700 -0.232700 0.959300 +vn -0.886500 0.369400 0.278500 +vn -0.824400 -0.416600 0.382900 +vn -0.902000 -0.255100 0.348200 +vn 0.000000 -0.999600 -0.026300 +vn 0.000000 -0.568400 0.822700 +vn -0.681400 0.155600 0.715200 +vn 0.021100 -0.641300 0.767000 +vn -0.829000 0.009900 0.559200 +vn -0.494000 -0.353000 0.794500 +vn -0.759700 -0.090900 0.643800 +vn -0.432500 0.057600 0.899800 +vn -0.596100 -0.468900 0.651700 +vn -0.432600 -0.246200 0.867300 +vn 0.000000 -0.287900 0.957600 +vn -0.178000 0.427300 0.886400 +vn -0.172100 0.305000 0.936600 +vn 0.000000 0.315500 0.948900 +vn 0.000000 0.241100 0.970500 +vn 0.000000 0.050200 0.998700 +vn -0.137100 0.052300 0.989200 +vn -0.175200 -0.192300 0.965500 +vn -0.548200 0.262500 0.794000 +vn -0.616700 0.298400 0.728400 +vn -0.411500 0.059100 0.909500 +vn -0.158000 0.245200 0.956500 +vn 0.000000 -0.168900 0.985600 +vn -0.207800 -0.397400 0.893800 +vn -0.420600 -0.197400 0.885500 +vn -0.722600 -0.170000 0.670000 +vn -0.711800 0.088400 0.696800 +vn -0.929800 0.235800 0.282400 +vn -0.602800 0.318900 0.731300 +vn -0.494700 0.308500 0.812500 +vn -0.465500 0.671800 0.576200 +vn -0.667700 -0.383600 0.638000 +vn -0.689400 0.284700 0.666100 +vn -0.440300 0.269900 0.856300 +vn -0.412900 -0.411500 0.812500 +vn 0.000000 -0.366200 0.930500 +vn -0.391100 -0.471900 0.790100 +vn -0.449600 0.394100 0.801600 +vn -0.598200 0.092700 0.796000 +vn 0.000000 0.432600 0.901600 +vn -0.754000 -0.656800 0.000000 +vn 0.104600 -0.758500 0.643100 +vn -0.420900 0.280300 0.862700 +vn 0.020400 -0.474900 0.879800 +vn -0.611000 0.064800 0.788900 +vn -0.292400 -0.637600 0.712700 +vn -0.049000 -0.848100 -0.527500 +vn 0.058500 -0.810400 -0.583000 +vn -0.566800 -0.823600 0.020500 +vn 0.528500 -0.848800 0.014900 +vn -0.354100 -0.931200 -0.086200 +vn 0.329400 0.354000 0.875300 +vn -0.253100 -0.286000 0.924200 +vn -0.541900 -0.002200 0.840400 +vn 0.706200 -0.279500 -0.650400 +vn 0.900600 -0.211700 -0.379500 +vn 0.577300 0.604900 0.548400 +vn 0.656300 0.458500 0.599200 +vn 0.298100 0.694200 0.655100 +vn 0.929800 0.235800 0.282400 +vn 0.952700 0.119100 0.279500 +vn 0.520700 -0.853400 0.023300 +vn 0.640600 -0.170200 0.748800 +vn 0.875400 0.483200 -0.011400 +vn 0.949100 -0.049400 0.311100 +vn 0.561000 -0.561200 0.608500 +vn -0.198400 -0.856000 0.477300 +vn 0.288900 0.692700 0.660800 +vn -0.540300 -0.408900 0.735400 +vn 0.759800 0.298700 0.577500 +vn 0.159700 -0.232700 0.959300 +vn 0.219700 -0.420300 0.880400 +vn 0.314200 -0.044200 0.948300 +vn 0.886500 0.369400 0.278500 +vn 0.902000 -0.255100 0.348200 +vn 0.824400 -0.416600 0.382900 +vn -0.021100 -0.641300 0.767000 +vn 0.681400 0.155600 0.715200 +vn 0.829000 0.009900 0.559200 +vn 0.494000 -0.353000 0.794500 +vn 0.432500 0.057600 0.899800 +vn 0.596100 -0.468900 0.651700 +vn 0.759700 -0.090900 0.643800 +vn 0.432600 -0.246200 0.867300 +vn 0.172100 0.305000 0.936600 +vn 0.178000 0.427300 0.886400 +vn 0.158000 0.245200 0.956500 +vn 0.175200 -0.192300 0.965500 +vn 0.137100 0.052300 0.989200 +vn 0.616700 0.298400 0.728400 +vn 0.548200 0.262500 0.794000 +vn 0.598200 0.092700 0.796000 +vn 0.411500 0.059100 0.909500 +vn 0.207800 -0.397400 0.893800 +vn 0.420600 -0.197400 0.885500 +vn 0.711800 0.088400 0.696800 +vn 0.722600 -0.170000 0.670000 +vn 0.689400 0.284700 0.666100 +vn 0.494700 0.308500 0.812500 +vn 0.602800 0.318900 0.731300 +vn 0.465500 0.671800 0.576200 +vn 0.667700 -0.383600 0.638000 +vn 0.412900 -0.411500 0.812500 +vn 0.391100 -0.471900 0.790100 +vn 0.440300 0.269900 0.856300 +vn 0.449600 0.394100 0.801600 +vn -0.104600 -0.758500 0.643100 +vn -0.020400 -0.474900 0.879800 +vn 0.420900 0.280300 0.862700 +vn 0.292400 -0.637600 0.712700 +vn 0.611000 0.064800 0.788900 +vn 0.479000 -0.876200 0.053100 +vn 0.000000 1.000000 0.000000 +vn 0.706200 -0.279500 0.650400 +vn -0.706200 -0.279500 -0.650400 +vn -0.479000 -0.876200 -0.053100 +vn 0.706300 -0.046300 -0.706300 +vn 0.605200 0.161400 -0.779500 +vn 0.000000 -0.025900 -0.999600 +vn 0.000000 -0.046300 -0.998900 +vn -0.605200 0.161400 -0.779500 +vn 0.998900 -0.046300 0.000000 +vn 0.912700 0.408600 0.000000 +vn -0.706300 -0.046300 -0.706300 +vn -0.912700 0.408600 0.000000 +vn -0.663800 0.122000 -0.737900 +vn -0.705100 -0.075400 -0.705100 +vn -0.997100 -0.075400 0.000000 +vn -0.705600 -0.063900 -0.705600 +vn -0.705900 -0.057800 -0.705900 +vn -0.998300 -0.057800 0.000000 +vn -0.998700 -0.051400 0.000000 +vn -0.706200 -0.051400 -0.706200 +vn -0.706300 -0.048900 -0.706300 +vn 0.663800 0.122000 -0.737900 +vn 0.999900 0.008100 0.000000 +vn 0.997100 -0.075400 0.000000 +vn 0.705600 -0.063900 -0.705600 +vn 0.997900 -0.063900 0.000000 +vn 0.998300 -0.057800 0.000000 +vn 0.706200 -0.051400 -0.706200 +vn 0.998700 -0.051400 0.000000 +vn 0.998800 -0.048900 0.000000 +vn 0.000000 0.197800 -0.980200 +vn 0.000000 -0.075400 -0.997100 +vn 0.000000 -0.063900 -0.997900 +vn 0.000000 -0.057800 -0.998300 +vn 0.000000 -0.051400 -0.998700 +vn 0.000000 -0.048900 -0.998800 +vn 0.705100 -0.075400 -0.705100 +vn 0.705900 -0.057800 -0.705900 +vn 0.706300 -0.048900 -0.706300 +vn 0.000000 0.138200 -0.990400 +vn 0.498800 0.404300 -0.766600 +vn 0.836800 0.547400 0.000000 +vn -0.498800 0.404300 -0.766600 +vn 0.510600 -0.179000 -0.840900 +vn 0.970100 -0.242700 0.000000 +vn 0.932700 -0.360700 0.000000 +vn 0.000000 -0.134100 -0.990900 +vn 0.000000 -0.175600 -0.984400 +vn -0.475500 -0.231100 -0.848800 +vn -0.510600 -0.179000 -0.840900 +vn -0.932700 -0.360700 0.000000 +vn 0.475500 -0.231100 -0.848800 +vn 0.000000 0.080300 -0.996800 +vn 0.515400 0.108100 -0.850100 +vn -0.515400 0.108100 -0.850100 +vn -0.970100 -0.242700 0.000000 +vn 0.988600 0.150200 0.000000 +vn -0.836800 0.547400 0.000000 +vn 0.468100 -0.239900 -0.850500 +vn 0.961600 -0.274300 0.000000 +vn 0.000000 -0.255600 -0.966800 +vn -0.468100 -0.239900 -0.850500 +vn -0.961600 -0.274300 0.000000 +vn 0.428800 -0.903400 0.000000 +vn -0.096400 -0.995300 0.000000 +vn -0.428800 -0.903400 0.000000 +vn 0.096400 -0.995300 0.000000 +vn 0.533500 0.845800 0.000000 +vn -0.151900 -0.988400 0.000000 +vn -0.533500 0.845800 0.000000 +vn -0.999900 0.008100 0.000000 +vn -0.998900 -0.046300 0.000000 +vn -0.998800 -0.048900 0.000000 +vn -0.988600 0.150200 0.000000 +vn -0.997900 -0.063900 0.000000 +vn 0.000000 -0.025900 0.999600 +vn 0.605200 0.161400 0.779500 +vn 0.706300 -0.046300 0.706300 +vn -0.605200 0.161400 0.779500 +vn 0.000000 -0.046300 0.998900 +vn -0.706300 -0.046300 0.706300 +vn -0.705100 -0.075400 0.705100 +vn -0.705900 -0.057800 0.705900 +vn -0.705600 -0.063900 0.705600 +vn -0.706300 -0.048900 0.706300 +vn 0.705100 -0.075400 0.705100 +vn 0.705600 -0.063900 0.705600 +vn 0.705900 -0.057800 0.705900 +vn 0.706300 -0.048900 0.706300 +vn 0.000000 -0.075400 0.997100 +vn 0.000000 0.197800 0.980200 +vn 0.000000 -0.057800 0.998300 +vn 0.000000 -0.063900 0.997900 +vn -0.706200 -0.051400 0.706200 +vn 0.000000 -0.048900 0.998800 +vn 0.663800 0.122000 0.737900 +vn 0.000000 -0.051400 0.998700 +vn -0.498800 0.404300 0.766600 +vn 0.000000 0.138200 0.990400 +vn 0.498800 0.404300 0.766600 +vn 0.510600 -0.179000 0.840900 +vn 0.475500 -0.231100 0.848800 +vn -0.475500 -0.231100 0.848800 +vn 0.000000 -0.175600 0.984400 +vn 0.000000 -0.134100 0.990900 +vn -0.510600 -0.179000 0.840900 +vn 0.000000 0.080300 0.996800 +vn -0.515400 0.108100 0.850100 +vn 0.515400 0.108100 0.850100 +vn 0.000000 -0.255600 0.966800 +vn 0.468100 -0.239900 0.850500 +vn -0.468100 -0.239900 0.850500 +vn -0.663800 0.122000 0.737900 +vn 0.706200 -0.051400 0.706200 +vn 0.151900 -0.988400 0.000000 +vn -0.395000 -0.918600 0.000000 +vn 0.395000 -0.918600 0.000000 +vn -0.079200 0.836800 -0.541800 +vn -0.477500 0.874200 -0.087800 +vn -0.577700 0.814900 0.045300 +vn -0.337900 0.941100 -0.013200 +vn 0.503600 0.863200 0.034800 +vn 0.076300 0.801000 -0.593700 +vn 0.291000 -0.366600 0.883700 +vn 0.261600 -0.673500 0.691400 +vn -0.555700 0.003200 0.831300 +vn 0.893700 0.285200 -0.346200 +vn 0.772500 -0.635000 0.000000 +vn 0.663000 -0.465900 0.586000 +vn 0.579800 -0.607800 0.542500 +vn -0.237300 0.279200 0.930400 +vn 0.438600 -0.898700 0.000000 +vn 0.297400 -0.700100 0.649100 +vn 0.000000 -0.752200 0.659000 +vn -0.025300 -0.999700 0.000000 +vn 0.980700 -0.195400 0.000000 +vn 0.947800 -0.129200 0.291500 +vn 0.874900 -0.478900 -0.072300 +vn 0.666300 0.097600 0.739200 +vn 0.398900 0.913200 -0.083100 +vn 0.999700 -0.025100 0.000000 +vn 0.943900 0.063500 0.323900 +vn -0.037800 0.999300 0.000000 +vn -0.120600 0.864700 0.487500 +vn 0.594500 0.538300 0.597300 +vn 0.348000 0.032400 0.936900 +vn -0.473800 0.378700 0.795000 +vn 0.905200 -0.425000 0.000000 +vn 0.767400 -0.304700 0.564000 +vn 0.000000 0.399800 0.916600 +vn 0.219700 0.422600 0.879200 +vn 0.165300 0.259800 0.951400 +vn 0.893600 -0.332500 0.301500 +vn 0.935500 0.353100 0.000000 +vn 0.823900 0.426100 0.373600 +vn 0.902200 0.254600 0.348100 +vn 0.000000 0.991400 -0.130600 +vn 0.000000 0.548400 0.836200 +vn 0.846200 0.532900 0.000000 +vn -0.202500 -0.979200 0.000000 +vn 0.654500 -0.191800 0.731300 +vn 1.000000 0.003400 0.000000 +vn 0.844600 -0.007000 0.535300 +vn 0.490100 0.365900 0.791100 +vn 0.761100 0.100400 0.640800 +vn 0.438600 -0.072900 0.895700 +vn 0.596700 0.472800 0.648300 +vn 0.437000 0.245700 0.865300 +vn 0.000000 0.294200 0.955700 +vn 0.179800 -0.429400 0.885000 +vn 0.174000 -0.305600 0.936100 +vn 0.000000 -0.316300 0.948600 +vn 0.000000 -0.240700 0.970600 +vn 0.000000 -0.049900 0.998700 +vn 0.138400 -0.051900 0.989000 +vn 0.176100 0.191700 0.965500 +vn 0.550200 -0.261900 0.792900 +vn 0.614500 -0.294900 0.731700 +vn -0.208300 0.582300 0.785800 +vn 0.413200 -0.058200 0.908700 +vn 0.160600 -0.244700 0.956200 +vn 0.000000 0.169100 0.985600 +vn 0.208200 0.396100 0.894300 +vn 0.422000 0.196500 0.885000 +vn 0.722600 0.169100 0.670200 +vn 0.712900 -0.087300 0.695800 +vn 0.927600 -0.262300 0.266000 +vn 0.601500 -0.321800 0.731200 +vn 0.492700 -0.308800 0.813500 +vn 0.626800 -0.779200 0.000000 +vn 0.466000 -0.676100 0.570700 +vn 0.669000 0.381900 0.637700 +vn 0.687600 -0.286500 0.667100 +vn 0.441100 -0.269100 0.856200 +vn 0.414100 0.409800 0.812700 +vn 0.000000 0.365400 0.930800 +vn 0.991600 0.128900 0.000000 +vn 0.392100 0.473400 0.788700 +vn 0.552800 -0.833300 0.000000 +vn 0.448400 -0.396600 0.801000 +vn 0.593200 -0.080000 0.801000 +vn 0.000000 -0.435800 0.900000 +vn 0.727800 0.685800 0.000000 +vn 0.999500 -0.031300 0.000000 +vn -0.166000 0.713400 0.680800 +vn 0.417300 -0.271800 0.867100 +vn -0.040700 0.486300 0.872800 +vn -0.175700 0.984400 0.000000 +vn -0.287100 0.957900 0.000000 +vn 0.731400 -0.681900 0.000000 +vn 0.640100 -0.055100 0.766300 +vn 0.294200 0.649700 0.700900 +vn 0.959500 -0.281700 0.000000 +vn 0.556500 0.830800 0.000000 +vn -0.257200 0.966300 0.000000 +vn 0.079200 0.836800 -0.541800 +vn -0.076300 0.801000 -0.593700 +vn 0.577700 0.814900 0.045300 +vn -0.503600 0.863200 0.034800 +vn 0.337900 0.941100 -0.013200 +vn -0.291000 -0.366600 0.883700 +vn 0.237300 0.279200 0.930400 +vn 0.555700 0.003200 0.831300 +vn -0.682100 0.222200 -0.696600 +vn -0.893700 0.285200 -0.346200 +vn -0.579800 -0.607800 0.542500 +vn -0.663000 -0.465900 0.586000 +vn -0.772500 -0.635000 0.000000 +vn -0.297400 -0.700100 0.649100 +vn -0.438600 -0.898700 0.000000 +vn 0.025300 -0.999700 0.000000 +vn -0.927600 -0.262300 0.266000 +vn -0.947800 -0.129200 0.291500 +vn -0.398900 0.913200 -0.083100 +vn -0.666300 0.097600 0.739200 +vn -0.874900 -0.478900 -0.072300 +vn -0.943900 0.063500 0.323900 +vn -0.999700 -0.025100 0.000000 +vn -0.594500 0.538300 0.597300 +vn 0.120600 0.864700 0.487500 +vn 0.037800 0.999300 0.000000 +vn -0.261600 -0.673500 0.691400 +vn 0.473800 0.378700 0.795000 +vn -0.767400 -0.304700 0.564000 +vn -0.905200 -0.425000 0.000000 +vn -0.165300 0.259800 0.951400 +vn -0.219700 0.422600 0.879200 +vn -0.348000 0.032400 0.936900 +vn -0.893600 -0.332500 0.301500 +vn -0.902200 0.254600 0.348100 +vn -0.823900 0.426100 0.373600 +vn -0.935500 0.353100 0.000000 +vn 0.477500 0.874200 -0.087800 +vn -0.846200 0.532900 0.000000 +vn 0.208300 0.582300 0.785800 +vn -0.654500 -0.191800 0.731300 +vn -0.844600 -0.007000 0.535300 +vn -1.000000 0.003400 0.000000 +vn -0.490100 0.365900 0.791100 +vn -0.438600 -0.072900 0.895700 +vn -0.596700 0.472800 0.648300 +vn -0.761100 0.100400 0.640800 +vn -0.437000 0.245700 0.865300 +vn -0.174000 -0.305600 0.936100 +vn -0.179800 -0.429400 0.885000 +vn -0.160600 -0.244700 0.956200 +vn -0.176100 0.191700 0.965500 +vn -0.138400 -0.051900 0.989000 +vn -0.614500 -0.294900 0.731700 +vn -0.550200 -0.261900 0.792900 +vn -0.593200 -0.080000 0.801000 +vn -0.413200 -0.058200 0.908700 +vn -0.208200 0.396100 0.894300 +vn -0.422000 0.196500 0.885000 +vn -0.712900 -0.087300 0.695800 +vn -0.722600 0.169100 0.670200 +vn -0.687600 -0.286500 0.667100 +vn -0.492700 -0.308800 0.813500 +vn -0.601500 -0.321800 0.731200 +vn -0.466000 -0.676100 0.570700 +vn -0.626800 -0.779200 0.000000 +vn -0.669000 0.381900 0.637700 +vn 0.202500 -0.979200 0.000000 +vn -0.414100 0.409800 0.812700 +vn -0.991600 0.128900 0.000000 +vn -0.392100 0.473400 0.788700 +vn -0.441100 -0.269100 0.856200 +vn -0.552800 -0.833300 0.000000 +vn -0.448400 -0.396600 0.801000 +vn -0.999500 -0.031300 0.000000 +vn 0.166000 0.713400 0.680800 +vn 0.040700 0.486300 0.872800 +vn 0.175700 0.984400 0.000000 +vn 0.287100 0.957900 0.000000 +vn -0.417300 -0.271800 0.867100 +vn -0.294200 0.649700 0.700900 +vn -0.731400 -0.681900 0.000000 +vn -0.640100 -0.055100 0.766300 +vn -0.556500 0.830800 0.000000 +vn -0.959500 -0.281700 0.000000 +vn 0.257200 0.966300 0.000000 +vn -0.079200 0.836800 0.541800 +vn 0.076300 0.801000 0.593700 +vn -0.577700 0.814900 -0.045300 +vn 0.503600 0.863200 -0.034800 +vn -0.337900 0.941100 0.013200 +vn 0.291000 -0.366600 -0.883700 +vn -0.237300 0.279200 -0.930400 +vn -0.555700 0.003200 -0.831300 +vn 0.682100 0.222200 0.696600 +vn 0.893700 0.285200 0.346200 +vn 0.579800 -0.607800 -0.542500 +vn 0.663000 -0.465900 -0.586000 +vn 0.000000 -0.752200 -0.659000 +vn 0.297400 -0.700100 -0.649100 +vn 0.927600 -0.262300 -0.266000 +vn 0.947800 -0.129200 -0.291500 +vn 0.398900 0.913200 0.083100 +vn 0.666300 0.097600 -0.739200 +vn 0.874900 -0.478900 0.072300 +vn 0.943900 0.063500 -0.323900 +vn 0.594500 0.538300 -0.597300 +vn -0.120600 0.864700 -0.487500 +vn 0.261600 -0.673500 -0.691400 +vn -0.473800 0.378700 -0.795000 +vn 0.767400 -0.304700 -0.564000 +vn 0.165300 0.259800 -0.951400 +vn 0.219700 0.422600 -0.879200 +vn 0.000000 0.399800 -0.916600 +vn 0.348000 0.032400 -0.936900 +vn 0.893600 -0.332500 -0.301500 +vn 0.902200 0.254600 -0.348100 +vn 0.823900 0.426100 -0.373600 +vn -0.477500 0.874200 0.087800 +vn 0.000000 0.548400 -0.836200 +vn -0.208300 0.582300 -0.785800 +vn 0.654500 -0.191800 -0.731300 +vn 0.844600 -0.007000 -0.535300 +vn 0.490100 0.365900 -0.791100 +vn 0.438600 -0.072900 -0.895700 +vn 0.596700 0.472800 -0.648300 +vn 0.761100 0.100400 -0.640800 +vn 0.437000 0.245700 -0.865300 +vn 0.000000 0.294200 -0.955700 +vn 0.000000 -0.316300 -0.948600 +vn 0.174000 -0.305600 -0.936100 +vn 0.179800 -0.429400 -0.885000 +vn 0.000000 -0.240700 -0.970600 +vn 0.160600 -0.244700 -0.956200 +vn 0.176100 0.191700 -0.965500 +vn 0.138400 -0.051900 -0.989000 +vn 0.000000 -0.049900 -0.998700 +vn 0.614500 -0.294900 -0.731700 +vn 0.550200 -0.261900 -0.792900 +vn 0.593200 -0.080000 -0.801000 +vn 0.413200 -0.058200 -0.908700 +vn 0.208200 0.396100 -0.894300 +vn 0.000000 0.169100 -0.985600 +vn 0.422000 0.196500 -0.885000 +vn 0.712900 -0.087300 -0.695800 +vn 0.722600 0.169100 -0.670200 +vn 0.687600 -0.286500 -0.667100 +vn 0.492700 -0.308800 -0.813500 +vn 0.601500 -0.321800 -0.731200 +vn 0.466000 -0.676100 -0.570700 +vn 0.669000 0.381900 -0.637700 +vn 0.414100 0.409800 -0.812700 +vn 0.000000 0.365400 -0.930800 +vn 0.392100 0.473400 -0.788700 +vn 0.441100 -0.269100 -0.856200 +vn 0.448400 -0.396600 -0.801000 +vn 0.000000 -0.435800 -0.900000 +vn -0.166000 0.713400 -0.680800 +vn -0.040700 0.486300 -0.872800 +vn 0.417300 -0.271800 -0.867100 +vn 0.294200 0.649700 -0.700900 +vn 0.640100 -0.055100 -0.766300 +vn 0.000000 0.991400 0.130600 +vn 0.079200 0.836800 0.541800 +vn 0.477500 0.874200 0.087800 +vn 0.577700 0.814900 -0.045300 +vn 0.337900 0.941100 0.013200 +vn -0.503600 0.863200 -0.034800 +vn -0.076300 0.801000 0.593700 +vn -0.291000 -0.366600 -0.883700 +vn -0.261600 -0.673500 -0.691400 +vn 0.555700 0.003200 -0.831300 +vn -0.893700 0.285200 0.346200 +vn -0.663000 -0.465900 -0.586000 +vn -0.579800 -0.607800 -0.542500 +vn 0.237300 0.279200 -0.930400 +vn -0.297400 -0.700100 -0.649100 +vn -0.980700 -0.195400 0.000000 +vn -0.947800 -0.129200 -0.291500 +vn -0.874900 -0.478900 0.072300 +vn -0.666300 0.097600 -0.739200 +vn -0.398900 0.913200 0.083100 +vn -0.943900 0.063500 -0.323900 +vn 0.120600 0.864700 -0.487500 +vn -0.594500 0.538300 -0.597300 +vn -0.348000 0.032400 -0.936900 +vn 0.473800 0.378700 -0.795000 +vn -0.767400 -0.304700 -0.564000 +vn -0.219700 0.422600 -0.879200 +vn -0.165300 0.259800 -0.951400 +vn -0.893600 -0.332500 -0.301500 +vn -0.823900 0.426100 -0.373600 +vn -0.902200 0.254600 -0.348100 +vn -0.654500 -0.191800 -0.731300 +vn -0.844600 -0.007000 -0.535300 +vn -0.490100 0.365900 -0.791100 +vn -0.761100 0.100400 -0.640800 +vn -0.438600 -0.072900 -0.895700 +vn -0.596700 0.472800 -0.648300 +vn -0.437000 0.245700 -0.865300 +vn -0.179800 -0.429400 -0.885000 +vn -0.174000 -0.305600 -0.936100 +vn -0.138400 -0.051900 -0.989000 +vn -0.176100 0.191700 -0.965500 +vn -0.550200 -0.261900 -0.792900 +vn -0.614500 -0.294900 -0.731700 +vn 0.208300 0.582300 -0.785800 +vn -0.413200 -0.058200 -0.908700 +vn -0.160600 -0.244700 -0.956200 +vn -0.208200 0.396100 -0.894300 +vn -0.422000 0.196500 -0.885000 +vn -0.722600 0.169100 -0.670200 +vn -0.712900 -0.087300 -0.695800 +vn -0.927600 -0.262300 -0.266000 +vn -0.601500 -0.321800 -0.731200 +vn -0.492700 -0.308800 -0.813500 +vn -0.466000 -0.676100 -0.570700 +vn -0.669000 0.381900 -0.637700 +vn -0.687600 -0.286500 -0.667100 +vn -0.441100 -0.269100 -0.856200 +vn -0.414100 0.409800 -0.812700 +vn -0.392100 0.473400 -0.788700 +vn -0.448400 -0.396600 -0.801000 +vn -0.593200 -0.080000 -0.801000 +vn -0.727800 0.685800 0.000000 +vn 0.166000 0.713400 -0.680800 +vn -0.417300 -0.271800 -0.867100 +vn 0.040700 0.486300 -0.872800 +vn -0.640100 -0.055100 -0.766300 +vn -0.294200 0.649700 -0.700900 +vn 0.682100 0.222200 -0.696600 +vn -0.682100 0.222200 0.696600 +vn 0.000000 0.045100 0.999000 +vn 0.000000 0.046900 0.998900 +vn -0.575700 -0.203400 0.791900 +vn 0.575700 -0.203400 0.791900 +vn -0.707700 0.050700 0.704700 +vn -0.886300 -0.463000 0.000000 +vn 0.886300 -0.463000 0.000000 +vn 0.707700 0.050700 0.704700 +vn 0.996900 0.078100 0.000000 +vn 0.997200 0.075000 0.000000 +vn 0.706400 0.075600 0.703700 +vn 0.997900 0.063900 0.000000 +vn 0.998300 0.057800 0.000000 +vn 0.705900 0.057800 0.705900 +vn 0.998700 0.051400 0.000000 +vn 0.998800 0.048800 0.000000 +vn 0.706300 0.048800 0.706200 +vn -0.706400 0.075600 0.703700 +vn -0.997200 0.075000 0.000000 +vn -0.996900 0.078100 0.000000 +vn -0.705900 0.057800 0.705900 +vn -0.998300 0.057800 0.000000 +vn -0.997900 0.063900 0.000000 +vn -0.706300 0.048800 0.706200 +vn -0.998800 0.048800 0.000000 +vn -0.998700 0.051400 0.000000 +vn 0.620900 -0.138000 0.771600 +vn 0.000000 0.077500 0.997000 +vn 0.705600 0.063900 0.705600 +vn 0.000000 0.057800 0.998300 +vn 0.706200 0.051400 0.706200 +vn 0.000000 0.048700 0.998800 +vn -0.620900 -0.138000 0.771600 +vn -0.705600 0.063900 0.705600 +vn -0.706200 0.051400 0.706200 +vn 0.553900 -0.408400 0.725500 +vn 0.000000 -0.112700 0.993600 +vn -0.553900 -0.408400 0.725500 +vn -0.807600 -0.589700 0.000000 +vn 0.807600 -0.589700 0.000000 +vn -0.560700 0.184100 0.807200 +vn -0.536900 0.243600 0.807700 +vn -0.943000 0.332700 0.000000 +vn 0.536900 0.243600 0.807700 +vn 0.000000 0.174800 0.984600 +vn 0.000000 0.132600 0.991100 +vn 0.943000 0.332700 0.000000 +vn 0.560700 0.184100 0.807200 +vn 0.000000 -0.080900 0.996700 +vn 0.969300 0.245700 0.000000 +vn 0.564300 -0.109600 0.818200 +vn -0.564300 -0.109600 0.818200 +vn -0.969300 0.245700 0.000000 +vn -0.988800 -0.149000 0.000000 +vn 0.988800 -0.149000 0.000000 +vn 0.000000 0.405300 0.914200 +vn -0.471400 0.372700 0.799300 +vn -0.959300 0.282400 0.000000 +vn 0.471400 0.372700 0.799300 +vn 0.959300 0.282400 0.000000 +vn -0.397000 0.917800 0.000000 +vn -0.774200 0.633000 0.000000 +vn 0.397000 0.917800 0.000000 +vn 0.774200 0.633000 0.000000 +vn 0.000000 -0.240900 0.970500 +vn -0.765600 -0.643300 0.000000 +vn 0.765600 -0.643300 0.000000 +vn 0.000000 0.063900 0.997900 +vn 0.000000 0.051400 0.998700 +vn 0.998400 0.055800 0.000000 +vn -0.998400 0.055800 0.000000 +vn 0.290500 -0.956800 0.000000 +vn -0.290500 -0.956800 0.000000 +vn 0.000000 0.045100 -0.999000 +vn -0.707700 0.050700 -0.704700 +vn -0.575700 -0.203400 -0.791900 +vn 0.000000 0.046900 -0.998900 +vn 0.575700 -0.203400 -0.791900 +vn 0.707700 0.050700 -0.704700 +vn 0.620900 -0.138000 -0.771600 +vn 0.706400 0.075600 -0.703700 +vn 0.705600 0.063900 -0.705600 +vn 0.705900 0.057800 -0.705900 +vn 0.706200 0.051400 -0.706200 +vn 0.706300 0.048800 -0.706200 +vn -0.706400 0.075600 -0.703700 +vn -0.705900 0.057800 -0.705900 +vn -0.706300 0.048800 -0.706200 +vn 0.000000 -0.240900 -0.970500 +vn 0.000000 0.077500 -0.997000 +vn 0.000000 0.063900 -0.997900 +vn 0.000000 0.057800 -0.998300 +vn 0.000000 0.051400 -0.998700 +vn 0.000000 0.048700 -0.998800 +vn -0.620900 -0.138000 -0.771600 +vn -0.705600 0.063900 -0.705600 +vn -0.706200 0.051400 -0.706200 +vn 0.000000 -0.112700 -0.993600 +vn -0.553900 -0.408400 -0.725500 +vn 0.553900 -0.408400 -0.725500 +vn -0.560700 0.184100 -0.807200 +vn 0.000000 0.132600 -0.991100 +vn 0.000000 0.174800 -0.984600 +vn 0.536900 0.243600 -0.807700 +vn 0.560700 0.184100 -0.807200 +vn -0.536900 0.243600 -0.807700 +vn 0.000000 -0.080900 -0.996700 +vn -0.564300 -0.109600 -0.818200 +vn 0.564300 -0.109600 -0.818200 +vn -0.471400 0.372700 -0.799300 +vn 0.000000 0.405300 -0.914200 +vn 0.471400 0.372700 -0.799300 +usemtl None +s 1 +f 644/1/1 643/2/2 605/3/3 +f 643/2/2 607/4/4 645/5/5 +f 647/6/6 620/7/7 621/8/8 +f 643/2/2 602/9/9 648/10/10 +f 633/11/11 614/12/12 931/13/13 +f 605/14/3 621/8/8 620/7/7 +f 774/15/14 615/16/15 932/17/16 +f 936/18/17 637/19/18 610/20/19 +f 603/21/20 618/22/21 617/23/22 +f 927/24/23 610/20/19 608/25/24 +f 657/26/25 609/27/26 926/28/27 +f 646/29/28 621/8/8 622/30/29 +f 614/12/12 613/31/30 930/32/31 +f 627/33/32 625/34/33 776/35/34 +f 646/29/28 606/36/35 623/37/36 +f 640/38/37 616/39/38 933/40/39 +f 622/30/29 645/41/5 607/42/4 +f 620/7/7 775/43/40 773/44/41 +f 631/45/42 612/46/43 929/47/44 +f 613/31/30 611/48/45 928/49/46 +f 627/50/32 620/7/7 647/6/6 +f 628/51/47 618/22/21 619/52/48 +f 624/53/49 628/54/47 626/55/50 +f 625/34/33 627/33/32 650/56/51 +f 620/7/7 627/50/32 777/57/52 +f 778/58/53 629/59/54 658/60/55 +f 781/61/56 638/62/57 629/59/54 +f 632/63/58 630/64/59 779/65/60 +f 634/66/61 612/46/43 659/67/62 +f 609/27/26 631/45/42 934/68/63 +f 613/31/30 614/12/12 659/67/62 +f 657/26/25 660/69/64 631/45/42 +f 638/62/57 630/64/59 652/70/65 +f 641/71/66 632/63/58 780/72/67 +f 630/64/59 632/63/58 653/73/68 +f 635/74/69 636/75/70 608/25/24 +f 637/19/18 639/76/71 635/74/69 +f 651/77/72 634/66/61 661/78/73 +f 654/79/74 633/11/11 935/80/75 +f 642/81/76 624/53/49 616/39/38 +f 642/81/76 636/75/70 653/73/68 +f 612/46/43 634/66/61 639/76/71 +f 651/77/72 629/59/54 638/62/57 +f 630/64/59 638/62/57 781/61/56 +f 929/47/44 612/46/43 637/19/18 +f 624/53/49 642/81/76 656/82/77 +f 636/75/70 642/81/76 640/38/37 +f 625/34/33 641/71/66 782/83/78 +f 608/25/24 640/38/37 937/84/79 +f 649/85/80 656/82/77 641/71/66 +f 634/66/61 651/77/72 655/86/81 +f 656/82/77 653/73/68 632/63/58 +f 615/16/15 654/79/74 938/87/82 +f 629/59/54 651/77/72 662/88/83 +f 652/70/65 653/73/68 636/75/70 +f 639/76/71 655/86/81 652/70/65 +f 649/85/80 650/56/51 628/54/47 +f 650/89/51 647/6/6 618/22/21 +f 621/8/8 605/14/3 645/41/5 +f 617/23/22 623/37/36 648/90/10 +f 647/6/6 646/29/28 617/23/22 +f 607/42/4 648/90/10 623/37/36 +f 603/91/20 602/9/9 643/2/2 +f 658/60/55 662/88/83 654/79/74 +f 662/88/83 661/78/73 633/11/11 +f 611/48/45 613/31/30 660/69/64 +f 660/69/64 659/67/62 612/46/43 +f 661/78/73 659/67/62 614/12/12 +f 783/92/84 658/60/55 615/16/15 +f 928/49/46 611/48/45 657/26/25 +f 616/39/38 626/55/50 940/93/85 +f 941/94/86 940/95/85 626/96/50 +f 618/22/21 603/21/20 663/97/87 +f 619/52/48 663/97/87 664/98/88 +f 942/99/89 663/100/87 603/91/20 +f 663/100/87 942/99/89 943/101/90 +f 941/94/86 619/52/48 665/102/91 +f 665/102/91 664/98/88 666/103/92 +f 944/104/93 665/102/91 667/105/94 +f 943/101/90 945/106/95 666/107/92 +f 945/108/95 946/109/96 667/105/94 +f 773/110/41 1124/111/97 947/112/98 +f 947/112/98 942/99/89 644/1/1 +f 749/113/99 709/114/100 710/115/101 +f 750/116/102 712/117/103 748/118/104 +f 752/119/105 751/120/106 726/121/107 +f 748/118/104 712/117/103 753/122/108 +f 1106/123/109 719/124/110 738/125/111 +f 725/126/112 726/121/107 710/127/101 +f 1107/128/113 720/129/114 774/15/14 +f 1111/130/115 1102/131/116 715/132/117 +f 722/133/118 723/134/119 708/135/120 +f 1102/131/116 1100/136/121 713/137/122 +f 1101/138/123 714/139/124 762/140/125 +f 751/120/106 711/141/126 727/142/127 +f 1105/143/128 718/144/129 719/124/110 +f 776/35/34 730/145/130 732/146/131 +f 728/147/132 711/141/126 751/120/106 +f 1108/148/133 721/149/134 745/150/135 +f 712/151/103 750/152/102 727/142/127 +f 773/44/41 775/43/40 725/126/112 +f 1104/153/136 717/154/137 736/155/138 +f 1103/156/139 716/157/140 718/144/129 +f 752/119/105 725/126/112 732/158/131 +f 733/159/141 731/160/142 724/161/143 +f 729/162/144 721/149/134 731/163/142 +f 755/164/145 732/146/131 730/145/130 +f 777/57/52 732/158/131 725/126/112 +f 763/165/146 734/166/147 778/58/53 +f 781/61/56 778/58/53 734/166/147 +f 779/65/60 735/167/148 737/168/149 +f 764/169/150 717/154/137 739/170/151 +f 1109/171/152 736/155/138 714/139/124 +f 764/169/150 719/124/110 718/144/129 +f 762/140/125 714/139/124 736/155/138 +f 757/172/153 735/167/148 743/173/154 +f 780/72/67 737/168/149 746/174/155 +f 758/175/156 737/168/149 735/167/148 +f 713/137/122 741/176/157 740/177/158 +f 742/178/159 715/132/117 740/177/158 +f 766/179/160 739/170/151 756/180/161 +f 1110/181/162 738/125/111 759/182/163 +f 721/149/134 729/162/144 747/183/164 +f 758/175/156 741/176/157 747/183/164 +f 717/154/137 742/178/159 744/184/165 +f 756/180/161 760/185/166 743/173/154 +f 781/61/56 743/173/154 735/167/148 +f 1104/153/136 1111/130/115 742/178/159 +f 761/186/167 747/183/164 729/162/144 +f 745/150/135 747/183/164 741/176/157 +f 782/83/78 746/174/155 730/145/130 +f 1112/187/168 745/150/135 713/137/122 +f 746/174/155 761/186/167 754/188/169 +f 739/170/151 744/184/165 760/185/166 +f 737/168/149 758/175/156 761/186/167 +f 1113/189/170 759/182/163 720/129/114 +f 767/190/171 756/180/161 734/166/147 +f 741/176/157 758/175/156 757/172/153 +f 744/184/165 740/177/158 757/172/153 +f 733/191/141 755/164/145 754/188/169 +f 723/134/119 752/119/105 755/192/145 +f 726/121/107 727/142/127 750/152/102 +f 753/193/108 728/147/132 722/133/118 +f 722/133/118 751/120/106 752/119/105 +f 712/151/103 711/141/126 728/147/132 +f 708/194/120 749/113/99 748/118/104 +f 759/182/163 767/190/171 763/165/146 +f 738/125/111 766/179/160 767/190/171 +f 716/157/140 762/140/125 765/195/172 +f 717/154/137 764/169/150 765/195/172 +f 719/124/110 764/169/150 766/179/160 +f 720/129/114 763/165/146 783/92/84 +f 1103/156/139 1114/196/173 762/140/125 +f 1115/197/174 731/163/142 721/149/134 +f 1116/198/175 724/161/143 731/160/142 +f 768/199/176 708/135/120 723/134/119 +f 724/161/143 770/200/177 769/201/178 +f 708/194/120 768/202/176 1117/203/179 +f 768/202/176 769/204/178 1118/205/180 +f 1116/198/175 1119/206/181 770/200/177 +f 770/200/177 772/207/182 771/208/183 +f 1119/206/181 1121/209/184 772/207/182 +f 771/210/183 1120/211/185 1118/205/180 +f 1120/212/185 771/208/183 772/207/182 +f 773/110/41 709/114/100 1122/213/186 +f 749/113/99 1117/203/179 1122/213/186 +f 901/214/187 861/215/188 862/216/189 +f 902/217/190 864/218/191 900/219/192 +f 904/220/193 903/221/194 878/222/195 +f 900/219/192 864/218/191 905/223/196 +f 931/224/13 871/225/197 890/226/198 +f 877/227/199 878/222/195 862/228/189 +f 932/229/16 872/230/200 1090/231/201 +f 936/232/17 927/233/23 867/234/202 +f 874/235/203 875/236/204 860/237/205 +f 927/233/23 925/238/206 865/239/207 +f 926/240/27 866/241/208 914/242/209 +f 903/221/194 863/243/210 879/244/211 +f 930/245/31 870/246/212 871/225/197 +f 1092/247/213 882/248/214 884/249/215 +f 880/250/216 863/243/210 903/221/194 +f 933/251/39 873/252/217 897/253/218 +f 864/254/191 902/255/190 879/244/211 +f 1089/256/219 1091/257/220 877/227/199 +f 929/258/44 869/259/221 888/260/222 +f 928/261/46 868/262/223 870/246/212 +f 904/220/193 877/227/199 884/263/215 +f 885/264/224 883/265/225 876/266/226 +f 881/267/227 873/252/217 883/268/225 +f 907/269/228 884/249/215 882/248/214 +f 1093/270/229 884/263/215 877/227/199 +f 915/271/230 886/272/231 1094/273/232 +f 1097/274/233 1094/273/232 886/272/231 +f 1095/275/234 887/276/235 889/277/236 +f 916/278/237 869/259/221 891/279/238 +f 934/280/63 888/260/222 866/241/208 +f 916/278/237 871/225/197 870/246/212 +f 914/242/209 866/241/208 888/260/222 +f 909/281/239 887/276/235 895/282/240 +f 1096/283/241 889/277/236 898/284/242 +f 910/285/243 889/277/236 887/276/235 +f 865/239/207 893/286/244 892/287/245 +f 894/288/246 867/234/202 892/287/245 +f 918/289/247 891/279/238 908/290/248 +f 935/291/75 890/226/198 911/292/249 +f 873/252/217 881/267/227 899/293/250 +f 910/285/243 893/286/244 899/293/250 +f 869/259/221 894/288/246 896/294/251 +f 908/290/248 912/295/252 895/282/240 +f 1097/274/233 895/282/240 887/276/235 +f 929/258/44 936/232/17 894/288/246 +f 913/296/253 899/293/250 881/267/227 +f 897/253/218 899/293/250 893/286/244 +f 1098/297/254 898/284/242 882/248/214 +f 937/298/79 897/253/218 865/239/207 +f 898/284/242 913/296/253 906/299/255 +f 891/279/238 896/294/251 912/295/252 +f 889/277/236 910/285/243 913/296/253 +f 938/300/82 911/292/249 872/230/200 +f 919/301/256 908/290/248 886/272/231 +f 893/286/244 910/285/243 909/281/239 +f 896/294/251 892/287/245 909/281/239 +f 885/302/224 907/269/228 906/299/255 +f 875/236/204 904/220/193 907/303/228 +f 878/222/195 879/244/211 902/255/190 +f 905/304/196 880/250/216 874/235/203 +f 874/235/203 903/221/194 904/220/193 +f 864/254/191 863/243/210 880/250/216 +f 860/305/205 901/214/187 900/219/192 +f 911/292/249 919/301/256 915/271/230 +f 890/226/198 918/289/247 919/301/256 +f 868/262/223 914/242/209 917/306/257 +f 869/259/221 916/278/237 917/306/257 +f 871/225/197 916/278/237 918/289/247 +f 872/230/200 915/271/230 1099/307/258 +f 928/261/46 939/308/259 914/242/209 +f 940/309/85 883/268/225 873/252/217 +f 941/94/86 876/266/226 883/265/225 +f 920/310/260 860/237/205 875/236/204 +f 876/266/226 922/311/261 921/312/262 +f 860/305/205 920/313/260 942/99/89 +f 920/313/260 921/314/262 943/101/90 +f 941/94/86 944/104/93 922/311/261 +f 922/311/261 924/315/263 923/316/264 +f 944/104/93 946/109/96 924/315/263 +f 923/317/264 945/106/95 943/101/90 +f 945/108/95 923/316/264 924/315/263 +f 1089/318/219 861/215/188 947/112/98 +f 901/214/187 942/99/89 947/112/98 +f 1065/319/265 1064/320/266 1026/321/267 +f 1064/320/266 1028/322/268 1066/323/269 +f 1068/324/270 1041/325/271 1042/326/272 +f 1064/320/266 1023/327/273 1069/328/274 +f 1054/329/275 1035/330/276 1106/331/109 +f 1026/332/267 1042/326/272 1041/325/271 +f 1090/231/201 1036/333/277 1107/334/113 +f 1111/335/115 1058/336/278 1031/337/279 +f 1024/338/280 1039/339/281 1038/340/282 +f 1102/341/116 1031/337/279 1029/342/283 +f 1078/343/284 1030/344/285 1101/345/123 +f 1067/346/286 1042/326/272 1043/347/287 +f 1035/330/276 1034/348/288 1105/349/128 +f 1048/350/289 1046/351/290 1092/247/213 +f 1067/346/286 1027/352/291 1044/353/292 +f 1061/354/293 1037/355/294 1108/356/133 +f 1043/347/287 1066/357/269 1028/358/268 +f 1041/325/271 1091/257/220 1089/256/219 +f 1052/359/295 1033/360/296 1104/361/136 +f 1034/348/288 1032/362/297 1103/363/139 +f 1048/364/289 1041/325/271 1068/324/270 +f 1049/365/298 1039/339/281 1040/366/299 +f 1045/367/300 1049/368/298 1047/369/301 +f 1046/351/290 1048/350/289 1071/370/302 +f 1041/325/271 1048/364/289 1093/270/229 +f 1094/273/232 1050/371/303 1079/372/304 +f 1097/274/233 1059/373/305 1050/371/303 +f 1053/374/306 1051/375/307 1095/275/234 +f 1055/376/308 1033/360/296 1080/377/309 +f 1030/344/285 1052/359/295 1109/378/152 +f 1034/348/288 1035/330/276 1080/377/309 +f 1078/343/284 1081/379/310 1052/359/295 +f 1059/373/305 1051/375/307 1073/380/311 +f 1062/381/312 1053/374/306 1096/283/241 +f 1051/375/307 1053/374/306 1074/382/313 +f 1056/383/314 1057/384/315 1029/342/283 +f 1058/336/278 1060/385/316 1056/383/314 +f 1072/386/317 1055/376/308 1082/387/318 +f 1075/388/319 1054/329/275 1110/389/162 +f 1063/390/320 1045/367/300 1037/355/294 +f 1063/390/320 1057/384/315 1074/382/313 +f 1033/360/296 1055/376/308 1060/385/316 +f 1072/386/317 1050/371/303 1059/373/305 +f 1051/375/307 1059/373/305 1097/274/233 +f 1104/361/136 1033/360/296 1058/336/278 +f 1045/367/300 1063/390/320 1077/391/321 +f 1057/384/315 1063/390/320 1061/354/293 +f 1046/351/290 1062/381/312 1098/297/254 +f 1029/342/283 1061/354/293 1112/392/168 +f 1070/393/322 1077/391/321 1062/381/312 +f 1055/376/308 1072/386/317 1076/394/323 +f 1077/391/321 1074/382/313 1053/374/306 +f 1036/333/277 1075/388/319 1113/395/170 +f 1050/371/303 1072/386/317 1083/396/324 +f 1073/380/311 1074/382/313 1057/384/315 +f 1060/385/316 1076/394/323 1073/380/311 +f 1070/393/322 1071/370/302 1049/368/298 +f 1071/397/302 1068/324/270 1039/339/281 +f 1042/326/272 1026/332/267 1066/357/269 +f 1038/340/282 1044/353/292 1069/398/274 +f 1068/324/270 1067/346/286 1038/340/282 +f 1028/358/268 1069/398/274 1044/353/292 +f 1024/399/280 1023/327/273 1064/320/266 +f 1079/372/304 1083/396/324 1075/388/319 +f 1083/396/324 1082/387/318 1054/329/275 +f 1032/362/297 1034/348/288 1081/379/310 +f 1081/379/310 1080/377/309 1033/360/296 +f 1082/387/318 1080/377/309 1035/330/276 +f 1099/307/258 1079/372/304 1036/333/277 +f 1103/363/139 1032/362/297 1078/343/284 +f 1037/355/294 1047/369/301 1115/400/174 +f 1116/198/175 1115/401/174 1047/402/301 +f 1039/339/281 1024/338/280 1084/403/325 +f 1040/366/299 1084/403/325 1085/404/326 +f 1117/203/179 1084/405/325 1024/399/280 +f 1084/405/325 1117/203/179 1118/205/180 +f 1116/198/175 1040/366/299 1086/406/327 +f 1086/406/327 1085/404/326 1087/407/328 +f 1119/206/181 1086/406/327 1088/408/329 +f 1118/205/180 1120/211/185 1087/409/328 +f 1120/212/185 1121/209/184 1088/408/329 +f 1089/318/219 1124/111/97 1122/213/186 +f 1122/213/186 1117/203/179 1065/319/265 +f 604/410/330 644/1/1 605/3/3 +f 605/3/3 643/2/2 645/5/5 +f 646/29/28 647/6/6 621/8/8 +f 607/4/4 643/2/2 648/10/10 +f 935/80/75 633/11/11 931/13/13 +f 604/411/330 605/14/3 620/7/7 +f 1123/412/331 774/15/14 932/17/16 +f 927/24/23 936/18/17 610/20/19 +f 602/413/9 603/21/20 617/23/22 +f 925/414/206 927/24/23 608/25/24 +f 939/415/259 657/26/25 926/28/27 +f 606/36/35 646/29/28 622/30/29 +f 931/13/13 614/12/12 930/32/31 +f 777/416/52 627/33/32 776/35/34 +f 617/23/22 646/29/28 623/37/36 +f 937/84/79 640/38/37 933/40/39 +f 606/36/35 622/30/29 607/42/4 +f 604/411/330 620/7/7 773/44/41 +f 934/68/63 631/45/42 929/47/44 +f 930/32/31 613/31/30 928/49/46 +f 650/89/51 627/50/32 647/6/6 +f 626/96/50 628/51/47 619/52/48 +f 616/39/38 624/53/49 626/55/50 +f 649/85/80 625/34/33 650/56/51 +f 775/43/40 620/7/7 777/57/52 +f 783/92/84 778/58/53 658/60/55 +f 778/58/53 781/61/56 629/59/54 +f 780/72/67 632/63/58 779/65/60 +f 661/78/73 634/66/61 659/67/62 +f 926/28/27 609/27/26 934/68/63 +f 660/69/64 613/31/30 659/67/62 +f 609/27/26 657/26/25 631/45/42 +f 655/86/81 638/62/57 652/70/65 +f 782/83/78 641/71/66 780/72/67 +f 652/70/65 630/64/59 653/73/68 +f 610/20/19 635/74/69 608/25/24 +f 610/20/19 637/19/18 635/74/69 +f 662/88/83 651/77/72 661/78/73 +f 938/87/82 654/79/74 935/80/75 +f 640/38/37 642/81/76 616/39/38 +f 656/82/77 642/81/76 653/73/68 +f 637/19/18 612/46/43 639/76/71 +f 655/86/81 651/77/72 638/62/57 +f 779/65/60 630/64/59 781/61/56 +f 936/18/17 929/47/44 637/19/18 +f 649/85/80 624/53/49 656/82/77 +f 608/25/24 636/75/70 640/38/37 +f 776/35/34 625/34/33 782/83/78 +f 925/414/206 608/25/24 937/84/79 +f 625/34/33 649/85/80 641/71/66 +f 639/76/71 634/66/61 655/86/81 +f 641/71/66 656/82/77 632/63/58 +f 932/17/16 615/16/15 938/87/82 +f 658/60/55 629/59/54 662/88/83 +f 635/74/69 652/70/65 636/75/70 +f 635/74/69 639/76/71 652/70/65 +f 624/53/49 649/85/80 628/54/47 +f 628/51/47 650/89/51 618/22/21 +f 622/30/29 621/8/8 645/41/5 +f 602/413/9 617/23/22 648/90/10 +f 618/22/21 647/6/6 617/23/22 +f 606/36/35 607/42/4 623/37/36 +f 644/1/1 603/91/20 643/2/2 +f 615/16/15 658/60/55 654/79/74 +f 654/79/74 662/88/83 633/11/11 +f 657/26/25 611/48/45 660/69/64 +f 631/45/42 660/69/64 612/46/43 +f 633/11/11 661/78/73 614/12/12 +f 774/15/14 783/92/84 615/16/15 +f 939/415/259 928/49/46 657/26/25 +f 933/40/39 616/39/38 940/93/85 +f 619/52/48 941/94/86 626/96/50 +f 619/52/48 618/22/21 663/97/87 +f 665/102/91 619/52/48 664/98/88 +f 644/1/1 942/99/89 603/91/20 +f 664/417/88 663/100/87 943/101/90 +f 944/104/93 941/94/86 665/102/91 +f 667/105/94 665/102/91 666/103/92 +f 946/109/96 944/104/93 667/105/94 +f 664/417/88 943/101/90 666/107/92 +f 666/103/92 945/108/95 667/105/94 +f 604/410/330 773/110/41 947/112/98 +f 604/410/330 947/112/98 644/1/1 +f 748/118/104 749/113/99 710/115/101 +f 710/115/101 750/116/102 748/118/104 +f 725/126/112 752/119/105 726/121/107 +f 707/418/332 748/118/104 753/122/108 +f 1110/181/162 1106/123/109 738/125/111 +f 709/419/100 725/126/112 710/127/101 +f 1123/412/331 1107/128/113 774/15/14 +f 742/178/159 1111/130/115 715/132/117 +f 707/420/332 722/133/118 708/135/120 +f 715/132/117 1102/131/116 713/137/122 +f 1114/196/173 1101/138/123 762/140/125 +f 726/121/107 751/120/106 727/142/127 +f 1106/123/109 1105/143/128 719/124/110 +f 777/416/52 776/35/34 732/146/131 +f 722/133/118 728/147/132 751/120/106 +f 1112/187/168 1108/148/133 745/150/135 +f 711/141/126 712/151/103 727/142/127 +f 709/419/100 773/44/41 725/126/112 +f 1109/171/152 1104/153/136 736/155/138 +f 1105/143/128 1103/156/139 718/144/129 +f 755/192/145 752/119/105 732/158/131 +f 723/134/119 733/159/141 724/161/143 +f 733/191/141 729/162/144 731/163/142 +f 754/188/169 755/164/145 730/145/130 +f 775/43/40 777/57/52 725/126/112 +f 783/92/84 763/165/146 778/58/53 +f 743/173/154 781/61/56 734/166/147 +f 780/72/67 779/65/60 737/168/149 +f 766/179/160 764/169/150 739/170/151 +f 1101/138/123 1109/171/152 714/139/124 +f 765/195/172 764/169/150 718/144/129 +f 765/195/172 762/140/125 736/155/138 +f 760/185/166 757/172/153 743/173/154 +f 782/83/78 780/72/67 746/174/155 +f 757/172/153 758/175/156 735/167/148 +f 715/132/117 713/137/122 740/177/158 +f 744/184/165 742/178/159 740/177/158 +f 767/190/171 766/179/160 756/180/161 +f 1113/189/170 1110/181/162 759/182/163 +f 745/150/135 721/149/134 747/183/164 +f 761/186/167 758/175/156 747/183/164 +f 739/170/151 717/154/137 744/184/165 +f 734/166/147 756/180/161 743/173/154 +f 779/65/60 781/61/56 735/167/148 +f 717/154/137 1104/153/136 742/178/159 +f 754/188/169 761/186/167 729/162/144 +f 713/137/122 745/150/135 741/176/157 +f 776/35/34 782/83/78 730/145/130 +f 1100/136/121 1112/187/168 713/137/122 +f 730/145/130 746/174/155 754/188/169 +f 756/180/161 739/170/151 760/185/166 +f 746/174/155 737/168/149 761/186/167 +f 1107/128/113 1113/189/170 720/129/114 +f 763/165/146 767/190/171 734/166/147 +f 740/177/158 741/176/157 757/172/153 +f 760/185/166 744/184/165 757/172/153 +f 729/162/144 733/191/141 754/188/169 +f 733/159/141 723/134/119 755/192/145 +f 710/127/101 726/121/107 750/152/102 +f 707/420/332 753/193/108 722/133/118 +f 723/134/119 722/133/118 752/119/105 +f 753/193/108 712/151/103 728/147/132 +f 707/418/332 708/194/120 748/118/104 +f 720/129/114 759/182/163 763/165/146 +f 759/182/163 738/125/111 767/190/171 +f 718/144/129 716/157/140 765/195/172 +f 736/155/138 717/154/137 765/195/172 +f 738/125/111 719/124/110 766/179/160 +f 774/15/14 720/129/114 783/92/84 +f 716/157/140 1103/156/139 762/140/125 +f 1108/148/133 1115/197/174 721/149/134 +f 1115/401/174 1116/198/175 731/160/142 +f 724/161/143 768/199/176 723/134/119 +f 768/199/176 724/161/143 769/201/178 +f 749/113/99 708/194/120 1117/203/179 +f 1117/203/179 768/202/176 1118/205/180 +f 724/161/143 1116/198/175 770/200/177 +f 769/201/178 770/200/177 771/208/183 +f 770/200/177 1119/206/181 772/207/182 +f 769/204/178 771/210/183 1118/205/180 +f 1121/209/184 1120/212/185 772/207/182 +f 1124/111/97 773/110/41 1122/213/186 +f 709/114/100 749/113/99 1122/213/186 +f 900/219/192 901/214/187 862/216/189 +f 862/216/189 902/217/190 900/219/192 +f 877/227/199 904/220/193 878/222/195 +f 859/421/333 900/219/192 905/223/196 +f 935/291/75 931/224/13 890/226/198 +f 861/422/188 877/227/199 862/228/189 +f 1123/423/331 932/229/16 1090/231/201 +f 894/288/246 936/232/17 867/234/202 +f 859/424/333 874/235/203 860/237/205 +f 867/234/202 927/233/23 865/239/207 +f 939/308/259 926/240/27 914/242/209 +f 878/222/195 903/221/194 879/244/211 +f 931/224/13 930/245/31 871/225/197 +f 1093/425/229 1092/247/213 884/249/215 +f 874/235/203 880/250/216 903/221/194 +f 937/298/79 933/251/39 897/253/218 +f 863/243/210 864/254/191 879/244/211 +f 861/422/188 1089/256/219 877/227/199 +f 934/280/63 929/258/44 888/260/222 +f 930/245/31 928/261/46 870/246/212 +f 907/303/228 904/220/193 884/263/215 +f 875/236/204 885/264/224 876/266/226 +f 885/302/224 881/267/227 883/268/225 +f 906/299/255 907/269/228 882/248/214 +f 1091/257/220 1093/270/229 877/227/199 +f 1099/307/258 915/271/230 1094/273/232 +f 895/282/240 1097/274/233 886/272/231 +f 1096/283/241 1095/275/234 889/277/236 +f 918/289/247 916/278/237 891/279/238 +f 926/240/27 934/280/63 866/241/208 +f 917/306/257 916/278/237 870/246/212 +f 917/306/257 914/242/209 888/260/222 +f 912/295/252 909/281/239 895/282/240 +f 1098/297/254 1096/283/241 898/284/242 +f 909/281/239 910/285/243 887/276/235 +f 867/234/202 865/239/207 892/287/245 +f 896/294/251 894/288/246 892/287/245 +f 919/301/256 918/289/247 908/290/248 +f 938/300/82 935/291/75 911/292/249 +f 897/253/218 873/252/217 899/293/250 +f 913/296/253 910/285/243 899/293/250 +f 891/279/238 869/259/221 896/294/251 +f 886/272/231 908/290/248 895/282/240 +f 1095/275/234 1097/274/233 887/276/235 +f 869/259/221 929/258/44 894/288/246 +f 906/299/255 913/296/253 881/267/227 +f 865/239/207 897/253/218 893/286/244 +f 1092/247/213 1098/297/254 882/248/214 +f 925/238/206 937/298/79 865/239/207 +f 882/248/214 898/284/242 906/299/255 +f 908/290/248 891/279/238 912/295/252 +f 898/284/242 889/277/236 913/296/253 +f 932/229/16 938/300/82 872/230/200 +f 915/271/230 919/301/256 886/272/231 +f 892/287/245 893/286/244 909/281/239 +f 912/295/252 896/294/251 909/281/239 +f 881/267/227 885/302/224 906/299/255 +f 885/264/224 875/236/204 907/303/228 +f 862/228/189 878/222/195 902/255/190 +f 859/424/333 905/304/196 874/235/203 +f 875/236/204 874/235/203 904/220/193 +f 905/304/196 864/254/191 880/250/216 +f 859/421/333 860/305/205 900/219/192 +f 872/230/200 911/292/249 915/271/230 +f 911/292/249 890/226/198 919/301/256 +f 870/246/212 868/262/223 917/306/257 +f 888/260/222 869/259/221 917/306/257 +f 890/226/198 871/225/197 918/289/247 +f 1090/231/201 872/230/200 1099/307/258 +f 868/262/223 928/261/46 914/242/209 +f 933/251/39 940/309/85 873/252/217 +f 940/95/85 941/94/86 883/265/225 +f 876/266/226 920/310/260 875/236/204 +f 920/310/260 876/266/226 921/312/262 +f 901/214/187 860/305/205 942/99/89 +f 942/99/89 920/313/260 943/101/90 +f 876/266/226 941/94/86 922/311/261 +f 921/312/262 922/311/261 923/316/264 +f 922/311/261 944/104/93 924/315/263 +f 921/314/262 923/317/264 943/101/90 +f 946/109/96 945/108/95 924/315/263 +f 1124/111/97 1089/318/219 947/112/98 +f 861/215/188 901/214/187 947/112/98 +f 1025/426/334 1065/319/265 1026/321/267 +f 1026/321/267 1064/320/266 1066/323/269 +f 1067/346/286 1068/324/270 1042/326/272 +f 1028/322/268 1064/320/266 1069/328/274 +f 1110/389/162 1054/329/275 1106/331/109 +f 1025/427/334 1026/332/267 1041/325/271 +f 1123/423/331 1090/231/201 1107/334/113 +f 1102/341/116 1111/335/115 1031/337/279 +f 1023/428/273 1024/338/280 1038/340/282 +f 1100/429/121 1102/341/116 1029/342/283 +f 1114/430/173 1078/343/284 1101/345/123 +f 1027/352/291 1067/346/286 1043/347/287 +f 1106/331/109 1035/330/276 1105/349/128 +f 1093/425/229 1048/350/289 1092/247/213 +f 1038/340/282 1067/346/286 1044/353/292 +f 1112/392/168 1061/354/293 1108/356/133 +f 1027/352/291 1043/347/287 1028/358/268 +f 1025/427/334 1041/325/271 1089/256/219 +f 1109/378/152 1052/359/295 1104/361/136 +f 1105/349/128 1034/348/288 1103/363/139 +f 1071/397/302 1048/364/289 1068/324/270 +f 1047/402/301 1049/365/298 1040/366/299 +f 1037/355/294 1045/367/300 1047/369/301 +f 1070/393/322 1046/351/290 1071/370/302 +f 1091/257/220 1041/325/271 1093/270/229 +f 1099/307/258 1094/273/232 1079/372/304 +f 1094/273/232 1097/274/233 1050/371/303 +f 1096/283/241 1053/374/306 1095/275/234 +f 1082/387/318 1055/376/308 1080/377/309 +f 1101/345/123 1030/344/285 1109/378/152 +f 1081/379/310 1034/348/288 1080/377/309 +f 1030/344/285 1078/343/284 1052/359/295 +f 1076/394/323 1059/373/305 1073/380/311 +f 1098/297/254 1062/381/312 1096/283/241 +f 1073/380/311 1051/375/307 1074/382/313 +f 1031/337/279 1056/383/314 1029/342/283 +f 1031/337/279 1058/336/278 1056/383/314 +f 1083/396/324 1072/386/317 1082/387/318 +f 1113/395/170 1075/388/319 1110/389/162 +f 1061/354/293 1063/390/320 1037/355/294 +f 1077/391/321 1063/390/320 1074/382/313 +f 1058/336/278 1033/360/296 1060/385/316 +f 1076/394/323 1072/386/317 1059/373/305 +f 1095/275/234 1051/375/307 1097/274/233 +f 1111/335/115 1104/361/136 1058/336/278 +f 1070/393/322 1045/367/300 1077/391/321 +f 1029/342/283 1057/384/315 1061/354/293 +f 1092/247/213 1046/351/290 1098/297/254 +f 1100/429/121 1029/342/283 1112/392/168 +f 1046/351/290 1070/393/322 1062/381/312 +f 1060/385/316 1055/376/308 1076/394/323 +f 1062/381/312 1077/391/321 1053/374/306 +f 1107/334/113 1036/333/277 1113/395/170 +f 1079/372/304 1050/371/303 1083/396/324 +f 1056/383/314 1073/380/311 1057/384/315 +f 1056/383/314 1060/385/316 1073/380/311 +f 1045/367/300 1070/393/322 1049/368/298 +f 1049/365/298 1071/397/302 1039/339/281 +f 1043/347/287 1042/326/272 1066/357/269 +f 1023/428/273 1038/340/282 1069/398/274 +f 1039/339/281 1068/324/270 1038/340/282 +f 1027/352/291 1028/358/268 1044/353/292 +f 1065/319/265 1024/399/280 1064/320/266 +f 1036/333/277 1079/372/304 1075/388/319 +f 1075/388/319 1083/396/324 1054/329/275 +f 1078/343/284 1032/362/297 1081/379/310 +f 1052/359/295 1081/379/310 1033/360/296 +f 1054/329/275 1082/387/318 1035/330/276 +f 1090/231/201 1099/307/258 1036/333/277 +f 1114/430/173 1103/363/139 1078/343/284 +f 1108/356/133 1037/355/294 1115/400/174 +f 1040/366/299 1116/198/175 1047/402/301 +f 1040/366/299 1039/339/281 1084/403/325 +f 1086/406/327 1040/366/299 1085/404/326 +f 1065/319/265 1117/203/179 1024/399/280 +f 1085/431/326 1084/405/325 1118/205/180 +f 1119/206/181 1116/198/175 1086/406/327 +f 1088/408/329 1086/406/327 1087/407/328 +f 1121/209/184 1119/206/181 1088/408/329 +f 1085/431/326 1118/205/180 1087/409/328 +f 1087/407/328 1120/212/185 1088/408/329 +f 1025/426/334 1089/318/219 1122/213/186 +f 1025/426/334 1122/213/186 1065/319/265 +usemtl Derp +f 599/432/335 565/433/336 564/434/337 +f 600/435/338 564/434/337 563/436/339 +f 858/437/340 793/438/341 565/433/336 +f 601/439/342 563/436/339 789/440/343 +f 591/441/344 571/442/345 794/443/346 +f 594/444/347 570/445/348 795/446/349 +f 849/447/350 597/448/351 569/449/352 +f 592/450/353 841/451/354 805/452/355 +f 595/453/356 847/454/357 804/455/358 +f 598/456/359 852/457/360 803/458/361 +f 590/459/362 568/460/363 571/442/345 +f 594/444/347 593/461/364 567/462/365 +f 597/448/351 596/463/366 566/464/367 +f 592/450/353 572/465/368 568/460/363 +f 593/461/364 595/453/356 573/466/369 +f 598/456/359 574/467/370 566/464/367 +f 563/436/339 564/434/337 576/468/371 +f 565/433/336 577/469/372 576/468/371 +f 793/438/341 813/470/373 577/469/372 +f 789/440/343 563/436/339 575/471/374 +f 581/472/375 819/473/376 818/474/377 +f 582/475/378 579/476/379 578/477/380 +f 583/478/381 578/477/380 814/479/382 +f 582/475/378 581/472/375 580/480/383 +f 586/481/384 584/482/385 581/472/375 +f 585/483/386 583/478/381 823/484/387 +f 586/481/384 582/475/378 583/478/381 +f 584/482/385 827/485/388 819/473/376 +f 813/470/373 827/485/388 584/482/385 +f 575/471/374 576/468/371 586/481/384 +f 809/486/389 575/471/374 585/483/386 +f 577/469/372 584/482/385 586/481/384 +f 579/476/379 580/480/383 589/487/390 +f 580/480/383 818/474/377 833/488/391 +f 579/476/379 588/489/392 587/490/393 +f 578/477/380 587/490/393 829/491/394 +f 589/487/390 833/488/391 838/492/395 +f 588/489/392 836/493/97 835/494/396 +f 587/490/393 835/494/396 834/495/397 +f 588/489/392 589/487/390 837/496/398 +f 786/497/331 785/498/399 592/450/353 +f 786/497/331 590/459/362 591/441/344 +f 785/498/399 784/499/400 841/451/354 +f 787/500/401 591/441/344 842/501/402 +f 572/465/368 595/453/356 593/461/364 +f 568/460/363 593/461/364 594/444/347 +f 572/465/368 805/452/355 847/454/357 +f 794/443/346 571/442/345 594/444/347 +f 573/466/369 598/456/359 596/463/366 +f 570/445/348 567/462/365 596/463/366 +f 804/455/358 852/457/360 598/456/359 +f 795/446/349 570/445/348 597/448/351 +f 569/449/352 601/439/342 854/502/403 +f 803/458/361 858/437/340 599/432/335 +f 566/464/367 600/435/338 601/439/342 +f 574/467/370 599/432/335 600/435/338 +f 669/503/337 670/504/339 704/505/342 +f 668/506/336 669/503/337 705/507/338 +f 670/504/339 957/508/343 1022/509/403 +f 953/510/341 668/506/336 706/511/335 +f 1006/512/354 958/443/355 676/513/368 +f 959/514/358 675/515/369 699/516/356 +f 1013/517/360 960/518/361 674/519/370 +f 677/520/345 969/521/346 1005/522/402 +f 700/523/347 678/524/348 968/525/349 +f 679/526/352 967/527/404 1016/528/350 +f 676/513/368 673/529/363 695/530/362 +f 675/515/369 672/531/365 698/532/364 +f 702/533/359 674/519/370 671/534/367 +f 673/529/363 677/520/345 697/535/344 +f 672/531/365 678/524/348 700/523/347 +f 701/536/366 671/534/367 679/526/352 +f 668/506/336 680/537/372 681/538/371 +f 681/538/371 682/539/374 670/504/339 +f 682/539/374 977/540/389 957/508/343 +f 953/510/341 973/541/373 680/537/372 +f 686/542/381 685/543/380 982/544/382 +f 683/545/383 684/546/379 687/547/378 +f 978/548/377 683/545/383 688/549/375 +f 687/547/378 684/546/379 685/543/380 +f 691/550/384 687/547/378 686/542/381 +f 987/551/376 688/549/375 690/552/385 +f 688/549/375 687/547/378 691/550/384 +f 689/553/386 686/542/381 983/554/387 +f 689/553/386 991/555/405 977/540/389 +f 680/537/372 690/552/385 691/550/384 +f 973/541/373 990/556/388 690/552/385 +f 691/550/384 689/553/386 682/539/374 +f 684/546/379 693/557/392 694/558/393 +f 685/543/380 694/558/393 997/559/394 +f 692/560/390 693/557/392 684/546/379 +f 993/561/391 692/560/390 683/545/383 +f 694/558/393 1001/562/396 1002/563/397 +f 999/564/398 1000/565/97 693/557/392 +f 998/566/395 999/564/398 692/560/390 +f 693/557/392 1000/565/97 1001/562/396 +f 950/567/331 695/530/362 697/535/344 +f 696/568/353 695/530/362 950/567/331 +f 949/569/401 697/535/344 1005/522/402 +f 1006/512/354 696/568/353 951/570/399 +f 673/529/363 698/532/364 700/523/347 +f 699/516/356 698/532/364 673/529/363 +f 677/520/345 700/523/347 1011/571/406 +f 958/443/355 1008/572/357 699/516/356 +f 672/531/365 701/536/366 703/573/351 +f 675/515/369 702/533/359 701/536/366 +f 703/573/351 1016/528/350 968/525/349 +f 1013/517/360 702/533/359 675/515/369 +f 1018/574/340 706/511/335 674/519/370 +f 704/505/342 1022/509/403 967/527/404 +f 706/511/335 705/507/338 671/534/367 +f 705/507/338 704/505/342 679/526/352 +f 791/575/407 792/576/408 855/577/409 +f 790/578/410 791/575/407 856/579/411 +f 792/576/408 793/580/341 858/581/340 +f 789/582/343 790/578/410 857/583/412 +f 842/584/402 794/585/346 802/586/413 +f 795/587/349 801/588/414 846/589/415 +f 849/590/350 796/591/404 800/592/416 +f 806/593/417 805/594/355 841/595/354 +f 848/596/418 807/597/419 804/598/358 +f 808/599/420 803/600/361 852/601/360 +f 802/586/413 799/602/421 839/603/422 +f 801/588/414 798/604/423 845/605/424 +f 851/606/425 800/592/416 797/607/426 +f 799/602/421 806/593/417 843/608/427 +f 798/604/423 807/597/419 848/596/418 +f 850/609/428 797/607/426 808/599/420 +f 790/578/410 810/610/429 811/611/430 +f 811/611/430 812/612/431 792/576/408 +f 812/612/431 813/613/373 793/580/341 +f 789/582/343 809/614/389 810/610/429 +f 820/615/432 817/616/433 818/617/377 +f 815/618/434 816/619/435 821/620/436 +f 814/621/382 815/618/434 822/622/437 +f 821/620/436 816/619/435 817/616/433 +f 828/623/438 821/620/436 820/615/432 +f 823/624/387 822/622/437 825/625/439 +f 822/622/437 821/620/436 828/623/438 +f 824/626/440 820/615/432 819/627/376 +f 824/626/440 827/628/388 813/613/373 +f 810/610/429 825/625/439 828/623/438 +f 809/614/389 826/629/405 825/625/439 +f 828/623/438 824/626/440 812/612/431 +f 816/619/435 831/630/441 832/631/442 +f 817/616/433 832/631/442 833/632/391 +f 830/633/443 831/630/441 816/619/435 +f 829/634/394 830/633/443 815/618/434 +f 832/631/442 837/635/398 838/636/395 +f 835/637/396 836/638/97 831/630/441 +f 834/639/397 835/637/396 830/633/443 +f 831/630/441 836/638/97 837/635/398 +f 786/640/331 839/603/422 843/608/427 +f 840/641/444 839/603/422 786/640/331 +f 785/642/399 843/608/427 841/595/354 +f 842/584/402 840/641/444 787/643/401 +f 799/602/421 845/605/424 848/596/418 +f 846/589/415 845/605/424 799/602/421 +f 806/593/417 848/596/418 847/644/357 +f 794/585/346 844/645/406 846/589/415 +f 798/604/423 850/609/428 853/646/445 +f 801/588/414 851/606/425 850/609/428 +f 853/646/445 852/601/360 804/598/358 +f 849/590/350 851/606/425 801/588/414 +f 854/647/403 857/583/412 800/592/416 +f 855/577/409 858/581/340 803/600/361 +f 857/583/412 856/579/411 797/607/426 +f 856/579/411 855/577/409 808/599/420 +f 1019/648/412 956/649/410 955/650/407 +f 1020/651/411 955/650/407 954/652/408 +f 1022/653/403 957/654/343 956/649/410 +f 1021/655/409 954/652/408 953/656/341 +f 1004/657/427 966/658/417 958/659/355 +f 1010/660/418 965/661/419 959/662/358 +f 1013/663/360 1015/664/445 964/665/420 +f 1007/666/444 1005/667/402 969/668/346 +f 1012/669/415 1011/670/406 968/671/349 +f 1017/672/425 1016/673/350 967/674/404 +f 1003/675/422 963/676/421 966/658/417 +f 1010/660/418 1009/677/424 962/678/423 +f 1015/664/445 1014/679/428 961/680/426 +f 1007/666/444 970/681/413 963/676/421 +f 1009/677/424 1012/669/415 971/682/414 +f 1017/672/425 972/683/416 961/680/426 +f 954/652/408 955/650/407 975/684/430 +f 956/649/410 976/685/429 975/684/430 +f 957/654/343 977/686/389 976/685/429 +f 953/656/341 954/652/408 974/687/431 +f 984/688/437 983/689/387 982/690/382 +f 985/691/436 980/692/435 979/693/433 +f 986/694/432 979/693/433 978/695/377 +f 985/691/436 984/688/437 981/696/434 +f 992/697/438 988/698/439 984/688/437 +f 989/699/440 986/694/432 987/700/376 +f 992/697/438 985/691/436 986/694/432 +f 988/698/439 991/701/405 983/689/387 +f 977/686/389 991/701/405 988/698/439 +f 974/687/431 975/684/430 992/697/438 +f 973/702/373 974/687/431 989/699/440 +f 976/685/429 988/698/439 992/697/438 +f 980/692/435 981/696/434 996/703/443 +f 981/696/434 982/690/382 997/704/394 +f 980/692/435 995/705/441 994/706/442 +f 979/693/433 994/706/442 993/707/391 +f 996/703/443 997/704/394 1002/708/397 +f 995/705/441 1000/709/97 999/710/398 +f 994/706/442 999/710/398 998/711/395 +f 995/705/441 996/703/443 1001/712/396 +f 950/713/331 949/714/401 1007/666/444 +f 950/713/331 1003/675/422 1004/657/427 +f 949/714/401 948/715/446 1005/667/402 +f 951/716/399 1004/657/427 1006/717/354 +f 970/681/413 1012/669/415 1009/677/424 +f 963/676/421 1009/677/424 1010/660/418 +f 970/681/413 969/668/346 1011/670/406 +f 958/659/355 966/658/417 1010/660/418 +f 971/682/414 1017/672/425 1014/679/428 +f 965/661/419 962/678/423 1014/679/428 +f 968/671/349 1016/673/350 1017/672/425 +f 959/662/358 965/661/419 1015/664/445 +f 964/665/420 1021/655/409 1018/718/340 +f 967/674/404 1022/653/403 1019/648/412 +f 961/680/426 1020/651/411 1021/655/409 +f 972/683/416 1019/648/412 1020/651/411 +f 600/435/338 599/432/335 564/434/337 +f 601/439/342 600/435/338 563/436/339 +f 599/432/335 858/437/340 565/433/336 +f 854/502/403 601/439/342 789/440/343 +f 842/501/402 591/441/344 794/443/346 +f 844/719/406 594/444/347 795/446/349 +f 796/720/404 849/447/350 569/449/352 +f 572/465/368 592/450/353 805/452/355 +f 573/466/369 595/453/356 804/455/358 +f 574/467/370 598/456/359 803/458/361 +f 591/441/344 590/459/362 571/442/345 +f 570/445/348 594/444/347 567/462/365 +f 569/449/352 597/448/351 566/464/367 +f 590/459/362 592/450/353 568/460/363 +f 567/462/365 593/461/364 573/466/369 +f 596/463/366 598/456/359 566/464/367 +f 575/471/374 563/436/339 576/468/371 +f 564/434/337 565/433/336 576/468/371 +f 565/433/336 793/438/341 577/469/372 +f 809/486/389 789/440/343 575/471/374 +f 580/480/383 581/472/375 818/474/377 +f 583/478/381 582/475/378 578/477/380 +f 823/484/387 583/478/381 814/479/382 +f 579/476/379 582/475/378 580/480/383 +f 582/475/378 586/481/384 581/472/375 +f 826/721/405 585/483/386 823/484/387 +f 585/483/386 586/481/384 583/478/381 +f 581/472/375 584/482/385 819/473/376 +f 577/469/372 813/470/373 584/482/385 +f 585/483/386 575/471/374 586/481/384 +f 826/721/405 809/486/389 585/483/386 +f 576/468/371 577/469/372 586/481/384 +f 588/489/392 579/476/379 589/487/390 +f 589/487/390 580/480/383 833/488/391 +f 578/477/380 579/476/379 587/490/393 +f 814/479/382 578/477/380 829/491/394 +f 837/496/398 589/487/390 838/492/395 +f 587/490/393 588/489/392 835/494/396 +f 829/491/394 587/490/393 834/495/397 +f 836/493/97 588/489/392 837/496/398 +f 590/459/362 786/497/331 592/450/353 +f 787/500/401 786/497/331 591/441/344 +f 592/450/353 785/498/399 841/451/354 +f 788/722/447 787/500/401 842/501/402 +f 568/460/363 572/465/368 593/461/364 +f 571/442/345 568/460/363 594/444/347 +f 595/453/356 572/465/368 847/454/357 +f 844/719/406 794/443/346 594/444/347 +f 567/462/365 573/466/369 596/463/366 +f 597/448/351 570/445/348 596/463/366 +f 573/466/369 804/455/358 598/456/359 +f 849/447/350 795/446/349 597/448/351 +f 796/720/404 569/449/352 854/502/403 +f 574/467/370 803/458/361 599/432/335 +f 569/449/352 566/464/367 601/439/342 +f 566/464/367 574/467/370 600/435/338 +f 705/507/338 669/503/337 704/505/342 +f 706/511/335 668/506/336 705/507/338 +f 704/505/342 670/504/339 1022/509/403 +f 1018/574/340 953/510/341 706/511/335 +f 696/568/353 1006/512/354 676/513/368 +f 1008/572/357 959/514/358 699/516/356 +f 702/533/359 1013/517/360 674/519/370 +f 697/535/344 677/520/345 1005/522/402 +f 1011/571/406 700/523/347 968/525/349 +f 703/573/351 679/526/352 1016/528/350 +f 696/568/353 676/513/368 695/530/362 +f 699/516/356 675/515/369 698/532/364 +f 701/536/366 702/533/359 671/534/367 +f 695/530/362 673/529/363 697/535/344 +f 698/532/364 672/531/365 700/523/347 +f 703/573/351 701/536/366 679/526/352 +f 669/503/337 668/506/336 681/538/371 +f 669/503/337 681/538/371 670/504/339 +f 670/504/339 682/539/374 957/508/343 +f 668/506/336 953/510/341 680/537/372 +f 983/554/387 686/542/381 982/544/382 +f 688/549/375 683/545/383 687/547/378 +f 987/551/376 978/548/377 688/549/375 +f 686/542/381 687/547/378 685/543/380 +f 689/553/386 691/550/384 686/542/381 +f 990/556/388 987/551/376 690/552/385 +f 690/552/385 688/549/375 691/550/384 +f 991/555/405 689/553/386 983/554/387 +f 682/539/374 689/553/386 977/540/389 +f 681/538/371 680/537/372 691/550/384 +f 680/537/372 973/541/373 690/552/385 +f 681/538/371 691/550/384 682/539/374 +f 685/543/380 684/546/379 694/558/393 +f 982/544/382 685/543/380 997/559/394 +f 683/545/383 692/560/390 684/546/379 +f 978/548/377 993/561/391 683/545/383 +f 997/559/394 694/558/393 1002/563/397 +f 692/560/390 999/564/398 693/557/392 +f 993/561/391 998/566/395 692/560/390 +f 694/558/393 693/557/392 1001/562/396 +f 949/569/401 950/567/331 697/535/344 +f 951/570/399 696/568/353 950/567/331 +f 948/723/446 949/569/401 1005/522/402 +f 952/724/448 1006/512/354 951/570/399 +f 677/520/345 673/529/363 700/523/347 +f 676/513/368 699/516/356 673/529/363 +f 969/521/346 677/520/345 1011/571/406 +f 676/513/368 958/443/355 699/516/356 +f 678/524/348 672/531/365 703/573/351 +f 672/531/365 675/515/369 701/536/366 +f 678/524/348 703/573/351 968/525/349 +f 959/514/358 1013/517/360 675/515/369 +f 960/518/361 1018/574/340 674/519/370 +f 679/526/352 704/505/342 967/527/404 +f 674/519/370 706/511/335 671/534/367 +f 671/534/367 705/507/338 679/526/352 +f 856/579/411 791/575/407 855/577/409 +f 857/583/412 790/578/410 856/579/411 +f 855/577/409 792/576/408 858/581/340 +f 854/647/403 789/582/343 857/583/412 +f 840/641/444 842/584/402 802/586/413 +f 844/645/406 795/587/349 846/589/415 +f 851/606/425 849/590/350 800/592/416 +f 843/608/427 806/593/417 841/595/354 +f 847/644/357 848/596/418 804/598/358 +f 853/646/445 808/599/420 852/601/360 +f 840/641/444 802/586/413 839/603/422 +f 846/589/415 801/588/414 845/605/424 +f 850/609/428 851/606/425 797/607/426 +f 839/603/422 799/602/421 843/608/427 +f 845/605/424 798/604/423 848/596/418 +f 853/646/445 850/609/428 808/599/420 +f 791/575/407 790/578/410 811/611/430 +f 791/575/407 811/611/430 792/576/408 +f 792/576/408 812/612/431 793/580/341 +f 790/578/410 789/582/343 810/610/429 +f 819/627/376 820/615/432 818/617/377 +f 822/622/437 815/618/434 821/620/436 +f 823/624/387 814/621/382 822/622/437 +f 820/615/432 821/620/436 817/616/433 +f 824/626/440 828/623/438 820/615/432 +f 826/629/405 823/624/387 825/625/439 +f 825/625/439 822/622/437 828/623/438 +f 827/628/388 824/626/440 819/627/376 +f 812/612/431 824/626/440 813/613/373 +f 811/611/430 810/610/429 828/623/438 +f 810/610/429 809/614/389 825/625/439 +f 811/611/430 828/623/438 812/612/431 +f 817/616/433 816/619/435 832/631/442 +f 818/617/377 817/616/433 833/632/391 +f 815/618/434 830/633/443 816/619/435 +f 814/621/382 829/634/394 815/618/434 +f 833/632/391 832/631/442 838/636/395 +f 830/633/443 835/637/396 831/630/441 +f 829/634/394 834/639/397 830/633/443 +f 832/631/442 831/630/441 837/635/398 +f 785/642/399 786/640/331 843/608/427 +f 787/643/401 840/641/444 786/640/331 +f 784/725/400 785/642/399 841/595/354 +f 788/726/447 842/584/402 787/643/401 +f 806/593/417 799/602/421 848/596/418 +f 802/586/413 846/589/415 799/602/421 +f 805/594/355 806/593/417 847/644/357 +f 802/586/413 794/585/346 846/589/415 +f 807/597/419 798/604/423 853/646/445 +f 798/604/423 801/588/414 850/609/428 +f 807/597/419 853/646/445 804/598/358 +f 795/587/349 849/590/350 801/588/414 +f 796/591/404 854/647/403 800/592/416 +f 808/599/420 855/577/409 803/600/361 +f 800/592/416 857/583/412 797/607/426 +f 797/607/426 856/579/411 808/599/420 +f 1020/651/411 1019/648/412 955/650/407 +f 1021/655/409 1020/651/411 954/652/408 +f 1019/648/412 1022/653/403 956/649/410 +f 1018/718/340 1021/655/409 953/656/341 +f 1006/717/354 1004/657/427 958/659/355 +f 1008/727/357 1010/660/418 959/662/358 +f 960/728/361 1013/663/360 964/665/420 +f 970/681/413 1007/666/444 969/668/346 +f 971/682/414 1012/669/415 968/671/349 +f 972/683/416 1017/672/425 967/674/404 +f 1004/657/427 1003/675/422 966/658/417 +f 965/661/419 1010/660/418 962/678/423 +f 964/665/420 1015/664/445 961/680/426 +f 1003/675/422 1007/666/444 963/676/421 +f 962/678/423 1009/677/424 971/682/414 +f 1014/679/428 1017/672/425 961/680/426 +f 974/687/431 954/652/408 975/684/430 +f 955/650/407 956/649/410 975/684/430 +f 956/649/410 957/654/343 976/685/429 +f 973/702/373 953/656/341 974/687/431 +f 981/696/434 984/688/437 982/690/382 +f 986/694/432 985/691/436 979/693/433 +f 987/700/376 986/694/432 978/695/377 +f 980/692/435 985/691/436 981/696/434 +f 985/691/436 992/697/438 984/688/437 +f 990/729/388 989/699/440 987/700/376 +f 989/699/440 992/697/438 986/694/432 +f 984/688/437 988/698/439 983/689/387 +f 976/685/429 977/686/389 988/698/439 +f 989/699/440 974/687/431 992/697/438 +f 990/729/388 973/702/373 989/699/440 +f 975/684/430 976/685/429 992/697/438 +f 995/705/441 980/692/435 996/703/443 +f 996/703/443 981/696/434 997/704/394 +f 979/693/433 980/692/435 994/706/442 +f 978/695/377 979/693/433 993/707/391 +f 1001/712/396 996/703/443 1002/708/397 +f 994/706/442 995/705/441 999/710/398 +f 993/707/391 994/706/442 998/711/395 +f 1000/709/97 995/705/441 1001/712/396 +f 1003/675/422 950/713/331 1007/666/444 +f 951/716/399 950/713/331 1004/657/427 +f 1007/666/444 949/714/401 1005/667/402 +f 952/730/448 951/716/399 1006/717/354 +f 963/676/421 970/681/413 1009/677/424 +f 966/658/417 963/676/421 1010/660/418 +f 1012/669/415 970/681/413 1011/670/406 +f 1008/727/357 958/659/355 1010/660/418 +f 962/678/423 971/682/414 1014/679/428 +f 1015/664/445 965/661/419 1014/679/428 +f 971/682/414 968/671/349 1017/672/425 +f 1013/663/360 959/662/358 1015/664/445 +f 960/728/361 964/665/420 1018/718/340 +f 972/683/416 967/674/404 1019/648/412 +f 964/665/420 961/680/426 1021/655/409 +f 961/680/426 972/683/416 1020/651/411 +usemtl None +f 82/731/449 42/732/450 43/733/451 +f 83/734/452 45/735/453 81/736/454 +f 85/737/455 84/738/456 59/739/457 +f 81/736/454 45/735/453 86/740/458 +f 369/741/459 52/742/460 71/743/461 +f 58/744/462 59/739/457 43/745/451 +f 370/746/463 53/747/464 212/748/465 +f 374/749/466 365/750/467 48/751/468 +f 55/752/469 56/753/470 41/754/471 +f 363/755/472 46/756/473 48/751/468 +f 364/757/474 47/758/475 95/759/476 +f 84/738/456 44/760/477 60/761/478 +f 368/762/479 51/763/480 52/742/460 +f 214/764/481 63/765/482 65/766/483 +f 61/767/484 44/760/477 84/738/456 +f 371/768/485 54/769/486 78/770/487 +f 45/771/453 83/772/452 60/761/478 +f 42/773/450 211/774/488 213/775/489 +f 372/776/490 367/777/491 50/778/492 +f 366/779/493 49/780/494 51/763/480 +f 85/737/455 58/744/462 65/781/483 +f 66/782/495 64/783/496 57/784/497 +f 62/785/498 54/769/486 64/786/496 +f 88/787/499 65/766/483 63/765/482 +f 215/788/500 65/781/483 58/744/462 +f 96/789/501 67/790/502 216/791/503 +f 219/792/504 216/791/503 67/790/502 +f 217/793/505 68/794/506 70/795/507 +f 97/796/508 50/778/492 72/797/509 +f 372/776/490 69/798/510 47/758/475 +f 97/796/508 52/742/460 51/763/480 +f 95/759/476 47/758/475 69/798/510 +f 90/799/511 68/794/506 76/800/512 +f 218/801/513 70/795/507 79/802/514 +f 91/803/515 70/795/507 68/794/506 +f 46/756/473 74/804/516 73/805/517 +f 75/806/518 48/751/468 73/805/517 +f 99/807/519 72/797/509 89/808/520 +f 373/809/521 71/743/461 92/810/522 +f 54/769/486 62/785/498 80/811/523 +f 91/803/515 74/804/516 80/811/523 +f 50/778/492 75/806/518 77/812/524 +f 89/808/520 93/813/525 76/800/512 +f 219/792/504 76/800/512 68/794/506 +f 367/777/491 374/749/466 75/806/518 +f 94/814/526 80/811/523 62/785/498 +f 78/770/487 80/811/523 74/804/516 +f 220/815/527 79/802/514 63/765/482 +f 375/816/528 78/770/487 46/756/473 +f 79/802/514 94/814/526 87/817/529 +f 72/797/509 77/812/524 93/813/525 +f 70/795/507 91/803/515 94/814/526 +f 376/818/530 92/810/522 53/747/464 +f 100/819/531 89/808/520 67/790/502 +f 74/804/516 91/803/515 90/799/511 +f 77/812/524 73/805/517 90/799/511 +f 66/820/495 88/787/499 87/817/529 +f 56/753/470 85/737/455 88/821/499 +f 59/739/457 60/761/478 83/772/452 +f 86/822/458 61/767/484 55/752/469 +f 56/753/470 55/752/469 84/738/456 +f 45/771/453 44/760/477 61/767/484 +f 41/823/471 82/731/449 81/736/454 +f 92/810/522 100/819/531 96/789/501 +f 71/743/461 99/807/519 100/819/531 +f 49/780/494 95/759/476 98/824/532 +f 50/778/492 97/796/508 98/824/532 +f 52/742/460 97/796/508 99/807/519 +f 53/747/464 96/789/501 221/825/533 +f 366/779/493 377/826/534 95/759/476 +f 378/827/535 64/786/496 54/769/486 +f 379/828/459 57/784/497 64/783/496 +f 101/829/536 41/754/471 56/753/470 +f 57/784/497 103/830/537 102/831/538 +f 41/823/471 101/832/536 380/833/539 +f 101/832/536 102/834/538 381/835/540 +f 379/828/459 382/836/541 103/830/537 +f 103/830/537 105/837/542 104/838/543 +f 382/836/541 384/839/544 105/837/542 +f 104/840/543 383/841/545 381/835/540 +f 383/842/545 104/838/543 105/837/542 +f 211/843/488 42/732/450 385/844/546 +f 82/731/449 380/833/539 385/844/546 +f 187/845/547 186/846/548 148/847/549 +f 186/846/548 150/848/550 188/849/551 +f 190/850/552 163/851/553 164/852/554 +f 186/846/548 145/853/555 191/854/556 +f 176/855/557 157/856/558 544/857/559 +f 148/858/549 164/852/554 163/851/553 +f 212/748/465 158/859/560 545/860/561 +f 549/861/562 180/862/563 153/863/564 +f 146/864/565 161/865/566 160/866/567 +f 153/863/564 151/867/568 538/868/569 +f 200/869/570 152/870/571 539/871/572 +f 189/872/573 164/852/554 165/873/574 +f 157/856/558 156/874/575 543/875/576 +f 170/876/577 168/877/578 214/764/481 +f 189/872/573 149/878/579 166/879/580 +f 183/880/581 159/881/582 546/882/583 +f 165/873/574 188/883/551 150/884/550 +f 147/885/584 163/851/553 213/775/489 +f 547/886/585 174/887/586 155/888/587 +f 156/874/575 154/889/588 541/890/589 +f 170/891/577 163/851/553 190/850/552 +f 171/892/590 161/865/566 162/893/591 +f 167/894/592 171/895/590 169/896/593 +f 168/877/578 170/876/577 193/897/594 +f 163/851/553 170/891/577 215/788/500 +f 216/791/503 172/898/595 201/899/596 +f 219/792/504 181/900/597 172/898/595 +f 175/901/598 173/902/599 217/793/505 +f 177/903/600 155/888/587 202/904/601 +f 152/870/571 174/887/586 547/886/585 +f 156/874/575 157/856/558 202/904/601 +f 200/869/570 203/905/602 174/887/586 +f 181/900/597 173/902/599 195/906/603 +f 184/907/604 175/901/598 218/801/513 +f 173/902/599 175/901/598 196/908/605 +f 178/909/606 179/910/607 151/867/568 +f 180/862/563 182/911/608 178/909/606 +f 194/912/609 177/903/600 204/913/610 +f 197/914/611 176/855/557 548/915/612 +f 185/916/613 167/894/592 159/881/582 +f 185/916/613 179/910/607 196/908/605 +f 155/888/587 177/903/600 182/911/608 +f 194/912/609 172/898/595 181/900/597 +f 173/902/599 181/900/597 219/792/504 +f 542/917/614 155/888/587 180/862/563 +f 167/894/592 185/916/613 199/918/615 +f 179/910/607 185/916/613 183/880/581 +f 168/877/578 184/907/604 220/815/527 +f 151/867/568 183/880/581 550/919/616 +f 192/920/617 199/918/615 184/907/604 +f 177/903/600 194/912/609 198/921/618 +f 199/918/615 196/908/605 175/901/598 +f 158/859/560 197/914/611 551/922/619 +f 172/898/595 194/912/609 205/923/620 +f 195/906/603 196/908/605 179/910/607 +f 182/911/608 198/921/618 195/906/603 +f 192/920/617 193/897/594 171/895/590 +f 193/924/594 190/850/552 161/865/566 +f 164/852/554 148/858/549 188/883/551 +f 160/866/567 166/879/580 191/925/556 +f 161/865/566 190/850/552 189/872/573 +f 150/884/550 191/925/556 166/879/580 +f 146/926/565 145/853/555 186/846/548 +f 201/899/596 205/923/620 197/914/611 +f 205/923/620 204/913/610 176/855/557 +f 154/889/588 156/874/575 203/905/602 +f 203/905/602 202/904/601 155/888/587 +f 204/913/610 202/904/601 157/856/558 +f 221/825/533 201/899/596 158/859/560 +f 541/890/589 154/889/588 200/869/570 +f 159/881/582 169/896/593 553/927/621 +f 554/928/559 553/929/621 169/930/593 +f 161/865/566 146/864/565 206/931/622 +f 162/893/591 206/931/622 207/932/623 +f 555/933/624 206/934/622 146/926/565 +f 206/934/622 555/933/624 556/935/625 +f 554/928/559 162/893/591 208/936/626 +f 208/936/626 207/932/623 209/937/627 +f 557/938/628 208/936/626 210/939/629 +f 556/935/625 558/940/630 209/941/627 +f 558/942/630 559/943/631 210/939/629 +f 211/843/488 562/944/331 560/945/632 +f 560/945/632 555/933/624 187/845/547 +f 339/946/633 338/947/634 300/948/635 +f 338/947/634 302/949/636 340/950/637 +f 342/951/638 315/952/639 316/953/640 +f 338/947/634 297/954/641 343/955/642 +f 328/956/643 309/957/644 369/958/459 +f 300/959/635 316/953/640 315/952/639 +f 528/960/645 310/961/646 370/962/463 +f 374/963/466 332/964/647 305/965/648 +f 298/966/649 313/967/650 312/968/651 +f 305/965/648 303/969/652 363/970/472 +f 352/971/653 304/972/654 364/973/474 +f 341/974/655 316/953/640 317/975/656 +f 309/957/644 308/976/657 368/977/479 +f 322/978/658 320/979/659 530/980/660 +f 341/974/655 301/981/661 318/982/662 +f 335/983/663 311/984/664 371/985/485 +f 317/975/656 340/986/637 302/987/636 +f 299/988/665 315/952/639 529/989/666 +f 372/990/490 326/991/667 307/992/668 +f 308/976/657 306/993/669 366/994/493 +f 322/995/658 315/952/639 342/951/638 +f 323/996/670 313/967/650 314/997/671 +f 319/998/672 323/999/670 321/1000/673 +f 320/979/659 322/978/658 345/1001/674 +f 315/952/639 322/995/658 531/1002/675 +f 532/1003/676 324/1004/677 353/1005/678 +f 535/1006/679 333/1007/680 324/1004/677 +f 327/1008/681 325/1009/682 533/1010/683 +f 329/1011/684 307/992/668 354/1012/685 +f 304/972/654 326/991/667 372/990/490 +f 308/976/657 309/957/644 354/1012/685 +f 352/971/653 355/1013/686 326/991/667 +f 333/1007/680 325/1009/682 347/1014/687 +f 336/1015/688 327/1008/681 534/1016/689 +f 325/1009/682 327/1008/681 348/1017/690 +f 330/1018/691 331/1019/692 303/969/652 +f 332/964/647 334/1020/693 330/1018/691 +f 346/1021/694 329/1011/684 356/1022/695 +f 349/1023/696 328/956/643 373/1024/521 +f 337/1025/697 319/998/672 311/984/664 +f 337/1025/697 331/1019/692 348/1017/690 +f 307/992/668 329/1011/684 334/1020/693 +f 346/1021/694 324/1004/677 333/1007/680 +f 325/1009/682 333/1007/680 535/1006/679 +f 367/1026/491 307/992/668 332/964/647 +f 319/998/672 337/1025/697 351/1027/698 +f 331/1019/692 337/1025/697 335/983/663 +f 320/979/659 336/1015/688 536/1028/699 +f 303/969/652 335/983/663 375/1029/528 +f 344/1030/700 351/1027/698 336/1015/688 +f 329/1011/684 346/1021/694 350/1031/701 +f 351/1027/698 348/1017/690 327/1008/681 +f 310/961/646 349/1023/696 376/1032/530 +f 324/1004/677 346/1021/694 357/1033/702 +f 347/1014/687 348/1017/690 331/1019/692 +f 334/1020/693 350/1031/701 347/1014/687 +f 344/1030/700 345/1001/674 323/999/670 +f 345/1034/674 342/951/638 313/967/650 +f 316/953/640 300/959/635 340/986/637 +f 312/968/651 318/982/662 343/1035/642 +f 313/967/650 342/951/638 341/974/655 +f 302/987/636 343/1035/642 318/982/662 +f 298/1036/649 297/954/641 338/947/634 +f 353/1005/678 357/1033/702 349/1023/696 +f 357/1033/702 356/1022/695 328/956/643 +f 306/993/669 308/976/657 355/1013/686 +f 355/1013/686 354/1012/685 307/992/668 +f 356/1022/695 354/1012/685 309/957/644 +f 537/1037/703 353/1005/678 310/961/646 +f 366/994/493 306/993/669 352/971/653 +f 311/984/664 321/1000/673 378/1038/535 +f 379/828/459 378/1039/535 321/1040/673 +f 313/967/650 298/966/649 358/1041/704 +f 314/997/671 358/1041/704 359/1042/705 +f 380/833/539 358/1043/704 298/1036/649 +f 358/1043/704 380/833/539 381/835/540 +f 379/828/459 314/997/671 360/1044/706 +f 360/1044/706 359/1042/705 361/1045/707 +f 382/836/541 360/1044/706 362/1046/708 +f 381/835/540 383/841/545 361/1047/707 +f 383/842/545 384/839/544 362/1046/708 +f 527/1048/709 562/944/331 385/844/546 +f 385/844/546 380/833/539 339/946/633 +f 503/1049/710 463/1050/711 464/1051/712 +f 504/1052/713 466/1053/714 502/1054/715 +f 506/1055/716 505/1056/717 480/1057/718 +f 502/1054/715 466/1053/714 507/1058/719 +f 544/1059/559 473/1060/720 492/1061/721 +f 479/1062/722 480/1057/718 464/1063/712 +f 545/1064/561 474/1065/723 528/960/645 +f 549/1066/562 540/1067/724 469/1068/725 +f 476/1069/726 477/1070/727 462/1071/728 +f 538/1072/569 467/1073/729 469/1068/725 +f 539/1074/572 468/1075/730 516/1076/731 +f 505/1056/717 465/1077/732 481/1078/733 +f 543/1079/576 472/1080/734 473/1060/720 +f 530/980/660 484/1081/735 486/1082/736 +f 482/1083/737 465/1077/732 505/1056/717 +f 546/1084/583 475/1085/738 499/1086/739 +f 466/1087/714 504/1088/713 481/1078/733 +f 463/1089/711 527/1090/709 529/989/666 +f 547/1091/585 542/1092/614 471/1093/740 +f 541/1094/589 470/1095/741 472/1080/734 +f 506/1055/716 479/1062/722 486/1096/736 +f 487/1097/742 485/1098/743 478/1099/744 +f 483/1100/745 475/1085/738 485/1101/743 +f 509/1102/746 486/1082/736 484/1081/735 +f 531/1002/675 486/1096/736 479/1062/722 +f 517/1103/747 488/1104/748 532/1003/676 +f 535/1006/679 532/1003/676 488/1104/748 +f 533/1010/683 489/1105/749 491/1106/750 +f 518/1107/751 471/1093/740 493/1108/752 +f 547/1091/585 490/1109/753 468/1075/730 +f 518/1107/751 473/1060/720 472/1080/734 +f 516/1076/731 468/1075/730 490/1109/753 +f 511/1110/754 489/1105/749 497/1111/755 +f 534/1016/689 491/1106/750 500/1112/756 +f 512/1113/757 491/1106/750 489/1105/749 +f 467/1073/729 495/1114/758 494/1115/759 +f 496/1116/760 469/1068/725 494/1115/759 +f 520/1117/761 493/1108/752 510/1118/762 +f 548/1119/612 492/1061/721 513/1120/763 +f 475/1085/738 483/1100/745 501/1121/764 +f 512/1113/757 495/1114/758 501/1121/764 +f 471/1093/740 496/1116/760 498/1122/765 +f 510/1118/762 514/1123/766 497/1111/755 +f 535/1006/679 497/1111/755 489/1105/749 +f 542/1092/614 549/1066/562 496/1116/760 +f 515/1124/767 501/1121/764 483/1100/745 +f 499/1086/739 501/1121/764 495/1114/758 +f 536/1028/699 500/1112/756 484/1081/735 +f 550/1125/616 499/1086/739 467/1073/729 +f 500/1112/756 515/1124/767 508/1126/768 +f 493/1108/752 498/1122/765 514/1123/766 +f 491/1106/750 512/1113/757 515/1124/767 +f 551/1127/619 513/1120/763 474/1065/723 +f 521/1128/769 510/1118/762 488/1104/748 +f 495/1114/758 512/1113/757 511/1110/754 +f 498/1122/765 494/1115/759 511/1110/754 +f 487/1129/742 509/1102/746 508/1126/768 +f 477/1070/727 506/1055/716 509/1130/746 +f 480/1057/718 481/1078/733 504/1088/713 +f 507/1131/719 482/1083/737 476/1069/726 +f 477/1070/727 476/1069/726 505/1056/717 +f 466/1087/714 465/1077/732 482/1083/737 +f 462/1132/728 503/1049/710 502/1054/715 +f 513/1120/763 521/1128/769 517/1103/747 +f 492/1061/721 520/1117/761 521/1128/769 +f 470/1095/741 516/1076/731 519/1133/770 +f 471/1093/740 518/1107/751 519/1133/770 +f 473/1060/720 518/1107/751 520/1117/761 +f 474/1065/723 517/1103/747 537/1037/703 +f 541/1094/589 552/1134/771 516/1076/731 +f 553/1135/621 485/1101/743 475/1085/738 +f 554/928/559 478/1099/744 485/1098/743 +f 522/1136/772 462/1071/728 477/1070/727 +f 478/1099/744 524/1137/773 523/1138/774 +f 462/1132/728 522/1139/772 555/933/624 +f 522/1139/772 523/1140/774 556/935/625 +f 554/928/559 557/938/628 524/1137/773 +f 524/1137/773 526/1141/775 525/1142/776 +f 557/938/628 559/943/631 526/1141/775 +f 525/1143/776 558/940/630 556/935/625 +f 558/942/630 525/1142/776 526/1141/775 +f 527/1048/709 463/1050/711 560/945/632 +f 503/1049/710 555/933/624 560/945/632 +f 81/736/454 82/731/449 43/733/451 +f 43/733/451 83/734/452 81/736/454 +f 58/744/462 85/737/455 59/739/457 +f 40/1144/777 81/736/454 86/740/458 +f 373/809/521 369/741/459 71/743/461 +f 42/773/450 58/744/462 43/745/451 +f 561/1145/97 370/746/463 212/748/465 +f 75/806/518 374/749/466 48/751/468 +f 40/1146/777 55/752/469 41/754/471 +f 365/750/467 363/755/472 48/751/468 +f 377/826/534 364/757/474 95/759/476 +f 59/739/457 84/738/456 60/761/478 +f 369/741/459 368/762/479 52/742/460 +f 215/1147/500 214/764/481 65/766/483 +f 55/752/469 61/767/484 84/738/456 +f 375/816/528 371/768/485 78/770/487 +f 44/760/477 45/771/453 60/761/478 +f 58/744/462 42/773/450 213/775/489 +f 69/798/510 372/776/490 50/778/492 +f 368/762/479 366/779/493 51/763/480 +f 88/821/499 85/737/455 65/781/483 +f 56/753/470 66/782/495 57/784/497 +f 66/820/495 62/785/498 64/786/496 +f 87/817/529 88/787/499 63/765/482 +f 213/775/489 215/788/500 58/744/462 +f 221/825/533 96/789/501 216/791/503 +f 76/800/512 219/792/504 67/790/502 +f 218/801/513 217/793/505 70/795/507 +f 99/807/519 97/796/508 72/797/509 +f 364/757/474 372/776/490 47/758/475 +f 98/824/532 97/796/508 51/763/480 +f 98/824/532 95/759/476 69/798/510 +f 93/813/525 90/799/511 76/800/512 +f 220/815/527 218/801/513 79/802/514 +f 90/799/511 91/803/515 68/794/506 +f 48/751/468 46/756/473 73/805/517 +f 77/812/524 75/806/518 73/805/517 +f 100/819/531 99/807/519 89/808/520 +f 376/818/530 373/809/521 92/810/522 +f 78/770/487 54/769/486 80/811/523 +f 94/814/526 91/803/515 80/811/523 +f 72/797/509 50/778/492 77/812/524 +f 67/790/502 89/808/520 76/800/512 +f 217/793/505 219/792/504 68/794/506 +f 50/778/492 367/777/491 75/806/518 +f 87/817/529 94/814/526 62/785/498 +f 46/756/473 78/770/487 74/804/516 +f 214/764/481 220/815/527 63/765/482 +f 363/755/472 375/816/528 46/756/473 +f 63/765/482 79/802/514 87/817/529 +f 89/808/520 72/797/509 93/813/525 +f 79/802/514 70/795/507 94/814/526 +f 370/746/463 376/818/530 53/747/464 +f 96/789/501 100/819/531 67/790/502 +f 73/805/517 74/804/516 90/799/511 +f 93/813/525 77/812/524 90/799/511 +f 62/785/498 66/820/495 87/817/529 +f 66/782/495 56/753/470 88/821/499 +f 43/745/451 59/739/457 83/772/452 +f 40/1146/777 86/822/458 55/752/469 +f 85/737/455 56/753/470 84/738/456 +f 86/822/458 45/771/453 61/767/484 +f 40/1144/777 41/823/471 81/736/454 +f 53/747/464 92/810/522 96/789/501 +f 92/810/522 71/743/461 100/819/531 +f 51/763/480 49/780/494 98/824/532 +f 69/798/510 50/778/492 98/824/532 +f 71/743/461 52/742/460 99/807/519 +f 212/748/465 53/747/464 221/825/533 +f 49/780/494 366/779/493 95/759/476 +f 371/768/485 378/827/535 54/769/486 +f 378/1039/535 379/828/459 64/783/496 +f 57/784/497 101/829/536 56/753/470 +f 101/829/536 57/784/497 102/831/538 +f 82/731/449 41/823/471 380/833/539 +f 380/833/539 101/832/536 381/835/540 +f 57/784/497 379/828/459 103/830/537 +f 102/831/538 103/830/537 104/838/543 +f 103/830/537 382/836/541 105/837/542 +f 102/834/538 104/840/543 381/835/540 +f 384/839/544 383/842/545 105/837/542 +f 562/944/331 211/843/488 385/844/546 +f 42/732/450 82/731/449 385/844/546 +f 147/1148/584 187/845/547 148/847/549 +f 148/847/549 186/846/548 188/849/551 +f 189/872/573 190/850/552 164/852/554 +f 150/848/550 186/846/548 191/854/556 +f 548/915/612 176/855/557 544/857/559 +f 147/885/584 148/858/549 163/851/553 +f 561/1145/97 212/748/465 545/860/561 +f 540/1149/724 549/861/562 153/863/564 +f 145/1150/555 146/864/565 160/866/567 +f 540/1149/724 153/863/564 538/868/569 +f 552/1151/771 200/869/570 539/871/572 +f 149/878/579 189/872/573 165/873/574 +f 544/857/559 157/856/558 543/875/576 +f 215/1147/500 170/876/577 214/764/481 +f 160/866/567 189/872/573 166/879/580 +f 550/919/616 183/880/581 546/882/583 +f 149/878/579 165/873/574 150/884/550 +f 211/774/488 147/885/584 213/775/489 +f 542/917/614 547/886/585 155/888/587 +f 543/875/576 156/874/575 541/890/589 +f 193/924/594 170/891/577 190/850/552 +f 169/930/593 171/892/590 162/893/591 +f 159/881/582 167/894/592 169/896/593 +f 192/920/617 168/877/578 193/897/594 +f 213/775/489 163/851/553 215/788/500 +f 221/825/533 216/791/503 201/899/596 +f 216/791/503 219/792/504 172/898/595 +f 218/801/513 175/901/598 217/793/505 +f 204/913/610 177/903/600 202/904/601 +f 539/871/572 152/870/571 547/886/585 +f 203/905/602 156/874/575 202/904/601 +f 152/870/571 200/869/570 174/887/586 +f 198/921/618 181/900/597 195/906/603 +f 220/815/527 184/907/604 218/801/513 +f 195/906/603 173/902/599 196/908/605 +f 153/863/564 178/909/606 151/867/568 +f 153/863/564 180/862/563 178/909/606 +f 205/923/620 194/912/609 204/913/610 +f 551/922/619 197/914/611 548/915/612 +f 183/880/581 185/916/613 159/881/582 +f 199/918/615 185/916/613 196/908/605 +f 180/862/563 155/888/587 182/911/608 +f 198/921/618 194/912/609 181/900/597 +f 217/793/505 173/902/599 219/792/504 +f 549/861/562 542/917/614 180/862/563 +f 192/920/617 167/894/592 199/918/615 +f 151/867/568 179/910/607 183/880/581 +f 214/764/481 168/877/578 220/815/527 +f 538/868/569 151/867/568 550/919/616 +f 168/877/578 192/920/617 184/907/604 +f 182/911/608 177/903/600 198/921/618 +f 184/907/604 199/918/615 175/901/598 +f 545/860/561 158/859/560 551/922/619 +f 201/899/596 172/898/595 205/923/620 +f 178/909/606 195/906/603 179/910/607 +f 178/909/606 182/911/608 195/906/603 +f 167/894/592 192/920/617 171/895/590 +f 171/892/590 193/924/594 161/865/566 +f 165/873/574 164/852/554 188/883/551 +f 145/1150/555 160/866/567 191/925/556 +f 160/866/567 161/865/566 189/872/573 +f 149/878/579 150/884/550 166/879/580 +f 187/845/547 146/926/565 186/846/548 +f 158/859/560 201/899/596 197/914/611 +f 197/914/611 205/923/620 176/855/557 +f 200/869/570 154/889/588 203/905/602 +f 174/887/586 203/905/602 155/888/587 +f 176/855/557 204/913/610 157/856/558 +f 212/748/465 221/825/533 158/859/560 +f 552/1151/771 541/890/589 200/869/570 +f 546/882/583 159/881/582 553/927/621 +f 162/893/591 554/928/559 169/930/593 +f 162/893/591 161/865/566 206/931/622 +f 208/936/626 162/893/591 207/932/623 +f 187/845/547 555/933/624 146/926/565 +f 207/1152/623 206/934/622 556/935/625 +f 557/938/628 554/928/559 208/936/626 +f 210/939/629 208/936/626 209/937/627 +f 559/943/631 557/938/628 210/939/629 +f 207/1152/623 556/935/625 209/941/627 +f 209/937/627 558/942/630 210/939/629 +f 147/1148/584 211/843/488 560/945/632 +f 147/1148/584 560/945/632 187/845/547 +f 299/1153/665 339/946/633 300/948/635 +f 300/948/635 338/947/634 340/950/637 +f 341/974/655 342/951/638 316/953/640 +f 302/949/636 338/947/634 343/955/642 +f 373/1024/521 328/956/643 369/958/459 +f 299/988/665 300/959/635 315/952/639 +f 561/1154/97 528/960/645 370/962/463 +f 365/1155/467 374/963/466 305/965/648 +f 297/1156/641 298/966/649 312/968/651 +f 365/1155/467 305/965/648 363/970/472 +f 377/1157/534 352/971/653 364/973/474 +f 301/981/661 341/974/655 317/975/656 +f 369/958/459 309/957/644 368/977/479 +f 531/1158/675 322/978/658 530/980/660 +f 312/968/651 341/974/655 318/982/662 +f 375/1029/528 335/983/663 371/985/485 +f 301/981/661 317/975/656 302/987/636 +f 527/1090/709 299/988/665 529/989/666 +f 367/1026/491 372/990/490 307/992/668 +f 368/977/479 308/976/657 366/994/493 +f 345/1034/674 322/995/658 342/951/638 +f 321/1040/673 323/996/670 314/997/671 +f 311/984/664 319/998/672 321/1000/673 +f 344/1030/700 320/979/659 345/1001/674 +f 529/989/666 315/952/639 531/1002/675 +f 537/1037/703 532/1003/676 353/1005/678 +f 532/1003/676 535/1006/679 324/1004/677 +f 534/1016/689 327/1008/681 533/1010/683 +f 356/1022/695 329/1011/684 354/1012/685 +f 364/973/474 304/972/654 372/990/490 +f 355/1013/686 308/976/657 354/1012/685 +f 304/972/654 352/971/653 326/991/667 +f 350/1031/701 333/1007/680 347/1014/687 +f 536/1028/699 336/1015/688 534/1016/689 +f 347/1014/687 325/1009/682 348/1017/690 +f 305/965/648 330/1018/691 303/969/652 +f 305/965/648 332/964/647 330/1018/691 +f 357/1033/702 346/1021/694 356/1022/695 +f 376/1032/530 349/1023/696 373/1024/521 +f 335/983/663 337/1025/697 311/984/664 +f 351/1027/698 337/1025/697 348/1017/690 +f 332/964/647 307/992/668 334/1020/693 +f 350/1031/701 346/1021/694 333/1007/680 +f 533/1010/683 325/1009/682 535/1006/679 +f 374/963/466 367/1026/491 332/964/647 +f 344/1030/700 319/998/672 351/1027/698 +f 303/969/652 331/1019/692 335/983/663 +f 530/980/660 320/979/659 536/1028/699 +f 363/970/472 303/969/652 375/1029/528 +f 320/979/659 344/1030/700 336/1015/688 +f 334/1020/693 329/1011/684 350/1031/701 +f 336/1015/688 351/1027/698 327/1008/681 +f 370/962/463 310/961/646 376/1032/530 +f 353/1005/678 324/1004/677 357/1033/702 +f 330/1018/691 347/1014/687 331/1019/692 +f 330/1018/691 334/1020/693 347/1014/687 +f 319/998/672 344/1030/700 323/999/670 +f 323/996/670 345/1034/674 313/967/650 +f 317/975/656 316/953/640 340/986/637 +f 297/1156/641 312/968/651 343/1035/642 +f 312/968/651 313/967/650 341/974/655 +f 301/981/661 302/987/636 318/982/662 +f 339/946/633 298/1036/649 338/947/634 +f 310/961/646 353/1005/678 349/1023/696 +f 349/1023/696 357/1033/702 328/956/643 +f 352/971/653 306/993/669 355/1013/686 +f 326/991/667 355/1013/686 307/992/668 +f 328/956/643 356/1022/695 309/957/644 +f 528/960/645 537/1037/703 310/961/646 +f 377/1157/534 366/994/493 352/971/653 +f 371/985/485 311/984/664 378/1038/535 +f 314/997/671 379/828/459 321/1040/673 +f 314/997/671 313/967/650 358/1041/704 +f 360/1044/706 314/997/671 359/1042/705 +f 339/946/633 380/833/539 298/1036/649 +f 359/1159/705 358/1043/704 381/835/540 +f 382/836/541 379/828/459 360/1044/706 +f 362/1046/708 360/1044/706 361/1045/707 +f 384/839/544 382/836/541 362/1046/708 +f 359/1159/705 381/835/540 361/1047/707 +f 361/1045/707 383/842/545 362/1046/708 +f 299/1153/665 527/1048/709 385/844/546 +f 299/1153/665 385/844/546 339/946/633 +f 502/1054/715 503/1049/710 464/1051/712 +f 464/1051/712 504/1052/713 502/1054/715 +f 479/1062/722 506/1055/716 480/1057/718 +f 461/1160/778 502/1054/715 507/1058/719 +f 548/1119/612 544/1059/559 492/1061/721 +f 463/1089/711 479/1062/722 464/1063/712 +f 561/1154/97 545/1064/561 528/960/645 +f 496/1116/760 549/1066/562 469/1068/725 +f 461/1161/778 476/1069/726 462/1071/728 +f 540/1067/724 538/1072/569 469/1068/725 +f 552/1134/771 539/1074/572 516/1076/731 +f 480/1057/718 505/1056/717 481/1078/733 +f 544/1059/559 543/1079/576 473/1060/720 +f 531/1158/675 530/980/660 486/1082/736 +f 476/1069/726 482/1083/737 505/1056/717 +f 550/1125/616 546/1084/583 499/1086/739 +f 465/1077/732 466/1087/714 481/1078/733 +f 479/1062/722 463/1089/711 529/989/666 +f 490/1109/753 547/1091/585 471/1093/740 +f 543/1079/576 541/1094/589 472/1080/734 +f 509/1130/746 506/1055/716 486/1096/736 +f 477/1070/727 487/1097/742 478/1099/744 +f 487/1129/742 483/1100/745 485/1101/743 +f 508/1126/768 509/1102/746 484/1081/735 +f 529/989/666 531/1002/675 479/1062/722 +f 537/1037/703 517/1103/747 532/1003/676 +f 497/1111/755 535/1006/679 488/1104/748 +f 534/1016/689 533/1010/683 491/1106/750 +f 520/1117/761 518/1107/751 493/1108/752 +f 539/1074/572 547/1091/585 468/1075/730 +f 519/1133/770 518/1107/751 472/1080/734 +f 519/1133/770 516/1076/731 490/1109/753 +f 514/1123/766 511/1110/754 497/1111/755 +f 536/1028/699 534/1016/689 500/1112/756 +f 511/1110/754 512/1113/757 489/1105/749 +f 469/1068/725 467/1073/729 494/1115/759 +f 498/1122/765 496/1116/760 494/1115/759 +f 521/1128/769 520/1117/761 510/1118/762 +f 551/1127/619 548/1119/612 513/1120/763 +f 499/1086/739 475/1085/738 501/1121/764 +f 515/1124/767 512/1113/757 501/1121/764 +f 493/1108/752 471/1093/740 498/1122/765 +f 488/1104/748 510/1118/762 497/1111/755 +f 533/1010/683 535/1006/679 489/1105/749 +f 471/1093/740 542/1092/614 496/1116/760 +f 508/1126/768 515/1124/767 483/1100/745 +f 467/1073/729 499/1086/739 495/1114/758 +f 530/980/660 536/1028/699 484/1081/735 +f 538/1072/569 550/1125/616 467/1073/729 +f 484/1081/735 500/1112/756 508/1126/768 +f 510/1118/762 493/1108/752 514/1123/766 +f 500/1112/756 491/1106/750 515/1124/767 +f 545/1064/561 551/1127/619 474/1065/723 +f 517/1103/747 521/1128/769 488/1104/748 +f 494/1115/759 495/1114/758 511/1110/754 +f 514/1123/766 498/1122/765 511/1110/754 +f 483/1100/745 487/1129/742 508/1126/768 +f 487/1097/742 477/1070/727 509/1130/746 +f 464/1063/712 480/1057/718 504/1088/713 +f 461/1161/778 507/1131/719 476/1069/726 +f 506/1055/716 477/1070/727 505/1056/717 +f 507/1131/719 466/1087/714 482/1083/737 +f 461/1160/778 462/1132/728 502/1054/715 +f 474/1065/723 513/1120/763 517/1103/747 +f 513/1120/763 492/1061/721 521/1128/769 +f 472/1080/734 470/1095/741 519/1133/770 +f 490/1109/753 471/1093/740 519/1133/770 +f 492/1061/721 473/1060/720 520/1117/761 +f 528/960/645 474/1065/723 537/1037/703 +f 470/1095/741 541/1094/589 516/1076/731 +f 546/1084/583 553/1135/621 475/1085/738 +f 553/929/621 554/928/559 485/1098/743 +f 478/1099/744 522/1136/772 477/1070/727 +f 522/1136/772 478/1099/744 523/1138/774 +f 503/1049/710 462/1132/728 555/933/624 +f 555/933/624 522/1139/772 556/935/625 +f 478/1099/744 554/928/559 524/1137/773 +f 523/1138/774 524/1137/773 525/1142/776 +f 524/1137/773 557/938/628 526/1141/775 +f 523/1140/774 525/1143/776 556/935/625 +f 559/943/631 558/942/630 526/1141/775 +f 562/944/331 527/1048/709 560/945/632 +f 463/1050/711 503/1049/710 560/945/632 +f 38/1162/779 2/1163/780 3/1164/781 +f 1/1165/782 2/1163/780 38/1162/779 +f 37/1166/783 3/1164/781 231/1167/784 +f 227/1168/785 1/1165/782 39/1169/786 +f 280/1170/787 232/1171/788 9/1172/789 +f 282/1173/790 233/1174/791 8/1175/792 +f 287/1176/793 234/1177/794 7/1178/795 +f 10/1179/796 243/1180/797 279/1181/798 +f 11/1182/799 242/1183/800 285/1184/801 +f 12/1185/802 241/1186/803 290/1187/804 +f 29/1188/805 9/1172/789 6/1189/806 +f 32/1190/807 8/1175/792 5/1191/808 +f 35/1192/809 7/1178/795 4/1193/810 +f 6/1189/806 10/1179/796 30/1194/811 +f 5/1191/808 11/1182/799 33/1195/812 +f 4/1193/810 12/1185/802 36/1196/813 +f 1/1165/782 13/1197/814 14/1198/815 +f 14/1198/815 15/1199/816 3/1164/781 +f 15/1199/816 251/1200/817 231/1167/784 +f 227/1168/785 247/1201/818 13/1197/814 +f 19/1202/819 18/1203/820 256/1204/821 +f 16/1205/822 17/1206/823 20/1207/824 +f 252/1208/825 16/1205/822 21/1209/826 +f 20/1207/824 17/1206/823 18/1203/820 +f 24/1210/827 20/1207/824 19/1202/819 +f 261/1211/828 21/1209/826 23/1212/829 +f 21/1209/826 20/1207/824 24/1210/827 +f 22/1213/830 19/1202/819 257/1214/831 +f 22/1213/830 265/1215/832 251/1200/817 +f 13/1197/814 23/1212/829 24/1210/827 +f 247/1201/818 264/1216/833 23/1212/829 +f 24/1210/827 22/1213/830 15/1199/816 +f 17/1206/823 26/1217/834 27/1218/835 +f 18/1203/820 27/1218/835 271/1219/836 +f 25/1220/837 26/1217/834 17/1206/823 +f 267/1221/838 25/1220/837 16/1205/822 +f 27/1218/835 275/1222/839 276/1223/840 +f 273/1224/841 274/1225/331 26/1217/834 +f 272/1226/842 273/1224/841 25/1220/837 +f 26/1217/834 274/1225/331 275/1222/839 +f 224/1227/97 28/1228/843 30/1194/811 +f 29/1188/805 28/1228/843 224/1227/97 +f 30/1194/811 279/1181/798 222/1229/844 +f 226/1230/845 280/1170/787 29/1188/805 +f 31/1231/846 33/1195/812 10/1179/796 +f 9/1172/789 32/1190/807 31/1231/846 +f 33/1195/812 285/1184/801 243/1180/797 +f 232/1171/788 282/1173/790 32/1190/807 +f 34/1232/847 36/1196/813 11/1182/799 +f 8/1175/792 35/1192/809 34/1232/847 +f 11/1182/799 36/1196/813 290/1187/804 +f 287/1176/793 35/1192/809 8/1175/792 +f 292/1233/848 39/1169/786 7/1178/795 +f 12/1185/802 37/1166/783 296/1234/849 +f 39/1169/786 38/1162/779 4/1193/810 +f 4/1193/810 38/1162/779 37/1166/783 +f 143/1235/779 142/1236/786 108/1237/782 +f 143/1235/779 107/1238/780 106/1239/781 +f 142/1236/786 460/1240/848 395/1241/785 +f 144/1242/783 106/1239/781 391/1243/784 +f 444/1244/798 134/1245/811 114/1246/796 +f 446/1247/801 137/1248/812 113/1249/799 +f 451/1250/804 140/1251/813 112/1252/802 +f 443/1253/787 407/1254/788 115/1255/789 +f 449/1256/790 406/1257/791 116/1258/792 +f 454/1259/793 405/1260/794 117/1261/795 +f 134/1245/811 133/1262/843 111/1263/806 +f 137/1248/812 136/1264/846 110/1265/808 +f 140/1251/813 139/1266/847 109/1267/810 +f 135/1268/805 115/1255/789 111/1263/806 +f 138/1269/807 116/1258/792 110/1265/808 +f 141/1270/809 117/1261/795 109/1267/810 +f 106/1239/781 107/1238/780 119/1271/815 +f 108/1237/782 120/1272/814 119/1271/815 +f 395/1241/785 415/1273/818 120/1272/814 +f 391/1243/784 106/1239/781 118/1274/816 +f 124/1275/826 421/1276/828 420/1277/825 +f 125/1278/824 122/1279/823 121/1280/820 +f 126/1281/819 121/1280/820 416/1282/821 +f 125/1278/824 124/1275/826 123/1283/822 +f 129/1284/827 127/1285/829 124/1275/826 +f 128/1286/830 126/1281/819 425/1287/831 +f 129/1284/827 125/1278/824 126/1281/819 +f 127/1285/829 429/1288/833 421/1276/828 +f 415/1273/818 429/1288/833 127/1285/829 +f 118/1274/816 119/1271/815 129/1284/827 +f 411/1289/817 118/1274/816 128/1286/830 +f 120/1272/814 127/1285/829 129/1284/827 +f 122/1279/823 123/1283/822 132/1290/837 +f 123/1283/822 420/1277/825 435/1291/838 +f 122/1279/823 131/1292/834 130/1293/835 +f 121/1280/820 130/1293/835 431/1294/836 +f 132/1290/837 435/1291/838 440/1295/842 +f 131/1292/834 438/1296/331 437/1297/839 +f 130/1293/835 437/1297/839 436/1298/840 +f 131/1292/834 132/1290/837 439/1299/841 +f 388/1300/97 387/1301/850 135/1268/805 +f 388/1300/97 133/1262/843 134/1245/811 +f 386/1302/845 443/1253/787 135/1268/805 +f 390/1303/844 389/1304/851 134/1245/811 +f 115/1255/789 138/1269/807 136/1264/846 +f 114/1246/796 111/1263/806 136/1264/846 +f 407/1254/788 449/1256/790 138/1269/807 +f 396/1305/797 114/1246/796 137/1248/812 +f 116/1258/792 141/1270/809 139/1266/847 +f 110/1265/808 139/1266/847 140/1251/813 +f 116/1258/792 406/1257/791 454/1259/793 +f 113/1249/799 140/1251/813 451/1250/804 +f 112/1252/802 144/1242/783 456/1306/849 +f 117/1261/795 405/1260/794 460/1240/848 +f 109/1267/810 143/1235/779 144/1242/783 +f 109/1267/810 117/1261/795 142/1236/786 +f 294/1307/852 293/1308/853 230/1309/854 +f 294/1307/852 229/1310/855 228/1311/856 +f 293/1308/853 296/1312/849 231/1313/784 +f 295/1314/857 228/1311/856 227/1315/785 +f 280/1316/787 278/1317/858 240/1318/859 +f 282/1319/790 284/1320/860 239/1321/861 +f 287/1322/793 289/1323/862 238/1324/863 +f 279/1325/798 243/1326/797 244/1327/864 +f 285/1328/801 242/1329/800 245/1330/865 +f 290/1331/804 241/1332/803 246/1333/866 +f 278/1317/858 277/1334/867 237/1335/868 +f 284/1320/860 283/1336/869 236/1337/870 +f 289/1323/862 288/1338/871 235/1339/872 +f 281/1340/873 244/1327/864 237/1335/868 +f 286/1341/874 245/1330/865 236/1337/870 +f 291/1342/875 246/1333/866 235/1339/872 +f 228/1311/856 229/1310/855 249/1343/876 +f 230/1309/854 250/1344/877 249/1343/876 +f 231/1313/784 251/1345/817 250/1344/877 +f 227/1315/785 228/1311/856 248/1346/878 +f 258/1347/879 257/1348/831 256/1349/821 +f 259/1350/880 254/1351/881 253/1352/882 +f 260/1353/883 253/1352/882 252/1354/825 +f 259/1350/880 258/1347/879 255/1355/884 +f 266/1356/885 262/1357/886 258/1347/879 +f 263/1358/887 260/1353/883 261/1359/828 +f 266/1356/885 259/1350/880 260/1353/883 +f 262/1357/886 265/1360/832 257/1348/831 +f 251/1345/817 265/1360/832 262/1357/886 +f 248/1346/878 249/1343/876 266/1356/885 +f 247/1361/818 248/1346/878 263/1358/887 +f 250/1344/877 262/1357/886 266/1356/885 +f 254/1351/881 255/1355/884 270/1362/888 +f 255/1355/884 256/1349/821 271/1363/836 +f 254/1351/881 269/1364/889 268/1365/890 +f 253/1352/882 268/1365/890 267/1366/838 +f 270/1362/888 271/1363/836 276/1367/840 +f 269/1364/889 274/1368/331 273/1369/841 +f 268/1365/890 273/1369/841 272/1370/842 +f 269/1364/889 270/1362/888 275/1371/839 +f 224/1372/97 223/1373/851 281/1340/873 +f 224/1372/97 277/1334/867 278/1317/858 +f 222/1374/844 279/1325/798 281/1340/873 +f 226/1375/845 225/1376/850 278/1317/858 +f 244/1327/864 286/1341/874 283/1336/869 +f 240/1318/859 237/1335/868 283/1336/869 +f 243/1326/797 285/1328/801 286/1341/874 +f 232/1377/788 240/1318/859 284/1320/860 +f 245/1330/865 291/1342/875 288/1338/871 +f 236/1337/870 288/1338/871 289/1323/862 +f 245/1330/865 242/1329/800 290/1331/804 +f 239/1321/861 289/1323/862 287/1322/793 +f 238/1324/863 295/1314/857 292/1378/848 +f 246/1333/866 241/1332/803 296/1312/849 +f 235/1339/872 294/1307/852 295/1314/857 +f 235/1339/872 246/1333/866 293/1308/853 +f 458/1379/852 393/1380/855 394/1381/856 +f 392/1382/854 393/1380/855 458/1379/852 +f 457/1383/857 394/1381/856 395/1384/785 +f 391/1385/784 392/1382/854 459/1386/853 +f 444/1387/798 396/1388/797 404/1389/864 +f 446/1390/801 397/1391/800 403/1392/865 +f 451/1393/804 398/1394/803 402/1395/866 +f 408/1396/859 407/1397/788 443/1398/787 +f 409/1399/861 406/1400/791 449/1401/790 +f 410/1402/863 405/1403/794 454/1404/793 +f 442/1405/873 404/1389/864 401/1406/868 +f 448/1407/874 403/1392/865 400/1408/870 +f 453/1409/875 402/1395/866 399/1410/872 +f 401/1406/868 408/1396/859 445/1411/858 +f 400/1408/870 409/1399/861 450/1412/860 +f 399/1410/872 410/1402/863 455/1413/862 +f 392/1382/854 412/1414/877 413/1415/876 +f 413/1415/876 414/1416/878 394/1381/856 +f 414/1416/878 415/1417/818 395/1384/785 +f 391/1385/784 411/1418/817 412/1414/877 +f 422/1419/883 419/1420/882 420/1421/825 +f 417/1422/884 418/1423/881 423/1424/880 +f 416/1425/821 417/1422/884 424/1426/879 +f 423/1424/880 418/1423/881 419/1420/882 +f 430/1427/885 423/1424/880 422/1419/883 +f 425/1428/831 424/1426/879 427/1429/886 +f 424/1426/879 423/1424/880 430/1427/885 +f 426/1430/887 422/1419/883 421/1431/828 +f 426/1430/887 429/1432/833 415/1417/818 +f 412/1414/877 427/1429/886 430/1427/885 +f 411/1418/817 428/1433/832 427/1429/886 +f 430/1427/885 426/1430/887 414/1416/878 +f 418/1423/881 433/1434/889 434/1435/890 +f 419/1420/882 434/1435/890 435/1436/838 +f 432/1437/888 433/1434/889 418/1423/881 +f 431/1438/836 432/1437/888 417/1422/884 +f 434/1435/890 439/1439/841 440/1440/842 +f 437/1441/839 438/1442/331 433/1434/889 +f 436/1443/840 437/1441/839 432/1437/888 +f 433/1434/889 438/1442/331 439/1439/841 +f 388/1444/97 441/1445/867 445/1411/858 +f 442/1405/873 441/1445/867 388/1444/97 +f 445/1411/858 443/1398/787 386/1446/845 +f 390/1447/844 444/1387/798 442/1405/873 +f 447/1448/869 450/1412/860 408/1396/859 +f 404/1389/864 448/1407/874 447/1448/869 +f 450/1412/860 449/1401/790 407/1397/788 +f 396/1388/797 446/1390/801 448/1407/874 +f 452/1449/871 455/1413/862 409/1399/861 +f 403/1392/865 453/1409/875 452/1449/871 +f 409/1399/861 455/1413/862 454/1404/793 +f 451/1393/804 453/1409/875 403/1392/865 +f 456/1450/849 459/1386/853 402/1395/866 +f 410/1402/863 457/1383/857 460/1451/848 +f 459/1386/853 458/1379/852 399/1410/872 +f 399/1410/872 458/1379/852 457/1383/857 +f 37/1166/783 38/1162/779 3/1164/781 +f 39/1169/786 1/1165/782 38/1162/779 +f 296/1234/849 37/1166/783 231/1167/784 +f 292/1233/848 227/1168/785 39/1169/786 +f 29/1188/805 280/1170/787 9/1172/789 +f 32/1190/807 282/1173/790 8/1175/792 +f 35/1192/809 287/1176/793 7/1178/795 +f 30/1194/811 10/1179/796 279/1181/798 +f 33/1195/812 11/1182/799 285/1184/801 +f 36/1196/813 12/1185/802 290/1187/804 +f 28/1228/843 29/1188/805 6/1189/806 +f 31/1231/846 32/1190/807 5/1191/808 +f 34/1232/847 35/1192/809 4/1193/810 +f 28/1228/843 6/1189/806 30/1194/811 +f 31/1231/846 5/1191/808 33/1195/812 +f 34/1232/847 4/1193/810 36/1196/813 +f 2/1163/780 1/1165/782 14/1198/815 +f 2/1163/780 14/1198/815 3/1164/781 +f 3/1164/781 15/1199/816 231/1167/784 +f 1/1165/782 227/1168/785 13/1197/814 +f 257/1214/831 19/1202/819 256/1204/821 +f 21/1209/826 16/1205/822 20/1207/824 +f 261/1211/828 252/1208/825 21/1209/826 +f 19/1202/819 20/1207/824 18/1203/820 +f 22/1213/830 24/1210/827 19/1202/819 +f 264/1216/833 261/1211/828 23/1212/829 +f 23/1212/829 21/1209/826 24/1210/827 +f 265/1215/832 22/1213/830 257/1214/831 +f 15/1199/816 22/1213/830 251/1200/817 +f 14/1198/815 13/1197/814 24/1210/827 +f 13/1197/814 247/1201/818 23/1212/829 +f 14/1198/815 24/1210/827 15/1199/816 +f 18/1203/820 17/1206/823 27/1218/835 +f 256/1204/821 18/1203/820 271/1219/836 +f 16/1205/822 25/1220/837 17/1206/823 +f 252/1208/825 267/1221/838 16/1205/822 +f 271/1219/836 27/1218/835 276/1223/840 +f 25/1220/837 273/1224/841 26/1217/834 +f 267/1221/838 272/1226/842 25/1220/837 +f 27/1218/835 26/1217/834 275/1222/839 +f 223/1452/851 224/1227/97 30/1194/811 +f 225/1453/850 29/1188/805 224/1227/97 +f 223/1452/851 30/1194/811 222/1229/844 +f 225/1453/850 226/1230/845 29/1188/805 +f 6/1189/806 31/1231/846 10/1179/796 +f 6/1189/806 9/1172/789 31/1231/846 +f 10/1179/796 33/1195/812 243/1180/797 +f 9/1172/789 232/1171/788 32/1190/807 +f 5/1191/808 34/1232/847 11/1182/799 +f 5/1191/808 8/1175/792 34/1232/847 +f 242/1183/800 11/1182/799 290/1187/804 +f 233/1174/791 287/1176/793 8/1175/792 +f 234/1177/794 292/1233/848 7/1178/795 +f 241/1186/803 12/1185/802 296/1234/849 +f 7/1178/795 39/1169/786 4/1193/810 +f 12/1185/802 4/1193/810 37/1166/783 +f 107/1238/780 143/1235/779 108/1237/782 +f 144/1242/783 143/1235/779 106/1239/781 +f 108/1237/782 142/1236/786 395/1241/785 +f 456/1306/849 144/1242/783 391/1243/784 +f 396/1305/797 444/1244/798 114/1246/796 +f 397/1454/800 446/1247/801 113/1249/799 +f 398/1455/803 451/1250/804 112/1252/802 +f 135/1268/805 443/1253/787 115/1255/789 +f 138/1269/807 449/1256/790 116/1258/792 +f 141/1270/809 454/1259/793 117/1261/795 +f 114/1246/796 134/1245/811 111/1263/806 +f 113/1249/799 137/1248/812 110/1265/808 +f 112/1252/802 140/1251/813 109/1267/810 +f 133/1262/843 135/1268/805 111/1263/806 +f 136/1264/846 138/1269/807 110/1265/808 +f 139/1266/847 141/1270/809 109/1267/810 +f 118/1274/816 106/1239/781 119/1271/815 +f 107/1238/780 108/1237/782 119/1271/815 +f 108/1237/782 395/1241/785 120/1272/814 +f 411/1289/817 391/1243/784 118/1274/816 +f 123/1283/822 124/1275/826 420/1277/825 +f 126/1281/819 125/1278/824 121/1280/820 +f 425/1287/831 126/1281/819 416/1282/821 +f 122/1279/823 125/1278/824 123/1283/822 +f 125/1278/824 129/1284/827 124/1275/826 +f 428/1456/832 128/1286/830 425/1287/831 +f 128/1286/830 129/1284/827 126/1281/819 +f 124/1275/826 127/1285/829 421/1276/828 +f 120/1272/814 415/1273/818 127/1285/829 +f 128/1286/830 118/1274/816 129/1284/827 +f 428/1456/832 411/1289/817 128/1286/830 +f 119/1271/815 120/1272/814 129/1284/827 +f 131/1292/834 122/1279/823 132/1290/837 +f 132/1290/837 123/1283/822 435/1291/838 +f 121/1280/820 122/1279/823 130/1293/835 +f 416/1282/821 121/1280/820 431/1294/836 +f 439/1299/841 132/1290/837 440/1295/842 +f 130/1293/835 131/1292/834 437/1297/839 +f 431/1294/836 130/1293/835 436/1298/840 +f 438/1296/331 131/1292/834 439/1299/841 +f 133/1262/843 388/1300/97 135/1268/805 +f 389/1304/851 388/1300/97 134/1245/811 +f 387/1301/850 386/1302/845 135/1268/805 +f 444/1244/798 390/1303/844 134/1245/811 +f 111/1263/806 115/1255/789 136/1264/846 +f 137/1248/812 114/1246/796 136/1264/846 +f 115/1255/789 407/1254/788 138/1269/807 +f 446/1247/801 396/1305/797 137/1248/812 +f 110/1265/808 116/1258/792 139/1266/847 +f 113/1249/799 110/1265/808 140/1251/813 +f 141/1270/809 116/1258/792 454/1259/793 +f 397/1454/800 113/1249/799 451/1250/804 +f 398/1455/803 112/1252/802 456/1306/849 +f 142/1236/786 117/1261/795 460/1240/848 +f 112/1252/802 109/1267/810 144/1242/783 +f 143/1235/779 109/1267/810 142/1236/786 +f 229/1310/855 294/1307/852 230/1309/854 +f 295/1314/857 294/1307/852 228/1311/856 +f 230/1309/854 293/1308/853 231/1313/784 +f 292/1378/848 295/1314/857 227/1315/785 +f 232/1377/788 280/1316/787 240/1318/859 +f 233/1457/791 282/1319/790 239/1321/861 +f 234/1458/794 287/1322/793 238/1324/863 +f 281/1340/873 279/1325/798 244/1327/864 +f 286/1341/874 285/1328/801 245/1330/865 +f 291/1342/875 290/1331/804 246/1333/866 +f 240/1318/859 278/1317/858 237/1335/868 +f 239/1321/861 284/1320/860 236/1337/870 +f 238/1324/863 289/1323/862 235/1339/872 +f 277/1334/867 281/1340/873 237/1335/868 +f 283/1336/869 286/1341/874 236/1337/870 +f 288/1338/871 291/1342/875 235/1339/872 +f 248/1346/878 228/1311/856 249/1343/876 +f 229/1310/855 230/1309/854 249/1343/876 +f 230/1309/854 231/1313/784 250/1344/877 +f 247/1361/818 227/1315/785 248/1346/878 +f 255/1355/884 258/1347/879 256/1349/821 +f 260/1353/883 259/1350/880 253/1352/882 +f 261/1359/828 260/1353/883 252/1354/825 +f 254/1351/881 259/1350/880 255/1355/884 +f 259/1350/880 266/1356/885 258/1347/879 +f 264/1459/833 263/1358/887 261/1359/828 +f 263/1358/887 266/1356/885 260/1353/883 +f 258/1347/879 262/1357/886 257/1348/831 +f 250/1344/877 251/1345/817 262/1357/886 +f 263/1358/887 248/1346/878 266/1356/885 +f 264/1459/833 247/1361/818 263/1358/887 +f 249/1343/876 250/1344/877 266/1356/885 +f 269/1364/889 254/1351/881 270/1362/888 +f 270/1362/888 255/1355/884 271/1363/836 +f 253/1352/882 254/1351/881 268/1365/890 +f 252/1354/825 253/1352/882 267/1366/838 +f 275/1371/839 270/1362/888 276/1367/840 +f 268/1365/890 269/1364/889 273/1369/841 +f 267/1366/838 268/1365/890 272/1370/842 +f 274/1368/331 269/1364/889 275/1371/839 +f 277/1334/867 224/1372/97 281/1340/873 +f 225/1376/850 224/1372/97 278/1317/858 +f 223/1373/851 222/1374/844 281/1340/873 +f 280/1316/787 226/1375/845 278/1317/858 +f 237/1335/868 244/1327/864 283/1336/869 +f 284/1320/860 240/1318/859 283/1336/869 +f 244/1327/864 243/1326/797 286/1341/874 +f 282/1319/790 232/1377/788 284/1320/860 +f 236/1337/870 245/1330/865 288/1338/871 +f 239/1321/861 236/1337/870 289/1323/862 +f 291/1342/875 245/1330/865 290/1331/804 +f 233/1457/791 239/1321/861 287/1322/793 +f 234/1458/794 238/1324/863 292/1378/848 +f 293/1308/853 246/1333/866 296/1312/849 +f 238/1324/863 235/1339/872 295/1314/857 +f 294/1307/852 235/1339/872 293/1308/853 +f 457/1383/857 458/1379/852 394/1381/856 +f 459/1386/853 392/1382/854 458/1379/852 +f 460/1451/848 457/1383/857 395/1384/785 +f 456/1450/849 391/1385/784 459/1386/853 +f 442/1405/873 444/1387/798 404/1389/864 +f 448/1407/874 446/1390/801 403/1392/865 +f 453/1409/875 451/1393/804 402/1395/866 +f 445/1411/858 408/1396/859 443/1398/787 +f 450/1412/860 409/1399/861 449/1401/790 +f 455/1413/862 410/1402/863 454/1404/793 +f 441/1445/867 442/1405/873 401/1406/868 +f 447/1448/869 448/1407/874 400/1408/870 +f 452/1449/871 453/1409/875 399/1410/872 +f 441/1445/867 401/1406/868 445/1411/858 +f 447/1448/869 400/1408/870 450/1412/860 +f 452/1449/871 399/1410/872 455/1413/862 +f 393/1380/855 392/1382/854 413/1415/876 +f 393/1380/855 413/1415/876 394/1381/856 +f 394/1381/856 414/1416/878 395/1384/785 +f 392/1382/854 391/1385/784 412/1414/877 +f 421/1431/828 422/1419/883 420/1421/825 +f 424/1426/879 417/1422/884 423/1424/880 +f 425/1428/831 416/1425/821 424/1426/879 +f 422/1419/883 423/1424/880 419/1420/882 +f 426/1430/887 430/1427/885 422/1419/883 +f 428/1433/832 425/1428/831 427/1429/886 +f 427/1429/886 424/1426/879 430/1427/885 +f 429/1432/833 426/1430/887 421/1431/828 +f 414/1416/878 426/1430/887 415/1417/818 +f 413/1415/876 412/1414/877 430/1427/885 +f 412/1414/877 411/1418/817 427/1429/886 +f 413/1415/876 430/1427/885 414/1416/878 +f 419/1420/882 418/1423/881 434/1435/890 +f 420/1421/825 419/1420/882 435/1436/838 +f 417/1422/884 432/1437/888 418/1423/881 +f 416/1425/821 431/1438/836 417/1422/884 +f 435/1436/838 434/1435/890 440/1440/842 +f 432/1437/888 437/1441/839 433/1434/889 +f 431/1438/836 436/1443/840 432/1437/888 +f 434/1435/890 433/1434/889 439/1439/841 +f 387/1460/850 388/1444/97 445/1411/858 +f 389/1461/851 442/1405/873 388/1444/97 +f 387/1460/850 445/1411/858 386/1446/845 +f 389/1461/851 390/1447/844 442/1405/873 +f 401/1406/868 447/1448/869 408/1396/859 +f 401/1406/868 404/1389/864 447/1448/869 +f 408/1396/859 450/1412/860 407/1397/788 +f 404/1389/864 396/1388/797 448/1407/874 +f 400/1408/870 452/1449/871 409/1399/861 +f 400/1408/870 403/1392/865 452/1449/871 +f 406/1400/791 409/1399/861 454/1404/793 +f 397/1391/800 451/1393/804 403/1392/865 +f 398/1394/803 456/1450/849 402/1395/866 +f 405/1403/794 410/1402/863 460/1451/848 +f 402/1395/866 459/1386/853 399/1410/872 +f 410/1402/863 399/1410/872 457/1383/857 diff --git a/assets/Models/Test/Ball/SquidTexture.png b/assets/Models/Test/Ball/SquidTexture.png new file mode 100644 index 0000000..e52c834 Binary files /dev/null and b/assets/Models/Test/Ball/SquidTexture.png differ diff --git a/deps/bin/msvc12/x64/OpenAL32.dll b/deps/bin/msvc12/x64/OpenAL32.dll new file mode 100644 index 0000000..02ecaf3 Binary files /dev/null and b/deps/bin/msvc12/x64/OpenAL32.dll differ diff --git a/deps/bin/msvc12/x64/soft_oal.dll b/deps/bin/msvc12/x64/soft_oal.dll new file mode 100644 index 0000000..a718bdc Binary files /dev/null and b/deps/bin/msvc12/x64/soft_oal.dll differ diff --git a/deps/lib/mingw/x64/libbgfx.a b/deps/lib/mingw/x64/libbgfx.a deleted file mode 100755 index 5fccbf5..0000000 Binary files a/deps/lib/mingw/x64/libbgfx.a and /dev/null differ diff --git a/deps/lib/mingw/x64/libbgfxd.a b/deps/lib/mingw/x64/libbgfxd.a deleted file mode 100755 index 4ccd75b..0000000 Binary files a/deps/lib/mingw/x64/libbgfxd.a and /dev/null differ diff --git a/deps/lib/msvc12/x64/OpenAL32.def b/deps/lib/msvc12/x64/OpenAL32.def new file mode 100644 index 0000000..6cd7ffa --- /dev/null +++ b/deps/lib/msvc12/x64/OpenAL32.def @@ -0,0 +1,187 @@ +EXPORTS + alAuxiliaryEffectSlotf + alAuxiliaryEffectSlotfv + alAuxiliaryEffectSloti + alAuxiliaryEffectSlotiv + alBuffer3f + alBuffer3i + alBufferData + alBufferSamplesSOFT + alBufferSubDataSOFT + alBufferSubSamplesSOFT + alBufferf + alBufferfv + alBufferi + alBufferiv + alDeferUpdatesSOFT + alDeleteAuxiliaryEffectSlots + alDeleteBuffers + alDeleteEffects + alDeleteFilters + alDeleteFontsoundsSOFT + alDeletePresetsSOFT + alDeleteSoundfontsSOFT + alDeleteSources + alDisable + alDistanceModel + alDopplerFactor + alDopplerVelocity + alEffectf + alEffectfv + alEffecti + alEffectiv + alEnable + alFilterf + alFilterfv + alFilteri + alFilteriv + alFontsound2iSOFT + alFontsoundModulatoriSOFT + alFontsoundiSOFT + alFontsoundivSOFT + alGenAuxiliaryEffectSlots + alGenBuffers + alGenEffects + alGenFilters + alGenFontsoundsSOFT + alGenPresetsSOFT + alGenSoundfontsSOFT + alGenSources + alGetAuxiliaryEffectSlotf + alGetAuxiliaryEffectSlotfv + alGetAuxiliaryEffectSloti + alGetAuxiliaryEffectSlotiv + alGetBoolean + alGetBooleanv + alGetBuffer3f + alGetBuffer3i + alGetBufferSamplesSOFT + alGetBufferf + alGetBufferfv + alGetBufferi + alGetBufferiv + alGetDouble + alGetDoublev + alGetEffectf + alGetEffectfv + alGetEffecti + alGetEffectiv + alGetEnumValue + alGetError + alGetFilterf + alGetFilterfv + alGetFilteri + alGetFilteriv + alGetFloat + alGetFloatv + alGetFontsoundModulatorivSOFT + alGetFontsoundivSOFT + alGetInteger + alGetInteger64SOFT + alGetInteger64vSOFT + alGetIntegerv + alGetListener3f + alGetListener3i + alGetListenerf + alGetListenerfv + alGetListeneri + alGetListeneriv + alGetPresetivSOFT + alGetProcAddress + alGetSoundfontivSOFT + alGetSource3dSOFT + alGetSource3f + alGetSource3i + alGetSource3i64SOFT + alGetSourcedSOFT + alGetSourcedvSOFT + alGetSourcef + alGetSourcefv + alGetSourcei + alGetSourcei64SOFT + alGetSourcei64vSOFT + alGetSourceiv + alGetString + alIsAuxiliaryEffectSlot + alIsBuffer + alIsBufferFormatSupportedSOFT + alIsEffect + alIsEnabled + alIsExtensionPresent + alIsFilter + alIsFontsoundSOFT + alIsPresetSOFT + alIsSoundfontSOFT + alIsSource + alListener3f + alListener3i + alListenerf + alListenerfv + alListeneri + alListeneriv + alLoadSoundfontSOFT + alMidiEventSOFT + alMidiGainSOFT + alMidiPauseSOFT + alMidiPlaySOFT + alMidiResetSOFT + alMidiSoundfontSOFT + alMidiSoundfontvSOFT + alMidiStopSOFT + alMidiSysExSOFT + alPresetFontsoundsSOFT + alPresetiSOFT + alPresetivSOFT + alProcessUpdatesSOFT + alSoundfontPresetsSOFT + alSource3dSOFT + alSource3f + alSource3i + alSource3i64SOFT + alSourcePause + alSourcePausev + alSourcePlay + alSourcePlayv + alSourceQueueBuffers + alSourceRewind + alSourceRewindv + alSourceStop + alSourceStopv + alSourceUnqueueBuffers + alSourcedSOFT + alSourcedvSOFT + alSourcef + alSourcefv + alSourcei + alSourcei64SOFT + alSourcei64vSOFT + alSourceiv + alSpeedOfSound + alcCaptureCloseDevice + alcCaptureOpenDevice + alcCaptureSamples + alcCaptureStart + alcCaptureStop + alcCloseDevice + alcCreateContext + alcDestroyContext + alcDevicePauseSOFT + alcDeviceResumeSOFT + alcGetContextsDevice + alcGetCurrentContext + alcGetEnumValue + alcGetError + alcGetInteger64vSOFT + alcGetIntegerv + alcGetProcAddress + alcGetString + alcGetThreadContext + alcIsExtensionPresent + alcIsRenderFormatSupportedSOFT + alcLoopbackOpenDeviceSOFT + alcMakeContextCurrent + alcOpenDevice + alcProcessContext + alcRenderSamplesSOFT + alcSetThreadContext + alcSuspendContext diff --git a/deps/lib/msvc12/x64/OpenAL32.lib b/deps/lib/msvc12/x64/OpenAL32.lib new file mode 100644 index 0000000..88dfed1 Binary files /dev/null and b/deps/lib/msvc12/x64/OpenAL32.lib differ diff --git a/deps/lib/msvc12/x64/liquidfun.lib b/deps/lib/msvc12/x64/liquidfun.lib new file mode 100644 index 0000000..830cc0d Binary files /dev/null and b/deps/lib/msvc12/x64/liquidfun.lib differ diff --git a/deps/lib/msvc12/x64/liquidfund.lib b/deps/lib/msvc12/x64/liquidfund.lib new file mode 100644 index 0000000..1ed03fb Binary files /dev/null and b/deps/lib/msvc12/x64/liquidfund.lib differ diff --git a/include/Core/Engine.h b/include/Core/Engine.h index f55f5f4..9c9904f 100755 --- a/include/Core/Engine.h +++ b/include/Core/Engine.h @@ -45,6 +45,7 @@ #include "Game/CPad.h" #include "Game/CBrick.h" #include "Game/BallSystem.h" +#include "Game/HitLagSystem.h" #include "Game/Bricks/CPowerUpBrick.h" #include "Physics/PhysicsSystem.h" @@ -113,10 +114,6 @@ public: m_World->ComponentFactory.Register(); m_World->ComponentFactory.Register(); - m_World->SystemFactory.Register( - [this]() { return new Systems::PhysicsSystem(m_World.get(), m_EventBroker); }); - m_World->AddSystem(); - m_World->SystemFactory.Register( [this]() { return new Systems::LevelSystem(m_World.get(), m_EventBroker); }); m_World->AddSystem(); @@ -126,6 +123,12 @@ public: m_World->SystemFactory.Register( [this]() { return new Systems::BallSystem(m_World.get(), m_EventBroker); }); m_World->AddSystem(); + m_World->SystemFactory.Register( + [this]() { return new Systems::HitLagSystem(m_World.get(), m_EventBroker); }); + m_World->AddSystem(); + m_World->SystemFactory.Register( + [this]() { return new Systems::PhysicsSystem(m_World.get(), m_EventBroker); }); + m_World->AddSystem(); m_World->ComponentFactory.Register(); m_World->ComponentFactory.Register(); @@ -135,31 +138,6 @@ public: m_World->ComponentFactory.Register(); m_World->Initialize(); - - //OctoBall - { - auto ent = m_World->CreateEntity(); - std::shared_ptr transform = m_World->AddComponent(ent); - transform->Position = glm::vec3(-0.f, 0.26f, -9.f); - transform->Scale = glm::vec3(0.5f, 0.5f, 0.5f); - transform->Velocity = glm::vec3(0.0f, -10.f, 0.f); - auto model = m_World->AddComponent(ent); - model->ModelFile = "Models/Test/Ball/Ballopus.obj"; - std::shared_ptr circleShape = m_World->AddComponent(ent); - std::shared_ptr ball = m_World->AddComponent(ent); - ball->Speed = 5.f; - std::shared_ptr physics = m_World->AddComponent(ent); - physics->Static = false; - physics->Category = CollisionLayer::Type::Ball; - physics->Mask = CollisionLayer::Type::Pad | CollisionLayer::Type::Brick | CollisionLayer::Type::Wall; - physics->Calculate = true; - - auto plight = m_World->AddComponent(ent); - plight->Radius = 2.f; - - m_World->CommitEntity(ent); - } - //PointLightTest { auto t_Light = m_World->CreateEntity(); @@ -207,6 +185,7 @@ public: m_World->CommitEntity(background); } +// auto particleEmitter= m_World->AddComponent(Pe); //Water test { auto t_waterBody = m_World->CreateEntity(); @@ -271,64 +250,35 @@ public: //TODO: Why does the ball not collide with these bricks? //BottomBox { - auto topWall = m_World->CreateEntity(); - auto transform = m_World->AddComponent(topWall); - transform->Position = glm::vec3(0.f, -7.f, -9.9f); - transform->Scale = glm::vec3(10.f, 0.5f, 1.f); - std::shared_ptr sprite = m_World->AddComponent(topWall); + auto BottomWall = m_World->CreateEntity(); + auto transform = m_World->AddComponent(BottomWall); + transform->Position = glm::vec3(0.f, -6.f, -10.f); + transform->Scale = glm::vec3(20.f, 0.5f, 1.f); + std::shared_ptr sprite = m_World->AddComponent(BottomWall); sprite->SpriteFile = "Textures/Core/ErrorTexture.png"; - std::shared_ptr boxShape = m_World->AddComponent( - topWall); - std::shared_ptr physics = m_World->AddComponent(topWall); - physics->Static = true; - m_World->CommitEntity(topWall); + std::shared_ptr rectangleShape = m_World->AddComponent(BottomWall); + rectangleShape->Dimensions = glm::vec2(20.f, 0.5f); + std::shared_ptr physics = m_World->AddComponent(BottomWall); + physics->CollisionType = CollisionType::Type::Static; + m_World->CommitEntity(BottomWall); } - //SideBox -// { -// auto topWall = m_World->CreateEntity(); -// std::shared_ptr transform = m_World->AddComponent(topWall); -// transform->Position = glm::vec3(3.f, -3.0f, -9.9f); -// transform->Scale = glm::vec3(0.5f, 3.f, 1.f); -// std::shared_ptr sprite = m_World->AddComponent(topWall); -// sprite->SpriteFile = "Textures/Core/ErrorTexture.png"; -// std::shared_ptr boxShape = m_World->AddComponent( -// topWall); -// std::shared_ptr physics = m_World->AddComponent(topWall); -// physics->Static = true; -// m_World->CommitEntity(topWall); -// } -// //OtherSideBox -// { -// auto topWall = m_World->CreateEntity(); -// std::shared_ptr transform = m_World->AddComponent(topWall); -// transform->Position = glm::vec3(-4.f, -3.0f, -9.9f); -// transform->Scale = glm::vec3(0.5f, 3.0f, 1.f); -// std::shared_ptr sprite = m_World->AddComponent(topWall); -// sprite->SpriteFile = "Textures/Core/ErrorTexture.png"; -// std::shared_ptr boxShape = m_World->AddComponent( -// topWall); -// std::shared_ptr physics = m_World->AddComponent(topWall); -// physics->Static = true; -// m_World->CommitEntity(topWall); -// } { auto topWall = m_World->CreateEntity(); - std::shared_ptr transform = m_World->AddComponent( - topWall); + std::shared_ptr transform = m_World->AddComponent(topWall); transform->Position = glm::vec3(0.f, 6.f, -10.f); transform->Scale = glm::vec3(20.f, 0.5f, 1.f); std::shared_ptr sprite = m_World->AddComponent(topWall); sprite->SpriteFile = "Textures/Core/ErrorTexture.png"; - std::shared_ptr boxShape = m_World->AddComponent( - topWall); + std::shared_ptr rectangleShape = m_World->AddComponent(topWall); + rectangleShape->Dimensions = glm::vec2(20.f, 0.5f); std::shared_ptr physics = m_World->AddComponent(topWall); - physics->Static = true; - physics->Category = CollisionLayer::Type::Wall; - physics->Mask = CollisionLayer::Type::Ball | CollisionLayer::Type::Brick; + physics->CollisionType = CollisionType::Type::Static; + physics->Category = CollisionLayer::Wall; + physics->Mask = static_cast(CollisionLayer::Ball | CollisionLayer::Brick); m_World->CommitEntity(topWall); } @@ -343,13 +293,13 @@ public: std::shared_ptr sprite = m_World->AddComponent(leftWall); sprite->SpriteFile = "Textures/Core/ErrorTexture.png"; - std::shared_ptr boxShape = m_World->AddComponent( - leftWall); + std::shared_ptr rectangleShape = m_World->AddComponent(leftWall); + rectangleShape->Dimensions = glm::vec2(0.5f, 20.f); std::shared_ptr physics = m_World->AddComponent(leftWall); - physics->Static = true; - physics->Category = CollisionLayer::Type::Wall; - physics->Mask = CollisionLayer::Type::Ball | CollisionLayer::Type::Brick; + physics->CollisionType = CollisionType::Type::Static; + physics->Category = CollisionLayer::Wall; + physics->Mask = static_cast(CollisionLayer::Ball | CollisionLayer::Brick); m_World->CommitEntity(leftWall); } @@ -364,37 +314,16 @@ public: std::shared_ptr sprite = m_World->AddComponent(rightWall); sprite->SpriteFile = "Textures/Core/ErrorTexture.png"; - std::shared_ptr boxShape = m_World->AddComponent( - rightWall); + std::shared_ptr rectangleShape = m_World->AddComponent(rightWall); + rectangleShape->Dimensions = glm::vec2(0.5f, 20.f); std::shared_ptr physics = m_World->AddComponent(rightWall); - physics->Static = true; - physics->Category = CollisionLayer::Type::Wall; - physics->Mask = CollisionLayer::Type::Ball | CollisionLayer::Type::Brick; - + physics->CollisionType = CollisionType::Type::Static; + physics->Category = CollisionLayer::Wall; + physics->Mask = static_cast(CollisionLayer::Ball | CollisionLayer::Brick); m_World->CommitEntity(rightWall); } - { - auto ent = m_World->CreateEntity(); - m_World->SetProperty(ent, "Name", "Pad"); - auto ctransform = m_World->AddComponent(ent); - ctransform->Position = glm::vec3(0.f, -3.5f, -10.f); - ctransform->Scale = glm::vec3(1.0f, 1.0f, 1.f); - auto rectangle = m_World->AddComponent(ent); - auto physics = m_World->AddComponent(ent); - physics->Static = false; - physics->Category = CollisionLayer::Type::Pad; - physics->Mask = CollisionLayer::Type::Ball | CollisionLayer::Type::PowerUp; - physics->Calculate = true; - auto cModel = m_World->AddComponent(ent); - cModel->ModelFile = "Models/Submarine2.obj"; - - auto pad = m_World->AddComponent(ent); - m_World->CommitEntity(ent); - } - - //EVENT_SUBSCRIBE_MEMBER(m_EGameStart, &Engine::OnGameStart); m_EGameStart = decltype(m_EGameStart)(std::bind(&Engine::OnGameStart, this, std::placeholders::_1)); m_EventBroker->Subscribe(m_EGameStart); @@ -605,17 +534,19 @@ private: //Todo: Move this { dd::Events::PlaySound e; - e.path = "Sounds/BGM/under-the-sea-instrumental.wav"; - e.isAmbient = true; + e.FilePath = "Sounds/BGM/under-the-sea-instrumental.wav"; + e.IsAmbient = true; m_EventBroker->Publish(e); } { dd::Events::PlaySound e; - e.path = "Sounds/BGM/water-flowing.wav"; - e.volume = 0.3f; - e.isAmbient = true; + e.FilePath = "Sounds/BGM/water-flowing.wav"; + e.Gain = 0.3f; + e.IsAmbient = true; m_EventBroker->Publish(e); } + + return true; }; double m_LastTime; }; diff --git a/include/Core/Engine.h.orig b/include/Core/Engine.h.orig deleted file mode 100644 index f19102e..0000000 --- a/include/Core/Engine.h.orig +++ /dev/null @@ -1,562 +0,0 @@ -/* - This file is part of Daydream Engine. - Copyright 2014 Adam Byléhn, Tobias Dahl, Simon Holmberg, Viktor Ljung - - Daydream Engine is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - Daydream Engine is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with Daydream Engine. If not, see . -*/ - -#include -#include -#include - -#include "ResourceManager.h" -#include "OBJ.h" -#include "Model.h" -#include "Texture.h" -#include "EventBroker.h" -#include "RenderQueue.h" -#include "Renderer.h" -#include "InputManager.h" -//TODO: Remove includes that are only here for the temporary draw solution. -#include "World.h" -#include "CTransform.h" -#include "Core/EventBroker.h" -#include "Rendering/CModel.h" -#include "Rendering/CSprite.h" -#include "CTemplate.h" -#include "Rendering/CPointLight.h" -#include "Transform/TransformSystem.h" -#include "Sound/SoundSystem.h" -#include "Sound/CCollisionSound.h" -#include "Game/LevelSystem.h" -#include "Game/PadSystem.h" -#include "Game/CBall.h" -#include "Game/CPad.h" -#include "Game/CBrick.h" -#include "Game/BallSystem.h" -#include "Game/Bricks/CPowerUpBrick.h" - -#include "Physics/PhysicsSystem.h" -#include "Physics/CPhysics.h" -#include "Physics/CRectangleShape.h" -#include "Physics/ESetImpulse.h" -#include "Physics/CWaterVolume.h" - -#include "Game/EGameStart.h" -#include "Sound/EPlaySound.h" - -#include "GUI/Frame.h" -#include "GUI/Button.h" -#include "Game/MainMenu.h" -#include "Game/HUD.h" - -namespace dd -{ - -class Engine -{ - -public: - Engine(int argc, char* argv[]) { - m_EventBroker = std::make_shared(); - - m_Renderer = std::make_shared(); - m_Renderer->SetFullscreen(false); - //m_Renderer->SetResolution(Rectangle(0, 0, 1920, 1080)); - m_Renderer->SetResolution(Rectangle(0, 0, 675, 1080)); - m_Renderer->Initialize(); - - m_FrameStack = new GUI::Frame(m_EventBroker.get()); - m_FrameStack->Width = 675; - m_FrameStack->Height = 1080; - auto hud = new GUI::HUD(m_FrameStack, "HUD"); - auto menu = new GUI::MainMenu(m_FrameStack, "MainMenu"); - - m_InputManager = std::make_shared(m_Renderer->Window(), m_EventBroker); - - m_World = std::make_shared(m_EventBroker); - - //TODO: Move this out of engine.h - m_World->ComponentFactory.Register(); - m_World->SystemFactory.Register( - [this]() { return new Systems::TransformSystem(m_World.get(), m_EventBroker); }); - m_World->AddSystem(); - m_World->ComponentFactory.Register(); - m_World->ComponentFactory.Register(); - - m_World->ComponentFactory.Register(); - m_World->SystemFactory.Register( - [this]() { return new Systems::SoundSystem(m_World.get(), m_EventBroker); }); - m_World->AddSystem(); - - m_World->ComponentFactory.Register(); - - m_World->ComponentFactory.Register(); - m_World->ComponentFactory.Register(); - m_World->ComponentFactory.Register(); - m_World->ComponentFactory.Register(); - m_World->ComponentFactory.Register(); - m_World->ComponentFactory.Register(); - - m_World->ComponentFactory.Register(); - m_World->ComponentFactory.Register(); - - m_World->SystemFactory.Register( - [this]() { return new Systems::PhysicsSystem(m_World.get(), m_EventBroker); }); - m_World->AddSystem(); - - m_World->SystemFactory.Register( - [this]() { return new Systems::LevelSystem(m_World.get(), m_EventBroker); }); - m_World->AddSystem(); - m_World->SystemFactory.Register( - [this]() { return new Systems::PadSystem(m_World.get(), m_EventBroker); }); - m_World->AddSystem(); - m_World->SystemFactory.Register( - [this]() { return new Systems::BallSystem(m_World.get(), m_EventBroker); }); - m_World->AddSystem(); - - m_World->ComponentFactory.Register(); - m_World->ComponentFactory.Register(); - m_World->ComponentFactory.Register(); - m_World->ComponentFactory.Register(); - m_World->Initialize(); - - - //OctoBall - { - auto ent = m_World->CreateEntity(); - std::shared_ptr transform = m_World->AddComponent(ent); - transform->Position = glm::vec3(-0.f, 0.26f, -9.f); - transform->Scale = glm::vec3(0.5f, 0.5f, 0.5f); - transform->Velocity = glm::vec3(0.0f, -10.f, 0.f); - auto model = m_World->AddComponent(ent); - model->ModelFile = "Models/Test/Ball/Ballopus.obj"; - std::shared_ptr circleShape = m_World->AddComponent(ent); - std::shared_ptr ball = m_World->AddComponent(ent); - ball->Speed = 5.f; -<<<<<<< HEAD - std::shared_ptr physics = m_World->AddComponent(ent); - physics->Static = false; - physics->Category = CollisionLayer::Type::Ball; - physics->Mask = CollisionLayer::Type::Pad | CollisionLayer::Type::Brick | CollisionLayer::Type::Wall; - physics->Calculate = true; -======= - std::shared_ptr physics = m_World->AddComponent(ent); - physics->Static = false; ->>>>>>> origin/master - - auto plight = m_World->AddComponent(ent); - plight->Radius = 2.f; - - m_World->CommitEntity(ent); - } - - //PointLightTest - { - auto t_Light = m_World->CreateEntity(); - auto transform = m_World->AddComponent(t_Light); - transform->Position = glm::vec3(2.f, 1.5f, -9.f); - auto pl = m_World->AddComponent(t_Light); - pl->Radius = 8.f; - m_World->CommitEntity(t_Light); - } - - //Halfpipe background test model. - { - auto t_halfPipe = m_World->CreateEntity(); - auto transform = m_World->AddComponent(t_halfPipe); - transform->Position = glm::vec3(0.f, 0.f, -15.f); - transform->Scale = glm::vec3(15.f); - auto model = m_World->AddComponent(t_halfPipe); - model->ModelFile = "Models/Test/halfpipe/Halfpipe.obj"; - model->Color = glm::vec4(1.f, 1.f, 1.f, 0.3f); - m_World->CommitEntity(t_halfPipe); - } - - //Background - { - auto background = m_World->CreateEntity(); - auto transform = m_World->AddComponent(background); - transform->Position = glm::vec3(0.f, 0.f, -30.f); - transform->Scale = glm::vec3(2681.f / 50.f, 1080.f / 50.f, 1.f); - auto sprite = m_World->AddComponent(background); - sprite->SpriteFile = "Textures/Background.png"; - m_World->CommitEntity(background); - } - - //Water test - { - auto t_waterBody = m_World->CreateEntity(); - auto transform = m_World->AddComponent(t_waterBody); - transform->Position = glm::vec3(0.f, -4.5f, -10.f); - transform->Scale = glm::vec3(7.f, 1.5f, 1.f); - auto water = m_World->AddComponent(t_waterBody); - auto body = m_World->AddComponent(t_waterBody); - m_World->CommitEntity(t_waterBody); - } - //TODO: Why does the ball not collide with these bricks? - //BottomBox - { - auto topWall = m_World->CreateEntity(); - auto transform = m_World->AddComponent(topWall); - transform->Position = glm::vec3(0.f, -6.f, -9.9f); - transform->Scale = glm::vec3(10.f, 0.5f, 1.f); - std::shared_ptr sprite = m_World->AddComponent(topWall); - sprite->SpriteFile = "Textures/Core/ErrorTexture.png"; - std::shared_ptr boxShape = m_World->AddComponent( - topWall); - std::shared_ptr physics = m_World->AddComponent(topWall); - physics->Static = true; - m_World->CommitEntity(topWall); - } - //SideBox -// { -// auto topWall = m_World->CreateEntity(); -// std::shared_ptr transform = m_World->AddComponent(topWall); -// transform->Position = glm::vec3(3.f, -3.0f, -9.9f); -// transform->Scale = glm::vec3(0.5f, 3.f, 1.f); -// std::shared_ptr sprite = m_World->AddComponent(topWall); -// sprite->SpriteFile = "Textures/Core/ErrorTexture.png"; -// std::shared_ptr boxShape = m_World->AddComponent( -// topWall); -// std::shared_ptr physics = m_World->AddComponent(topWall); -// physics->Static = true; -// m_World->CommitEntity(topWall); -// } -// //OtherSideBox -// { -// auto topWall = m_World->CreateEntity(); -// std::shared_ptr transform = m_World->AddComponent(topWall); -// transform->Position = glm::vec3(-4.f, -3.0f, -9.9f); -// transform->Scale = glm::vec3(0.5f, 3.0f, 1.f); -// std::shared_ptr sprite = m_World->AddComponent(topWall); -// sprite->SpriteFile = "Textures/Core/ErrorTexture.png"; -// std::shared_ptr boxShape = m_World->AddComponent( -// topWall); -// std::shared_ptr physics = m_World->AddComponent(topWall); -// physics->Static = true; -// m_World->CommitEntity(topWall); -// } - - { - auto topWall = m_World->CreateEntity(); - std::shared_ptr transform = m_World->AddComponent( - topWall); - transform->Position = glm::vec3(0.f, 6.f, -10.f); - transform->Scale = glm::vec3(20.f, 0.5f, 1.f); - - std::shared_ptr sprite = m_World->AddComponent(topWall); - sprite->SpriteFile = "Textures/Core/ErrorTexture.png"; - - std::shared_ptr boxShape = m_World->AddComponent( - topWall); - - std::shared_ptr physics = m_World->AddComponent(topWall); - physics->Static = true; - physics->Category = CollisionLayer::Type::Wall; - physics->Mask = CollisionLayer::Type::Ball | CollisionLayer::Type::Brick; - - m_World->CommitEntity(topWall); - } - - { - auto leftWall = m_World->CreateEntity(); - std::shared_ptr transform = m_World->AddComponent( - leftWall); - transform->Position = glm::vec3(-4.f, 1.f, -10.f); - transform->Scale = glm::vec3(0.5f, 20.f, 1.f); - - std::shared_ptr sprite = m_World->AddComponent(leftWall); - sprite->SpriteFile = "Textures/Core/ErrorTexture.png"; - - std::shared_ptr boxShape = m_World->AddComponent( - leftWall); - - std::shared_ptr physics = m_World->AddComponent(leftWall); - physics->Static = true; - physics->Category = CollisionLayer::Type::Wall; - physics->Mask = CollisionLayer::Type::Ball | CollisionLayer::Type::Brick; - - m_World->CommitEntity(leftWall); - } - - { - auto rightWall = m_World->CreateEntity(); - std::shared_ptr transform = m_World->AddComponent( - rightWall); - transform->Position = glm::vec3(4.f, 1.f, -10.f); - transform->Scale = glm::vec3(0.5f, 20.f, 1.f); - - std::shared_ptr sprite = m_World->AddComponent(rightWall); - sprite->SpriteFile = "Textures/Core/ErrorTexture.png"; - - std::shared_ptr boxShape = m_World->AddComponent( - rightWall); - - std::shared_ptr physics = m_World->AddComponent(rightWall); - physics->Static = true; - physics->Category = CollisionLayer::Type::Wall; - physics->Mask = CollisionLayer::Type::Ball | CollisionLayer::Type::Brick; - - m_World->CommitEntity(rightWall); - } - - { - auto ent = m_World->CreateEntity(); - m_World->SetProperty(ent, "Name", "Pad"); - auto ctransform = m_World->AddComponent(ent); - ctransform->Position = glm::vec3(0.f, -5.f, -10.f); - ctransform->Scale = glm::vec3(1.0f, 1.0f, 1.f); - auto rectangle = m_World->AddComponent(ent); - auto physics = m_World->AddComponent(ent); - physics->Static = false; - physics->Category = CollisionLayer::Type::Pad; - physics->Mask = CollisionLayer::Type::Ball | CollisionLayer::Type::PowerUp; - physics->Calculate = true; - auto cModel = m_World->AddComponent(ent); - cModel->ModelFile = "Models/Submarine2.obj"; - - auto pad = m_World->AddComponent(ent); - m_World->CommitEntity(ent); - } - - - //EVENT_SUBSCRIBE_MEMBER(m_EGameStart, &Engine::OnGameStart); - m_EGameStart = decltype(m_EGameStart)(std::bind(&Engine::OnGameStart, this, std::placeholders::_1)); - m_EventBroker->Subscribe(m_EGameStart); - - m_LastTime = glfwGetTime(); - } - - bool Running() const { return !glfwWindowShouldClose(m_Renderer->Window()); } - - void Tick() - { - double currentTime = glfwGetTime(); - double dt = currentTime - m_LastTime; - m_LastTime = currentTime; - - // Update input - m_InputManager->Update(dt); - // Swap event queues to get fresh input data in the read queue - //m_EventBroker->Swap(); - - ResourceManager::Update(); - if (m_GameIsRunning) { - m_World->Update(dt); - } - m_EventBroker->Process(); - m_FrameStack->UpdateLayered(dt); - - m_RendererQueue.Clear(); - m_FrameStack->DrawLayered(m_RendererQueue); - //TODO Fill up the renderQueue with models (Temp fix) - if (m_GameIsRunning) { - TEMPAddToRenderQueue(); - } - - // Render scene - //TODO send renderqueue to draw. - m_Renderer->Draw(m_RendererQueue); - - m_EventBroker->Process(); - // Swap event queues - m_EventBroker->Swap(); - - glfwPollEvents(); - } - - std::shared_ptr m_TransformSystem; - std::shared_ptr m_LevelSystem; - - //TODO: Get this out of engine.h - void TEMPAddToRenderQueue() - { - if (!m_TransformSystem) - m_TransformSystem = m_World->GetSystem(); - - for (auto &pair : *m_World->GetEntities()) - { - EntityID entity = pair.first; - - auto templateComponent = m_World->GetComponent(entity); - if (templateComponent) - continue; - - auto transform = m_World->GetComponent(entity); - if (!transform) - continue; - - auto modelComponent = m_World->GetComponent(entity); - if (modelComponent) - { - Model* modelAsset = nullptr; - modelAsset = ResourceManager::Load(modelComponent->ModelFile); - - if (modelAsset) - { - Components::Transform absoluteTransform = m_TransformSystem->AbsoluteTransform(entity); - glm::mat4 modelMatrix = glm::translate(glm::mat4(), absoluteTransform.Position) - * glm::toMat4(absoluteTransform.Orientation) - * glm::scale(absoluteTransform.Scale); - EnqueueModel(modelAsset, modelMatrix, modelComponent->Transparent, modelComponent->Color, modelComponent->ModelFile); - } - } - - auto pointLightComponent = m_World->GetComponent(entity); - if (pointLightComponent) - { - Components::Transform absoluteTransform = m_TransformSystem->AbsoluteTransform(entity); - EnqueuePointLight(absoluteTransform.Position, - pointLightComponent->Diffuse, - pointLightComponent->Specular, - pointLightComponent->Radius); - } - - auto parent = m_World->GetEntityParent(entity); - if(parent != 0) { - auto waterParticleComponent = m_World->GetComponent(parent); - if (waterParticleComponent) { - //TODO: Remove hardcoded color. - //TODO: Do i even need modelMatrix? - Components::Transform absoluteTransform = m_TransformSystem->AbsoluteTransform(entity); - glm::mat4 modelMatrix = glm::translate(absoluteTransform.Position) - * glm::scale(absoluteTransform.Scale); - EnqueueWaterParticles(absoluteTransform.Position, glm::vec4(1.f, 1.f, 1.f, 1.f), modelMatrix, absoluteTransform.Position.z); - } - } - - - auto spriteComponent = m_World->GetComponent(entity); - if (spriteComponent) - { - - std::string normal = spriteComponent->NormalTexture; - std::string spec = spriteComponent->SpecularTexture; - - if (normal.empty()) { - normal = "Textures/Core/NeutralNormalMap.png"; - } - if (spec.empty()) { - spec = "Textures/Core/NeutralSpecularMap.png"; - } - auto texturediff = ResourceManager::Load(spriteComponent->SpriteFile); - auto texturenorm = ResourceManager::Load(normal); - auto texturespec = ResourceManager::Load(spec); - - - Components::Transform absoluteTransform = m_TransformSystem->AbsoluteTransform(entity); - glm::quat orientation2D = glm::angleAxis(glm::eulerAngles(absoluteTransform.Orientation).z, glm::vec3(0, 0, -1)); - glm::mat4 modelMatrix = glm::translate(absoluteTransform.Position) - * glm::toMat4(orientation2D) - * glm::scale(absoluteTransform.Scale); - EnqueueSprite(texturediff, texturenorm, texturespec, modelMatrix, spriteComponent->Color, absoluteTransform.Position.z); - } - } - - } - - //TODO: Get this out of engine.h - void EnqueueModel(Model* model, glm::mat4 modelMatrix, float transparent, glm::vec4 color, std::string fileName) - { - for (auto texGroup : model->TextureGroups) - { - ModelJob job; - job.TextureID = (texGroup.Texture) ? texGroup.Texture->ResourceID : 0; - job.DiffuseTexture = (texGroup.Texture) ? *texGroup.Texture : 0; - job.NormalTexture = (texGroup.NormalMap) ? *texGroup.NormalMap : 0; - job.SpecularTexture = (texGroup.SpecularMap) ? *texGroup.SpecularMap : 0; - job.VAO = model->VAO; - job.ElementBuffer = model->ElementBuffer; - job.StartIndex = texGroup.StartIndex; - job.EndIndex = texGroup.EndIndex; - job.ModelMatrix = modelMatrix; - job.Color = color; - - m_RendererQueue.Deferred.Add(job); - } - } - - // TODO: Get this out of engine.h - void EnqueueSprite(Texture* texture, Texture* normalTexture, Texture* specularTexture, glm::mat4 modelMatrix, glm::vec4 color, float depth) - { - SpriteJob job; - job.TextureID = texture->ResourceID; - job.DiffuseTexture = *texture; - job.NormalTexture = *normalTexture; - job.SpecularTexture = *specularTexture; - job.ModelMatrix = modelMatrix; - job.Color = color; - job.Depth = depth; - - - m_RendererQueue.Forward.Add(job); - } - - void EnqueuePointLight(glm::vec3 position, glm::vec3 diffuseColor, glm::vec3 specularColor, float radius) - { - PointLightJob job; - job.Position = position; - job.DiffuseColor = diffuseColor; - job.SpecularColor = specularColor; - job.Radius = radius; - - m_RendererQueue.Lights.Add(job); - - } - - void EnqueueWaterParticles(glm::vec3 position, glm::vec4 color, glm::mat4 modelMatrix, float depth) - { - WaterParticleJob job; - job.Position = position; - job.Color = color; - job.ModelMatrix = modelMatrix; - job.Depth = depth; - - m_RendererQueue.Forward.Add(job); - } - -private: - std::shared_ptr m_EventBroker; - GUI::Frame* m_FrameStack = nullptr; - std::shared_ptr m_Renderer; - RenderQueueCollection m_RendererQueue; - std::shared_ptr m_InputManager; - std::shared_ptr m_World; - - //TODO: Redo - bool m_GameIsRunning = false; - dd::EventRelay m_EGameStart; - bool OnGameStart(const dd::Events::GameStart &event) - { - m_GameIsRunning = true; - //Todo: Move this - { - dd::Events::PlaySound e; - e.path = "Sounds/BGM/under-the-sea-instrumental.wav"; - e.isAmbient = true; - m_EventBroker->Publish(e); - } - { - dd::Events::PlaySound e; - e.path = "Sounds/BGM/water-flowing.wav"; - e.volume = 0.3f; - e.isAmbient = true; - m_EventBroker->Publish(e); - } - }; - double m_LastTime; -}; - -} diff --git a/include/Core/EventBroker.h b/include/Core/EventBroker.h index cb5e39c..ce2a5a4 100644 --- a/include/Core/EventBroker.h +++ b/include/Core/EventBroker.h @@ -24,6 +24,7 @@ #include #include #include +#include #define EVENT_SUBSCRIBE_MEMBER(relay, handler) \ relay = decltype(relay)(std::bind(handler, this, std::placeholders::_1)); \ @@ -123,16 +124,23 @@ public: void Unsubscribe(BaseEventRelay &relay); private: + bool m_IsProcessing = false; + typedef std::string ContextTypeName_t; // typeid(ContextType).name() typedef std::string EventTypeName_t; // typeid(EventType).name() typedef std::unordered_multimap EventRelays_t; typedef std::unordered_map ContextRelays_t; ContextRelays_t m_ContextRelays; + std::vector m_RelaysToSubscribe; + std::vector m_RelaysToUnsubscribe; typedef std::list>> EventQueue_t; std::shared_ptr m_EventQueueRead; std::shared_ptr m_EventQueueWrite; + + void subscribeImmediate(BaseEventRelay& relay); + void unsubscribeImmediate(BaseEventRelay& relay); }; template diff --git a/include/Core/World.h b/include/Core/World.h index 5c66d52..bbbae47 100644 --- a/include/Core/World.h +++ b/include/Core/World.h @@ -194,7 +194,7 @@ public: // Triggers commit events in systems // TODO: Replace completely by EComponentCreated? - int CommitEntity(EntityID entity); + void CommitEntity(EntityID entity); /** Get all components of a specific type. diff --git a/include/GUI/Button.h b/include/GUI/Button.h index b2a665d..d46d929 100644 --- a/include/GUI/Button.h +++ b/include/GUI/Button.h @@ -60,6 +60,10 @@ protected: virtual bool OnMouseMove(const Events::MouseMove& event) { + if (Hidden()) { + return false; + } + bool isOver = Rectangle::Intersects(AbsoluteRectangle(), Rectangle(event.X, event.Y, 1, 1)); if (isOver && !m_MouseIsOver) { // Enter if (!m_IsDown) { @@ -88,6 +92,11 @@ protected: } virtual bool OnMousePress(const Events::MousePress& event) { + if (Hidden()) { + LOG_DEBUG("Pressed hidden button"); + return false; + } + if (!Rectangle::Intersects(AbsoluteRectangle(), Rectangle(event.X, event.Y, 1, 1))) { return false; } @@ -107,6 +116,11 @@ protected: } virtual bool OnMouseRelease(const Events::MouseRelease& event) { + if (Hidden()) { + LOG_DEBUG("Released hidden button"); + return false; + } + bool isOver = Rectangle::Intersects(AbsoluteRectangle(), Rectangle(event.X, event.Y, 1, 1)); if (!isOver && !m_IsDown) { return false; diff --git a/include/GUI/NumberFrame.h b/include/GUI/NumberFrame.h index ac51aed..7241b82 100644 --- a/include/GUI/NumberFrame.h +++ b/include/GUI/NumberFrame.h @@ -1,6 +1,8 @@ #ifndef GUI_NUMBERFRAME_H__ #define GUI_NUMBERFRAME_H__ +#include + #include "GUI/TextureFrame.h" namespace dd @@ -14,32 +16,16 @@ public: NumberFrame(Frame* parent, std::string name) : Frame(parent, name) { - m_NumberTextures[0] = "Textures/GUI/Numbers/N0.png"; - m_NumberTextures[1] = "Textures/GUI/Numbers/N1.png"; - m_NumberTextures[2] = "Textures/GUI/Numbers/N2.png"; - m_NumberTextures[3] = "Textures/GUI/Numbers/N3.png"; - m_NumberTextures[4] = "Textures/GUI/Numbers/N4.png"; - m_NumberTextures[5] = "Textures/GUI/Numbers/N5.png"; - m_NumberTextures[6] = "Textures/GUI/Numbers/N6.png"; - m_NumberTextures[7] = "Textures/GUI/Numbers/N7.png"; - m_NumberTextures[8] = "Textures/GUI/Numbers/N8.png"; - m_NumberTextures[9] = "Textures/GUI/Numbers/N9.png"; - - // Create number frame if missing - for (int i = 0; i < 10; i++) { - auto frame = new GUI::TextureFrame(this, "NumberFrameDigit"); - frame->SetTexture(m_NumberTextures[0]); - frame->DisableScissor(); - // Position frame based on alignment - if (i > 0) { - frame->X = i * 20; - } - Width += frame->Width; - if (Height < frame->Height) { - Height = frame->Height; - } - m_NumberFrames.push_front(frame); - } + m_CharacterTextures['0'] = "Textures/GUI/Numbers/N0.png"; + m_CharacterTextures['1'] = "Textures/GUI/Numbers/N1.png"; + m_CharacterTextures['2'] = "Textures/GUI/Numbers/N2.png"; + m_CharacterTextures['3'] = "Textures/GUI/Numbers/N3.png"; + m_CharacterTextures['4'] = "Textures/GUI/Numbers/N4.png"; + m_CharacterTextures['5'] = "Textures/GUI/Numbers/N5.png"; + m_CharacterTextures['6'] = "Textures/GUI/Numbers/N6.png"; + m_CharacterTextures['7'] = "Textures/GUI/Numbers/N7.png"; + m_CharacterTextures['8'] = "Textures/GUI/Numbers/N8.png"; + m_CharacterTextures['9'] = "Textures/GUI/Numbers/N9.png"; SetNumber(0); } @@ -50,41 +36,40 @@ public: m_Number = number; // Clear number textures - //for (auto& frame : m_NumberFrames) { - // frame->SetTexture(""); - //} + for (auto& frame : m_NumberFrames) { + frame->SetTexture(""); + } - //Width = 0; - //Height = 0; + Width = 0; + Height = 0; - int n = 0; - do { -// // Create number frame if missing -// if (m_NumberFrames.size() <= n) { -// auto frame = new GUI::TextureFrame(this, "NumberFrameDigit"); -// frame->DisableScissor(); -// m_NumberFrames.push_front(frame); -// } + std::string digits = std::to_string(number); + + int i = 0; + for (char& c : digits) { + // Create number frame if missing + if (i >= m_NumberFrames.size()) { + auto frame = new GUI::TextureFrame(this, "NumberFrameDigit"); + if (i > 0) { + frame->SetLeft(m_NumberFrames[i - 1]->Right()); + } + frame->DisableScissor(); + m_NumberFrames.push_back(frame); + } // Update value - int digit = number % 10; - m_NumberFrames[n]->SetTexture(m_NumberTextures[digit]); - //Width += m_NumberFrames[n]->Width; - //if (Height < m_NumberFrames[n]->Height) { - // Height = m_NumberFrames[n]->Height; - //} -// // Position frame based on alignment -// if (n > 0) { -// if (!m_LeftAligned) { -// m_NumberFrames[n]->SetLeft(m_NumberFrames[n - 1]->Right()); -// } else { -// m_NumberFrames[n]->SetRight(m_NumberFrames[n - 1]->Left()); -// } -// } + std::string texture = "Textures/Core/ErrorTexture.png"; + if (m_CharacterTextures.find(c) != m_CharacterTextures.end()) { + texture = m_CharacterTextures.at(c); + } + m_NumberFrames[i]->SetTexture(m_CharacterTextures.at(c)); + Width += m_NumberFrames[i]->Width; + if (Height < m_NumberFrames[i]->Height) { + Height = m_NumberFrames[i]->Height; + } - number /= 10; - n++; - } while (number > 0); + i++; + } } void SetLeftAlign() { m_LeftAligned = true; } @@ -99,7 +84,7 @@ private: int m_Number = 0; bool m_LeftAligned = true; - std::string m_NumberTextures[10]; + std::unordered_map m_CharacterTextures; std::deque m_NumberFrames; }; diff --git a/include/Game/BallSystem.h b/include/Game/BallSystem.h index 1069ede..db1ab66 100644 --- a/include/Game/BallSystem.h +++ b/include/Game/BallSystem.h @@ -5,23 +5,42 @@ #include "Core/World.h" #include "Core/EventBroker.h" #include "Core/CTransform.h" +#include "Core/CTemplate.h" +#include "Physics/CPhysics.h" +#include "Physics/CCircleShape.h" +#include "Physics/CRectangleShape.h" #include "Physics/EContact.h" +#include "Rendering/CModel.h" +#include "Rendering/CPointLight.h" #include "Game/CBall.h" #include "Game/CPowerUp.h" +#include "Game/CLife.h" +#include "Game/CBrick.h" +#include "Game/ELifeLost.h" +#include "Game/EComboEvent.h" +#include "Game/EResetBall.h" +#include "Game/EMultiBall.h" +#include "Game/EMultiBallLost.h" +#include "Game/EGameOver.h" +#include "Game/EPause.h" +#include "Game/EHitPad.h" +#include "Game/EHitLag.h" -namespace dd { +namespace dd +{ -namespace Systems { +namespace Systems +{ -class BallSystem : public System { +class BallSystem : public System +{ public: BallSystem(World *world, std::shared_ptr eventBroker) : System(world, eventBroker) { } ~BallSystem(); - EventRelay m_Contact; - bool Contact(const Events::Contact &event); + void RegisterComponents(ComponentFactory *cf) override; @@ -39,11 +58,64 @@ public: // Called when an entity is removed void OnEntityRemoved(EntityID entity) override; -private: + EntityID CreateBall(); + void CreateLife(int); + EntityID Ball() { return m_Ball; }; + void SetBall(const EntityID& ball) { m_Ball = ball; } + float& XMovementMultiplier() { return m_XMovementMultiplier; } + void SetXMovementMultiplier(const float& xMovementMultiplier) { m_XMovementMultiplier = xMovementMultiplier; } + float& EdgeX() { return m_EdgeX; } + void SetEdgeX(const float& edgeX) { m_EdgeX = edgeX; } + float& EdgeY() { return m_EdgeY; } + void SetEdgeY(const float& edgeY) { m_EdgeY = edgeY; } + int& MultiBalls() { return m_MultiBalls; } + void SetMultiBalls(const int& multiBalls) { m_MultiBalls = multiBalls; } + int& Lives() { return m_Lives; } + void SetLives(const int& lives) { m_Lives = lives; } + int& PastLives() { return m_PastLives; } + void SetPastLives(const int& pastLives) { m_PastLives = pastLives; } + bool ReplaceBall() const { return m_ReplaceBall; } + void SetReplaceBall(const bool& replaceBall) { m_ReplaceBall = replaceBall; } + bool IsPaused() const { return m_Pause; } + void SetPause(const bool& pause) { m_Pause = pause; } + +private: + float m_XMovementMultiplier = 2.f; + float m_EdgeX = 3.2f; + float m_EdgeY = 5.2f; + int m_MultiBalls = 0; + int m_Lives = 3; + int m_PastLives = 3; + bool m_ReplaceBall = false; + bool m_Pause = false; + EntityID m_LastCollision = 999999; + + glm::vec3 m_SavedSpeed; + bool m_InitializePause = false; + + EntityID m_Ball; + + std::unordered_map> m_Contacts; + void ResolveContacts(); + + dd::EventRelay m_ELifeLost; + dd::EventRelay m_EMultiBallLost; + dd::EventRelay m_EResetBall; + dd::EventRelay m_EMultiBall; + dd::EventRelay m_EPause; + EventRelay m_Contact; + + bool Contact(const Events::Contact &event); + bool OnLifeLost(const dd::Events::LifeLost &event); + bool OnMultiBallLost(const dd::Events::MultiBallLost &event); + bool OnResetBall(const dd::Events::ResetBall &event); + bool OnMultiBall(const dd::Events::MultiBall &event); + bool OnPause(const dd::Events::Pause &event); }; } + } #endif diff --git a/include/Game/CBall.h b/include/Game/CBall.h index 2990a3a..fbf720a 100644 --- a/include/Game/CBall.h +++ b/include/Game/CBall.h @@ -17,6 +17,9 @@ struct Ball : Component { int Number = 0; float Speed = 5.f; + int Combo = 0; + bool Paused = false; + glm::vec3 SavedSpeed = glm::vec3(0, 0, 0); }; } diff --git a/include/Game/CBrick.h b/include/Game/CBrick.h index d44ab02..f55734a 100644 --- a/include/Game/CBrick.h +++ b/include/Game/CBrick.h @@ -15,9 +15,8 @@ namespace Components struct Brick : Component { - int Points = 10; - int Hits = 1; int Score = 50; + int Type = 0; bool Removed = false; }; diff --git a/include/Game/CPad.h b/include/Game/CPad.h index f71c756..9d9c702 100644 --- a/include/Game/CPad.h +++ b/include/Game/CPad.h @@ -17,12 +17,9 @@ namespace Components struct Pad : Component { - int Lives; - int Points; - float SlowdownModifier = 5.f; float AccelerationSpeed = 40.f; - float MaxSpeed = 20.f; + float MaxSpeed = 5.f; }; } diff --git a/include/Game/EComboEvent.h b/include/Game/EComboEvent.h new file mode 100644 index 0000000..7253f55 --- /dev/null +++ b/include/Game/EComboEvent.h @@ -0,0 +1,27 @@ +// +// Created by Adniklastrator on 2015-09-29. +// + +#ifndef DAYDREAM_ECOMBOEVENT_H +#define DAYDREAM_ECOMBOEVENT_H + +#include "Core/Entity.h" +#include "Core/EventBroker.h" + +namespace dd +{ + +namespace Events +{ + +struct ComboEvent : Event +{ + EntityID Ball; + int Combo; +}; + +} + +} + +#endif //DAYDREAM_ECOMBOEVENT_H diff --git a/include/Game/EHitLag.h b/include/Game/EHitLag.h new file mode 100644 index 0000000..9e29416 --- /dev/null +++ b/include/Game/EHitLag.h @@ -0,0 +1,26 @@ +// +// Created by Administrator on 2015-09-30. +// + +#ifndef DAYDREAM_EHITLAG_H +#define DAYDREAM_EHITLAG_H + +#include "Core/EventBroker.h" + +namespace dd +{ + +namespace Events +{ + +struct HitLag : Event +{ + float Time; + std::string Type; +}; + +} + +} + +#endif //DAYDREAM_EHITLAG_H diff --git a/include/Game/EHitPad.h b/include/Game/EHitPad.h new file mode 100644 index 0000000..573f8ef --- /dev/null +++ b/include/Game/EHitPad.h @@ -0,0 +1,21 @@ +// +// Created by Administrator on 2015-10-05. +// + +#ifndef DAYDREAM_EHITPAD_H +#define DAYDREAM_EHITPAD_H + +#include "Core/EventBroker.h" + +namespace dd +{ +namespace Events +{ +struct HitPad : Event +{ + +}; +} +} + +#endif //DAYDREAM_EHITPAD_H diff --git a/include/Game/EMultiBallLost.h b/include/Game/EMultiBallLost.h new file mode 100644 index 0000000..3d9c6d4 --- /dev/null +++ b/include/Game/EMultiBallLost.h @@ -0,0 +1,26 @@ +// +// Created by Adniklastrator on 2015-09-28. +// + +#ifndef DAYDREAM_EMULTIBALLLOST_H +#define DAYDREAM_EMULTIBALLLOST_H + +#include "Core/EventBroker.h" +#include "Core/Entity.h" + +namespace dd +{ + +namespace Events +{ + +struct MultiBallLost : Event +{ + +}; + +} + +} + +#endif //DAYDREAM_EMULTIBALLLOST_H diff --git a/include/Game/EPause.h b/include/Game/EPause.h new file mode 100644 index 0000000..ab27306 --- /dev/null +++ b/include/Game/EPause.h @@ -0,0 +1,25 @@ +// +// Created by Adniklastrator on 2015-09-30. +// + +#ifndef DAYDREAM_EPAUSE_H +#define DAYDREAM_EPAUSE_H + +#include "Core/EventBroker.h" + +namespace dd +{ + +namespace Events +{ + +struct Pause : Event +{ + std::string Type; +}; + +} + +} + +#endif //DAYDREAM_EPAUSE_H diff --git a/include/Game/FPSCounter.h b/include/Game/FPSCounter.h new file mode 100644 index 0000000..83e3e77 --- /dev/null +++ b/include/Game/FPSCounter.h @@ -0,0 +1,45 @@ +#ifndef GUI_FPSCOUNTER_H__ +#define GUI_FPSCOUNTER_H__ + +#include + +#include "GUI/Frame.h" +#include "GUI/NumberFrame.h" + +namespace dd +{ +namespace GUI +{ + +class FPSCounter : public Frame +{ +public: + FPSCounter(Frame* parent, std::string name) + : Frame(parent, name) + { + m_FrameTimes.resize(m_MaxSamples); + m_Numbers = new GUI::NumberFrame(this, "FPSCounterNumberFrame"); + } + + virtual void Update(double dt) + { + m_FrameTimes[m_CurrentFrame % m_MaxSamples] = dt; + double sum = std::accumulate(m_FrameTimes.begin(), m_FrameTimes.end(), 0.0); + sum /= std::min(m_CurrentFrame, m_MaxSamples); + m_Numbers->SetNumber(std::round(1.0 / sum)); + + m_CurrentFrame++; + } + +private: + NumberFrame* m_Numbers = nullptr; + + int m_MaxSamples = 100; + int m_CurrentFrame = 0; + std::vector m_FrameTimes; +}; + +} +} +#endif + diff --git a/include/Game/HUD.h b/include/Game/HUD.h index 2a240b3..b3940b3 100644 --- a/include/Game/HUD.h +++ b/include/Game/HUD.h @@ -6,6 +6,7 @@ #include "GUI/NumberFrame.h" #include "Core/EKeyUp.h" #include "Game/EScoreEvent.h" +#include "Game/FPSCounter.h" namespace dd { @@ -24,6 +25,15 @@ public: m_LevelIndicator = new GUI::TextureFrame(this, "HUDLevelIndicator"); m_LevelIndicator->SetTexture("Textures/GUI/HUD/LevelIndicatorBG.png"); + m_AreaNumberFrame = new GUI::NumberFrame(m_LevelIndicator, "HUDScoreNumberFrameawdawdwa"); + m_AreaNumberFrame->X = 132; + m_AreaNumberFrame->Y = 19; + m_AreaNumberFrame->SetNumber(6); + m_StageNumberFrame = new GUI::NumberFrame(m_LevelIndicator, "HUDScoreNumberFrameawdawdwa"); + m_StageNumberFrame->X = 165; + m_StageNumberFrame->Y = 19; + m_StageNumberFrame->SetNumber(5); + m_ScoreIndicator = new GUI::TextureFrame(this, "HUDScoreIndicator"); m_ScoreIndicator->SetTexture("Textures/GUI/HUD/ScoreIndicatorBG.png"); m_ScoreIndicator->SetRight(Right()); @@ -31,19 +41,25 @@ public: m_ScoreNumberFrame->X = 15; m_ScoreNumberFrame->Y = 21; + m_FPSCounter = new GUI::FPSCounter(this, "FPSCounter"); + EVENT_SUBSCRIBE_MEMBER(m_EScore, &HUD::OnScore); } private: TextureFrame* m_LevelIndicator = nullptr; TextureFrame* m_ScoreIndicator = nullptr; + NumberFrame* m_AreaNumberFrame = nullptr; + NumberFrame* m_StageNumberFrame = nullptr; NumberFrame* m_ScoreNumberFrame = nullptr; + FPSCounter* m_FPSCounter = nullptr; EventRelay m_EScore; bool OnScore(const Events::ScoreEvent& event) { m_ScoreNumberFrame->SetNumber(m_ScoreNumberFrame->Number() + event.Score); + return true; } }; diff --git a/include/Game/HitLagSystem.h b/include/Game/HitLagSystem.h new file mode 100644 index 0000000..2d9fa3f --- /dev/null +++ b/include/Game/HitLagSystem.h @@ -0,0 +1,91 @@ +// +// Created by Adniklastrator on 2015-09-30. +// + +#ifndef DAYDREAM_HITLAGSYSTEM_H +#define DAYDREAM_HITLAGSYSTEM_H + + +#include "Core/System.h" +#include "Core/CTransform.h" +#include "Core/CTemplate.h" +#include "Core/EventBroker.h" +#include "Core/World.h" +#include "Rendering/CSprite.h" +#include "Rendering/CModel.h" +#include "Game/CBrick.h" +#include "Game/CBall.h" +#include "Game/CLife.h" +#include "Game/CPowerUp.h" +#include "Game/EStageCleared.h" +#include "Game/ELifeLost.h" +#include "Game/EResetBall.h" +#include "Game/EScoreEvent.h" +#include "Game/EComboEvent.h" +#include "Game/EMultiBall.h" +#include "Game/EMultiBallLost.h" +#include "Game/EPause.h" +#include "Game/EHitLag.h" +#include "Game/EGameOver.h" +#include "Game/ECreatePowerUp.h" +#include "Game/EPowerUpTaken.h" +#include "Game/Bricks/CPowerUpBrick.h" +#include "Physics/CPhysics.h" +#include "Physics/CCircleShape.h" +#include "Physics/CRectangleShape.h" +#include "Physics/ESetImpulse.h" +#include "Physics/EContact.h" +#include "Sound/CCollisionSound.h" +#include "Game/PadSystem.h" +#include +#include + + +namespace dd +{ + +namespace Systems +{ + +class HitLagSystem : public System +{ +public: + HitLagSystem(World* world, std::shared_ptr eventBroker) + : System(world, eventBroker) + { } + + void Initialize() override; + + void Update(double dt) override; + void FlipPause(); + + bool IsPaused() const { return m_Pause; } + void SetPause(const bool& pause) { m_Pause = pause; } + bool HitLag() const { return m_HitLag; } + void SetHitLag(const bool& hitLag) { m_HitLag = hitLag; } + float& HitLagDuration() { return m_HitLagDuration; } + void SetHitLagDuration(const float& hitLagDuration) { m_HitLagDuration = hitLagDuration; } + float& HitLagTimer() { return m_HitLagTimer; } + void SetHitLagTimer(const float& hitLagTimer) { m_HitLagTimer = hitLagTimer; } + std::string& CurrentType() { return m_CurrentType; } + void SetCurrentType(const std::string& currentType) { m_CurrentType = currentType; } +private: + bool m_Pause; + bool m_HitLag; + float m_HitLagDuration; + float m_HitLagTimer; + std::string m_CurrentType; + + dd::EventRelay m_EPause; + dd::EventRelay m_EHitLag; + + bool OnPause(const dd::Events::Pause &event); + bool OnHitLag(const dd::Events::HitLag &event); + +}; + +} + +} + +#endif //DAYDREAM_HITLAGSYSTEM_H diff --git a/include/Game/LevelSystem.h b/include/Game/LevelSystem.h index 545d2fb..dca262c 100755 --- a/include/Game/LevelSystem.h +++ b/include/Game/LevelSystem.h @@ -7,6 +7,7 @@ #include "Core/System.h" #include "Core/CTransform.h" +#include "Core/CTemplate.h" #include "Core/EventBroker.h" #include "Core/World.h" #include "Rendering/CSprite.h" @@ -19,21 +20,24 @@ #include "Game/ELifeLost.h" #include "Game/EResetBall.h" #include "Game/EScoreEvent.h" -#include "Physics/CRectangleShape.h" +#include "Game/EComboEvent.h" +#include "Game/EHitPad.h" #include "Game/EMultiBall.h" +#include "Game/EMultiBallLost.h" +#include "Game/EPause.h" #include "Game/EGameOver.h" #include "Game/ECreatePowerUp.h" #include "Game/EPowerUpTaken.h" #include "Game/Bricks/CPowerUpBrick.h" #include "Physics/CPhysics.h" #include "Physics/CCircleShape.h" +#include "Physics/CRectangleShape.h" #include "Physics/ESetImpulse.h" #include "Physics/EContact.h" #include "Sound/CCollisionSound.h" #include "Game/PadSystem.h" #include #include -#include namespace dd { @@ -42,15 +46,15 @@ namespace Systems { // Me trying things out. -class Level +/*class Level { public: - int levelRows; - int levelLines; - int levelSpaceBetweenBricks; - int levelSpaceToEdge; - int bricks[]; -}; + int levelRows = 6; + int levelLines = 7; + glm::vec2 levelSpaceBetweenBricks = glm::vec2(1, 0.4); + float levelSpaceToEdge = 0.25f; + std::array bricks; +};*/ class LevelSystem : public System { @@ -62,11 +66,8 @@ public: void Initialize() override; void CreateBasicLevel(int, int, glm::vec2, float); - void CreateLife(int); - void SaveLevel(int, int, glm::vec2, int); // Shouldn't be here, but I'm experimenting. - void LoadLevel(char[20]); - void CreateBrick(int, int, glm::vec2, float, int); - void ProcessCollision(); + void CreateLevel(); + void CreateBrick(int, int, glm::vec2, float, int, int); void OnEntityRemoved(EntityID entity); @@ -79,10 +80,8 @@ public: void SetRestarting(const bool& restarting) { m_Restarting = restarting; } bool Initialized() const { return m_Initialized; } void SetInitialized(const bool& initialized) { m_Initialized = initialized; } - int& Lives() { return m_Lives; } - void SetLives(const int& lives) { m_Lives = lives; } - int& PastLives() { return m_PastLives; } - void SetPastLives(const int& pastLives) { m_PastLives = pastLives; } + bool IsPaused() const { return m_Pause; } + void SetPause(const bool& pause) { m_Pause = pause; } int& MultiBalls() { return m_MultiBalls; } void SetMultiBalls(const int& multiBalls) { m_MultiBalls = multiBalls; } int& PowerUps() { return m_PowerUps; } @@ -100,16 +99,17 @@ public: glm::vec2& SpaceBetweenBricks() { return m_SpaceBetweenBricks; } void SetSpaceBetweenBricks(const glm::vec2& spaceBetweenBricks) { m_SpaceBetweenBricks = spaceBetweenBricks; } - float& EdgeX() { return m_EdgeX; } - void SetEdgeX(const float& edgeX) { m_EdgeX = edgeX; } - float& EdgeY() { return m_EdgeY; } - void SetEdgeY(const float& edgeY) { m_EdgeY = edgeY; } + float& NotResettingTheStage() { return m_NotResettingTheStage; } + void SetNotResettingTheStage(const float& notResettingTheStage) { m_NotResettingTheStage = notResettingTheStage; } private: + bool m_Cleared = false; bool m_Restarting = false; bool m_Initialized = false; - int m_Lives = 3; - int m_PastLives = 3; + bool m_Pause = false; + int m_LooseBricks = 0; + int m_CurrentCluster = 2; + int m_CurrentLevel = 1; int m_MultiBalls = 0; int m_PowerUps = 0; int m_Score = 0; @@ -118,24 +118,37 @@ private: int m_Lines = 7; float m_SpaceToEdge = 0.25f; glm::vec2 m_SpaceBetweenBricks = glm::vec2(1, 0.4); - float m_EdgeX = 3.2f; - float m_EdgeY = 5.2f; + float m_NotResettingTheStage = 5.f; + + const int EmptyBrickSpace = 0; + const int StandardBrick = 1; + const int MultiBallBrick = 2; + + EntityID m_BrickTemplate; + + std::array m_Bricks; dd::EventRelay m_EContact; - dd::EventRelay m_ELifeLost; dd::EventRelay m_EScoreEvent; dd::EventRelay m_EMultiBall; + dd::EventRelay m_EMultiBallLost; dd::EventRelay m_ECreatePowerUp; dd::EventRelay m_EPowerUpTaken; dd::EventRelay m_EStageCleared; + dd::EventRelay m_EPause; + dd::EventRelay m_EHitPad; bool OnContact(const dd::Events::Contact &event); - bool OnLifeLost(const dd::Events::LifeLost &event); bool OnScoreEvent(const dd::Events::ScoreEvent &event); bool OnMultiBall(const dd::Events::MultiBall &event); + bool OnMultiBallLost(const dd::Events::MultiBallLost &event); bool OnCreatePowerUp(const dd::Events::CreatePowerUp &event); bool OnPowerUpTaken(const dd::Events::PowerUpTaken &event); bool OnStageCleared(const dd::Events::StageCleared &event); + bool OnPause(const dd::Events::Pause &event); + bool OnHitPad(const dd::Events::HitPad &event); + + void GetNextLevel(); }; } diff --git a/include/Game/MainMenuOptions.h b/include/Game/MainMenuOptions.h index 476fa4a..b0771de 100644 --- a/include/Game/MainMenuOptions.h +++ b/include/Game/MainMenuOptions.h @@ -61,15 +61,15 @@ private: { if (event.Slider == m_SFXSlider) { Events::MasterVolume e; - e.isAmbient = false; - e.gain = event.Percentage; + e.IsAmbient = false; + e.Gain = event.Percentage; EventBroker->Publish(e); } if (event.Slider == m_BGMSlider) { Events::MasterVolume e; - e.isAmbient = true; - e.gain = event.Percentage; + e.IsAmbient = true; + e.Gain = event.Percentage; EventBroker->Publish(e); } diff --git a/include/Game/PadSystem.h b/include/Game/PadSystem.h index 4a53907..39a2582 100755 --- a/include/Game/PadSystem.h +++ b/include/Game/PadSystem.h @@ -9,6 +9,7 @@ #include "Core/System.h" #include "Core/Component.h" #include "Core/CTransform.h" +#include "Core/CTemplate.h" #include "Core/EventBroker.h" #include "Core/EKeyDown.h" #include "Core/EKeyUp.h" @@ -27,6 +28,8 @@ #include "Game/EMultiBall.h" #include "Game/EPowerUpTaken.h" #include "Game/EStageCleared.h" +#include "Game/EPause.h" +#include "Game/EHitLag.h" namespace dd @@ -45,8 +48,6 @@ public: void Update(double dt) override; void UpdateEntity(double dt, EntityID entity, EntityID parent) override; - EntityID CreateBall(); - EntityID& Entity() { return m_Entity; } void SetEntity(const EntityID& ent) { m_Entity = ent; } glm::vec3 Acceleration() const { return m_Acceleration; } @@ -56,39 +57,43 @@ public: void SetLeft(const bool& left) { m_Left = left; } bool Right() const { return m_Right; } void SetRight(const bool& right) { m_Right = right; } - bool ReplaceBall() const { return m_ReplaceBall; } - void SetReplaceBall(const bool& replaceBall) { m_ReplaceBall = replaceBall; } - bool MultiBall() const { return m_MultiBall; } - void SetMultiBall(const bool& multiBall) { m_MultiBall = multiBall; } + float Edge() const { return m_Edge; } + void SetEdge(const float& edge) { m_Edge = edge; } Components::Transform* Transform() const { return m_Transform; } void SetTransform(Components::Transform* transform) { m_Transform = transform; } Components::Pad* Pad() const { return m_Pad; } void SetPad(Components::Pad* pad) { m_Pad = pad; } + bool IsPaused() const { return m_Pause; } + void SetPause(const bool& pause) { m_Pause = pause; } + private: EntityID m_Entity = 0; glm::vec3 m_Acceleration = glm::vec3(0.f, 0.f, 0.f); - bool m_Left = false, m_Right = false, m_ReplaceBall = false, m_MultiBall = false; - Components::Transform* m_Transform; - Components::Pad* m_Pad; + bool m_Left = false; + bool m_Right = false; + bool m_ReplaceBall = false; + bool m_MultiBall = false; + float m_Edge = 2.8f; + Components::Transform* m_Transform = nullptr; + Components::Pad* m_Pad = nullptr; + + bool m_Pause = false; dd::EventRelay m_EKeyDown; dd::EventRelay m_EKeyUp; dd::EventRelay m_EContact; dd::EventRelay m_EContactPowerUp; - dd::EventRelay m_EResetBall; - dd::EventRelay m_EMultiBall; dd::EventRelay m_EStageCleared; + dd::EventRelay m_EPause; bool OnKeyDown(const dd::Events::KeyDown &event); bool OnKeyUp(const dd::Events::KeyUp &event); - bool OnContact(const dd::Events::Contact &event); bool OnContactPowerUp(const dd::Events::Contact &event); - bool OnResetBall(const dd::Events::ResetBall &event); - bool OnMultiBall(const dd::Events::MultiBall &event); bool OnStageCleared(const dd::Events::StageCleared &event); + bool OnPause(const dd::Events::Pause &event); class PadSteeringInputController; std::array, 4> m_PadInputControllers; diff --git a/include/Physics/CCircleShape.h b/include/Physics/CCircleShape.h index a7a477b..3220948 100644 --- a/include/Physics/CCircleShape.h +++ b/include/Physics/CCircleShape.h @@ -10,7 +10,7 @@ namespace Components struct CircleShape : public Component { - // Circles are circles + float Radius = 1.f; }; } diff --git a/include/Physics/CParticle.h b/include/Physics/CParticle.h index baec66d..faa8267 100755 --- a/include/Physics/CParticle.h +++ b/include/Physics/CParticle.h @@ -7,24 +7,24 @@ namespace dd { namespace ParticleFlags { enum Type { - waterParticle = 0, - zombieParticle = 1 << 1, - wallParticle = 1 << 2, - springParticle = 1 << 3, - elasticParticle = 1 << 4, - viscousParticle = 1 << 5, - powderParticle = 1 << 6, - tensileParticle = 1 << 7, - colorMixingParticle = 1 << 8, - destructionListenerParticle = 1 << 9, - barrierParticle = 1 << 10, - staticPressureParticle = 1 << 11, - reactiveParticle = 1 << 12, - repulsiveParticle = 1 << 13, - fixtureContactListenerParticle = 1 << 14, - particleContactListenerParticle = 1 << 15, - fixtureContactFilterParticle = 1 << 16, - particleContactFilterParticle = 1 << 17 + Water = 0, + Zombie = 1 << 1, + Wall = 1 << 2, + Spring = 1 << 3, + Elastic = 1 << 4, + Viscous = 1 << 5, + Powder = 1 << 6, + Tensile = 1 << 7, + ColorMixing = 1 << 8, + DestructionListener = 1 << 9, + Barrier = 1 << 10, + StaticPressure = 1 << 11, + Reactive = 1 << 12, + Repulsive = 1 << 13, + FixtureContactListener = 1 << 14, + ParticleContactListener = 1 << 15, + FixtureContactFilter = 1 << 16, + ParticleContactFilter = 1 << 17 }; } @@ -36,26 +36,26 @@ struct Particle : public Component float Radius = 0.5f; float LifeTime = 5.0f; - ParticleFlags::Type Flags = - ParticleFlags::Type::waterParticle | - ParticleFlags::Type::zombieParticle | - ParticleFlags::Type::wallParticle | - ParticleFlags::Type::springParticle | - ParticleFlags::Type::elasticParticle | - ParticleFlags::Type::viscousParticle | - ParticleFlags::Type::powderParticle | - ParticleFlags::Type::tensileParticle | - ParticleFlags::Type::colorMixingParticle | - ParticleFlags::Type::destructionListenerParticle | - ParticleFlags::Type::barrierParticle | - ParticleFlags::Type::staticPressureParticle | - ParticleFlags::Type::reactiveParticle | - ParticleFlags::Type::repulsiveParticle | - ParticleFlags::Type::fixtureContactListenerParticle | - ParticleFlags::Type::particleContactListenerParticle | - ParticleFlags::Type::fixtureContactFilterParticle | - ParticleFlags::Type::particleContactFilterParticle; - + ParticleFlags::Type Flags = static_cast( + ParticleFlags::Water + | ParticleFlags::Zombie + | ParticleFlags::Wall + | ParticleFlags::Spring + | ParticleFlags::Elastic + | ParticleFlags::Viscous + | ParticleFlags::Powder + | ParticleFlags::Tensile + | ParticleFlags::ColorMixing + | ParticleFlags::DestructionListener + | ParticleFlags::Barrier + | ParticleFlags::StaticPressure + | ParticleFlags::Reactive + | ParticleFlags::Repulsive + | ParticleFlags::FixtureContactListener + | ParticleFlags::ParticleContactListener + | ParticleFlags::FixtureContactFilter + | ParticleFlags::ParticleContactFilter + ); }; } diff --git a/include/Physics/CParticleEmitter.h b/include/Physics/CParticleEmitter.h index 56dd83c..565a935 100755 --- a/include/Physics/CParticleEmitter.h +++ b/include/Physics/CParticleEmitter.h @@ -20,7 +20,7 @@ struct ParticleEmitter : public Component float Speed = 2.f; double LifeTime = 100; - //ParticleSystem variables + //System variables float GravityScale = 1.0f; }; diff --git a/include/Physics/CPhysics.h b/include/Physics/CPhysics.h index 73d05cf..fc58a71 100644 --- a/include/Physics/CPhysics.h +++ b/include/Physics/CPhysics.h @@ -18,24 +18,40 @@ enum Type Wall = 1 << 6 }; } -namespace Components -{ -struct Physics: public Component +namespace CollisionType { - bool Static = true; - bool Calculate = false; - float GravityScale = 0.f; - CollisionLayer::Type Category = CollisionLayer::Type::Other; - CollisionLayer::Type Mask = - CollisionLayer::Type::Pad | - CollisionLayer::Type::Ball | - CollisionLayer::Type::Brick | - CollisionLayer::Type::Water | - CollisionLayer::Type::PowerUp | - CollisionLayer::Type::Wall | - CollisionLayer::Type::Other; +enum Type +{ + Static = 0, + Kinematic = 1, + Dynamic = 2, }; +} + + + namespace Components + { + + struct Physics: public Component + { + CollisionType::Type CollisionType = CollisionType::Type::Static; + + bool Calculate = false; + float GravityScale = 0.f; + + + CollisionLayer::Type Category = CollisionLayer::Type::Other; + CollisionLayer::Type Mask = static_cast( + CollisionLayer::Pad + | CollisionLayer::Ball + | CollisionLayer::Brick + | CollisionLayer::Water + | CollisionLayer::PowerUp + | CollisionLayer::Wall + | CollisionLayer::Other + ); + }; } } diff --git a/include/Physics/CRectangleShape.h b/include/Physics/CRectangleShape.h index fcdda7a..c43c630 100644 --- a/include/Physics/CRectangleShape.h +++ b/include/Physics/CRectangleShape.h @@ -10,7 +10,7 @@ namespace Components struct RectangleShape : public Component { - + glm::vec2 Dimensions = glm::vec2(1.f, 1.f); }; } diff --git a/include/Physics/ECreateParticleSequence.h b/include/Physics/ECreateParticleSequence.h index 1df3db6..13861cb 100644 --- a/include/Physics/ECreateParticleSequence.h +++ b/include/Physics/ECreateParticleSequence.h @@ -26,7 +26,7 @@ struct CreateParticleSequence : public Event //Particle std::string SpriteFile = "Texures/Core/ErrorTexture.png"; double ParticleLifeTime = 3.f; - ParticleFlags::Type Flags = ParticleFlags::Type::powderParticle | ParticleFlags::Type::particleContactFilterParticle | ParticleFlags::Type::fixtureContactFilterParticle; + ParticleFlags::Type Flags = static_cast(ParticleFlags::Powder | ParticleFlags::ParticleContactFilter | ParticleFlags::FixtureContactFilter); float Radius = 1.f; }; diff --git a/include/Physics/PhysicsSystem.h b/include/Physics/PhysicsSystem.h index aace1fb..a2fe3ec 100755 --- a/include/Physics/PhysicsSystem.h +++ b/include/Physics/PhysicsSystem.h @@ -2,118 +2,122 @@ #define DAYDREAM_PHYSICSSYSTEM_H #include -#include -#include +#include #include "Core/System.h" #include "Core/World.h" -#include "CRectangleShape.h" -#include "Physics/CPhysics.h" -#include -#include "Core/CTransform.h" -#include "Transform/TransformSystem.h" -#include "Physics/EContact.h" -#include "Physics/ESetImpulse.h" -#include "Physics/ECreateParticleSequence.h" -#include "Physics/CCircleShape.h" #include "Core/EventBroker.h" -#include "Game/CPad.h" -#include "Physics/CWaterVolume.h" -#include "Game/CBall.h" -#include "Rendering/CSprite.h" -#include "Physics/CParticle.h" -#include "Physics/CParticleEmitter.h" #include "Core/CTemplate.h" +#include "Physics/CRectangleShape.h" +#include "Physics/CCircleShape.h" +#include "Physics/CPhysics.h" +#include "Physics/CWaterVolume.h" +#include "Core/CTransform.h" +#include "Transform/TransformSystem.h" +#include "CRectangleShape.h" +#include "Physics/CPhysics.h" +#include "Physics/EContact.h" +#include "Physics/ESetImpulse.h" +#include "Physics/CParticle.h" +#include "Physics/ECreateParticleSequence.h" +#include "Physics/CCircleShape.h" +#include "Physics/CParticleEmitter.h" +#include "Game/CPad.h" +#include "Game/CPad.h" +#include "Game/CBall.h" +#include "Transform/TransformSystem.h" +#include "Rendering/CSprite.h" +#include "Core/CTemplate.h" +#include "Game/EPause.h" namespace dd { -namespace Systems -{ - - -class PhysicsSystem : public System -{ - friend class ContractListener; - friend class DestructionListener; - -public: - PhysicsSystem(World* world, std::shared_ptr eventBroker) - : System(world, eventBroker) {} - - ~PhysicsSystem(); - - EventRelay m_SetImpulse; - bool SetImpulse(const Events::SetImpulse &event); - - EventRelay m_ECreateParticleSequence; - bool CreateParticleSequence(const Events::CreateParticleSequence &event); - - void RegisterComponents(ComponentFactory* cf) override; - void Initialize() override; - - // Called once per system every tick - void Update(double dt) override; - // Called once for every entity in the world every tick - void UpdateEntity(double dt, EntityID entity, EntityID parent) override; - - // Called when components are committed to an entity - void OnEntityCommit(EntityID entity) override; - - // Called when an entity is removed - void OnEntityRemoved(EntityID entity) override; - -private: - b2Vec2 m_Gravity; - b2World* m_PhysicsWorld; - float m_TimeStep; - float m_Accumulator; - - int m_VelocityIterations, m_PositionIterations; - - std::mt19937 gen; - - std::unordered_map m_EntitiesToBodies; - std::unordered_map m_BodiesToEntities; - - void CreateBody(EntityID entity); - - b2ParticleSystem* m_WaterParticleSystem; - std::vector t_ParticleGroup; - - std::unordered_map m_EntitiesToWaterParticleHandle; - std::unordered_map m_WaterParticleHandleToEntities; - - std::vector> m_EntitiesToParticleHandle; - std::vector> m_ParticleHandleToEntities; - - b2ParticleSystem* CreateParticleSystem(float radius, float gravityScale, int maxCount); - void InitializeWater(); - void CreateParticleGroup(EntityID entity); - void CreateParticleEmitter(EntityID entity); - void UpdateParticleEmitters(double dt); //TODO: Remove them and particles if needed. - - //TODO: Fill struct with info needed. - struct ParticleEmitter + namespace Systems { - std::vector ParticleSystem; - std::vector ParticleEmitter; - std::vector ParticleTemplate; - }; - ParticleEmitter m_ParticleEmitters; - //TODO: Struct med listor är bättre än en lista med structs - struct Impulse - { - b2Body* Body; - b2Vec2 Impulse; - b2Vec2 Point; - }; - std::list m_Impulses; + class PhysicsSystem : public System + { + friend class ContractListener; + friend class DestructionListener; - class DestructionListener : public b2DestructionListener + public: + PhysicsSystem(World* world, std::shared_ptr eventBroker) + : System(world, eventBroker) { } + + ~PhysicsSystem(); + + EventRelay m_ECreateParticleSequence; + bool CreateParticleSequence(const Events::CreateParticleSequence &event); + + void RegisterComponents(ComponentFactory* cf) override; + void Initialize() override; + void Update(double dt) override; + void UpdateEntity(double dt, EntityID entity, EntityID parent) override; + void OnEntityCommit(EntityID entity) override; + void OnEntityRemoved(EntityID entity) override; + + private: + struct Impulse + { + b2Body* Body; + b2Vec2 Vector; + b2Vec2 Point; + }; + bool m_Pause = false; + + std::mt19937 gen; + + + b2Vec2 m_Gravity = b2Vec2(0.f, -9.82f); + b2World* m_PhysicsWorld = nullptr; + float m_TimeStep = 1.f/60.f; + float m_Accumulator = 0.f; + int m_VelocityIterations = 6; + int m_PositionIterations = 2; + + b2ParticleSystem* m_WaterParticleSystem; + std::vector t_ParticleGroup; + + std::unordered_map m_WaterParticleHandleToEntities; + std::unordered_map m_EntitiesToWaterParticleHandle; + std::vector> m_EntitiesToParticleHandle; + std::vector> m_ParticleHandleToEntities; + std::unordered_map m_EntitiesToBodies; + std::unordered_map m_BodiesToEntities; + + + + void CreateBody(EntityID entity); + void SyncEntitiesWithBodies(); + void SyncBodiesWithEntities(); + void InitializeWater(); + void CreateParticleGroup(EntityID entity); + + b2ParticleSystem* CreateParticleSystem(float radius, float gravityScale, int maxCount); + void CreateParticleEmitter(EntityID entity); + void UpdateParticleEmitters(double dt); //TODO: Remove them and particles if needed. + + EventRelay m_SetImpulse; + bool SetImpulse(const Events::SetImpulse &event); + dd::EventRelay m_EPause; + bool OnPause(const dd::Events::Pause &event); + + //TODO: Fill struct with info needed. + struct ParticleEmitter //TODO CHANGE NAMES + { + std::vector ParticleSystem; + std::vector ParticleEmitter; + std::vector ParticleTemplate; + }; + ParticleEmitter m_ParticleEmitters; + + std::list m_Impulses; + + + class DestructionListener : public b2DestructionListener { public: DestructionListener(PhysicsSystem* physicsSystem) @@ -127,7 +131,7 @@ private: LOG_INFO("Particle ded"); - b2ParticleHandle* handle = particleSystem->GetParticleHandleFromIndex(index); + const b2ParticleHandle* handle = particleSystem->GetParticleHandleFromIndex(index); for (int i = 0; i < m_PhysicsSystem->m_ParticleEmitters.ParticleSystem.size(); i++) { if(m_PhysicsSystem->m_ParticleEmitters.ParticleSystem[i] == particleSystem) { std::unordered_map::iterator it = m_PhysicsSystem->m_ParticleHandleToEntities[i].find(handle); @@ -144,57 +148,7 @@ private: PhysicsSystem* m_PhysicsSystem; }; - class ContactListener : public b2ContactListener - { - public: - ContactListener(PhysicsSystem* physicsSystem) - : m_PhysicsSystem(physicsSystem) { } - - void BeginContact(b2Contact* contact) - { - b2WorldManifold worldManifold; - - contact->GetWorldManifold(&worldManifold); - - Events::Contact e; - e.Entity1 = m_PhysicsSystem->m_BodiesToEntities[contact->GetFixtureA()->GetBody()]; - e.Entity2 = m_PhysicsSystem->m_BodiesToEntities[contact->GetFixtureB()->GetBody()]; - e.Normal = glm::normalize(glm::vec2(contact->GetManifold()->localNormal.x, contact->GetManifold()->localNormal.y)); - e.SignificantNormal = glm::normalize((glm::abs(e.Normal.x) > glm::abs(e.Normal.y)) ? glm::vec2(e.Normal.x, 0) : glm::vec2(0, e.Normal.y)); - - m_PhysicsSystem->EventBroker->Publish(e); - } - - void EndContact(b2Contact* contact) - { - - } - void PreSolve(b2Contact* contact, const b2Manifold* oldManifold) - { - EntityID entityA = m_PhysicsSystem->m_BodiesToEntities[contact->GetFixtureA()->GetBody()]; - EntityID entityB = m_PhysicsSystem->m_BodiesToEntities[contact->GetFixtureB()->GetBody()]; - - auto physicsComponentA = m_PhysicsSystem->m_World->GetComponent(entityA); - auto physicsComponentB = m_PhysicsSystem->m_World->GetComponent(entityB); - - if (physicsComponentA != nullptr && physicsComponentB != nullptr) { - if (physicsComponentA->Calculate || physicsComponentB->Calculate) { - // Turn of collisions - contact->SetEnabled(false); - } - } - - } - void PostSolve(b2Contact* contact, const b2ContactImpulse* impulse) - { - - } - - private: - PhysicsSystem* m_PhysicsSystem; - }; - - class ParticleContactDisabler : public b2ContactFilter + class ParticleContactDisabler : public b2ContactFilter { public: ParticleContactDisabler() { }; @@ -211,12 +165,32 @@ private: }; - DestructionListener* m_DestructionListener; - ParticleContactDisabler m_ParticleContactDisabler; - ContactListener* m_ContactListener; -}; -} + + + + class ContactListener : public b2ContactListener + { + public: + ContactListener(PhysicsSystem* physicsSystem) + : m_PhysicsSystem(physicsSystem) { } + + void BeginContact(b2Contact* contact); + void EndContact(b2Contact* contact); + void PreSolve(b2Contact* contact, const b2Manifold* oldManifold); + void PostSolve(b2Contact* contact, const b2ContactImpulse* impulse); + + private: + PhysicsSystem* m_PhysicsSystem; + }; + + DestructionListener* m_DestructionListener; + ParticleContactDisabler m_ParticleContactDisabler; + ContactListener* m_ContactListener; + }; + + } + } -#endif //DAYDREAM_PHYSICSSYSTEM_H +#endif diff --git a/include/Physics/PhysicsSystem.h.orig b/include/Physics/PhysicsSystem.h.orig deleted file mode 100755 index f1465aa..0000000 --- a/include/Physics/PhysicsSystem.h.orig +++ /dev/null @@ -1,149 +0,0 @@ -#ifndef DAYDREAM_PHYSICSSYSTEM_H -#define DAYDREAM_PHYSICSSYSTEM_H - -#include - -#include "Core/System.h" -#include "Core/World.h" -#include "CRectangleShape.h" -#include "Physics/CPhysics.h" -#include -#include "Core/CTransform.h" -#include "Transform/TransformSystem.h" -#include "Physics/EContact.h" -#include "Physics/ESetImpulse.h" -#include "Physics/CCircleShape.h" -#include "Core/EventBroker.h" -#include "Game/CPad.h" -<<<<<<< HEAD -#include "Game/CBall.h" -======= -#include "Physics/CWaterVolume.h" -#include "Rendering/CSprite.h" ->>>>>>> origin/master - - -namespace dd -{ - -namespace Systems -{ - - -class PhysicsSystem : public System -{ - friend class ContractListener; - -public: - PhysicsSystem(World* world, std::shared_ptr eventBroker) - : System(world, eventBroker) {} - - ~PhysicsSystem(); - - EventRelay m_SetImpulse; - bool SetImpulse(const Events::SetImpulse &event); - - void RegisterComponents(ComponentFactory* cf) override; - void Initialize() override; - - // Called once per system every tick - void Update(double dt) override; - // Called once for every entity in the world every tick - void UpdateEntity(double dt, EntityID entity, EntityID parent) override; - - // Called when components are committed to an entity - void OnEntityCommit(EntityID entity) override; - - // Called when an entity is removed - void OnEntityRemoved(EntityID entity) override; - -private: - b2Vec2 m_Gravity; - b2World* m_PhysicsWorld; - float m_TimeStep; - float m_Accumulator; - - int m_VelocityIterations, m_PositionIterations; - - std::unordered_map m_EntitiesToBodies; - std::unordered_map m_BodiesToEntities; - - void CreateBody(EntityID entity); - - b2ParticleSystem *m_ParticleSystem; - b2ParticleGroup* t_watergroup; - - std::unordered_map m_EntitiesToParticleHandle; - std::unordered_map m_ParticleHandleToEntities; - - void InitializeWater(); - void SyncWater(); //TODO: Probably remove this - void CreateParticleGroup(EntityID entity); - - struct Impulse - { - b2Body* Body; - b2Vec2 Impulse; - b2Vec2 Point; - }; - std::list m_Impulses; - - - - class ContactListener : public b2ContactListener - { - public: - ContactListener(PhysicsSystem* physicsSystem) - : m_PhysicsSystem(physicsSystem) { } - - void BeginContact(b2Contact* contact) - { - b2WorldManifold worldManifold; - - contact->GetWorldManifold(&worldManifold); - - Events::Contact e; - e.Entity1 = m_PhysicsSystem->m_BodiesToEntities[contact->GetFixtureA()->GetBody()]; - e.Entity2 = m_PhysicsSystem->m_BodiesToEntities[contact->GetFixtureB()->GetBody()]; - e.Normal = glm::normalize(glm::vec2(contact->GetManifold()->localNormal.x, contact->GetManifold()->localNormal.y)); - e.SignificantNormal = glm::normalize((glm::abs(e.Normal.x) > glm::abs(e.Normal.y)) ? glm::vec2(e.Normal.x, 0) : glm::vec2(0, e.Normal.y)); - - m_PhysicsSystem->EventBroker->Publish(e); - } - void EndContact(b2Contact* contact) - { - - } - void PreSolve(b2Contact* contact, const b2Manifold* oldManifold) - { - EntityID entityA = m_PhysicsSystem->m_BodiesToEntities[contact->GetFixtureA()->GetBody()]; - EntityID entityB = m_PhysicsSystem->m_BodiesToEntities[contact->GetFixtureB()->GetBody()]; - - auto physicsComponentA = m_PhysicsSystem->m_World->GetComponent(entityA); - auto physicsComponentB = m_PhysicsSystem->m_World->GetComponent(entityB); - - if (physicsComponentA != nullptr && physicsComponentB != nullptr) { - if (physicsComponentA->Calculate || physicsComponentB->Calculate) { - // Turn of collisions - contact->SetEnabled(false); - } - } - - - } - void PostSolve(b2Contact* contact, const b2ContactImpulse* impulse) - { - - } - - private: - PhysicsSystem* m_PhysicsSystem; - }; - - ContactListener* m_ContactListener; -}; - -} -} - -#endif //DAYDREAM_PHYSICSSYSTEM_H diff --git a/include/Sound/CCollisionSound.h b/include/Sound/CCollisionSound.h index 4a631a3..3bf312a 100644 --- a/include/Sound/CCollisionSound.h +++ b/include/Sound/CCollisionSound.h @@ -1,7 +1,3 @@ -// -// Created by Adam on 2015-09-17. -// - #ifndef COMPONENTS_CCOLLISIONSOUND_H__ #define COMPONENTS_CCOLLISIONSOUND_H__ @@ -9,17 +5,15 @@ namespace dd { - namespace Components { struct CollisionSound : public Component { - std::string filePath; + std::string FilePath; }; } - } #endif diff --git a/include/Sound/EMasterVolume.h b/include/Sound/EMasterVolume.h index 3f95e6d..6c7999b 100644 --- a/include/Sound/EMasterVolume.h +++ b/include/Sound/EMasterVolume.h @@ -1,7 +1,3 @@ -// -// Created by Adam on 2015-09-24. -// - #ifndef EVENTS_EMASTERVOLUME_H__ #define EVENTS_EMASTERVOLUME_H__ @@ -9,19 +5,17 @@ namespace dd { - namespace Events { struct MasterVolume : public Event { - float gain = 1; + float Gain = 1; //To determine what channel group to apply the change to. - bool isAmbient = false; + bool IsAmbient = false; }; } - } #endif diff --git a/include/Sound/EPlaySound.h b/include/Sound/EPlaySound.h index a66300d..ed7ab76 100644 --- a/include/Sound/EPlaySound.h +++ b/include/Sound/EPlaySound.h @@ -1,24 +1,22 @@ -#ifndef Events_PlaySFX_h__ -#define Events_PlaySFX_h__ +#ifndef EVENTS_PLAYSFX_H__ +#define EVENTS_PLAYSFX_H__ #include "Core/EventBroker.h" namespace dd { - namespace Events { struct PlaySound : Event { - std::string path; - float volume = 1.f; - float pitch = 1.f; - bool isAmbient = false; + std::string FilePath; + float Gain = 1.f; + float Pitch = 1.f; + bool IsAmbient = false; }; } - } #endif \ No newline at end of file diff --git a/include/Sound/EStopSound.h b/include/Sound/EStopSound.h index 81ff474..8f7bbd8 100644 --- a/include/Sound/EStopSound.h +++ b/include/Sound/EStopSound.h @@ -8,16 +8,12 @@ namespace dd namespace Events { - struct StopSound : public Event { - std::string path; + std::string FilePath; }; - } - - } #endif diff --git a/include/Sound/Sound.h b/include/Sound/Sound.h index 7084e64..1e892b7 100644 --- a/include/Sound/Sound.h +++ b/include/Sound/Sound.h @@ -12,27 +12,31 @@ namespace dd class Sound : public Resource { friend class ResourceManager; + public: ALuint Buffer() { return m_Buffer; }; std::string Path() { return m_Path; }; + float Gain() { return m_Gain; }; + void SetGain(const float Gain) { m_Gain = Gain; }; + private: Sound(std::string path); + float m_Gain = 1; + ALuint m_Buffer; + std::string m_Path; + //File-info char m_Type[4]; unsigned long m_Size, m_ChunkSize; short m_FormatType, m_Channels; unsigned long m_SampleRate, m_AvgBytesPerSec; short m_BytesPerSample, m_BitsPerSample; - unsigned long m_DataSize; + unsigned int m_DataSize; std::map m_BufferCache; ALuint LoadFile(std::string path); - - ALuint m_Buffer; - std::string m_Path; }; - } #endif diff --git a/include/Sound/SoundSystem.h b/include/Sound/SoundSystem.h index 1cb981a..8892577 100644 --- a/include/Sound/SoundSystem.h +++ b/include/Sound/SoundSystem.h @@ -1,63 +1,61 @@ -#ifndef DAYDREAM_SOUND_H -#define DAYDREAM_SOUND_H - +#ifndef SYSTEMS_SOUNDSYSTEM_H__ +#define SYSTEMS_SOUNDSYSTEM_H__ #include "AL/al.h" #include "AL/alc.h" + #include "Core/System.h" #include "Core/World.h" #include "Core/EventBroker.h" +#include "Core/ResourceManager.h" #include "Sound.h" #include "Sound/EPlaySound.h" #include "Sound/EStopSound.h" #include "Sound/EMasterVolume.h" +#include "Sound/CCollisionSound.h" #include "Physics/EContact.h" #include "Game/CBall.h" #include "Game/CBrick.h" #include "Game/CPad.h" -#include "Sound/CCollisionSound.h" -#include "Core/ResourceManager.h" - #include "Physics/ECreateParticleSequence.h" - namespace dd { namespace Systems { + class SoundSystem : public System { public: SoundSystem(World *world, std::shared_ptr eventBroker) : System(world, eventBroker) { } + ~SoundSystem(); + void Initialize() override; void Update(double dt) override; - - - private: + float m_BGMMasterVolume = 1.f; + float m_SFXMasterVolume = 1.f; + std::map m_BGMSourcesToBuffers; + std::map m_SFXSourcesToBuffers; + ALCdevice* m_Device = nullptr; + //Events dd::EventRelay m_EPlaySFX; - dd::EventRelay m_EContact; - dd::EventRelay m_EStopSound; - dd::EventRelay m_EMasterVolume; bool OnPlaySound(const dd::Events::PlaySound &event); + //On contact: play the sound given in the CCOllisionSound. + dd::EventRelay m_EContact; bool OnContact(const dd::Events::Contact &event); + dd::EventRelay m_EStopSound; bool OnStopSound(const dd::Events::StopSound &event); + dd::EventRelay m_EMasterVolume; bool OnMasterVolume(const dd::Events::MasterVolume &event); ALuint CreateSource(); - - std::map m_BGMSourcesToBuffers; - std::map m_SFXSourcesToBuffers; - - ALCdevice* m_Device; - - float m_BGMMasterVolume, m_SFXMasterVolume; - }; + } } -#endif //DAYDREAM_SOUND_H +#endif diff --git a/src/game/CMakeLists.txt b/src/game/CMakeLists.txt index 6834897..b4fe3b4 100755 --- a/src/game/CMakeLists.txt +++ b/src/game/CMakeLists.txt @@ -7,7 +7,6 @@ find_package(Boost REQUIRED COMPONENTS system filesystem thread chrono) find_package(assimp REQUIRED) find_package(ZLIB REQUIRED) find_package(PNG REQUIRED) -find_package(BGFX REQUIRED) find_package(liquidfun REQUIRED) # Because FindOpenAL is retarded set(CMAKE_INCLUDE_PATH ${CMAKE_INCLUDE_PATH} "${CMAKE_SOURCE_DIR}/deps/include/AL") @@ -28,7 +27,6 @@ include_directories( ${assimp_INCLUDE_DIRS} ${PNG_INCLUDE_DIRS} ${X11_INCLUDE_DIRS} - ${BGFX_INCLUDE_DIRS} ${OPENAL_INCLUDE_DIR} ${liquidfun_INCLUDE_DIRS} ) @@ -94,8 +92,7 @@ set(SOURCE_FILES ${SOURCE_FILES_Physics} ${SOURCE_FILES_Game} ${SOURCE_FILES_Sound} - ${SOURCE_FILES_GUI} -) + ${SOURCE_FILES_GUI}) if(CMAKE_COMPILER_IS_GNUCXX) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -pthread") @@ -112,7 +109,6 @@ target_link_libraries(game ${assimp_LIBRARIES} ${PNG_LIBRARIES} ${X11_LIBRARIES} - ${BGFX_LIBRARIES} ${OPENAL_LIBRARY} ${liquidfun_LIBRARIES} ) @@ -129,7 +125,6 @@ target_link_libraries(breakout ${assimp_LIBRARIES} ${PNG_LIBRARIES} ${X11_LIBRARIES} - ${BGFX_LIBRARIES} ${OPENAL_LIBRARY} ${liquidfun_LIBRARIES} ) diff --git a/src/game/Core/EventBroker.cpp b/src/game/Core/EventBroker.cpp index 2c68fd0..ce91fd9 100644 --- a/src/game/Core/EventBroker.cpp +++ b/src/game/Core/EventBroker.cpp @@ -29,32 +29,26 @@ dd::BaseEventRelay::~BaseEventRelay() void dd::EventBroker::Unsubscribe(BaseEventRelay &relay) // ? { - auto contextIt = m_ContextRelays.find(relay.m_ContextTypeName); - if (contextIt == m_ContextRelays.end()) - return; - - auto eventRelays = contextIt->second; - - auto itpair = eventRelays.equal_range(relay.m_EventTypeName); - for (auto it = itpair.first; it != itpair.second; ++it) - { - if (it->second == &relay) - { - relay.m_Broker = nullptr; - eventRelays.erase(it); - break; - } + if (m_IsProcessing) { + m_RelaysToUnsubscribe.push_back(&relay); + } else { + unsubscribeImmediate(relay); } } void dd::EventBroker::Subscribe(BaseEventRelay &relay) { - relay.m_Broker = this; - m_ContextRelays[relay.m_ContextTypeName].insert(std::make_pair(relay.m_EventTypeName, &relay)); + if (m_IsProcessing) { + m_RelaysToSubscribe.push_back(&relay); + } else { + subscribeImmediate(relay); + } } int dd::EventBroker::Process(std::string contextTypeName) { + m_IsProcessing = true; + auto it = m_ContextRelays.find(contextTypeName); if (it == m_ContextRelays.end()) return 0; @@ -68,14 +62,29 @@ int dd::EventBroker::Process(std::string contextTypeName) std::shared_ptr event = pair.second; auto itpair = relays.equal_range(eventTypeName); - for (auto it2 = itpair.first; it2 != itpair.second; ++it2) + for (auto it2 = itpair.first; it2 != itpair.second; it2++) { - auto relay = it2->second; + std::string name = it2->first; + BaseEventRelay* relay = it2->second; relay->Receive(event); eventsProcessed++; } } + m_IsProcessing = false; + + // Process pending subscriptions + for (auto& r : m_RelaysToSubscribe) { + subscribeImmediate(*r); + } + m_RelaysToSubscribe.clear(); + + // Process pending unsubscriptions + for (auto& r : m_RelaysToUnsubscribe) { + unsubscribeImmediate(*r); + } + m_RelaysToUnsubscribe.clear(); + return eventsProcessed; } @@ -83,4 +92,29 @@ void dd::EventBroker::Swap() { std::swap(m_EventQueueRead, m_EventQueueWrite); m_EventQueueWrite->clear(); + +} + +void dd::EventBroker::subscribeImmediate(dd::BaseEventRelay& relay) +{ + relay.m_Broker = this; + m_ContextRelays[relay.m_ContextTypeName].insert(std::make_pair(relay.m_EventTypeName, &relay)); +} + +void dd::EventBroker::unsubscribeImmediate(dd::BaseEventRelay& relay) +{ + auto contextIt = m_ContextRelays.find(relay.m_ContextTypeName); + if (contextIt == m_ContextRelays.end()) { + return; + } + + auto eventRelays = contextIt->second; + auto itpair = eventRelays.equal_range(relay.m_EventTypeName); + for (auto it = itpair.first; it != itpair.second; ++it) { + if (it->second == &relay) { + relay.m_Broker = nullptr; + eventRelays.erase(it); + break; + } + } } diff --git a/src/game/Core/OBJ.cpp b/src/game/Core/OBJ.cpp index fe6a818..0dd75a5 100644 --- a/src/game/Core/OBJ.cpp +++ b/src/game/Core/OBJ.cpp @@ -263,7 +263,7 @@ void dd::OBJ::ParseMaterial() ParseColorMap(currentLine, ss, prefix, arg, colorMap); } - // HACK: Should we really have to specify the full path here? + // HACK: Should we really have to specify the full FilePath here? colorMap.FileName = (m_MaterialPath.branch_path() / colorMap.FileName).string(); currentMaterial->DiffuseTexture = colorMap; continue; @@ -280,7 +280,7 @@ void dd::OBJ::ParseMaterial() ParseColorMap(currentLine, ss, prefix, arg, colorMap); } - // HACK: Should we really have to specify the full path here? + // HACK: Should we really have to specify the full FilePath here? colorMap.FileName = (m_MaterialPath.branch_path() / colorMap.FileName).string(); currentMaterial->SpecularMap = colorMap; continue; @@ -297,7 +297,7 @@ void dd::OBJ::ParseMaterial() ParseBumpMap(currentLine, ss, prefix, arg, bumpMap); } - // HACK: Should we really have to specify the full path here? + // HACK: Should we really have to specify the full FilePath here? bumpMap.FileName = (m_MaterialPath.branch_path() / bumpMap.FileName).string(); currentMaterial->NormalMap = bumpMap; continue; diff --git a/src/game/Core/World.cpp b/src/game/Core/World.cpp index 2ff460a..f0f7e8c 100644 --- a/src/game/Core/World.cpp +++ b/src/game/Core/World.cpp @@ -163,7 +163,7 @@ void dd::World::Initialize() } } -int dd::World::CommitEntity(EntityID entity) +void dd::World::CommitEntity(EntityID entity) { for (auto pair : m_Systems) { diff --git a/src/game/Game/BallSystem.cpp b/src/game/Game/BallSystem.cpp index 37df50a..4c624f2 100644 --- a/src/game/Game/BallSystem.cpp +++ b/src/game/Game/BallSystem.cpp @@ -13,17 +13,151 @@ void dd::Systems::BallSystem::RegisterComponents(ComponentFactory *cf) void dd::Systems::BallSystem::Initialize() { - EVENT_SUBSCRIBE_MEMBER(m_Contact, BallSystem::Contact); + EVENT_SUBSCRIBE_MEMBER(m_Contact, &BallSystem::Contact); + EVENT_SUBSCRIBE_MEMBER(m_ELifeLost, &BallSystem::OnLifeLost); + EVENT_SUBSCRIBE_MEMBER(m_EMultiBallLost, &BallSystem::OnMultiBallLost); + EVENT_SUBSCRIBE_MEMBER(m_EResetBall, &BallSystem::OnResetBall); + EVENT_SUBSCRIBE_MEMBER(m_EMultiBall, &BallSystem::OnMultiBall); + EVENT_SUBSCRIBE_MEMBER(m_EPause, &BallSystem::OnPause); + + //OctoBall + { + auto ent = m_World->CreateEntity(); + std::shared_ptr transform = m_World->AddComponent(ent); + transform->Position = glm::vec3(-0.f, 50.26f, -10.f); + transform->Scale = glm::vec3(0.3f, 0.3f, 0.3f); + transform->Velocity = glm::vec3(0.f, 0.f, 0.f); + auto model = m_World->AddComponent(ent); + model->ModelFile = "Models/Test/Ball/Sid.obj"; + std::shared_ptr circleShape = m_World->AddComponent(ent); + circleShape->Radius = 0.4f; + std::shared_ptr ball = m_World->AddComponent(ent); + ball->Speed = 5.f; + std::shared_ptr physics = m_World->AddComponent(ent); + std::shared_ptr ballTemplate = m_World->AddComponent(ent); + physics->CollisionType = CollisionType::Type::Dynamic; + physics->Category = CollisionLayer::Type::Ball; + physics->Mask = static_cast(CollisionLayer::Type::Pad | CollisionLayer::Type::Brick | CollisionLayer::Type::Wall); + physics->Calculate = true; + + //auto plight = m_World->AddComponent(ent); + //plight->Radius = 2.f; + + m_World->CommitEntity(ent); + + SetBall(ent); + + auto ent2 = CreateBall(); + auto transform2 = m_World->GetComponent(ent2); + transform2->Position = glm::vec3(-0.f, 0.26f, -10.f); + transform2->Velocity = glm::vec3(0.0f, -10.f, 0.f); + } + + for (int i = 0; i < Lives(); i++) { + CreateLife(i); + } } void dd::Systems::BallSystem::Update(double dt) { - + if (Lives() < 0) + { + SetLives(3); + Events::GameOver e; + EventBroker->Publish(e); + } + ResolveContacts(); } void dd::Systems::BallSystem::UpdateEntity(double dt, EntityID entity, EntityID parent) { + //TODO: When the ball collides with 2 bricks on the same frame it is reflected and then reflected again, make it reflect only once like a list or something? + auto ballComponent = m_World->GetComponent(entity); + if (IsPaused()) { + if (ballComponent != nullptr) { + auto transform = m_World->GetComponent(entity); + + if (!ballComponent->Paused) { + ballComponent->Paused = true; + ballComponent->SavedSpeed = transform->Velocity; + transform->Velocity = glm::vec3(0, 0, 0); + } + } + return; + } else { + if (ballComponent != nullptr) { + auto transform = m_World->GetComponent(entity); + + if (ballComponent->Paused) { + transform->Velocity = ballComponent->SavedSpeed; + ballComponent->Paused = false; + } + } + } + + auto templateCheck = m_World->GetComponent(entity); + if (templateCheck != nullptr){ return; } + + if (ballComponent != nullptr) { + if (ReplaceBall()) { + SetReplaceBall(false); + + auto transform = m_World->GetComponent(entity); + transform->Position = glm::vec3(0.0f, 0.26f, -10.f); + transform->Velocity = glm::vec3(0.0f, -ballComponent->Speed, 0.f); + } + + auto transformBall = m_World->GetComponent(entity); + if (glm::abs(transformBall->Velocity.y) < 2) { + if (transformBall->Velocity.y > 0) { + transformBall->Velocity.y = 2; + } else { + transformBall->Velocity.y = -2; + } + } + if (transformBall->Position.y < -EdgeY() - 4) { + if (MultiBalls() != 0) { + m_World->RemoveEntity(entity); + Events::MultiBallLost e; + EventBroker->Publish(e); + } else if (Lives() == PastLives()) { + Events::ResetBall be; + EventBroker->Publish(be); + Events::LifeLost e; + e.Entity = entity; + EventBroker->Publish(e); + return; + } + } //Removing this made the wall collisions work again + /*else if (transformBall->Position.x > EdgeX()) { + if (transformBall->Velocity.x > 0) { + glm::vec2 reflectedVelocity = glm::reflect(glm::vec2(transformBall->Velocity.x, transformBall->Velocity.y), glm::vec2(1, 0)); + transformBall->Velocity = glm::vec3(reflectedVelocity, 0.f); + } + } else if (transformBall->Position.x < -EdgeX()) { + if (transformBall->Velocity.x < 0) { + glm::vec2 reflectedVelocity = glm::reflect(glm::vec2(transformBall->Velocity.x, transformBall->Velocity.y), glm::vec2(-1, 0)); + transformBall->Velocity = glm::vec3(reflectedVelocity, 0.f); + } + } else if (transformBall->Position.y > EdgeY()) { + if (transformBall->Velocity.y > 0) { + glm::vec2 reflectedVelocity = glm::reflect(glm::vec2(transformBall->Velocity.x, transformBall->Velocity.y), glm::vec2(0, 1)); + transformBall->Velocity = glm::vec3(reflectedVelocity, 0.f); + } + }*/ + } + + if (Lives() != PastLives()) { + auto life = m_World->GetComponent(entity); + if (life != nullptr) { + if (life->Number + 1 == PastLives()) { + m_World->RemoveEntity(entity); + SetPastLives(Lives()); + } + } + } + if (ballComponent != nullptr) { auto transform = m_World->GetComponent(entity); glm::vec2 dir = glm::normalize(glm::vec2(transform->Velocity.x, transform->Velocity.y)); @@ -33,6 +167,20 @@ void dd::Systems::BallSystem::UpdateEntity(double dt, EntityID entity, EntityID } } +bool dd::Systems::BallSystem::OnPause(const dd::Events::Pause &event) +{ + if (event.Type != "BallSystem" && event.Type != "All") { + return false; + } + + if (IsPaused()) { + SetPause(false); + } else { + SetPause(true); + } + return true; +} + void dd::Systems::BallSystem::OnEntityCommit(EntityID entity) { @@ -79,23 +227,162 @@ bool dd::Systems::BallSystem::Contact(const Events::Contact &event) //TODO: Add support for power-up collisions } + auto brick = m_World->GetComponent(otherEntitiy); + if (brick != nullptr) { + auto transform = m_World->GetComponent(otherEntitiy); + auto physics = m_World->GetComponent(otherEntitiy); + auto rectangle = m_World->GetComponent(otherEntitiy); + int hey = 5; + } + //if this is a brick thats dead do not collide :) auto ballTransform = m_World->GetComponent(ballEntity); glm::vec2 ballVelocity = glm::vec2(ballTransform->Velocity.x, ballTransform->Velocity.y); if (m_World->GetProperty(otherEntitiy, "Name") == "Pad"){ + Events::HitPad e; + EventBroker->Publish(e); + // Events::HitLag el; + // el.Time = 0.1f; + //el.Type = "All"; + // EventBroker->Publish(el); + auto padTransform = m_World->GetComponent(otherEntitiy); - float x = ballTransform->Position.x - padTransform->Position.x; + float x = (ballTransform->Position.x - padTransform->Position.x) * XMovementMultiplier(); float y = glm::cos((abs(x) / (1.6f)) * glm::pi() / 2.f) + 1.f; ballTransform->Velocity = glm::normalize(glm::vec3(x, y ,0.f)) * ballComponent->Speed; + ballComponent->Combo = 0; + Events::ComboEvent ec; + ec.Combo = ballComponent->Combo; + ec.Ball = ballEntity; + EventBroker->Publish(ec); + //std::cout << "Combo: " << ballComponent->Combo << std::endl; } else { - glm::vec2 reflectedVelocity = glm::reflect(ballVelocity, event.Normal); - ballTransform->Velocity = glm::vec3(reflectedVelocity, 0.f); + auto it = m_Contacts.find(ballEntity); + if (it == m_Contacts.end()) { + std::list normalList; + normalList.push_back(event.Normal); + m_Contacts[ballEntity] = normalList; + } else { + std::list normalList = it->second; + normalList.push_back(event.Normal); + m_Contacts[ballEntity] = normalList; + } + + //glm::vec2 reflectedVelocity = glm::reflect(ballVelocity, event.Normal); + //ballTransform->Velocity = glm::vec3(reflectedVelocity, 0.f); } return true; } + + +void dd::Systems::BallSystem::ResolveContacts() +{ + + for (auto c : m_Contacts) { + int count = 0; + EntityID entity = c.first; + std::list contactNormals = c.second; + glm::vec2 finalNormal = glm::vec2(0.f); + for (auto it = contactNormals.begin(); it != contactNormals.end(); it++) { + finalNormal = finalNormal + (*it); + count++; + } + finalNormal = glm::normalize(finalNormal); + + if (count > 1) { + LOG_INFO("MultiCollision %i", count); + } + + auto transform = m_World->GetComponent(entity); + glm::vec2 velocity = glm::vec2(transform->Velocity.x, transform->Velocity.y); + glm::vec2 reflectedVelocity = glm::reflect(velocity, finalNormal); + transform->Velocity = glm::vec3(reflectedVelocity, 0.f); + + } + + + m_Contacts.clear(); +} + +EntityID dd::Systems::BallSystem::CreateBall() +{ + auto ent = m_World->CloneEntity(Ball()); + m_World->RemoveComponent(ent); + + return ent; +} + +void dd::Systems::BallSystem::CreateLife(int number) +{ + auto life = m_World->CreateEntity(); + std::shared_ptr transform = m_World->AddComponent(life); + transform->Position = glm::vec3(-1.5f + number * 0.15f, -2.f, -5.f); + transform->Scale = glm::vec3(0.1f, 0.1f, 0.1f); + + std::shared_ptr lifeNr = m_World->AddComponent(life); + lifeNr->Number = number; + + auto model = m_World->AddComponent(life); + model->ModelFile = "Models/Test/Ball/Sid.obj"; + + + m_World->CommitEntity(life); +} + +bool dd::Systems::BallSystem::OnLifeLost(const dd::Events::LifeLost &event) +{ + SetLives(Lives() - 1); + + return true; +} + +bool dd::Systems::BallSystem::OnMultiBallLost(const dd::Events::MultiBallLost &event) +{ + SetMultiBalls(MultiBalls() - 1); + //std::cout << MultiBalls() << std::endl; + if (MultiBalls() < 0) { + auto ent = CreateBall(); + SetMultiBalls(0); + } + return true; +} + +bool dd::Systems::BallSystem::OnResetBall(const dd::Events::ResetBall &event) +{ + SetReplaceBall(true); + return true; +} + +bool dd::Systems::BallSystem::OnMultiBall(const dd::Events::MultiBall &event) +{ + auto ent1 = CreateBall(); + auto ent2 = CreateBall(); + auto transform1 = m_World->GetComponent(ent1); + auto transform2 = m_World->GetComponent(ent2); + auto ball1 = m_World->GetComponent(ent1); + auto ball2 = m_World->GetComponent(ent2); + auto padTransform = event.padTransform; + float x1 = padTransform->Position.x - 2, x2 = padTransform->Position.x + 2; + if (x1 < -m_EdgeX) { + x1 = m_EdgeX - 0.2; + } + if (x2 > m_EdgeX) { + x2 = -m_EdgeX + 0.2; + } + transform1->Position = glm::vec3(x1, -5.5, -10); + transform2->Position = glm::vec3(x2, -5.5, -10); + + transform1->Velocity = glm::normalize(glm::vec3(5, 5 ,0.f)) * ball1->Speed; + transform2->Velocity = glm::normalize(glm::vec3(-5, 5 ,0.f)) * ball2->Speed; + + SetMultiBalls(MultiBalls() + 2); + //std::cout << MultiBalls() << std::endl; + return true; +} + diff --git a/src/game/Game/HitLagSystem.cpp b/src/game/Game/HitLagSystem.cpp new file mode 100644 index 0000000..8243900 --- /dev/null +++ b/src/game/Game/HitLagSystem.cpp @@ -0,0 +1,57 @@ +// +// Created by Adniklastrator on 2015-09-30. +// + +#include "PrecompiledHeader.h" +#include "Game/HitLagSystem.h" + +void dd::Systems::HitLagSystem::Initialize() +{ + EVENT_SUBSCRIBE_MEMBER(m_EPause, &HitLagSystem::OnPause); + EVENT_SUBSCRIBE_MEMBER(m_EHitLag, &HitLagSystem::OnHitLag); +} + +void dd::Systems::HitLagSystem::Update(double dt) +{ + if (IsPaused()) { + if (HitLag()) { + SetHitLagTimer(HitLagTimer() += dt); + //std::cout << HitLagTimer() << std::endl; + if (HitLagDuration() < HitLagTimer()) { + SetHitLagTimer(0); + SetHitLag(false); + FlipPause(); + } + } + return; + } +} + +void dd::Systems::HitLagSystem::FlipPause() +{ + Events::Pause e; + e.Type = CurrentType(); + EventBroker->Publish(e); +} + +bool dd::Systems::HitLagSystem::OnPause(const dd::Events::Pause &event) +{ + if (IsPaused()) { + SetPause(false); + } else { + SetPause(true); + } + return true; +} + +bool dd::Systems::HitLagSystem::OnHitLag(const dd::Events::HitLag &event) +{ + if (HitLag()) { + FlipPause(); + } + SetHitLag(true); + SetCurrentType(event.Type); + FlipPause(); + SetHitLagDuration(event.Time); + return true; +} \ No newline at end of file diff --git a/src/game/Game/LevelSystem.cpp b/src/game/Game/LevelSystem.cpp index 4130a78..ed7f6bd 100755 --- a/src/game/Game/LevelSystem.cpp +++ b/src/game/Game/LevelSystem.cpp @@ -9,156 +9,126 @@ void dd::Systems::LevelSystem::Initialize() { - EVENT_SUBSCRIBE_MEMBER(m_EContact, LevelSystem::OnContact); - EVENT_SUBSCRIBE_MEMBER(m_ELifeLost, LevelSystem::OnLifeLost); - EVENT_SUBSCRIBE_MEMBER(m_EScoreEvent, LevelSystem::OnScoreEvent); - EVENT_SUBSCRIBE_MEMBER(m_EMultiBall, LevelSystem::OnMultiBall); - EVENT_SUBSCRIBE_MEMBER(m_ECreatePowerUp, LevelSystem::OnCreatePowerUp); - EVENT_SUBSCRIBE_MEMBER(m_EPowerUpTaken, LevelSystem::OnPowerUpTaken); - EVENT_SUBSCRIBE_MEMBER(m_EStageCleared, LevelSystem::OnStageCleared); + EVENT_SUBSCRIBE_MEMBER(m_EContact, &LevelSystem::OnContact); + EVENT_SUBSCRIBE_MEMBER(m_EScoreEvent, &LevelSystem::OnScoreEvent); + EVENT_SUBSCRIBE_MEMBER(m_EMultiBall, &LevelSystem::OnMultiBall); + EVENT_SUBSCRIBE_MEMBER(m_ECreatePowerUp, &LevelSystem::OnCreatePowerUp); + EVENT_SUBSCRIBE_MEMBER(m_EMultiBallLost, &LevelSystem::OnMultiBallLost); + EVENT_SUBSCRIBE_MEMBER(m_EPowerUpTaken, &LevelSystem::OnPowerUpTaken); + EVENT_SUBSCRIBE_MEMBER(m_EStageCleared, &LevelSystem::OnStageCleared); + EVENT_SUBSCRIBE_MEMBER(m_EPause, &LevelSystem::OnPause); + EVENT_SUBSCRIBE_MEMBER(m_EHitPad, &LevelSystem::OnHitPad); - for (int i = 0; i < Lives(); i++) { - CreateLife(i); - } + m_BrickTemplate = m_World->CreateEntity(); + std::shared_ptr transform = m_World->AddComponent(m_BrickTemplate); + auto model = m_World->AddComponent(m_BrickTemplate); + std::shared_ptr cBrick = m_World->AddComponent(m_BrickTemplate); + std::shared_ptr cRec = m_World->AddComponent(m_BrickTemplate); + cRec->Dimensions = glm::vec2(0.9f, 0.35f); + std::shared_ptr cPhys = m_World->AddComponent(m_BrickTemplate); + std::shared_ptr cTemplate = m_World->AddComponent(m_BrickTemplate); + cPhys->CollisionType = CollisionType::Type::Dynamic; + cPhys->GravityScale = 0.f; + cPhys->Category = CollisionLayer::Type::Brick; + cPhys->Mask = CollisionLayer::Type::Ball; + + model->ModelFile = "Models/Brick/TurquoiseBrick.obj"; + transform->Position = glm::vec3(50, 50, -10); + + //sound + auto collisionSound = m_World->AddComponent(m_BrickTemplate); + collisionSound->FilePath = "Sounds/Brick/shortbrickbreak.wav"; + + m_World->CommitEntity(m_BrickTemplate); return; } -void dd::Systems::LevelSystem::CreateLife(int number) -{ - auto life = m_World->CreateEntity(); - std::shared_ptr transform = m_World->AddComponent(life); - transform->Position = glm::vec3(-1.5f + number * 0.15f, -2.f, -5.f); - transform->Scale = glm::vec3(0.1f, 0.1f, 0.1f); - - std::shared_ptr lifeNr = m_World->AddComponent(life); - lifeNr->Number = number; - - auto model = m_World->AddComponent(life); - model->ModelFile = "Models/Test/Ball/Ballopus.obj"; - - - m_World->CommitEntity(life); -} - void dd::Systems::LevelSystem::Update(double dt) { if (!m_Initialized) { - CreateBasicLevel(Rows(), Lines(), SpaceBetweenBricks(), SpaceToEdge()); + GetNextLevel(); + CreateLevel(); m_Initialized = true; } - - if (Lives() < 0) - { - SetLives(3); - Events::GameOver e; - EventBroker->Publish(e); - } } void dd::Systems::LevelSystem::UpdateEntity(double dt, EntityID entity, EntityID parent) { + if (IsPaused()) { + return; + } + auto templateCheck = m_World->GetComponent(entity); + if (templateCheck != nullptr){ return; } + + auto brick = m_World->GetComponent(entity); + if (brick != nullptr) { + auto transform = m_World->GetComponent(entity); + //Removes bricks that falls out of the stage. + if (transform->Position.y < -10) { + if (brick->Type == MultiBallBrick) { + Events::MultiBall e; + e.padTransform = transform; + EventBroker->Publish(e); + } + m_LooseBricks--; + m_World->RemoveEntity(entity); + } + } + auto ball = m_World->GetComponent(entity); - if (ball != nullptr) { - auto transformBall = m_World->GetComponent(entity); - if (glm::abs(transformBall->Velocity.y) < 2) { - if (transformBall->Velocity.y > 0) { - transformBall->Velocity.y = 2; - } else { - transformBall->Velocity.y = -2; - } - } - if (transformBall->Position.y < -EdgeY() - 4) { - if (MultiBalls() != 0) { - SetMultiBalls(MultiBalls() - 1); -// m_World->RemoveComponent(entity); -// m_World->RemoveComponent(entity); -// m_World->RemoveComponent(entity); -// m_World->RemoveComponent(entity); - m_World->RemoveEntity(entity); - } else if (Lives() == PastLives()) { - Events::ResetBall be; - EventBroker->Publish(be); - Events::LifeLost e; - e.Entity = entity; - EventBroker->Publish(e); - return; - } - } else if (transformBall->Position.x > EdgeX()) { - if (transformBall->Velocity.x > 0) { - glm::vec2 reflectedVelocity = glm::reflect(glm::vec2(transformBall->Velocity.x, transformBall->Velocity.y), glm::vec2(1, 0)); - transformBall->Velocity = glm::vec3(reflectedVelocity, 0.f); - } - } else if (transformBall->Position.x < -EdgeX()) { - if (transformBall->Velocity.x < 0) { - glm::vec2 reflectedVelocity = glm::reflect(glm::vec2(transformBall->Velocity.x, transformBall->Velocity.y), glm::vec2(-1, 0)); - transformBall->Velocity = glm::vec3(reflectedVelocity, 0.f); - } - } else if (transformBall->Position.y > EdgeY()) { - if (transformBall->Velocity.y > 0) { - glm::vec2 reflectedVelocity = glm::reflect(glm::vec2(transformBall->Velocity.x, transformBall->Velocity.y), glm::vec2(0, 1)); - transformBall->Velocity = glm::vec3(reflectedVelocity, 0.f); - } - } - } - - if (Lives() != PastLives()) { - auto life = m_World->GetComponent(entity); - if (life != nullptr) { - if (life->Number + 1 == PastLives()) { -// m_World->RemoveComponent(entity); -// m_World->RemoveComponent(entity); - m_World->RemoveEntity(entity); - SetPastLives(Lives()); - } - } - } - if (NumberOfBricks() <= 0) { - /*SetRestarting(true); + if (NumberOfBricks() <= 0 && m_LooseBricks <= 0 && !Restarting()) { if (MultiBalls() <= 0 && PowerUps() <= 0) { - Events::ResetBall e; - EventBroker->Publish(e); - Events::ScoreEvent es; - es.Score = 500; - EventBroker->Publish(es); Events::StageCleared ec; EventBroker->Publish(ec); - CreateBasicLevel(Rows(), Lines(), SpaceBetweenBricks(), SpaceToEdge()); } else { if (ball != nullptr && MultiBalls() > 0) { - SetMultiBalls(MultiBalls() - 1); - m_World->RemoveComponent(entity); - m_World->RemoveComponent(entity); - m_World->RemoveComponent(entity); - m_World->RemoveComponent(entity); + Events::MultiBallLost e; + EventBroker->Publish(e); m_World->RemoveEntity(entity); - auto transformBall = m_World->GetComponent(entity); } else { auto powerUp = m_World->GetComponent(entity); if (powerUp != nullptr) { SetPowerUps(PowerUps() - 1); - m_World->RemoveComponent(entity); - m_World->RemoveComponent(entity); m_World->RemoveEntity(entity); + } else { + if (brick != nullptr) { + m_LooseBricks--; + m_World->RemoveEntity(entity); + } } } - }*/ + } } } +bool dd::Systems::LevelSystem::OnPause(const dd::Events::Pause &event) +{ + if (event.Type != "LevelSystem" && event.Type != "All") { + return false; + } + + if (IsPaused()) { + SetPause(false); + } else { + SetPause(true); + } + return true; +} + void dd::Systems::LevelSystem::CreateBasicLevel(int rows, int lines, glm::vec2 spacesBetweenBricks, float spaceToEdge) { SetNumberOfBricks(rows * lines); - std::cout << "You're only doing this once, right?" << std::endl; - int num = 0; + //std::cout << "You're only doing this once, right?" << std::endl; + int num = Lines(); for (int i = 0; i < rows; i++) { - num++; + num--; for (int j = 0; j < Lines(); j++) { - CreateBrick(i, j, spacesBetweenBricks, spaceToEdge, num); + CreateBrick(i, j, spacesBetweenBricks, spaceToEdge, num, 1); } - if (num == 7) - num = 0; + if (num == 1) + num = Lines(); } SetNumberOfBricks(rows * lines); @@ -166,60 +136,55 @@ void dd::Systems::LevelSystem::CreateBasicLevel(int rows, int lines, glm::vec2 s return; } -void dd::Systems::LevelSystem::CreateBrick(int row, int line, glm::vec2 spacesBetweenBricks, float spaceToEdge, int num) +void dd::Systems::LevelSystem::CreateLevel() { - auto brick = m_World->CreateEntity(); - std::shared_ptr transform = m_World->AddComponent(brick); - auto model = m_World->AddComponent(brick); - std::shared_ptr cBrick = m_World->AddComponent(brick); - std::shared_ptr cRec = m_World->AddComponent(brick); - std::shared_ptr cPhys = m_World->AddComponent(brick); - cPhys->Static = false; - cPhys->GravityScale = 0.f; - cPhys->Category = CollisionLayer::Type::Brick; - cPhys->Mask = CollisionLayer::Type::Ball; + std::cout << "Loading level: " << m_CurrentLevel << std::endl; + SetNumberOfBricks(Rows() * Lines()); + int num = Lines(); + int getter = 0; - std::string fileName = "Textures/Bricks/"; - fileName.append(std::to_string(num)); - fileName.append(".png"); - //sprite->SpriteFile = fileName; - model->ModelFile = "Models/Test/Brick/Brick.obj"; - if ((line == 1 && row == 4) || (line == 3 && row == 2) || (line == 6 && row == 6)) { + for (int i = 0; i < Rows(); i++) { + num--; + for (int j = 0; j < Lines(); j++) { + CreateBrick(i, j, SpaceBetweenBricks(), SpaceToEdge(), num, m_Bricks[getter]); + getter++; + } + if (num == 1) { + num = Lines(); + } + } + m_LooseBricks = NumberOfBricks(); + SetRestarting(false); +} + +void dd::Systems::LevelSystem::CreateBrick(int row, int line, glm::vec2 spacesBetweenBricks, float spaceToEdge, int num, int typeInt) +{ + if (typeInt == EmptyBrickSpace) { + SetNumberOfBricks(NumberOfBricks() - 1); + return; + } + auto brick = m_World->CloneEntity(m_BrickTemplate); + m_World->RemoveComponent(brick); + auto transform = m_World->GetComponent(brick); + auto cBrick = m_World->GetComponent(brick); + + if (typeInt == StandardBrick) { + } else if (typeInt == MultiBallBrick) { + cBrick->Type = MultiBallBrick; std::shared_ptr cPow = m_World->AddComponent(brick); + auto model = m_World->GetComponent(brick); + model->ModelFile = "Models/Brick/IceBrick.obj"; } float x = line * spacesBetweenBricks.x; float y = row * spacesBetweenBricks.y; - transform->Scale = glm::vec3(0.8, 0.2, 0.2); transform->Position = glm::vec3(x - 3, 5 - spaceToEdge - y , -10.f); cBrick->Score = 10 * num; - - //sound - auto collisionSound = m_World->AddComponent(brick); - collisionSound->filePath = "Sounds/Brick/shortbrickbreak.wav"; - - m_World->CommitEntity(brick); - return; -} - -void dd::Systems::LevelSystem::ProcessCollision() -{ - // Like, go into brick component and check what it does upon collision. Maybe not done here? return; } void dd::Systems::LevelSystem::OnEntityRemoved(EntityID entity) { - auto brick = m_World->GetComponent(entity); - if (brick != nullptr) { - SetNumberOfBricks(NumberOfBricks() - 1); - Events::ScoreEvent es; - es.Score = brick->Score; - EventBroker->Publish(es); - /*if (numberOfBricks < 1) { - EndLevel(); - }*/ - } - return; + } bool dd::Systems::LevelSystem::OnContact(const dd::Events::Contact &event) @@ -254,26 +219,28 @@ bool dd::Systems::LevelSystem::OnContact(const dd::Events::Contact &event) return false; } - auto power = m_World->GetComponent(entityBrick); - if (power != nullptr) { + /*auto power = m_World->GetComponent(entityBrick); + if (power != nullptr && NumberOfBricks() > 1) { Events::CreatePowerUp e; auto transform = m_World->GetComponent(entityBrick); e.Position = transform->Position; EventBroker->Publish(e); - } + }*/ + + if (!Restarting() && !brick->Removed) { + brick->Removed = true; + // Hit brick with ball code. + ball->Combo += 1; + Events::ComboEvent ec; + ec.Combo = ball->Combo; + ec.Ball = entityBall; + EventBroker->Publish(ec); - if (ball != nullptr && Restarting() == false) { auto ballTransform = m_World->GetComponent(entityBall); -// m_World->RemoveComponent(entityBrick); -// m_World->RemoveComponent(entityBrick); -// m_World->RemoveComponent(entityBrick); -// m_World->RemoveComponent(entityBrick); -// m_World->RemoveEntity(entityBrick); - auto physicsComponent = m_World->GetComponent(entityBrick); physicsComponent->GravityScale = 1.f; - physicsComponent->Mask = CollisionLayer::Type::Water | CollisionLayer::Type::Wall; + physicsComponent->Mask = static_cast(CollisionLayer::Water | CollisionLayer::Wall); auto transformComponentBrick = m_World->GetComponent(entityBrick); auto transformComponentBall = m_World->GetComponent(entityBall); @@ -289,28 +256,21 @@ bool dd::Systems::LevelSystem::OnContact(const dd::Events::Contact &event) EventBroker->Publish(e); //TODO: Bricks dont collide with walls D= + SetNumberOfBricks(NumberOfBricks() - 1); - if (NumberOfBricks() <= 0) { - SetMultiBalls(MultiBalls() + 1); - } Events::ScoreEvent es; - es.Score = brick->Score; + es.Score = brick->Score * ball->Combo; EventBroker->Publish(es); - // std::cout << NumberOfBricks() << std::endl; + //std::cout << "Combo: " << ball->Combo << std::endl; + //std::cout << NumberOfBricks() << std::endl; + //std::cout << "Brick Score: " << brick->Score << std::endl; //std::cout << "Score: " << Score() << std::endl; } return true; } -bool dd::Systems::LevelSystem::OnLifeLost(const dd::Events::LifeLost &event) -{ - SetLives(Lives() - 1); - - return true; -} - bool dd::Systems::LevelSystem::OnScoreEvent(const dd::Events::ScoreEvent &event) { SetScore(Score() += event.Score); @@ -321,6 +281,16 @@ bool dd::Systems::LevelSystem::OnScoreEvent(const dd::Events::ScoreEvent &event) bool dd::Systems::LevelSystem::OnMultiBall(const dd::Events::MultiBall &event) { SetMultiBalls(MultiBalls()+2); + return true; +} + +bool dd::Systems::LevelSystem::OnMultiBallLost(const dd::Events::MultiBallLost &event) +{ + SetMultiBalls(MultiBalls()-1); + if (MultiBalls() < 0) { + SetMultiBalls(0); + } + return true; } bool dd::Systems::LevelSystem::OnCreatePowerUp(const dd::Events::CreatePowerUp &event) @@ -331,13 +301,12 @@ bool dd::Systems::LevelSystem::OnCreatePowerUp(const dd::Events::CreatePowerUp & auto model = m_World->AddComponent(powerUp); std::shared_ptr cRec = m_World->AddComponent(powerUp); std::shared_ptr cPhys = m_World->AddComponent(powerUp); - cPhys->Static = false; + cPhys->CollisionType = CollisionType::Type::Dynamic; cPhys->Category = CollisionLayer::Type::PowerUp; cPhys->Mask = CollisionLayer::Type::Pad; std::shared_ptr cPow = m_World->AddComponent(powerUp); - transform->Position = event.Position; transform->Scale = glm::vec3(0.2, 0.2, 0.2); transform->Velocity = glm::vec3(0, -4, 0); @@ -357,13 +326,122 @@ bool dd::Systems::LevelSystem::OnPowerUpTaken(const dd::Events::PowerUpTaken &ev bool dd::Systems::LevelSystem::OnStageCleared(const dd::Events::StageCleared &event) { + if (!m_Cleared) { + m_Cleared = true; + SetRestarting(true); + Events::ResetBall e; + EventBroker->Publish(e); + Events::ScoreEvent es; + es.Score = 500; + EventBroker->Publish(es); + m_CurrentLevel++; + if (m_CurrentLevel < 6) { + GetNextLevel(); + CreateLevel(); + } + } return true; } -void dd::Systems::LevelSystem::EndLevel() +void dd::Systems::LevelSystem::GetNextLevel() { - Events::StageCleared e; - EventBroker->Publish(e); - return; + std::array level; + // 0 is empty space. + // 1 is standard brick. + // 2 is multiball brick. + if (m_CurrentCluster == 1) { + if (m_CurrentLevel == 1) { + level = + {0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0}; + } else if (m_CurrentLevel == 2) { + level = + {1, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0}; + } else if (m_CurrentLevel == 3) { + level = + {0, 0, 0, 0, 0, 0, 1, + 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0}; + } else if (m_CurrentLevel == 4) { + level = + {0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, + 1, 0, 0, 0, 0, 0, 0}; + } else if (m_CurrentLevel == 5) { + level = + {0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1}; + } + } else if (m_CurrentCluster == 2) { + if (m_CurrentLevel == 1) { + level = + {1, 1, 0, 1, 0, 1, 1, + 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, + 1, 2, 1, 2, 1, 2, 1, + 1, 1, 0, 1, 0, 1, 1, + 1, 0, 0, 1, 0, 0, 1}; + } else if (m_CurrentLevel == 2) { + level = + {1, 0, 0, 0, 0, 0, 1, + 0, 1, 0, 0, 0, 1, 0, + 0, 0, 2, 2, 2, 0, 0, + 0, 0, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0}; + } else if (m_CurrentLevel == 3) { + level = + {2, 0, 0, 0, 0, 0, 2, + 0, 1, 0, 0, 0, 1, 0, + 1, 2, 1, 1, 1, 2, 1, + 1, 0, 1, 1, 1, 0, 1, + 1, 0, 1, 1, 1, 0, 1, + 1, 0, 1, 1, 1, 0, 1}; + } else if (m_CurrentLevel == 4) { + level = + {1, 2, 1, 1, 1, 2, 1, + 1, 0, 1, 1, 1, 0, 1, + 1, 2, 1, 1, 1, 2, 1, + 1, 0, 1, 1, 1, 0, 1, + 1, 0, 0, 0, 0, 0, 1, + 0, 1, 1, 0, 1, 1, 0}; + } else if (m_CurrentLevel == 5) { + level = + {1, 0, 1, 0, 1, 0, 1, + 0, 1, 0, 1, 0, 1, 0, + 2, 0, 1, 0, 1, 0, 2, + 0, 1, 0, 2, 0, 1, 0, + 1, 0, 1, 0, 1, 0, 1, + 0, 1, 0, 1, 0, 1, 0}; + } + } else if (m_CurrentCluster == 3) { + + } + + std::copy(std::begin(level), std::end(level), std::begin(m_Bricks)); } +bool dd::Systems::LevelSystem::OnHitPad(const dd::Events::HitPad &event) +{ + m_Cleared = false; + return true; +} diff --git a/src/game/Game/LevelSystem.cpp.orig b/src/game/Game/LevelSystem.cpp.orig deleted file mode 100644 index b1d1139..0000000 --- a/src/game/Game/LevelSystem.cpp.orig +++ /dev/null @@ -1,372 +0,0 @@ -// -// Created by Adniklastrator on 2015-09-09. -// - - -#include "PrecompiledHeader.h" -#include "Game/LevelSystem.h" - - -void dd::Systems::LevelSystem::Initialize() -{ - EVENT_SUBSCRIBE_MEMBER(m_EContact, LevelSystem::OnContact); - EVENT_SUBSCRIBE_MEMBER(m_ELifeLost, LevelSystem::OnLifeLost); - EVENT_SUBSCRIBE_MEMBER(m_EScoreEvent, LevelSystem::OnScoreEvent); - EVENT_SUBSCRIBE_MEMBER(m_EMultiBall, LevelSystem::OnMultiBall); - EVENT_SUBSCRIBE_MEMBER(m_ECreatePowerUp, LevelSystem::OnCreatePowerUp); - EVENT_SUBSCRIBE_MEMBER(m_EPowerUpTaken, LevelSystem::OnPowerUpTaken); - EVENT_SUBSCRIBE_MEMBER(m_EStageCleared, LevelSystem::OnStageCleared); - - for (int i = 0; i < Lives(); i++) { - CreateLife(i); - } - - return; -} - -void dd::Systems::LevelSystem::CreateLife(int number) -{ - auto life = m_World->CreateEntity(); - std::shared_ptr transform = m_World->AddComponent(life); - transform->Position = glm::vec3(-1.5f + number * 0.15f, -2.f, -5.f); - transform->Scale = glm::vec3(0.1f, 0.1f, 0.1f); - - std::shared_ptr lifeNr = m_World->AddComponent(life); - lifeNr->Number = number; - - auto model = m_World->AddComponent(life); - model->ModelFile = "Models/Test/Ball/Ballopus.obj"; - - - m_World->CommitEntity(life); -} - -void dd::Systems::LevelSystem::Update(double dt) -{ - if (!m_Initialized) { - CreateBasicLevel(Rows(), Lines(), SpaceBetweenBricks(), SpaceToEdge()); - m_Initialized = true; - } - - if (Lives() < 0) - { - SetLives(3); - Events::GameOver e; - EventBroker->Publish(e); - } -} - -void dd::Systems::LevelSystem::UpdateEntity(double dt, EntityID entity, EntityID parent) -{ - auto ball = m_World->GetComponent(entity); - - if (ball != nullptr) { - auto transformBall = m_World->GetComponent(entity); - if (glm::abs(transformBall->Velocity.y) < 2) { - if (transformBall->Velocity.y > 0) { - transformBall->Velocity.y = 2; - } else { - transformBall->Velocity.y = -2; - } - } - if (transformBall->Position.y < -EdgeY() - 4) { - if (MultiBalls() != 0) { - SetMultiBalls(MultiBalls() - 1); -// m_World->RemoveComponent(entity); -// m_World->RemoveComponent(entity); -// m_World->RemoveComponent(entity); -// m_World->RemoveComponent(entity); - m_World->RemoveEntity(entity); - } else if (Lives() == PastLives()) { - Events::ResetBall be; - EventBroker->Publish(be); - Events::LifeLost e; - e.Entity = entity; - EventBroker->Publish(e); - return; - } - } else if (transformBall->Position.x > EdgeX()) { - if (transformBall->Velocity.x > 0) { - glm::vec2 reflectedVelocity = glm::reflect(glm::vec2(transformBall->Velocity.x, transformBall->Velocity.y), glm::vec2(1, 0)); - transformBall->Velocity = glm::vec3(reflectedVelocity, 0.f); - } - } else if (transformBall->Position.x < -EdgeX()) { - if (transformBall->Velocity.x < 0) { - glm::vec2 reflectedVelocity = glm::reflect(glm::vec2(transformBall->Velocity.x, transformBall->Velocity.y), glm::vec2(-1, 0)); - transformBall->Velocity = glm::vec3(reflectedVelocity, 0.f); - } - } else if (transformBall->Position.y > EdgeY()) { - if (transformBall->Velocity.y > 0) { - glm::vec2 reflectedVelocity = glm::reflect(glm::vec2(transformBall->Velocity.x, transformBall->Velocity.y), glm::vec2(0, 1)); - transformBall->Velocity = glm::vec3(reflectedVelocity, 0.f); - } - } - } - - if (Lives() != PastLives()) { - auto life = m_World->GetComponent(entity); - if (life != nullptr) { - if (life->Number + 1 == PastLives()) { -// m_World->RemoveComponent(entity); -// m_World->RemoveComponent(entity); - m_World->RemoveEntity(entity); - SetPastLives(Lives()); - } - } - } - if (NumberOfBricks() <= 0) { - /*SetRestarting(true); - if (MultiBalls() <= 0 && PowerUps() <= 0) { - Events::ResetBall e; - EventBroker->Publish(e); - Events::ScoreEvent es; - es.Score = 500; - EventBroker->Publish(es); - Events::StageCleared ec; - EventBroker->Publish(ec); - CreateBasicLevel(Rows(), Lines(), SpaceBetweenBricks(), SpaceToEdge()); - } else { - if (ball != nullptr && MultiBalls() > 0) { - SetMultiBalls(MultiBalls() - 1); - m_World->RemoveComponent(entity); - m_World->RemoveComponent(entity); - m_World->RemoveComponent(entity); - m_World->RemoveComponent(entity); - m_World->RemoveEntity(entity); - auto transformBall = m_World->GetComponent(entity); - } else { - auto powerUp = m_World->GetComponent(entity); - if (powerUp != nullptr) { - SetPowerUps(PowerUps() - 1); - m_World->RemoveComponent(entity); - m_World->RemoveComponent(entity); - m_World->RemoveEntity(entity); - } - } - }*/ - } -} - -void dd::Systems::LevelSystem::CreateBasicLevel(int rows, int lines, glm::vec2 spacesBetweenBricks, float spaceToEdge) -{ - SetNumberOfBricks(rows * lines); - std::cout << "You're only doing this once, right?" << std::endl; - int num = 0; - for (int i = 0; i < rows; i++) { - num++; - for (int j = 0; j < Lines(); j++) { - CreateBrick(i, j, spacesBetweenBricks, spaceToEdge, num); - } - if (num == 7) - num = 0; - } - - SetNumberOfBricks(rows * lines); - SetRestarting(false); - return; -} - -void dd::Systems::LevelSystem::CreateBrick(int row, int line, glm::vec2 spacesBetweenBricks, float spaceToEdge, int num) -{ - auto brick = m_World->CreateEntity(); - std::shared_ptr transform = m_World->AddComponent(brick); - auto model = m_World->AddComponent(brick); - std::shared_ptr cBrick = m_World->AddComponent(brick); - std::shared_ptr cRec = m_World->AddComponent(brick); - std::shared_ptr cPhys = m_World->AddComponent(brick); - cPhys->Static = false; - cPhys->GravityScale = 0.f; - cPhys->Category = CollisionLayer::Type::Brick; - cPhys->Mask = CollisionLayer::Type::Ball; - - std::string fileName = "Textures/Bricks/"; - fileName.append(std::to_string(num)); - fileName.append(".png"); - //sprite->SpriteFile = fileName; - model->ModelFile = "Models/Test/Brick/Brick.obj"; - if ((line == 1 && row == 4) || (line == 3 && row == 2) || (line == 6 && row == 6)) { - std::shared_ptr cPow = m_World->AddComponent(brick); - } - float x = line * spacesBetweenBricks.x; - float y = row * spacesBetweenBricks.y; - transform->Scale = glm::vec3(0.8, 0.2, 0.2); - transform->Position = glm::vec3(x - 3, 5 - spaceToEdge - y , -10.f); - cBrick->Score = 10 * num; - - //sound - auto collisionSound = m_World->AddComponent(brick); - collisionSound->filePath = "Sounds/Brick/shortbrickbreak.wav"; - - m_World->CommitEntity(brick); - return; -} - -void dd::Systems::LevelSystem::ProcessCollision() -{ - // Like, go into brick component and check what it does upon collision. Maybe not done here? - return; -} - -void dd::Systems::LevelSystem::OnEntityRemoved(EntityID entity) -{ - auto brick = m_World->GetComponent(entity); - if (brick != nullptr) { - SetNumberOfBricks(NumberOfBricks() - 1); - Events::ScoreEvent es; - es.Score = brick->Score; - EventBroker->Publish(es); - /*if (numberOfBricks < 1) { - EndLevel(); - }*/ - } - return; -} - -bool dd::Systems::LevelSystem::OnContact(const dd::Events::Contact &event) -{ - EntityID entityBrick; - EntityID entityBall; - auto ball = m_World->GetComponent(event.Entity2); - auto brick = m_World->GetComponent(event.Entity1); - if (brick != nullptr) { - entityBrick = event.Entity1; - } else { - brick = m_World->GetComponent(event.Entity2); - if (brick != nullptr) { - entityBrick = event.Entity2; - } else { - return false; - } - } - if (ball != nullptr) { - entityBall = event.Entity2; - } else { - ball = m_World->GetComponent(event.Entity1); - if (ball != nullptr) { - entityBall = event.Entity1; - } else { - return false; - } - } - - brick = m_World->GetComponent(entityBrick); - if (brick == nullptr) { - return false; - } - - auto power = m_World->GetComponent(entityBrick); - if (power != nullptr) { - Events::CreatePowerUp e; - auto transform = m_World->GetComponent(entityBrick); - e.Position = transform->Position; - EventBroker->Publish(e); - } - - if (ball != nullptr && Restarting() == false) { - auto ballTransform = m_World->GetComponent(entityBall); - -// m_World->RemoveComponent(entityBrick); -// m_World->RemoveComponent(entityBrick); -// m_World->RemoveComponent(entityBrick); -// m_World->RemoveComponent(entityBrick); -// m_World->RemoveEntity(entityBrick); - - auto physicsComponent = m_World->GetComponent(entityBrick); - physicsComponent->GravityScale = 1.f; - physicsComponent->Mask = CollisionLayer::Type::Water | CollisionLayer::Type::Wall; - - auto transformComponentBrick = m_World->GetComponent(entityBrick); - auto transformComponentBall = m_World->GetComponent(entityBall); - - Events::SetImpulse e; - e.Entity = entityBrick; - - glm::vec2 point = glm::vec2(transformComponentBrick->Position.x + ((transformComponentBrick->Position.x - transformComponentBall->Position.x)/4), transformComponentBrick->Position.y + ((transformComponentBrick->Position.y - transformComponentBall->Position.y )/4)); - - e.Impulse = glm::normalize(point)/2.f; - e.Point = point; - EventBroker->Publish(e); - //TODO: Bricks dont collide with walls D= - - SetNumberOfBricks(NumberOfBricks() - 1); - if (NumberOfBricks() <= 0) { - SetMultiBalls(MultiBalls() + 1); - } - Events::ScoreEvent es; - es.Score = brick->Score; - EventBroker->Publish(es); - -<<<<<<< HEAD - // std::cout << NumberOfBricks() << std::endl; -======= - //std::cout << NumberOfBricks() << std::endl; ->>>>>>> origin/master - //std::cout << "Score: " << Score() << std::endl; - } - - return true; -} - -bool dd::Systems::LevelSystem::OnLifeLost(const dd::Events::LifeLost &event) -{ - SetLives(Lives() - 1); - - return true; -} - -bool dd::Systems::LevelSystem::OnScoreEvent(const dd::Events::ScoreEvent &event) -{ - SetScore(Score() += event.Score); - - return true; -} - -bool dd::Systems::LevelSystem::OnMultiBall(const dd::Events::MultiBall &event) -{ - SetMultiBalls(MultiBalls()+2); -} - -bool dd::Systems::LevelSystem::OnCreatePowerUp(const dd::Events::CreatePowerUp &event) -{ - SetPowerUps(PowerUps() + 1); - auto powerUp = m_World->CreateEntity(); - std::shared_ptr transform = m_World->AddComponent(powerUp); - auto model = m_World->AddComponent(powerUp); - std::shared_ptr cRec = m_World->AddComponent(powerUp); - std::shared_ptr cPhys = m_World->AddComponent(powerUp); - cPhys->Static = false; - cPhys->Category = CollisionLayer::Type::PowerUp; - cPhys->Mask = CollisionLayer::Type::Pad; - - std::shared_ptr cPow = m_World->AddComponent(powerUp); - - - transform->Position = event.Position; - transform->Scale = glm::vec3(0.2, 0.2, 0.2); - transform->Velocity = glm::vec3(0, -4, 0); - - model->ModelFile = "Models/Test/Ball/Ballopus.obj"; - - m_World->CommitEntity(powerUp); - - return true; -} - -bool dd::Systems::LevelSystem::OnPowerUpTaken(const dd::Events::PowerUpTaken &event) -{ - SetPowerUps(PowerUps() - 1); - return true; -} - -bool dd::Systems::LevelSystem::OnStageCleared(const dd::Events::StageCleared &event) -{ - return true; -} - -void dd::Systems::LevelSystem::EndLevel() -{ - Events::StageCleared e; - EventBroker->Publish(e); - return; -} - diff --git a/src/game/Game/PadSystem.cpp b/src/game/Game/PadSystem.cpp index 3241b28..bd06e5d 100755 --- a/src/game/Game/PadSystem.cpp +++ b/src/game/Game/PadSystem.cpp @@ -26,27 +26,42 @@ void dd::Systems::PadSystem::Initialize() EVENT_SUBSCRIBE_MEMBER(m_EKeyUp, &PadSystem::OnKeyUp); EVENT_SUBSCRIBE_MEMBER(m_EContact, &PadSystem::OnContact); EVENT_SUBSCRIBE_MEMBER(m_EContactPowerUp, &PadSystem::OnContactPowerUp); - EVENT_SUBSCRIBE_MEMBER(m_EResetBall, &PadSystem::OnResetBall); - EVENT_SUBSCRIBE_MEMBER(m_EMultiBall, &PadSystem::OnMultiBall); EVENT_SUBSCRIBE_MEMBER(m_EStageCleared, &PadSystem::OnStageCleared); + EVENT_SUBSCRIBE_MEMBER(m_EPause, &PadSystem::OnPause); + + { + auto ent = m_World->CreateEntity(); + m_World->SetProperty(ent, "Name", "Pad"); + auto ctransform = m_World->AddComponent(ent); + ctransform->Position = glm::vec3(0.f, -3.5f, -10.f); + auto rectangleShape = m_World->AddComponent(ent); + rectangleShape->Dimensions = glm::vec2(1.f, 0.5f); + auto physics = m_World->AddComponent(ent); + physics->CollisionType = CollisionType::Type::Dynamic; + physics->Category = CollisionLayer::Type::Pad; + physics->Mask = static_cast(CollisionLayer::Ball | CollisionLayer::PowerUp); + physics->Calculate = true; + auto cModel = m_World->AddComponent(ent); + cModel->ModelFile = "Models/Submarine2.obj"; + + auto pad = m_World->AddComponent(ent); + m_World->CommitEntity(ent); + + SetEdge(3.2 - (ctransform->Scale.x / 2)); + } } void dd::Systems::PadSystem::UpdateEntity(double dt, EntityID entity, EntityID parent) { - auto ball = m_World->GetComponent(entity); - if (ball != nullptr) { - if (ReplaceBall() == true) { - SetReplaceBall(false); - - auto transform = m_World->GetComponent(entity); - transform->Position = glm::vec3(0.0f, 0.26f, -10.f); - transform->Velocity = glm::vec3(0.0f, -ball->Speed, 0.f); - } - } + auto templateCheck = m_World->GetComponent(entity); + if (templateCheck != nullptr){ return; } } void dd::Systems::PadSystem::Update(double dt) { + if (IsPaused()) { + return; + } if (Entity() == 0) { for (auto it = m_World->GetEntities()->begin(); it != m_World->GetEntities()->end(); it++) { if (m_World->GetProperty(it->first, "Name") == "Pad") { @@ -69,9 +84,15 @@ void dd::Systems::PadSystem::Update(double dt) transform->Velocity.x = pad->MaxSpeed; } transform->Position += transform->Velocity * (float)dt; + if (transform->Position.x > Edge()) { + transform->Position.x = Edge(); + } else if (transform->Position.x < -Edge()) { + transform->Position.x = -Edge(); + } transform->Velocity += acceleration * (float)dt; - transform->Velocity -= transform->Velocity * pad->SlowdownModifier * (float)dt; - + if (glm::abs(transform->Velocity.x) > 1 || (!Left() && !Right())) { + transform->Velocity -= transform->Velocity * pad->SlowdownModifier * (float) dt; + } if (Left()) { acceleration.x = -pad->AccelerationSpeed; @@ -85,38 +106,21 @@ void dd::Systems::PadSystem::Update(double dt) SetPad(pad); SetAcceleration(acceleration); - if (MultiBall() == true) { - SetMultiBall(false); - - Events::MultiBall e; - e.padTransform = transform; - EventBroker->Publish(e); - } - return; } -EntityID dd::Systems::PadSystem::CreateBall() +bool dd::Systems::PadSystem::OnPause(const dd::Events::Pause &event) { - auto ent = m_World->CreateEntity(); - std::shared_ptr transform = m_World->AddComponent(ent); - transform->Position = glm::vec3(0.5f, 0.26f, -10.f); - transform->Scale = glm::vec3(0.5f, 0.5f, 0.5f); - auto model = m_World->AddComponent(ent); - model->ModelFile = "Models/Test/Ball/Ballopus.obj"; - //auto pointlight = m_World->AddComponent(ent); - std::shared_ptr circleShape = m_World->AddComponent(ent); - std::shared_ptr cball = m_World->AddComponent(ent); - std::shared_ptr physics = m_World->AddComponent(ent); - physics->Static = false; - physics->Category = CollisionLayer::Type::Ball; - physics->Mask = CollisionLayer::Type::Pad | CollisionLayer::Type::Brick | CollisionLayer::Type::Wall; - physics->Calculate = true; - cball->Speed = 5.f; + if (event.Type != "PadSystem" && event.Type != "All") { + return false; + } - m_World->CommitEntity(ent); - - return ent; + if (IsPaused()) { + SetPause(false); + } else { + SetPause(true); + } + return true; } bool dd::Systems::PadSystem::OnKeyDown(const dd::Events::KeyDown &event) @@ -135,9 +139,21 @@ bool dd::Systems::PadSystem::OnKeyDown(const dd::Events::KeyDown &event) //acceleration.x = 0.01f; SetRight(true); } else if (val == GLFW_KEY_R) { - SetReplaceBall(true); + Events::ResetBall e; + EventBroker->Publish(e); } else if (val == GLFW_KEY_M) { - SetMultiBall(true); + Events::MultiBall e; + e.padTransform = Transform(); + EventBroker->Publish(e); + } else if (val == GLFW_KEY_P) { + Events::Pause e; + e.Type = "All"; + EventBroker->Publish(e); + } else if (val == GLFW_KEY_H) { + Events::HitLag e; + e.Time = 0.2; + e.Type = "All"; + EventBroker->Publish(e); } else if (val == GLFW_KEY_D) { return false; } @@ -202,12 +218,13 @@ bool dd::Systems::PadSystem::OnContact(const dd::Events::Contact &event) //transform->Velocity = glm::vec3(movementX, movementY, 0.f); */ + return false; } bool dd::Systems::PadSystem::OnContactPowerUp(const dd::Events::Contact &event) { - EntityID entityPower; - EntityID entityPad; + EntityID entityPower = 0; + EntityID entityPad = 0; auto powerUp = m_World->GetComponent(event.Entity1); auto pad = m_World->GetComponent(event.Entity2); if (powerUp != nullptr) { @@ -227,7 +244,7 @@ bool dd::Systems::PadSystem::OnContactPowerUp(const dd::Events::Contact &event) } } - if (entityPower == NULL || entityPad == NULL) { + if (entityPower == 0 || entityPad == 0) { return false; } @@ -236,9 +253,6 @@ bool dd::Systems::PadSystem::OnContactPowerUp(const dd::Events::Contact &event) return false; } -// m_World->RemoveComponent(entityPower); -// m_World->RemoveComponent(entityPower); -// m_World->RemoveComponent(entityPower); m_World->RemoveEntity(entityPower); Events::PowerUpTaken ep; ep.Name = "Something"; @@ -251,40 +265,9 @@ bool dd::Systems::PadSystem::OnContactPowerUp(const dd::Events::Contact &event) return true; } -bool dd::Systems::PadSystem::OnResetBall(const dd::Events::ResetBall &event) -{ - SetReplaceBall(true); - return true; -} - -bool dd::Systems::PadSystem::OnMultiBall(const dd::Events::MultiBall &event) -{ - auto ent1 = CreateBall(); - auto ent2 = CreateBall(); - auto transform1 = m_World->GetComponent(ent1); - auto transform2 = m_World->GetComponent(ent2); - auto ball1 = m_World->GetComponent(ent1); - auto ball2 = m_World->GetComponent(ent2); - auto padTransform = event.padTransform; - float x1 = padTransform->Position.x - 2, x2 = padTransform->Position.x + 2; - if (x1 < -3.1) { - x1 = 3; - } - if (x2 > 3.1) { - x2 = -3; - } - transform1->Position = glm::vec3(x1, -5.5, -10); - transform2->Position = glm::vec3(x2, -5.5, -10); - - transform1->Velocity = glm::normalize(glm::vec3(5, 5 ,0.f)) * ball1->Speed; - transform2->Velocity = glm::normalize(glm::vec3(-5, 5 ,0.f)) * ball2->Speed; - - return true; -} - bool dd::Systems::PadSystem::OnStageCleared(const dd::Events::StageCleared &event) { - auto entity = CreateBall(); + //auto entity = CreateBall(); return true; } diff --git a/src/game/Game/PadSystem.cpp.orig b/src/game/Game/PadSystem.cpp.orig deleted file mode 100755 index 7d21606..0000000 --- a/src/game/Game/PadSystem.cpp.orig +++ /dev/null @@ -1,313 +0,0 @@ -// -// Created by Adniklastrator on 2015-09-10. -// - -#include "PrecompiledHeader.h" -#include "Game/PadSystem.h" -#include "Core/World.h" -#include -#include -#include - - -void dd::Systems::PadSystem::Initialize() -{ - Events::BindKey r; - r.KeyCode = GLFW_KEY_RIGHT; - r.Command = "right"; - EventBroker->Publish(r); - - Events::BindKey l; - l.KeyCode = GLFW_KEY_LEFT; - l.Command = "left"; - EventBroker->Publish(l); - - EVENT_SUBSCRIBE_MEMBER(m_EKeyDown, &PadSystem::OnKeyDown); - EVENT_SUBSCRIBE_MEMBER(m_EKeyUp, &PadSystem::OnKeyUp); - EVENT_SUBSCRIBE_MEMBER(m_EContact, &PadSystem::OnContact); - EVENT_SUBSCRIBE_MEMBER(m_EContactPowerUp, &PadSystem::OnContactPowerUp); - EVENT_SUBSCRIBE_MEMBER(m_EResetBall, &PadSystem::OnResetBall); - EVENT_SUBSCRIBE_MEMBER(m_EMultiBall, &PadSystem::OnMultiBall); - EVENT_SUBSCRIBE_MEMBER(m_EStageCleared, &PadSystem::OnStageCleared); -} - -void dd::Systems::PadSystem::UpdateEntity(double dt, EntityID entity, EntityID parent) -{ - auto ball = m_World->GetComponent(entity); - if (ball != nullptr) { - if (ReplaceBall() == true) { - SetReplaceBall(false); - - auto transform = m_World->GetComponent(entity); - transform->Position = glm::vec3(0.0f, 0.26f, -10.f); - transform->Velocity = glm::vec3(0.0f, -ball->Speed, 0.f); - } - } -} - -void dd::Systems::PadSystem::Update(double dt) -{ - if (Entity() == 0) { - for (auto it = m_World->GetEntities()->begin(); it != m_World->GetEntities()->end(); it++) { - if (m_World->GetProperty(it->first, "Name") == "Pad") { - SetEntity(it->first); - SetTransform(m_World->GetComponent(Entity())); - SetPad(m_World->GetComponent(Entity())); - break; - } - } - } - - auto transform = Transform(); - auto pad = Pad(); - auto acceleration = Acceleration(); - - if (transform->Velocity.x < -pad->MaxSpeed) { - transform->Velocity.x = -pad->MaxSpeed; - } - else if (transform->Velocity.x > pad->MaxSpeed) { - transform->Velocity.x = pad->MaxSpeed; - } - transform->Position += transform->Velocity * (float)dt; - transform->Velocity += acceleration * (float)dt; - transform->Velocity -= transform->Velocity * pad->SlowdownModifier * (float)dt; - - - if (Left()) { - acceleration.x = -pad->AccelerationSpeed; -<<<<<<< HEAD - } - else if (Right()) { -======= - } else if (Right()) { ->>>>>>> 72413dc0a93bd3a2f6ab9fa7e19bbc3b846232db - acceleration.x = pad->AccelerationSpeed; - } else { - acceleration.x = 0.f; - } - - SetTransform(transform); - SetPad(pad); - SetAcceleration(acceleration); - - if (MultiBall() == true) { - SetMultiBall(false); - - Events::MultiBall e; - e.padTransform = transform; - EventBroker->Publish(e); - } - - return; -} - -EntityID dd::Systems::PadSystem::CreateBall() -{ - auto ent = m_World->CreateEntity(); - std::shared_ptr transform = m_World->AddComponent(ent); - transform->Position = glm::vec3(0.5f, 0.26f, -10.f); - transform->Scale = glm::vec3(0.5f, 0.5f, 0.5f); - auto model = m_World->AddComponent(ent); - model->ModelFile = "Models/Test/Ball/Ballopus.obj"; - //auto pointlight = m_World->AddComponent(ent); - std::shared_ptr circleShape = m_World->AddComponent(ent); - std::shared_ptr cball = m_World->AddComponent(ent); - std::shared_ptr physics = m_World->AddComponent(ent); - physics->Static = false; - - cball->Speed = 10; - - m_World->CommitEntity(ent); - - return ent; -} - -bool dd::Systems::PadSystem::OnKeyDown(const dd::Events::KeyDown &event) -{ - int val = event.KeyCode; - if (val == GLFW_KEY_UP) { - //std::cout << "Up!" << std::endl; - } else if (val == GLFW_KEY_DOWN) { - //std::cout << "Down!" << std::endl; - } else if (val == GLFW_KEY_LEFT) { - //std::cout << "Left!" << std::endl; - //acceleration.x = -0.01f; - SetLeft(true); - } else if (val == GLFW_KEY_RIGHT) { - //std::cout << "Right!" << std::endl; - //acceleration.x = 0.01f; - SetRight(true); - } else if (val == GLFW_KEY_R) { - SetReplaceBall(true); - } else if (val == GLFW_KEY_M) { - SetMultiBall(true); - } else if (val == GLFW_KEY_D) { - return false; - } - return true; -} - -bool dd::Systems::PadSystem::OnKeyUp(const dd::Events::KeyUp &event) -{ - int val = event.KeyCode; - if (val == GLFW_KEY_UP) { - - } else if (val == GLFW_KEY_DOWN) { - - } else if (val == GLFW_KEY_LEFT) { - SetLeft(false); - } else if (val == GLFW_KEY_RIGHT) { - SetRight(false); - } - return true; -} - -bool dd::Systems::PadSystem::OnContact(const dd::Events::Contact &event) -{ - /* - EntityID entityBall = event.Entity2; - auto ball = m_World->GetComponent(entityBall); - if (ball == NULL) { - return false; - } - EntityID entityPad = event.Entity1; - auto pad = m_World->GetComponent(entityPad); - if (pad == NULL) { - return false; - } - auto transformBall = m_World->GetComponent(entityBall); - auto transformPad = m_World->GetComponent(entityPad); - - float movementMultiplier = 0.5f; - - //float movementX = (event.ContactPoint.x - transformPad->Position.x) * movementMultiplier; - //float movementY = glm::cos((abs(movementX) / (3.2f * movementMultiplier)) * 3.14159265359f / 2) * 2.f; - if (whatX > 0) { - movementX = movementMultiplier * whatX; - //std::cout << "Right!" << std::endl; - } else { - movementX = movementMultiplier * whatX; - //std::cout << "Left!" << std::endl; - } - - // std::cout << movementX << " " << movementY << std::endl; - - //float movementX = (event.ContactPoint.x - transformPad->Position.x) * movementMultiplier; -<<<<<<< HEAD - float movementY = glm::cos((abs(movementX) / ((1.6f) * movementMultiplier)) * 3.14159265359f / 2) + 1; -======= - float movementY = glm::cos((abs(movementX) / ((1.6f) * movementMultiplier)) * 3.14159265359f / 2)+ 0.2; ->>>>>>> 72413dc0a93bd3a2f6ab9fa7e19bbc3b846232db - - //std::cout << movementX << " " << movementY << std::endl; - - float len = glm::length(transformBall->Velocity); - //auto pointlight = m_World->AddComponent(ent); - - - transformBall->Velocity += glm::vec3(transformPad->Velocity.x, 0, 0); - transformBall->Velocity = glm::normalize(transformBall->Velocity) * len; - - - //transform->Velocity = glm::vec3(movementX, movementY, 0.f); - */ -} - -bool dd::Systems::PadSystem::OnContactPowerUp(const dd::Events::Contact &event) -{ - EntityID entityPower; - EntityID entityPad; - auto powerUp = m_World->GetComponent(event.Entity1); - auto pad = m_World->GetComponent(event.Entity2); - if (powerUp != nullptr) { - entityPower = event.Entity1; - } else { - powerUp = m_World->GetComponent(event.Entity2); - if (powerUp != nullptr) { - entityPower = event.Entity2; - } - } - if (pad != nullptr) { - entityPad = event.Entity2; - } else { - pad = m_World->GetComponent(event.Entity1); - if (pad != nullptr) { - entityPad = event.Entity1; - } - } - - if (entityPower == NULL || entityPad == NULL) { - return false; - } - - pad = m_World->GetComponent(entityPad); - if (pad == nullptr) { - return false; - } - - m_World->RemoveComponent(entityPower); - m_World->RemoveComponent(entityPower); - m_World->RemoveComponent(entityPower); - m_World->RemoveEntity(entityPower); - Events::PowerUpTaken ep; - ep.Name = "Something"; - EventBroker->Publish(ep); - - Events::MultiBall e; - auto transform = m_World->GetComponent(entityPad); - e.padTransform = transform; - EventBroker->Publish(e); - return true; -} - -bool dd::Systems::PadSystem::OnResetBall(const dd::Events::ResetBall &event) -{ - SetReplaceBall(true); - return true; -} - -bool dd::Systems::PadSystem::OnMultiBall(const dd::Events::MultiBall &event) -{ - auto ent1 = CreateBall(); - auto ent2 = CreateBall(); - auto transform1 = m_World->GetComponent(ent1); - auto transform2 = m_World->GetComponent(ent2); - auto ball1 = m_World->GetComponent(ent1); - auto ball2 = m_World->GetComponent(ent2); - auto padTransform = event.padTransform; - float x1 = padTransform->Position.x - 2, x2 = padTransform->Position.x + 2; - if (x1 < -3.1) { - x1 = 3; - } - if (x2 > 3.1) { - x2 = -3; - } - transform1->Position = glm::vec3(x1, -5.5, -10); - transform2->Position = glm::vec3(x2, -5.5, -10); - - transform1->Velocity = glm::normalize(glm::vec3(5, 5 ,0.f)) * ball1->Speed; - transform2->Velocity = glm::normalize(glm::vec3(-5, 5 ,0.f)) * ball2->Speed; - - return true; -} - -bool dd::Systems::PadSystem::OnStageCleared(const dd::Events::StageCleared &event) -{ - auto entity = CreateBall(); - return true; -} - -bool dd::Systems::PadSystem::PadSteeringInputController::OnCommand(const Events::InputCommand &event) -{ - std::string command = event.Command; - - std::cout << "Command!" << std::endl; - - if (command == "right") { - std::cout << "Right!" << std::endl; - } else if (command == "left") { - std::cout << "Left!" << std::endl; - } - - return true; -} \ No newline at end of file diff --git a/src/game/Physics/ContactListener.cpp b/src/game/Physics/ContactListener.cpp new file mode 100644 index 0000000..97981d1 --- /dev/null +++ b/src/game/Physics/ContactListener.cpp @@ -0,0 +1,47 @@ +#include "PrecompiledHeader.h" +#include "Physics/PhysicsSystem.h" + +void dd::Systems::PhysicsSystem::ContactListener::BeginContact(b2Contact* contact) +{ + b2WorldManifold worldManifold; + + contact->GetWorldManifold(&worldManifold); + + Events::Contact e; + e.Entity1 = m_PhysicsSystem->m_BodiesToEntities[contact->GetFixtureA()->GetBody()]; + e.Entity2 = m_PhysicsSystem->m_BodiesToEntities[contact->GetFixtureB()->GetBody()]; + e.Normal = glm::normalize(glm::vec2(contact->GetManifold()->localNormal.x, contact->GetManifold()->localNormal.y)); + e.SignificantNormal = glm::normalize((glm::abs(e.Normal.x) > glm::abs(e.Normal.y)) ? glm::vec2(e.Normal.x, 0) : glm::vec2(0, e.Normal.y)); + + m_PhysicsSystem->EventBroker->Publish(e); +} + +void dd::Systems::PhysicsSystem::ContactListener::EndContact(b2Contact* contact) +{ + +} + +void dd::Systems::PhysicsSystem::ContactListener::PreSolve(b2Contact* contact, const b2Manifold* oldManifold) +{ + EntityID entityA = m_PhysicsSystem->m_BodiesToEntities[contact->GetFixtureA()->GetBody()]; + EntityID entityB = m_PhysicsSystem->m_BodiesToEntities[contact->GetFixtureB()->GetBody()]; + + auto physicsComponentA = m_PhysicsSystem->m_World->GetComponent(entityA); + auto physicsComponentB = m_PhysicsSystem->m_World->GetComponent(entityB); + + if (physicsComponentA != nullptr && physicsComponentB != nullptr) { + if (physicsComponentA->Calculate || physicsComponentB->Calculate) { + // Turn of collisions + contact->SetEnabled(false); + } + } + + +} + +void dd::Systems::PhysicsSystem::ContactListener::PostSolve(b2Contact* contact, const b2ContactImpulse* impulse) +{ + +} + + diff --git a/src/game/Physics/PhysicsSystem.cpp b/src/game/Physics/PhysicsSystem.cpp index 3eaa8f7..5380ccb 100755 --- a/src/game/Physics/PhysicsSystem.cpp +++ b/src/game/Physics/PhysicsSystem.cpp @@ -2,37 +2,26 @@ #include "Physics/PhysicsSystem.h" - void dd::Systems::PhysicsSystem::RegisterComponents(ComponentFactory* cf) { cf->Register(); + //TODO: REGISTER PHYSICS COMPONENTS HERE } void dd::Systems::PhysicsSystem::Initialize() { std::random_device rd; gen = std::mt19937(rd()); - m_DestructionListener = new DestructionListener(this); m_ContactListener = new ContactListener(this); - - m_Gravity = b2Vec2(0.f, -9.82f); m_PhysicsWorld = new b2World(m_Gravity); - - m_TimeStep = 1.f/60.f; - m_VelocityIterations = 6; - m_PositionIterations = 2; - m_Accumulator = 0.f; - m_PhysicsWorld->SetContactListener(m_ContactListener); - m_PhysicsWorld->SetContactFilter(&m_ParticleContactDisabler); + m_PhysicsWorld->SetContactFilter(&m_ParticleContactDisabler); m_PhysicsWorld->SetDestructionListener(m_DestructionListener); InitializeWater(); - - - - EVENT_SUBSCRIBE_MEMBER(m_SetImpulse, PhysicsSystem::SetImpulse); + EVENT_SUBSCRIBE_MEMBER(m_SetImpulse, &PhysicsSystem::SetImpulse); + EVENT_SUBSCRIBE_MEMBER(m_EPause, &PhysicsSystem::OnPause); EVENT_SUBSCRIBE_MEMBER(m_ECreateParticleSequence, &PhysicsSystem::CreateParticleSequence); } @@ -53,7 +42,11 @@ void dd::Systems::PhysicsSystem::InitializeWater() bool dd::Systems::PhysicsSystem::SetImpulse(const Events::SetImpulse &event) { - b2Body* body = m_EntitiesToBodies[event.Entity]; + auto it = m_EntitiesToBodies.find(event.Entity); + if(it == m_EntitiesToBodies.end()) { + LOG_ERROR("Entity: %i, Tried to set an impulse on a body that does not exsist", event.Entity); + return false; + } b2Vec2 impulse; impulse.x = event.Impulse.x; @@ -63,112 +56,136 @@ bool dd::Systems::PhysicsSystem::SetImpulse(const Events::SetImpulse &event) point.x = event.Point.x; point.y = event.Point.y; - Impulse i; - i.Body = body; - i.Impulse = impulse; + i.Body = it->second; + i.Vector = impulse; i.Point = point; m_Impulses.push_back(i); - return true; } -void dd::Systems::PhysicsSystem::Update(double dt) { +void dd::Systems::PhysicsSystem::SyncEntitiesWithBodies() +{ - m_Accumulator += dt; - while (m_Accumulator >= m_TimeStep) { + for (auto i : m_EntitiesToBodies) { + EntityID entity = i.first; + b2Body* body = i.second; - for (auto i : m_EntitiesToBodies) { - EntityID entity = i.first; - b2Body *body = i.second; - - auto transformComponent = m_World->GetComponent(entity); - if (!transformComponent) { - continue; - LOG_ERROR("RigidBody with no TransformComponent"); - } - auto physicsComponent = m_World->GetComponent(entity); - if (!physicsComponent) { - continue; - LOG_ERROR("RigidBody with no PhysicsComponent"); - } - - if (body == nullptr) { - LOG_ERROR("This body should not exist"); - continue; - } - - if (m_World->GetEntityParent(entity) == 0) { //TODO: Make this work with childs too - b2Vec2 position; - position.x = transformComponent->Position.x; - position.y = transformComponent->Position.y; - float angle = glm::eulerAngles(transformComponent->Orientation).z; - body->SetTransform(position, angle); - body->SetLinearVelocity(b2Vec2(transformComponent->Velocity.x, transformComponent->Velocity.y)); - body->SetGravityScale(physicsComponent->GravityScale); - - b2Filter filter; - filter.categoryBits = physicsComponent->Category; - filter.maskBits = physicsComponent->Mask; - body->GetFixtureList()->SetFilterData(filter); - } + if (body == nullptr) { + LOG_ERROR("This body should not exist, please fix this"); + continue; } - UpdateParticleEmitters(dt); + auto transformComponent = m_World->GetComponent(entity); + if (! transformComponent) { + continue; + LOG_ERROR("RigidBody with no TransformComponent"); + } + auto physicsComponent = m_World->GetComponent(entity); + if (! physicsComponent) { + continue; + LOG_ERROR("RigidBody with no PhysicsComponent"); + } + + + + if (m_World->GetEntityParent(entity) == 0) { //TODO: Make this work with childs too + b2Vec2 position; + position.x = transformComponent->Position.x; + position.y = transformComponent->Position.y; + float angle = glm::eulerAngles(transformComponent->Orientation).z; + body->SetTransform(position, angle); + body->SetLinearVelocity(b2Vec2(transformComponent->Velocity.x, transformComponent->Velocity.y)); + body->SetGravityScale(physicsComponent->GravityScale); + + b2Filter filter; + filter.categoryBits = physicsComponent->Category; + filter.maskBits = physicsComponent->Mask; + body->GetFixtureList()->SetFilterData(filter); + } + } +} + +void dd::Systems::PhysicsSystem::SyncBodiesWithEntities() +{ + for (auto i : m_BodiesToEntities) { + b2Body* body = i.first; + EntityID entity = i.second; + + if (body == nullptr) { + LOG_ERROR("This body should not exist, please fix this"); + continue; + } + + auto transformComponent = m_World->GetComponent(entity); + if (! transformComponent) { + continue; + LOG_ERROR("RigidBody with no TransformComponent"); + } + + auto physicsComponent = m_World->GetComponent(entity); + if (! physicsComponent) { + continue; + LOG_ERROR("RigidBody with no PhysicsComponent"); + } + + auto parent = m_World->GetEntityParent(entity); + if (parent == 0) { + auto physicsComponent = m_World->GetComponent(entity); + + if (physicsComponent->Calculate) { //TODO: REPLACE THIS WITH PARTICLE COLLISION FILTERS + transformComponent->Position.x = transformComponent->Position.x + (transformComponent->Velocity.x * m_TimeStep); + transformComponent->Position.y = transformComponent->Position.y + (transformComponent->Velocity.y * m_TimeStep); + } else { + b2Vec2 position = body->GetPosition(); + transformComponent->Position.x = position.x; + transformComponent->Position.y = position.y; + + float angle = body->GetAngle(); + transformComponent->Orientation = glm::quat(glm::vec3(0, 0, angle)); + + b2Vec2 velocity = body->GetLinearVelocity(); + transformComponent->Velocity.x = velocity.x; + transformComponent->Velocity.y = velocity.y; + } + } + } +} + +void dd::Systems::PhysicsSystem::Update(double dt) +{ + if (m_Pause) { + return; + } + + m_Accumulator += dt; + + while(m_Accumulator >= m_TimeStep) + { + + UpdateParticleEmitters(dt); + SyncEntitiesWithBodies(); + + //Apply Impulses Must be done after SyncEntitiesWithBodies for (auto i : m_Impulses) { - i.Body->ApplyLinearImpulse(i.Impulse, i.Point, true); + i.Body->ApplyLinearImpulse(i.Vector, i.Point, true); } m_Impulses.clear(); + + //Update the PhysicsWorld m_PhysicsWorld->Step(m_TimeStep, m_VelocityIterations, m_PositionIterations); - - for (auto i : m_EntitiesToBodies) { - EntityID entity = i.first; - b2Body *body = i.second; - - if (body == nullptr) { - LOG_ERROR("This body should not exist"); - continue; - } - - auto transformComponent = m_World->GetComponent(entity); - if (!transformComponent) - continue; - auto parent = m_World->GetEntityParent(entity); - if (parent == 0) { - - auto physicsComponent = m_World->GetComponent(entity); - if (physicsComponent->Calculate) { //TODO: REPLACE THIS WITH PARTICLE COLLISION FILTERS - transformComponent->Position.x = - transformComponent->Position.x + (transformComponent->Velocity.x * m_TimeStep); - transformComponent->Position.y = - transformComponent->Position.y + (transformComponent->Velocity.y * m_TimeStep); - } - else { - b2Vec2 position = body->GetPosition(); - transformComponent->Position.x = position.x; - transformComponent->Position.y = position.y; - - float angle = body->GetAngle(); - transformComponent->Orientation = glm::quat(glm::vec3(0, 0, angle)); - - b2Vec2 velocity = body->GetLinearVelocity(); - transformComponent->Velocity.x = velocity.x; - transformComponent->Velocity.y = velocity.y; - } - } - } - + SyncBodiesWithEntities(); //water b2Vec2 *positionBuffer = m_WaterParticleSystem->GetPositionBuffer(); for (auto i : m_EntitiesToWaterParticleHandle){ EntityID entity = i.first; - b2ParticleHandle *particleH = i.second; + const b2ParticleHandle *particleH = i.second; b2Vec2 positionB2 = positionBuffer[particleH->GetIndex()]; @@ -182,7 +199,7 @@ void dd::Systems::PhysicsSystem::Update(double dt) { } auto transform = m_World->GetComponent(entity); - transform->Position = glm::vec3(position.x, position.y, -10); + transform->Position = glm::vec3(position.x, position.y, -10.f); } //Normal particles @@ -193,7 +210,7 @@ void dd::Systems::PhysicsSystem::Update(double dt) { } for (auto i : m_EntitiesToParticleHandle[e]){ EntityID entity = i.first; - b2ParticleHandle *particleH = i.second; + const b2ParticleHandle *particleH = i.second; b2Vec2 positionB2 = positionBuffer[particleH->GetIndex()]; glm::vec2 position = glm::vec2(positionB2.x, positionB2.y); @@ -214,16 +231,15 @@ void dd::Systems::PhysicsSystem::Update(double dt) { } } - void dd::Systems::PhysicsSystem::UpdateEntity(double dt, EntityID entity, EntityID parent) -{ - auto particle = m_World->GetComponent(entity); +{ +auto particle = m_World->GetComponent(entity); auto pTemplate = m_World->GetComponent(entity); if (particle && !pTemplate) { particle->LifeTime -= dt; if (particle->LifeTime <= 0) { for (int i = 0; i < m_EntitiesToParticleHandle.size(); i++) { - b2ParticleHandle* handle = m_EntitiesToParticleHandle[i][entity]; + const b2ParticleHandle* handle = m_EntitiesToParticleHandle[i][entity]; std::unordered_map::iterator iter1; std::unordered_map::iterator iter2; iter1 = m_EntitiesToParticleHandle[i].find(entity); @@ -241,6 +257,20 @@ void dd::Systems::PhysicsSystem::UpdateEntity(double dt, EntityID entity, Entity } } +bool dd::Systems::PhysicsSystem::OnPause(const dd::Events::Pause &event) +{ + if (event.Type != "PhysicsSystem" && event.Type != "All") { + return false; + } + + if (m_Pause) { + m_Pause = false; + } else { + m_Pause = true; + } + return true; +} + void dd::Systems::PhysicsSystem::OnEntityCommit(EntityID entity) { auto physicsComponent = m_World->GetComponent(entity); @@ -257,7 +287,12 @@ void dd::Systems::PhysicsSystem::OnEntityCommit(EntityID entity) } if (physicsComponent) { - CreateBody(entity); + auto it = m_EntitiesToBodies.find(entity); + if(it == m_EntitiesToBodies.end()) { + CreateBody(entity); + } else { + LOG_ERROR("Tried to commit a body that already exists"); + } } else if (waterComponent) { CreateParticleGroup(entity); } else if (particleEmitterComponent) { @@ -268,22 +303,26 @@ void dd::Systems::PhysicsSystem::OnEntityCommit(EntityID entity) void dd::Systems::PhysicsSystem::OnEntityRemoved(EntityID entity) { - auto physics = m_World->GetComponent(entity); + /* auto physics = m_World->GetComponent(entity); if (physics == nullptr) { return; + }*/ + + auto it = m_EntitiesToBodies.find(entity); + if(it == m_EntitiesToBodies.end()) { + LOG_ERROR("Trying to remove non-exsisting body, Entity: %i", entity); + return; } - b2Body* body = m_EntitiesToBodies[entity]; - - if (body != nullptr) { - m_EntitiesToBodies.erase(entity); - m_BodiesToEntities.erase(body); - - m_PhysicsWorld->DestroyBody(body); - } - + //It told me I was removing a lot of objects, and I didn't need that information, so I commented it out. + //LOG_INFO("Removing entity %i", entity); + it->second->GetWorld()->DestroyBody(it->second); + m_BodiesToEntities.erase(it->second); + m_EntitiesToBodies.erase(entity); + //delete body; } + void dd::Systems::PhysicsSystem::CreateBody(EntityID entity) { auto physicsComponent = m_World->GetComponent(entity); @@ -292,7 +331,6 @@ void dd::Systems::PhysicsSystem::CreateBody(EntityID entity) return; } - auto transformComponent = m_World->GetComponent(entity); if(!transformComponent) { LOG_ERROR("No TransformComponent in CreateBody"); @@ -305,34 +343,28 @@ void dd::Systems::PhysicsSystem::CreateBody(EntityID entity) bodyDef.position.Set(absoluteTransform.Position.x, absoluteTransform.Position.y); bodyDef.angle = -glm::eulerAngles(absoluteTransform.Orientation).z; - if (physicsComponent->Static) { + if (physicsComponent->CollisionType == CollisionType::Type::Static) { bodyDef.type = b2_staticBody; - } else { + } else if (physicsComponent->CollisionType == CollisionType::Type::Dynamic) { + bodyDef.type = b2_dynamicBody; + } else if (physicsComponent->CollisionType == CollisionType::Type::Kinematic) { bodyDef.type = b2_dynamicBody; - } b2Body* body = m_PhysicsWorld->CreateBody(&bodyDef); b2Shape* pShape; - auto boxComponent = m_World->GetComponent(entity); - if (boxComponent) { + auto rectangleComponent = m_World->GetComponent(entity); + if (rectangleComponent) { b2PolygonShape* bShape = new b2PolygonShape(); - bShape->SetAsBox(absoluteTransform.Scale.x/2, absoluteTransform.Scale.y/2); + bShape->SetAsBox(rectangleComponent->Dimensions.x/2.f, rectangleComponent->Dimensions.y/2.f); pShape = bShape; } else { auto circleComponent = m_World->GetComponent(entity); if (circleComponent) { pShape = new b2CircleShape(); - pShape->m_radius = absoluteTransform.Scale.x; - - - if (absoluteTransform.Scale.x != absoluteTransform.Scale.y && absoluteTransform.Scale.y != absoluteTransform.Scale.z) { - LOG_WARNING("Circles has to be of uniform scale."); - } - pShape->m_radius = absoluteTransform.Scale.x/2; - + pShape->m_radius = circleComponent->Radius; } } @@ -342,26 +374,28 @@ void dd::Systems::PhysicsSystem::CreateBody(EntityID entity) fixtureDef.filter.maskBits = physicsComponent->Mask; - if(physicsComponent->Static) { - body->CreateFixture(&fixtureDef); //Density kanske ska vara 0 p� statiska kroppar - } - else { - fixtureDef.shape = pShape; - fixtureDef.density = 10.f; - fixtureDef.restitution = 1.0f; - fixtureDef.friction = 0.0f; - body->CreateFixture(&fixtureDef); - } + fixtureDef.shape = pShape; + fixtureDef.density = 10.f; + fixtureDef.restitution = 1.0f; + fixtureDef.friction = 0.0f; + body->CreateFixture(&fixtureDef); + delete pShape; + /* if(physicsComponent->Static) { + body->SetType(b2BodyType::b2_staticBody); + } else if (! physicsComponent->Static) { + body->SetType(b2BodyType::b2_dynamicBody); + }*/ body->SetGravityScale(physicsComponent->GravityScale); m_EntitiesToBodies.insert(std::make_pair(entity, body)); m_BodiesToEntities.insert(std::make_pair(body, entity)); } + void dd::Systems::PhysicsSystem::CreateParticleGroup(EntityID e) { auto transform = m_World->GetComponent(e); @@ -397,6 +431,7 @@ void dd::Systems::PhysicsSystem::CreateParticleGroup(EntityID e) } } + void dd::Systems::PhysicsSystem::UpdateParticleEmitters(double dt) { std::vector emittersToDelete; @@ -584,10 +619,28 @@ b2ParticleSystem* dd::Systems::PhysicsSystem::CreateParticleSystem(float radius, return m_PhysicsWorld->CreateParticleSystem(&m_ParticleSystemDef); } + + dd::Systems::PhysicsSystem::~PhysicsSystem() { + for (auto i = m_BodiesToEntities.begin(); i != m_BodiesToEntities.end(); i++) { + b2Body* body = i->first; + body->GetWorld()->DestroyBody(body); + //delete body; + } + m_BodiesToEntities.clear(); + m_EntitiesToBodies.clear(); + m_Impulses.clear(); + + //TODO:REMOVE PARTICLE SYSTEMS + if (m_ContactListener != nullptr) { delete m_ContactListener; m_ContactListener = nullptr; } + + if (m_PhysicsWorld != nullptr) { + delete m_PhysicsWorld; + m_PhysicsWorld = nullptr; + } } diff --git a/src/game/Physics/PhysicsSystem.cpp.orig b/src/game/Physics/PhysicsSystem.cpp.orig deleted file mode 100755 index 7fb8bc1..0000000 --- a/src/game/Physics/PhysicsSystem.cpp.orig +++ /dev/null @@ -1,363 +0,0 @@ -#include "PrecompiledHeader.h" -#include "Physics/PhysicsSystem.h" - - - -void dd::Systems::PhysicsSystem::RegisterComponents(ComponentFactory* cf) -{ - cf->Register(); -} - -void dd::Systems::PhysicsSystem::Initialize() -{ - m_ContactListener = new ContactListener(this); - - m_Gravity = b2Vec2(0.f, -9.82f); - m_PhysicsWorld = new b2World(m_Gravity); - - m_TimeStep = 1.f/60.f; - m_VelocityIterations = 6; - m_PositionIterations = 2; - m_Accumulator = 0.f; - - m_PhysicsWorld->SetContactListener(m_ContactListener); - - InitializeWater(); - - EVENT_SUBSCRIBE_MEMBER(m_SetImpulse, PhysicsSystem::SetImpulse); -} - -void dd::Systems::PhysicsSystem::InitializeWater() -{ - b2ParticleSystemDef m_ParticleSystemDef; - m_ParticleSystemDef.radius = 0.13f; - - m_ParticleSystem = m_PhysicsWorld->CreateParticleSystem(&m_ParticleSystemDef); -} - -bool dd::Systems::PhysicsSystem::SetImpulse(const Events::SetImpulse &event) -{ - b2Body* body = m_EntitiesToBodies[event.Entity]; - - b2Vec2 impulse; - impulse.x = event.Impulse.x; - impulse.y = event.Impulse.y; - - b2Vec2 point; - point.x = event.Point.x; - point.y = event.Point.y; - - - Impulse i; - i.Body = body; - i.Impulse = impulse; - i.Point = point; - - m_Impulses.push_back(i); - - return true; -} - -void dd::Systems::PhysicsSystem::Update(double dt) -{ - - m_Accumulator += dt; - while(m_Accumulator >= m_TimeStep) - { - - for (auto i : m_EntitiesToBodies) { - EntityID entity = i.first; - b2Body* body = i.second; - - auto transformComponent = m_World->GetComponent(entity); - if (! transformComponent) { - continue; - LOG_ERROR("RigidBody with no TransformComponent"); - } - auto physicsComponent = m_World->GetComponent(entity); - if (! physicsComponent) { - continue; - LOG_ERROR("RigidBody with no PhysicsComponent"); - } - - - if (body == nullptr) { - LOG_ERROR("This body should not exist"); - continue; - } - - if (m_World->GetEntityParent(entity) == 0) { //TODO: Make this work with childs too - b2Vec2 position; - position.x = transformComponent->Position.x; - position.y = transformComponent->Position.y; - float angle = -glm::eulerAngles(transformComponent->Orientation).z; - body->SetTransform(position, angle); - body->SetLinearVelocity(b2Vec2(transformComponent->Velocity.x, transformComponent->Velocity.y)); - - body->SetGravityScale(physicsComponent->GravityScale); - -<<<<<<< HEAD - - b2Filter filter; - filter.categoryBits = physicsComponent->Category; - filter.maskBits = physicsComponent->Mask; - body->GetFixtureList()->SetFilterData(filter); - } - } - - for (auto i : m_Impulses) { - i.Body->ApplyLinearImpulse(i.Impulse, i.Point, true); -======= ->>>>>>> origin/master - } - m_Impulses.clear(); - - -<<<<<<< HEAD - - -======= - for (auto i : m_Impulses) { - i.Body->ApplyLinearImpulse(i.Impulse, i.Point, true); - } - m_Impulses.clear(); - m_Accumulator += dt; - while(m_Accumulator >= m_TimeStep) - { ->>>>>>> origin/master - m_PhysicsWorld->Step(m_TimeStep, m_VelocityIterations, m_PositionIterations); - m_Accumulator -= dt; - -<<<<<<< HEAD - -======= - for (auto i : m_EntitiesToBodies) { - EntityID entity = i.first; - b2Body* body = i.second; ->>>>>>> origin/master - - for (auto i : m_EntitiesToBodies) { - EntityID entity = i.first; - b2Body* body = i.second; - - if (body == nullptr) { - LOG_ERROR("This body should not exist"); - continue; - } - -<<<<<<< HEAD - auto transformComponent = m_World->GetComponent(entity); - if (! transformComponent) - continue; - if (m_World->GetEntityParent(entity) == 0) { - b2Vec2 position = body->GetPosition(); - transformComponent->Position.x = position.x; - transformComponent->Position.y = position.y; -======= - auto transformComponent = m_World->GetComponent(entity); - if (! transformComponent) - continue; - auto parent = m_World->GetEntityParent(entity); - if (parent == 0) { - b2Vec2 position = body->GetPosition(); - transformComponent->Position.x = position.x; - transformComponent->Position.y = position.y; ->>>>>>> origin/master - - float angle = body->GetAngle(); - - - transformComponent->Orientation = glm::quat(glm::vec3(0, 0, -angle)); - -<<<<<<< HEAD - b2Vec2 velocity = body->GetLinearVelocity(); - transformComponent->Velocity.x = velocity.x; - transformComponent->Velocity.y = velocity.y; - - } -======= ->>>>>>> origin/master - } - } - - b2Vec2* positionBuffer = m_ParticleSystem->GetPositionBuffer(); - for (auto i : m_EntitiesToParticleHandle) { - EntityID entity = i.first; - b2ParticleHandle* particleH = i.second; - - b2Vec2 positionB2 = positionBuffer[particleH->GetIndex()]; - glm::vec2 position = glm::vec2(positionB2.x, positionB2.y); - - - EntityID entityParent = m_World->GetEntityParent(entity); - auto transform = m_World->GetComponent(entity); - auto transformParent = m_World->GetComponent(entityParent); - - transform->Position = glm::vec3(position.x, position.y, -10) - transformParent->Position; - } -} - -void dd::Systems::PhysicsSystem::UpdateEntity(double dt, EntityID entity, EntityID parent) -{ - -} - -void dd::Systems::PhysicsSystem::OnEntityCommit(EntityID entity) -{ - auto physicsComponent = m_World->GetComponent(entity); - auto waterComponent = m_World->GetComponent(entity); - - if (physicsComponent && waterComponent) { - LOG_ERROR("Entity has both water and physics component, this is illegal. The police has been alerted."); - return; - } - if (physicsComponent) { - CreateBody(entity); - } else if (waterComponent) { - CreateParticleGroup(entity); - } -} - - -void dd::Systems::PhysicsSystem::OnEntityRemoved(EntityID entity) -{ - auto physics = m_World->GetComponent(entity); - if (physics == nullptr) { - return; - } - - b2Body* body = m_EntitiesToBodies[entity]; - - if (body != nullptr) { - m_EntitiesToBodies.erase(entity); - m_BodiesToEntities.erase(body); - - m_PhysicsWorld->DestroyBody(body); - } - -} - - -void dd::Systems::PhysicsSystem::CreateBody(EntityID entity) -{ - auto physicsComponent = m_World->GetComponent(entity); - if(!physicsComponent){ - LOG_ERROR("No PhysicsComponent in CreateBody"); - return; - } - - - auto transformComponent = m_World->GetComponent(entity); - if(!transformComponent) { - LOG_ERROR("No TransformComponent in CreateBody"); - return; - } - - auto absoluteTransform = m_World->GetSystem()->AbsoluteTransform(entity); - - b2BodyDef bodyDef; - bodyDef.position.Set(absoluteTransform.Position.x, absoluteTransform.Position.y); - bodyDef.angle = -glm::eulerAngles(absoluteTransform.Orientation).z; - - if (physicsComponent->Static) { - bodyDef.type = b2_staticBody; - } else { - bodyDef.type = b2_dynamicBody; - - } - - b2Body* body = m_PhysicsWorld->CreateBody(&bodyDef); - - b2Shape* pShape; - - auto boxComponent = m_World->GetComponent(entity); - if (boxComponent) { - b2PolygonShape* bShape = new b2PolygonShape(); - bShape->SetAsBox(absoluteTransform.Scale.x/2, absoluteTransform.Scale.y/2); - pShape = bShape; - } else { - auto circleComponent = m_World->GetComponent(entity); - if (circleComponent) { - pShape = new b2CircleShape(); - pShape->m_radius = absoluteTransform.Scale.x; - - - if (absoluteTransform.Scale.x != absoluteTransform.Scale.y && absoluteTransform.Scale.y != absoluteTransform.Scale.z) { - LOG_WARNING("Circles has to be of uniform scale."); - } - pShape->m_radius = absoluteTransform.Scale.x/2; - - } - } - - b2FixtureDef fixtureDef; - fixtureDef.shape = pShape; - fixtureDef.filter.categoryBits = physicsComponent->Category; - fixtureDef.filter.maskBits = physicsComponent->Mask; - - - if(physicsComponent->Static) { - body->CreateFixture(&fixtureDef); //Density kanske ska vara 0 på statiska kroppar - } - else { - fixtureDef.shape = pShape; - fixtureDef.density = 1.f; - fixtureDef.restitution = 1.0f; - fixtureDef.friction = 0.0f; - body->CreateFixture(&fixtureDef); - - } - - delete pShape; - - - body->SetGravityScale(physicsComponent->GravityScale); - m_EntitiesToBodies.insert(std::make_pair(entity, body)); - m_BodiesToEntities.insert(std::make_pair(body, entity)); -} - -void dd::Systems::PhysicsSystem::CreateParticleGroup(EntityID e) -{ - //TODO: Lägg alla pd i en lista - auto transform = m_World->GetComponent(e); - if (!transform) { - LOG_ERROR("No Transform component in CreateParticleGroup"); - return; - } - - b2ParticleGroupDef pd; - b2PolygonShape shape; - - shape.SetAsBox(transform->Scale.x/2.f, transform->Scale.y/2.f); - pd.shape = &shape; - pd.flags = b2_tensileParticle; - pd.position.Set(transform->Position.x, transform->Position.y); - //TODO: PUT IN LIST - t_watergroup = m_ParticleSystem->CreateParticleGroup(pd); - b2Vec2* t_ParticlePositions = m_ParticleSystem->GetPositionBuffer(); - for(int i = 0; i < m_ParticleSystem->GetParticleCount(); i++){ - { - auto t_waterparticle = m_World->CreateEntity(e); - auto transformChild = m_World->AddComponent(t_waterparticle); - //auto sprite = m_World->AddComponent(t_waterparticle); - - transformChild->Position = glm::vec3(t_ParticlePositions[i].x - transform->Position.x, t_ParticlePositions[i].y - transform->Position.y, -9.5f); - transformChild->Scale = glm::vec3(m_ParticleSystem->GetRadius())/transform->Scale; - //sprite->SpriteFile = "Textures/Ball.png"; - m_World->CommitEntity(t_waterparticle); - - m_EntitiesToParticleHandle.insert(std::make_pair(t_waterparticle, m_ParticleSystem->GetParticleHandleFromIndex(i))); - m_ParticleHandleToEntities.insert(std::make_pair( m_ParticleSystem->GetParticleHandleFromIndex(i), t_waterparticle)); - } - - } - LOG_INFO("ParticleCount: %i", m_ParticleSystem->GetParticleCount()); -} - -dd::Systems::PhysicsSystem::~PhysicsSystem() -{ - if (m_ContactListener != nullptr) { - delete m_ContactListener; - m_ContactListener = nullptr; - } -} diff --git a/src/game/Sound/Sound.cpp b/src/game/Sound/Sound.cpp index 972f71b..f98f8eb 100644 --- a/src/game/Sound/Sound.cpp +++ b/src/game/Sound/Sound.cpp @@ -26,7 +26,7 @@ ALuint dd::Sound::LoadFile(std::string path) return 0; } - fread(&m_Size, sizeof(unsigned long), 1, fp); + fread(&m_Size, 4*sizeof(char), 1, fp); fread(m_Type, sizeof(char), 4, fp); if (m_Type[0] != 'W' || m_Type[1] != 'A' || m_Type[2] != 'V' || m_Type[3]!= 'E') { LOG_ERROR("ERROR: Not WAVE-file"); @@ -40,13 +40,13 @@ ALuint dd::Sound::LoadFile(std::string path) } //READ THE DATA FROM WAVE-FILE - fread(&m_ChunkSize, sizeof(unsigned long), 1, fp); - fread(&m_FormatType, sizeof(short), 1, fp); - fread(&m_Channels, sizeof(short), 1, fp); - fread(&m_SampleRate, sizeof(unsigned long), 1, fp); - fread(&m_AvgBytesPerSec, sizeof(unsigned long), 1, fp); - fread(&m_BytesPerSample, sizeof(short), 1, fp); - fread(&m_BitsPerSample, sizeof(short), 1, fp); + fread(&m_ChunkSize, 4*sizeof(char), 1, fp); + fread(&m_FormatType, 2*sizeof(char), 1, fp); + fread(&m_Channels, 2*sizeof(char), 1, fp); + fread(&m_SampleRate, 4*sizeof(char), 1, fp); + fread(&m_AvgBytesPerSec, 4*sizeof(char), 1, fp); + fread(&m_BytesPerSample, 2*sizeof(char), 1, fp); + fread(&m_BitsPerSample, 2*sizeof(char), 1, fp); fread(m_Type, sizeof(char), 4, fp); if (m_Type[0] !='d' || m_Type[1] != 'a' || m_Type[2] != 't' || m_Type[3] != 'a') { @@ -54,10 +54,10 @@ ALuint dd::Sound::LoadFile(std::string path) return 0; } - fread(&m_DataSize, sizeof(unsigned long), 1, fp); + fread(&m_DataSize, 4*sizeof(char), 1, fp); unsigned char* buf = new unsigned char[m_DataSize]; - fread(buf, sizeof(unsigned char), m_DataSize, fp); + fread(buf, sizeof(char), m_DataSize, fp); fclose(fp); // Create buffer diff --git a/src/game/Sound/SoundSystem.cpp b/src/game/Sound/SoundSystem.cpp index 1ecbd00..2ee2a61 100644 --- a/src/game/Sound/SoundSystem.cpp +++ b/src/game/Sound/SoundSystem.cpp @@ -19,22 +19,28 @@ void dd::Systems::SoundSystem::Initialize() else { LOG_ERROR("OpenAL failed to initialize."); } - alGetError(); - //Probably unnecessary. vec3(0) probably default. - const ALfloat pos[3] = {0, 0, 0}; - //alListenerfv(AL_POSITION, pos); - - m_SFXMasterVolume = 1.f; - m_BGMMasterVolume = 1.f; - //Subscribe to events EVENT_SUBSCRIBE_MEMBER(m_EContact, &SoundSystem::OnContact); EVENT_SUBSCRIBE_MEMBER(m_EPlaySFX, &SoundSystem::OnPlaySound); EVENT_SUBSCRIBE_MEMBER(m_EStopSound, &SoundSystem::OnStopSound); EVENT_SUBSCRIBE_MEMBER(m_EMasterVolume, &SoundSystem::OnMasterVolume); + //Todo: Move this + { + dd::Events::PlaySound e; + e.FilePath = "Sounds/BGM/under-the-sea-instrumental.wav"; + e.IsAmbient = true; + EventBroker->Publish(e); + } + { + dd::Events::PlaySound e; + e.FilePath = "Sounds/BGM/water-flowing.wav"; + e.Gain = 0.3f; + e.IsAmbient = true; + EventBroker->Publish(e); + } } @@ -44,7 +50,7 @@ void dd::Systems::SoundSystem::Update(double dt) //Clean up none-active sources //Only used for SFX's. BGM's are handled on stop sound. std::vector deleteList; - for (auto item : m_SFXSourcesToBuffers) { + for (auto& item : m_SFXSourcesToBuffers) { ALint sourceState; alGetSourcei(item.first, AL_SOURCE_STATE, &sourceState); if (sourceState == AL_STOPPED) { @@ -70,32 +76,32 @@ ALuint dd::Systems::SoundSystem::CreateSource() bool dd::Systems::SoundSystem::OnPlaySound(const dd::Events::PlaySound &event) { //Loading and binding sound buffer to source - Sound *sound = ResourceManager::Load(event.path); + Sound *sound = ResourceManager::Load(event.FilePath); if (sound == nullptr) { return false; } ALuint source = CreateSource(); ALuint buffer = sound->Buffer(); alSourcei(source, AL_BUFFER, buffer); + sound->SetGain(event.Gain); //Sound settings float relativeVolume = 1.f; - if (event.isAmbient) { + if (event.IsAmbient) { alSourcei(source, AL_LOOPING, AL_TRUE); relativeVolume = m_BGMMasterVolume; m_BGMSourcesToBuffers[source] = sound; } - else if (!event.isAmbient) + else if (!event.IsAmbient) { m_SFXSourcesToBuffers[source] = sound; alSourcei(source, AL_LOOPING, AL_FALSE); relativeVolume = m_SFXMasterVolume; } - alSourcef(source, AL_GAIN, (event.volume * relativeVolume)); - alSourcef(source, AL_PITCH, event.pitch); - + alSourcef(source, AL_GAIN, (sound->Gain() * relativeVolume)); + alSourcef(source, AL_PITCH, event.Pitch); //Play alSourcePlay(source); @@ -104,53 +110,50 @@ bool dd::Systems::SoundSystem::OnPlaySound(const dd::Events::PlaySound &event) bool dd::Systems::SoundSystem::OnStopSound(const dd::Events::StopSound &event) { - - //TODO: Delete sources for bgms - ALuint itemToDelete; - for (auto item : m_BGMSourcesToBuffers) + ALuint itemToDeleted; + for (auto& item : m_BGMSourcesToBuffers) { - if (item.second->Path() == event.path) { - itemToDelete = item.first; + if (item.second->Path() == event.FilePath) { + itemToDeleted = item.first; break; } } - alSourceStop(itemToDelete); - alDeleteSources(1, &itemToDelete); - m_BGMSourcesToBuffers.erase(itemToDelete); + alSourceStop(itemToDeleted); + alDeleteSources(1, &itemToDeleted); + m_BGMSourcesToBuffers.erase(itemToDeleted); - //Should not because SFX's should be very short. + //Should not happen because SFX's should be very short. for (auto item : m_SFXSourcesToBuffers) { - if (item.second->Path() == event.path) { + if (item.second->Path() == event.FilePath) { alSourceStop(item.first); return true; } } - return false; } bool dd::Systems::SoundSystem::OnMasterVolume(const dd::Events::MasterVolume &event) { - //TODO: Make the volume depend on the value given when stored. - //TODO: .. now it ONLY uses the master volume - if (event.isAmbient) { - m_BGMMasterVolume = event.gain; - for (auto item : m_BGMSourcesToBuffers) + if (event.IsAmbient) { + m_BGMMasterVolume = event.Gain; + for (auto& item : m_BGMSourcesToBuffers) { - alSourcef(item.first, AL_GAIN, event.gain); + alSourcef(item.first, AL_GAIN, (item.second->Gain() * m_BGMMasterVolume)); } + return true; } - else if (!event.isAmbient) { - m_SFXMasterVolume = event.gain; - for (auto item : m_SFXSourcesToBuffers) + else if (!event.IsAmbient) { + m_SFXMasterVolume = event.Gain; + for (auto& item : m_SFXSourcesToBuffers) { - alSourcef(item.first, AL_GAIN, event.gain); + alSourcef(item.first, AL_GAIN, (item.second->Gain() * m_SFXMasterVolume)); } + return true; } + return false; } -//On contact: play the sound given in the CCOllisionSound. bool dd::Systems::SoundSystem::OnContact(const dd::Events::Contact &event) { //Check which entity has the collisionSound component. @@ -167,8 +170,8 @@ bool dd::Systems::SoundSystem::OnContact(const dd::Events::Contact &event) { dd::Events::PlaySound e; - e.path = collisionSound->filePath; - e.isAmbient = false; + e.FilePath = collisionSound->FilePath; + e.IsAmbient = false; EventBroker->Publish(e); } @@ -187,7 +190,8 @@ bool dd::Systems::SoundSystem::OnContact(const dd::Events::Contact &event) e.ParticleLifeTime = 3.f; EventBroker->Publish(e); } - //return true; + return true; } + diff --git a/src/tests/CMakeLists.txt b/src/tests/CMakeLists.txt index ae7d47f..13604e2 100644 --- a/src/tests/CMakeLists.txt +++ b/src/tests/CMakeLists.txt @@ -1,18 +1,17 @@ project(tests) +find_package(PNG REQUIRED) find_package(Boost REQUIRED COMPONENTS chrono thread unit_test_framework) include_directories( ${CMAKE_SOURCE_DIR}/include + ${PNG_INCLUDE_DIRS} ${Boost_INCLUDE_DIRS} ) -set(SOURCE_FILES - main.cpp - FileWatcherTest.cpp - EventTest.cpp - ComponentCopyTest.cpp - EntityCloneTest.cpp + +file(GLOB SOURCE_FILES + "*.cpp" ) if(CMAKE_COMPILER_IS_GNUCXX) diff --git a/src/tests/EventFixture.h b/src/tests/EventFixture.h index ef9acbf..4f78080 100644 --- a/src/tests/EventFixture.h +++ b/src/tests/EventFixture.h @@ -10,7 +10,7 @@ struct EventFixture EventFixture() { this->EventBroker = new dd::EventBroker(); - m_EEventType = decltype(m_EEventType)(std::bind(&OnEvent, this, std::placeholders::_1)); + m_EEventType = decltype(m_EEventType)(std::bind(&EventFixture::OnEvent, this, std::placeholders::_1)); this->EventBroker->Subscribe(m_EEventType); Run(); Check(); @@ -40,7 +40,7 @@ struct EventFixture // Publish the event this->EventBroker->Publish(Before); // Clear to swap buffers - this->EventBroker->Clear(); + this->EventBroker->Swap(); // Process the event this->EventBroker->template Process(); } diff --git a/src/tests/FrameTest.cpp b/src/tests/FrameTest.cpp new file mode 100644 index 0000000..fd7a870 --- /dev/null +++ b/src/tests/FrameTest.cpp @@ -0,0 +1,41 @@ +#include +#include "PrecompiledHeader.h" +#include "Core/EventBroker.h" +#include "GUI/Frame.h" + +using namespace dd; + +BOOST_AUTO_TEST_CASE(FrameTest) +{ + EventBroker eb; + + GUI::Frame baseFrame(&eb); + baseFrame.X = 100; + baseFrame.Y = 100; + + // Create a frame with a relative position to baseFrame + GUI::Frame f1(&baseFrame, "f1"); + f1.X = 50; + f1.Y = 50; + f1.Width = 50; + f1.Height = 50; + + BOOST_CHECK(f1.Left() == 150); BOOST_CHECK(baseFrame.X + f1.X == 150); + BOOST_CHECK(f1.Top() == 150); BOOST_CHECK(baseFrame.Y + f1.Y == 150); + BOOST_CHECK(f1.Right() == 200); BOOST_CHECK(baseFrame.X + f1.X + f1.Width == 200); + BOOST_CHECK(f1.Bottom() == 200); BOOST_CHECK(baseFrame.Y + f1.Y + f1.Height == 200); + + // Create a frame to the right of f1 + GUI::Frame f2(&baseFrame, "f2"); + f2.SetLeft(f1.Right()); + f2.SetTop(f1.Bottom()); + f2.Width = 50; + f2.Height = 50; + + BOOST_CHECK(f2.X == 100); BOOST_CHECK(f2.X == f1.X + f1.Width); + BOOST_CHECK(f2.Left() == 200); BOOST_CHECK(f2.Left() == f1.Right()); + BOOST_CHECK(f2.Y == 100); BOOST_CHECK(f2.Y == f1.Y + f1.Height); + BOOST_CHECK(f2.Top() == 200); BOOST_CHECK(f2.Top() == f1.Bottom()); + BOOST_CHECK(f2.Right() == 250); BOOST_CHECK(f2.Right() == f1.Right() + f2.Width); + BOOST_CHECK(f2.Bottom() == 250); BOOST_CHECK(f2.Bottom() == f1.Bottom() + f2.Height); +} \ No newline at end of file diff --git a/tools/StyleGuide.h b/tools/StyleGuide.h index f43b57c..99c152c 100755 --- a/tools/StyleGuide.h +++ b/tools/StyleGuide.h @@ -1,6 +1,12 @@ #ifndef NAMESPACE_FILENAME_H__ #define NAMESPACE_FILENAME_H__ +#include + +#include + +#include "Internal/Header.h" + namespace dd {