diff --git a/.gitignore b/.gitignore index 89942d9..cc90678 100644 --- a/.gitignore +++ b/.gitignore @@ -189,7 +189,6 @@ install_manifest.txt *.slo *.lo *.o -*.obj # Precompiled Headers *.gch @@ -276,7 +275,6 @@ artifacts/ *_i.h *.ilk *.meta -*.obj *.pch *.pdb *.pgc diff --git a/CMakeLists.txt b/CMakeLists.txt index d3d976c..6ee4999 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -73,6 +73,7 @@ endif() include_directories(.) #add_subdirectory(stream_compaction) # TODO: uncomment if using your stream compaction +add_subdirectory(tiny_obj_loader) add_subdirectory(src) cuda_add_executable(${CMAKE_PROJECT_NAME} @@ -82,6 +83,7 @@ cuda_add_executable(${CMAKE_PROJECT_NAME} target_link_libraries(${CMAKE_PROJECT_NAME} src + tiny_obj_loader #stream_compaction # TODO: uncomment if using your stream compaction ${CORELIBS} ) diff --git a/README.md b/README.md index 110697c..e712cf9 100644 --- a/README.md +++ b/README.md @@ -1,13 +1,55 @@ -CUDA Path Tracer -================ +# CUDA Path Tracer **University of Pennsylvania, CIS 565: GPU Programming and Architecture, Project 3** -* (TODO) YOUR NAME HERE -* Tested on: (TODO) Windows 22, i7-2222 @ 2.22GHz 22GB, GTX 222 222MB (Moore 2222 Lab) +* Zichuan Yu + * [LinkedIn](https://www.linkedin.com/in/zichuan-yu/), [Behance](https://www.behance.net/zainyu717ebcc) +* Tested on: Windows 10.0.17134 Build 17134, i7-4710 @ 2.50GHz 16GB, GTX 980m 4096MB GDDR5 -### (TODO: Your README) +

+ + +

-*DO NOT* leave the README to the last minute! It is a crucial part of the -project, and we will not be able to grade you without a good README. +## Features +- Diffuse and perfectly specular shading kernel +- Path termination with stream compaction +- Sort by material +- Caching first bounce +- Refraction with fresnel term +- Stochastic sampled antialiasing +- OBJ file loading + +## Feature Demo + +### Antialiasing + +![AA](img/AA_compare.jpg) + +### Refraction with Fresnel + +![refraction](img/refraction.png) + +### OBJ Loading + +![obj_loading](img/obj_loading.png) + +## Analysis + +### Cache First Bounce + +![cache_first_bounce](img/cache_first_bounce.png) + +### Sort by Material Analysis + +![material_sort](img/material_sort.png) + +### Stream Compaction Analysis + +![stream_compaction](img/stream_compaction.png) + +## Credits + +- Android Model Credit: https://free3d.com/3d-model/android-44714.html +- tiny_obj_loader Credit: https://github.com/syoyo/tinyobjloader diff --git a/img/AA.png b/img/AA.png new file mode 100644 index 0000000..f5c15ba Binary files /dev/null and b/img/AA.png differ diff --git a/img/AA_compare.jpg b/img/AA_compare.jpg new file mode 100644 index 0000000..d34df2a Binary files /dev/null and b/img/AA_compare.jpg differ diff --git a/img/cache_first_bounce.png b/img/cache_first_bounce.png new file mode 100644 index 0000000..12907b4 Binary files /dev/null and b/img/cache_first_bounce.png differ diff --git a/img/cover1.png b/img/cover1.png new file mode 100644 index 0000000..dcd61ea Binary files /dev/null and b/img/cover1.png differ diff --git a/img/cover2.png b/img/cover2.png new file mode 100644 index 0000000..6baab67 Binary files /dev/null and b/img/cover2.png differ diff --git a/img/material_sort.png b/img/material_sort.png new file mode 100644 index 0000000..c9e2493 Binary files /dev/null and b/img/material_sort.png differ diff --git a/img/nonAA.png b/img/nonAA.png new file mode 100644 index 0000000..7fe014d Binary files /dev/null and b/img/nonAA.png differ diff --git a/img/obj_loading.png b/img/obj_loading.png new file mode 100644 index 0000000..388685f Binary files /dev/null and b/img/obj_loading.png differ diff --git a/img/refraction.png b/img/refraction.png new file mode 100644 index 0000000..eb90e5f Binary files /dev/null and b/img/refraction.png differ diff --git a/img/stream_compaction.png b/img/stream_compaction.png new file mode 100644 index 0000000..c88842e Binary files /dev/null and b/img/stream_compaction.png differ diff --git a/mesh/android.mtl b/mesh/android.mtl new file mode 100644 index 0000000..8ee0618 --- /dev/null +++ b/mesh/android.mtl @@ -0,0 +1,22 @@ +# 3ds Max Wavefront OBJ Exporter v0.97b - (c)2007 guruware +# File Created: 21.10.2014 16:39:03 + +newmtl wire_061135006 + Ns 32 + d 1 + Tr 0 + Tf 1 1 1 + illum 2 + Ka 0.239216 0.529412 0.023529 + Kd 0.239216 0.529412 0.023529 + Ks 0.350000 0.350000 0.350000 + +newmtl wire_255255255 + Ns 32 + d 1 + Tr 0 + Tf 1 1 1 + illum 2 + Ka 1.000000 1.000000 1.000000 + Kd 1.000000 1.000000 1.000000 + Ks 0.350000 0.350000 0.350000 diff --git a/mesh/android.obj b/mesh/android.obj new file mode 100644 index 0000000..45ecc33 --- /dev/null +++ b/mesh/android.obj @@ -0,0 +1,8410 @@ +# 3ds Max Wavefront OBJ Exporter v0.97b - (c)2007 guruware +# File Created: 21.10.2014 16:39:03 + +# +# object Tube001 +# + +v -0.000001 2.102387 -14.356307 +v -0.000001 26.632030 -14.356307 +v 3.346165 26.632030 -13.905240 +v 3.346165 2.102387 -13.905240 +v -0.000001 27.283955 -13.660666 +v -0.000001 27.283955 -12.269103 +v 2.859720 27.283955 -11.883610 +v 3.184038 27.283955 -13.231453 +v 6.482079 26.632030 -12.580381 +v 6.482079 2.102387 -12.580381 +v 5.539754 27.283955 -10.751350 +v 6.168013 27.283955 -11.970786 +v 9.210700 26.632030 -10.464976 +v 9.210700 2.102387 -10.464976 +v 7.871705 27.283955 -8.943471 +v 8.764427 27.283955 -9.957875 +v 11.360579 26.632030 -7.691944 +v 11.360579 2.102387 -7.691944 +v 9.709047 27.283955 -6.573565 +v 10.810142 27.283955 -7.319201 +v 12.796630 26.632030 -4.435525 +v 12.796630 2.102387 -4.435525 +v 10.936336 27.283955 -3.790543 +v 12.176615 27.283955 -4.220560 +v 13.428623 26.632030 -0.900330 +v 13.428623 2.102387 -0.900330 +v 11.476453 27.283955 -0.769273 +v 12.777987 27.283955 -0.856650 +v 13.216846 26.632030 2.691511 +v 13.216846 2.102387 2.691511 +v 11.295463 27.283955 2.300408 +v 12.576469 27.283955 2.561160 +v 12.174605 26.632030 6.114308 +v 12.174605 2.102387 6.114308 +v 10.404737 27.283955 5.225620 +v 11.584727 27.283955 5.818118 +v 10.367391 26.632030 9.152994 +v 10.367391 2.102387 9.152994 +v 8.860243 27.283955 7.822562 +v 9.865075 27.283955 8.709577 +v 7.908753 26.632030 11.616640 +v 7.908753 2.102387 11.616640 +v 6.759027 27.283955 9.928057 +v 7.525563 27.283955 11.053854 +v 4.953181 26.632030 13.350444 +v 4.953181 2.102387 13.350444 +v 4.233118 27.283955 11.409811 +v 4.713192 27.283955 12.703652 +v 1.686382 26.632030 14.245464 +v 1.686382 2.102387 14.245464 +v 1.441226 27.283955 12.174719 +v 1.604674 27.283955 13.555307 +v -1.686378 26.632030 14.245464 +v -1.686378 2.102387 14.245464 +v -1.441223 27.283955 12.174720 +v -1.604671 27.283955 13.555307 +v -4.953178 26.632030 13.350445 +v -4.953178 2.102387 13.350445 +v -4.233115 27.283955 11.409813 +v -4.713189 27.283955 12.703654 +v -7.908752 26.632030 11.616641 +v -7.908752 2.102387 11.616641 +v -6.759026 27.283955 9.928058 +v -7.525562 27.283955 11.053855 +v -10.367391 26.632030 9.152994 +v -10.367391 2.102387 9.152994 +v -8.860243 27.283955 7.822562 +v -9.865075 27.283955 8.709577 +v -12.174606 26.632030 6.114307 +v -12.174606 2.102387 6.114307 +v -10.404737 27.283955 5.225619 +v -11.584728 27.283955 5.818117 +v -13.216846 26.632030 2.691508 +v -13.216846 2.102387 2.691508 +v -11.295463 27.283955 2.300406 +v -12.576469 27.283955 2.561158 +v -13.428623 26.632030 -0.900334 +v -13.428623 2.102387 -0.900334 +v -11.476453 27.283955 -0.769276 +v -12.777987 27.283955 -0.856654 +v -12.796629 26.632030 -4.435529 +v -12.796629 2.102387 -4.435529 +v -10.936334 27.283955 -3.790547 +v -12.176613 27.283955 -4.220564 +v -11.360575 26.632030 -7.691950 +v -11.360575 2.102387 -7.691950 +v -9.709044 27.283955 -6.573569 +v -10.810138 27.283955 -7.319206 +v -9.210694 26.632030 -10.464983 +v -9.210694 2.102387 -10.464983 +v -7.871700 27.283955 -8.943476 +v -8.764422 27.283955 -9.957882 +v -6.482070 26.632030 -12.580387 +v -6.482070 2.102387 -12.580387 +v -5.539747 27.283955 -10.751355 +v -6.168005 27.283955 -11.970791 +v -3.346154 26.632030 -13.905243 +v -3.346154 2.102387 -13.905243 +v -2.859711 27.283955 -11.883613 +v -3.184028 27.283955 -13.231456 +v 0.414523 0.000000 -0.803396 +v 0.589018 0.000000 -0.668116 +v 0.726500 0.000000 -0.490784 +v 0.858750 0.000000 -0.056468 +v 0.818335 0.000000 -0.282539 +v 0.845206 0.000000 0.173229 +v 0.778556 0.000000 0.392115 +v 0.505756 0.000000 0.743986 +v 0.662986 0.000000 0.586436 +v -0.845206 0.000000 0.173229 +v 0.316751 0.000000 0.854861 +v 0.107844 0.000000 0.912096 +v -0.316752 0.000000 0.854860 +v -0.107841 0.000000 0.912096 +v -0.505760 0.000000 0.743984 +v -0.662986 0.000000 0.586437 +v -0.778554 0.000000 0.392118 +v -0.858749 0.000000 -0.056470 +v -0.818334 0.000000 -0.282540 +v -0.589017 0.000000 -0.668118 +v -0.726500 0.000000 -0.490785 +v -0.213982 0.000000 -0.888120 +v -0.414524 0.000000 -0.803395 +v -0.000001 0.000000 -0.916965 +v 0.213984 0.000000 -0.888120 +v -0.000001 0.000000 -12.112931 +v 2.823322 0.000000 -11.732344 +v 2.143631 0.000000 -8.907597 +v -0.000002 0.000000 -9.196560 +v 5.469246 0.000000 -10.614496 +v 4.152571 0.000000 -8.058860 +v 7.771516 0.000000 -8.829625 +v 5.900590 0.000000 -6.703682 +v 9.585474 0.000000 -6.489883 +v 7.277852 0.000000 -4.927213 +v 10.797141 0.000000 -3.742283 +v 8.197821 0.000000 -2.841075 +v 11.330384 0.000000 -0.759467 +v 8.602690 0.000000 -0.576346 +v 11.151697 0.000000 2.271144 +v 8.467019 0.000000 1.724671 +v 10.272308 0.000000 5.159125 +v 7.799337 0.000000 3.917395 +v 8.747473 0.000000 7.723014 +v 6.641592 0.000000 5.864048 +v 6.673001 0.000000 9.801711 +v 5.066532 0.000000 7.442317 +v 4.179241 0.000000 11.264606 +v 3.173124 0.000000 8.553033 +v 1.422883 0.000000 12.019778 +v 1.080336 0.000000 9.126403 +v -1.422880 0.000000 12.019778 +v -1.080333 0.000000 9.126403 +v -4.179238 0.000000 11.264606 +v -3.173121 0.000000 8.553033 +v -6.673000 0.000000 9.801712 +v -5.066532 0.000000 7.442318 +v -8.747473 0.000000 7.723014 +v -6.641593 0.000000 5.864048 +v -10.272309 0.000000 5.159125 +v -7.799337 0.000000 3.917394 +v -11.151697 0.000000 2.271142 +v -8.467019 0.000000 1.724669 +v -11.330384 0.000000 -0.759470 +v -8.602690 0.000000 -0.576349 +v -10.797140 0.000000 -3.742287 +v -8.197820 0.000000 -2.841077 +v -9.585471 0.000000 -6.489888 +v -7.277850 0.000000 -4.927217 +v -7.771512 0.000000 -8.829632 +v -5.900585 0.000000 -6.703687 +v -5.469239 0.000000 -10.614501 +v -4.152565 0.000000 -8.058864 +v -2.823313 0.000000 -11.732347 +v -2.143624 0.000000 -8.907598 +v 1.276688 0.000000 -5.304643 +v -0.000002 0.000000 -5.476741 +v 2.473158 0.000000 -4.799159 +v 3.514231 0.000000 -3.992051 +v 4.334491 0.000000 -2.934035 +v 4.882399 0.000000 -1.691587 +v 5.123528 0.000000 -0.342778 +v 5.042727 0.000000 1.027646 +v 4.645072 0.000000 2.333574 +v 3.955551 0.000000 3.492947 +v 3.017488 0.000000 4.432922 +v 1.889826 0.000000 5.094434 +v 0.643420 0.000000 5.435917 +v -0.643417 0.000000 5.435917 +v -1.889825 0.000000 5.094433 +v -3.017489 0.000000 4.432922 +v -3.955552 0.000000 3.492947 +v -4.645072 0.000000 2.333575 +v -5.042726 0.000000 1.027645 +v -5.123528 0.000000 -0.342780 +v -4.882399 0.000000 -1.691589 +v -4.334490 0.000000 -2.934037 +v -3.514228 0.000000 -3.992054 +v -2.473155 0.000000 -4.799160 +v -1.276683 0.000000 -5.304644 +v 0.549575 0.000000 -2.282811 +v -0.000001 0.000000 -2.356894 +v 1.064618 0.000000 -2.065215 +v 1.512769 0.000000 -1.717780 +v 1.865866 0.000000 -1.262337 +v 2.101723 0.000000 -0.727501 +v 2.205521 0.000000 -0.146881 +v 2.170739 0.000000 0.443045 +v 1.999561 0.000000 1.005208 +v 1.702743 0.000000 1.504281 +v 1.298935 0.000000 1.908913 +v 0.813511 0.000000 2.193673 +v 0.276973 0.000000 2.340671 +v -0.276971 0.000000 2.340671 +v -0.813512 0.000000 2.193672 +v -1.298937 0.000000 1.908912 +v -1.702743 0.000000 1.504282 +v -1.999560 0.000000 1.005209 +v -2.170738 0.000000 0.443045 +v -2.205521 0.000000 -0.146883 +v -2.101723 0.000000 -0.727503 +v -1.865865 0.000000 -1.262338 +v -1.512767 0.000000 -1.717782 +v -1.064618 0.000000 -2.065216 +v -0.549572 0.000000 -2.282811 +v 2.962036 0.042906 -12.308826 +v -0.000001 0.042906 -12.708112 +v 5.737957 0.042906 -11.136057 +v 8.153340 0.042906 -9.263494 +v 10.056420 0.042906 -6.808797 +v 11.327618 0.042906 -3.926204 +v 11.887059 0.042906 -0.796839 +v 11.699594 0.042906 2.382670 +v 10.776999 0.042906 5.412541 +v 9.177247 0.042906 8.102396 +v 7.000854 0.042906 10.283223 +v 4.384572 0.042906 11.817991 +v 1.492791 0.042906 12.610267 +v -1.492787 0.042906 12.610267 +v -4.384569 0.042906 11.817992 +v -7.000853 0.042906 10.283224 +v -9.177247 0.042906 8.102396 +v -10.776999 0.042906 5.412540 +v -11.699594 0.042906 2.382668 +v -11.887059 0.042906 -0.796842 +v -11.327617 0.042906 -3.926208 +v -10.056417 0.042906 -6.808802 +v -8.153336 0.042906 -9.263500 +v -5.737949 0.042906 -11.136063 +v -2.962026 0.042906 -12.308829 +v 3.079408 0.171623 -12.796619 +v -0.000001 0.171623 -13.211728 +v 3.175441 0.386153 -13.195724 +v -0.000001 0.386153 -13.623775 +v 3.250133 0.686494 -13.506136 +v -0.000001 0.686494 -13.944259 +v 3.303484 1.072647 -13.727860 +v -0.000001 1.072647 -14.173174 +v 3.335495 1.544611 -13.860895 +v -0.000001 1.544611 -14.310525 +v 5.965327 0.171623 -11.577378 +v 6.151358 0.386153 -11.938460 +v 6.296048 0.686494 -12.219300 +v 6.399398 1.072647 -12.419902 +v 6.461409 1.544611 -12.540261 +v 8.476422 0.171623 -9.630614 +v 8.740763 0.386153 -9.930984 +v 8.946361 0.686494 -10.164606 +v 9.093216 1.072647 -10.331479 +v 9.181329 1.544611 -10.431602 +v 10.454912 0.171623 -7.078648 +v 10.780952 0.386153 -7.299434 +v 11.034539 0.686494 -7.471158 +v 11.215672 1.072647 -7.593817 +v 11.324351 1.544611 -7.667412 +v 11.776483 0.171623 -4.081830 +v 12.143736 0.386153 -4.209160 +v 12.429377 0.686494 -4.308195 +v 12.633406 1.072647 -4.378933 +v 12.755824 1.544611 -4.421377 +v 12.358093 0.171623 -0.828461 +v 12.743484 0.386153 -0.854334 +v 13.043233 0.686494 -0.874457 +v 13.257339 1.072647 -0.888831 +v 13.385802 1.544611 -0.897455 +v 12.163198 0.171623 2.477038 +v 12.542511 0.386153 2.554248 +v 12.837533 0.686494 2.614300 +v 13.048262 1.072647 2.657195 +v 13.174699 1.544611 2.682932 +v 11.204046 0.171623 5.626970 +v 11.553447 0.386153 5.802412 +v 11.825204 0.686494 5.938866 +v 12.019316 1.072647 6.036334 +v 12.135783 1.544611 6.094814 +v 9.540901 0.171623 8.423412 +v 9.838437 0.386153 8.686062 +v 10.069854 0.686494 8.890346 +v 10.235152 1.072647 9.036262 +v 10.334331 1.544611 9.123812 +v 7.278267 0.171623 10.690656 +v 7.505243 0.386153 11.024011 +v 7.681779 0.686494 11.283286 +v 7.807876 1.072647 11.468482 +v 7.883534 1.544611 11.579601 +v 4.558313 0.171623 12.286241 +v 4.700466 0.386153 12.669353 +v 4.811029 0.686494 12.967331 +v 4.890003 1.072647 13.180171 +v 4.937387 1.544611 13.307875 +v 1.551944 0.171623 13.109910 +v 1.600342 0.386153 13.518710 +v 1.637984 0.686494 13.836664 +v 1.664872 1.072647 14.063775 +v 1.681005 1.544611 14.200043 +v -1.551940 0.171623 13.109910 +v -1.600338 0.386153 13.518710 +v -1.637981 0.686494 13.836664 +v -1.664868 1.072647 14.063775 +v -1.681001 1.544611 14.200043 +v -4.558310 0.171623 12.286242 +v -4.700463 0.386153 12.669355 +v -4.811026 0.686494 12.967332 +v -4.889999 1.072647 13.180173 +v -4.937383 1.544611 13.307877 +v -7.278266 0.171623 10.690656 +v -7.505241 0.386153 11.024011 +v -7.681777 0.686494 11.283286 +v -7.807874 1.072647 11.468483 +v -7.883533 1.544611 11.579601 +v -9.540902 0.171623 8.423412 +v -9.838438 0.386153 8.686062 +v -10.069854 0.686494 8.890346 +v -10.235152 1.072647 9.036262 +v -10.334331 1.544611 9.123812 +v -11.204046 0.171623 5.626969 +v -11.553448 0.386153 5.802411 +v -11.825205 0.686494 5.938866 +v -12.019317 1.072647 6.036333 +v -12.135784 1.544611 6.094813 +v -12.163198 0.171623 2.477036 +v -12.542511 0.386153 2.554246 +v -12.837533 0.686494 2.614298 +v -13.048262 1.072647 2.657192 +v -13.174699 1.544611 2.682929 +v -12.358093 0.171623 -0.828465 +v -12.743484 0.386153 -0.854337 +v -13.043233 0.686494 -0.874461 +v -13.257339 1.072647 -0.888835 +v -13.385802 1.544611 -0.897459 +v -11.776482 0.171623 -4.081834 +v -12.143735 0.386153 -4.209165 +v -12.429376 0.686494 -4.308199 +v -12.633405 1.072647 -4.378938 +v -12.755822 1.544611 -4.421381 +v -10.454909 0.171623 -7.078653 +v -10.780949 0.386153 -7.299440 +v -11.034535 0.686494 -7.471163 +v -11.215668 1.072647 -7.593822 +v -11.324348 1.544611 -7.667418 +v -8.476417 0.171623 -9.630620 +v -8.740757 0.386153 -9.930990 +v -8.946354 0.686494 -10.164612 +v -9.093209 1.072647 -10.331485 +v -9.181323 1.544611 -10.431608 +v -5.965320 0.171623 -11.577384 +v -6.151350 0.386153 -11.938465 +v -6.296040 0.686494 -12.219306 +v -6.399390 1.072647 -12.419907 +v -6.461401 1.544611 -12.540267 +v -3.079399 0.171623 -12.796622 +v -3.175431 0.386153 -13.195725 +v -3.250123 0.686494 -13.506140 +v -3.303474 1.072647 -13.727863 +v -3.335484 1.544611 -13.860898 +v 3.305633 27.120974 -13.736794 +v -0.000001 27.120974 -14.182396 +v 6.403562 27.120974 -12.427982 +v 9.099132 27.120974 -10.338201 +v 11.222969 27.120974 -7.598758 +v 12.641626 27.120974 -4.381783 +v 13.265964 27.120974 -0.889410 +v 13.056751 27.120974 2.658923 +v 12.027136 27.120974 6.040260 +v 10.241811 27.120974 9.042140 +v 7.812956 27.120974 11.475944 +v 4.893184 27.120974 13.188745 +v 1.665955 27.120974 14.072926 +v -1.665951 27.120974 14.072926 +v -4.893180 27.120974 13.188746 +v -7.812954 27.120974 11.475945 +v -10.241811 27.120974 9.042140 +v -12.027137 27.120974 6.040260 +v -13.056751 27.120974 2.658921 +v -13.265964 27.120974 -0.889414 +v -12.641624 27.120974 -4.381788 +v -11.222965 27.120974 -7.598764 +v -9.099126 27.120974 -10.338207 +v -6.403554 27.120974 -12.427988 +v -3.305623 27.120974 -13.736796 +# 400 vertices + +vt 0.019264 0.000000 0.000000 +vt 0.244026 0.000000 0.000000 +vt 0.244026 0.040000 0.000000 +vt 0.019264 0.040000 0.000000 +vt 0.333322 0.000000 0.000000 +vt 0.500000 0.000000 0.000000 +vt 0.500000 0.040000 0.000000 +vt 0.333322 0.040000 0.000000 +vt 0.244026 0.080000 0.000000 +vt 0.019264 0.080000 0.000000 +vt 0.500000 0.080000 0.000000 +vt 0.333322 0.080000 0.000000 +vt 0.244026 0.120000 0.000000 +vt 0.019264 0.120000 0.000000 +vt 0.500000 0.120000 0.000000 +vt 0.333322 0.120000 0.000000 +vt 0.244026 0.160000 0.000000 +vt 0.019264 0.160000 0.000000 +vt 0.500000 0.160000 0.000000 +vt 0.333322 0.160000 0.000000 +vt 0.244026 0.200000 0.000000 +vt 0.019264 0.200000 0.000000 +vt 0.500000 0.200000 0.000000 +vt 0.333322 0.200000 0.000000 +vt 0.244026 0.240000 0.000000 +vt 0.019264 0.240000 0.000000 +vt 0.500000 0.240000 0.000000 +vt 0.333322 0.240000 0.000000 +vt 0.244026 0.280000 0.000000 +vt 0.019264 0.280000 0.000000 +vt 0.500000 0.280000 0.000000 +vt 0.333322 0.280000 0.000000 +vt 0.244026 0.320000 0.000000 +vt 0.019264 0.320000 0.000000 +vt 0.500000 0.320000 0.000000 +vt 0.333322 0.320000 0.000000 +vt 0.244026 0.360000 0.000000 +vt 0.019264 0.360000 0.000000 +vt 0.500000 0.360000 0.000000 +vt 0.333322 0.360000 0.000000 +vt 0.244026 0.400000 0.000000 +vt 0.019264 0.400000 0.000000 +vt 0.500000 0.400000 0.000000 +vt 0.333322 0.400000 0.000000 +vt 0.244026 0.440000 0.000000 +vt 0.019264 0.440000 0.000000 +vt 0.500000 0.440000 0.000000 +vt 0.333322 0.440000 0.000000 +vt 0.244026 0.480000 0.000000 +vt 0.019264 0.480000 0.000000 +vt 0.500000 0.480000 0.000000 +vt 0.333322 0.480000 0.000000 +vt 0.244026 0.520000 0.000000 +vt 0.019264 0.520000 0.000000 +vt 0.500000 0.520000 0.000000 +vt 0.333322 0.520000 0.000000 +vt 0.244026 0.560000 0.000000 +vt 0.019264 0.560000 0.000000 +vt 0.500000 0.560000 0.000000 +vt 0.333322 0.560000 0.000000 +vt 0.244026 0.600000 0.000000 +vt 0.019264 0.600000 0.000000 +vt 0.500000 0.600000 0.000000 +vt 0.333322 0.600000 0.000000 +vt 0.244026 0.640000 0.000000 +vt 0.019264 0.640000 0.000000 +vt 0.500000 0.640000 0.000000 +vt 0.333322 0.640000 0.000000 +vt 0.244026 0.680000 0.000000 +vt 0.019264 0.680000 0.000000 +vt 0.500000 0.680000 0.000000 +vt 0.333322 0.680000 0.000000 +vt 0.244026 0.720000 0.000000 +vt 0.019264 0.720000 0.000000 +vt 0.500000 0.720000 0.000000 +vt 0.333322 0.720000 0.000000 +vt 0.244026 0.760000 0.000000 +vt 0.019264 0.760000 0.000000 +vt 0.500000 0.760000 0.000000 +vt 0.333322 0.760000 0.000000 +vt 0.244026 0.800000 0.000000 +vt 0.019264 0.800000 0.000000 +vt 0.500000 0.800000 0.000000 +vt 0.333322 0.800000 0.000000 +vt 0.244026 0.840000 0.000000 +vt 0.019264 0.840000 0.000000 +vt 0.500000 0.840000 0.000000 +vt 0.333322 0.840000 0.000000 +vt 0.244026 0.880000 0.000000 +vt 0.019264 0.880000 0.000000 +vt 0.500000 0.880000 0.000000 +vt 0.333322 0.880000 0.000000 +vt 0.244026 0.920000 0.000000 +vt 0.019264 0.920000 0.000000 +vt 0.500000 0.920000 0.000000 +vt 0.333322 0.920000 0.000000 +vt 0.244026 0.960000 0.000000 +vt 0.019264 0.960000 0.000000 +vt 0.500000 0.960000 0.000000 +vt 0.333322 0.960000 0.000000 +vt 0.244026 1.000000 0.000000 +vt 0.019264 1.000000 0.000000 +vt 0.500000 1.000000 0.000000 +vt 0.333322 1.000000 0.000000 +vt 0.000000 0.080000 0.000000 +vt 0.000000 0.120000 0.000000 +vt 0.000000 0.160000 0.000000 +vt 0.000000 0.240000 0.000000 +vt 0.000000 0.200000 0.000000 +vt 0.000000 0.280000 0.000000 +vt 0.000000 0.320000 0.000000 +vt 0.000000 0.400000 0.000000 +vt 0.000000 0.360000 0.000000 +vt 0.000000 0.720000 0.000000 +vt 0.000000 0.440000 0.000000 +vt 0.000000 0.480000 0.000000 +vt 0.000000 0.560000 0.000000 +vt 0.000000 0.520000 0.000000 +vt 0.000000 0.600000 0.000000 +vt 0.000000 0.640000 0.000000 +vt 0.000000 0.680000 0.000000 +vt 0.000000 0.760000 0.000000 +vt 0.000000 0.800000 0.000000 +vt 0.000000 0.880000 0.000000 +vt 0.000000 0.840000 0.000000 +vt 0.000000 0.960000 0.000000 +vt 0.000000 0.920000 0.000000 +vt 0.000000 1.000000 0.000000 +vt 0.000000 0.040000 0.000000 +vt 0.002752 0.040000 0.000000 +vt 0.002752 1.000000 0.000000 +vt 0.002752 0.080000 0.000000 +vt 0.002752 0.120000 0.000000 +vt 0.002752 0.160000 0.000000 +vt 0.002752 0.200000 0.000000 +vt 0.002752 0.240000 0.000000 +vt 0.002752 0.280000 0.000000 +vt 0.002752 0.320000 0.000000 +vt 0.002752 0.360000 0.000000 +vt 0.002752 0.400000 0.000000 +vt 0.002752 0.440000 0.000000 +vt 0.002752 0.480000 0.000000 +vt 0.002752 0.520000 0.000000 +vt 0.002752 0.560000 0.000000 +vt 0.002752 0.600000 0.000000 +vt 0.002752 0.640000 0.000000 +vt 0.002752 0.680000 0.000000 +vt 0.002752 0.720000 0.000000 +vt 0.002752 0.760000 0.000000 +vt 0.002752 0.800000 0.000000 +vt 0.002752 0.840000 0.000000 +vt 0.002752 0.880000 0.000000 +vt 0.002752 0.920000 0.000000 +vt 0.002752 0.960000 0.000000 +vt 0.005504 0.040000 0.000000 +vt 0.005504 1.000000 0.000000 +vt 0.008256 0.040000 0.000000 +vt 0.008256 1.000000 0.000000 +vt 0.011008 0.040000 0.000000 +vt 0.011008 1.000000 0.000000 +vt 0.013760 0.040000 0.000000 +vt 0.013760 1.000000 0.000000 +vt 0.016512 0.040000 0.000000 +vt 0.016512 1.000000 0.000000 +vt 0.005504 0.080000 0.000000 +vt 0.008256 0.080000 0.000000 +vt 0.011008 0.080000 0.000000 +vt 0.013760 0.080000 0.000000 +vt 0.016512 0.080000 0.000000 +vt 0.005504 0.120000 0.000000 +vt 0.008256 0.120000 0.000000 +vt 0.011008 0.120000 0.000000 +vt 0.013760 0.120000 0.000000 +vt 0.016512 0.120000 0.000000 +vt 0.005504 0.160000 0.000000 +vt 0.008256 0.160000 0.000000 +vt 0.011008 0.160000 0.000000 +vt 0.013760 0.160000 0.000000 +vt 0.016512 0.160000 0.000000 +vt 0.005504 0.200000 0.000000 +vt 0.008256 0.200000 0.000000 +vt 0.011008 0.200000 0.000000 +vt 0.013760 0.200000 0.000000 +vt 0.016512 0.200000 0.000000 +vt 0.005504 0.240000 0.000000 +vt 0.008256 0.240000 0.000000 +vt 0.011008 0.240000 0.000000 +vt 0.013760 0.240000 0.000000 +vt 0.016512 0.240000 0.000000 +vt 0.005504 0.280000 0.000000 +vt 0.008256 0.280000 0.000000 +vt 0.011008 0.280000 0.000000 +vt 0.013760 0.280000 0.000000 +vt 0.016512 0.280000 0.000000 +vt 0.005504 0.320000 0.000000 +vt 0.008256 0.320000 0.000000 +vt 0.011008 0.320000 0.000000 +vt 0.013760 0.320000 0.000000 +vt 0.016512 0.320000 0.000000 +vt 0.005504 0.360000 0.000000 +vt 0.008256 0.360000 0.000000 +vt 0.011008 0.360000 0.000000 +vt 0.013760 0.360000 0.000000 +vt 0.016512 0.360000 0.000000 +vt 0.005504 0.400000 0.000000 +vt 0.008256 0.400000 0.000000 +vt 0.011008 0.400000 0.000000 +vt 0.013760 0.400000 0.000000 +vt 0.016512 0.400000 0.000000 +vt 0.005504 0.440000 0.000000 +vt 0.008256 0.440000 0.000000 +vt 0.011008 0.440000 0.000000 +vt 0.013760 0.440000 0.000000 +vt 0.016512 0.440000 0.000000 +vt 0.005504 0.480000 0.000000 +vt 0.008256 0.480000 0.000000 +vt 0.011008 0.480000 0.000000 +vt 0.013760 0.480000 0.000000 +vt 0.016512 0.480000 0.000000 +vt 0.005504 0.520000 0.000000 +vt 0.008256 0.520000 0.000000 +vt 0.011008 0.520000 0.000000 +vt 0.013760 0.520000 0.000000 +vt 0.016512 0.520000 0.000000 +vt 0.005504 0.560000 0.000000 +vt 0.008256 0.560000 0.000000 +vt 0.011008 0.560000 0.000000 +vt 0.013760 0.560000 0.000000 +vt 0.016512 0.560000 0.000000 +vt 0.005504 0.600000 0.000000 +vt 0.008256 0.600000 0.000000 +vt 0.011008 0.600000 0.000000 +vt 0.013760 0.600000 0.000000 +vt 0.016512 0.600000 0.000000 +vt 0.005504 0.640000 0.000000 +vt 0.008256 0.640000 0.000000 +vt 0.011008 0.640000 0.000000 +vt 0.013760 0.640000 0.000000 +vt 0.016512 0.640000 0.000000 +vt 0.005504 0.680000 0.000000 +vt 0.008256 0.680000 0.000000 +vt 0.011008 0.680000 0.000000 +vt 0.013760 0.680000 0.000000 +vt 0.016512 0.680000 0.000000 +vt 0.005504 0.720000 0.000000 +vt 0.008256 0.720000 0.000000 +vt 0.011008 0.720000 0.000000 +vt 0.013760 0.720000 0.000000 +vt 0.016512 0.720000 0.000000 +vt 0.005504 0.760000 0.000000 +vt 0.008256 0.760000 0.000000 +vt 0.011008 0.760000 0.000000 +vt 0.013760 0.760000 0.000000 +vt 0.016512 0.760000 0.000000 +vt 0.005504 0.800000 0.000000 +vt 0.008256 0.800000 0.000000 +vt 0.011008 0.800000 0.000000 +vt 0.013760 0.800000 0.000000 +vt 0.016512 0.800000 0.000000 +vt 0.005504 0.840000 0.000000 +vt 0.008256 0.840000 0.000000 +vt 0.011008 0.840000 0.000000 +vt 0.013760 0.840000 0.000000 +vt 0.016512 0.840000 0.000000 +vt 0.005504 0.880000 0.000000 +vt 0.008256 0.880000 0.000000 +vt 0.011008 0.880000 0.000000 +vt 0.013760 0.880000 0.000000 +vt 0.016512 0.880000 0.000000 +vt 0.005504 0.920000 0.000000 +vt 0.008256 0.920000 0.000000 +vt 0.011008 0.920000 0.000000 +vt 0.013760 0.920000 0.000000 +vt 0.016512 0.920000 0.000000 +vt 0.005504 0.960000 0.000000 +vt 0.008256 0.960000 0.000000 +vt 0.011008 0.960000 0.000000 +vt 0.013760 0.960000 0.000000 +vt 0.016512 0.960000 0.000000 +vt 0.288674 0.040000 0.000000 +vt 0.288674 0.000000 0.000000 +vt 0.288674 0.080000 0.000000 +vt 0.288674 0.120000 0.000000 +vt 0.288674 0.160000 0.000000 +vt 0.288674 0.200000 0.000000 +vt 0.288674 0.240000 0.000000 +vt 0.288674 0.280000 0.000000 +vt 0.288674 0.320000 0.000000 +vt 0.288674 0.360000 0.000000 +vt 0.288674 0.400000 0.000000 +vt 0.288674 0.440000 0.000000 +vt 0.288674 0.480000 0.000000 +vt 0.288674 0.520000 0.000000 +vt 0.288674 0.560000 0.000000 +vt 0.288674 0.600000 0.000000 +vt 0.288674 0.640000 0.000000 +vt 0.288674 0.680000 0.000000 +vt 0.288674 0.720000 0.000000 +vt 0.288674 0.760000 0.000000 +vt 0.288674 0.800000 0.000000 +vt 0.288674 0.840000 0.000000 +vt 0.288674 0.880000 0.000000 +vt 0.288674 0.920000 0.000000 +vt 0.288674 0.960000 0.000000 +vt 0.288674 1.000000 0.000000 +# 305 texture coords + +g Tube001 +usemtl wire_061135006 +f -400/-305 -399/-304 -398/-303 -397/-302 +f -396/-301 -395/-300 -394/-299 -393/-298 +f -397/-302 -398/-303 -392/-297 -391/-296 +f -393/-298 -394/-299 -390/-295 -389/-294 +f -391/-296 -392/-297 -388/-293 -387/-292 +f -389/-294 -390/-295 -386/-291 -385/-290 +f -387/-292 -388/-293 -384/-289 -383/-288 +f -385/-290 -386/-291 -382/-287 -381/-286 +f -383/-288 -384/-289 -380/-285 -379/-284 +f -381/-286 -382/-287 -378/-283 -377/-282 +f -379/-284 -380/-285 -376/-281 -375/-280 +f -377/-282 -378/-283 -374/-279 -373/-278 +f -375/-280 -376/-281 -372/-277 -371/-276 +f -373/-278 -374/-279 -370/-275 -369/-274 +f -371/-276 -372/-277 -368/-273 -367/-272 +f -369/-274 -370/-275 -366/-271 -365/-270 +f -367/-272 -368/-273 -364/-269 -363/-268 +f -365/-270 -366/-271 -362/-267 -361/-266 +f -363/-268 -364/-269 -360/-265 -359/-264 +f -361/-266 -362/-267 -358/-263 -357/-262 +f -359/-264 -360/-265 -356/-261 -355/-260 +f -357/-262 -358/-263 -354/-259 -353/-258 +f -355/-260 -356/-261 -352/-257 -351/-256 +f -353/-258 -354/-259 -350/-255 -349/-254 +f -351/-256 -352/-257 -348/-253 -347/-252 +f -349/-254 -350/-255 -346/-251 -345/-250 +f -347/-252 -348/-253 -344/-249 -343/-248 +f -345/-250 -346/-251 -342/-247 -341/-246 +f -343/-248 -344/-249 -340/-245 -339/-244 +f -341/-246 -342/-247 -338/-243 -337/-242 +f -339/-244 -340/-245 -336/-241 -335/-240 +f -337/-242 -338/-243 -334/-239 -333/-238 +f -335/-240 -336/-241 -332/-237 -331/-236 +f -333/-238 -334/-239 -330/-235 -329/-234 +f -331/-236 -332/-237 -328/-233 -327/-232 +f -329/-234 -330/-235 -326/-231 -325/-230 +f -327/-232 -328/-233 -324/-229 -323/-228 +f -325/-230 -326/-231 -322/-227 -321/-226 +f -323/-228 -324/-229 -320/-225 -319/-224 +f -321/-226 -322/-227 -318/-223 -317/-222 +f -319/-224 -320/-225 -316/-221 -315/-220 +f -317/-222 -318/-223 -314/-219 -313/-218 +f -315/-220 -316/-221 -312/-217 -311/-216 +f -313/-218 -314/-219 -310/-215 -309/-214 +f -311/-216 -312/-217 -308/-213 -307/-212 +f -309/-214 -310/-215 -306/-211 -305/-210 +f -307/-212 -308/-213 -304/-209 -303/-208 +f -305/-210 -306/-211 -302/-207 -301/-206 +f -303/-208 -304/-209 -399/-205 -400/-204 +f -301/-206 -302/-207 -395/-203 -396/-202 +f -300/-201 -299/-200 -298/-199 -297/-198 +f -298/-199 -296/-197 -297/-198 +f -297/-198 -295/-196 -294/-195 -293/-194 +f -294/-195 -292/-193 -293/-194 +f -300/-201 -297/-198 -293/-194 -291/-192 +f -293/-194 -290/-191 -289/-190 -288/-189 +f -289/-190 -287/-188 -288/-189 +f -288/-189 -286/-187 -285/-186 -291/-192 +f -285/-186 -284/-185 -291/-192 +f -293/-194 -288/-189 -291/-192 +f -291/-192 -283/-184 -282/-183 -281/-182 +f -282/-183 -280/-181 -281/-182 +f -300/-201 -291/-192 -281/-182 -279/-180 +f -281/-182 -278/-179 -279/-180 +f -300/-201 -279/-180 -277/-178 -276/-177 +f -275/-178 -274/-177 -273/-177 -272/-178 +f -274/-177 -271/-201 -270/-201 -273/-177 +f -271/-201 -269/-200 -268/-200 -270/-201 +f -269/-200 -267/-199 -266/-199 -268/-200 +f -267/-199 -265/-197 -264/-197 -266/-199 +f -265/-197 -263/-198 -262/-198 -264/-197 +f -263/-198 -261/-196 -260/-196 -262/-198 +f -261/-196 -259/-195 -258/-195 -260/-196 +f -259/-195 -257/-193 -256/-193 -258/-195 +f -257/-193 -255/-194 -254/-194 -256/-193 +f -255/-194 -253/-191 -252/-191 -254/-194 +f -253/-191 -251/-190 -250/-190 -252/-191 +f -251/-190 -249/-188 -248/-188 -250/-190 +f -249/-188 -247/-189 -246/-189 -248/-188 +f -247/-189 -245/-187 -244/-187 -246/-189 +f -245/-187 -243/-186 -242/-186 -244/-187 +f -243/-186 -241/-185 -240/-185 -242/-186 +f -241/-185 -239/-192 -238/-192 -240/-185 +f -239/-192 -237/-184 -236/-184 -238/-192 +f -237/-184 -235/-183 -234/-183 -236/-184 +f -235/-183 -233/-181 -232/-181 -234/-183 +f -233/-181 -231/-182 -230/-182 -232/-181 +f -231/-182 -229/-179 -228/-179 -230/-182 +f -229/-179 -227/-180 -226/-180 -228/-179 +f -227/-180 -275/-178 -272/-178 -226/-180 +f -272/-178 -273/-177 -225/-177 -224/-178 +f -273/-177 -270/-201 -223/-201 -225/-177 +f -270/-201 -268/-200 -222/-200 -223/-201 +f -268/-200 -266/-199 -221/-199 -222/-200 +f -266/-199 -264/-197 -220/-197 -221/-199 +f -264/-197 -262/-198 -219/-198 -220/-197 +f -262/-198 -260/-196 -218/-196 -219/-198 +f -260/-196 -258/-195 -217/-195 -218/-196 +f -258/-195 -256/-193 -216/-193 -217/-195 +f -256/-193 -254/-194 -215/-194 -216/-193 +f -254/-194 -252/-191 -214/-191 -215/-194 +f -252/-191 -250/-190 -213/-190 -214/-191 +f -250/-190 -248/-188 -212/-188 -213/-190 +f -248/-188 -246/-189 -211/-189 -212/-188 +f -246/-189 -244/-187 -210/-187 -211/-189 +f -244/-187 -242/-186 -209/-186 -210/-187 +f -242/-186 -240/-185 -208/-185 -209/-186 +f -240/-185 -238/-192 -207/-192 -208/-185 +f -238/-192 -236/-184 -206/-184 -207/-192 +f -236/-184 -234/-183 -205/-183 -206/-184 +f -234/-183 -232/-181 -204/-181 -205/-183 +f -232/-181 -230/-182 -203/-182 -204/-181 +f -230/-182 -228/-179 -202/-179 -203/-182 +f -228/-179 -226/-180 -201/-180 -202/-179 +f -226/-180 -272/-178 -224/-178 -201/-180 +f -224/-178 -225/-177 -200/-177 -199/-178 +f -225/-177 -223/-201 -198/-201 -200/-177 +f -223/-201 -222/-200 -197/-200 -198/-201 +f -222/-200 -221/-199 -196/-199 -197/-200 +f -221/-199 -220/-197 -195/-197 -196/-199 +f -220/-197 -219/-198 -194/-198 -195/-197 +f -219/-198 -218/-196 -193/-196 -194/-198 +f -218/-196 -217/-195 -192/-195 -193/-196 +f -217/-195 -216/-193 -191/-193 -192/-195 +f -216/-193 -215/-194 -190/-194 -191/-193 +f -215/-194 -214/-191 -189/-191 -190/-194 +f -214/-191 -213/-190 -188/-190 -189/-191 +f -213/-190 -212/-188 -187/-188 -188/-190 +f -212/-188 -211/-189 -186/-189 -187/-188 +f -211/-189 -210/-187 -185/-187 -186/-189 +f -210/-187 -209/-186 -184/-186 -185/-187 +f -209/-186 -208/-185 -183/-185 -184/-186 +f -208/-185 -207/-192 -182/-192 -183/-185 +f -207/-192 -206/-184 -181/-184 -182/-192 +f -206/-184 -205/-183 -180/-183 -181/-184 +f -205/-183 -204/-181 -179/-181 -180/-183 +f -204/-181 -203/-182 -178/-182 -179/-181 +f -203/-182 -202/-179 -177/-179 -178/-182 +f -202/-179 -201/-180 -176/-180 -177/-179 +f -201/-180 -224/-178 -199/-178 -176/-180 +f -199/-178 -200/-177 -276/-177 -277/-178 +f -200/-177 -198/-201 -300/-201 -276/-177 +f -198/-201 -197/-200 -299/-200 -300/-201 +f -197/-200 -196/-199 -298/-199 -299/-200 +f -196/-199 -195/-197 -296/-197 -298/-199 +f -195/-197 -194/-198 -297/-198 -296/-197 +f -194/-198 -193/-196 -295/-196 -297/-198 +f -193/-196 -192/-195 -294/-195 -295/-196 +f -192/-195 -191/-193 -292/-193 -294/-195 +f -191/-193 -190/-194 -293/-194 -292/-193 +f -190/-194 -189/-191 -290/-191 -293/-194 +f -189/-191 -188/-190 -289/-190 -290/-191 +f -188/-190 -187/-188 -287/-188 -289/-190 +f -187/-188 -186/-189 -288/-189 -287/-188 +f -186/-189 -185/-187 -286/-187 -288/-189 +f -185/-187 -184/-186 -285/-186 -286/-187 +f -184/-186 -183/-185 -284/-185 -285/-186 +f -183/-185 -182/-192 -291/-192 -284/-185 +f -182/-192 -181/-184 -283/-184 -291/-192 +f -181/-184 -180/-183 -282/-183 -283/-184 +f -180/-183 -179/-181 -280/-181 -282/-183 +f -179/-181 -178/-182 -281/-182 -280/-181 +f -178/-182 -177/-179 -278/-179 -281/-182 +f -177/-179 -176/-180 -279/-180 -278/-179 +f -176/-180 -199/-178 -277/-178 -279/-180 +f -175/-176 -274/-177 -275/-178 -174/-175 +f -173/-174 -271/-201 -274/-177 -175/-176 +f -172/-173 -269/-200 -271/-201 -173/-174 +f -171/-172 -267/-199 -269/-200 -172/-173 +f -170/-171 -265/-197 -267/-199 -171/-172 +f -169/-170 -263/-198 -265/-197 -170/-171 +f -168/-169 -261/-196 -263/-198 -169/-170 +f -167/-168 -259/-195 -261/-196 -168/-169 +f -166/-167 -257/-193 -259/-195 -167/-168 +f -165/-166 -255/-194 -257/-193 -166/-167 +f -164/-165 -253/-191 -255/-194 -165/-166 +f -163/-164 -251/-190 -253/-191 -164/-165 +f -162/-163 -249/-188 -251/-190 -163/-164 +f -161/-162 -247/-189 -249/-188 -162/-163 +f -160/-161 -245/-187 -247/-189 -161/-162 +f -159/-160 -243/-186 -245/-187 -160/-161 +f -158/-159 -241/-185 -243/-186 -159/-160 +f -157/-158 -239/-192 -241/-185 -158/-159 +f -156/-157 -237/-184 -239/-192 -157/-158 +f -155/-156 -235/-183 -237/-184 -156/-157 +f -154/-155 -233/-181 -235/-183 -155/-156 +f -153/-154 -231/-182 -233/-181 -154/-155 +f -152/-153 -229/-179 -231/-182 -153/-154 +f -151/-152 -227/-180 -229/-179 -152/-153 +f -174/-175 -275/-178 -227/-180 -151/-152 +f -150/-151 -175/-176 -174/-175 -149/-150 +f -148/-149 -150/-151 -149/-150 -147/-148 +f -146/-147 -148/-149 -147/-148 -145/-146 +f -144/-145 -146/-147 -145/-146 -143/-144 +f -142/-143 -144/-145 -143/-144 -141/-142 +f -397/-302 -142/-143 -141/-142 -400/-204 +f -140/-141 -173/-174 -175/-176 -150/-151 +f -139/-140 -140/-141 -150/-151 -148/-149 +f -138/-139 -139/-140 -148/-149 -146/-147 +f -137/-138 -138/-139 -146/-147 -144/-145 +f -136/-137 -137/-138 -144/-145 -142/-143 +f -391/-296 -136/-137 -142/-143 -397/-302 +f -135/-136 -172/-173 -173/-174 -140/-141 +f -134/-135 -135/-136 -140/-141 -139/-140 +f -133/-134 -134/-135 -139/-140 -138/-139 +f -132/-133 -133/-134 -138/-139 -137/-138 +f -131/-132 -132/-133 -137/-138 -136/-137 +f -387/-292 -131/-132 -136/-137 -391/-296 +f -130/-131 -171/-172 -172/-173 -135/-136 +f -129/-130 -130/-131 -135/-136 -134/-135 +f -128/-129 -129/-130 -134/-135 -133/-134 +f -127/-128 -128/-129 -133/-134 -132/-133 +f -126/-127 -127/-128 -132/-133 -131/-132 +f -383/-288 -126/-127 -131/-132 -387/-292 +f -125/-126 -170/-171 -171/-172 -130/-131 +f -124/-125 -125/-126 -130/-131 -129/-130 +f -123/-124 -124/-125 -129/-130 -128/-129 +f -122/-123 -123/-124 -128/-129 -127/-128 +f -121/-122 -122/-123 -127/-128 -126/-127 +f -379/-284 -121/-122 -126/-127 -383/-288 +f -120/-121 -169/-170 -170/-171 -125/-126 +f -119/-120 -120/-121 -125/-126 -124/-125 +f -118/-119 -119/-120 -124/-125 -123/-124 +f -117/-118 -118/-119 -123/-124 -122/-123 +f -116/-117 -117/-118 -122/-123 -121/-122 +f -375/-280 -116/-117 -121/-122 -379/-284 +f -115/-116 -168/-169 -169/-170 -120/-121 +f -114/-115 -115/-116 -120/-121 -119/-120 +f -113/-114 -114/-115 -119/-120 -118/-119 +f -112/-113 -113/-114 -118/-119 -117/-118 +f -111/-112 -112/-113 -117/-118 -116/-117 +f -371/-276 -111/-112 -116/-117 -375/-280 +f -110/-111 -167/-168 -168/-169 -115/-116 +f -109/-110 -110/-111 -115/-116 -114/-115 +f -108/-109 -109/-110 -114/-115 -113/-114 +f -107/-108 -108/-109 -113/-114 -112/-113 +f -106/-107 -107/-108 -112/-113 -111/-112 +f -367/-272 -106/-107 -111/-112 -371/-276 +f -105/-106 -166/-167 -167/-168 -110/-111 +f -104/-105 -105/-106 -110/-111 -109/-110 +f -103/-104 -104/-105 -109/-110 -108/-109 +f -102/-103 -103/-104 -108/-109 -107/-108 +f -101/-102 -102/-103 -107/-108 -106/-107 +f -363/-268 -101/-102 -106/-107 -367/-272 +f -100/-101 -165/-166 -166/-167 -105/-106 +f -99/-100 -100/-101 -105/-106 -104/-105 +f -98/-99 -99/-100 -104/-105 -103/-104 +f -97/-98 -98/-99 -103/-104 -102/-103 +f -96/-97 -97/-98 -102/-103 -101/-102 +f -359/-264 -96/-97 -101/-102 -363/-268 +f -95/-96 -164/-165 -165/-166 -100/-101 +f -94/-95 -95/-96 -100/-101 -99/-100 +f -93/-94 -94/-95 -99/-100 -98/-99 +f -92/-93 -93/-94 -98/-99 -97/-98 +f -91/-92 -92/-93 -97/-98 -96/-97 +f -355/-260 -91/-92 -96/-97 -359/-264 +f -90/-91 -163/-164 -164/-165 -95/-96 +f -89/-90 -90/-91 -95/-96 -94/-95 +f -88/-89 -89/-90 -94/-95 -93/-94 +f -87/-88 -88/-89 -93/-94 -92/-93 +f -86/-87 -87/-88 -92/-93 -91/-92 +f -351/-256 -86/-87 -91/-92 -355/-260 +f -85/-86 -162/-163 -163/-164 -90/-91 +f -84/-85 -85/-86 -90/-91 -89/-90 +f -83/-84 -84/-85 -89/-90 -88/-89 +f -82/-83 -83/-84 -88/-89 -87/-88 +f -81/-82 -82/-83 -87/-88 -86/-87 +f -347/-252 -81/-82 -86/-87 -351/-256 +f -80/-81 -161/-162 -162/-163 -85/-86 +f -79/-80 -80/-81 -85/-86 -84/-85 +f -78/-79 -79/-80 -84/-85 -83/-84 +f -77/-78 -78/-79 -83/-84 -82/-83 +f -76/-77 -77/-78 -82/-83 -81/-82 +f -343/-248 -76/-77 -81/-82 -347/-252 +f -75/-76 -160/-161 -161/-162 -80/-81 +f -74/-75 -75/-76 -80/-81 -79/-80 +f -73/-74 -74/-75 -79/-80 -78/-79 +f -72/-73 -73/-74 -78/-79 -77/-78 +f -71/-72 -72/-73 -77/-78 -76/-77 +f -339/-244 -71/-72 -76/-77 -343/-248 +f -70/-71 -159/-160 -160/-161 -75/-76 +f -69/-70 -70/-71 -75/-76 -74/-75 +f -68/-69 -69/-70 -74/-75 -73/-74 +f -67/-68 -68/-69 -73/-74 -72/-73 +f -66/-67 -67/-68 -72/-73 -71/-72 +f -335/-240 -66/-67 -71/-72 -339/-244 +f -65/-66 -158/-159 -159/-160 -70/-71 +f -64/-65 -65/-66 -70/-71 -69/-70 +f -63/-64 -64/-65 -69/-70 -68/-69 +f -62/-63 -63/-64 -68/-69 -67/-68 +f -61/-62 -62/-63 -67/-68 -66/-67 +f -331/-236 -61/-62 -66/-67 -335/-240 +f -60/-61 -157/-158 -158/-159 -65/-66 +f -59/-60 -60/-61 -65/-66 -64/-65 +f -58/-59 -59/-60 -64/-65 -63/-64 +f -57/-58 -58/-59 -63/-64 -62/-63 +f -56/-57 -57/-58 -62/-63 -61/-62 +f -327/-232 -56/-57 -61/-62 -331/-236 +f -55/-56 -156/-157 -157/-158 -60/-61 +f -54/-55 -55/-56 -60/-61 -59/-60 +f -53/-54 -54/-55 -59/-60 -58/-59 +f -52/-53 -53/-54 -58/-59 -57/-58 +f -51/-52 -52/-53 -57/-58 -56/-57 +f -323/-228 -51/-52 -56/-57 -327/-232 +f -50/-51 -155/-156 -156/-157 -55/-56 +f -49/-50 -50/-51 -55/-56 -54/-55 +f -48/-49 -49/-50 -54/-55 -53/-54 +f -47/-48 -48/-49 -53/-54 -52/-53 +f -46/-47 -47/-48 -52/-53 -51/-52 +f -319/-224 -46/-47 -51/-52 -323/-228 +f -45/-46 -154/-155 -155/-156 -50/-51 +f -44/-45 -45/-46 -50/-51 -49/-50 +f -43/-44 -44/-45 -49/-50 -48/-49 +f -42/-43 -43/-44 -48/-49 -47/-48 +f -41/-42 -42/-43 -47/-48 -46/-47 +f -315/-220 -41/-42 -46/-47 -319/-224 +f -40/-41 -153/-154 -154/-155 -45/-46 +f -39/-40 -40/-41 -45/-46 -44/-45 +f -38/-39 -39/-40 -44/-45 -43/-44 +f -37/-38 -38/-39 -43/-44 -42/-43 +f -36/-37 -37/-38 -42/-43 -41/-42 +f -311/-216 -36/-37 -41/-42 -315/-220 +f -35/-36 -152/-153 -153/-154 -40/-41 +f -34/-35 -35/-36 -40/-41 -39/-40 +f -33/-34 -34/-35 -39/-40 -38/-39 +f -32/-33 -33/-34 -38/-39 -37/-38 +f -31/-32 -32/-33 -37/-38 -36/-37 +f -307/-212 -31/-32 -36/-37 -311/-216 +f -30/-31 -151/-152 -152/-153 -35/-36 +f -29/-30 -30/-31 -35/-36 -34/-35 +f -28/-29 -29/-30 -34/-35 -33/-34 +f -27/-28 -28/-29 -33/-34 -32/-33 +f -26/-27 -27/-28 -32/-33 -31/-32 +f -303/-208 -26/-27 -31/-32 -307/-212 +f -149/-150 -174/-175 -151/-152 -30/-31 +f -147/-148 -149/-150 -30/-31 -29/-30 +f -145/-146 -147/-148 -29/-30 -28/-29 +f -143/-144 -145/-146 -28/-29 -27/-28 +f -141/-142 -143/-144 -27/-28 -26/-27 +f -400/-204 -141/-142 -26/-27 -303/-208 +f -25/-26 -398/-303 -399/-304 -24/-25 +f -23/-24 -392/-297 -398/-303 -25/-26 +f -22/-23 -388/-293 -392/-297 -23/-24 +f -21/-22 -384/-289 -388/-293 -22/-23 +f -20/-21 -380/-285 -384/-289 -21/-22 +f -19/-20 -376/-281 -380/-285 -20/-21 +f -18/-19 -372/-277 -376/-281 -19/-20 +f -17/-18 -368/-273 -372/-277 -18/-19 +f -16/-17 -364/-269 -368/-273 -17/-18 +f -15/-16 -360/-265 -364/-269 -16/-17 +f -14/-15 -356/-261 -360/-265 -15/-16 +f -13/-14 -352/-257 -356/-261 -14/-15 +f -12/-13 -348/-253 -352/-257 -13/-14 +f -11/-12 -344/-249 -348/-253 -12/-13 +f -10/-11 -340/-245 -344/-249 -11/-12 +f -9/-10 -336/-241 -340/-245 -10/-11 +f -8/-9 -332/-237 -336/-241 -9/-10 +f -7/-8 -328/-233 -332/-237 -8/-9 +f -6/-7 -324/-229 -328/-233 -7/-8 +f -5/-6 -320/-225 -324/-229 -6/-7 +f -4/-5 -316/-221 -320/-225 -5/-6 +f -3/-4 -312/-217 -316/-221 -4/-5 +f -2/-3 -308/-213 -312/-217 -3/-4 +f -1/-2 -304/-209 -308/-213 -2/-3 +f -24/-1 -399/-205 -304/-209 -1/-2 +f -393/-298 -25/-26 -24/-25 -396/-301 +f -389/-294 -23/-24 -25/-26 -393/-298 +f -385/-290 -22/-23 -23/-24 -389/-294 +f -381/-286 -21/-22 -22/-23 -385/-290 +f -377/-282 -20/-21 -21/-22 -381/-286 +f -373/-278 -19/-20 -20/-21 -377/-282 +f -369/-274 -18/-19 -19/-20 -373/-278 +f -365/-270 -17/-18 -18/-19 -369/-274 +f -361/-266 -16/-17 -17/-18 -365/-270 +f -357/-262 -15/-16 -16/-17 -361/-266 +f -353/-258 -14/-15 -15/-16 -357/-262 +f -349/-254 -13/-14 -14/-15 -353/-258 +f -345/-250 -12/-13 -13/-14 -349/-254 +f -341/-246 -11/-12 -12/-13 -345/-250 +f -337/-242 -10/-11 -11/-12 -341/-246 +f -333/-238 -9/-10 -10/-11 -337/-242 +f -329/-234 -8/-9 -9/-10 -333/-238 +f -325/-230 -7/-8 -8/-9 -329/-234 +f -321/-226 -6/-7 -7/-8 -325/-230 +f -317/-222 -5/-6 -6/-7 -321/-226 +f -313/-218 -4/-5 -5/-6 -317/-222 +f -309/-214 -3/-4 -4/-5 -313/-218 +f -305/-210 -2/-3 -3/-4 -309/-214 +f -301/-206 -1/-2 -2/-3 -305/-210 +f -396/-202 -24/-1 -1/-2 -301/-206 +# 383 polygons - 7 triangles + +# +# object Cylinder001 +# + +v 0.000000 0.198986 0.001186 +v 9.744550 0.198986 -5.715180 +v 10.770667 0.198986 -2.949705 +v 11.120023 0.198986 0.001186 +v 5.958405 0.198986 -10.017393 +v 8.106147 0.198986 -8.121476 +v 0.698232 0.198986 -11.841144 +v 3.436276 0.198986 -11.283808 +v -4.734676 0.198986 -10.735260 +v -2.083684 0.198986 -11.654383 +v -8.996289 0.198986 -6.973320 +v -7.088171 0.198986 -9.141526 +v -11.032339 0.198986 -1.485980 +v -10.339137 0.198986 -4.366880 +v -10.339133 0.198986 4.369266 +v -11.032337 0.198986 1.488365 +v -7.088163 0.198986 9.143903 +v -8.996283 0.198986 6.975702 +v -2.083675 0.198986 11.656755 +v -4.734667 0.198986 10.737636 +v 3.436288 0.198986 11.286174 +v 0.698243 0.198986 11.843514 +v 8.106157 0.198986 8.123835 +v 5.958417 0.198986 10.019756 +v 10.770671 0.198986 2.952059 +v 9.744558 0.198986 5.717537 +v 10.770667 32.795975 -2.949705 +v 11.120023 32.795975 0.001186 +v 9.744550 32.795975 -5.715180 +v 8.106147 32.795975 -8.121476 +v 5.958405 32.795975 -10.017393 +v 3.436276 32.795975 -11.283808 +v 0.698232 32.795975 -11.841144 +v -2.083684 32.795975 -11.654383 +v -4.734676 32.795975 -10.735260 +v -7.088171 32.795975 -9.141526 +v -8.996289 32.795975 -6.973320 +v -10.339137 32.795975 -4.366880 +v -11.032339 32.795975 -1.485980 +v -11.032337 32.795975 1.488365 +v -10.339133 32.795975 4.369266 +v -8.996283 32.795975 6.975702 +v -7.088163 32.795975 9.143903 +v -4.734667 32.795975 10.737636 +v -2.083675 32.795975 11.656755 +v 0.698243 32.795975 11.843514 +v 3.436288 32.795975 11.286174 +v 5.958417 32.795975 10.019756 +v 8.106157 32.795975 8.123835 +v 9.744558 32.795975 5.717537 +v 10.770671 32.795975 2.952059 +v 0.000000 32.795975 0.001186 +# 52 vertices + +vt 0.500000 0.000000 0.000000 +vt 0.830000 0.000000 1.000000 +vt 0.790000 0.000000 1.000000 +vt 0.750000 0.000000 1.000000 +vt 0.910000 0.000000 1.000000 +vt 0.870000 0.000000 1.000000 +vt 0.990000 0.000000 1.000000 +vt 0.950000 0.000000 1.000000 +vt 0.070000 0.000000 1.000000 +vt 0.030000 0.000000 1.000000 +vt -0.010000 0.000000 1.000000 +vt 0.150000 0.000000 1.000000 +vt 0.110000 0.000000 1.000000 +vt 0.230000 0.000000 1.000000 +vt 0.190000 0.000000 1.000000 +vt 0.310000 0.000000 1.000000 +vt 0.270000 0.000000 1.000000 +vt 0.390000 0.000000 1.000000 +vt 0.350000 0.000000 1.000000 +vt 0.470000 0.000000 1.000000 +vt 0.430000 0.000000 1.000000 +vt 0.550000 0.000000 1.000000 +vt 0.510000 0.000000 1.000000 +vt 0.630000 0.000000 1.000000 +vt 0.590000 0.000000 1.000000 +vt 0.710000 0.000000 1.000000 +vt 0.670000 0.000000 1.000000 +vt 0.790000 1.000000 1.000000 +vt 0.750000 1.000000 1.000000 +vt 0.830000 1.000000 1.000000 +vt 0.870000 1.000000 1.000000 +vt 0.910000 1.000000 1.000000 +vt 0.950000 1.000000 1.000000 +vt 0.990000 1.000000 1.000000 +vt 0.030000 1.000000 1.000000 +vt -0.010000 1.000000 1.000000 +vt 0.070000 1.000000 1.000000 +vt 0.110000 1.000000 1.000000 +vt 0.150000 1.000000 1.000000 +vt 0.190000 1.000000 1.000000 +vt 0.230000 1.000000 1.000000 +vt 0.270000 1.000000 1.000000 +vt 0.310000 1.000000 1.000000 +vt 0.350000 1.000000 1.000000 +vt 0.390000 1.000000 1.000000 +vt 0.430000 1.000000 1.000000 +vt 0.470000 1.000000 1.000000 +vt 0.510000 1.000000 1.000000 +vt 0.550000 1.000000 1.000000 +vt 0.590000 1.000000 1.000000 +vt 0.630000 1.000000 1.000000 +vt 0.670000 1.000000 1.000000 +vt 0.710000 1.000000 1.000000 +vt 0.500000 1.000000 0.000000 +vt 0.999212 1.000000 0.937166 +# 55 texture coords + +g Cylinder001 +usemtl wire_255255255 +f -52/-55 -51/-54 -50/-53 -49/-52 +f -52/-55 -48/-51 -47/-50 -51/-54 +f -52/-55 -46/-49 -45/-48 -48/-51 +f -52/-55 -44/-47 -43/-46 -46/-45 +f -52/-55 -42/-44 -41/-43 -44/-47 +f -52/-55 -40/-42 -39/-41 -42/-44 +f -52/-55 -38/-40 -37/-39 -40/-42 +f -52/-55 -36/-38 -35/-37 -38/-40 +f -52/-55 -34/-36 -33/-35 -36/-38 +f -52/-55 -32/-34 -31/-33 -34/-36 +f -52/-55 -30/-32 -29/-31 -32/-34 +f -52/-55 -28/-30 -27/-29 -30/-32 +f -52/-55 -49/-52 -28/-30 +f -49/-52 -50/-53 -26/-28 -25/-27 +f -50/-53 -51/-54 -24/-26 -26/-28 +f -51/-54 -47/-50 -23/-25 -24/-26 +f -47/-50 -48/-51 -22/-24 -23/-25 +f -48/-51 -45/-48 -21/-23 -22/-24 +f -45/-48 -46/-49 -20/-22 -21/-23 +f -46/-45 -43/-46 -19/-21 -20/-20 +f -43/-46 -44/-47 -18/-19 -19/-21 +f -44/-47 -41/-43 -17/-18 -18/-19 +f -41/-43 -42/-44 -16/-17 -17/-18 +f -42/-44 -39/-41 -15/-16 -16/-17 +f -39/-41 -40/-42 -14/-15 -15/-16 +f -40/-42 -37/-39 -13/-14 -14/-15 +f -37/-39 -38/-40 -12/-13 -13/-14 +f -38/-40 -35/-37 -11/-12 -12/-13 +f -35/-37 -36/-38 -10/-11 -11/-12 +f -36/-38 -33/-35 -9/-10 -10/-11 +f -33/-35 -34/-36 -8/-9 -9/-10 +f -34/-36 -31/-33 -7/-8 -8/-9 +f -31/-33 -32/-34 -6/-7 -7/-8 +f -32/-34 -29/-31 -5/-6 -6/-7 +f -29/-31 -30/-32 -4/-5 -5/-6 +f -30/-32 -27/-29 -3/-4 -4/-5 +f -27/-29 -28/-30 -2/-3 -3/-4 +f -28/-30 -49/-52 -25/-27 -2/-3 +f -1/-2 -2/-3 -25/-27 -26/-28 +f -1/-2 -26/-28 -24/-26 -23/-25 +f -1/-2 -23/-25 -22/-24 -21/-23 +f -1/-2 -21/-23 -20/-22 -19/-1 +f -1/-2 -19/-21 -18/-19 -17/-18 +f -1/-2 -17/-18 -16/-17 -15/-16 +f -1/-2 -15/-16 -14/-15 -13/-14 +f -1/-2 -13/-14 -12/-13 -11/-12 +f -1/-2 -11/-12 -10/-11 -9/-10 +f -1/-2 -9/-10 -8/-9 -7/-8 +f -1/-2 -7/-8 -6/-7 -5/-6 +f -1/-2 -5/-6 -4/-5 -3/-4 +f -1/-2 -3/-4 -2/-3 +# 49 polygons - 2 triangles + +# +# object Capsule001 +# + +v 17.982702 5.675364 0.001190 +v 18.763035 5.848358 0.001190 +v 18.657272 5.839106 0.397410 +v 18.368322 5.813826 0.687463 +v 17.973610 5.779293 0.793630 +v 17.578897 5.744761 0.687463 +v 17.289948 5.719481 0.397410 +v 17.184185 5.710228 0.001190 +v 17.289948 5.719481 -0.395030 +v 17.578897 5.744761 -0.685084 +v 17.973610 5.779293 -0.791251 +v 18.368322 5.813826 -0.685084 +v 18.657272 5.839106 -0.395031 +v 19.472004 6.217424 0.001190 +v 19.267685 6.199549 0.766628 +v 18.709476 6.150713 1.326968 +v 17.946951 6.084000 1.532067 +v 17.184425 6.017288 1.326968 +v 16.626219 5.968451 0.766628 +v 16.421900 5.950575 0.001190 +v 16.626217 5.968451 -0.764249 +v 17.184425 6.017286 -1.324589 +v 17.946951 6.084000 -1.529687 +v 18.709476 6.150711 -1.324589 +v 19.267685 6.199549 -0.764250 +v 20.061293 6.757408 0.001190 +v 19.772343 6.732130 1.083683 +v 18.982918 6.663063 1.876124 +v 17.904545 6.568718 2.166177 +v 16.826170 6.474373 1.876123 +v 16.036745 6.405308 1.083683 +v 15.747795 6.380028 0.001190 +v 16.036745 6.405306 -1.081303 +v 16.826168 6.474373 -1.873744 +v 17.904543 6.568718 -2.163798 +v 18.982918 6.663063 -1.873745 +v 19.772343 6.732128 -1.081305 +v 20.490746 7.431513 0.001189 +v 20.136856 7.400553 1.326968 +v 19.170012 7.315964 2.297505 +v 17.849277 7.200415 2.652747 +v 16.528543 7.084866 2.297505 +v 15.561700 7.000278 1.326968 +v 15.207810 6.969316 0.001190 +v 15.561700 7.000277 -1.324589 +v 16.528543 7.084866 -2.295126 +v 17.849277 7.200415 -2.650368 +v 19.170010 7.315964 -2.295127 +v 20.136854 7.400551 -1.324591 +v 20.731092 8.193800 0.001189 +v 20.336380 8.159267 1.479903 +v 19.258005 8.064922 2.562397 +v 17.784918 7.936043 2.958617 +v 16.311832 7.807165 2.562397 +v 15.233458 7.712818 1.479903 +v 14.838745 7.678286 0.001190 +v 15.233458 7.712818 -1.477524 +v 16.311831 7.807163 -2.560017 +v 17.784918 7.936043 -2.956238 +v 19.258003 8.064920 -2.560019 +v 20.336380 8.159266 -1.477526 +v 20.765957 8.992317 0.001189 +v 20.357319 8.956566 1.532066 +v 19.240906 8.858892 2.652746 +v 17.715853 8.725468 3.062943 +v 16.190802 8.592043 2.652746 +v 15.074386 8.494370 1.532067 +v 14.665750 8.458618 0.001190 +v 15.074386 8.494370 -1.529687 +v 16.190800 8.592043 -2.650367 +v 17.715851 8.725468 -3.060565 +v 19.240904 8.858892 -2.650369 +v 20.357319 8.956566 -1.529690 +v 19.609610 22.209431 0.001187 +v 19.200974 22.173679 1.532064 +v 18.084557 22.076008 2.652745 +v 16.559505 21.942581 3.062942 +v 15.034453 21.809158 2.652744 +v 13.918038 21.711483 1.532065 +v 13.509401 21.675732 0.001188 +v 13.918037 21.711483 -1.529689 +v 15.034452 21.809156 -2.650369 +v 16.559504 21.942581 -3.060567 +v 18.084557 22.076006 -2.650371 +v 19.200972 22.173679 -1.529692 +v 19.436613 22.989763 0.001187 +v 19.041901 22.955231 1.479901 +v 17.963526 22.860886 2.562395 +v 16.490440 22.732008 2.958615 +v 15.017353 22.603128 2.562394 +v 13.938978 22.508783 1.479901 +v 13.544266 22.474251 0.001188 +v 13.938978 22.508783 -1.477526 +v 15.017352 22.603128 -2.560020 +v 16.490438 22.732006 -2.956240 +v 17.963526 22.860886 -2.560021 +v 19.041901 22.955231 -1.477528 +v 19.067549 23.698732 0.001187 +v 18.713657 23.667770 1.326966 +v 17.746815 23.583183 2.297503 +v 16.426081 23.467634 2.652744 +v 15.105347 23.352085 2.297503 +v 14.138503 23.267498 1.326966 +v 13.784614 23.236536 0.001187 +v 14.138502 23.267496 -1.324591 +v 15.105347 23.352085 -2.295128 +v 16.426079 23.467634 -2.650370 +v 17.746813 23.583183 -2.295130 +v 18.713657 23.667770 -1.324593 +v 18.527563 24.288023 0.001187 +v 18.238613 24.262743 1.083681 +v 17.449188 24.193678 1.876121 +v 16.370813 24.099331 2.166174 +v 15.292439 24.004986 1.876121 +v 14.503016 23.935921 1.083681 +v 14.214066 23.910641 0.001187 +v 14.503015 23.935921 -1.081306 +v 15.292439 24.004986 -1.873747 +v 16.370813 24.099331 -2.163800 +v 17.449188 24.193676 -1.873748 +v 18.238613 24.262743 -1.081308 +v 17.853458 24.717474 0.001187 +v 17.649141 24.699598 0.766625 +v 17.090933 24.650763 1.326966 +v 16.328407 24.584049 1.532064 +v 15.565881 24.517338 1.326965 +v 15.007673 24.468500 0.766625 +v 14.803355 24.450624 0.001187 +v 15.007673 24.468500 -0.764251 +v 15.565881 24.517338 -1.324591 +v 16.328405 24.584049 -1.529690 +v 17.090933 24.650763 -1.324592 +v 17.649139 24.699598 -0.764253 +v 17.091173 24.957821 0.001187 +v 16.985411 24.948568 0.397407 +v 16.696461 24.923288 0.687460 +v 16.301748 24.888756 0.793627 +v 15.907036 24.854223 0.687460 +v 15.618087 24.828943 0.397407 +v 15.512323 24.819691 0.001187 +v 15.618087 24.828943 -0.395033 +v 15.907036 24.854223 -0.685086 +v 16.301748 24.888756 -0.791254 +v 16.696461 24.923288 -0.685087 +v 16.985411 24.948568 -0.395034 +v 16.292656 24.992685 0.001187 +# 146 vertices + +vt 0.500000 0.500000 0.000000 +vt 0.629410 0.500000 0.000000 +vt 0.612072 0.564705 0.000000 +vt 0.564705 0.612072 0.000000 +vt 0.500000 0.629410 0.000000 +vt 0.435295 0.612072 0.000000 +vt 0.387928 0.564705 0.000000 +vt 0.370590 0.500000 0.000000 +vt 0.387928 0.435295 0.000000 +vt 0.435295 0.387928 0.000000 +vt 0.500000 0.370590 0.000000 +vt 0.564705 0.387928 0.000000 +vt 0.612072 0.435295 0.000000 +vt 0.750000 0.500000 0.000000 +vt 0.716506 0.625000 0.000000 +vt 0.625000 0.716506 0.000000 +vt 0.500000 0.750000 0.000000 +vt 0.375000 0.716506 0.000000 +vt 0.283494 0.625000 0.000000 +vt 0.250000 0.500000 0.000000 +vt 0.283494 0.375000 0.000000 +vt 0.375000 0.283494 0.000000 +vt 0.500000 0.250000 0.000000 +vt 0.625000 0.283494 0.000000 +vt 0.716506 0.375000 0.000000 +vt 0.853553 0.500000 0.000000 +vt 0.806186 0.676777 0.000000 +vt 0.676777 0.806186 0.000000 +vt 0.500000 0.853553 0.000000 +vt 0.323223 0.806186 0.000000 +vt 0.193814 0.676777 0.000000 +vt 0.146447 0.500000 0.000000 +vt 0.193814 0.323223 0.000000 +vt 0.323223 0.193814 0.000000 +vt 0.500000 0.146447 0.000000 +vt 0.676777 0.193814 0.000000 +vt 0.806186 0.323223 0.000000 +vt 0.933013 0.500000 0.000000 +vt 0.875000 0.716506 0.000000 +vt 0.716506 0.875000 0.000000 +vt 0.500000 0.933013 0.000000 +vt 0.283494 0.875000 0.000000 +vt 0.125000 0.716506 0.000000 +vt 0.066987 0.500000 0.000000 +vt 0.125000 0.283494 0.000000 +vt 0.283494 0.125000 0.000000 +vt 0.500000 0.066987 0.000000 +vt 0.716506 0.125000 0.000000 +vt 0.875000 0.283493 0.000000 +vt 0.982963 0.500000 0.000000 +vt 0.918258 0.741481 0.000000 +vt 0.741481 0.918258 0.000000 +vt 0.500000 0.982963 0.000000 +vt 0.258519 0.918258 0.000000 +vt 0.081742 0.741481 0.000000 +vt 0.017037 0.500000 0.000000 +vt 0.081742 0.258519 0.000000 +vt 0.258518 0.081742 0.000000 +vt 0.500000 0.017037 0.000000 +vt 0.741481 0.081742 0.000000 +vt 0.918258 0.258518 0.000000 +vt 1.000000 0.500000 0.000000 +vt 0.933013 0.750000 0.000000 +vt 0.750000 0.933013 0.000000 +vt 0.500000 1.000000 0.000000 +vt 0.250000 0.933013 0.000000 +vt 0.066987 0.750000 0.000000 +vt 0.000000 0.500000 0.000000 +vt 0.066987 0.250000 0.000000 +vt 0.250000 0.066987 0.000000 +vt 0.500000 0.000000 0.000000 +vt 0.750000 0.066987 0.000000 +vt 0.933013 0.250000 0.000000 +vt 0.000000 1.000000 0.000000 +vt 0.000000 0.000000 0.000000 +vt 0.083333 0.000000 0.000000 +vt 0.083333 1.000000 0.000000 +vt 0.166667 0.000000 0.000000 +vt 0.166667 1.000000 0.000000 +vt 0.250000 0.000000 0.000000 +vt 0.250000 1.000000 0.000000 +vt 0.333333 0.000000 0.000000 +vt 0.333333 1.000000 0.000000 +vt 0.416667 0.000000 0.000000 +vt 0.416667 1.000000 0.000000 +vt 0.583333 0.000000 0.000000 +vt 0.583333 1.000000 0.000000 +vt 0.666667 0.000000 0.000000 +vt 0.666667 1.000000 0.000000 +vt 0.750000 0.000000 0.000000 +vt 0.750000 1.000000 0.000000 +vt 0.833333 0.000000 0.000000 +vt 0.833333 1.000000 0.000000 +vt 0.916667 0.000000 0.000000 +vt 0.916667 1.000000 0.000000 +vt 1.000000 0.000000 0.000000 +vt 1.000000 1.000000 0.000000 +# 97 texture coords + +g Capsule001 +usemtl wire_061135006 +f -146/-97 -145/-96 -144/-95 +f -146/-97 -144/-95 -143/-94 +f -146/-97 -143/-94 -142/-93 +f -146/-97 -142/-93 -141/-92 +f -146/-97 -141/-92 -140/-91 +f -146/-97 -140/-91 -139/-90 +f -146/-97 -139/-90 -138/-89 +f -146/-97 -138/-89 -137/-88 +f -146/-97 -137/-88 -136/-87 +f -146/-97 -136/-87 -135/-86 +f -146/-97 -135/-86 -134/-85 +f -146/-97 -134/-85 -145/-96 +f -145/-96 -133/-84 -132/-83 -144/-95 +f -144/-95 -132/-83 -131/-82 -143/-94 +f -143/-94 -131/-82 -130/-81 -142/-93 +f -142/-93 -130/-81 -129/-80 -141/-92 +f -141/-92 -129/-80 -128/-79 -140/-91 +f -140/-91 -128/-79 -127/-78 -139/-90 +f -139/-90 -127/-78 -126/-77 -138/-89 +f -138/-89 -126/-77 -125/-76 -137/-88 +f -137/-88 -125/-76 -124/-75 -136/-87 +f -136/-87 -124/-75 -123/-74 -135/-86 +f -135/-86 -123/-74 -122/-73 -134/-85 +f -134/-85 -122/-73 -133/-84 -145/-96 +f -133/-84 -121/-72 -120/-71 -132/-83 +f -132/-83 -120/-71 -119/-70 -131/-82 +f -131/-82 -119/-70 -118/-69 -130/-81 +f -130/-81 -118/-69 -117/-68 -129/-80 +f -129/-80 -117/-68 -116/-67 -128/-79 +f -128/-79 -116/-67 -115/-66 -127/-78 +f -127/-78 -115/-66 -114/-65 -126/-77 +f -126/-77 -114/-65 -113/-64 -125/-76 +f -125/-76 -113/-64 -112/-63 -124/-75 +f -124/-75 -112/-63 -111/-62 -123/-74 +f -123/-74 -111/-62 -110/-61 -122/-73 +f -122/-73 -110/-61 -121/-72 -133/-84 +f -121/-72 -109/-60 -108/-59 -120/-71 +f -120/-71 -108/-59 -107/-58 -119/-70 +f -119/-70 -107/-58 -106/-57 -118/-69 +f -118/-69 -106/-57 -105/-56 -117/-68 +f -117/-68 -105/-56 -104/-55 -116/-67 +f -116/-67 -104/-55 -103/-54 -115/-66 +f -115/-66 -103/-54 -102/-53 -114/-65 +f -114/-65 -102/-53 -101/-52 -113/-64 +f -113/-64 -101/-52 -100/-51 -112/-63 +f -112/-63 -100/-51 -99/-50 -111/-62 +f -111/-62 -99/-50 -98/-49 -110/-61 +f -110/-61 -98/-49 -109/-60 -121/-72 +f -109/-60 -97/-48 -96/-47 -108/-59 +f -108/-59 -96/-47 -95/-46 -107/-58 +f -107/-58 -95/-46 -94/-45 -106/-57 +f -106/-57 -94/-45 -93/-44 -105/-56 +f -105/-56 -93/-44 -92/-43 -104/-55 +f -104/-55 -92/-43 -91/-42 -103/-54 +f -103/-54 -91/-42 -90/-41 -102/-53 +f -102/-53 -90/-41 -89/-40 -101/-52 +f -101/-52 -89/-40 -88/-39 -100/-51 +f -100/-51 -88/-39 -87/-38 -99/-50 +f -99/-50 -87/-38 -86/-37 -98/-49 +f -98/-49 -86/-37 -97/-48 -109/-60 +f -97/-48 -85/-36 -84/-35 -96/-47 +f -96/-47 -84/-35 -83/-34 -95/-46 +f -95/-46 -83/-34 -82/-33 -94/-45 +f -94/-45 -82/-33 -81/-32 -93/-44 +f -93/-44 -81/-32 -80/-31 -92/-43 +f -92/-43 -80/-31 -79/-30 -91/-42 +f -91/-42 -79/-30 -78/-29 -90/-41 +f -90/-41 -78/-29 -77/-28 -89/-40 +f -89/-40 -77/-28 -76/-27 -88/-39 +f -88/-39 -76/-27 -75/-26 -87/-38 +f -87/-38 -75/-26 -74/-25 -86/-37 +f -86/-37 -74/-25 -85/-36 -97/-48 +f -85/-24 -73/-23 -72/-22 -84/-21 +f -84/-21 -72/-22 -71/-20 -83/-19 +f -83/-19 -71/-20 -70/-18 -82/-17 +f -82/-17 -70/-18 -69/-16 -81/-15 +f -81/-15 -69/-16 -68/-14 -80/-13 +f -80/-13 -68/-14 -67/-27 -79/-33 +f -79/-33 -67/-27 -66/-12 -78/-11 +f -78/-11 -66/-12 -65/-10 -77/-9 +f -77/-9 -65/-10 -64/-8 -76/-7 +f -76/-7 -64/-8 -63/-6 -75/-5 +f -75/-5 -63/-6 -62/-4 -74/-3 +f -74/-3 -62/-4 -73/-2 -85/-1 +f -73/-36 -61/-48 -60/-47 -72/-35 +f -72/-35 -60/-47 -59/-46 -71/-34 +f -71/-34 -59/-46 -58/-45 -70/-33 +f -70/-33 -58/-45 -57/-44 -69/-32 +f -69/-32 -57/-44 -56/-43 -68/-31 +f -68/-31 -56/-43 -55/-42 -67/-30 +f -67/-30 -55/-42 -54/-41 -66/-29 +f -66/-29 -54/-41 -53/-40 -65/-28 +f -65/-28 -53/-40 -52/-39 -64/-27 +f -64/-27 -52/-39 -51/-38 -63/-26 +f -63/-26 -51/-38 -50/-37 -62/-25 +f -62/-25 -50/-37 -61/-48 -73/-36 +f -61/-48 -49/-60 -48/-59 -60/-47 +f -60/-47 -48/-59 -47/-58 -59/-46 +f -59/-46 -47/-58 -46/-57 -58/-45 +f -58/-45 -46/-57 -45/-56 -57/-44 +f -57/-44 -45/-56 -44/-55 -56/-43 +f -56/-43 -44/-55 -43/-54 -55/-42 +f -55/-42 -43/-54 -42/-53 -54/-41 +f -54/-41 -42/-53 -41/-52 -53/-40 +f -53/-40 -41/-52 -40/-51 -52/-39 +f -52/-39 -40/-51 -39/-50 -51/-38 +f -51/-38 -39/-50 -38/-49 -50/-37 +f -50/-37 -38/-49 -49/-60 -61/-48 +f -49/-60 -37/-72 -36/-71 -48/-59 +f -48/-59 -36/-71 -35/-70 -47/-58 +f -47/-58 -35/-70 -34/-69 -46/-57 +f -46/-57 -34/-69 -33/-68 -45/-56 +f -45/-56 -33/-68 -32/-67 -44/-55 +f -44/-55 -32/-67 -31/-66 -43/-54 +f -43/-54 -31/-66 -30/-65 -42/-53 +f -42/-53 -30/-65 -29/-64 -41/-52 +f -41/-52 -29/-64 -28/-63 -40/-51 +f -40/-51 -28/-63 -27/-62 -39/-50 +f -39/-50 -27/-62 -26/-61 -38/-49 +f -38/-49 -26/-61 -37/-72 -49/-60 +f -37/-72 -25/-84 -24/-83 -36/-71 +f -36/-71 -24/-83 -23/-82 -35/-70 +f -35/-70 -23/-82 -22/-81 -34/-69 +f -34/-69 -22/-81 -21/-80 -33/-68 +f -33/-68 -21/-80 -20/-79 -32/-67 +f -32/-67 -20/-79 -19/-78 -31/-66 +f -31/-66 -19/-78 -18/-77 -30/-65 +f -30/-65 -18/-77 -17/-76 -29/-64 +f -29/-64 -17/-76 -16/-75 -28/-63 +f -28/-63 -16/-75 -15/-74 -27/-62 +f -27/-62 -15/-74 -14/-73 -26/-61 +f -26/-61 -14/-73 -25/-84 -37/-72 +f -25/-84 -13/-96 -12/-95 -24/-83 +f -24/-83 -12/-95 -11/-94 -23/-82 +f -23/-82 -11/-94 -10/-93 -22/-81 +f -22/-81 -10/-93 -9/-92 -21/-80 +f -21/-80 -9/-92 -8/-91 -20/-79 +f -20/-79 -8/-91 -7/-90 -19/-78 +f -19/-78 -7/-90 -6/-89 -18/-77 +f -18/-77 -6/-89 -5/-88 -17/-76 +f -17/-76 -5/-88 -4/-87 -16/-75 +f -16/-75 -4/-87 -3/-86 -15/-74 +f -15/-74 -3/-86 -2/-85 -14/-73 +f -14/-73 -2/-85 -13/-96 -25/-84 +f -13/-96 -1/-97 -12/-95 +f -12/-95 -1/-97 -11/-94 +f -11/-94 -1/-97 -10/-93 +f -10/-93 -1/-97 -9/-92 +f -9/-92 -1/-97 -8/-91 +f -8/-91 -1/-97 -7/-90 +f -7/-90 -1/-97 -6/-89 +f -6/-89 -1/-97 -5/-88 +f -5/-88 -1/-97 -4/-87 +f -4/-87 -1/-97 -3/-86 +f -3/-86 -1/-97 -2/-85 +f -2/-85 -1/-97 -13/-96 +# 132 polygons - 24 triangles + +# +# object Capsule002 +# + +v -18.020712 5.675364 0.001190 +v -18.801044 5.848358 0.001190 +v -18.695282 5.839106 0.397410 +v -18.406332 5.813826 0.687463 +v -18.011620 5.779293 0.793630 +v -17.616907 5.744761 0.687463 +v -17.327957 5.719481 0.397410 +v -17.222195 5.710228 0.001190 +v -17.327957 5.719481 -0.395030 +v -17.616907 5.744761 -0.685084 +v -18.011620 5.779293 -0.791251 +v -18.406332 5.813826 -0.685084 +v -18.695282 5.839106 -0.395031 +v -19.510014 6.217424 0.001190 +v -19.305695 6.199549 0.766628 +v -18.747486 6.150713 1.326968 +v -17.984961 6.084000 1.532067 +v -17.222435 6.017288 1.326968 +v -16.664228 5.968451 0.766628 +v -16.459909 5.950575 0.001190 +v -16.664227 5.968451 -0.764249 +v -17.222435 6.017286 -1.324589 +v -17.984961 6.084000 -1.529687 +v -18.747486 6.150711 -1.324589 +v -19.305695 6.199549 -0.764250 +v -20.099302 6.757408 0.001190 +v -19.810352 6.732130 1.083683 +v -19.020927 6.663063 1.876124 +v -17.942554 6.568718 2.166177 +v -16.864180 6.474373 1.876123 +v -16.074755 6.405308 1.083683 +v -15.785805 6.380028 0.001190 +v -16.074755 6.405306 -1.081303 +v -16.864178 6.474373 -1.873744 +v -17.942553 6.568718 -2.163798 +v -19.020927 6.663063 -1.873745 +v -19.810352 6.732128 -1.081305 +v -20.528755 7.431513 0.001189 +v -20.174866 7.400553 1.326968 +v -19.208021 7.315964 2.297505 +v -17.887287 7.200415 2.652747 +v -16.566553 7.084866 2.297505 +v -15.599710 7.000278 1.326968 +v -15.245820 6.969316 0.001190 +v -15.599710 7.000277 -1.324589 +v -16.566553 7.084866 -2.295126 +v -17.887287 7.200415 -2.650368 +v -19.208019 7.315964 -2.295127 +v -20.174864 7.400551 -1.324591 +v -20.769102 8.193800 0.001189 +v -20.374390 8.159267 1.479903 +v -19.296015 8.064922 2.562397 +v -17.822927 7.936043 2.958617 +v -16.349842 7.807165 2.562397 +v -15.271467 7.712818 1.479903 +v -14.876755 7.678286 0.001190 +v -15.271467 7.712818 -1.477524 +v -16.349840 7.807163 -2.560017 +v -17.822927 7.936043 -2.956238 +v -19.296013 8.064920 -2.560019 +v -20.374390 8.159266 -1.477526 +v -20.803967 8.992317 0.001189 +v -20.395329 8.956566 1.532066 +v -19.278915 8.858892 2.652746 +v -17.753862 8.725468 3.062943 +v -16.228811 8.592043 2.652746 +v -15.112395 8.494370 1.532067 +v -14.703759 8.458618 0.001190 +v -15.112395 8.494370 -1.529687 +v -16.228809 8.592043 -2.650367 +v -17.753860 8.725468 -3.060565 +v -19.278913 8.858892 -2.650369 +v -20.395329 8.956566 -1.529690 +v -19.647619 22.209431 0.001187 +v -19.238983 22.173679 1.532064 +v -18.122566 22.076008 2.652745 +v -16.597515 21.942581 3.062942 +v -15.072463 21.809158 2.652744 +v -13.956048 21.711483 1.532065 +v -13.547411 21.675732 0.001188 +v -13.956047 21.711483 -1.529689 +v -15.072462 21.809156 -2.650369 +v -16.597513 21.942581 -3.060567 +v -18.122566 22.076006 -2.650371 +v -19.238981 22.173679 -1.529692 +v -19.474623 22.989763 0.001187 +v -19.079910 22.955231 1.479901 +v -18.001535 22.860886 2.562395 +v -16.528450 22.732008 2.958615 +v -15.055363 22.603128 2.562394 +v -13.976988 22.508783 1.479901 +v -13.582275 22.474251 0.001188 +v -13.976988 22.508783 -1.477526 +v -15.055362 22.603128 -2.560020 +v -16.528448 22.732006 -2.956240 +v -18.001535 22.860886 -2.560021 +v -19.079910 22.955231 -1.477528 +v -19.105558 23.698732 0.001187 +v -18.751667 23.667770 1.326966 +v -17.784824 23.583183 2.297503 +v -16.464090 23.467634 2.652744 +v -15.143356 23.352085 2.297503 +v -14.176513 23.267498 1.326966 +v -13.822623 23.236536 0.001187 +v -14.176512 23.267496 -1.324591 +v -15.143356 23.352085 -2.295128 +v -16.464088 23.467634 -2.650370 +v -17.784822 23.583183 -2.295130 +v -18.751667 23.667770 -1.324593 +v -18.565573 24.288023 0.001187 +v -18.276623 24.262743 1.083681 +v -17.487198 24.193678 1.876121 +v -16.408823 24.099331 2.166174 +v -15.330449 24.004986 1.876121 +v -14.541025 23.935921 1.083681 +v -14.252075 23.910641 0.001187 +v -14.541024 23.935921 -1.081306 +v -15.330449 24.004986 -1.873747 +v -16.408823 24.099331 -2.163800 +v -17.487198 24.193676 -1.873748 +v -18.276623 24.262743 -1.081308 +v -17.891468 24.717474 0.001187 +v -17.687151 24.699598 0.766625 +v -17.128942 24.650763 1.326966 +v -16.366417 24.584049 1.532064 +v -15.603890 24.517338 1.326965 +v -15.045683 24.468500 0.766625 +v -14.841365 24.450624 0.001187 +v -15.045683 24.468500 -0.764251 +v -15.603890 24.517338 -1.324591 +v -16.366415 24.584049 -1.529690 +v -17.128942 24.650763 -1.324592 +v -17.687149 24.699598 -0.764253 +v -17.129183 24.957821 0.001187 +v -17.023420 24.948568 0.397407 +v -16.734470 24.923288 0.687460 +v -16.339758 24.888756 0.793627 +v -15.945045 24.854223 0.687460 +v -15.656096 24.828943 0.397407 +v -15.550333 24.819691 0.001187 +v -15.656096 24.828943 -0.395033 +v -15.945045 24.854223 -0.685086 +v -16.339758 24.888756 -0.791254 +v -16.734470 24.923288 -0.685087 +v -17.023420 24.948568 -0.395034 +v -16.330666 24.992685 0.001187 +# 146 vertices + +vt 0.500000 0.500000 0.000000 +vt 0.629410 0.500000 0.000000 +vt 0.612072 0.564705 0.000000 +vt 0.564705 0.612072 0.000000 +vt 0.500000 0.629410 0.000000 +vt 0.435295 0.612072 0.000000 +vt 0.387928 0.564705 0.000000 +vt 0.370590 0.500000 0.000000 +vt 0.387928 0.435295 0.000000 +vt 0.435295 0.387928 0.000000 +vt 0.500000 0.370590 0.000000 +vt 0.564705 0.387928 0.000000 +vt 0.612072 0.435295 0.000000 +vt 0.750000 0.500000 0.000000 +vt 0.716506 0.625000 0.000000 +vt 0.625000 0.716506 0.000000 +vt 0.500000 0.750000 0.000000 +vt 0.375000 0.716506 0.000000 +vt 0.283494 0.625000 0.000000 +vt 0.250000 0.500000 0.000000 +vt 0.283494 0.375000 0.000000 +vt 0.375000 0.283494 0.000000 +vt 0.500000 0.250000 0.000000 +vt 0.625000 0.283494 0.000000 +vt 0.716506 0.375000 0.000000 +vt 0.853553 0.500000 0.000000 +vt 0.806186 0.676777 0.000000 +vt 0.676777 0.806186 0.000000 +vt 0.500000 0.853553 0.000000 +vt 0.323223 0.806186 0.000000 +vt 0.193814 0.676777 0.000000 +vt 0.146447 0.500000 0.000000 +vt 0.193814 0.323223 0.000000 +vt 0.323223 0.193814 0.000000 +vt 0.500000 0.146447 0.000000 +vt 0.676777 0.193814 0.000000 +vt 0.806186 0.323223 0.000000 +vt 0.933013 0.500000 0.000000 +vt 0.875000 0.716506 0.000000 +vt 0.716506 0.875000 0.000000 +vt 0.500000 0.933013 0.000000 +vt 0.283494 0.875000 0.000000 +vt 0.125000 0.716506 0.000000 +vt 0.066987 0.500000 0.000000 +vt 0.125000 0.283494 0.000000 +vt 0.283494 0.125000 0.000000 +vt 0.500000 0.066987 0.000000 +vt 0.716506 0.125000 0.000000 +vt 0.875000 0.283493 0.000000 +vt 0.982963 0.500000 0.000000 +vt 0.918258 0.741481 0.000000 +vt 0.741481 0.918258 0.000000 +vt 0.500000 0.982963 0.000000 +vt 0.258519 0.918258 0.000000 +vt 0.081742 0.741481 0.000000 +vt 0.017037 0.500000 0.000000 +vt 0.081742 0.258519 0.000000 +vt 0.258518 0.081742 0.000000 +vt 0.500000 0.017037 0.000000 +vt 0.741481 0.081742 0.000000 +vt 0.918258 0.258518 0.000000 +vt 1.000000 0.500000 0.000000 +vt 0.933013 0.750000 0.000000 +vt 0.750000 0.933013 0.000000 +vt 0.500000 1.000000 0.000000 +vt 0.250000 0.933013 0.000000 +vt 0.066987 0.750000 0.000000 +vt 0.000000 0.500000 0.000000 +vt 0.066987 0.250000 0.000000 +vt 0.250000 0.066987 0.000000 +vt 0.500000 0.000000 0.000000 +vt 0.750000 0.066987 0.000000 +vt 0.933013 0.250000 0.000000 +vt 0.000000 1.000000 0.000000 +vt 0.000000 0.000000 0.000000 +vt 0.083333 0.000000 0.000000 +vt 0.083333 1.000000 0.000000 +vt 0.166667 0.000000 0.000000 +vt 0.166667 1.000000 0.000000 +vt 0.250000 0.000000 0.000000 +vt 0.250000 1.000000 0.000000 +vt 0.333333 0.000000 0.000000 +vt 0.333333 1.000000 0.000000 +vt 0.416667 0.000000 0.000000 +vt 0.416667 1.000000 0.000000 +vt 0.583333 0.000000 0.000000 +vt 0.583333 1.000000 0.000000 +vt 0.666667 0.000000 0.000000 +vt 0.666667 1.000000 0.000000 +vt 0.750000 0.000000 0.000000 +vt 0.750000 1.000000 0.000000 +vt 0.833333 0.000000 0.000000 +vt 0.833333 1.000000 0.000000 +vt 0.916667 0.000000 0.000000 +vt 0.916667 1.000000 0.000000 +vt 1.000000 0.000000 0.000000 +vt 1.000000 1.000000 0.000000 +# 97 texture coords + +g Capsule002 +usemtl wire_061135006 +f -144/-95 -145/-96 -146/-97 +f -143/-94 -144/-95 -146/-97 +f -142/-93 -143/-94 -146/-97 +f -141/-92 -142/-93 -146/-97 +f -140/-91 -141/-92 -146/-97 +f -139/-90 -140/-91 -146/-97 +f -138/-89 -139/-90 -146/-97 +f -137/-88 -138/-89 -146/-97 +f -136/-87 -137/-88 -146/-97 +f -135/-86 -136/-87 -146/-97 +f -134/-85 -135/-86 -146/-97 +f -145/-96 -134/-85 -146/-97 +f -144/-95 -132/-83 -133/-84 -145/-96 +f -143/-94 -131/-82 -132/-83 -144/-95 +f -142/-93 -130/-81 -131/-82 -143/-94 +f -141/-92 -129/-80 -130/-81 -142/-93 +f -140/-91 -128/-79 -129/-80 -141/-92 +f -139/-90 -127/-78 -128/-79 -140/-91 +f -138/-89 -126/-77 -127/-78 -139/-90 +f -137/-88 -125/-76 -126/-77 -138/-89 +f -136/-87 -124/-75 -125/-76 -137/-88 +f -135/-86 -123/-74 -124/-75 -136/-87 +f -134/-85 -122/-73 -123/-74 -135/-86 +f -145/-96 -133/-84 -122/-73 -134/-85 +f -132/-83 -120/-71 -121/-72 -133/-84 +f -131/-82 -119/-70 -120/-71 -132/-83 +f -130/-81 -118/-69 -119/-70 -131/-82 +f -129/-80 -117/-68 -118/-69 -130/-81 +f -128/-79 -116/-67 -117/-68 -129/-80 +f -127/-78 -115/-66 -116/-67 -128/-79 +f -126/-77 -114/-65 -115/-66 -127/-78 +f -125/-76 -113/-64 -114/-65 -126/-77 +f -124/-75 -112/-63 -113/-64 -125/-76 +f -123/-74 -111/-62 -112/-63 -124/-75 +f -122/-73 -110/-61 -111/-62 -123/-74 +f -133/-84 -121/-72 -110/-61 -122/-73 +f -120/-71 -108/-59 -109/-60 -121/-72 +f -119/-70 -107/-58 -108/-59 -120/-71 +f -118/-69 -106/-57 -107/-58 -119/-70 +f -117/-68 -105/-56 -106/-57 -118/-69 +f -116/-67 -104/-55 -105/-56 -117/-68 +f -115/-66 -103/-54 -104/-55 -116/-67 +f -114/-65 -102/-53 -103/-54 -115/-66 +f -113/-64 -101/-52 -102/-53 -114/-65 +f -112/-63 -100/-51 -101/-52 -113/-64 +f -111/-62 -99/-50 -100/-51 -112/-63 +f -110/-61 -98/-49 -99/-50 -111/-62 +f -121/-72 -109/-60 -98/-49 -110/-61 +f -108/-59 -96/-47 -97/-48 -109/-60 +f -107/-58 -95/-46 -96/-47 -108/-59 +f -106/-57 -94/-45 -95/-46 -107/-58 +f -105/-56 -93/-44 -94/-45 -106/-57 +f -104/-55 -92/-43 -93/-44 -105/-56 +f -103/-54 -91/-42 -92/-43 -104/-55 +f -102/-53 -90/-41 -91/-42 -103/-54 +f -101/-52 -89/-40 -90/-41 -102/-53 +f -100/-51 -88/-39 -89/-40 -101/-52 +f -99/-50 -87/-38 -88/-39 -100/-51 +f -98/-49 -86/-37 -87/-38 -99/-50 +f -109/-60 -97/-48 -86/-37 -98/-49 +f -96/-47 -84/-35 -85/-36 -97/-48 +f -95/-46 -83/-34 -84/-35 -96/-47 +f -94/-45 -82/-33 -83/-34 -95/-46 +f -93/-44 -81/-32 -82/-33 -94/-45 +f -92/-43 -80/-31 -81/-32 -93/-44 +f -91/-42 -79/-30 -80/-31 -92/-43 +f -90/-41 -78/-29 -79/-30 -91/-42 +f -89/-40 -77/-28 -78/-29 -90/-41 +f -88/-39 -76/-27 -77/-28 -89/-40 +f -87/-38 -75/-26 -76/-27 -88/-39 +f -86/-37 -74/-25 -75/-26 -87/-38 +f -97/-48 -85/-36 -74/-25 -86/-37 +f -84/-21 -72/-22 -73/-23 -85/-24 +f -83/-19 -71/-20 -72/-22 -84/-21 +f -82/-17 -70/-18 -71/-20 -83/-19 +f -81/-15 -69/-16 -70/-18 -82/-17 +f -80/-13 -68/-14 -69/-16 -81/-15 +f -79/-33 -67/-27 -68/-14 -80/-13 +f -78/-11 -66/-12 -67/-27 -79/-33 +f -77/-9 -65/-10 -66/-12 -78/-11 +f -76/-7 -64/-8 -65/-10 -77/-9 +f -75/-5 -63/-6 -64/-8 -76/-7 +f -74/-3 -62/-4 -63/-6 -75/-5 +f -85/-1 -73/-2 -62/-4 -74/-3 +f -72/-35 -60/-47 -61/-48 -73/-36 +f -71/-34 -59/-46 -60/-47 -72/-35 +f -70/-33 -58/-45 -59/-46 -71/-34 +f -69/-32 -57/-44 -58/-45 -70/-33 +f -68/-31 -56/-43 -57/-44 -69/-32 +f -67/-30 -55/-42 -56/-43 -68/-31 +f -66/-29 -54/-41 -55/-42 -67/-30 +f -65/-28 -53/-40 -54/-41 -66/-29 +f -64/-27 -52/-39 -53/-40 -65/-28 +f -63/-26 -51/-38 -52/-39 -64/-27 +f -62/-25 -50/-37 -51/-38 -63/-26 +f -73/-36 -61/-48 -50/-37 -62/-25 +f -60/-47 -48/-59 -49/-60 -61/-48 +f -59/-46 -47/-58 -48/-59 -60/-47 +f -58/-45 -46/-57 -47/-58 -59/-46 +f -57/-44 -45/-56 -46/-57 -58/-45 +f -56/-43 -44/-55 -45/-56 -57/-44 +f -55/-42 -43/-54 -44/-55 -56/-43 +f -54/-41 -42/-53 -43/-54 -55/-42 +f -53/-40 -41/-52 -42/-53 -54/-41 +f -52/-39 -40/-51 -41/-52 -53/-40 +f -51/-38 -39/-50 -40/-51 -52/-39 +f -50/-37 -38/-49 -39/-50 -51/-38 +f -61/-48 -49/-60 -38/-49 -50/-37 +f -48/-59 -36/-71 -37/-72 -49/-60 +f -47/-58 -35/-70 -36/-71 -48/-59 +f -46/-57 -34/-69 -35/-70 -47/-58 +f -45/-56 -33/-68 -34/-69 -46/-57 +f -44/-55 -32/-67 -33/-68 -45/-56 +f -43/-54 -31/-66 -32/-67 -44/-55 +f -42/-53 -30/-65 -31/-66 -43/-54 +f -41/-52 -29/-64 -30/-65 -42/-53 +f -40/-51 -28/-63 -29/-64 -41/-52 +f -39/-50 -27/-62 -28/-63 -40/-51 +f -38/-49 -26/-61 -27/-62 -39/-50 +f -49/-60 -37/-72 -26/-61 -38/-49 +f -36/-71 -24/-83 -25/-84 -37/-72 +f -35/-70 -23/-82 -24/-83 -36/-71 +f -34/-69 -22/-81 -23/-82 -35/-70 +f -33/-68 -21/-80 -22/-81 -34/-69 +f -32/-67 -20/-79 -21/-80 -33/-68 +f -31/-66 -19/-78 -20/-79 -32/-67 +f -30/-65 -18/-77 -19/-78 -31/-66 +f -29/-64 -17/-76 -18/-77 -30/-65 +f -28/-63 -16/-75 -17/-76 -29/-64 +f -27/-62 -15/-74 -16/-75 -28/-63 +f -26/-61 -14/-73 -15/-74 -27/-62 +f -37/-72 -25/-84 -14/-73 -26/-61 +f -24/-83 -12/-95 -13/-96 -25/-84 +f -23/-82 -11/-94 -12/-95 -24/-83 +f -22/-81 -10/-93 -11/-94 -23/-82 +f -21/-80 -9/-92 -10/-93 -22/-81 +f -20/-79 -8/-91 -9/-92 -21/-80 +f -19/-78 -7/-90 -8/-91 -20/-79 +f -18/-77 -6/-89 -7/-90 -19/-78 +f -17/-76 -5/-88 -6/-89 -18/-77 +f -16/-75 -4/-87 -5/-88 -17/-76 +f -15/-74 -3/-86 -4/-87 -16/-75 +f -14/-73 -2/-85 -3/-86 -15/-74 +f -25/-84 -13/-96 -2/-85 -14/-73 +f -12/-95 -1/-97 -13/-96 +f -11/-94 -1/-97 -12/-95 +f -10/-93 -1/-97 -11/-94 +f -9/-92 -1/-97 -10/-93 +f -8/-91 -1/-97 -9/-92 +f -7/-90 -1/-97 -8/-91 +f -6/-89 -1/-97 -7/-90 +f -5/-88 -1/-97 -6/-89 +f -4/-87 -1/-97 -5/-88 +f -3/-86 -1/-97 -4/-87 +f -2/-85 -1/-97 -3/-86 +f -13/-96 -1/-97 -2/-85 +# 132 polygons - 24 triangles + +# +# object Capsule003 +# + +v -5.495471 -12.686141 0.077784 +v -4.703031 -12.581815 0.077784 +v -4.809198 -12.581815 0.474004 +v -5.099251 -12.581815 0.764057 +v -5.495471 -12.581815 0.870224 +v -5.891692 -12.581815 0.764057 +v -6.181745 -12.581815 0.474004 +v -6.287912 -12.581815 0.077784 +v -6.181745 -12.581815 -0.318436 +v -5.891692 -12.581815 -0.608490 +v -5.495472 -12.581815 -0.714657 +v -5.099252 -12.581815 -0.608490 +v -4.809198 -12.581815 -0.318437 +v -3.964594 -12.275944 0.077784 +v -4.169693 -12.275944 0.843222 +v -4.730033 -12.275944 1.403562 +v -5.495471 -12.275944 1.608661 +v -6.260910 -12.275944 1.403562 +v -6.821250 -12.275944 0.843222 +v -7.026349 -12.275944 0.077784 +v -6.821250 -12.275944 -0.687655 +v -6.260911 -12.275944 -1.247995 +v -5.495472 -12.275944 -1.453094 +v -4.730033 -12.275944 -1.247995 +v -4.169693 -12.275944 -0.687656 +v -3.330484 -11.789373 0.077783 +v -3.620538 -11.789373 1.160277 +v -4.412978 -11.789373 1.952717 +v -5.495471 -11.789373 2.242771 +v -6.577965 -11.789373 1.952717 +v -7.370405 -11.789373 1.160277 +v -7.660459 -11.789373 0.077784 +v -7.370405 -11.789373 -1.004710 +v -6.577966 -11.789373 -1.797150 +v -5.495472 -11.789373 -2.087204 +v -4.412979 -11.789373 -1.797151 +v -3.620538 -11.789373 -1.004711 +v -2.843914 -11.155263 0.077783 +v -3.199156 -11.155263 1.403562 +v -4.169693 -11.155263 2.374099 +v -5.495471 -11.155263 2.729341 +v -6.821250 -11.155263 2.374099 +v -7.791787 -11.155263 1.403562 +v -8.147029 -11.155263 0.077784 +v -7.791788 -11.155263 -1.247995 +v -6.821251 -11.155263 -2.218532 +v -5.495472 -11.155263 -2.573774 +v -4.169694 -11.155263 -2.218533 +v -3.199157 -11.155263 -1.247997 +v -2.538044 -10.416827 0.077783 +v -2.934264 -10.416827 1.556497 +v -4.016758 -10.416827 2.638991 +v -5.495471 -10.416827 3.035211 +v -6.974185 -10.416827 2.638991 +v -8.056679 -10.416827 1.556497 +v -8.452899 -10.416827 0.077784 +v -8.056679 -10.416827 -1.400930 +v -6.974186 -10.416827 -2.483423 +v -5.495473 -10.416827 -2.879644 +v -4.016759 -10.416827 -2.483425 +v -2.934265 -10.416827 -1.400932 +v -2.433717 -9.624387 0.077783 +v -2.843915 -9.624387 1.608660 +v -3.964594 -9.624387 2.729340 +v -5.495471 -9.624387 3.139537 +v -7.026349 -9.624387 2.729340 +v -8.147028 -9.624387 1.608660 +v -8.557226 -9.624387 0.077784 +v -8.147029 -9.624387 -1.453093 +v -7.026350 -9.624387 -2.573773 +v -5.495473 -9.624387 -2.983971 +v -3.964596 -9.624387 -2.573775 +v -2.843915 -9.624387 -1.453096 +v -2.433717 0.152815 0.077782 +v -2.843915 0.152815 1.608659 +v -3.964594 0.152815 2.729339 +v -5.495471 0.152815 3.139536 +v -7.026349 0.152815 2.729339 +v -8.147028 0.152815 1.608659 +v -8.557226 0.152815 0.077782 +v -8.147029 0.152815 -1.453095 +v -7.026350 0.152814 -2.573775 +v -5.495473 0.152814 -2.983973 +v -3.964596 0.152814 -2.573776 +v -2.843915 0.152815 -1.453097 +v -2.538044 0.945256 0.077782 +v -2.934264 0.945256 1.556495 +v -4.016758 0.945256 2.638989 +v -5.495471 0.945256 3.035209 +v -6.974185 0.945256 2.638989 +v -8.056679 0.945256 1.556496 +v -8.452899 0.945256 0.077782 +v -8.056679 0.945255 -1.400932 +v -6.974186 0.945255 -2.483425 +v -5.495473 0.945255 -2.879646 +v -4.016759 0.945255 -2.483427 +v -2.934265 0.945255 -1.400934 +v -2.843914 1.683692 0.077781 +v -3.199156 1.683692 1.403560 +v -4.169693 1.683692 2.374097 +v -5.495471 1.683692 2.729339 +v -6.821250 1.683692 2.374097 +v -7.791787 1.683692 1.403560 +v -8.147029 1.683692 0.077782 +v -7.791788 1.683691 -1.247997 +v -6.821251 1.683691 -2.218534 +v -5.495473 1.683691 -2.573776 +v -4.169694 1.683691 -2.218535 +v -3.199157 1.683691 -1.247999 +v -3.330484 2.317802 0.077781 +v -3.620538 2.317802 1.160275 +v -4.412978 2.317802 1.952715 +v -5.495471 2.317802 2.242769 +v -6.577965 2.317802 1.952715 +v -7.370405 2.317802 1.160275 +v -7.660459 2.317802 0.077782 +v -7.370406 2.317801 -1.004712 +v -6.577966 2.317801 -1.797152 +v -5.495472 2.317801 -2.087206 +v -4.412979 2.317801 -1.797153 +v -3.620538 2.317801 -1.004714 +v -3.964594 2.804371 0.077781 +v -4.169693 2.804372 0.843220 +v -4.730033 2.804372 1.403560 +v -5.495471 2.804372 1.608658 +v -6.260910 2.804372 1.403560 +v -6.821250 2.804372 0.843220 +v -7.026349 2.804371 0.077781 +v -6.821250 2.804371 -0.687657 +v -6.260911 2.804371 -1.247997 +v -5.495472 2.804371 -1.453096 +v -4.730034 2.804371 -1.247998 +v -4.169693 2.804371 -0.687658 +v -4.703031 3.110242 0.077781 +v -4.809198 3.110243 0.474001 +v -5.099251 3.110243 0.764055 +v -5.495471 3.110243 0.870222 +v -5.891692 3.110243 0.764055 +v -6.181745 3.110242 0.474001 +v -6.287912 3.110242 0.077781 +v -6.181745 3.110242 -0.318439 +v -5.891692 3.110242 -0.608492 +v -5.495472 3.110242 -0.714659 +v -5.099252 3.110242 -0.608492 +v -4.809198 3.110242 -0.318439 +v -5.495471 3.214569 0.077781 +# 146 vertices + +vt 0.500000 0.500000 0.000000 +vt 0.629410 0.500000 0.000000 +vt 0.612072 0.564705 0.000000 +vt 0.564705 0.612072 0.000000 +vt 0.500000 0.629410 0.000000 +vt 0.435295 0.612072 0.000000 +vt 0.387928 0.564705 0.000000 +vt 0.370590 0.500000 0.000000 +vt 0.387928 0.435295 0.000000 +vt 0.435295 0.387928 0.000000 +vt 0.500000 0.370590 0.000000 +vt 0.564705 0.387928 0.000000 +vt 0.612072 0.435295 0.000000 +vt 0.750000 0.500000 0.000000 +vt 0.716506 0.625000 0.000000 +vt 0.625000 0.716506 0.000000 +vt 0.500000 0.750000 0.000000 +vt 0.375000 0.716506 0.000000 +vt 0.283494 0.625000 0.000000 +vt 0.250000 0.500000 0.000000 +vt 0.283494 0.375000 0.000000 +vt 0.375000 0.283494 0.000000 +vt 0.500000 0.250000 0.000000 +vt 0.625000 0.283494 0.000000 +vt 0.716506 0.375000 0.000000 +vt 0.853553 0.500000 0.000000 +vt 0.806186 0.676777 0.000000 +vt 0.676777 0.806186 0.000000 +vt 0.500000 0.853553 0.000000 +vt 0.323223 0.806186 0.000000 +vt 0.193814 0.676777 0.000000 +vt 0.146447 0.500000 0.000000 +vt 0.193814 0.323223 0.000000 +vt 0.323223 0.193814 0.000000 +vt 0.500000 0.146447 0.000000 +vt 0.676777 0.193814 0.000000 +vt 0.806186 0.323223 0.000000 +vt 0.933013 0.500000 0.000000 +vt 0.875000 0.716506 0.000000 +vt 0.716506 0.875000 0.000000 +vt 0.500000 0.933013 0.000000 +vt 0.283494 0.875000 0.000000 +vt 0.125000 0.716506 0.000000 +vt 0.066987 0.500000 0.000000 +vt 0.125000 0.283494 0.000000 +vt 0.283494 0.125000 0.000000 +vt 0.500000 0.066987 0.000000 +vt 0.716506 0.125000 0.000000 +vt 0.875000 0.283493 0.000000 +vt 0.982963 0.500000 0.000000 +vt 0.918258 0.741481 0.000000 +vt 0.741481 0.918258 0.000000 +vt 0.500000 0.982963 0.000000 +vt 0.258519 0.918258 0.000000 +vt 0.081742 0.741481 0.000000 +vt 0.017037 0.500000 0.000000 +vt 0.081742 0.258519 0.000000 +vt 0.258518 0.081742 0.000000 +vt 0.500000 0.017037 0.000000 +vt 0.741481 0.081742 0.000000 +vt 0.918258 0.258518 0.000000 +vt 1.000000 0.500000 0.000000 +vt 0.933013 0.750000 0.000000 +vt 0.750000 0.933013 0.000000 +vt 0.500000 1.000000 0.000000 +vt 0.250000 0.933013 0.000000 +vt 0.066987 0.750000 0.000000 +vt 0.000000 0.500000 0.000000 +vt 0.066987 0.250000 0.000000 +vt 0.250000 0.066987 0.000000 +vt 0.500000 0.000000 0.000000 +vt 0.750000 0.066987 0.000000 +vt 0.933013 0.250000 0.000000 +vt 0.000000 1.000000 0.000000 +vt 0.000000 0.000000 0.000000 +vt 0.083333 0.000000 0.000000 +vt 0.083333 1.000000 0.000000 +vt 0.166667 0.000000 0.000000 +vt 0.166667 1.000000 0.000000 +vt 0.250000 0.000000 0.000000 +vt 0.250000 1.000000 0.000000 +vt 0.333333 0.000000 0.000000 +vt 0.333333 1.000000 0.000000 +vt 0.416667 0.000000 0.000000 +vt 0.416667 1.000000 0.000000 +vt 0.583333 0.000000 0.000000 +vt 0.583333 1.000000 0.000000 +vt 0.666667 0.000000 0.000000 +vt 0.666667 1.000000 0.000000 +vt 0.750000 0.000000 0.000000 +vt 0.750000 1.000000 0.000000 +vt 0.833333 0.000000 0.000000 +vt 0.833333 1.000000 0.000000 +vt 0.916667 0.000000 0.000000 +vt 0.916667 1.000000 0.000000 +vt 1.000000 0.000000 0.000000 +vt 1.000000 1.000000 0.000000 +# 97 texture coords + +g Capsule003 +usemtl wire_061135006 +f -146/-97 -145/-96 -144/-95 +f -146/-97 -144/-95 -143/-94 +f -146/-97 -143/-94 -142/-93 +f -146/-97 -142/-93 -141/-92 +f -146/-97 -141/-92 -140/-91 +f -146/-97 -140/-91 -139/-90 +f -146/-97 -139/-90 -138/-89 +f -146/-97 -138/-89 -137/-88 +f -146/-97 -137/-88 -136/-87 +f -146/-97 -136/-87 -135/-86 +f -146/-97 -135/-86 -134/-85 +f -146/-97 -134/-85 -145/-96 +f -145/-96 -133/-84 -132/-83 -144/-95 +f -144/-95 -132/-83 -131/-82 -143/-94 +f -143/-94 -131/-82 -130/-81 -142/-93 +f -142/-93 -130/-81 -129/-80 -141/-92 +f -141/-92 -129/-80 -128/-79 -140/-91 +f -140/-91 -128/-79 -127/-78 -139/-90 +f -139/-90 -127/-78 -126/-77 -138/-89 +f -138/-89 -126/-77 -125/-76 -137/-88 +f -137/-88 -125/-76 -124/-75 -136/-87 +f -136/-87 -124/-75 -123/-74 -135/-86 +f -135/-86 -123/-74 -122/-73 -134/-85 +f -134/-85 -122/-73 -133/-84 -145/-96 +f -133/-84 -121/-72 -120/-71 -132/-83 +f -132/-83 -120/-71 -119/-70 -131/-82 +f -131/-82 -119/-70 -118/-69 -130/-81 +f -130/-81 -118/-69 -117/-68 -129/-80 +f -129/-80 -117/-68 -116/-67 -128/-79 +f -128/-79 -116/-67 -115/-66 -127/-78 +f -127/-78 -115/-66 -114/-65 -126/-77 +f -126/-77 -114/-65 -113/-64 -125/-76 +f -125/-76 -113/-64 -112/-63 -124/-75 +f -124/-75 -112/-63 -111/-62 -123/-74 +f -123/-74 -111/-62 -110/-61 -122/-73 +f -122/-73 -110/-61 -121/-72 -133/-84 +f -121/-72 -109/-60 -108/-59 -120/-71 +f -120/-71 -108/-59 -107/-58 -119/-70 +f -119/-70 -107/-58 -106/-57 -118/-69 +f -118/-69 -106/-57 -105/-56 -117/-68 +f -117/-68 -105/-56 -104/-55 -116/-67 +f -116/-67 -104/-55 -103/-54 -115/-66 +f -115/-66 -103/-54 -102/-53 -114/-65 +f -114/-65 -102/-53 -101/-52 -113/-64 +f -113/-64 -101/-52 -100/-51 -112/-63 +f -112/-63 -100/-51 -99/-50 -111/-62 +f -111/-62 -99/-50 -98/-49 -110/-61 +f -110/-61 -98/-49 -109/-60 -121/-72 +f -109/-60 -97/-48 -96/-47 -108/-59 +f -108/-59 -96/-47 -95/-46 -107/-58 +f -107/-58 -95/-46 -94/-45 -106/-57 +f -106/-57 -94/-45 -93/-44 -105/-56 +f -105/-56 -93/-44 -92/-43 -104/-55 +f -104/-55 -92/-43 -91/-42 -103/-54 +f -103/-54 -91/-42 -90/-41 -102/-53 +f -102/-53 -90/-41 -89/-40 -101/-52 +f -101/-52 -89/-40 -88/-39 -100/-51 +f -100/-51 -88/-39 -87/-38 -99/-50 +f -99/-50 -87/-38 -86/-37 -98/-49 +f -98/-49 -86/-37 -97/-48 -109/-60 +f -97/-48 -85/-36 -84/-35 -96/-47 +f -96/-47 -84/-35 -83/-34 -95/-46 +f -95/-46 -83/-34 -82/-33 -94/-45 +f -94/-45 -82/-33 -81/-32 -93/-44 +f -93/-44 -81/-32 -80/-31 -92/-43 +f -92/-43 -80/-31 -79/-30 -91/-42 +f -91/-42 -79/-30 -78/-29 -90/-41 +f -90/-41 -78/-29 -77/-28 -89/-40 +f -89/-40 -77/-28 -76/-27 -88/-39 +f -88/-39 -76/-27 -75/-26 -87/-38 +f -87/-38 -75/-26 -74/-25 -86/-37 +f -86/-37 -74/-25 -85/-36 -97/-48 +f -85/-24 -73/-23 -72/-22 -84/-21 +f -84/-21 -72/-22 -71/-20 -83/-19 +f -83/-19 -71/-20 -70/-18 -82/-17 +f -82/-17 -70/-18 -69/-16 -81/-15 +f -81/-15 -69/-16 -68/-14 -80/-13 +f -80/-13 -68/-14 -67/-27 -79/-33 +f -79/-33 -67/-27 -66/-12 -78/-11 +f -78/-11 -66/-12 -65/-10 -77/-9 +f -77/-9 -65/-10 -64/-8 -76/-7 +f -76/-7 -64/-8 -63/-6 -75/-5 +f -75/-5 -63/-6 -62/-4 -74/-3 +f -74/-3 -62/-4 -73/-2 -85/-1 +f -73/-36 -61/-48 -60/-47 -72/-35 +f -72/-35 -60/-47 -59/-46 -71/-34 +f -71/-34 -59/-46 -58/-45 -70/-33 +f -70/-33 -58/-45 -57/-44 -69/-32 +f -69/-32 -57/-44 -56/-43 -68/-31 +f -68/-31 -56/-43 -55/-42 -67/-30 +f -67/-30 -55/-42 -54/-41 -66/-29 +f -66/-29 -54/-41 -53/-40 -65/-28 +f -65/-28 -53/-40 -52/-39 -64/-27 +f -64/-27 -52/-39 -51/-38 -63/-26 +f -63/-26 -51/-38 -50/-37 -62/-25 +f -62/-25 -50/-37 -61/-48 -73/-36 +f -61/-48 -49/-60 -48/-59 -60/-47 +f -60/-47 -48/-59 -47/-58 -59/-46 +f -59/-46 -47/-58 -46/-57 -58/-45 +f -58/-45 -46/-57 -45/-56 -57/-44 +f -57/-44 -45/-56 -44/-55 -56/-43 +f -56/-43 -44/-55 -43/-54 -55/-42 +f -55/-42 -43/-54 -42/-53 -54/-41 +f -54/-41 -42/-53 -41/-52 -53/-40 +f -53/-40 -41/-52 -40/-51 -52/-39 +f -52/-39 -40/-51 -39/-50 -51/-38 +f -51/-38 -39/-50 -38/-49 -50/-37 +f -50/-37 -38/-49 -49/-60 -61/-48 +f -49/-60 -37/-72 -36/-71 -48/-59 +f -48/-59 -36/-71 -35/-70 -47/-58 +f -47/-58 -35/-70 -34/-69 -46/-57 +f -46/-57 -34/-69 -33/-68 -45/-56 +f -45/-56 -33/-68 -32/-67 -44/-55 +f -44/-55 -32/-67 -31/-66 -43/-54 +f -43/-54 -31/-66 -30/-65 -42/-53 +f -42/-53 -30/-65 -29/-64 -41/-52 +f -41/-52 -29/-64 -28/-63 -40/-51 +f -40/-51 -28/-63 -27/-62 -39/-50 +f -39/-50 -27/-62 -26/-61 -38/-49 +f -38/-49 -26/-61 -37/-72 -49/-60 +f -37/-72 -25/-84 -24/-83 -36/-71 +f -36/-71 -24/-83 -23/-82 -35/-70 +f -35/-70 -23/-82 -22/-81 -34/-69 +f -34/-69 -22/-81 -21/-80 -33/-68 +f -33/-68 -21/-80 -20/-79 -32/-67 +f -32/-67 -20/-79 -19/-78 -31/-66 +f -31/-66 -19/-78 -18/-77 -30/-65 +f -30/-65 -18/-77 -17/-76 -29/-64 +f -29/-64 -17/-76 -16/-75 -28/-63 +f -28/-63 -16/-75 -15/-74 -27/-62 +f -27/-62 -15/-74 -14/-73 -26/-61 +f -26/-61 -14/-73 -25/-84 -37/-72 +f -25/-84 -13/-96 -12/-95 -24/-83 +f -24/-83 -12/-95 -11/-94 -23/-82 +f -23/-82 -11/-94 -10/-93 -22/-81 +f -22/-81 -10/-93 -9/-92 -21/-80 +f -21/-80 -9/-92 -8/-91 -20/-79 +f -20/-79 -8/-91 -7/-90 -19/-78 +f -19/-78 -7/-90 -6/-89 -18/-77 +f -18/-77 -6/-89 -5/-88 -17/-76 +f -17/-76 -5/-88 -4/-87 -16/-75 +f -16/-75 -4/-87 -3/-86 -15/-74 +f -15/-74 -3/-86 -2/-85 -14/-73 +f -14/-73 -2/-85 -13/-96 -25/-84 +f -13/-96 -1/-97 -12/-95 +f -12/-95 -1/-97 -11/-94 +f -11/-94 -1/-97 -10/-93 +f -10/-93 -1/-97 -9/-92 +f -9/-92 -1/-97 -8/-91 +f -8/-91 -1/-97 -7/-90 +f -7/-90 -1/-97 -6/-89 +f -6/-89 -1/-97 -5/-88 +f -5/-88 -1/-97 -4/-87 +f -4/-87 -1/-97 -3/-86 +f -3/-86 -1/-97 -2/-85 +f -2/-85 -1/-97 -13/-96 +# 132 polygons - 24 triangles + +# +# object Capsule004 +# + +v 5.582903 -12.686141 0.077784 +v 6.375343 -12.581815 0.077784 +v 6.269176 -12.581815 0.474004 +v 5.979123 -12.581815 0.764057 +v 5.582903 -12.581815 0.870224 +v 5.186683 -12.581815 0.764057 +v 4.896630 -12.581815 0.474004 +v 4.790462 -12.581815 0.077784 +v 4.896629 -12.581815 -0.318436 +v 5.186683 -12.581815 -0.608490 +v 5.582902 -12.581815 -0.714657 +v 5.979123 -12.581815 -0.608490 +v 6.269176 -12.581815 -0.318437 +v 7.113780 -12.275944 0.077784 +v 6.908681 -12.275944 0.843222 +v 6.348341 -12.275944 1.403562 +v 5.582903 -12.275944 1.608661 +v 4.817464 -12.275944 1.403562 +v 4.257124 -12.275944 0.843222 +v 4.052026 -12.275944 0.077784 +v 4.257124 -12.275944 -0.687655 +v 4.817464 -12.275944 -1.247995 +v 5.582902 -12.275944 -1.453094 +v 6.348341 -12.275944 -1.247995 +v 6.908681 -12.275944 -0.687656 +v 7.747890 -11.789373 0.077783 +v 7.457837 -11.789373 1.160277 +v 6.665397 -11.789373 1.952717 +v 5.582903 -11.789373 2.242771 +v 4.500409 -11.789373 1.952717 +v 3.707969 -11.789373 1.160277 +v 3.417916 -11.789373 0.077784 +v 3.707969 -11.789373 -1.004710 +v 4.500409 -11.789373 -1.797150 +v 5.582902 -11.789373 -2.087204 +v 6.665396 -11.789373 -1.797151 +v 7.457836 -11.789373 -1.004711 +v 8.234460 -11.155263 0.077783 +v 7.879219 -11.155263 1.403562 +v 6.908681 -11.155263 2.374099 +v 5.582903 -11.155263 2.729341 +v 4.257124 -11.155263 2.374099 +v 3.286587 -11.155263 1.403562 +v 2.931346 -11.155263 0.077784 +v 3.286587 -11.155263 -1.247995 +v 4.257124 -11.155263 -2.218532 +v 5.582902 -11.155263 -2.573774 +v 6.908680 -11.155263 -2.218533 +v 7.879218 -11.155263 -1.247997 +v 8.540331 -10.416827 0.077783 +v 8.144110 -10.416827 1.556497 +v 7.061617 -10.416827 2.638991 +v 5.582903 -10.416827 3.035211 +v 4.104189 -10.416827 2.638991 +v 3.021696 -10.416827 1.556497 +v 2.625475 -10.416827 0.077784 +v 3.021695 -10.416827 -1.400930 +v 4.104188 -10.416827 -2.483423 +v 5.582901 -10.416827 -2.879644 +v 7.061615 -10.416827 -2.483425 +v 8.144110 -10.416827 -1.400932 +v 8.644657 -9.624387 0.077783 +v 8.234460 -9.624387 1.608660 +v 7.113780 -9.624387 2.729340 +v 5.582903 -9.624387 3.139537 +v 4.052026 -9.624387 2.729340 +v 2.931346 -9.624387 1.608660 +v 2.521149 -9.624387 0.077784 +v 2.931345 -9.624387 -1.453093 +v 4.052025 -9.624387 -2.573773 +v 5.582901 -9.624387 -2.983971 +v 7.113779 -9.624387 -2.573775 +v 8.234459 -9.624387 -1.453096 +v 8.644657 0.152815 0.077782 +v 8.234460 0.152815 1.608659 +v 7.113780 0.152815 2.729339 +v 5.582903 0.152815 3.139536 +v 4.052026 0.152815 2.729339 +v 2.931346 0.152815 1.608659 +v 2.521149 0.152815 0.077782 +v 2.931345 0.152815 -1.453095 +v 4.052025 0.152814 -2.573775 +v 5.582901 0.152814 -2.983973 +v 7.113779 0.152814 -2.573776 +v 8.234459 0.152815 -1.453097 +v 8.540331 0.945256 0.077782 +v 8.144110 0.945256 1.556495 +v 7.061616 0.945256 2.638989 +v 5.582903 0.945256 3.035209 +v 4.104189 0.945256 2.638989 +v 3.021696 0.945256 1.556496 +v 2.625475 0.945256 0.077782 +v 3.021695 0.945255 -1.400932 +v 4.104188 0.945255 -2.483425 +v 5.582901 0.945255 -2.879646 +v 7.061615 0.945255 -2.483427 +v 8.144110 0.945255 -1.400934 +v 8.234460 1.683692 0.077781 +v 7.879219 1.683692 1.403560 +v 6.908681 1.683692 2.374097 +v 5.582903 1.683692 2.729339 +v 4.257124 1.683692 2.374097 +v 3.286587 1.683692 1.403560 +v 2.931346 1.683692 0.077782 +v 3.286587 1.683691 -1.247997 +v 4.257123 1.683691 -2.218534 +v 5.582901 1.683691 -2.573776 +v 6.908680 1.683691 -2.218535 +v 7.879218 1.683691 -1.247999 +v 7.747890 2.317802 0.077781 +v 7.457837 2.317802 1.160275 +v 6.665397 2.317802 1.952715 +v 5.582903 2.317802 2.242769 +v 4.500409 2.317802 1.952715 +v 3.707969 2.317802 1.160275 +v 3.417916 2.317802 0.077782 +v 3.707969 2.317801 -1.004712 +v 4.500409 2.317801 -1.797152 +v 5.582902 2.317801 -2.087206 +v 6.665395 2.317801 -1.797153 +v 7.457836 2.317801 -1.004714 +v 7.113780 2.804371 0.077781 +v 6.908681 2.804372 0.843220 +v 6.348341 2.804372 1.403560 +v 5.582903 2.804372 1.608658 +v 4.817464 2.804372 1.403560 +v 4.257124 2.804372 0.843220 +v 4.052026 2.804371 0.077781 +v 4.257124 2.804371 -0.687657 +v 4.817464 2.804371 -1.247997 +v 5.582902 2.804371 -1.453096 +v 6.348341 2.804371 -1.247998 +v 6.908681 2.804371 -0.687658 +v 6.375343 3.110242 0.077781 +v 6.269176 3.110243 0.474001 +v 5.979123 3.110243 0.764055 +v 5.582903 3.110243 0.870222 +v 5.186683 3.110243 0.764055 +v 4.896629 3.110242 0.474001 +v 4.790462 3.110242 0.077781 +v 4.896629 3.110242 -0.318439 +v 5.186683 3.110242 -0.608492 +v 5.582902 3.110242 -0.714659 +v 5.979123 3.110242 -0.608492 +v 6.269176 3.110242 -0.318439 +v 5.582903 3.214569 0.077781 +# 146 vertices + +vt 0.500000 0.500000 0.000000 +vt 0.629410 0.500000 0.000000 +vt 0.612072 0.564705 0.000000 +vt 0.564705 0.612072 0.000000 +vt 0.500000 0.629410 0.000000 +vt 0.435295 0.612072 0.000000 +vt 0.387928 0.564705 0.000000 +vt 0.370590 0.500000 0.000000 +vt 0.387928 0.435295 0.000000 +vt 0.435295 0.387928 0.000000 +vt 0.500000 0.370590 0.000000 +vt 0.564705 0.387928 0.000000 +vt 0.612072 0.435295 0.000000 +vt 0.750000 0.500000 0.000000 +vt 0.716506 0.625000 0.000000 +vt 0.625000 0.716506 0.000000 +vt 0.500000 0.750000 0.000000 +vt 0.375000 0.716506 0.000000 +vt 0.283494 0.625000 0.000000 +vt 0.250000 0.500000 0.000000 +vt 0.283494 0.375000 0.000000 +vt 0.375000 0.283494 0.000000 +vt 0.500000 0.250000 0.000000 +vt 0.625000 0.283494 0.000000 +vt 0.716506 0.375000 0.000000 +vt 0.853553 0.500000 0.000000 +vt 0.806186 0.676777 0.000000 +vt 0.676777 0.806186 0.000000 +vt 0.500000 0.853553 0.000000 +vt 0.323223 0.806186 0.000000 +vt 0.193814 0.676777 0.000000 +vt 0.146447 0.500000 0.000000 +vt 0.193814 0.323223 0.000000 +vt 0.323223 0.193814 0.000000 +vt 0.500000 0.146447 0.000000 +vt 0.676777 0.193814 0.000000 +vt 0.806186 0.323223 0.000000 +vt 0.933013 0.500000 0.000000 +vt 0.875000 0.716506 0.000000 +vt 0.716506 0.875000 0.000000 +vt 0.500000 0.933013 0.000000 +vt 0.283494 0.875000 0.000000 +vt 0.125000 0.716506 0.000000 +vt 0.066987 0.500000 0.000000 +vt 0.125000 0.283494 0.000000 +vt 0.283494 0.125000 0.000000 +vt 0.500000 0.066987 0.000000 +vt 0.716506 0.125000 0.000000 +vt 0.875000 0.283493 0.000000 +vt 0.982963 0.500000 0.000000 +vt 0.918258 0.741481 0.000000 +vt 0.741481 0.918258 0.000000 +vt 0.500000 0.982963 0.000000 +vt 0.258519 0.918258 0.000000 +vt 0.081742 0.741481 0.000000 +vt 0.017037 0.500000 0.000000 +vt 0.081742 0.258519 0.000000 +vt 0.258518 0.081742 0.000000 +vt 0.500000 0.017037 0.000000 +vt 0.741481 0.081742 0.000000 +vt 0.918258 0.258518 0.000000 +vt 1.000000 0.500000 0.000000 +vt 0.933013 0.750000 0.000000 +vt 0.750000 0.933013 0.000000 +vt 0.500000 1.000000 0.000000 +vt 0.250000 0.933013 0.000000 +vt 0.066987 0.750000 0.000000 +vt 0.000000 0.500000 0.000000 +vt 0.066987 0.250000 0.000000 +vt 0.250000 0.066987 0.000000 +vt 0.500000 0.000000 0.000000 +vt 0.750000 0.066987 0.000000 +vt 0.933013 0.250000 0.000000 +vt 0.000000 1.000000 0.000000 +vt 0.000000 0.000000 0.000000 +vt 0.083333 0.000000 0.000000 +vt 0.083333 1.000000 0.000000 +vt 0.166667 0.000000 0.000000 +vt 0.166667 1.000000 0.000000 +vt 0.250000 0.000000 0.000000 +vt 0.250000 1.000000 0.000000 +vt 0.333333 0.000000 0.000000 +vt 0.333333 1.000000 0.000000 +vt 0.416667 0.000000 0.000000 +vt 0.416667 1.000000 0.000000 +vt 0.583333 0.000000 0.000000 +vt 0.583333 1.000000 0.000000 +vt 0.666667 0.000000 0.000000 +vt 0.666667 1.000000 0.000000 +vt 0.750000 0.000000 0.000000 +vt 0.750000 1.000000 0.000000 +vt 0.833333 0.000000 0.000000 +vt 0.833333 1.000000 0.000000 +vt 0.916667 0.000000 0.000000 +vt 0.916667 1.000000 0.000000 +vt 1.000000 0.000000 0.000000 +vt 1.000000 1.000000 0.000000 +# 97 texture coords + +g Capsule004 +usemtl wire_061135006 +f -146/-97 -145/-96 -144/-95 +f -146/-97 -144/-95 -143/-94 +f -146/-97 -143/-94 -142/-93 +f -146/-97 -142/-93 -141/-92 +f -146/-97 -141/-92 -140/-91 +f -146/-97 -140/-91 -139/-90 +f -146/-97 -139/-90 -138/-89 +f -146/-97 -138/-89 -137/-88 +f -146/-97 -137/-88 -136/-87 +f -146/-97 -136/-87 -135/-86 +f -146/-97 -135/-86 -134/-85 +f -146/-97 -134/-85 -145/-96 +f -145/-96 -133/-84 -132/-83 -144/-95 +f -144/-95 -132/-83 -131/-82 -143/-94 +f -143/-94 -131/-82 -130/-81 -142/-93 +f -142/-93 -130/-81 -129/-80 -141/-92 +f -141/-92 -129/-80 -128/-79 -140/-91 +f -140/-91 -128/-79 -127/-78 -139/-90 +f -139/-90 -127/-78 -126/-77 -138/-89 +f -138/-89 -126/-77 -125/-76 -137/-88 +f -137/-88 -125/-76 -124/-75 -136/-87 +f -136/-87 -124/-75 -123/-74 -135/-86 +f -135/-86 -123/-74 -122/-73 -134/-85 +f -134/-85 -122/-73 -133/-84 -145/-96 +f -133/-84 -121/-72 -120/-71 -132/-83 +f -132/-83 -120/-71 -119/-70 -131/-82 +f -131/-82 -119/-70 -118/-69 -130/-81 +f -130/-81 -118/-69 -117/-68 -129/-80 +f -129/-80 -117/-68 -116/-67 -128/-79 +f -128/-79 -116/-67 -115/-66 -127/-78 +f -127/-78 -115/-66 -114/-65 -126/-77 +f -126/-77 -114/-65 -113/-64 -125/-76 +f -125/-76 -113/-64 -112/-63 -124/-75 +f -124/-75 -112/-63 -111/-62 -123/-74 +f -123/-74 -111/-62 -110/-61 -122/-73 +f -122/-73 -110/-61 -121/-72 -133/-84 +f -121/-72 -109/-60 -108/-59 -120/-71 +f -120/-71 -108/-59 -107/-58 -119/-70 +f -119/-70 -107/-58 -106/-57 -118/-69 +f -118/-69 -106/-57 -105/-56 -117/-68 +f -117/-68 -105/-56 -104/-55 -116/-67 +f -116/-67 -104/-55 -103/-54 -115/-66 +f -115/-66 -103/-54 -102/-53 -114/-65 +f -114/-65 -102/-53 -101/-52 -113/-64 +f -113/-64 -101/-52 -100/-51 -112/-63 +f -112/-63 -100/-51 -99/-50 -111/-62 +f -111/-62 -99/-50 -98/-49 -110/-61 +f -110/-61 -98/-49 -109/-60 -121/-72 +f -109/-60 -97/-48 -96/-47 -108/-59 +f -108/-59 -96/-47 -95/-46 -107/-58 +f -107/-58 -95/-46 -94/-45 -106/-57 +f -106/-57 -94/-45 -93/-44 -105/-56 +f -105/-56 -93/-44 -92/-43 -104/-55 +f -104/-55 -92/-43 -91/-42 -103/-54 +f -103/-54 -91/-42 -90/-41 -102/-53 +f -102/-53 -90/-41 -89/-40 -101/-52 +f -101/-52 -89/-40 -88/-39 -100/-51 +f -100/-51 -88/-39 -87/-38 -99/-50 +f -99/-50 -87/-38 -86/-37 -98/-49 +f -98/-49 -86/-37 -97/-48 -109/-60 +f -97/-48 -85/-36 -84/-35 -96/-47 +f -96/-47 -84/-35 -83/-34 -95/-46 +f -95/-46 -83/-34 -82/-33 -94/-45 +f -94/-45 -82/-33 -81/-32 -93/-44 +f -93/-44 -81/-32 -80/-31 -92/-43 +f -92/-43 -80/-31 -79/-30 -91/-42 +f -91/-42 -79/-30 -78/-29 -90/-41 +f -90/-41 -78/-29 -77/-28 -89/-40 +f -89/-40 -77/-28 -76/-27 -88/-39 +f -88/-39 -76/-27 -75/-26 -87/-38 +f -87/-38 -75/-26 -74/-25 -86/-37 +f -86/-37 -74/-25 -85/-36 -97/-48 +f -85/-24 -73/-23 -72/-22 -84/-21 +f -84/-21 -72/-22 -71/-20 -83/-19 +f -83/-19 -71/-20 -70/-18 -82/-17 +f -82/-17 -70/-18 -69/-16 -81/-15 +f -81/-15 -69/-16 -68/-14 -80/-13 +f -80/-13 -68/-14 -67/-27 -79/-33 +f -79/-33 -67/-27 -66/-12 -78/-11 +f -78/-11 -66/-12 -65/-10 -77/-9 +f -77/-9 -65/-10 -64/-8 -76/-7 +f -76/-7 -64/-8 -63/-6 -75/-5 +f -75/-5 -63/-6 -62/-4 -74/-3 +f -74/-3 -62/-4 -73/-2 -85/-1 +f -73/-36 -61/-48 -60/-47 -72/-35 +f -72/-35 -60/-47 -59/-46 -71/-34 +f -71/-34 -59/-46 -58/-45 -70/-33 +f -70/-33 -58/-45 -57/-44 -69/-32 +f -69/-32 -57/-44 -56/-43 -68/-31 +f -68/-31 -56/-43 -55/-42 -67/-30 +f -67/-30 -55/-42 -54/-41 -66/-29 +f -66/-29 -54/-41 -53/-40 -65/-28 +f -65/-28 -53/-40 -52/-39 -64/-27 +f -64/-27 -52/-39 -51/-38 -63/-26 +f -63/-26 -51/-38 -50/-37 -62/-25 +f -62/-25 -50/-37 -61/-48 -73/-36 +f -61/-48 -49/-60 -48/-59 -60/-47 +f -60/-47 -48/-59 -47/-58 -59/-46 +f -59/-46 -47/-58 -46/-57 -58/-45 +f -58/-45 -46/-57 -45/-56 -57/-44 +f -57/-44 -45/-56 -44/-55 -56/-43 +f -56/-43 -44/-55 -43/-54 -55/-42 +f -55/-42 -43/-54 -42/-53 -54/-41 +f -54/-41 -42/-53 -41/-52 -53/-40 +f -53/-40 -41/-52 -40/-51 -52/-39 +f -52/-39 -40/-51 -39/-50 -51/-38 +f -51/-38 -39/-50 -38/-49 -50/-37 +f -50/-37 -38/-49 -49/-60 -61/-48 +f -49/-60 -37/-72 -36/-71 -48/-59 +f -48/-59 -36/-71 -35/-70 -47/-58 +f -47/-58 -35/-70 -34/-69 -46/-57 +f -46/-57 -34/-69 -33/-68 -45/-56 +f -45/-56 -33/-68 -32/-67 -44/-55 +f -44/-55 -32/-67 -31/-66 -43/-54 +f -43/-54 -31/-66 -30/-65 -42/-53 +f -42/-53 -30/-65 -29/-64 -41/-52 +f -41/-52 -29/-64 -28/-63 -40/-51 +f -40/-51 -28/-63 -27/-62 -39/-50 +f -39/-50 -27/-62 -26/-61 -38/-49 +f -38/-49 -26/-61 -37/-72 -49/-60 +f -37/-72 -25/-84 -24/-83 -36/-71 +f -36/-71 -24/-83 -23/-82 -35/-70 +f -35/-70 -23/-82 -22/-81 -34/-69 +f -34/-69 -22/-81 -21/-80 -33/-68 +f -33/-68 -21/-80 -20/-79 -32/-67 +f -32/-67 -20/-79 -19/-78 -31/-66 +f -31/-66 -19/-78 -18/-77 -30/-65 +f -30/-65 -18/-77 -17/-76 -29/-64 +f -29/-64 -17/-76 -16/-75 -28/-63 +f -28/-63 -16/-75 -15/-74 -27/-62 +f -27/-62 -15/-74 -14/-73 -26/-61 +f -26/-61 -14/-73 -25/-84 -37/-72 +f -25/-84 -13/-96 -12/-95 -24/-83 +f -24/-83 -12/-95 -11/-94 -23/-82 +f -23/-82 -11/-94 -10/-93 -22/-81 +f -22/-81 -10/-93 -9/-92 -21/-80 +f -21/-80 -9/-92 -8/-91 -20/-79 +f -20/-79 -8/-91 -7/-90 -19/-78 +f -19/-78 -7/-90 -6/-89 -18/-77 +f -18/-77 -6/-89 -5/-88 -17/-76 +f -17/-76 -5/-88 -4/-87 -16/-75 +f -16/-75 -4/-87 -3/-86 -15/-74 +f -15/-74 -3/-86 -2/-85 -14/-73 +f -14/-73 -2/-85 -13/-96 -25/-84 +f -13/-96 -1/-97 -12/-95 +f -12/-95 -1/-97 -11/-94 +f -11/-94 -1/-97 -10/-93 +f -10/-93 -1/-97 -9/-92 +f -9/-92 -1/-97 -8/-91 +f -8/-91 -1/-97 -7/-90 +f -7/-90 -1/-97 -6/-89 +f -6/-89 -1/-97 -5/-88 +f -5/-88 -1/-97 -4/-87 +f -4/-87 -1/-97 -3/-86 +f -3/-86 -1/-97 -2/-85 +f -2/-85 -1/-97 -13/-96 +# 132 polygons - 24 triangles + +# +# object Cone001 +# + +v -4.288633 38.313835 -0.338368 +v -3.968240 38.430450 -0.535219 +v -3.931282 38.443901 -0.440266 +v -3.918676 38.448490 -0.338368 +v -4.103654 38.381161 -0.679323 +v -4.027034 38.409050 -0.616757 +v -4.288633 38.313835 -0.732069 +v -4.192881 38.348686 -0.718654 +v -4.473612 38.246510 -0.679323 +v -4.384386 38.278984 -0.718654 +v -4.609026 38.197220 -0.535219 +v -4.550233 38.218620 -0.616757 +v -4.658591 38.179180 -0.338369 +v -4.645985 38.183769 -0.440266 +v -4.609026 38.197220 -0.141518 +v -4.645985 38.183769 -0.236471 +v -4.473612 38.246510 0.002586 +v -4.550233 38.218620 -0.059980 +v -4.288633 38.313835 0.055332 +v -4.384386 38.278984 0.041917 +v -4.103655 38.381161 0.002587 +v -4.192882 38.348686 0.041917 +v -3.968241 38.430450 -0.141518 +v -4.027034 38.409050 -0.059980 +v -3.931282 38.443901 -0.236471 +v -6.624353 45.843056 -0.440266 +v -6.611748 45.847645 -0.338368 +v -6.661312 45.829605 -0.535219 +v -6.720106 45.808205 -0.616757 +v -6.796726 45.780315 -0.679323 +v -6.885953 45.747841 -0.718654 +v -6.981705 45.712990 -0.732069 +v -7.077457 45.678139 -0.718654 +v -7.166684 45.645664 -0.679323 +v -7.243305 45.617775 -0.616757 +v -7.302098 45.596375 -0.535219 +v -7.339057 45.582924 -0.440266 +v -7.351663 45.578335 -0.338369 +v -7.339057 45.582924 -0.236471 +v -7.302098 45.596375 -0.141518 +v -7.243305 45.617775 -0.059980 +v -7.166684 45.645664 0.002586 +v -7.077457 45.678139 0.041917 +v -6.981706 45.712990 0.055332 +v -6.885953 45.747841 0.041917 +v -6.796726 45.780315 0.002587 +v -6.720106 45.808205 -0.059980 +v -6.661313 45.829605 -0.141518 +v -6.624353 45.843056 -0.236471 +v -6.981705 45.712990 -0.338368 +# 50 vertices + +vt 0.500000 0.000000 0.000000 +vt 0.833333 0.000000 1.000000 +vt 0.791667 0.000000 1.000000 +vt 0.750000 0.000000 1.000000 +vt 0.916667 0.000000 1.000000 +vt 0.875000 0.000000 1.000000 +vt 1.000000 0.000000 1.000000 +vt 0.958333 0.000000 1.000000 +vt 0.083333 0.000000 1.000000 +vt 0.041667 0.000000 1.000000 +vt -0.000000 0.000000 1.000000 +vt 0.166667 0.000000 1.000000 +vt 0.125000 0.000000 1.000000 +vt 0.250000 0.000000 1.000000 +vt 0.208333 0.000000 1.000000 +vt 0.333333 0.000000 1.000000 +vt 0.291667 0.000000 1.000000 +vt 0.416667 0.000000 1.000000 +vt 0.375000 0.000000 1.000000 +vt 0.500000 0.000000 1.000000 +vt 0.458333 0.000000 1.000000 +vt 0.583333 0.000000 1.000000 +vt 0.541667 0.000000 1.000000 +vt 0.666667 0.000000 1.000000 +vt 0.625000 0.000000 1.000000 +vt 0.708333 0.000000 1.000000 +vt 0.791667 1.000000 1.000000 +vt 0.750000 1.000000 1.000000 +vt 0.833333 1.000000 1.000000 +vt 0.875000 1.000000 1.000000 +vt 0.916667 1.000000 1.000000 +vt 0.958333 1.000000 1.000000 +vt 1.000000 1.000000 1.000000 +vt 0.041667 1.000000 1.000000 +vt -0.000000 1.000000 1.000000 +vt 0.083333 1.000000 1.000000 +vt 0.125000 1.000000 1.000000 +vt 0.166667 1.000000 1.000000 +vt 0.208333 1.000000 1.000000 +vt 0.250000 1.000000 1.000000 +vt 0.291667 1.000000 1.000000 +vt 0.333333 1.000000 1.000000 +vt 0.375000 1.000000 1.000000 +vt 0.416667 1.000000 1.000000 +vt 0.458333 1.000000 1.000000 +vt 0.500000 1.000000 1.000000 +vt 0.541667 1.000000 1.000000 +vt 0.583333 1.000000 1.000000 +vt 0.625000 1.000000 1.000000 +vt 0.666667 1.000000 1.000000 +vt 0.708333 1.000000 1.000000 +vt 0.500000 1.000000 0.000000 +vt 1.007592 1.000000 0.931852 +# 53 texture coords + +g Cone001 +usemtl wire_061135006 +f -50/-53 -49/-52 -48/-51 -47/-50 +f -50/-53 -46/-49 -45/-48 -49/-52 +f -50/-53 -44/-47 -43/-46 -46/-49 +f -50/-53 -42/-45 -41/-44 -44/-43 +f -50/-53 -40/-42 -39/-41 -42/-45 +f -50/-53 -38/-40 -37/-39 -40/-42 +f -50/-53 -36/-38 -35/-37 -38/-40 +f -50/-53 -34/-36 -33/-35 -36/-38 +f -50/-53 -32/-34 -31/-33 -34/-36 +f -50/-53 -30/-32 -29/-31 -32/-34 +f -50/-53 -28/-30 -27/-29 -30/-32 +f -50/-53 -47/-50 -26/-28 -28/-30 +f -47/-50 -48/-51 -25/-27 -24/-26 +f -48/-51 -49/-52 -23/-25 -25/-27 +f -49/-52 -45/-48 -22/-24 -23/-25 +f -45/-48 -46/-49 -21/-23 -22/-24 +f -46/-49 -43/-46 -20/-22 -21/-23 +f -43/-46 -44/-47 -19/-21 -20/-22 +f -44/-43 -41/-44 -18/-20 -19/-19 +f -41/-44 -42/-45 -17/-18 -18/-20 +f -42/-45 -39/-41 -16/-17 -17/-18 +f -39/-41 -40/-42 -15/-16 -16/-17 +f -40/-42 -37/-39 -14/-15 -15/-16 +f -37/-39 -38/-40 -13/-14 -14/-15 +f -38/-40 -35/-37 -12/-13 -13/-14 +f -35/-37 -36/-38 -11/-12 -12/-13 +f -36/-38 -33/-35 -10/-11 -11/-12 +f -33/-35 -34/-36 -9/-10 -10/-11 +f -34/-36 -31/-33 -8/-9 -9/-10 +f -31/-33 -32/-34 -7/-8 -8/-9 +f -32/-34 -29/-31 -6/-7 -7/-8 +f -29/-31 -30/-32 -5/-6 -6/-7 +f -30/-32 -27/-29 -4/-5 -5/-6 +f -27/-29 -28/-30 -3/-4 -4/-5 +f -28/-30 -26/-28 -2/-3 -3/-4 +f -26/-28 -47/-50 -24/-26 -2/-3 +f -1/-2 -2/-3 -24/-26 -25/-27 +f -1/-2 -25/-27 -23/-25 -22/-24 +f -1/-2 -22/-24 -21/-23 -20/-22 +f -1/-2 -20/-22 -19/-21 -18/-1 +f -1/-2 -18/-20 -17/-18 -16/-17 +f -1/-2 -16/-17 -15/-16 -14/-15 +f -1/-2 -14/-15 -13/-14 -12/-13 +f -1/-2 -12/-13 -11/-12 -10/-11 +f -1/-2 -10/-11 -9/-10 -8/-9 +f -1/-2 -8/-9 -7/-8 -6/-7 +f -1/-2 -6/-7 -5/-6 -4/-5 +f -1/-2 -4/-5 -3/-4 -2/-3 +# 48 polygons + +# +# object Cone002 +# + +v 4.011661 38.313835 -0.338368 +v 3.691268 38.430450 -0.535219 +v 3.654309 38.443901 -0.440266 +v 3.641703 38.448490 -0.338368 +v 3.826682 38.381161 -0.679323 +v 3.750061 38.409050 -0.616757 +v 4.011661 38.313835 -0.732069 +v 3.915909 38.348686 -0.718654 +v 4.196640 38.246510 -0.679323 +v 4.107413 38.278984 -0.718654 +v 4.332053 38.197220 -0.535219 +v 4.273260 38.218620 -0.616757 +v 4.381618 38.179180 -0.338369 +v 4.369012 38.183769 -0.440266 +v 4.332053 38.197220 -0.141518 +v 4.369012 38.183769 -0.236471 +v 4.196640 38.246510 0.002586 +v 4.273260 38.218620 -0.059980 +v 4.011661 38.313835 0.055332 +v 4.107413 38.278984 0.041917 +v 3.826682 38.381161 0.002587 +v 3.915909 38.348686 0.041917 +v 3.691268 38.430450 -0.141518 +v 3.750061 38.409050 -0.059980 +v 3.654309 38.443901 -0.236471 +v 6.347381 45.843056 -0.440266 +v 6.334775 45.847641 -0.338368 +v 6.384340 45.829601 -0.535219 +v 6.443133 45.808205 -0.616757 +v 6.519754 45.780315 -0.679323 +v 6.608981 45.747841 -0.718654 +v 6.704733 45.712990 -0.732069 +v 6.800485 45.678139 -0.718654 +v 6.889711 45.645664 -0.679323 +v 6.966332 45.617775 -0.616757 +v 7.025126 45.596375 -0.535219 +v 7.062084 45.582924 -0.440266 +v 7.074690 45.578335 -0.338369 +v 7.062084 45.582924 -0.236471 +v 7.025126 45.596375 -0.141518 +v 6.966332 45.617775 -0.059980 +v 6.889711 45.645660 0.002586 +v 6.800485 45.678139 0.041917 +v 6.704733 45.712990 0.055332 +v 6.608981 45.747841 0.041917 +v 6.519754 45.780315 0.002587 +v 6.443133 45.808205 -0.059980 +v 6.384340 45.829601 -0.141518 +v 6.347381 45.843056 -0.236471 +v 6.704733 45.712990 -0.338368 +# 50 vertices + +vt 0.500000 0.000000 0.000000 +vt 0.833333 0.000000 1.000000 +vt 0.791667 0.000000 1.000000 +vt 0.750000 0.000000 1.000000 +vt 0.916667 0.000000 1.000000 +vt 0.875000 0.000000 1.000000 +vt 1.000000 0.000000 1.000000 +vt 0.958333 0.000000 1.000000 +vt 0.083333 0.000000 1.000000 +vt 0.041667 0.000000 1.000000 +vt -0.000000 0.000000 1.000000 +vt 0.166667 0.000000 1.000000 +vt 0.125000 0.000000 1.000000 +vt 0.250000 0.000000 1.000000 +vt 0.208333 0.000000 1.000000 +vt 0.333333 0.000000 1.000000 +vt 0.291667 0.000000 1.000000 +vt 0.416667 0.000000 1.000000 +vt 0.375000 0.000000 1.000000 +vt 0.500000 0.000000 1.000000 +vt 0.458333 0.000000 1.000000 +vt 0.583333 0.000000 1.000000 +vt 0.541667 0.000000 1.000000 +vt 0.666667 0.000000 1.000000 +vt 0.625000 0.000000 1.000000 +vt 0.708333 0.000000 1.000000 +vt 0.791667 1.000000 1.000000 +vt 0.750000 1.000000 1.000000 +vt 0.833333 1.000000 1.000000 +vt 0.875000 1.000000 1.000000 +vt 0.916667 1.000000 1.000000 +vt 0.958333 1.000000 1.000000 +vt 1.000000 1.000000 1.000000 +vt 0.041667 1.000000 1.000000 +vt -0.000000 1.000000 1.000000 +vt 0.083333 1.000000 1.000000 +vt 0.125000 1.000000 1.000000 +vt 0.166667 1.000000 1.000000 +vt 0.208333 1.000000 1.000000 +vt 0.250000 1.000000 1.000000 +vt 0.291667 1.000000 1.000000 +vt 0.333333 1.000000 1.000000 +vt 0.375000 1.000000 1.000000 +vt 0.416667 1.000000 1.000000 +vt 0.458333 1.000000 1.000000 +vt 0.500000 1.000000 1.000000 +vt 0.541667 1.000000 1.000000 +vt 0.583333 1.000000 1.000000 +vt 0.625000 1.000000 1.000000 +vt 0.666667 1.000000 1.000000 +vt 0.708333 1.000000 1.000000 +vt 0.500000 1.000000 0.000000 +vt 1.007592 1.000000 0.931852 +# 53 texture coords + +g Cone002 +usemtl wire_061135006 +f -47/-50 -48/-51 -49/-52 -50/-53 +f -49/-52 -45/-48 -46/-49 -50/-53 +f -46/-49 -43/-46 -44/-47 -50/-53 +f -44/-43 -41/-44 -42/-45 -50/-53 +f -42/-45 -39/-41 -40/-42 -50/-53 +f -40/-42 -37/-39 -38/-40 -50/-53 +f -38/-40 -35/-37 -36/-38 -50/-53 +f -36/-38 -33/-35 -34/-36 -50/-53 +f -34/-36 -31/-33 -32/-34 -50/-53 +f -32/-34 -29/-31 -30/-32 -50/-53 +f -30/-32 -27/-29 -28/-30 -50/-53 +f -28/-30 -26/-28 -47/-50 -50/-53 +f -24/-26 -25/-27 -48/-51 -47/-50 +f -25/-27 -23/-25 -49/-52 -48/-51 +f -23/-25 -22/-24 -45/-48 -49/-52 +f -22/-24 -21/-23 -46/-49 -45/-48 +f -21/-23 -20/-22 -43/-46 -46/-49 +f -20/-22 -19/-21 -44/-47 -43/-46 +f -19/-19 -18/-20 -41/-44 -44/-43 +f -18/-20 -17/-18 -42/-45 -41/-44 +f -17/-18 -16/-17 -39/-41 -42/-45 +f -16/-17 -15/-16 -40/-42 -39/-41 +f -15/-16 -14/-15 -37/-39 -40/-42 +f -14/-15 -13/-14 -38/-40 -37/-39 +f -13/-14 -12/-13 -35/-37 -38/-40 +f -12/-13 -11/-12 -36/-38 -35/-37 +f -11/-12 -10/-11 -33/-35 -36/-38 +f -10/-11 -9/-10 -34/-36 -33/-35 +f -9/-10 -8/-9 -31/-33 -34/-36 +f -8/-9 -7/-8 -32/-34 -31/-33 +f -7/-8 -6/-7 -29/-31 -32/-34 +f -6/-7 -5/-6 -30/-32 -29/-31 +f -5/-6 -4/-5 -27/-29 -30/-32 +f -4/-5 -3/-4 -28/-30 -27/-29 +f -3/-4 -2/-3 -26/-28 -28/-30 +f -2/-3 -24/-26 -47/-50 -26/-28 +f -25/-27 -24/-26 -2/-3 -1/-2 +f -22/-24 -23/-25 -25/-27 -1/-2 +f -20/-22 -21/-23 -22/-24 -1/-2 +f -18/-1 -19/-21 -20/-22 -1/-2 +f -16/-17 -17/-18 -18/-20 -1/-2 +f -14/-15 -15/-16 -16/-17 -1/-2 +f -12/-13 -13/-14 -14/-15 -1/-2 +f -10/-11 -11/-12 -12/-13 -1/-2 +f -8/-9 -9/-10 -10/-11 -1/-2 +f -6/-7 -7/-8 -8/-9 -1/-2 +f -4/-5 -5/-6 -6/-7 -1/-2 +f -2/-3 -3/-4 -4/-5 -1/-2 +# 48 polygons + +# +# object Sphere003 +# + +v -2.838986 29.298233 13.172821 +v -0.014875 29.323645 13.430870 +v -0.014876 28.000938 13.495848 +v -2.838986 28.000938 13.236551 +v -2.838984 30.583031 12.982239 +v -0.014875 30.633615 13.236553 +v -2.838984 31.842964 12.666641 +v -0.014878 31.918234 12.914772 +v -2.838983 33.065899 12.229069 +v -0.014876 33.165123 12.468628 +v -2.838983 34.240047 11.673737 +v -0.014876 34.362282 11.902412 +v -2.838983 35.354118 11.005989 +v -0.014875 35.498173 11.221586 +v -2.838983 36.397369 10.232260 +v -0.014876 36.561863 10.432699 +v -2.838982 37.359756 9.359999 +v -0.014876 37.543110 9.543348 +v -2.838981 38.232018 8.397608 +v -0.014875 38.432457 8.562103 +v -2.838981 39.005745 7.354355 +v -0.014876 39.221344 7.498413 +v -2.838980 39.673492 6.240289 +v -0.014875 39.902172 6.362522 +v -2.838979 40.228825 5.066133 +v -0.014876 40.468384 5.165362 +v -2.838979 40.666397 3.843201 +v -0.014876 40.914528 3.918472 +v -2.838978 40.981991 2.583268 +v -0.014876 41.236305 2.633856 +v -2.838978 41.172573 1.298469 +v -0.014876 41.430622 1.323885 +v -2.838978 41.236305 0.001175 +v -0.014876 41.495602 0.001177 +v -2.838977 41.172573 -1.296120 +v -0.014876 41.430618 -1.321533 +v -2.838976 40.981991 -2.580919 +v -0.014875 41.236301 -2.631503 +v -2.838977 40.666389 -3.840852 +v -0.014876 40.914520 -3.916119 +v -2.838976 40.228821 -5.063783 +v -0.014875 40.468376 -5.163010 +v -2.838976 39.673485 -6.237936 +v -0.014875 39.902164 -6.360167 +v -2.838975 39.005737 -7.352003 +v -0.014876 39.221333 -7.496058 +v -2.838975 38.232006 -8.395255 +v -0.014875 38.432446 -8.559749 +v -2.838975 37.359745 -9.357645 +v -0.014875 37.543095 -9.540993 +v -2.838975 36.397354 -10.229903 +v -0.014875 36.561848 -10.430340 +v -2.838975 35.354103 -11.003630 +v -0.014876 35.498161 -11.219224 +v -2.838975 34.240040 -11.671375 +v -0.014875 34.362270 -11.900051 +v -2.838975 33.065887 -12.226706 +v -0.014875 33.165115 -12.466262 +v -2.838975 31.842958 -12.664275 +v -0.014875 31.918226 -12.912404 +v -2.838976 30.583029 -12.979872 +v -0.014875 30.633614 -13.234182 +v -2.838975 29.298231 -13.170453 +v -0.014875 29.323647 -13.428498 +v -2.838976 28.000942 -13.234186 +v -0.014875 28.000940 -13.493479 +v -2.838981 28.000937 0.001184 +v -0.014875 28.000935 0.001185 +v -5.540255 29.222961 12.408596 +v -5.540256 28.000938 12.468628 +v -5.540257 30.433220 12.229071 +v -5.540255 31.620049 11.931786 +v -5.540255 32.772026 11.519598 +v -5.540255 33.878052 10.996487 +v -5.540255 34.927483 10.367483 +v -5.540253 35.910206 9.638645 +v -5.540253 36.816757 8.816996 +v -5.540253 37.638405 7.910442 +v -5.540252 38.367241 6.927720 +v -5.540251 38.996243 5.878290 +v -5.540252 39.519356 4.772263 +v -5.540249 39.931541 3.620285 +v -5.540250 40.228825 2.433454 +v -5.540249 40.408348 1.223200 +v -5.540249 40.468384 0.001174 +v -5.540248 40.408348 -1.220849 +v -5.540248 40.228821 -2.431104 +v -5.540248 39.931534 -3.617935 +v -5.540247 39.519352 -4.769912 +v -5.540246 38.996239 -5.875940 +v -5.540246 38.367233 -6.925367 +v -5.540246 37.638393 -7.908090 +v -5.540246 36.816746 -8.814641 +v -5.540246 35.910191 -9.636291 +v -5.540246 34.927471 -10.365125 +v -5.540246 33.878044 -10.994126 +v -5.540247 32.772018 -11.517237 +v -5.540247 31.620043 -11.929419 +v -5.540247 30.433214 -12.226704 +v -5.540247 29.222963 -12.406229 +v -5.540247 28.000942 -12.466262 +v -5.540252 28.000938 0.001184 +v -8.029764 29.100731 11.167559 +v -8.029762 28.000938 11.221588 +v -8.029762 30.189934 11.005989 +v -8.029762 31.258053 10.738440 +v -8.029762 32.294804 10.367483 +v -8.029762 33.290203 9.896694 +v -8.029761 34.234661 9.330606 +v -8.029760 35.119087 8.674669 +v -8.029760 35.934963 7.935204 +v -8.029760 36.674431 7.119328 +v -8.029760 37.330364 6.234901 +v -8.029760 37.896454 5.290441 +v -8.029758 38.367241 4.295040 +v -8.029758 38.738197 3.258287 +v -8.029757 39.005745 2.190168 +v -8.029757 39.167313 1.100967 +v -8.029757 39.221340 0.001175 +v -8.029757 39.167313 -1.098618 +v -8.029757 39.005745 -2.187819 +v -8.029756 38.738190 -3.255937 +v -8.029756 38.367237 -4.292689 +v -8.029755 37.896446 -5.288088 +v -8.029755 37.330357 -6.232549 +v -8.029755 36.674419 -7.116975 +v -5.874556 36.719986 -8.699161 +v -5.776183 36.644962 -8.835337 +v -5.677721 36.509327 -9.024755 +v -5.620145 36.346588 -9.211129 +v -5.635896 35.964390 -9.546896 +v -5.665436 35.881851 -9.601759 +v -5.605908 36.162674 -9.387430 +v -5.704070 35.753155 -9.673141 +v -7.853930 35.106289 -8.813749 +v -7.881163 35.177738 -8.743793 +v -8.029755 35.119076 -8.672314 +v -7.745790 34.958008 -8.991080 +v -7.600767 34.843121 -9.166622 +v -8.029755 34.234653 -9.328247 +v -7.424342 34.765919 -9.333773 +v -7.187137 34.729317 -9.486243 +v -7.004731 34.734730 -9.618279 +v -6.777306 34.782024 -9.724866 +v -6.549448 34.869514 -9.801908 +v -6.438649 34.932316 -9.824349 +v -6.330334 34.995010 -9.845322 +v -6.129253 35.153515 -9.853019 +v -5.953629 35.337608 -9.825881 +v -5.810112 35.540100 -9.765099 +v -8.029755 33.290192 -9.894333 +v -8.029755 32.294796 -10.365121 +v -8.029756 31.258047 -10.736074 +v -8.029755 30.189930 -11.003624 +v -8.029756 29.100731 -11.165192 +v -8.029756 28.000942 -11.219221 +v -8.029760 28.000938 0.001183 +v -10.211834 28.936237 9.497402 +v -10.211834 28.000938 9.543352 +v -10.211834 29.862524 9.360001 +v -10.211834 30.770887 9.132467 +v -10.211833 31.652571 8.816996 +v -10.211833 32.499088 8.416622 +v -10.211832 33.302284 7.935204 +v -10.211832 34.054428 7.377377 +v -10.211831 34.748272 6.748511 +v -10.211830 35.377136 6.054667 +v -10.211830 35.934963 5.302523 +v -10.211830 36.416382 4.499326 +v -10.211830 36.816753 3.652807 +v -10.211829 37.132225 2.771122 +v -10.211829 37.359756 1.862761 +v -10.211829 37.497158 0.936472 +v -10.211828 37.543106 0.001176 +v -10.211828 37.497158 -0.934121 +v -10.211828 37.359756 -1.860410 +v -10.211828 37.132221 -2.768770 +v -10.211827 36.816750 -3.650455 +v -10.211827 36.416374 -4.496973 +v -10.211826 35.934956 -5.300170 +v -10.211826 35.377129 -6.052313 +v -10.211826 34.748264 -6.746157 +v -8.029755 35.934956 -7.932849 +v -10.211826 34.054417 -7.375021 +v -10.211827 33.302277 -7.932847 +v -10.211827 32.499081 -8.414264 +v -10.211826 31.652565 -8.814633 +v -10.211827 30.770882 -9.130105 +v -10.211827 29.862522 -9.357636 +v -10.211827 28.936235 -9.495038 +v -10.211828 28.000940 -9.540986 +v -10.211831 28.000938 0.001183 +v -12.002613 28.735798 7.462315 +v -12.002615 28.000940 7.498417 +v -12.002612 29.463577 7.354359 +v -12.002613 30.177273 7.175587 +v -12.002613 30.870008 6.927721 +v -12.002612 31.535112 6.613152 +v -12.002612 32.166180 6.234903 +v -12.002612 32.757137 5.796619 +v -12.002611 33.302284 5.302525 +v -12.002611 33.796379 4.757374 +v -12.002611 34.234661 4.166419 +v -12.002611 34.612911 3.535350 +v -12.002609 34.927483 2.870246 +v -12.002611 35.175346 2.177511 +v -12.002609 35.354115 1.463815 +v -12.002609 35.462070 0.736034 +v -12.002609 35.498173 0.001177 +v -12.002609 35.462070 -0.733681 +v -12.002608 35.354115 -1.461461 +v -12.002609 35.175343 -2.175155 +v -12.002608 34.927479 -2.867890 +v -12.002609 34.612904 -3.532995 +v -12.002607 34.234657 -4.164063 +v -12.002607 33.796375 -4.755017 +v -12.002607 33.302277 -5.300168 +v -12.002607 32.757126 -5.794262 +v -12.002607 32.166172 -6.232543 +v -12.002607 31.535107 -6.610789 +v -12.002607 30.870003 -6.925360 +v -12.002607 30.177269 -7.173223 +v -12.002607 29.463575 -7.351994 +v -12.002608 28.735796 -7.459949 +v -12.002607 28.000942 -7.496050 +v -12.002611 28.000938 0.001183 +v -13.333282 28.507118 5.140497 +v -13.333281 28.000940 5.165364 +v -13.333281 29.008423 5.066135 +v -13.333281 29.500023 4.942996 +v -13.333282 29.977188 4.772264 +v -13.333281 30.435318 4.555584 +v -13.333281 30.870007 4.295041 +v -13.333281 31.277063 3.993148 +v -13.333281 31.652569 3.652810 +v -13.333281 31.992908 3.277304 +v -13.333280 32.294800 2.870246 +v -13.333279 32.555344 2.435558 +v -13.333280 32.772022 1.977427 +v -13.333279 32.942753 1.500262 +v -13.333279 33.065895 1.008661 +v -13.333279 33.140255 0.507357 +v -13.333279 33.165123 0.001179 +v -13.333279 33.140255 -0.505000 +v -13.333277 33.065891 -1.006304 +v -13.333278 32.942753 -1.497906 +v -13.333278 32.772018 -1.975069 +v -13.333278 32.555340 -2.433201 +v -13.333277 32.294796 -2.867888 +v -13.333277 31.992903 -3.274945 +v -13.333278 31.652565 -3.650450 +v -13.333277 31.277058 -3.990789 +v -13.333279 30.870003 -4.292682 +v -13.333277 30.435314 -4.553222 +v -13.333278 29.977184 -4.769902 +v -13.333277 29.500021 -4.940633 +v -13.333277 29.008421 -5.063772 +v -13.333277 28.507118 -5.138134 +v -13.333279 28.000942 -5.163001 +v -13.333281 28.000938 0.001182 +v -14.152702 28.258987 2.621181 +v -14.152702 28.000940 2.633858 +v -14.152702 28.514549 2.583271 +v -14.152702 28.765165 2.520494 +v -14.152702 29.008421 2.433456 +v -14.152702 29.241974 2.322994 +v -14.152702 29.463577 2.190170 +v -14.152701 29.671091 2.036266 +v -14.152700 29.862522 1.862763 +v -14.152702 30.036026 1.671332 +v -14.152700 30.189930 1.463818 +v -14.152701 30.322752 1.242214 +v -14.152700 30.433216 1.008663 +v -14.152700 30.520252 0.765406 +v -14.152700 30.583029 0.514790 +v -14.152700 30.620937 0.259228 +v -14.152700 30.633614 0.001181 +v -14.152700 30.620937 -0.256868 +v -14.152700 30.583027 -0.512429 +v -14.152700 30.520252 -0.763045 +v -14.152700 30.433212 -1.006301 +v -14.152700 30.322750 -1.239855 +v -14.152700 30.189928 -1.461456 +v -14.152700 30.036022 -1.668972 +v -14.152700 29.862520 -1.860402 +v -14.152700 29.671089 -2.033905 +v -14.152699 29.463573 -2.187809 +v -14.152700 29.241972 -2.320631 +v -14.152700 29.008419 -2.431094 +v -14.152700 28.765163 -2.518131 +v -14.152700 28.514549 -2.580907 +v -14.152700 28.258987 -2.618816 +v -14.152700 28.000940 -2.631493 +v -14.152700 28.000940 0.001182 +v -14.429386 28.000938 0.001183 +v -5.910089 36.744213 -8.645961 +v -6.073505 36.799519 -8.463193 +v -6.261092 36.820087 -8.300745 +v -6.466754 36.805706 -8.163392 +v -6.684082 36.756985 -8.055238 +v -6.906410 36.675323 -7.979704 +v -7.126854 36.562916 -7.939492 +v -7.217556 36.502827 -7.938217 +v -7.336671 36.420994 -7.939764 +v -7.526488 36.254768 -7.981750 +v -7.692381 36.068142 -8.064071 +v -7.915839 35.275753 -8.631546 +v -7.921110 35.343842 -8.566273 +v -7.926290 35.463200 -8.454599 +v -7.809702 35.869778 -8.164821 +v -7.889554 35.664185 -8.297242 +v 2.809234 29.298231 13.172821 +v 2.809233 28.000938 13.236553 +v 2.809232 30.583031 12.982239 +v 2.809231 31.842964 12.666641 +v 2.809231 33.065895 12.229071 +v 2.809229 34.240047 11.673737 +v 2.809230 35.354118 11.005991 +v 2.809230 36.397369 10.232262 +v 2.809230 37.359756 9.360001 +v 2.809229 38.232018 8.397610 +v 2.809229 39.005749 7.354355 +v 2.809228 39.673492 6.240289 +v 2.809227 40.228825 5.066135 +v 2.809227 40.666397 3.843204 +v 2.809226 40.981991 2.583269 +v 2.809226 41.172577 1.298470 +v 2.809226 41.236305 0.001177 +v 2.809226 41.172573 -1.296118 +v 2.809226 40.981991 -2.580917 +v 2.809227 40.666393 -3.840849 +v 2.809225 40.228821 -5.063781 +v 2.809224 39.673485 -6.237934 +v 2.809225 39.005737 -7.352001 +v 2.809225 38.232006 -8.395253 +v 2.809224 37.359749 -9.357643 +v 2.809224 36.397354 -10.229901 +v 2.809224 35.354103 -11.003628 +v 2.809224 34.240040 -11.671372 +v 2.809224 33.065887 -12.226704 +v 2.809224 31.842957 -12.664273 +v 2.809226 30.583027 -12.979872 +v 2.809224 29.298229 -13.170452 +v 2.809226 28.000940 -13.234184 +v 2.809229 28.000937 0.001184 +v 5.510503 29.222961 12.408594 +v 5.510502 28.000938 12.468626 +v 5.510504 30.433216 12.229069 +v 5.510503 31.620049 11.931782 +v 5.510502 32.772026 11.519598 +v 5.510502 33.878056 10.996487 +v 5.510501 34.927483 10.367483 +v 5.510500 35.910202 9.638645 +v 5.510501 36.816757 8.816998 +v 5.510501 37.638405 7.910444 +v 5.510499 38.367241 6.927720 +v 5.510499 38.996246 5.878292 +v 5.510499 39.519356 4.772264 +v 5.510498 39.931541 3.620287 +v 5.510499 40.228825 2.433455 +v 5.510497 40.408348 1.223200 +v 5.510497 40.468384 0.001175 +v 5.510497 40.408348 -1.220847 +v 5.510497 40.228821 -2.431102 +v 5.510497 39.931534 -3.617933 +v 5.510497 39.519352 -4.769910 +v 5.510496 38.996239 -5.875938 +v 5.510496 38.367233 -6.925366 +v 5.510495 37.638397 -7.908088 +v 5.510495 36.816742 -8.814640 +v 5.510495 35.910191 -9.636290 +v 5.510496 34.927471 -10.365123 +v 5.510495 33.878044 -10.994124 +v 5.510495 32.772018 -11.517235 +v 5.510497 31.620041 -11.929418 +v 5.510497 30.433212 -12.226704 +v 5.510497 29.222961 -12.406227 +v 5.510497 28.000940 -12.466261 +v 5.510500 28.000937 0.001184 +v 8.000011 29.100731 11.167559 +v 8.000010 28.000938 11.221588 +v 8.000011 30.189932 11.005989 +v 8.000010 31.258051 10.738440 +v 8.000010 32.294804 10.367483 +v 8.000010 33.290199 9.896694 +v 8.000010 34.234661 9.330606 +v 8.000010 35.119087 8.674671 +v 8.000010 35.934963 7.935204 +v 8.000008 36.674431 7.119328 +v 8.000006 37.330364 6.234901 +v 8.000008 37.896454 5.290440 +v 8.000006 38.367241 4.295041 +v 8.000006 38.738197 3.258288 +v 8.000004 39.005745 2.190169 +v 8.000006 39.167313 1.100969 +v 8.000004 39.221340 0.001177 +v 8.000004 39.167309 -1.098617 +v 8.000004 39.005741 -2.187817 +v 8.000002 38.738194 -3.255936 +v 8.000004 38.367233 -4.292687 +v 8.000004 37.896446 -5.288086 +v 8.000004 37.330357 -6.232547 +v 8.000004 36.674419 -7.116973 +v 5.635684 35.881851 -9.601757 +v 5.606145 35.964390 -9.546894 +v 5.576157 36.162674 -9.387428 +v 5.590394 36.346588 -9.211126 +v 5.647970 36.509327 -9.024753 +v 5.746432 36.644962 -8.835335 +v 5.844805 36.719986 -8.699159 +v 8.000004 35.119076 -8.672312 +v 7.851412 35.177738 -8.743793 +v 7.824180 35.106285 -8.813747 +v 7.716038 34.958008 -8.991079 +v 7.571016 34.843121 -9.166620 +v 8.000004 34.234653 -9.328245 +v 7.394590 34.765919 -9.333771 +v 7.157385 34.729317 -9.486242 +v 6.974979 34.734726 -9.618279 +v 6.747554 34.782021 -9.724864 +v 6.519698 34.869514 -9.801907 +v 6.408899 34.932316 -9.824348 +v 6.300583 34.995010 -9.845320 +v 6.099502 35.153515 -9.853016 +v 5.923878 35.337608 -9.825880 +v 5.780361 35.540100 -9.765097 +v 5.674319 35.753155 -9.673140 +v 8.000004 33.290192 -9.894332 +v 8.000004 32.294796 -10.365120 +v 8.000004 31.258045 -10.736074 +v 8.000002 30.189928 -11.003622 +v 8.000004 29.100731 -11.165192 +v 8.000004 28.000940 -11.219221 +v 8.000008 28.000937 0.001184 +v 10.182081 28.936235 9.497402 +v 10.182083 28.000938 9.543350 +v 10.182081 29.862524 9.360001 +v 10.182081 30.770885 9.132467 +v 10.182079 31.652569 8.816996 +v 10.182079 32.499088 8.416620 +v 10.182081 33.302284 7.935204 +v 10.182079 34.054428 7.377375 +v 10.182079 34.748272 6.748511 +v 10.182077 35.377136 6.054668 +v 10.182077 35.934963 5.302523 +v 10.182079 36.416382 4.499327 +v 10.182079 36.816753 3.652808 +v 10.182077 37.132225 2.771124 +v 10.182076 37.359756 1.862761 +v 10.182076 37.497162 0.936472 +v 10.182077 37.543106 0.001177 +v 10.182076 37.497158 -0.934120 +v 10.182076 37.359756 -1.860409 +v 10.182076 37.132221 -2.768770 +v 10.182076 36.816750 -3.650455 +v 10.182076 36.416374 -4.496970 +v 10.182076 35.934956 -5.300168 +v 10.182074 35.377129 -6.052311 +v 10.182076 34.748264 -6.746155 +v 8.000004 35.934952 -7.932847 +v 10.182076 34.054417 -7.375020 +v 10.182076 33.302277 -7.932846 +v 10.182076 32.499077 -8.414262 +v 10.182076 31.652563 -8.814632 +v 10.182076 30.770880 -9.130104 +v 10.182076 29.862522 -9.357635 +v 10.182076 28.936234 -9.495037 +v 10.182076 28.000938 -9.540985 +v 10.182079 28.000937 0.001182 +v 11.972860 28.735796 7.462313 +v 11.972860 28.000938 7.498417 +v 11.972860 29.463575 7.354357 +v 11.972858 30.177271 7.175585 +v 11.972860 30.870007 6.927723 +v 11.972858 31.535110 6.613152 +v 11.972860 32.166180 6.234903 +v 11.972860 32.757133 5.796619 +v 11.972858 33.302284 5.302526 +v 11.972858 33.796379 4.757374 +v 11.972858 34.234661 4.166421 +v 11.972858 34.612907 3.535351 +v 11.972858 34.927479 2.870245 +v 11.972858 35.175346 2.177511 +v 11.972858 35.354115 1.463816 +v 11.972857 35.462070 0.736034 +v 11.972855 35.498173 0.001178 +v 11.972855 35.462070 -0.733680 +v 11.972857 35.354115 -1.461460 +v 11.972857 35.175339 -2.175154 +v 11.972857 34.927475 -2.867889 +v 11.972857 34.612904 -3.532994 +v 11.972855 34.234653 -4.164063 +v 11.972855 33.796371 -4.755017 +v 11.972857 33.302277 -5.300167 +v 11.972857 32.757126 -5.794261 +v 11.972855 32.166172 -6.232542 +v 11.972857 31.535105 -6.610788 +v 11.972855 30.870001 -6.925358 +v 11.972855 30.177269 -7.173223 +v 11.972855 29.463573 -7.351993 +v 11.972855 28.735794 -7.459949 +v 11.972855 28.000940 -7.496049 +v 11.972858 28.000938 0.001183 +v 13.303528 28.507116 5.140497 +v 13.303530 28.000938 5.165365 +v 13.303528 29.008421 5.066135 +v 13.303528 29.500023 4.942995 +v 13.303528 29.977186 4.772264 +v 13.303528 30.435318 4.555584 +v 13.303528 30.870007 4.295041 +v 13.303528 31.277061 3.993149 +v 13.303528 31.652567 3.652810 +v 13.303528 31.992905 3.277303 +v 13.303528 32.294800 2.870246 +v 13.303526 32.555340 2.435558 +v 13.303526 32.772022 1.977427 +v 13.303528 32.942753 1.500263 +v 13.303526 33.065895 1.008661 +v 13.303528 33.140251 0.507359 +v 13.303528 33.165123 0.001180 +v 13.303524 33.140255 -0.505001 +v 13.303526 33.065891 -1.006303 +v 13.303528 32.942749 -1.497904 +v 13.303524 32.772018 -1.975068 +v 13.303524 32.555336 -2.433200 +v 13.303524 32.294796 -2.867887 +v 13.303524 31.992901 -3.274944 +v 13.303526 31.652563 -3.650449 +v 13.303524 31.277058 -3.990789 +v 13.303524 30.870001 -4.292681 +v 13.303526 30.435314 -4.553222 +v 13.303524 29.977182 -4.769901 +v 13.303524 29.500019 -4.940633 +v 13.303526 29.008419 -5.063771 +v 13.303526 28.507116 -5.138134 +v 13.303524 28.000938 -5.163002 +v 13.303528 28.000938 0.001182 +v 14.122948 28.258986 2.621179 +v 14.122948 28.000938 2.633856 +v 14.122950 28.514547 2.583270 +v 14.122948 28.765163 2.520494 +v 14.122950 29.008419 2.433456 +v 14.122950 29.241974 2.322992 +v 14.122950 29.463573 2.190172 +v 14.122950 29.671089 2.036267 +v 14.122948 29.862520 1.862762 +v 14.122948 30.036024 1.671331 +v 14.122950 30.189926 1.463819 +v 14.122948 30.322750 1.242214 +v 14.122948 30.433212 1.008662 +v 14.122948 30.520252 0.765407 +v 14.122950 30.583027 0.514791 +v 14.122948 30.620937 0.259228 +v 14.122948 30.633614 0.001181 +v 14.122948 30.620935 -0.256868 +v 14.122948 30.583027 -0.512429 +v 14.122948 30.520252 -0.763046 +v 14.122948 30.433212 -1.006301 +v 14.122948 30.322750 -1.239856 +v 14.122948 30.189926 -1.461457 +v 14.122948 30.036022 -1.668972 +v 14.122948 29.862518 -1.860402 +v 14.122948 29.671087 -2.033905 +v 14.122948 29.463572 -2.187808 +v 14.122948 29.241970 -2.320631 +v 14.122948 29.008419 -2.431093 +v 14.122948 28.765162 -2.518131 +v 14.122948 28.514545 -2.580907 +v 14.122948 28.258984 -2.618816 +v 14.122948 28.000938 -2.631494 +v 14.122948 28.000937 0.001182 +v 14.399632 28.000938 0.001183 +v 7.496737 36.254768 -7.981748 +v 7.662630 36.068142 -8.064069 +v 7.306919 36.420994 -7.939762 +v 5.880337 36.744213 -8.645960 +v 6.043753 36.799519 -8.463190 +v 6.231340 36.820087 -8.300744 +v 6.437003 36.805706 -8.163391 +v 6.654332 36.756985 -8.055237 +v 6.876658 36.675323 -7.979702 +v 7.097103 36.562916 -7.939490 +v 7.187805 36.502827 -7.938215 +v 7.779952 35.869778 -8.164820 +v 7.859803 35.664185 -8.297241 +v 7.896538 35.463196 -8.454597 +v 7.891358 35.343842 -8.566271 +v 7.886088 35.275753 -8.631545 +v -6.073505 36.799519 -8.356153 +v -6.073505 36.799519 -7.445862 +v -5.910089 36.744213 -7.628630 +v -5.910089 36.744213 -8.538920 +v -5.874556 36.719986 -7.681830 +v -5.874556 36.719986 -8.592120 +v -7.217556 36.502827 -6.920886 +v -7.126855 36.562916 -6.922162 +v -7.126854 36.562916 -7.832452 +v -7.217556 36.502827 -7.831177 +v -6.906410 36.675323 -6.962374 +v -6.906410 36.675323 -7.872663 +v -6.684082 36.756985 -7.037908 +v -6.684082 36.756985 -7.948197 +v -6.466754 36.805706 -7.146061 +v -6.466754 36.805706 -8.056352 +v -6.261092 36.820087 -8.193706 +v -6.261092 36.820087 -7.283415 +v -5.776183 36.644962 -7.818007 +v -5.776183 36.644962 -8.728297 +v -5.677721 36.509327 -8.007423 +v -5.677721 36.509327 -8.917714 +v -5.620145 36.346588 -8.193798 +v -5.620145 36.346588 -9.104089 +v -5.605908 36.162674 -8.370100 +v -5.605908 36.162674 -9.280390 +v -5.635896 35.964390 -8.529566 +v -5.635896 35.964390 -9.439857 +v -5.665436 35.881851 -8.584428 +v -5.665436 35.881851 -9.494719 +v -5.704070 35.753155 -8.655810 +v -5.704070 35.753155 -9.566101 +v -5.810112 35.540100 -8.747768 +v -5.810112 35.540100 -9.658058 +v -5.953629 35.337608 -8.808551 +v -5.953629 35.337608 -9.718842 +v -6.129253 35.153515 -8.835688 +v -6.129253 35.153515 -9.745978 +v -6.330334 34.995010 -8.827991 +v -6.330334 34.995010 -9.738281 +v -6.438649 34.932316 -8.807019 +v -6.438649 34.932316 -9.717310 +v -7.921110 35.343842 -7.548943 +v -7.926290 35.463200 -7.437269 +v -7.926290 35.463200 -8.347559 +v -7.921110 35.343842 -8.459232 +v -7.889554 35.664185 -7.279912 +v -7.889554 35.664185 -8.190203 +v -7.809702 35.869778 -7.147490 +v -7.809702 35.869778 -8.057780 +v -7.692381 36.068142 -7.046740 +v -7.692381 36.068142 -7.957030 +v -7.526489 36.254768 -6.964419 +v -7.526489 36.254768 -7.874710 +v -7.336671 36.420994 -6.922433 +v -7.336671 36.420994 -7.832724 +v -6.549448 34.869514 -8.784578 +v -6.549448 34.869514 -9.694868 +v -6.777306 34.782024 -8.707535 +v -6.777306 34.782024 -9.617826 +v -7.004731 34.734730 -8.600949 +v -7.004731 34.734730 -9.511240 +v -7.187137 34.729317 -8.468913 +v -7.187137 34.729317 -9.379204 +v -7.424342 34.765919 -8.316442 +v -7.424342 34.765919 -9.226732 +v -7.600767 34.843121 -8.149292 +v -7.600767 34.843121 -9.059582 +v -7.745790 34.958008 -7.973750 +v -7.745790 34.958008 -8.884040 +v -7.853930 35.106289 -7.796419 +v -7.853930 35.106289 -8.706709 +v -7.881164 35.177738 -7.726463 +v -7.881163 35.177738 -8.636754 +v -7.915839 35.275753 -7.614216 +v -7.915839 35.275753 -8.524507 +v 5.880337 36.744213 -7.628629 +v 6.043754 36.799519 -7.445860 +v 6.043753 36.799519 -8.356151 +v 5.880338 36.744213 -8.538919 +v 5.844805 36.719986 -7.681829 +v 5.844804 36.719986 -8.592118 +v 7.097104 36.562916 -6.922161 +v 7.187806 36.502827 -6.920885 +v 7.187805 36.502827 -7.831175 +v 7.097104 36.562916 -7.832450 +v 6.876658 36.675323 -6.962371 +v 6.876658 36.675323 -7.872662 +v 6.654332 36.756985 -7.037907 +v 6.654330 36.756985 -7.948196 +v 6.437003 36.805706 -7.146060 +v 6.437004 36.805706 -8.056351 +v 6.231340 36.820087 -7.283414 +v 6.231341 36.820087 -8.193704 +v 5.746432 36.644962 -7.818005 +v 5.746432 36.644962 -8.728294 +v 5.647971 36.509327 -8.007421 +v 5.647970 36.509327 -8.917713 +v 5.590394 36.346588 -8.193796 +v 5.590394 36.346588 -9.104086 +v 5.576157 36.162674 -8.370098 +v 5.576156 36.162674 -9.280388 +v 5.606146 35.964390 -8.529565 +v 5.606144 35.964390 -9.439854 +v 5.635684 35.881851 -8.584427 +v 5.635684 35.881851 -9.494717 +v 5.674319 35.753155 -8.655809 +v 5.674318 35.753155 -9.566099 +v 5.780362 35.540100 -8.747766 +v 5.780361 35.540100 -9.658056 +v 5.923878 35.337608 -8.808550 +v 5.923877 35.337608 -9.718839 +v 6.099502 35.153515 -8.835686 +v 6.099501 35.153515 -9.745975 +v 6.300583 34.995010 -9.738279 +v 6.300583 34.995010 -8.827990 +v 6.408898 34.932316 -9.717308 +v 6.408900 34.932312 -8.807018 +v 7.896538 35.463200 -8.347557 +v 7.896538 35.463196 -7.437268 +v 7.891358 35.343842 -7.548941 +v 7.891358 35.343842 -8.459230 +v 7.859802 35.664185 -8.190201 +v 7.859803 35.664185 -7.279912 +v 7.779951 35.869778 -8.057779 +v 7.779952 35.869778 -7.147490 +v 7.662630 36.068142 -7.957028 +v 7.662631 36.068142 -7.046738 +v 7.496737 36.254768 -7.874708 +v 7.496738 36.254768 -6.964417 +v 7.306919 36.420994 -6.922432 +v 7.306920 36.420994 -7.832722 +v 6.519698 34.869514 -9.694866 +v 6.519698 34.869514 -8.784576 +v 6.747554 34.782024 -9.617825 +v 6.747555 34.782021 -8.707534 +v 6.974979 34.734726 -9.511238 +v 6.974980 34.734726 -8.600948 +v 7.157384 34.729317 -9.379202 +v 7.157385 34.729317 -8.468911 +v 7.394591 34.765919 -9.226730 +v 7.394591 34.765919 -8.316442 +v 7.571016 34.843121 -9.059581 +v 7.571016 34.843121 -8.149290 +v 7.716038 34.958008 -8.884039 +v 7.716038 34.958008 -7.973749 +v 7.824179 35.106285 -8.706707 +v 7.824181 35.106285 -7.796417 +v 7.851412 35.177738 -8.636753 +v 7.851412 35.177738 -7.726463 +v 7.886089 35.275753 -8.524506 +v 7.886088 35.275749 -7.614214 +v -6.073505 36.799519 -7.338822 +v -6.261092 36.820087 -7.176375 +v -6.466754 36.805706 -7.039021 +v -6.906410 36.675323 -6.855333 +v -6.684082 36.756985 -6.930867 +v -7.126855 36.562916 -6.815122 +v -7.217556 36.502827 -6.813846 +v -7.526488 36.254768 -6.857379 +v -7.336671 36.420994 -6.815393 +v -7.692381 36.068142 -6.939700 +v -7.809702 35.869778 -7.040450 +v -7.926290 35.463200 -7.330229 +v -7.889554 35.664185 -7.172872 +v -5.776183 36.644962 -7.710966 +v -7.921110 35.343842 -7.441902 +v -7.915839 35.275753 -7.507176 +v -7.881164 35.177738 -7.619423 +v -7.853930 35.106289 -7.689379 +v -7.745790 34.958008 -7.866710 +v -7.424342 34.765919 -8.209402 +v -7.600767 34.843121 -8.042252 +v -5.953629 35.337608 -8.701510 +v -7.187137 34.729317 -8.361873 +v -7.004731 34.734730 -8.493909 +v -6.549448 34.869514 -8.677538 +v -6.777306 34.782024 -8.600495 +v -6.438649 34.932316 -8.699979 +v -6.330334 34.995010 -8.720951 +v -6.129253 35.153515 -8.728648 +v -5.810112 35.540100 -8.640728 +v -5.704070 35.753155 -8.548771 +v -5.635896 35.964390 -8.422525 +v -5.665436 35.881851 -8.477388 +v -5.605908 36.162674 -8.263060 +v -5.620145 36.346588 -8.086758 +v -5.677721 36.509327 -7.900384 +v -5.874556 36.719986 -7.574790 +v -5.910089 36.744213 -7.521590 +v 5.880337 36.744213 -7.521589 +v 5.844806 36.719986 -7.574789 +v 5.746432 36.644962 -7.710965 +v 6.231339 36.820087 -7.176373 +v 5.647971 36.509327 -7.900382 +v 5.590394 36.346588 -8.086756 +v 5.606145 35.964390 -8.422524 +v 5.576157 36.162674 -8.263058 +v 5.635684 35.881851 -8.477386 +v 5.674320 35.753155 -8.548769 +v 5.923878 35.337608 -8.701509 +v 5.780361 35.540100 -8.640726 +v 6.654332 36.756985 -6.930866 +v 6.099502 35.153515 -8.728645 +v 6.300583 34.995010 -8.720949 +v 6.519698 34.869514 -8.677537 +v 6.408899 34.932312 -8.699978 +v 6.747554 34.782021 -8.600493 +v 6.974980 34.734726 -8.493908 +v 7.394591 34.765919 -8.209401 +v 7.157385 34.729317 -8.361872 +v 7.859803 35.664185 -7.172872 +v 7.571016 34.843117 -8.042250 +v 7.716038 34.958008 -7.866708 +v 7.851412 35.177738 -7.619423 +v 7.824180 35.106285 -7.689377 +v 7.886088 35.275749 -7.507175 +v 7.891358 35.343842 -7.441901 +v 7.896538 35.463196 -7.330228 +v 7.779952 35.869778 -7.040450 +v 7.662629 36.068142 -6.939698 +v 7.306919 36.420994 -6.815392 +v 7.496737 36.254768 -6.857377 +v 7.187805 36.502827 -6.813845 +v 7.097103 36.562916 -6.815121 +v 6.876658 36.675323 -6.855331 +v 6.437003 36.805706 -7.039021 +v 6.043754 36.799519 -7.338820 +# 816 vertices + +vt 0.015625 0.437500 0.000000 +vt 0.015625 0.500000 0.000000 +vt 0.000000 0.500000 0.000000 +vt 0.000000 0.437500 0.000000 +vt 0.031250 0.437500 0.000000 +vt 0.031250 0.500000 0.000000 +vt 0.046875 0.437500 0.000000 +vt 0.046875 0.500000 0.000000 +vt 0.062500 0.437500 0.000000 +vt 0.062500 0.500000 0.000000 +vt 0.078125 0.437500 0.000000 +vt 0.078125 0.500000 0.000000 +vt 0.093750 0.437500 0.000000 +vt 0.093750 0.500000 0.000000 +vt 0.109375 0.437500 0.000000 +vt 0.109375 0.500000 0.000000 +vt 0.125000 0.437500 0.000000 +vt 0.125000 0.500000 0.000000 +vt 0.140625 0.437500 0.000000 +vt 0.140625 0.500000 0.000000 +vt 0.156250 0.437500 0.000000 +vt 0.156250 0.500000 0.000000 +vt 0.171875 0.437500 0.000000 +vt 0.171875 0.500000 0.000000 +vt 0.187500 0.437500 0.000000 +vt 0.187500 0.500000 0.000000 +vt 0.203125 0.437500 0.000000 +vt 0.203125 0.500000 0.000000 +vt 0.218750 0.437500 0.000000 +vt 0.218750 0.500000 0.000000 +vt 0.234375 0.437500 0.000000 +vt 0.234375 0.500000 0.000000 +vt 0.250000 0.437500 0.000000 +vt 0.250000 0.500000 0.000000 +vt 0.265625 0.437500 0.000000 +vt 0.265625 0.500000 0.000000 +vt 0.281250 0.437500 0.000000 +vt 0.281250 0.500000 0.000000 +vt 0.296875 0.437500 0.000000 +vt 0.296875 0.500000 0.000000 +vt 0.312500 0.437500 0.000000 +vt 0.312500 0.500000 0.000000 +vt 0.328125 0.437500 0.000000 +vt 0.328125 0.500000 0.000000 +vt 0.343750 0.437500 0.000000 +vt 0.343750 0.500000 0.000000 +vt 0.359375 0.437500 0.000000 +vt 0.359375 0.500000 0.000000 +vt 0.375000 0.437500 0.000000 +vt 0.375000 0.500000 0.000000 +vt 0.390625 0.437500 0.000000 +vt 0.390625 0.500000 0.000000 +vt 0.406250 0.437500 0.000000 +vt 0.406250 0.500000 0.000000 +vt 0.421875 0.437500 0.000000 +vt 0.421875 0.500000 0.000000 +vt 0.437500 0.437500 0.000000 +vt 0.437500 0.500000 0.000000 +vt 0.453125 0.437500 0.000000 +vt 0.453125 0.500000 0.000000 +vt 0.468750 0.437500 0.000000 +vt 0.468750 0.500000 0.000000 +vt 0.484375 0.437500 0.000000 +vt 0.484375 0.500000 0.000000 +vt 0.500000 0.437500 0.000000 +vt 0.500000 0.500000 0.000000 +vt 1.000000 0.500000 0.000000 +vt 1.000000 0.437500 0.000000 +vt 0.015625 0.375000 0.000000 +vt 0.000000 0.375000 0.000000 +vt 0.031250 0.375000 0.000000 +vt 0.046875 0.375000 0.000000 +vt 0.062500 0.375000 0.000000 +vt 0.078125 0.375000 0.000000 +vt 0.093750 0.375000 0.000000 +vt 0.109375 0.375000 0.000000 +vt 0.125000 0.375000 0.000000 +vt 0.140625 0.375000 0.000000 +vt 0.156250 0.375000 0.000000 +vt 0.171875 0.375000 0.000000 +vt 0.187500 0.375000 0.000000 +vt 0.203125 0.375000 0.000000 +vt 0.218750 0.375000 0.000000 +vt 0.234375 0.375000 0.000000 +vt 0.250000 0.375000 0.000000 +vt 0.265625 0.375000 0.000000 +vt 0.281250 0.375000 0.000000 +vt 0.296875 0.375000 0.000000 +vt 0.312500 0.375000 0.000000 +vt 0.328125 0.375000 0.000000 +vt 0.343750 0.375000 0.000000 +vt 0.359375 0.375000 0.000000 +vt 0.375000 0.375000 0.000000 +vt 0.390625 0.375000 0.000000 +vt 0.406250 0.375000 0.000000 +vt 0.421875 0.375000 0.000000 +vt 0.437500 0.375000 0.000000 +vt 0.453125 0.375000 0.000000 +vt 0.468750 0.375000 0.000000 +vt 0.484375 0.375000 0.000000 +vt 0.500000 0.375000 0.000000 +vt 1.000000 0.375000 0.000000 +vt 0.015625 0.312500 0.000000 +vt 0.000000 0.312500 0.000000 +vt 0.031250 0.312500 0.000000 +vt 0.046875 0.312500 0.000000 +vt 0.062500 0.312500 0.000000 +vt 0.078125 0.312500 0.000000 +vt 0.093750 0.312500 0.000000 +vt 0.109375 0.312500 0.000000 +vt 0.125000 0.312500 0.000000 +vt 0.140625 0.312500 0.000000 +vt 0.156250 0.312500 0.000000 +vt 0.171875 0.312500 0.000000 +vt 0.187500 0.312500 0.000000 +vt 0.203125 0.312500 0.000000 +vt 0.218750 0.312500 0.000000 +vt 0.234375 0.312500 0.000000 +vt 0.250000 0.312500 0.000000 +vt 0.265625 0.312500 0.000000 +vt 0.281250 0.312500 0.000000 +vt 0.296875 0.312500 0.000000 +vt 0.312500 0.312500 0.000000 +vt 0.328125 0.312500 0.000000 +vt 0.343750 0.312500 0.000000 +vt 0.359375 0.312500 0.000000 +vt 0.374661 0.367306 0.000000 +vt 0.376866 0.369981 0.000000 +vt 0.379743 0.372453 0.000000 +vt 0.382863 0.373898 0.000000 +vt 0.389364 0.373503 0.000000 +vt 0.390625 0.372761 0.000000 +vt 0.386111 0.374256 0.000000 +vt 0.392556 0.371791 0.000000 +vt 0.392035 0.317818 0.000000 +vt 0.390625 0.317135 0.000000 +vt 0.390625 0.312500 0.000000 +vt 0.395251 0.320533 0.000000 +vt 0.398086 0.324174 0.000000 +vt 0.406250 0.312500 0.000000 +vt 0.400431 0.328603 0.000000 +vt 0.402113 0.333654 0.000000 +vt 0.402994 0.339138 0.000000 +vt 0.403248 0.344847 0.000000 +vt 0.402865 0.350568 0.000000 +vt 0.402357 0.353349 0.000000 +vt 0.401839 0.356069 0.000000 +vt 0.400209 0.361117 0.000000 +vt 0.398059 0.365526 0.000000 +vt 0.395475 0.369129 0.000000 +vt 0.421875 0.312500 0.000000 +vt 0.437500 0.312500 0.000000 +vt 0.453125 0.312500 0.000000 +vt 0.468750 0.312500 0.000000 +vt 0.484375 0.312500 0.000000 +vt 0.500000 0.312500 0.000000 +vt 1.000000 0.312500 0.000000 +vt 0.015625 0.250000 0.000000 +vt 0.000000 0.250000 0.000000 +vt 0.031250 0.250000 0.000000 +vt 0.046875 0.250000 0.000000 +vt 0.062500 0.250000 0.000000 +vt 0.078125 0.250000 0.000000 +vt 0.093750 0.250000 0.000000 +vt 0.109375 0.250000 0.000000 +vt 0.125000 0.250000 0.000000 +vt 0.140625 0.250000 0.000000 +vt 0.156250 0.250000 0.000000 +vt 0.171875 0.250000 0.000000 +vt 0.187500 0.250000 0.000000 +vt 0.203125 0.250000 0.000000 +vt 0.218750 0.250000 0.000000 +vt 0.234375 0.250000 0.000000 +vt 0.250000 0.250000 0.000000 +vt 0.265625 0.250000 0.000000 +vt 0.281250 0.250000 0.000000 +vt 0.296875 0.250000 0.000000 +vt 0.312500 0.250000 0.000000 +vt 0.328125 0.250000 0.000000 +vt 0.343750 0.250000 0.000000 +vt 0.359375 0.250000 0.000000 +vt 0.375000 0.250000 0.000000 +vt 0.375000 0.312500 0.000000 +vt 0.390625 0.250000 0.000000 +vt 0.406250 0.250000 0.000000 +vt 0.421875 0.250000 0.000000 +vt 0.437500 0.250000 0.000000 +vt 0.453125 0.250000 0.000000 +vt 0.468750 0.250000 0.000000 +vt 0.484375 0.250000 0.000000 +vt 0.500000 0.250000 0.000000 +vt 1.000000 0.250000 0.000000 +vt 0.015625 0.187500 0.000000 +vt 0.000000 0.187500 0.000000 +vt 0.031250 0.187500 0.000000 +vt 0.046875 0.187500 0.000000 +vt 0.062500 0.187500 0.000000 +vt 0.078125 0.187500 0.000000 +vt 0.093750 0.187500 0.000000 +vt 0.109375 0.187500 0.000000 +vt 0.125000 0.187500 0.000000 +vt 0.140625 0.187500 0.000000 +vt 0.156250 0.187500 0.000000 +vt 0.171875 0.187500 0.000000 +vt 0.187500 0.187500 0.000000 +vt 0.203125 0.187500 0.000000 +vt 0.218750 0.187500 0.000000 +vt 0.234375 0.187500 0.000000 +vt 0.250000 0.187500 0.000000 +vt 0.265625 0.187500 0.000000 +vt 0.281250 0.187500 0.000000 +vt 0.296875 0.187500 0.000000 +vt 0.312500 0.187500 0.000000 +vt 0.328125 0.187500 0.000000 +vt 0.343750 0.187500 0.000000 +vt 0.359375 0.187500 0.000000 +vt 0.375000 0.187500 0.000000 +vt 0.390625 0.187500 0.000000 +vt 0.406250 0.187500 0.000000 +vt 0.421875 0.187500 0.000000 +vt 0.437500 0.187500 0.000000 +vt 0.453125 0.187500 0.000000 +vt 0.468750 0.187500 0.000000 +vt 0.484375 0.187500 0.000000 +vt 0.500000 0.187500 0.000000 +vt 1.000000 0.187500 0.000000 +vt 0.015625 0.125000 0.000000 +vt 0.000000 0.125000 0.000000 +vt 0.031250 0.125000 0.000000 +vt 0.046875 0.125000 0.000000 +vt 0.062500 0.125000 0.000000 +vt 0.078125 0.125000 0.000000 +vt 0.093750 0.125000 0.000000 +vt 0.109375 0.125000 0.000000 +vt 0.125000 0.125000 0.000000 +vt 0.140625 0.125000 0.000000 +vt 0.156250 0.125000 0.000000 +vt 0.171875 0.125000 0.000000 +vt 0.187500 0.125000 0.000000 +vt 0.203125 0.125000 0.000000 +vt 0.218750 0.125000 0.000000 +vt 0.234375 0.125000 0.000000 +vt 0.250000 0.125000 0.000000 +vt 0.265625 0.125000 0.000000 +vt 0.281250 0.125000 0.000000 +vt 0.296875 0.125000 0.000000 +vt 0.312500 0.125000 0.000000 +vt 0.328125 0.125000 0.000000 +vt 0.343750 0.125000 0.000000 +vt 0.359375 0.125000 0.000000 +vt 0.375000 0.125000 0.000000 +vt 0.390625 0.125000 0.000000 +vt 0.406250 0.125000 0.000000 +vt 0.421875 0.125000 0.000000 +vt 0.437500 0.125000 0.000000 +vt 0.453125 0.125000 0.000000 +vt 0.468750 0.125000 0.000000 +vt 0.484375 0.125000 0.000000 +vt 0.500000 0.125000 0.000000 +vt 1.000000 0.125000 0.000000 +vt 0.015625 0.062500 0.000000 +vt 0.000000 0.062500 0.000000 +vt 0.031250 0.062500 0.000000 +vt 0.046875 0.062500 0.000000 +vt 0.062500 0.062500 0.000000 +vt 0.078125 0.062500 0.000000 +vt 0.093750 0.062500 0.000000 +vt 0.109375 0.062500 0.000000 +vt 0.125000 0.062500 0.000000 +vt 0.140625 0.062500 0.000000 +vt 0.156250 0.062500 0.000000 +vt 0.171875 0.062500 0.000000 +vt 0.187500 0.062500 0.000000 +vt 0.203125 0.062500 0.000000 +vt 0.218750 0.062500 0.000000 +vt 0.234375 0.062500 0.000000 +vt 0.250000 0.062500 0.000000 +vt 0.265625 0.062500 0.000000 +vt 0.281250 0.062500 0.000000 +vt 0.296875 0.062500 0.000000 +vt 0.312500 0.062500 0.000000 +vt 0.328125 0.062500 0.000000 +vt 0.343750 0.062500 0.000000 +vt 0.359375 0.062500 0.000000 +vt 0.375000 0.062500 0.000000 +vt 0.390625 0.062500 0.000000 +vt 0.406250 0.062500 0.000000 +vt 0.421875 0.062500 0.000000 +vt 0.437500 0.062500 0.000000 +vt 0.453125 0.062500 0.000000 +vt 0.468750 0.062500 0.000000 +vt 0.484375 0.062500 0.000000 +vt 0.500000 0.062500 0.000000 +vt 1.000000 0.062500 0.000000 +vt 0.000000 -0.000000 0.000000 +vt 0.015625 -0.000000 0.000000 +vt 0.031250 -0.000000 0.000000 +vt 0.046875 -0.000000 0.000000 +vt 0.062500 -0.000000 0.000000 +vt 0.078125 -0.000000 0.000000 +vt 0.093750 -0.000000 0.000000 +vt 0.109375 -0.000000 0.000000 +vt 0.125000 -0.000000 0.000000 +vt 0.140625 -0.000000 0.000000 +vt 0.156250 -0.000000 0.000000 +vt 0.171875 -0.000000 0.000000 +vt 0.187500 -0.000000 0.000000 +vt 0.203125 -0.000000 0.000000 +vt 0.218750 -0.000000 0.000000 +vt 0.234375 -0.000000 0.000000 +vt 0.250000 -0.000000 0.000000 +vt 0.265625 -0.000000 0.000000 +vt 0.281250 -0.000000 0.000000 +vt 0.296875 -0.000000 0.000000 +vt 0.312500 -0.000000 0.000000 +vt 0.328125 -0.000000 0.000000 +vt 0.343750 -0.000000 0.000000 +vt 0.359375 -0.000000 0.000000 +vt 0.375000 -0.000000 0.000000 +vt 0.390625 -0.000000 0.000000 +vt 0.406250 -0.000000 0.000000 +vt 0.421875 -0.000000 0.000000 +vt 0.437500 -0.000000 0.000000 +vt 0.453125 -0.000000 0.000000 +vt 0.468750 -0.000000 0.000000 +vt 0.484375 -0.000000 0.000000 +vt 0.374131 0.366619 0.000000 +vt 0.371978 0.362516 0.000000 +vt 0.370161 0.357807 0.000000 +vt 0.368888 0.352644 0.000000 +vt 0.368204 0.347188 0.000000 +vt 0.368228 0.341606 0.000000 +vt 0.368917 0.336072 0.000000 +vt 0.369492 0.333795 0.000000 +vt 0.370309 0.330804 0.000000 +vt 0.372352 0.326039 0.000000 +vt 0.375000 0.321853 0.000000 +vt 0.388599 0.316264 0.000000 +vt 0.387297 0.316132 0.000000 +vt 0.384977 0.316002 0.000000 +vt 0.377984 0.318929 0.000000 +vt 0.381379 0.316924 0.000000 +# 342 texture coords + +g Sphere003 +usemtl wire_061135006 +f -813/-339 -814/-340 -815/-341 -816/-342 +f -816/-342 -815/-341 -811/-337 -812/-338 +f -812/-338 -811/-337 -809/-335 -810/-336 +f -810/-336 -809/-335 -807/-333 -808/-334 +f -808/-334 -807/-333 -805/-331 -806/-332 +f -806/-332 -805/-331 -803/-329 -804/-330 +f -804/-330 -803/-329 -801/-327 -802/-328 +f -802/-328 -801/-327 -799/-325 -800/-326 +f -800/-326 -799/-325 -797/-323 -798/-324 +f -798/-324 -797/-323 -795/-321 -796/-322 +f -796/-322 -795/-321 -793/-319 -794/-320 +f -794/-320 -793/-319 -791/-317 -792/-318 +f -792/-318 -791/-317 -789/-315 -790/-316 +f -790/-316 -789/-315 -787/-313 -788/-314 +f -788/-314 -787/-313 -785/-311 -786/-312 +f -786/-312 -785/-311 -783/-309 -784/-310 +f -784/-310 -783/-309 -781/-307 -782/-308 +f -782/-308 -781/-307 -779/-305 -780/-306 +f -780/-306 -779/-305 -777/-303 -778/-304 +f -778/-304 -777/-303 -775/-301 -776/-302 +f -776/-302 -775/-301 -773/-299 -774/-300 +f -774/-300 -773/-299 -771/-297 -772/-298 +f -772/-298 -771/-297 -769/-295 -770/-296 +f -770/-296 -769/-295 -767/-293 -768/-294 +f -768/-294 -767/-293 -765/-291 -766/-292 +f -766/-292 -765/-291 -763/-289 -764/-290 +f -764/-290 -763/-289 -761/-287 -762/-288 +f -762/-288 -761/-287 -759/-285 -760/-286 +f -760/-286 -759/-285 -757/-283 -758/-284 +f -758/-284 -757/-283 -755/-281 -756/-282 +f -756/-282 -755/-281 -753/-279 -754/-280 +f -754/-280 -753/-279 -751/-277 -752/-278 +f -752/-275 -751/-276 -749/-340 -750/-339 +f -750/-339 -749/-340 -814/-276 -813/-275 +f -747/-273 -813/-339 -816/-342 -748/-274 +f -748/-274 -816/-342 -812/-338 -746/-272 +f -746/-272 -812/-338 -810/-336 -745/-271 +f -745/-271 -810/-336 -808/-334 -744/-270 +f -744/-270 -808/-334 -806/-332 -743/-269 +f -743/-269 -806/-332 -804/-330 -742/-268 +f -742/-268 -804/-330 -802/-328 -741/-267 +f -741/-267 -802/-328 -800/-326 -740/-266 +f -740/-266 -800/-326 -798/-324 -739/-265 +f -739/-265 -798/-324 -796/-322 -738/-264 +f -738/-264 -796/-322 -794/-320 -737/-263 +f -737/-263 -794/-320 -792/-318 -736/-262 +f -736/-262 -792/-318 -790/-316 -735/-261 +f -735/-261 -790/-316 -788/-314 -734/-260 +f -734/-260 -788/-314 -786/-312 -733/-259 +f -733/-259 -786/-312 -784/-310 -732/-258 +f -732/-258 -784/-310 -782/-308 -731/-257 +f -731/-257 -782/-308 -780/-306 -730/-256 +f -730/-256 -780/-306 -778/-304 -729/-255 +f -729/-255 -778/-304 -776/-302 -728/-254 +f -728/-254 -776/-302 -774/-300 -727/-253 +f -727/-253 -774/-300 -772/-298 -726/-252 +f -726/-252 -772/-298 -770/-296 -725/-251 +f -725/-251 -770/-296 -768/-294 -724/-250 +f -724/-250 -768/-294 -766/-292 -723/-249 +f -723/-249 -766/-292 -764/-290 -722/-248 +f -722/-248 -764/-290 -762/-288 -721/-247 +f -721/-247 -762/-288 -760/-286 -720/-246 +f -720/-246 -760/-286 -758/-284 -719/-245 +f -719/-245 -758/-284 -756/-282 -718/-244 +f -718/-244 -756/-282 -754/-280 -717/-243 +f -717/-243 -754/-280 -752/-278 -716/-242 +f -716/-241 -752/-275 -750/-339 -715/-273 +f -715/-273 -750/-339 -813/-275 -747/-241 +f -713/-239 -747/-273 -748/-274 -714/-240 +f -714/-240 -748/-274 -746/-272 -712/-238 +f -712/-238 -746/-272 -745/-271 -711/-237 +f -711/-237 -745/-271 -744/-270 -710/-236 +f -710/-236 -744/-270 -743/-269 -709/-235 +f -709/-235 -743/-269 -742/-268 -708/-234 +f -708/-234 -742/-268 -741/-267 -707/-233 +f -707/-233 -741/-267 -740/-266 -706/-232 +f -706/-232 -740/-266 -739/-265 -705/-231 +f -705/-231 -739/-265 -738/-264 -704/-230 +f -704/-230 -738/-264 -737/-263 -703/-229 +f -703/-229 -737/-263 -736/-262 -702/-228 +f -702/-228 -736/-262 -735/-261 -701/-227 +f -701/-227 -735/-261 -734/-260 -700/-226 +f -700/-226 -734/-260 -733/-259 -699/-225 +f -699/-225 -733/-259 -732/-258 -698/-224 +f -698/-224 -732/-258 -731/-257 -697/-223 +f -697/-223 -731/-257 -730/-256 -696/-222 +f -696/-222 -730/-256 -729/-255 -695/-221 +f -695/-221 -729/-255 -728/-254 -694/-220 +f -694/-220 -728/-254 -727/-253 -693/-219 +f -693/-219 -727/-253 -726/-252 -692/-218 +f -692/-218 -726/-252 -725/-251 -691/-217 +f -688/-214 -689/-215 -690/-216 -724/-250 +f -723/-249 -687/-213 -688/-214 -724/-250 +f -684/-210 -723/-249 -685/-211 -686/-212 +f -723/-249 -684/-210 -687/-213 +f -722/-248 -683/-209 -685/-211 -723/-249 +f -679/-205 -680/-206 -681/-207 -682/-208 +f -677/-203 -680/-206 -679/-205 -678/-204 +f -675/-201 -677/-203 -678/-204 -676/-202 +f -673/-199 -677/-203 -675/-201 -674/-200 +f -722/-248 -677/-203 -673/-199 -672/-198 +f -670/-196 -722/-248 -672/-198 -671/-197 +f -668/-194 -722/-248 -670/-196 -669/-195 +f -683/-209 -722/-248 -668/-194 -667/-193 +f -677/-203 -722/-248 -721/-247 -666/-192 +f -666/-192 -721/-247 -720/-246 -665/-191 +f -665/-191 -720/-246 -719/-245 -664/-190 +f -664/-190 -719/-245 -718/-244 -663/-189 +f -663/-189 -718/-244 -717/-243 -662/-188 +f -662/-188 -717/-243 -716/-242 -661/-187 +f -661/-186 -716/-241 -715/-273 -660/-239 +f -660/-239 -715/-273 -747/-241 -713/-186 +f -658/-184 -713/-239 -714/-240 -659/-185 +f -659/-185 -714/-240 -712/-238 -657/-183 +f -657/-183 -712/-238 -711/-237 -656/-182 +f -656/-182 -711/-237 -710/-236 -655/-181 +f -655/-181 -710/-236 -709/-235 -654/-180 +f -654/-180 -709/-235 -708/-234 -653/-179 +f -653/-179 -708/-234 -707/-233 -652/-178 +f -652/-178 -707/-233 -706/-232 -651/-177 +f -651/-177 -706/-232 -705/-231 -650/-176 +f -650/-176 -705/-231 -704/-230 -649/-175 +f -649/-175 -704/-230 -703/-229 -648/-174 +f -648/-174 -703/-229 -702/-228 -647/-173 +f -647/-173 -702/-228 -701/-227 -646/-172 +f -646/-172 -701/-227 -700/-226 -645/-171 +f -645/-171 -700/-226 -699/-225 -644/-170 +f -644/-170 -699/-225 -698/-224 -643/-169 +f -643/-169 -698/-224 -697/-223 -642/-168 +f -642/-168 -697/-223 -696/-222 -641/-167 +f -641/-167 -696/-222 -695/-221 -640/-166 +f -640/-166 -695/-221 -694/-220 -639/-165 +f -639/-165 -694/-220 -693/-219 -638/-164 +f -638/-164 -693/-219 -692/-218 -637/-163 +f -637/-163 -692/-218 -691/-217 -636/-162 +f -636/-162 -691/-217 -634/-160 -635/-161 +f -635/-161 -634/-160 -680/-206 -633/-159 +f -633/-159 -680/-206 -677/-203 -632/-158 +f -632/-158 -677/-203 -666/-192 -631/-157 +f -631/-157 -666/-192 -665/-191 -630/-156 +f -630/-156 -665/-191 -664/-190 -629/-155 +f -629/-155 -664/-190 -663/-189 -628/-154 +f -628/-154 -663/-189 -662/-188 -627/-153 +f -627/-153 -662/-188 -661/-187 -626/-152 +f -626/-151 -661/-186 -660/-239 -625/-184 +f -625/-184 -660/-239 -713/-186 -658/-151 +f -623/-149 -658/-184 -659/-185 -624/-150 +f -624/-150 -659/-185 -657/-183 -622/-148 +f -622/-148 -657/-183 -656/-182 -621/-147 +f -621/-147 -656/-182 -655/-181 -620/-146 +f -620/-146 -655/-181 -654/-180 -619/-145 +f -619/-145 -654/-180 -653/-179 -618/-144 +f -618/-144 -653/-179 -652/-178 -617/-143 +f -617/-143 -652/-178 -651/-177 -616/-142 +f -616/-142 -651/-177 -650/-176 -615/-141 +f -615/-141 -650/-176 -649/-175 -614/-140 +f -614/-140 -649/-175 -648/-174 -613/-139 +f -613/-139 -648/-174 -647/-173 -612/-138 +f -612/-138 -647/-173 -646/-172 -611/-137 +f -611/-137 -646/-172 -645/-171 -610/-136 +f -610/-136 -645/-171 -644/-170 -609/-135 +f -609/-135 -644/-170 -643/-169 -608/-134 +f -608/-134 -643/-169 -642/-168 -607/-133 +f -607/-133 -642/-168 -641/-167 -606/-132 +f -606/-132 -641/-167 -640/-166 -605/-131 +f -605/-131 -640/-166 -639/-165 -604/-130 +f -604/-130 -639/-165 -638/-164 -603/-129 +f -603/-129 -638/-164 -637/-163 -602/-128 +f -602/-128 -637/-163 -636/-162 -601/-127 +f -601/-127 -636/-162 -635/-161 -600/-126 +f -600/-126 -635/-161 -633/-159 -599/-125 +f -599/-125 -633/-159 -632/-158 -598/-124 +f -598/-124 -632/-158 -631/-157 -597/-123 +f -597/-123 -631/-157 -630/-156 -596/-122 +f -596/-122 -630/-156 -629/-155 -595/-121 +f -595/-121 -629/-155 -628/-154 -594/-120 +f -594/-120 -628/-154 -627/-153 -593/-119 +f -593/-119 -627/-153 -626/-152 -592/-118 +f -592/-117 -626/-151 -625/-184 -591/-149 +f -591/-149 -625/-184 -658/-151 -623/-117 +f -589/-115 -623/-149 -624/-150 -590/-116 +f -590/-116 -624/-150 -622/-148 -588/-114 +f -588/-114 -622/-148 -621/-147 -587/-113 +f -587/-113 -621/-147 -620/-146 -586/-112 +f -586/-112 -620/-146 -619/-145 -585/-111 +f -585/-111 -619/-145 -618/-144 -584/-110 +f -584/-110 -618/-144 -617/-143 -583/-109 +f -583/-109 -617/-143 -616/-142 -582/-108 +f -582/-108 -616/-142 -615/-141 -581/-107 +f -581/-107 -615/-141 -614/-140 -580/-106 +f -580/-106 -614/-140 -613/-139 -579/-105 +f -579/-105 -613/-139 -612/-138 -578/-104 +f -578/-104 -612/-138 -611/-137 -577/-103 +f -577/-103 -611/-137 -610/-136 -576/-102 +f -576/-102 -610/-136 -609/-135 -575/-101 +f -575/-101 -609/-135 -608/-134 -574/-100 +f -574/-100 -608/-134 -607/-133 -573/-99 +f -573/-99 -607/-133 -606/-132 -572/-98 +f -572/-98 -606/-132 -605/-131 -571/-97 +f -571/-97 -605/-131 -604/-130 -570/-96 +f -570/-96 -604/-130 -603/-129 -569/-95 +f -569/-95 -603/-129 -602/-128 -568/-94 +f -568/-94 -602/-128 -601/-127 -567/-93 +f -567/-93 -601/-127 -600/-126 -566/-92 +f -566/-92 -600/-126 -599/-125 -565/-91 +f -565/-91 -599/-125 -598/-124 -564/-90 +f -564/-90 -598/-124 -597/-123 -563/-89 +f -563/-89 -597/-123 -596/-122 -562/-88 +f -562/-88 -596/-122 -595/-121 -561/-87 +f -561/-87 -595/-121 -594/-120 -560/-86 +f -560/-86 -594/-120 -593/-119 -559/-85 +f -559/-85 -593/-119 -592/-118 -558/-84 +f -558/-83 -592/-117 -591/-149 -557/-115 +f -557/-115 -591/-149 -623/-117 -589/-83 +f -555/-81 -589/-115 -590/-116 -556/-82 +f -556/-82 -590/-116 -588/-114 -554/-80 +f -554/-80 -588/-114 -587/-113 -553/-79 +f -553/-79 -587/-113 -586/-112 -552/-78 +f -552/-78 -586/-112 -585/-111 -551/-77 +f -551/-77 -585/-111 -584/-110 -550/-76 +f -550/-76 -584/-110 -583/-109 -549/-75 +f -549/-75 -583/-109 -582/-108 -548/-74 +f -548/-74 -582/-108 -581/-107 -547/-73 +f -547/-73 -581/-107 -580/-106 -546/-72 +f -546/-72 -580/-106 -579/-105 -545/-71 +f -545/-71 -579/-105 -578/-104 -544/-70 +f -544/-70 -578/-104 -577/-103 -543/-69 +f -543/-69 -577/-103 -576/-102 -542/-68 +f -542/-68 -576/-102 -575/-101 -541/-67 +f -541/-67 -575/-101 -574/-100 -540/-66 +f -540/-66 -574/-100 -573/-99 -539/-65 +f -539/-65 -573/-99 -572/-98 -538/-64 +f -538/-64 -572/-98 -571/-97 -537/-63 +f -537/-63 -571/-97 -570/-96 -536/-62 +f -536/-62 -570/-96 -569/-95 -535/-61 +f -535/-61 -569/-95 -568/-94 -534/-60 +f -534/-60 -568/-94 -567/-93 -533/-59 +f -533/-59 -567/-93 -566/-92 -532/-58 +f -532/-58 -566/-92 -565/-91 -531/-57 +f -531/-57 -565/-91 -564/-90 -530/-56 +f -530/-56 -564/-90 -563/-89 -529/-55 +f -529/-55 -563/-89 -562/-88 -528/-54 +f -528/-54 -562/-88 -561/-87 -527/-53 +f -527/-53 -561/-87 -560/-86 -526/-52 +f -526/-52 -560/-86 -559/-85 -525/-51 +f -525/-51 -559/-85 -558/-84 -524/-50 +f -524/-49 -558/-83 -557/-115 -523/-81 +f -523/-81 -557/-115 -589/-83 -555/-49 +f -555/-81 -556/-82 -522/-48 +f -556/-82 -554/-80 -522/-47 +f -554/-80 -553/-79 -522/-46 +f -553/-79 -552/-78 -522/-45 +f -552/-78 -551/-77 -522/-44 +f -551/-77 -550/-76 -522/-43 +f -550/-76 -549/-75 -522/-42 +f -549/-75 -548/-74 -522/-41 +f -548/-74 -547/-73 -522/-40 +f -547/-73 -546/-72 -522/-39 +f -546/-72 -545/-71 -522/-38 +f -545/-71 -544/-70 -522/-37 +f -544/-70 -543/-69 -522/-36 +f -543/-69 -542/-68 -522/-35 +f -542/-68 -541/-67 -522/-34 +f -541/-67 -540/-66 -522/-33 +f -540/-66 -539/-65 -522/-32 +f -539/-65 -538/-64 -522/-31 +f -538/-64 -537/-63 -522/-30 +f -537/-63 -536/-62 -522/-29 +f -536/-62 -535/-61 -522/-28 +f -535/-61 -534/-60 -522/-27 +f -534/-60 -533/-59 -522/-26 +f -533/-59 -532/-58 -522/-25 +f -532/-58 -531/-57 -522/-24 +f -531/-57 -530/-56 -522/-23 +f -530/-56 -529/-55 -522/-22 +f -529/-55 -528/-54 -522/-21 +f -528/-54 -527/-53 -522/-20 +f -527/-53 -526/-52 -522/-19 +f -526/-52 -525/-51 -522/-18 +f -525/-51 -524/-50 -522/-17 +f -524/-49 -523/-81 -522/-48 +f -523/-81 -555/-49 -522/-48 +f -520/-15 -724/-250 -690/-216 -521/-16 +f -519/-14 -725/-251 -724/-250 -520/-15 +f -517/-12 -725/-251 -519/-14 -518/-13 +f -516/-11 -691/-217 -725/-251 -517/-12 +f -514/-9 -691/-217 -516/-11 -515/-10 +f -513/-8 -634/-160 -691/-217 -514/-9 +f -511/-6 -634/-160 -513/-8 -512/-7 +f -509/-4 -510/-5 -681/-207 -680/-206 +f -634/-160 -508/-3 -509/-4 -680/-206 +f -506/-1 -634/-160 -511/-6 -507/-2 +f -634/-160 -506/-1 -508/-3 +f -815/-341 -814/-340 -504/-339 -505/-342 +f -811/-337 -815/-341 -505/-342 -503/-338 +f -809/-335 -811/-337 -503/-338 -502/-336 +f -807/-333 -809/-335 -502/-336 -501/-334 +f -805/-331 -807/-333 -501/-334 -500/-332 +f -803/-329 -805/-331 -500/-332 -499/-330 +f -801/-327 -803/-329 -499/-330 -498/-328 +f -799/-325 -801/-327 -498/-328 -497/-326 +f -797/-323 -799/-325 -497/-326 -496/-324 +f -795/-321 -797/-323 -496/-324 -495/-322 +f -793/-319 -795/-321 -495/-322 -494/-320 +f -791/-317 -793/-319 -494/-320 -493/-318 +f -789/-315 -791/-317 -493/-318 -492/-316 +f -787/-313 -789/-315 -492/-316 -491/-314 +f -785/-311 -787/-313 -491/-314 -490/-312 +f -783/-309 -785/-311 -490/-312 -489/-310 +f -781/-307 -783/-309 -489/-310 -488/-308 +f -779/-305 -781/-307 -488/-308 -487/-306 +f -777/-303 -779/-305 -487/-306 -486/-304 +f -775/-301 -777/-303 -486/-304 -485/-302 +f -773/-299 -775/-301 -485/-302 -484/-300 +f -771/-297 -773/-299 -484/-300 -483/-298 +f -769/-295 -771/-297 -483/-298 -482/-296 +f -767/-293 -769/-295 -482/-296 -481/-294 +f -765/-291 -767/-293 -481/-294 -480/-292 +f -763/-289 -765/-291 -480/-292 -479/-290 +f -761/-287 -763/-289 -479/-290 -478/-288 +f -759/-285 -761/-287 -478/-288 -477/-286 +f -757/-283 -759/-285 -477/-286 -476/-284 +f -755/-281 -757/-283 -476/-284 -475/-282 +f -753/-279 -755/-281 -475/-282 -474/-280 +f -751/-277 -753/-279 -474/-280 -473/-278 +f -749/-340 -751/-276 -473/-275 -472/-339 +f -814/-276 -749/-340 -472/-339 -504/-275 +f -505/-342 -504/-339 -470/-273 -471/-274 +f -503/-338 -505/-342 -471/-274 -469/-272 +f -502/-336 -503/-338 -469/-272 -468/-271 +f -501/-334 -502/-336 -468/-271 -467/-270 +f -500/-332 -501/-334 -467/-270 -466/-269 +f -499/-330 -500/-332 -466/-269 -465/-268 +f -498/-328 -499/-330 -465/-268 -464/-267 +f -497/-326 -498/-328 -464/-267 -463/-266 +f -496/-324 -497/-326 -463/-266 -462/-265 +f -495/-322 -496/-324 -462/-265 -461/-264 +f -494/-320 -495/-322 -461/-264 -460/-263 +f -493/-318 -494/-320 -460/-263 -459/-262 +f -492/-316 -493/-318 -459/-262 -458/-261 +f -491/-314 -492/-316 -458/-261 -457/-260 +f -490/-312 -491/-314 -457/-260 -456/-259 +f -489/-310 -490/-312 -456/-259 -455/-258 +f -488/-308 -489/-310 -455/-258 -454/-257 +f -487/-306 -488/-308 -454/-257 -453/-256 +f -486/-304 -487/-306 -453/-256 -452/-255 +f -485/-302 -486/-304 -452/-255 -451/-254 +f -484/-300 -485/-302 -451/-254 -450/-253 +f -483/-298 -484/-300 -450/-253 -449/-252 +f -482/-296 -483/-298 -449/-252 -448/-251 +f -481/-294 -482/-296 -448/-251 -447/-250 +f -480/-292 -481/-294 -447/-250 -446/-249 +f -479/-290 -480/-292 -446/-249 -445/-248 +f -478/-288 -479/-290 -445/-248 -444/-247 +f -477/-286 -478/-288 -444/-247 -443/-246 +f -476/-284 -477/-286 -443/-246 -442/-245 +f -475/-282 -476/-284 -442/-245 -441/-244 +f -474/-280 -475/-282 -441/-244 -440/-243 +f -473/-278 -474/-280 -440/-243 -439/-242 +f -472/-339 -473/-275 -439/-241 -438/-273 +f -504/-275 -472/-339 -438/-273 -470/-241 +f -471/-274 -470/-273 -436/-239 -437/-240 +f -469/-272 -471/-274 -437/-240 -435/-238 +f -468/-271 -469/-272 -435/-238 -434/-237 +f -467/-270 -468/-271 -434/-237 -433/-236 +f -466/-269 -467/-270 -433/-236 -432/-235 +f -465/-268 -466/-269 -432/-235 -431/-234 +f -464/-267 -465/-268 -431/-234 -430/-233 +f -463/-266 -464/-267 -430/-233 -429/-232 +f -462/-265 -463/-266 -429/-232 -428/-231 +f -461/-264 -462/-265 -428/-231 -427/-230 +f -460/-263 -461/-264 -427/-230 -426/-229 +f -459/-262 -460/-263 -426/-229 -425/-228 +f -458/-261 -459/-262 -425/-228 -424/-227 +f -457/-260 -458/-261 -424/-227 -423/-226 +f -456/-259 -457/-260 -423/-226 -422/-225 +f -455/-258 -456/-259 -422/-225 -421/-224 +f -454/-257 -455/-258 -421/-224 -420/-223 +f -453/-256 -454/-257 -420/-223 -419/-222 +f -452/-255 -453/-256 -419/-222 -418/-221 +f -451/-254 -452/-255 -418/-221 -417/-220 +f -450/-253 -451/-254 -417/-220 -416/-219 +f -449/-252 -450/-253 -416/-219 -415/-218 +f -448/-251 -449/-252 -415/-218 -414/-217 +f -411/-210 -412/-212 -413/-211 -446/-249 +f -447/-250 -410/-213 -411/-210 -446/-249 +f -408/-215 -409/-214 -410/-213 -447/-250 +f -407/-216 -408/-215 -447/-250 +f -403/-205 -404/-208 -405/-207 -406/-206 +f -401/-203 -402/-204 -403/-205 -406/-206 +f -399/-201 -400/-202 -402/-204 -401/-203 +f -397/-199 -398/-200 -399/-201 -401/-203 +f -445/-248 -396/-198 -397/-199 -401/-203 +f -394/-196 -395/-197 -396/-198 -445/-248 +f -392/-194 -393/-195 -394/-196 -445/-248 +f -390/-209 -391/-193 -392/-194 -445/-248 +f -413/-211 -390/-209 -445/-248 -446/-249 +f -444/-247 -445/-248 -401/-203 -389/-192 +f -443/-246 -444/-247 -389/-192 -388/-191 +f -442/-245 -443/-246 -388/-191 -387/-190 +f -441/-244 -442/-245 -387/-190 -386/-189 +f -440/-243 -441/-244 -386/-189 -385/-188 +f -439/-242 -440/-243 -385/-188 -384/-187 +f -438/-273 -439/-241 -384/-186 -383/-239 +f -470/-241 -438/-273 -383/-239 -436/-186 +f -437/-240 -436/-239 -381/-184 -382/-185 +f -435/-238 -437/-240 -382/-185 -380/-183 +f -434/-237 -435/-238 -380/-183 -379/-182 +f -433/-236 -434/-237 -379/-182 -378/-181 +f -432/-235 -433/-236 -378/-181 -377/-180 +f -431/-234 -432/-235 -377/-180 -376/-179 +f -430/-233 -431/-234 -376/-179 -375/-178 +f -429/-232 -430/-233 -375/-178 -374/-177 +f -428/-231 -429/-232 -374/-177 -373/-176 +f -427/-230 -428/-231 -373/-176 -372/-175 +f -426/-229 -427/-230 -372/-175 -371/-174 +f -425/-228 -426/-229 -371/-174 -370/-173 +f -424/-227 -425/-228 -370/-173 -369/-172 +f -423/-226 -424/-227 -369/-172 -368/-171 +f -422/-225 -423/-226 -368/-171 -367/-170 +f -421/-224 -422/-225 -367/-170 -366/-169 +f -420/-223 -421/-224 -366/-169 -365/-168 +f -419/-222 -420/-223 -365/-168 -364/-167 +f -418/-221 -419/-222 -364/-167 -363/-166 +f -417/-220 -418/-221 -363/-166 -362/-165 +f -416/-219 -417/-220 -362/-165 -361/-164 +f -415/-218 -416/-219 -361/-164 -360/-163 +f -414/-217 -415/-218 -360/-163 -359/-162 +f -357/-160 -414/-217 -359/-162 -358/-161 +f -406/-206 -357/-160 -358/-161 -356/-159 +f -401/-203 -406/-206 -356/-159 -355/-158 +f -389/-192 -401/-203 -355/-158 -354/-157 +f -388/-191 -389/-192 -354/-157 -353/-156 +f -387/-190 -388/-191 -353/-156 -352/-155 +f -386/-189 -387/-190 -352/-155 -351/-154 +f -385/-188 -386/-189 -351/-154 -350/-153 +f -384/-187 -385/-188 -350/-153 -349/-152 +f -383/-239 -384/-186 -349/-151 -348/-184 +f -436/-186 -383/-239 -348/-184 -381/-151 +f -382/-185 -381/-184 -346/-149 -347/-150 +f -380/-183 -382/-185 -347/-150 -345/-148 +f -379/-182 -380/-183 -345/-148 -344/-147 +f -378/-181 -379/-182 -344/-147 -343/-146 +f -377/-180 -378/-181 -343/-146 -342/-145 +f -376/-179 -377/-180 -342/-145 -341/-144 +f -375/-178 -376/-179 -341/-144 -340/-143 +f -374/-177 -375/-178 -340/-143 -339/-142 +f -373/-176 -374/-177 -339/-142 -338/-141 +f -372/-175 -373/-176 -338/-141 -337/-140 +f -371/-174 -372/-175 -337/-140 -336/-139 +f -370/-173 -371/-174 -336/-139 -335/-138 +f -369/-172 -370/-173 -335/-138 -334/-137 +f -368/-171 -369/-172 -334/-137 -333/-136 +f -367/-170 -368/-171 -333/-136 -332/-135 +f -366/-169 -367/-170 -332/-135 -331/-134 +f -365/-168 -366/-169 -331/-134 -330/-133 +f -364/-167 -365/-168 -330/-133 -329/-132 +f -363/-166 -364/-167 -329/-132 -328/-131 +f -362/-165 -363/-166 -328/-131 -327/-130 +f -361/-164 -362/-165 -327/-130 -326/-129 +f -360/-163 -361/-164 -326/-129 -325/-128 +f -359/-162 -360/-163 -325/-128 -324/-127 +f -358/-161 -359/-162 -324/-127 -323/-126 +f -356/-159 -358/-161 -323/-126 -322/-125 +f -355/-158 -356/-159 -322/-125 -321/-124 +f -354/-157 -355/-158 -321/-124 -320/-123 +f -353/-156 -354/-157 -320/-123 -319/-122 +f -352/-155 -353/-156 -319/-122 -318/-121 +f -351/-154 -352/-155 -318/-121 -317/-120 +f -350/-153 -351/-154 -317/-120 -316/-119 +f -349/-152 -350/-153 -316/-119 -315/-118 +f -348/-184 -349/-151 -315/-117 -314/-149 +f -381/-151 -348/-184 -314/-149 -346/-117 +f -347/-150 -346/-149 -312/-115 -313/-116 +f -345/-148 -347/-150 -313/-116 -311/-114 +f -344/-147 -345/-148 -311/-114 -310/-113 +f -343/-146 -344/-147 -310/-113 -309/-112 +f -342/-145 -343/-146 -309/-112 -308/-111 +f -341/-144 -342/-145 -308/-111 -307/-110 +f -340/-143 -341/-144 -307/-110 -306/-109 +f -339/-142 -340/-143 -306/-109 -305/-108 +f -338/-141 -339/-142 -305/-108 -304/-107 +f -337/-140 -338/-141 -304/-107 -303/-106 +f -336/-139 -337/-140 -303/-106 -302/-105 +f -335/-138 -336/-139 -302/-105 -301/-104 +f -334/-137 -335/-138 -301/-104 -300/-103 +f -333/-136 -334/-137 -300/-103 -299/-102 +f -332/-135 -333/-136 -299/-102 -298/-101 +f -331/-134 -332/-135 -298/-101 -297/-100 +f -330/-133 -331/-134 -297/-100 -296/-99 +f -329/-132 -330/-133 -296/-99 -295/-98 +f -328/-131 -329/-132 -295/-98 -294/-97 +f -327/-130 -328/-131 -294/-97 -293/-96 +f -326/-129 -327/-130 -293/-96 -292/-95 +f -325/-128 -326/-129 -292/-95 -291/-94 +f -324/-127 -325/-128 -291/-94 -290/-93 +f -323/-126 -324/-127 -290/-93 -289/-92 +f -322/-125 -323/-126 -289/-92 -288/-91 +f -321/-124 -322/-125 -288/-91 -287/-90 +f -320/-123 -321/-124 -287/-90 -286/-89 +f -319/-122 -320/-123 -286/-89 -285/-88 +f -318/-121 -319/-122 -285/-88 -284/-87 +f -317/-120 -318/-121 -284/-87 -283/-86 +f -316/-119 -317/-120 -283/-86 -282/-85 +f -315/-118 -316/-119 -282/-85 -281/-84 +f -314/-149 -315/-117 -281/-83 -280/-115 +f -346/-117 -314/-149 -280/-115 -312/-83 +f -313/-116 -312/-115 -278/-81 -279/-82 +f -311/-114 -313/-116 -279/-82 -277/-80 +f -310/-113 -311/-114 -277/-80 -276/-79 +f -309/-112 -310/-113 -276/-79 -275/-78 +f -308/-111 -309/-112 -275/-78 -274/-77 +f -307/-110 -308/-111 -274/-77 -273/-76 +f -306/-109 -307/-110 -273/-76 -272/-75 +f -305/-108 -306/-109 -272/-75 -271/-74 +f -304/-107 -305/-108 -271/-74 -270/-73 +f -303/-106 -304/-107 -270/-73 -269/-72 +f -302/-105 -303/-106 -269/-72 -268/-71 +f -301/-104 -302/-105 -268/-71 -267/-70 +f -300/-103 -301/-104 -267/-70 -266/-69 +f -299/-102 -300/-103 -266/-69 -265/-68 +f -298/-101 -299/-102 -265/-68 -264/-67 +f -297/-100 -298/-101 -264/-67 -263/-66 +f -296/-99 -297/-100 -263/-66 -262/-65 +f -295/-98 -296/-99 -262/-65 -261/-64 +f -294/-97 -295/-98 -261/-64 -260/-63 +f -293/-96 -294/-97 -260/-63 -259/-62 +f -292/-95 -293/-96 -259/-62 -258/-61 +f -291/-94 -292/-95 -258/-61 -257/-60 +f -290/-93 -291/-94 -257/-60 -256/-59 +f -289/-92 -290/-93 -256/-59 -255/-58 +f -288/-91 -289/-92 -255/-58 -254/-57 +f -287/-90 -288/-91 -254/-57 -253/-56 +f -286/-89 -287/-90 -253/-56 -252/-55 +f -285/-88 -286/-89 -252/-55 -251/-54 +f -284/-87 -285/-88 -251/-54 -250/-53 +f -283/-86 -284/-87 -250/-53 -249/-52 +f -282/-85 -283/-86 -249/-52 -248/-51 +f -281/-84 -282/-85 -248/-51 -247/-50 +f -280/-115 -281/-83 -247/-49 -246/-81 +f -312/-83 -280/-115 -246/-81 -278/-49 +f -279/-82 -278/-81 -245/-48 +f -277/-80 -279/-82 -245/-47 +f -276/-79 -277/-80 -245/-46 +f -275/-78 -276/-79 -245/-45 +f -274/-77 -275/-78 -245/-44 +f -273/-76 -274/-77 -245/-43 +f -272/-75 -273/-76 -245/-42 +f -271/-74 -272/-75 -245/-41 +f -270/-73 -271/-74 -245/-40 +f -269/-72 -270/-73 -245/-39 +f -268/-71 -269/-72 -245/-38 +f -267/-70 -268/-71 -245/-37 +f -266/-69 -267/-70 -245/-36 +f -265/-68 -266/-69 -245/-35 +f -264/-67 -265/-68 -245/-34 +f -263/-66 -264/-67 -245/-33 +f -262/-65 -263/-66 -245/-32 +f -261/-64 -262/-65 -245/-31 +f -260/-63 -261/-64 -245/-30 +f -259/-62 -260/-63 -245/-29 +f -258/-61 -259/-62 -245/-28 +f -257/-60 -258/-61 -245/-27 +f -256/-59 -257/-60 -245/-26 +f -255/-58 -256/-59 -245/-25 +f -254/-57 -255/-58 -245/-24 +f -253/-56 -254/-57 -245/-23 +f -252/-55 -253/-56 -245/-22 +f -251/-54 -252/-55 -245/-21 +f -250/-53 -251/-54 -245/-20 +f -249/-52 -250/-53 -245/-19 +f -248/-51 -249/-52 -245/-18 +f -247/-50 -248/-51 -245/-17 +f -246/-81 -247/-49 -245/-48 +f -278/-49 -246/-81 -245/-48 +f -242/-8 -357/-160 -243/-6 -244/-7 +f -240/-15 -241/-16 -407/-216 -447/-250 +f -239/-14 -240/-15 -447/-250 -448/-251 +f -237/-12 -238/-13 -239/-14 -448/-251 +f -236/-11 -237/-12 -448/-251 -414/-217 +f -234/-9 -235/-10 -236/-11 -414/-217 +f -242/-8 -234/-9 -414/-217 -357/-160 +f -232/-1 -233/-2 -243/-6 -357/-160 +f -406/-206 -231/-3 -232/-1 -357/-160 +f -229/-5 -230/-4 -231/-3 -406/-206 +f -405/-207 -229/-5 -406/-206 +f -225/-16 -226/-16 -227/-15 -228/-15 +f -223/-216 -224/-216 -226/-16 -225/-16 +f -219/-9 -220/-10 -221/-10 -222/-9 +f -217/-11 -218/-11 -221/-10 -220/-10 +f -215/-12 -216/-12 -218/-11 -217/-11 +f -213/-13 -214/-13 -216/-12 -215/-12 +f -228/-15 -227/-15 -211/-14 -212/-14 +f -212/-14 -211/-14 -214/-13 -213/-13 +f -209/-215 -210/-215 -224/-216 -223/-216 +f -207/-214 -208/-214 -210/-215 -209/-215 +f -205/-213 -206/-213 -208/-214 -207/-214 +f -203/-210 -204/-210 -206/-213 -205/-213 +f -201/-212 -202/-212 -204/-210 -203/-210 +f -199/-211 -200/-211 -202/-212 -201/-212 +f -197/-209 -198/-209 -200/-211 -199/-211 +f -195/-193 -196/-193 -198/-209 -197/-209 +f -193/-194 -194/-194 -196/-193 -195/-193 +f -191/-195 -192/-195 -194/-194 -193/-194 +f -191/-195 -189/-196 -190/-196 -192/-195 +f -189/-196 -187/-197 -188/-197 -190/-196 +f -183/-4 -184/-3 -185/-3 -186/-4 +f -184/-3 -181/-1 -182/-1 -185/-3 +f -181/-1 -179/-2 -180/-2 -182/-1 +f -179/-2 -177/-6 -178/-6 -180/-2 +f -177/-6 -175/-7 -176/-7 -178/-6 +f -173/-8 -219/-9 -222/-9 -174/-8 +f -175/-7 -173/-8 -174/-8 -176/-7 +f -187/-197 -171/-198 -172/-198 -188/-197 +f -171/-198 -169/-199 -170/-199 -172/-198 +f -169/-199 -167/-200 -168/-200 -170/-199 +f -167/-200 -165/-201 -166/-201 -168/-200 +f -165/-201 -163/-202 -164/-202 -166/-201 +f -163/-202 -161/-204 -162/-204 -164/-202 +f -161/-204 -159/-205 -160/-205 -162/-204 +f -159/-205 -157/-208 -158/-208 -160/-205 +f -157/-208 -155/-207 -156/-207 -158/-208 +f -155/-207 -153/-5 -154/-5 -156/-207 +f -153/-5 -183/-4 -186/-4 -154/-5 +f -149/-16 -150/-15 -151/-15 -152/-16 +f -147/-216 -149/-16 -152/-16 -148/-216 +f -143/-10 -144/-9 -145/-9 -146/-10 +f -141/-11 -143/-10 -146/-10 -142/-11 +f -139/-12 -141/-11 -142/-11 -140/-12 +f -137/-13 -139/-12 -140/-12 -138/-13 +f -150/-15 -135/-14 -136/-14 -151/-15 +f -135/-14 -137/-13 -138/-13 -136/-14 +f -133/-215 -147/-216 -148/-216 -134/-215 +f -131/-214 -133/-215 -134/-215 -132/-214 +f -129/-213 -131/-214 -132/-214 -130/-213 +f -127/-210 -129/-213 -130/-213 -128/-210 +f -125/-212 -127/-210 -128/-210 -126/-212 +f -123/-211 -125/-212 -126/-212 -124/-211 +f -121/-209 -123/-211 -124/-211 -122/-209 +f -119/-193 -121/-209 -122/-209 -120/-193 +f -117/-194 -119/-193 -120/-193 -118/-194 +f -115/-195 -117/-194 -118/-194 -116/-195 +f -115/-195 -116/-195 -113/-196 -114/-196 +f -114/-196 -113/-196 -111/-197 -112/-197 +f -107/-4 -108/-4 -109/-3 -110/-3 +f -110/-3 -109/-3 -105/-1 -106/-1 +f -106/-1 -105/-1 -103/-2 -104/-2 +f -104/-2 -103/-2 -101/-6 -102/-6 +f -102/-6 -101/-6 -99/-7 -100/-7 +f -144/-9 -97/-8 -98/-8 -145/-9 +f -100/-7 -99/-7 -98/-8 -97/-8 +f -112/-197 -111/-197 -95/-198 -96/-198 +f -96/-198 -95/-198 -93/-199 -94/-199 +f -94/-199 -93/-199 -91/-200 -92/-200 +f -92/-200 -91/-200 -89/-201 -90/-201 +f -90/-201 -89/-201 -87/-202 -88/-202 +f -88/-202 -87/-202 -85/-204 -86/-204 +f -86/-204 -85/-204 -83/-205 -84/-205 +f -84/-205 -83/-205 -81/-208 -82/-208 +f -82/-208 -81/-208 -79/-207 -80/-207 +f -80/-207 -79/-207 -77/-5 -78/-5 +f -78/-5 -77/-5 -108/-4 -107/-4 +f -73/-11 -74/-13 -75/-14 -76/-15 +f -73/-11 -72/-12 -74/-13 +f -69/-7 -70/-9 -71/-10 -73/-11 +f -69/-7 -68/-8 -70/-9 +f -65/-3 -66/-2 -67/-6 -69/-7 +f -65/-3 -64/-1 -66/-2 +f -63/-215 -65/-3 -69/-7 -73/-11 +f -60/-207 -61/-5 -62/-4 -65/-3 +f -57/-202 -58/-205 -59/-208 -60/-207 +f -57/-202 -56/-204 -58/-205 +f -55/-194 -57/-202 -60/-207 -65/-3 +f -52/-198 -53/-200 -54/-201 -57/-202 +f -52/-198 -51/-199 -53/-200 +f -55/-194 -49/-196 -50/-197 -52/-198 +f -55/-194 -48/-195 -49/-196 +f -55/-194 -52/-198 -57/-202 +f -45/-212 -46/-209 -47/-193 -55/-194 +f -45/-212 -44/-211 -46/-209 +f -63/-215 -42/-213 -43/-210 -45/-212 +f -63/-215 -41/-214 -42/-213 +f -65/-3 -63/-215 -45/-212 -55/-194 +f -40/-216 -63/-215 -73/-11 -76/-15 +f -39/-16 -40/-216 -76/-15 +f -35/-14 -36/-215 -37/-216 -38/-16 +f -32/-212 -33/-213 -34/-214 -36/-215 +f -32/-212 -31/-210 -33/-213 +f -28/-194 -29/-209 -30/-211 -32/-212 +f -28/-194 -27/-193 -29/-209 +f -26/-12 -28/-194 -32/-212 -36/-215 +f -23/-198 -24/-196 -25/-195 -28/-194 +f -23/-198 -22/-197 -24/-196 +f -19/-202 -20/-200 -21/-199 -23/-198 +f -19/-202 -18/-201 -20/-200 +f -17/-1 -19/-202 -23/-198 -28/-194 +f -14/-207 -15/-205 -16/-204 -19/-202 +f -14/-207 -13/-208 -15/-205 +f -17/-1 -11/-4 -12/-5 -14/-207 +f -17/-1 -10/-3 -11/-4 +f -17/-1 -14/-207 -19/-202 +f -7/-8 -8/-6 -9/-2 -17/-1 +f -7/-8 -6/-7 -8/-6 +f -26/-12 -4/-10 -5/-9 -7/-8 +f -26/-12 -3/-11 -4/-10 +f -28/-194 -26/-12 -7/-8 -17/-1 +f -36/-215 -35/-14 -2/-13 -26/-12 +f -1/-15 -35/-14 -38/-16 +f -226/-16 -39/-16 -76/-15 -227/-15 +f -228/-15 -520/-15 -521/-16 -225/-16 +f -224/-216 -40/-216 -39/-16 -226/-16 +f -225/-16 -521/-16 -690/-216 -223/-216 +f -221/-10 -71/-10 -70/-9 -222/-9 +f -219/-9 -514/-9 -515/-10 -220/-10 +f -218/-11 -73/-11 -71/-10 -221/-10 +f -220/-10 -515/-10 -516/-11 -217/-11 +f -216/-12 -72/-12 -73/-11 -218/-11 +f -217/-11 -516/-11 -517/-12 -215/-12 +f -214/-13 -74/-13 -72/-12 -216/-12 +f -215/-12 -517/-12 -518/-13 -213/-13 +f -227/-15 -76/-15 -75/-14 -211/-14 +f -212/-14 -519/-14 -520/-15 -228/-15 +f -211/-14 -75/-14 -74/-13 -214/-13 +f -213/-13 -518/-13 -519/-14 -212/-14 +f -210/-215 -63/-215 -40/-216 -224/-216 +f -223/-216 -690/-216 -689/-215 -209/-215 +f -208/-214 -41/-214 -63/-215 -210/-215 +f -209/-215 -689/-215 -688/-214 -207/-214 +f -206/-213 -42/-213 -41/-214 -208/-214 +f -207/-214 -688/-214 -687/-213 -205/-213 +f -204/-210 -43/-210 -42/-213 -206/-213 +f -205/-213 -687/-213 -684/-210 -203/-210 +f -202/-212 -45/-212 -43/-210 -204/-210 +f -203/-210 -684/-210 -686/-212 -201/-212 +f -200/-211 -44/-211 -45/-212 -202/-212 +f -201/-212 -686/-212 -685/-211 -199/-211 +f -198/-209 -46/-209 -44/-211 -200/-211 +f -199/-211 -685/-211 -683/-209 -197/-209 +f -196/-193 -47/-193 -46/-209 -198/-209 +f -197/-209 -683/-209 -667/-193 -195/-193 +f -194/-194 -55/-194 -47/-193 -196/-193 +f -195/-193 -667/-193 -668/-194 -193/-194 +f -192/-195 -48/-195 -55/-194 -194/-194 +f -193/-194 -668/-194 -669/-195 -191/-195 +f -192/-195 -190/-196 -49/-196 -48/-195 +f -189/-196 -191/-195 -669/-195 -670/-196 +f -190/-196 -188/-197 -50/-197 -49/-196 +f -187/-197 -189/-196 -670/-196 -671/-197 +f -186/-4 -185/-3 -65/-3 -62/-4 +f -184/-3 -183/-4 -509/-4 -508/-3 +f -185/-3 -182/-1 -64/-1 -65/-3 +f -181/-1 -184/-3 -508/-3 -506/-1 +f -182/-1 -180/-2 -66/-2 -64/-1 +f -179/-2 -181/-1 -506/-1 -507/-2 +f -180/-2 -178/-6 -67/-6 -66/-2 +f -177/-6 -179/-2 -507/-2 -511/-6 +f -178/-6 -176/-7 -69/-7 -67/-6 +f -175/-7 -177/-6 -511/-6 -512/-7 +f -174/-8 -222/-9 -70/-9 -68/-8 +f -219/-9 -173/-8 -513/-8 -514/-9 +f -176/-7 -174/-8 -68/-8 -69/-7 +f -173/-8 -175/-7 -512/-7 -513/-8 +f -188/-197 -172/-198 -52/-198 -50/-197 +f -171/-198 -187/-197 -671/-197 -672/-198 +f -172/-198 -170/-199 -51/-199 -52/-198 +f -169/-199 -171/-198 -672/-198 -673/-199 +f -170/-199 -168/-200 -53/-200 -51/-199 +f -167/-200 -169/-199 -673/-199 -674/-200 +f -168/-200 -166/-201 -54/-201 -53/-200 +f -165/-201 -167/-200 -674/-200 -675/-201 +f -166/-201 -164/-202 -57/-202 -54/-201 +f -163/-202 -165/-201 -675/-201 -676/-202 +f -164/-202 -162/-204 -56/-204 -57/-202 +f -161/-204 -163/-202 -676/-202 -678/-204 +f -162/-204 -160/-205 -58/-205 -56/-204 +f -159/-205 -161/-204 -678/-204 -679/-205 +f -160/-205 -158/-208 -59/-208 -58/-205 +f -157/-208 -159/-205 -679/-205 -682/-208 +f -158/-208 -156/-207 -60/-207 -59/-208 +f -155/-207 -157/-208 -682/-208 -681/-207 +f -156/-207 -154/-5 -61/-5 -60/-207 +f -153/-5 -155/-207 -681/-207 -510/-5 +f -154/-5 -186/-4 -62/-4 -61/-5 +f -183/-4 -153/-5 -510/-5 -509/-4 +f -152/-16 -151/-15 -1/-15 -38/-16 +f -150/-15 -149/-16 -241/-16 -240/-15 +f -148/-216 -152/-16 -38/-16 -37/-216 +f -149/-16 -147/-216 -407/-216 -241/-16 +f -146/-10 -145/-9 -5/-9 -4/-10 +f -144/-9 -143/-10 -235/-10 -234/-9 +f -142/-11 -146/-10 -4/-10 -3/-11 +f -143/-10 -141/-11 -236/-11 -235/-10 +f -140/-12 -142/-11 -3/-11 -26/-12 +f -141/-11 -139/-12 -237/-12 -236/-11 +f -138/-13 -140/-12 -26/-12 -2/-13 +f -139/-12 -137/-13 -238/-13 -237/-12 +f -151/-15 -136/-14 -35/-14 -1/-15 +f -135/-14 -150/-15 -240/-15 -239/-14 +f -136/-14 -138/-13 -2/-13 -35/-14 +f -137/-13 -135/-14 -239/-14 -238/-13 +f -134/-215 -148/-216 -37/-216 -36/-215 +f -147/-216 -133/-215 -408/-215 -407/-216 +f -132/-214 -134/-215 -36/-215 -34/-214 +f -133/-215 -131/-214 -409/-214 -408/-215 +f -130/-213 -132/-214 -34/-214 -33/-213 +f -131/-214 -129/-213 -410/-213 -409/-214 +f -128/-210 -130/-213 -33/-213 -31/-210 +f -129/-213 -127/-210 -411/-210 -410/-213 +f -126/-212 -128/-210 -31/-210 -32/-212 +f -127/-210 -125/-212 -412/-212 -411/-210 +f -124/-211 -126/-212 -32/-212 -30/-211 +f -125/-212 -123/-211 -413/-211 -412/-212 +f -122/-209 -124/-211 -30/-211 -29/-209 +f -123/-211 -121/-209 -390/-209 -413/-211 +f -120/-193 -122/-209 -29/-209 -27/-193 +f -121/-209 -119/-193 -391/-193 -390/-209 +f -118/-194 -120/-193 -27/-193 -28/-194 +f -119/-193 -117/-194 -392/-194 -391/-193 +f -116/-195 -118/-194 -28/-194 -25/-195 +f -117/-194 -115/-195 -393/-195 -392/-194 +f -116/-195 -25/-195 -24/-196 -113/-196 +f -114/-196 -394/-196 -393/-195 -115/-195 +f -113/-196 -24/-196 -22/-197 -111/-197 +f -112/-197 -395/-197 -394/-196 -114/-196 +f -108/-4 -11/-4 -10/-3 -109/-3 +f -110/-3 -231/-3 -230/-4 -107/-4 +f -109/-3 -10/-3 -17/-1 -105/-1 +f -106/-1 -232/-1 -231/-3 -110/-3 +f -105/-1 -17/-1 -9/-2 -103/-2 +f -104/-2 -233/-2 -232/-1 -106/-1 +f -103/-2 -9/-2 -8/-6 -101/-6 +f -102/-6 -243/-6 -233/-2 -104/-2 +f -101/-6 -8/-6 -6/-7 -99/-7 +f -100/-7 -244/-7 -243/-6 -102/-6 +f -98/-8 -7/-8 -5/-9 -145/-9 +f -144/-9 -234/-9 -242/-8 -97/-8 +f -99/-7 -6/-7 -7/-8 -98/-8 +f -97/-8 -242/-8 -244/-7 -100/-7 +f -111/-197 -22/-197 -23/-198 -95/-198 +f -96/-198 -396/-198 -395/-197 -112/-197 +f -95/-198 -23/-198 -21/-199 -93/-199 +f -94/-199 -397/-199 -396/-198 -96/-198 +f -93/-199 -21/-199 -20/-200 -91/-200 +f -92/-200 -398/-200 -397/-199 -94/-199 +f -91/-200 -20/-200 -18/-201 -89/-201 +f -90/-201 -399/-201 -398/-200 -92/-200 +f -89/-201 -18/-201 -19/-202 -87/-202 +f -88/-202 -400/-202 -399/-201 -90/-201 +f -87/-202 -19/-202 -16/-204 -85/-204 +f -86/-204 -402/-204 -400/-202 -88/-202 +f -85/-204 -16/-204 -15/-205 -83/-205 +f -84/-205 -403/-205 -402/-204 -86/-204 +f -83/-205 -15/-205 -13/-208 -81/-208 +f -82/-208 -404/-208 -403/-205 -84/-205 +f -81/-208 -13/-208 -14/-207 -79/-207 +f -80/-207 -405/-207 -404/-208 -82/-208 +f -79/-207 -14/-207 -12/-5 -77/-5 +f -78/-5 -229/-5 -405/-207 -80/-207 +f -77/-5 -12/-5 -11/-4 -108/-4 +f -107/-4 -230/-4 -229/-5 -78/-5 +# 768 polygons - 92 triangles + +# +# object Sphere004 +# + +v 7.036086 36.204266 -9.834373 +v 6.798154 36.298820 -9.859690 +v 6.815731 36.337055 -9.832330 +v 6.841424 36.369774 -9.804245 +v 6.874246 36.395718 -9.776515 +v 6.912934 36.413891 -9.750206 +v 6.956004 36.423599 -9.726328 +v 7.001799 36.424461 -9.705799 +v 7.048559 36.416454 -9.689408 +v 7.094487 36.399876 -9.677785 +v 7.137819 36.375370 -9.671377 +v 7.176889 36.343872 -9.670429 +v 7.210196 36.306599 -9.674979 +v 7.236461 36.264984 -9.684852 +v 7.254672 36.220619 -9.699667 +v 7.264132 36.175213 -9.718856 +v 7.264475 36.130512 -9.741681 +v 7.255689 36.088230 -9.767265 +v 7.238112 36.049999 -9.794625 +v 7.212419 36.017281 -9.822710 +v 7.179597 35.991337 -9.850440 +v 7.140908 35.973160 -9.876750 +v 7.097839 35.963455 -9.900627 +v 7.052044 35.962593 -9.921157 +v 7.005284 35.970600 -9.937548 +v 6.959356 35.987179 -9.949170 +v 6.916024 36.011684 -9.955579 +v 6.876953 36.043182 -9.956526 +v 6.843646 36.080452 -9.951976 +v 6.817382 36.122070 -9.942103 +v 6.799171 36.166435 -9.927288 +v 6.789711 36.211842 -9.908099 +v 6.789369 36.256542 -9.885274 +v 6.551037 36.368263 -9.842244 +v 6.585516 36.443260 -9.788575 +v 6.635915 36.507439 -9.733484 +v 6.700296 36.558331 -9.679090 +v 6.776187 36.593983 -9.627482 +v 6.860671 36.613022 -9.580644 +v 6.950500 36.614716 -9.540375 +v 7.042223 36.599003 -9.508224 +v 7.132316 36.566486 -9.485424 +v 7.217315 36.518414 -9.472854 +v 7.293954 36.456635 -9.470995 +v 7.359288 36.383522 -9.479920 +v 7.410807 36.301884 -9.499285 +v 7.446530 36.214863 -9.528346 +v 7.465085 36.125797 -9.565987 +v 7.465758 36.038109 -9.610760 +v 7.448524 35.955177 -9.660946 +v 7.414046 35.880177 -9.714615 +v 7.363647 35.816002 -9.769705 +v 7.299265 35.765110 -9.824100 +v 7.223374 35.729458 -9.875708 +v 7.138890 35.710419 -9.922545 +v 7.049061 35.708725 -9.962814 +v 6.957338 35.724438 -9.994967 +v 6.867246 35.756954 -10.017765 +v 6.782247 35.805027 -10.030335 +v 6.705607 35.866806 -10.032194 +v 6.640273 35.939919 -10.023269 +v 6.588755 36.021557 -10.003904 +v 6.553032 36.108578 -9.974843 +v 6.534477 36.197647 -9.937202 +v 6.533804 36.285332 -9.892428 +v 6.304233 36.409924 -9.782704 +v 6.354288 36.518803 -9.704789 +v 6.427455 36.611977 -9.624810 +v 6.520923 36.685860 -9.545842 +v 6.631100 36.737617 -9.470920 +v 6.753751 36.765255 -9.402921 +v 6.884163 36.767719 -9.344460 +v 7.017324 36.744907 -9.297782 +v 7.148118 36.697701 -9.264683 +v 7.271517 36.627911 -9.246433 +v 7.382780 36.538219 -9.243735 +v 7.477631 36.432076 -9.256692 +v 7.552424 36.313557 -9.284805 +v 7.604286 36.187218 -9.326996 +v 7.631224 36.057915 -9.381641 +v 7.632201 35.930614 -9.446643 +v 7.607182 35.810211 -9.519501 +v 7.557127 35.701332 -9.597416 +v 7.483959 35.608162 -9.677395 +v 7.390491 35.534279 -9.756363 +v 7.280314 35.482521 -9.831285 +v 7.157663 35.454880 -9.899284 +v 7.027251 35.452419 -9.957746 +v 6.894089 35.475231 -10.004423 +v 6.763296 35.522438 -10.037522 +v 6.639896 35.592228 -10.055771 +v 6.528634 35.681919 -10.058470 +v 6.433783 35.788063 -10.045512 +v 6.358990 35.906582 -10.017399 +v 6.307128 36.032921 -9.975208 +v 6.280190 36.162224 -9.920563 +v 6.279213 36.289524 -9.855562 +v 6.067224 36.422203 -9.683360 +v 6.130932 36.560780 -9.584192 +v 6.224057 36.679363 -9.482399 +v 6.343019 36.773399 -9.381892 +v 6.483247 36.839275 -9.286532 +v 6.639352 36.874454 -9.199986 +v 6.805335 36.877586 -9.125580 +v 6.974817 36.848553 -9.066171 +v 7.141286 36.788471 -9.024043 +v 7.298344 36.699642 -9.000816 +v 7.439955 36.585487 -8.997382 +v 7.560677 36.450394 -9.013873 +v 7.655870 36.299549 -9.049655 +v 7.721879 36.138748 -9.103354 +v 7.756164 35.974178 -9.172904 +v 7.757408 35.812157 -9.255634 +v 7.725564 35.658913 -9.348365 +v 7.661855 35.520336 -9.447533 +v 7.568730 35.401752 -9.549326 +v 7.449768 35.307716 -9.649834 +v 7.309540 35.241840 -9.745193 +v 7.153435 35.206661 -9.831738 +v 6.987452 35.203529 -9.906145 +v 6.817969 35.232563 -9.965554 +v 6.651501 35.292645 -10.007681 +v 6.494443 35.381474 -10.030909 +v 6.352832 35.495628 -10.034342 +v 6.232111 35.630722 -10.017851 +v 6.136917 35.781567 -9.982069 +v 6.070909 35.942368 -9.928370 +v 6.036624 36.106937 -9.858820 +v 6.035380 36.268959 -9.776090 +v 5.849119 36.404625 -9.548028 +v 5.924032 36.567574 -9.431419 +v 6.033535 36.707016 -9.311724 +v 6.173420 36.817589 -9.193539 +v 6.338311 36.895050 -9.081409 +v 6.521871 36.936417 -8.979641 +v 6.717046 36.940102 -8.892148 +v 6.916337 36.905960 -8.822290 +v 7.112083 36.835308 -8.772754 +v 7.296763 36.730862 -8.745441 +v 7.463280 36.596630 -8.741404 +v 7.605234 36.437775 -8.760795 +v 7.717171 36.260399 -8.802870 +v 7.794787 36.071320 -8.866013 +v 7.835102 35.877804 -8.947795 +v 7.836565 35.687286 -9.045075 +v 7.799121 35.507092 -9.154116 +v 7.724208 35.344143 -9.270724 +v 7.614705 35.204700 -9.390421 +v 7.474820 35.094124 -9.508605 +v 7.309929 35.016666 -9.620735 +v 7.126369 34.975300 -9.722503 +v 6.931193 34.971615 -9.809996 +v 6.731903 35.005756 -9.879853 +v 6.536156 35.076408 -9.929390 +v 6.351476 35.180855 -9.956701 +v 6.184959 35.315086 -9.960739 +v 6.043005 35.473942 -9.941348 +v 5.931069 35.651318 -9.899273 +v 5.853453 35.840397 -9.836130 +v 5.813138 36.033913 -9.754347 +v 5.811675 36.224430 -9.657066 +v 5.658301 36.357864 -9.381910 +v 5.741540 36.538925 -9.252341 +v 5.863213 36.693867 -9.119342 +v 6.018645 36.816730 -8.988023 +v 6.201861 36.902798 -8.863430 +v 6.405823 36.948761 -8.750352 +v 6.622690 36.952858 -8.653134 +v 6.844130 36.914921 -8.575514 +v 7.061631 36.836418 -8.520472 +v 7.266837 36.720364 -8.490124 +v 7.451860 36.571213 -8.485637 +v 7.609591 36.394703 -8.507183 +v 7.733968 36.197613 -8.553935 +v 7.820211 35.987518 -8.624095 +v 7.865007 35.772495 -8.714967 +v 7.866632 35.560806 -8.823059 +v 7.825027 35.360584 -8.944218 +v 7.741787 35.179523 -9.073787 +v 7.620114 35.024582 -9.206786 +v 7.464683 34.901718 -9.338105 +v 7.281466 34.815651 -9.462698 +v 7.077504 34.769688 -9.575775 +v 6.860637 34.765594 -9.672993 +v 6.639197 34.803528 -9.750614 +v 6.421696 34.882030 -9.805656 +v 6.216490 34.998089 -9.836003 +v 6.031466 35.147240 -9.840490 +v 5.873736 35.323750 -9.818943 +v 5.749359 35.520840 -9.772192 +v 5.663116 35.730930 -9.702032 +v 5.618321 35.945957 -9.611159 +v 5.616695 36.157646 -9.503067 +v 5.502102 36.283726 -9.191389 +v 5.590468 36.475941 -9.053840 +v 5.719635 36.640423 -8.912648 +v 5.884641 36.770855 -8.773240 +v 6.079143 36.862225 -8.640974 +v 6.295666 36.911018 -8.520931 +v 6.525892 36.915363 -8.417726 +v 6.760971 36.875095 -8.335323 +v 6.991869 36.791756 -8.276891 +v 7.209714 36.668549 -8.244674 +v 7.406134 36.510216 -8.239910 +v 7.573580 36.322830 -8.262784 +v 7.705618 36.113602 -8.312415 +v 7.797174 35.890568 -8.386896 +v 7.844728 35.662300 -8.483366 +v 7.846454 35.437572 -8.598116 +v 7.802285 35.225018 -8.726737 +v 7.713919 35.032803 -8.864286 +v 7.584751 34.868320 -9.005478 +v 7.419746 34.737888 -9.144886 +v 7.225244 34.646519 -9.277153 +v 7.008720 34.597725 -9.397196 +v 6.778494 34.593380 -9.500401 +v 6.543416 34.633648 -9.582803 +v 6.312517 34.716988 -9.641235 +v 6.094672 34.840195 -9.673452 +v 5.898252 34.998531 -9.678215 +v 5.730806 35.185913 -9.655341 +v 5.598769 35.395142 -9.605710 +v 5.507214 35.618176 -9.531229 +v 5.459659 35.846443 -9.434759 +v 5.457933 36.071175 -9.320009 +v 5.386524 36.185055 -8.983787 +v 5.476622 36.381031 -8.843543 +v 5.608319 36.548737 -8.699585 +v 5.776557 36.681725 -8.557446 +v 5.974870 36.774883 -8.422588 +v 6.195636 36.824635 -8.300194 +v 6.430371 36.829067 -8.194966 +v 6.670055 36.788006 -8.110950 +v 6.905478 36.703037 -8.051373 +v 7.127591 36.577415 -8.018524 +v 7.327859 36.415977 -8.013668 +v 7.498586 36.224922 -8.036989 +v 7.633210 36.011597 -8.087593 +v 7.726560 35.784195 -8.163533 +v 7.775045 35.551453 -8.261893 +v 7.776805 35.322323 -8.378891 +v 7.731771 35.105602 -8.510033 +v 7.641674 34.909626 -8.650276 +v 7.509975 34.741920 -8.794234 +v 7.341737 34.608932 -8.936373 +v 7.143425 34.515774 -9.071231 +v 6.922658 34.466022 -9.193625 +v 6.687923 34.461590 -9.298853 +v 6.448239 34.502651 -9.382870 +v 6.212816 34.587624 -9.442446 +v 5.990704 34.713242 -9.475294 +v 5.790436 34.874680 -9.480150 +v 5.619709 35.065735 -9.456829 +v 5.485085 35.279060 -9.406225 +v 5.391736 35.506466 -9.330284 +v 5.343250 35.739204 -9.231925 +v 5.341491 35.968338 -9.114926 +v 5.316010 36.065639 -8.767081 +v 5.404376 36.257851 -8.629533 +v 5.533544 36.422337 -8.488341 +v 5.698548 36.552769 -8.348933 +v 5.893051 36.644138 -8.216666 +v 6.109574 36.692932 -8.096623 +v 6.339800 36.697277 -7.993418 +v 6.574879 36.657009 -7.911016 +v 6.805777 36.573669 -7.852583 +v 7.023623 36.450462 -7.820366 +v 7.220042 36.292126 -7.815603 +v 7.387488 36.104744 -7.838477 +v 7.519526 35.895515 -7.888108 +v 7.611082 35.672482 -7.962589 +v 7.658637 35.444214 -8.059059 +v 7.660362 35.219482 -8.173809 +v 7.616194 35.006927 -8.302430 +v 7.527827 34.814716 -8.439980 +v 7.398660 34.650234 -8.581171 +v 7.233654 34.519802 -8.720579 +v 7.039152 34.428432 -8.852845 +v 6.822628 34.379639 -8.972888 +v 6.592402 34.375294 -9.076094 +v 6.357324 34.415562 -9.158496 +v 6.126425 34.498901 -9.216928 +v 5.908580 34.622108 -9.249145 +v 5.712160 34.780445 -9.253908 +v 5.544714 34.967827 -9.231034 +v 5.412676 35.177055 -9.181403 +v 5.321121 35.400089 -9.106921 +v 5.273567 35.628357 -9.010452 +v 5.271842 35.853088 -8.895701 +v 5.293269 35.930073 -8.549602 +v 5.376508 36.111134 -8.420033 +v 5.498180 36.266071 -8.287033 +v 5.653612 36.388939 -8.155714 +v 5.836829 36.475006 -8.031121 +v 6.040790 36.520969 -7.918044 +v 6.257658 36.525063 -7.820826 +v 6.479097 36.487129 -7.743205 +v 6.696599 36.408627 -7.688163 +v 6.901804 36.292568 -7.657815 +v 7.086828 36.143421 -7.653328 +v 7.244559 35.966908 -7.674875 +v 7.368936 35.769821 -7.721626 +v 7.455179 35.559727 -7.791786 +v 7.499975 35.344704 -7.882658 +v 7.501600 35.133011 -7.990750 +v 7.459994 34.932789 -8.111909 +v 7.376755 34.751732 -8.241478 +v 7.255082 34.596790 -8.374477 +v 7.099650 34.473927 -8.505796 +v 6.916433 34.387859 -8.630389 +v 6.712472 34.341896 -8.743467 +v 6.495605 34.337799 -8.840684 +v 6.274165 34.375736 -8.918305 +v 6.056663 34.454239 -8.973348 +v 5.851458 34.570297 -9.003695 +v 5.666434 34.719444 -9.008182 +v 5.508703 34.895958 -8.986635 +v 5.384326 35.093048 -8.939883 +v 5.298083 35.303139 -8.869723 +v 5.253288 35.518162 -8.778851 +v 5.251663 35.729855 -8.670758 +v 5.319174 35.783566 -8.339704 +v 5.394088 35.946514 -8.223095 +v 5.503591 36.085957 -8.103398 +v 5.643475 36.196529 -7.985214 +v 5.808366 36.273991 -7.873084 +v 5.991926 36.315357 -7.771317 +v 6.187101 36.319042 -7.683823 +v 6.386392 36.284901 -7.613966 +v 6.582138 36.214249 -7.564429 +v 6.766819 36.109802 -7.537117 +v 6.933335 35.975571 -7.533079 +v 7.075289 35.816715 -7.552470 +v 7.187226 35.639339 -7.594545 +v 7.264843 35.450260 -7.657687 +v 7.305157 35.256744 -7.739470 +v 7.306621 35.066227 -7.836751 +v 7.269176 34.886032 -7.945791 +v 7.194263 34.723083 -8.062399 +v 7.084760 34.583641 -8.182096 +v 6.944875 34.473068 -8.300280 +v 6.779984 34.395607 -8.412411 +v 6.596424 34.354240 -8.514177 +v 6.401248 34.350555 -8.601671 +v 6.201958 34.384697 -8.671528 +v 6.006211 34.455349 -8.721065 +v 5.821531 34.559795 -8.748377 +v 5.655015 34.694027 -8.752415 +v 5.513061 34.852882 -8.733023 +v 5.401124 35.030258 -8.690948 +v 5.323508 35.219337 -8.627806 +v 5.283194 35.412853 -8.546022 +v 5.281731 35.603371 -8.448742 +v 5.392732 35.631744 -8.145453 +v 5.456440 35.770321 -8.046287 +v 5.549564 35.888905 -7.944493 +v 5.668527 35.982941 -7.843986 +v 5.808755 36.048817 -7.748627 +v 5.964860 36.083996 -7.662081 +v 6.130843 36.087128 -7.587673 +v 6.300325 36.058094 -7.528265 +v 6.466794 35.998013 -7.486137 +v 6.623852 35.909184 -7.462910 +v 6.765462 35.795033 -7.459476 +v 6.886185 35.659935 -7.475967 +v 6.981379 35.509090 -7.511749 +v 7.047386 35.348293 -7.565447 +v 7.081671 35.183720 -7.634998 +v 7.082916 35.021698 -7.717728 +v 7.051072 34.868454 -7.810459 +v 6.987363 34.729877 -7.909626 +v 6.894238 34.611294 -8.011419 +v 6.775276 34.517258 -8.111927 +v 6.635048 34.451382 -8.207286 +v 6.478943 34.416203 -8.293832 +v 6.312960 34.413071 -8.368239 +v 6.143477 34.442104 -8.427648 +v 5.977008 34.502190 -8.469775 +v 5.819951 34.591015 -8.493002 +v 5.678340 34.705170 -8.496436 +v 5.557618 34.840263 -8.479945 +v 5.462424 34.991112 -8.444162 +v 5.396417 35.151909 -8.390465 +v 5.362132 35.316479 -8.320914 +v 5.360888 35.478500 -8.238184 +v 5.511114 35.480442 -7.974318 +v 5.561169 35.589325 -7.896403 +v 5.634336 35.682495 -7.816424 +v 5.727805 35.756378 -7.737456 +v 5.837981 35.808136 -7.662533 +v 5.960632 35.835777 -7.594534 +v 6.091044 35.838238 -7.536073 +v 6.224205 35.815426 -7.489396 +v 6.354999 35.768219 -7.456296 +v 6.478398 35.698429 -7.438047 +v 6.589661 35.608738 -7.435349 +v 6.684512 35.502594 -7.448306 +v 6.759305 35.384075 -7.476419 +v 6.811168 35.257736 -7.518610 +v 6.838105 35.128433 -7.573256 +v 6.839083 35.001137 -7.638256 +v 6.814063 34.880733 -7.711114 +v 6.764008 34.771854 -7.789030 +v 6.690840 34.678680 -7.869008 +v 6.597372 34.604797 -7.947977 +v 6.487195 34.553040 -8.022900 +v 6.364544 34.525402 -8.090899 +v 6.234132 34.522938 -8.149360 +v 6.100971 34.545750 -8.196036 +v 5.970177 34.592957 -8.229136 +v 5.846778 34.662750 -8.247385 +v 5.735515 34.752438 -8.250083 +v 5.640664 34.858582 -8.237126 +v 5.565871 34.977100 -8.209012 +v 5.514009 35.103439 -8.166821 +v 5.487072 35.232742 -8.112176 +v 5.486094 35.360043 -8.047175 +v 5.669771 35.335480 -7.832872 +v 5.704250 35.410477 -7.779203 +v 5.754648 35.474655 -7.724113 +v 5.819030 35.525547 -7.669719 +v 5.894921 35.561199 -7.618112 +v 5.979404 35.580238 -7.571273 +v 6.069234 35.581932 -7.531004 +v 6.160957 35.566219 -7.498852 +v 6.251049 35.533703 -7.476053 +v 6.336048 35.485630 -7.463483 +v 6.412687 35.423851 -7.461624 +v 6.478022 35.350739 -7.470549 +v 6.529541 35.269100 -7.489914 +v 6.565263 35.182079 -7.518975 +v 6.583818 35.093014 -7.556616 +v 6.584492 35.005329 -7.601389 +v 6.567258 34.922394 -7.651575 +v 6.532779 34.847397 -7.705244 +v 6.482380 34.783218 -7.760334 +v 6.417998 34.732327 -7.814728 +v 6.342108 34.696674 -7.866336 +v 6.257624 34.677635 -7.913174 +v 6.167795 34.675941 -7.953443 +v 6.076071 34.691654 -7.985595 +v 5.985980 34.724171 -8.008394 +v 5.900980 34.772243 -8.020964 +v 5.824341 34.834023 -8.022822 +v 5.759007 34.907135 -8.013898 +v 5.707489 34.988773 -7.994533 +v 5.671765 35.075798 -7.965471 +v 5.653211 35.164864 -7.927831 +v 5.652537 35.252548 -7.883058 +v 5.862607 35.202427 -7.726553 +v 5.880184 35.240658 -7.699193 +v 5.905877 35.273376 -7.671108 +v 5.938698 35.299320 -7.643378 +v 5.977387 35.317493 -7.617069 +v 6.020456 35.327202 -7.593191 +v 6.066251 35.328064 -7.572662 +v 6.113011 35.320057 -7.556271 +v 6.158940 35.303478 -7.544648 +v 6.202271 35.278973 -7.538240 +v 6.241342 35.247475 -7.537292 +v 6.274649 35.210205 -7.541842 +v 6.300913 35.168587 -7.551714 +v 6.319125 35.124222 -7.566530 +v 6.328584 35.078815 -7.585719 +v 6.328927 35.034115 -7.608544 +v 6.320141 34.991837 -7.634128 +v 6.302564 34.953602 -7.661489 +v 6.276871 34.920883 -7.689573 +v 6.244050 34.894939 -7.717303 +v 6.205361 34.876766 -7.743612 +v 6.162292 34.867058 -7.767490 +v 6.116497 34.866196 -7.788019 +v 6.069737 34.874207 -7.804410 +v 6.023808 34.890781 -7.816033 +v 5.980476 34.915291 -7.822441 +v 5.941406 34.946785 -7.823389 +v 5.908099 34.984058 -7.818839 +v 5.881835 35.025677 -7.808967 +v 5.863624 35.070038 -7.794151 +v 5.854165 35.115444 -7.774962 +v 5.853821 35.160145 -7.752137 +v 6.082210 35.086391 -7.659445 +# 482 vertices + +vt 0.000000 1.000000 0.000000 +vt 0.000000 0.937500 0.000000 +vt 0.031250 0.937500 0.000000 +vt 0.031250 1.000000 0.000000 +vt 0.062500 0.937500 0.000000 +vt 0.062500 1.000000 0.000000 +vt 0.093750 0.937500 0.000000 +vt 0.093750 1.000000 0.000000 +vt 0.125000 0.937500 0.000000 +vt 0.125000 1.000000 0.000000 +vt 0.156250 0.937500 0.000000 +vt 0.156250 1.000000 0.000000 +vt 0.187500 0.937500 0.000000 +vt 0.187500 1.000000 0.000000 +vt 0.218750 0.937500 0.000000 +vt 0.218750 1.000000 0.000000 +vt 0.250000 0.937500 0.000000 +vt 0.250000 1.000000 0.000000 +vt 0.281250 0.937500 0.000000 +vt 0.281250 1.000000 0.000000 +vt 0.312500 0.937500 0.000000 +vt 0.312500 1.000000 0.000000 +vt 0.343750 0.937500 0.000000 +vt 0.343750 1.000000 0.000000 +vt 0.375000 0.937500 0.000000 +vt 0.375000 1.000000 0.000000 +vt 0.406250 0.937500 0.000000 +vt 0.406250 1.000000 0.000000 +vt 0.437500 0.937500 0.000000 +vt 0.437500 1.000000 0.000000 +vt 0.468750 0.937500 0.000000 +vt 0.468750 1.000000 0.000000 +vt 0.500000 0.937500 0.000000 +vt 0.500000 1.000000 0.000000 +vt 0.531250 0.937500 0.000000 +vt 0.531250 1.000000 0.000000 +vt 0.562500 0.937500 0.000000 +vt 0.562500 1.000000 0.000000 +vt 0.593750 0.937500 0.000000 +vt 0.593750 1.000000 0.000000 +vt 0.625000 0.937500 0.000000 +vt 0.625000 1.000000 0.000000 +vt 0.656250 0.937500 0.000000 +vt 0.656250 1.000000 0.000000 +vt 0.687500 0.937500 0.000000 +vt 0.687500 1.000000 0.000000 +vt 0.718750 0.937500 0.000000 +vt 0.718750 1.000000 0.000000 +vt 0.750000 0.937500 0.000000 +vt 0.750000 1.000000 0.000000 +vt 0.781250 0.937500 0.000000 +vt 0.781250 1.000000 0.000000 +vt 0.812500 0.937500 0.000000 +vt 0.812500 1.000000 0.000000 +vt 0.843750 0.937500 0.000000 +vt 0.843750 1.000000 0.000000 +vt 0.875000 0.937500 0.000000 +vt 0.875000 1.000000 0.000000 +vt 0.906250 0.937500 0.000000 +vt 0.906250 1.000000 0.000000 +vt 0.937500 0.937500 0.000000 +vt 0.937500 1.000000 0.000000 +vt 0.968750 0.937500 0.000000 +vt 0.968750 1.000000 0.000000 +vt 1.000000 0.937500 0.000000 +vt 0.000000 0.875000 0.000000 +vt 0.031250 0.875000 0.000000 +vt 0.062500 0.875000 0.000000 +vt 0.093750 0.875000 0.000000 +vt 0.125000 0.875000 0.000000 +vt 0.156250 0.875000 0.000000 +vt 0.187500 0.875000 0.000000 +vt 0.218750 0.875000 0.000000 +vt 0.250000 0.875000 0.000000 +vt 0.281250 0.875000 0.000000 +vt 0.312500 0.875000 0.000000 +vt 0.343750 0.875000 0.000000 +vt 0.375000 0.875000 0.000000 +vt 0.406250 0.875000 0.000000 +vt 0.437500 0.875000 0.000000 +vt 0.468750 0.875000 0.000000 +vt 0.500000 0.875000 0.000000 +vt 0.531250 0.875000 0.000000 +vt 0.562500 0.875000 0.000000 +vt 0.593750 0.875000 0.000000 +vt 0.625000 0.875000 0.000000 +vt 0.656250 0.875000 0.000000 +vt 0.687500 0.875000 0.000000 +vt 0.718750 0.875000 0.000000 +vt 0.750000 0.875000 0.000000 +vt 0.781250 0.875000 0.000000 +vt 0.812500 0.875000 0.000000 +vt 0.843750 0.875000 0.000000 +vt 0.875000 0.875000 0.000000 +vt 0.906250 0.875000 0.000000 +vt 0.937500 0.875000 0.000000 +vt 0.968750 0.875000 0.000000 +vt 1.000000 0.875000 0.000000 +vt 0.000000 0.812500 0.000000 +vt 0.031250 0.812500 0.000000 +vt 0.062500 0.812500 0.000000 +vt 0.093750 0.812500 0.000000 +vt 0.125000 0.812500 0.000000 +vt 0.156250 0.812500 0.000000 +vt 0.187500 0.812500 0.000000 +vt 0.218750 0.812500 0.000000 +vt 0.250000 0.812500 0.000000 +vt 0.281250 0.812500 0.000000 +vt 0.312500 0.812500 0.000000 +vt 0.343750 0.812500 0.000000 +vt 0.375000 0.812500 0.000000 +vt 0.406250 0.812500 0.000000 +vt 0.437500 0.812500 0.000000 +vt 0.468750 0.812500 0.000000 +vt 0.500000 0.812500 0.000000 +vt 0.531250 0.812500 0.000000 +vt 0.562500 0.812500 0.000000 +vt 0.593750 0.812500 0.000000 +vt 0.625000 0.812500 0.000000 +vt 0.656250 0.812500 0.000000 +vt 0.687500 0.812500 0.000000 +vt 0.718750 0.812500 0.000000 +vt 0.750000 0.812500 0.000000 +vt 0.781250 0.812500 0.000000 +vt 0.812500 0.812500 0.000000 +vt 0.843750 0.812500 0.000000 +vt 0.875000 0.812500 0.000000 +vt 0.906250 0.812500 0.000000 +vt 0.937500 0.812500 0.000000 +vt 0.968750 0.812500 0.000000 +vt 1.000000 0.812500 0.000000 +vt 0.000000 0.750000 0.000000 +vt 0.031250 0.750000 0.000000 +vt 0.062500 0.750000 0.000000 +vt 0.093750 0.750000 0.000000 +vt 0.125000 0.750000 0.000000 +vt 0.156250 0.750000 0.000000 +vt 0.187500 0.750000 0.000000 +vt 0.218750 0.750000 0.000000 +vt 0.250000 0.750000 0.000000 +vt 0.281250 0.750000 0.000000 +vt 0.312500 0.750000 0.000000 +vt 0.343750 0.750000 0.000000 +vt 0.375000 0.750000 0.000000 +vt 0.406250 0.750000 0.000000 +vt 0.437500 0.750000 0.000000 +vt 0.468750 0.750000 0.000000 +vt 0.500000 0.750000 0.000000 +vt 0.531250 0.750000 0.000000 +vt 0.562500 0.750000 0.000000 +vt 0.593750 0.750000 0.000000 +vt 0.625000 0.750000 0.000000 +vt 0.656250 0.750000 0.000000 +vt 0.687500 0.750000 0.000000 +vt 0.718750 0.750000 0.000000 +vt 0.750000 0.750000 0.000000 +vt 0.781250 0.750000 0.000000 +vt 0.812500 0.750000 0.000000 +vt 0.843750 0.750000 0.000000 +vt 0.875000 0.750000 0.000000 +vt 0.906250 0.750000 0.000000 +vt 0.937500 0.750000 0.000000 +vt 0.968750 0.750000 0.000000 +vt 1.000000 0.750000 0.000000 +vt 0.000000 0.687500 0.000000 +vt 0.031250 0.687500 0.000000 +vt 0.062500 0.687500 0.000000 +vt 0.093750 0.687500 0.000000 +vt 0.125000 0.687500 0.000000 +vt 0.156250 0.687500 0.000000 +vt 0.187500 0.687500 0.000000 +vt 0.218750 0.687500 0.000000 +vt 0.250000 0.687500 0.000000 +vt 0.281250 0.687500 0.000000 +vt 0.312500 0.687500 0.000000 +vt 0.343750 0.687500 0.000000 +vt 0.375000 0.687500 0.000000 +vt 0.406250 0.687500 0.000000 +vt 0.437500 0.687500 0.000000 +vt 0.468750 0.687500 0.000000 +vt 0.500000 0.687500 0.000000 +vt 0.531250 0.687500 0.000000 +vt 0.562500 0.687500 0.000000 +vt 0.593750 0.687500 0.000000 +vt 0.625000 0.687500 0.000000 +vt 0.656250 0.687500 0.000000 +vt 0.687500 0.687500 0.000000 +vt 0.718750 0.687500 0.000000 +vt 0.750000 0.687500 0.000000 +vt 0.781250 0.687500 0.000000 +vt 0.812500 0.687500 0.000000 +vt 0.843750 0.687500 0.000000 +vt 0.875000 0.687500 0.000000 +vt 0.906250 0.687500 0.000000 +vt 0.937500 0.687500 0.000000 +vt 0.968750 0.687500 0.000000 +vt 1.000000 0.687500 0.000000 +vt 0.000000 0.625000 0.000000 +vt 0.031250 0.625000 0.000000 +vt 0.062500 0.625000 0.000000 +vt 0.093750 0.625000 0.000000 +vt 0.125000 0.625000 0.000000 +vt 0.156250 0.625000 0.000000 +vt 0.187500 0.625000 0.000000 +vt 0.218750 0.625000 0.000000 +vt 0.250000 0.625000 0.000000 +vt 0.281250 0.625000 0.000000 +vt 0.312500 0.625000 0.000000 +vt 0.343750 0.625000 0.000000 +vt 0.375000 0.625000 0.000000 +vt 0.406250 0.625000 0.000000 +vt 0.437500 0.625000 0.000000 +vt 0.468750 0.625000 0.000000 +vt 0.500000 0.625000 0.000000 +vt 0.531250 0.625000 0.000000 +vt 0.562500 0.625000 0.000000 +vt 0.593750 0.625000 0.000000 +vt 0.625000 0.625000 0.000000 +vt 0.656250 0.625000 0.000000 +vt 0.687500 0.625000 0.000000 +vt 0.718750 0.625000 0.000000 +vt 0.750000 0.625000 0.000000 +vt 0.781250 0.625000 0.000000 +vt 0.812500 0.625000 0.000000 +vt 0.843750 0.625000 0.000000 +vt 0.875000 0.625000 0.000000 +vt 0.906250 0.625000 0.000000 +vt 0.937500 0.625000 0.000000 +vt 0.968750 0.625000 0.000000 +vt 1.000000 0.625000 0.000000 +vt 0.000000 0.562500 0.000000 +vt 0.031250 0.562500 0.000000 +vt 0.062500 0.562500 0.000000 +vt 0.093750 0.562500 0.000000 +vt 0.125000 0.562500 0.000000 +vt 0.156250 0.562500 0.000000 +vt 0.187500 0.562500 0.000000 +vt 0.218750 0.562500 0.000000 +vt 0.250000 0.562500 0.000000 +vt 0.281250 0.562500 0.000000 +vt 0.312500 0.562500 0.000000 +vt 0.343750 0.562500 0.000000 +vt 0.375000 0.562500 0.000000 +vt 0.406250 0.562500 0.000000 +vt 0.437500 0.562500 0.000000 +vt 0.468750 0.562500 0.000000 +vt 0.500000 0.562500 0.000000 +vt 0.531250 0.562500 0.000000 +vt 0.562500 0.562500 0.000000 +vt 0.593750 0.562500 0.000000 +vt 0.625000 0.562500 0.000000 +vt 0.656250 0.562500 0.000000 +vt 0.687500 0.562500 0.000000 +vt 0.718750 0.562500 0.000000 +vt 0.750000 0.562500 0.000000 +vt 0.781250 0.562500 0.000000 +vt 0.812500 0.562500 0.000000 +vt 0.843750 0.562500 0.000000 +vt 0.875000 0.562500 0.000000 +vt 0.906250 0.562500 0.000000 +vt 0.937500 0.562500 0.000000 +vt 0.968750 0.562500 0.000000 +vt 1.000000 0.562500 0.000000 +vt 0.000000 0.500000 0.000000 +vt 0.031250 0.500000 0.000000 +vt 0.062500 0.500000 0.000000 +vt 0.093750 0.500000 0.000000 +vt 0.125000 0.500000 0.000000 +vt 0.156250 0.500000 0.000000 +vt 0.187500 0.500000 0.000000 +vt 0.218750 0.500000 0.000000 +vt 0.250000 0.500000 0.000000 +vt 0.281250 0.500000 0.000000 +vt 0.312500 0.500000 0.000000 +vt 0.343750 0.500000 0.000000 +vt 0.375000 0.500000 0.000000 +vt 0.406250 0.500000 0.000000 +vt 0.437500 0.500000 0.000000 +vt 0.468750 0.500000 0.000000 +vt 0.500000 0.500000 0.000000 +vt 0.531250 0.500000 0.000000 +vt 0.562500 0.500000 0.000000 +vt 0.593750 0.500000 0.000000 +vt 0.625000 0.500000 0.000000 +vt 0.656250 0.500000 0.000000 +vt 0.687500 0.500000 0.000000 +vt 0.718750 0.500000 0.000000 +vt 0.750000 0.500000 0.000000 +vt 0.781250 0.500000 0.000000 +vt 0.812500 0.500000 0.000000 +vt 0.843750 0.500000 0.000000 +vt 0.875000 0.500000 0.000000 +vt 0.906250 0.500000 0.000000 +vt 0.937500 0.500000 0.000000 +vt 0.968750 0.500000 0.000000 +vt 1.000000 0.500000 0.000000 +vt 0.000000 0.437500 0.000000 +vt 0.031250 0.437500 0.000000 +vt 0.062500 0.437500 0.000000 +vt 0.093750 0.437500 0.000000 +vt 0.125000 0.437500 0.000000 +vt 0.156250 0.437500 0.000000 +vt 0.187500 0.437500 0.000000 +vt 0.218750 0.437500 0.000000 +vt 0.250000 0.437500 0.000000 +vt 0.281250 0.437500 0.000000 +vt 0.312500 0.437500 0.000000 +vt 0.343750 0.437500 0.000000 +vt 0.375000 0.437500 0.000000 +vt 0.406250 0.437500 0.000000 +vt 0.437500 0.437500 0.000000 +vt 0.468750 0.437500 0.000000 +vt 0.500000 0.437500 0.000000 +vt 0.531250 0.437500 0.000000 +vt 0.562500 0.437500 0.000000 +vt 0.593750 0.437500 0.000000 +vt 0.625000 0.437500 0.000000 +vt 0.656250 0.437500 0.000000 +vt 0.687500 0.437500 0.000000 +vt 0.718750 0.437500 0.000000 +vt 0.750000 0.437500 0.000000 +vt 0.781250 0.437500 0.000000 +vt 0.812500 0.437500 0.000000 +vt 0.843750 0.437500 0.000000 +vt 0.875000 0.437500 0.000000 +vt 0.906250 0.437500 0.000000 +vt 0.937500 0.437500 0.000000 +vt 0.968750 0.437500 0.000000 +vt 1.000000 0.437500 0.000000 +vt 0.000000 0.375000 0.000000 +vt 0.031250 0.375000 0.000000 +vt 0.062500 0.375000 0.000000 +vt 0.093750 0.375000 0.000000 +vt 0.125000 0.375000 0.000000 +vt 0.156250 0.375000 0.000000 +vt 0.187500 0.375000 0.000000 +vt 0.218750 0.375000 0.000000 +vt 0.250000 0.375000 0.000000 +vt 0.281250 0.375000 0.000000 +vt 0.312500 0.375000 0.000000 +vt 0.343750 0.375000 0.000000 +vt 0.375000 0.375000 0.000000 +vt 0.406250 0.375000 0.000000 +vt 0.437500 0.375000 0.000000 +vt 0.468750 0.375000 0.000000 +vt 0.500000 0.375000 0.000000 +vt 0.531250 0.375000 0.000000 +vt 0.562500 0.375000 0.000000 +vt 0.593750 0.375000 0.000000 +vt 0.625000 0.375000 0.000000 +vt 0.656250 0.375000 0.000000 +vt 0.687500 0.375000 0.000000 +vt 0.718750 0.375000 0.000000 +vt 0.750000 0.375000 0.000000 +vt 0.781250 0.375000 0.000000 +vt 0.812500 0.375000 0.000000 +vt 0.843750 0.375000 0.000000 +vt 0.875000 0.375000 0.000000 +vt 0.906250 0.375000 0.000000 +vt 0.937500 0.375000 0.000000 +vt 0.968750 0.375000 0.000000 +vt 1.000000 0.375000 0.000000 +vt 0.000000 0.312500 0.000000 +vt 0.031250 0.312500 0.000000 +vt 0.062500 0.312500 0.000000 +vt 0.093750 0.312500 0.000000 +vt 0.125000 0.312500 0.000000 +vt 0.156250 0.312500 0.000000 +vt 0.187500 0.312500 0.000000 +vt 0.218750 0.312500 0.000000 +vt 0.250000 0.312500 0.000000 +vt 0.281250 0.312500 0.000000 +vt 0.312500 0.312500 0.000000 +vt 0.343750 0.312500 0.000000 +vt 0.375000 0.312500 0.000000 +vt 0.406250 0.312500 0.000000 +vt 0.437500 0.312500 0.000000 +vt 0.468750 0.312500 0.000000 +vt 0.500000 0.312500 0.000000 +vt 0.531250 0.312500 0.000000 +vt 0.562500 0.312500 0.000000 +vt 0.593750 0.312500 0.000000 +vt 0.625000 0.312500 0.000000 +vt 0.656250 0.312500 0.000000 +vt 0.687500 0.312500 0.000000 +vt 0.718750 0.312500 0.000000 +vt 0.750000 0.312500 0.000000 +vt 0.781250 0.312500 0.000000 +vt 0.812500 0.312500 0.000000 +vt 0.843750 0.312500 0.000000 +vt 0.875000 0.312500 0.000000 +vt 0.906250 0.312500 0.000000 +vt 0.937500 0.312500 0.000000 +vt 0.968750 0.312500 0.000000 +vt 1.000000 0.312500 0.000000 +vt 0.000000 0.250000 0.000000 +vt 0.031250 0.250000 0.000000 +vt 0.062500 0.250000 0.000000 +vt 0.093750 0.250000 0.000000 +vt 0.125000 0.250000 0.000000 +vt 0.156250 0.250000 0.000000 +vt 0.187500 0.250000 0.000000 +vt 0.218750 0.250000 0.000000 +vt 0.250000 0.250000 0.000000 +vt 0.281250 0.250000 0.000000 +vt 0.312500 0.250000 0.000000 +vt 0.343750 0.250000 0.000000 +vt 0.375000 0.250000 0.000000 +vt 0.406250 0.250000 0.000000 +vt 0.437500 0.250000 0.000000 +vt 0.468750 0.250000 0.000000 +vt 0.500000 0.250000 0.000000 +vt 0.531250 0.250000 0.000000 +vt 0.562500 0.250000 0.000000 +vt 0.593750 0.250000 0.000000 +vt 0.625000 0.250000 0.000000 +vt 0.656250 0.250000 0.000000 +vt 0.687500 0.250000 0.000000 +vt 0.718750 0.250000 0.000000 +vt 0.750000 0.250000 0.000000 +vt 0.781250 0.250000 0.000000 +vt 0.812500 0.250000 0.000000 +vt 0.843750 0.250000 0.000000 +vt 0.875000 0.250000 0.000000 +vt 0.906250 0.250000 0.000000 +vt 0.937500 0.250000 0.000000 +vt 0.968750 0.250000 0.000000 +vt 1.000000 0.250000 0.000000 +vt 0.000000 0.187500 0.000000 +vt 0.031250 0.187500 0.000000 +vt 0.062500 0.187500 0.000000 +vt 0.093750 0.187500 0.000000 +vt 0.125000 0.187500 0.000000 +vt 0.156250 0.187500 0.000000 +vt 0.187500 0.187500 0.000000 +vt 0.218750 0.187500 0.000000 +vt 0.250000 0.187500 0.000000 +vt 0.281250 0.187500 0.000000 +vt 0.312500 0.187500 0.000000 +vt 0.343750 0.187500 0.000000 +vt 0.375000 0.187500 0.000000 +vt 0.406250 0.187500 0.000000 +vt 0.437500 0.187500 0.000000 +vt 0.468750 0.187500 0.000000 +vt 0.500000 0.187500 0.000000 +vt 0.531250 0.187500 0.000000 +vt 0.562500 0.187500 0.000000 +vt 0.593750 0.187500 0.000000 +vt 0.625000 0.187500 0.000000 +vt 0.656250 0.187500 0.000000 +vt 0.687500 0.187500 0.000000 +vt 0.718750 0.187500 0.000000 +vt 0.750000 0.187500 0.000000 +vt 0.781250 0.187500 0.000000 +vt 0.812500 0.187500 0.000000 +vt 0.843750 0.187500 0.000000 +vt 0.875000 0.187500 0.000000 +vt 0.906250 0.187500 0.000000 +vt 0.937500 0.187500 0.000000 +vt 0.968750 0.187500 0.000000 +vt 1.000000 0.187500 0.000000 +vt 0.000000 0.125000 0.000000 +vt 0.031250 0.125000 0.000000 +vt 0.062500 0.125000 0.000000 +vt 0.093750 0.125000 0.000000 +vt 0.125000 0.125000 0.000000 +vt 0.156250 0.125000 0.000000 +vt 0.187500 0.125000 0.000000 +vt 0.218750 0.125000 0.000000 +vt 0.250000 0.125000 0.000000 +vt 0.281250 0.125000 0.000000 +vt 0.312500 0.125000 0.000000 +vt 0.343750 0.125000 0.000000 +vt 0.375000 0.125000 0.000000 +vt 0.406250 0.125000 0.000000 +vt 0.437500 0.125000 0.000000 +vt 0.468750 0.125000 0.000000 +vt 0.500000 0.125000 0.000000 +vt 0.531250 0.125000 0.000000 +vt 0.562500 0.125000 0.000000 +vt 0.593750 0.125000 0.000000 +vt 0.625000 0.125000 0.000000 +vt 0.656250 0.125000 0.000000 +vt 0.687500 0.125000 0.000000 +vt 0.718750 0.125000 0.000000 +vt 0.750000 0.125000 0.000000 +vt 0.781250 0.125000 0.000000 +vt 0.812500 0.125000 0.000000 +vt 0.843750 0.125000 0.000000 +vt 0.875000 0.125000 0.000000 +vt 0.906250 0.125000 0.000000 +vt 0.937500 0.125000 0.000000 +vt 0.968750 0.125000 0.000000 +vt 1.000000 0.125000 0.000000 +vt 0.000000 0.062500 0.000000 +vt 0.031250 0.062500 0.000000 +vt 0.062500 0.062500 0.000000 +vt 0.093750 0.062500 0.000000 +vt 0.125000 0.062500 0.000000 +vt 0.156250 0.062500 0.000000 +vt 0.187500 0.062500 0.000000 +vt 0.218750 0.062500 0.000000 +vt 0.250000 0.062500 0.000000 +vt 0.281250 0.062500 0.000000 +vt 0.312500 0.062500 0.000000 +vt 0.343750 0.062500 0.000000 +vt 0.375000 0.062500 0.000000 +vt 0.406250 0.062500 0.000000 +vt 0.437500 0.062500 0.000000 +vt 0.468750 0.062500 0.000000 +vt 0.500000 0.062500 0.000000 +vt 0.531250 0.062500 0.000000 +vt 0.562500 0.062500 0.000000 +vt 0.593750 0.062500 0.000000 +vt 0.625000 0.062500 0.000000 +vt 0.656250 0.062500 0.000000 +vt 0.687500 0.062500 0.000000 +vt 0.718750 0.062500 0.000000 +vt 0.750000 0.062500 0.000000 +vt 0.781250 0.062500 0.000000 +vt 0.812500 0.062500 0.000000 +vt 0.843750 0.062500 0.000000 +vt 0.875000 0.062500 0.000000 +vt 0.906250 0.062500 0.000000 +vt 0.937500 0.062500 0.000000 +vt 0.968750 0.062500 0.000000 +vt 1.000000 0.062500 0.000000 +vt 0.000000 -0.000000 0.000000 +vt 0.031250 -0.000000 0.000000 +vt 0.062500 -0.000000 0.000000 +vt 0.093750 -0.000000 0.000000 +vt 0.125000 -0.000000 0.000000 +vt 0.156250 -0.000000 0.000000 +vt 0.187500 -0.000000 0.000000 +vt 0.218750 -0.000000 0.000000 +vt 0.250000 -0.000000 0.000000 +vt 0.281250 -0.000000 0.000000 +vt 0.312500 -0.000000 0.000000 +vt 0.343750 -0.000000 0.000000 +vt 0.375000 -0.000000 0.000000 +vt 0.406250 -0.000000 0.000000 +vt 0.437500 -0.000000 0.000000 +vt 0.468750 -0.000000 0.000000 +vt 0.500000 -0.000000 0.000000 +vt 0.531250 -0.000000 0.000000 +vt 0.562500 -0.000000 0.000000 +vt 0.593750 -0.000000 0.000000 +vt 0.625000 -0.000000 0.000000 +vt 0.656250 -0.000000 0.000000 +vt 0.687500 -0.000000 0.000000 +vt 0.718750 -0.000000 0.000000 +vt 0.750000 -0.000000 0.000000 +vt 0.781250 -0.000000 0.000000 +vt 0.812500 -0.000000 0.000000 +vt 0.843750 -0.000000 0.000000 +vt 0.875000 -0.000000 0.000000 +vt 0.906250 -0.000000 0.000000 +vt 0.937500 -0.000000 0.000000 +vt 0.968750 -0.000000 0.000000 +# 559 texture coords + +g Sphere004 +usemtl wire_255255255 +f -482/-559 -481/-558 -480/-557 +f -482/-556 -480/-557 -479/-555 +f -482/-554 -479/-555 -478/-553 +f -482/-552 -478/-553 -477/-551 +f -482/-550 -477/-551 -476/-549 +f -482/-548 -476/-549 -475/-547 +f -482/-546 -475/-547 -474/-545 +f -482/-544 -474/-545 -473/-543 +f -482/-542 -473/-543 -472/-541 +f -482/-540 -472/-541 -471/-539 +f -482/-538 -471/-539 -470/-537 +f -482/-536 -470/-537 -469/-535 +f -482/-534 -469/-535 -468/-533 +f -482/-532 -468/-533 -467/-531 +f -482/-530 -467/-531 -466/-529 +f -482/-528 -466/-529 -465/-527 +f -482/-526 -465/-527 -464/-525 +f -482/-524 -464/-525 -463/-523 +f -482/-522 -463/-523 -462/-521 +f -482/-520 -462/-521 -461/-519 +f -482/-518 -461/-519 -460/-517 +f -482/-516 -460/-517 -459/-515 +f -482/-514 -459/-515 -458/-513 +f -482/-512 -458/-513 -457/-511 +f -482/-510 -457/-511 -456/-509 +f -482/-508 -456/-509 -455/-507 +f -482/-506 -455/-507 -454/-505 +f -482/-504 -454/-505 -453/-503 +f -482/-502 -453/-503 -452/-501 +f -482/-500 -452/-501 -451/-499 +f -482/-498 -451/-499 -450/-497 +f -482/-496 -450/-497 -481/-495 +f -481/-558 -449/-494 -448/-493 -480/-557 +f -480/-557 -448/-493 -447/-492 -479/-555 +f -479/-555 -447/-492 -446/-491 -478/-553 +f -478/-553 -446/-491 -445/-490 -477/-551 +f -477/-551 -445/-490 -444/-489 -476/-549 +f -476/-549 -444/-489 -443/-488 -475/-547 +f -475/-547 -443/-488 -442/-487 -474/-545 +f -474/-545 -442/-487 -441/-486 -473/-543 +f -473/-543 -441/-486 -440/-485 -472/-541 +f -472/-541 -440/-485 -439/-484 -471/-539 +f -471/-539 -439/-484 -438/-483 -470/-537 +f -470/-537 -438/-483 -437/-482 -469/-535 +f -469/-535 -437/-482 -436/-481 -468/-533 +f -468/-533 -436/-481 -435/-480 -467/-531 +f -467/-531 -435/-480 -434/-479 -466/-529 +f -466/-529 -434/-479 -433/-478 -465/-527 +f -465/-527 -433/-478 -432/-477 -464/-525 +f -464/-525 -432/-477 -431/-476 -463/-523 +f -463/-523 -431/-476 -430/-475 -462/-521 +f -462/-521 -430/-475 -429/-474 -461/-519 +f -461/-519 -429/-474 -428/-473 -460/-517 +f -460/-517 -428/-473 -427/-472 -459/-515 +f -459/-515 -427/-472 -426/-471 -458/-513 +f -458/-513 -426/-471 -425/-470 -457/-511 +f -457/-511 -425/-470 -424/-469 -456/-509 +f -456/-509 -424/-469 -423/-468 -455/-507 +f -455/-507 -423/-468 -422/-467 -454/-505 +f -454/-505 -422/-467 -421/-466 -453/-503 +f -453/-503 -421/-466 -420/-465 -452/-501 +f -452/-501 -420/-465 -419/-464 -451/-499 +f -451/-499 -419/-464 -418/-463 -450/-497 +f -450/-497 -418/-463 -449/-462 -481/-495 +f -449/-494 -417/-461 -416/-460 -448/-493 +f -448/-493 -416/-460 -415/-459 -447/-492 +f -447/-492 -415/-459 -414/-458 -446/-491 +f -446/-491 -414/-458 -413/-457 -445/-490 +f -445/-490 -413/-457 -412/-456 -444/-489 +f -444/-489 -412/-456 -411/-455 -443/-488 +f -443/-488 -411/-455 -410/-454 -442/-487 +f -442/-487 -410/-454 -409/-453 -441/-486 +f -441/-486 -409/-453 -408/-452 -440/-485 +f -440/-485 -408/-452 -407/-451 -439/-484 +f -439/-484 -407/-451 -406/-450 -438/-483 +f -438/-483 -406/-450 -405/-449 -437/-482 +f -437/-482 -405/-449 -404/-448 -436/-481 +f -436/-481 -404/-448 -403/-447 -435/-480 +f -435/-480 -403/-447 -402/-446 -434/-479 +f -434/-479 -402/-446 -401/-445 -433/-478 +f -433/-478 -401/-445 -400/-444 -432/-477 +f -432/-477 -400/-444 -399/-443 -431/-476 +f -431/-476 -399/-443 -398/-442 -430/-475 +f -430/-475 -398/-442 -397/-441 -429/-474 +f -429/-474 -397/-441 -396/-440 -428/-473 +f -428/-473 -396/-440 -395/-439 -427/-472 +f -427/-472 -395/-439 -394/-438 -426/-471 +f -426/-471 -394/-438 -393/-437 -425/-470 +f -425/-470 -393/-437 -392/-436 -424/-469 +f -424/-469 -392/-436 -391/-435 -423/-468 +f -423/-468 -391/-435 -390/-434 -422/-467 +f -422/-467 -390/-434 -389/-433 -421/-466 +f -421/-466 -389/-433 -388/-432 -420/-465 +f -420/-465 -388/-432 -387/-431 -419/-464 +f -419/-464 -387/-431 -386/-430 -418/-463 +f -418/-463 -386/-430 -417/-429 -449/-462 +f -417/-461 -385/-428 -384/-427 -416/-460 +f -416/-460 -384/-427 -383/-426 -415/-459 +f -415/-459 -383/-426 -382/-425 -414/-458 +f -414/-458 -382/-425 -381/-424 -413/-457 +f -413/-457 -381/-424 -380/-423 -412/-456 +f -412/-456 -380/-423 -379/-422 -411/-455 +f -411/-455 -379/-422 -378/-421 -410/-454 +f -410/-454 -378/-421 -377/-420 -409/-453 +f -409/-453 -377/-420 -376/-419 -408/-452 +f -408/-452 -376/-419 -375/-418 -407/-451 +f -407/-451 -375/-418 -374/-417 -406/-450 +f -406/-450 -374/-417 -373/-416 -405/-449 +f -405/-449 -373/-416 -372/-415 -404/-448 +f -404/-448 -372/-415 -371/-414 -403/-447 +f -403/-447 -371/-414 -370/-413 -402/-446 +f -402/-446 -370/-413 -369/-412 -401/-445 +f -401/-445 -369/-412 -368/-411 -400/-444 +f -400/-444 -368/-411 -367/-410 -399/-443 +f -399/-443 -367/-410 -366/-409 -398/-442 +f -398/-442 -366/-409 -365/-408 -397/-441 +f -397/-441 -365/-408 -364/-407 -396/-440 +f -396/-440 -364/-407 -363/-406 -395/-439 +f -395/-439 -363/-406 -362/-405 -394/-438 +f -394/-438 -362/-405 -361/-404 -393/-437 +f -393/-437 -361/-404 -360/-403 -392/-436 +f -392/-436 -360/-403 -359/-402 -391/-435 +f -391/-435 -359/-402 -358/-401 -390/-434 +f -390/-434 -358/-401 -357/-400 -389/-433 +f -389/-433 -357/-400 -356/-399 -388/-432 +f -388/-432 -356/-399 -355/-398 -387/-431 +f -387/-431 -355/-398 -354/-397 -386/-430 +f -386/-430 -354/-397 -385/-396 -417/-429 +f -385/-428 -353/-395 -352/-394 -384/-427 +f -384/-427 -352/-394 -351/-393 -383/-426 +f -383/-426 -351/-393 -350/-392 -382/-425 +f -382/-425 -350/-392 -349/-391 -381/-424 +f -381/-424 -349/-391 -348/-390 -380/-423 +f -380/-423 -348/-390 -347/-389 -379/-422 +f -379/-422 -347/-389 -346/-388 -378/-421 +f -378/-421 -346/-388 -345/-387 -377/-420 +f -377/-420 -345/-387 -344/-386 -376/-419 +f -376/-419 -344/-386 -343/-385 -375/-418 +f -375/-418 -343/-385 -342/-384 -374/-417 +f -374/-417 -342/-384 -341/-383 -373/-416 +f -373/-416 -341/-383 -340/-382 -372/-415 +f -372/-415 -340/-382 -339/-381 -371/-414 +f -371/-414 -339/-381 -338/-380 -370/-413 +f -370/-413 -338/-380 -337/-379 -369/-412 +f -369/-412 -337/-379 -336/-378 -368/-411 +f -368/-411 -336/-378 -335/-377 -367/-410 +f -367/-410 -335/-377 -334/-376 -366/-409 +f -366/-409 -334/-376 -333/-375 -365/-408 +f -365/-408 -333/-375 -332/-374 -364/-407 +f -364/-407 -332/-374 -331/-373 -363/-406 +f -363/-406 -331/-373 -330/-372 -362/-405 +f -362/-405 -330/-372 -329/-371 -361/-404 +f -361/-404 -329/-371 -328/-370 -360/-403 +f -360/-403 -328/-370 -327/-369 -359/-402 +f -359/-402 -327/-369 -326/-368 -358/-401 +f -358/-401 -326/-368 -325/-367 -357/-400 +f -357/-400 -325/-367 -324/-366 -356/-399 +f -356/-399 -324/-366 -323/-365 -355/-398 +f -355/-398 -323/-365 -322/-364 -354/-397 +f -354/-397 -322/-364 -353/-363 -385/-396 +f -353/-395 -321/-362 -320/-361 -352/-394 +f -352/-394 -320/-361 -319/-360 -351/-393 +f -351/-393 -319/-360 -318/-359 -350/-392 +f -350/-392 -318/-359 -317/-358 -349/-391 +f -349/-391 -317/-358 -316/-357 -348/-390 +f -348/-390 -316/-357 -315/-356 -347/-389 +f -347/-389 -315/-356 -314/-355 -346/-388 +f -346/-388 -314/-355 -313/-354 -345/-387 +f -345/-387 -313/-354 -312/-353 -344/-386 +f -344/-386 -312/-353 -311/-352 -343/-385 +f -343/-385 -311/-352 -310/-351 -342/-384 +f -342/-384 -310/-351 -309/-350 -341/-383 +f -341/-383 -309/-350 -308/-349 -340/-382 +f -340/-382 -308/-349 -307/-348 -339/-381 +f -339/-381 -307/-348 -306/-347 -338/-380 +f -338/-380 -306/-347 -305/-346 -337/-379 +f -337/-379 -305/-346 -304/-345 -336/-378 +f -336/-378 -304/-345 -303/-344 -335/-377 +f -335/-377 -303/-344 -302/-343 -334/-376 +f -334/-376 -302/-343 -301/-342 -333/-375 +f -333/-375 -301/-342 -300/-341 -332/-374 +f -332/-374 -300/-341 -299/-340 -331/-373 +f -331/-373 -299/-340 -298/-339 -330/-372 +f -330/-372 -298/-339 -297/-338 -329/-371 +f -329/-371 -297/-338 -296/-337 -328/-370 +f -328/-370 -296/-337 -295/-336 -327/-369 +f -327/-369 -295/-336 -294/-335 -326/-368 +f -326/-368 -294/-335 -293/-334 -325/-367 +f -325/-367 -293/-334 -292/-333 -324/-366 +f -324/-366 -292/-333 -291/-332 -323/-365 +f -323/-365 -291/-332 -290/-331 -322/-364 +f -322/-364 -290/-331 -321/-330 -353/-363 +f -321/-362 -289/-329 -288/-328 -320/-361 +f -320/-361 -288/-328 -287/-327 -319/-360 +f -319/-360 -287/-327 -286/-326 -318/-359 +f -318/-359 -286/-326 -285/-325 -317/-358 +f -317/-358 -285/-325 -284/-324 -316/-357 +f -316/-357 -284/-324 -283/-323 -315/-356 +f -315/-356 -283/-323 -282/-322 -314/-355 +f -314/-355 -282/-322 -281/-321 -313/-354 +f -313/-354 -281/-321 -280/-320 -312/-353 +f -312/-353 -280/-320 -279/-319 -311/-352 +f -311/-352 -279/-319 -278/-318 -310/-351 +f -310/-351 -278/-318 -277/-317 -309/-350 +f -309/-350 -277/-317 -276/-316 -308/-349 +f -308/-349 -276/-316 -275/-315 -307/-348 +f -307/-348 -275/-315 -274/-314 -306/-347 +f -306/-347 -274/-314 -273/-313 -305/-346 +f -305/-346 -273/-313 -272/-312 -304/-345 +f -304/-345 -272/-312 -271/-311 -303/-344 +f -303/-344 -271/-311 -270/-310 -302/-343 +f -302/-343 -270/-310 -269/-309 -301/-342 +f -301/-342 -269/-309 -268/-308 -300/-341 +f -300/-341 -268/-308 -267/-307 -299/-340 +f -299/-340 -267/-307 -266/-306 -298/-339 +f -298/-339 -266/-306 -265/-305 -297/-338 +f -297/-338 -265/-305 -264/-304 -296/-337 +f -296/-337 -264/-304 -263/-303 -295/-336 +f -295/-336 -263/-303 -262/-302 -294/-335 +f -294/-335 -262/-302 -261/-301 -293/-334 +f -293/-334 -261/-301 -260/-300 -292/-333 +f -292/-333 -260/-300 -259/-299 -291/-332 +f -291/-332 -259/-299 -258/-298 -290/-331 +f -290/-331 -258/-298 -289/-297 -321/-330 +f -289/-329 -257/-296 -256/-295 -288/-328 +f -288/-328 -256/-295 -255/-294 -287/-327 +f -287/-327 -255/-294 -254/-293 -286/-326 +f -286/-326 -254/-293 -253/-292 -285/-325 +f -285/-325 -253/-292 -252/-291 -284/-324 +f -284/-324 -252/-291 -251/-290 -283/-323 +f -283/-323 -251/-290 -250/-289 -282/-322 +f -282/-322 -250/-289 -249/-288 -281/-321 +f -281/-321 -249/-288 -248/-287 -280/-320 +f -280/-320 -248/-287 -247/-286 -279/-319 +f -279/-319 -247/-286 -246/-285 -278/-318 +f -278/-318 -246/-285 -245/-284 -277/-317 +f -277/-317 -245/-284 -244/-283 -276/-316 +f -276/-316 -244/-283 -243/-282 -275/-315 +f -275/-315 -243/-282 -242/-281 -274/-314 +f -274/-314 -242/-281 -241/-280 -273/-313 +f -273/-313 -241/-280 -240/-279 -272/-312 +f -272/-312 -240/-279 -239/-278 -271/-311 +f -271/-311 -239/-278 -238/-277 -270/-310 +f -270/-310 -238/-277 -237/-276 -269/-309 +f -269/-309 -237/-276 -236/-275 -268/-308 +f -268/-308 -236/-275 -235/-274 -267/-307 +f -267/-307 -235/-274 -234/-273 -266/-306 +f -266/-306 -234/-273 -233/-272 -265/-305 +f -265/-305 -233/-272 -232/-271 -264/-304 +f -264/-304 -232/-271 -231/-270 -263/-303 +f -263/-303 -231/-270 -230/-269 -262/-302 +f -262/-302 -230/-269 -229/-268 -261/-301 +f -261/-301 -229/-268 -228/-267 -260/-300 +f -260/-300 -228/-267 -227/-266 -259/-299 +f -259/-299 -227/-266 -226/-265 -258/-298 +f -258/-298 -226/-265 -257/-264 -289/-297 +f -257/-296 -225/-263 -224/-262 -256/-295 +f -256/-295 -224/-262 -223/-261 -255/-294 +f -255/-294 -223/-261 -222/-260 -254/-293 +f -254/-293 -222/-260 -221/-259 -253/-292 +f -253/-292 -221/-259 -220/-258 -252/-291 +f -252/-291 -220/-258 -219/-257 -251/-290 +f -251/-290 -219/-257 -218/-256 -250/-289 +f -250/-289 -218/-256 -217/-255 -249/-288 +f -249/-288 -217/-255 -216/-254 -248/-287 +f -248/-287 -216/-254 -215/-253 -247/-286 +f -247/-286 -215/-253 -214/-252 -246/-285 +f -246/-285 -214/-252 -213/-251 -245/-284 +f -245/-284 -213/-251 -212/-250 -244/-283 +f -244/-283 -212/-250 -211/-249 -243/-282 +f -243/-282 -211/-249 -210/-248 -242/-281 +f -242/-281 -210/-248 -209/-247 -241/-280 +f -241/-280 -209/-247 -208/-246 -240/-279 +f -240/-279 -208/-246 -207/-245 -239/-278 +f -239/-278 -207/-245 -206/-244 -238/-277 +f -238/-277 -206/-244 -205/-243 -237/-276 +f -237/-276 -205/-243 -204/-242 -236/-275 +f -236/-275 -204/-242 -203/-241 -235/-274 +f -235/-274 -203/-241 -202/-240 -234/-273 +f -234/-273 -202/-240 -201/-239 -233/-272 +f -233/-272 -201/-239 -200/-238 -232/-271 +f -232/-271 -200/-238 -199/-237 -231/-270 +f -231/-270 -199/-237 -198/-236 -230/-269 +f -230/-269 -198/-236 -197/-235 -229/-268 +f -229/-268 -197/-235 -196/-234 -228/-267 +f -228/-267 -196/-234 -195/-233 -227/-266 +f -227/-266 -195/-233 -194/-232 -226/-265 +f -226/-265 -194/-232 -225/-231 -257/-264 +f -225/-263 -193/-230 -192/-229 -224/-262 +f -224/-262 -192/-229 -191/-228 -223/-261 +f -223/-261 -191/-228 -190/-227 -222/-260 +f -222/-260 -190/-227 -189/-226 -221/-259 +f -221/-259 -189/-226 -188/-225 -220/-258 +f -220/-258 -188/-225 -187/-224 -219/-257 +f -219/-257 -187/-224 -186/-223 -218/-256 +f -218/-256 -186/-223 -185/-222 -217/-255 +f -217/-255 -185/-222 -184/-221 -216/-254 +f -216/-254 -184/-221 -183/-220 -215/-253 +f -215/-253 -183/-220 -182/-219 -214/-252 +f -214/-252 -182/-219 -181/-218 -213/-251 +f -213/-251 -181/-218 -180/-217 -212/-250 +f -212/-250 -180/-217 -179/-216 -211/-249 +f -211/-249 -179/-216 -178/-215 -210/-248 +f -210/-248 -178/-215 -177/-214 -209/-247 +f -209/-247 -177/-214 -176/-213 -208/-246 +f -208/-246 -176/-213 -175/-212 -207/-245 +f -207/-245 -175/-212 -174/-211 -206/-244 +f -206/-244 -174/-211 -173/-210 -205/-243 +f -205/-243 -173/-210 -172/-209 -204/-242 +f -204/-242 -172/-209 -171/-208 -203/-241 +f -203/-241 -171/-208 -170/-207 -202/-240 +f -202/-240 -170/-207 -169/-206 -201/-239 +f -201/-239 -169/-206 -168/-205 -200/-238 +f -200/-238 -168/-205 -167/-204 -199/-237 +f -199/-237 -167/-204 -166/-203 -198/-236 +f -198/-236 -166/-203 -165/-202 -197/-235 +f -197/-235 -165/-202 -164/-201 -196/-234 +f -196/-234 -164/-201 -163/-200 -195/-233 +f -195/-233 -163/-200 -162/-199 -194/-232 +f -194/-232 -162/-199 -193/-198 -225/-231 +f -193/-230 -161/-197 -160/-196 -192/-229 +f -192/-229 -160/-196 -159/-195 -191/-228 +f -191/-228 -159/-195 -158/-194 -190/-227 +f -190/-227 -158/-194 -157/-193 -189/-226 +f -189/-226 -157/-193 -156/-192 -188/-225 +f -188/-225 -156/-192 -155/-191 -187/-224 +f -187/-224 -155/-191 -154/-190 -186/-223 +f -186/-223 -154/-190 -153/-189 -185/-222 +f -185/-222 -153/-189 -152/-188 -184/-221 +f -184/-221 -152/-188 -151/-187 -183/-220 +f -183/-220 -151/-187 -150/-186 -182/-219 +f -182/-219 -150/-186 -149/-185 -181/-218 +f -181/-218 -149/-185 -148/-184 -180/-217 +f -180/-217 -148/-184 -147/-183 -179/-216 +f -179/-216 -147/-183 -146/-182 -178/-215 +f -178/-215 -146/-182 -145/-181 -177/-214 +f -177/-214 -145/-181 -144/-180 -176/-213 +f -176/-213 -144/-180 -143/-179 -175/-212 +f -175/-212 -143/-179 -142/-178 -174/-211 +f -174/-211 -142/-178 -141/-177 -173/-210 +f -173/-210 -141/-177 -140/-176 -172/-209 +f -172/-209 -140/-176 -139/-175 -171/-208 +f -171/-208 -139/-175 -138/-174 -170/-207 +f -170/-207 -138/-174 -137/-173 -169/-206 +f -169/-206 -137/-173 -136/-172 -168/-205 +f -168/-205 -136/-172 -135/-171 -167/-204 +f -167/-204 -135/-171 -134/-170 -166/-203 +f -166/-203 -134/-170 -133/-169 -165/-202 +f -165/-202 -133/-169 -132/-168 -164/-201 +f -164/-201 -132/-168 -131/-167 -163/-200 +f -163/-200 -131/-167 -130/-166 -162/-199 +f -162/-199 -130/-166 -161/-165 -193/-198 +f -161/-197 -129/-164 -128/-163 -160/-196 +f -160/-196 -128/-163 -127/-162 -159/-195 +f -159/-195 -127/-162 -126/-161 -158/-194 +f -158/-194 -126/-161 -125/-160 -157/-193 +f -157/-193 -125/-160 -124/-159 -156/-192 +f -156/-192 -124/-159 -123/-158 -155/-191 +f -155/-191 -123/-158 -122/-157 -154/-190 +f -154/-190 -122/-157 -121/-156 -153/-189 +f -153/-189 -121/-156 -120/-155 -152/-188 +f -152/-188 -120/-155 -119/-154 -151/-187 +f -151/-187 -119/-154 -118/-153 -150/-186 +f -150/-186 -118/-153 -117/-152 -149/-185 +f -149/-185 -117/-152 -116/-151 -148/-184 +f -148/-184 -116/-151 -115/-150 -147/-183 +f -147/-183 -115/-150 -114/-149 -146/-182 +f -146/-182 -114/-149 -113/-148 -145/-181 +f -145/-181 -113/-148 -112/-147 -144/-180 +f -144/-180 -112/-147 -111/-146 -143/-179 +f -143/-179 -111/-146 -110/-145 -142/-178 +f -142/-178 -110/-145 -109/-144 -141/-177 +f -141/-177 -109/-144 -108/-143 -140/-176 +f -140/-176 -108/-143 -107/-142 -139/-175 +f -139/-175 -107/-142 -106/-141 -138/-174 +f -138/-174 -106/-141 -105/-140 -137/-173 +f -137/-173 -105/-140 -104/-139 -136/-172 +f -136/-172 -104/-139 -103/-138 -135/-171 +f -135/-171 -103/-138 -102/-137 -134/-170 +f -134/-170 -102/-137 -101/-136 -133/-169 +f -133/-169 -101/-136 -100/-135 -132/-168 +f -132/-168 -100/-135 -99/-134 -131/-167 +f -131/-167 -99/-134 -98/-133 -130/-166 +f -130/-166 -98/-133 -129/-132 -161/-165 +f -129/-164 -97/-131 -96/-130 -128/-163 +f -128/-163 -96/-130 -95/-129 -127/-162 +f -127/-162 -95/-129 -94/-128 -126/-161 +f -126/-161 -94/-128 -93/-127 -125/-160 +f -125/-160 -93/-127 -92/-126 -124/-159 +f -124/-159 -92/-126 -91/-125 -123/-158 +f -123/-158 -91/-125 -90/-124 -122/-157 +f -122/-157 -90/-124 -89/-123 -121/-156 +f -121/-156 -89/-123 -88/-122 -120/-155 +f -120/-155 -88/-122 -87/-121 -119/-154 +f -119/-154 -87/-121 -86/-120 -118/-153 +f -118/-153 -86/-120 -85/-119 -117/-152 +f -117/-152 -85/-119 -84/-118 -116/-151 +f -116/-151 -84/-118 -83/-117 -115/-150 +f -115/-150 -83/-117 -82/-116 -114/-149 +f -114/-149 -82/-116 -81/-115 -113/-148 +f -113/-148 -81/-115 -80/-114 -112/-147 +f -112/-147 -80/-114 -79/-113 -111/-146 +f -111/-146 -79/-113 -78/-112 -110/-145 +f -110/-145 -78/-112 -77/-111 -109/-144 +f -109/-144 -77/-111 -76/-110 -108/-143 +f -108/-143 -76/-110 -75/-109 -107/-142 +f -107/-142 -75/-109 -74/-108 -106/-141 +f -106/-141 -74/-108 -73/-107 -105/-140 +f -105/-140 -73/-107 -72/-106 -104/-139 +f -104/-139 -72/-106 -71/-105 -103/-138 +f -103/-138 -71/-105 -70/-104 -102/-137 +f -102/-137 -70/-104 -69/-103 -101/-136 +f -101/-136 -69/-103 -68/-102 -100/-135 +f -100/-135 -68/-102 -67/-101 -99/-134 +f -99/-134 -67/-101 -66/-100 -98/-133 +f -98/-133 -66/-100 -97/-99 -129/-132 +f -97/-131 -65/-98 -64/-97 -96/-130 +f -96/-130 -64/-97 -63/-96 -95/-129 +f -95/-129 -63/-96 -62/-95 -94/-128 +f -94/-128 -62/-95 -61/-94 -93/-127 +f -93/-127 -61/-94 -60/-93 -92/-126 +f -92/-126 -60/-93 -59/-92 -91/-125 +f -91/-125 -59/-92 -58/-91 -90/-124 +f -90/-124 -58/-91 -57/-90 -89/-123 +f -89/-123 -57/-90 -56/-89 -88/-122 +f -88/-122 -56/-89 -55/-88 -87/-121 +f -87/-121 -55/-88 -54/-87 -86/-120 +f -86/-120 -54/-87 -53/-86 -85/-119 +f -85/-119 -53/-86 -52/-85 -84/-118 +f -84/-118 -52/-85 -51/-84 -83/-117 +f -83/-117 -51/-84 -50/-83 -82/-116 +f -82/-116 -50/-83 -49/-82 -81/-115 +f -81/-115 -49/-82 -48/-81 -80/-114 +f -80/-114 -48/-81 -47/-80 -79/-113 +f -79/-113 -47/-80 -46/-79 -78/-112 +f -78/-112 -46/-79 -45/-78 -77/-111 +f -77/-111 -45/-78 -44/-77 -76/-110 +f -76/-110 -44/-77 -43/-76 -75/-109 +f -75/-109 -43/-76 -42/-75 -74/-108 +f -74/-108 -42/-75 -41/-74 -73/-107 +f -73/-107 -41/-74 -40/-73 -72/-106 +f -72/-106 -40/-73 -39/-72 -71/-105 +f -71/-105 -39/-72 -38/-71 -70/-104 +f -70/-104 -38/-71 -37/-70 -69/-103 +f -69/-103 -37/-70 -36/-69 -68/-102 +f -68/-102 -36/-69 -35/-68 -67/-101 +f -67/-101 -35/-68 -34/-67 -66/-100 +f -66/-100 -34/-67 -65/-66 -97/-99 +f -65/-98 -33/-65 -32/-64 -64/-97 +f -64/-97 -32/-64 -31/-63 -63/-96 +f -63/-96 -31/-63 -30/-62 -62/-95 +f -62/-95 -30/-62 -29/-61 -61/-94 +f -61/-94 -29/-61 -28/-60 -60/-93 +f -60/-93 -28/-60 -27/-59 -59/-92 +f -59/-92 -27/-59 -26/-58 -58/-91 +f -58/-91 -26/-58 -25/-57 -57/-90 +f -57/-90 -25/-57 -24/-56 -56/-89 +f -56/-89 -24/-56 -23/-55 -55/-88 +f -55/-88 -23/-55 -22/-54 -54/-87 +f -54/-87 -22/-54 -21/-53 -53/-86 +f -53/-86 -21/-53 -20/-52 -52/-85 +f -52/-85 -20/-52 -19/-51 -51/-84 +f -51/-84 -19/-51 -18/-50 -50/-83 +f -50/-83 -18/-50 -17/-49 -49/-82 +f -49/-82 -17/-49 -16/-48 -48/-81 +f -48/-81 -16/-48 -15/-47 -47/-80 +f -47/-80 -15/-47 -14/-46 -46/-79 +f -46/-79 -14/-46 -13/-45 -45/-78 +f -45/-78 -13/-45 -12/-44 -44/-77 +f -44/-77 -12/-44 -11/-43 -43/-76 +f -43/-76 -11/-43 -10/-42 -42/-75 +f -42/-75 -10/-42 -9/-41 -41/-74 +f -41/-74 -9/-41 -8/-40 -40/-73 +f -40/-73 -8/-40 -7/-39 -39/-72 +f -39/-72 -7/-39 -6/-38 -38/-71 +f -38/-71 -6/-38 -5/-37 -37/-70 +f -37/-70 -5/-37 -4/-36 -36/-69 +f -36/-69 -4/-36 -3/-35 -35/-68 +f -35/-68 -3/-35 -2/-34 -34/-67 +f -34/-67 -2/-34 -33/-33 -65/-66 +f -1/-32 -32/-64 -33/-65 +f -1/-31 -31/-63 -32/-64 +f -1/-30 -30/-62 -31/-63 +f -1/-29 -29/-61 -30/-62 +f -1/-28 -28/-60 -29/-61 +f -1/-27 -27/-59 -28/-60 +f -1/-26 -26/-58 -27/-59 +f -1/-25 -25/-57 -26/-58 +f -1/-24 -24/-56 -25/-57 +f -1/-23 -23/-55 -24/-56 +f -1/-22 -22/-54 -23/-55 +f -1/-21 -21/-53 -22/-54 +f -1/-20 -20/-52 -21/-53 +f -1/-19 -19/-51 -20/-52 +f -1/-18 -18/-50 -19/-51 +f -1/-17 -17/-49 -18/-50 +f -1/-16 -16/-48 -17/-49 +f -1/-15 -15/-47 -16/-48 +f -1/-14 -14/-46 -15/-47 +f -1/-13 -13/-45 -14/-46 +f -1/-12 -12/-44 -13/-45 +f -1/-11 -11/-43 -12/-44 +f -1/-10 -10/-42 -11/-43 +f -1/-9 -9/-41 -10/-42 +f -1/-8 -8/-40 -9/-41 +f -1/-7 -7/-39 -8/-40 +f -1/-6 -6/-38 -7/-39 +f -1/-5 -5/-37 -6/-38 +f -1/-4 -4/-36 -5/-37 +f -1/-3 -3/-35 -4/-36 +f -1/-2 -2/-34 -3/-35 +f -1/-1 -33/-33 -2/-34 +# 448 polygons - 64 triangles + +# +# object Sphere005 +# + +v -7.082552 36.204266 -9.834373 +v -6.844621 36.298820 -9.859691 +v -6.862197 36.337055 -9.832331 +v -6.887891 36.369774 -9.804245 +v -6.920712 36.395718 -9.776516 +v -6.959401 36.413891 -9.750206 +v -7.002470 36.423599 -9.726328 +v -7.048265 36.424461 -9.705799 +v -7.095025 36.416454 -9.689408 +v -7.140954 36.399876 -9.677786 +v -7.184286 36.375370 -9.671377 +v -7.223356 36.343872 -9.670429 +v -7.256663 36.306599 -9.674979 +v -7.282927 36.264984 -9.684852 +v -7.301138 36.220619 -9.699667 +v -7.310598 36.175213 -9.718856 +v -7.310941 36.130512 -9.741681 +v -7.302155 36.088230 -9.767265 +v -7.284578 36.049999 -9.794626 +v -7.258885 36.017281 -9.822711 +v -7.226064 35.991337 -9.850441 +v -7.187375 35.973160 -9.876750 +v -7.144305 35.963455 -9.900628 +v -7.098511 35.962589 -9.921157 +v -7.051751 35.970600 -9.937548 +v -7.005822 35.987179 -9.949171 +v -6.962490 36.011684 -9.955579 +v -6.923419 36.043182 -9.956526 +v -6.890112 36.080452 -9.951977 +v -6.863849 36.122070 -9.942104 +v -6.845637 36.166435 -9.927289 +v -6.836178 36.211842 -9.908100 +v -6.835835 36.256542 -9.885275 +v -6.597504 36.368263 -9.842244 +v -6.631983 36.443260 -9.788575 +v -6.682381 36.507439 -9.733485 +v -6.746763 36.558331 -9.679090 +v -6.822654 36.593983 -9.627482 +v -6.907137 36.613022 -9.580645 +v -6.996967 36.614716 -9.540376 +v -7.088690 36.599003 -9.508224 +v -7.178782 36.566486 -9.485424 +v -7.263781 36.518414 -9.472855 +v -7.340420 36.456635 -9.470996 +v -7.405755 36.383522 -9.479920 +v -7.457273 36.301884 -9.499286 +v -7.492996 36.214863 -9.528347 +v -7.511551 36.125797 -9.565988 +v -7.512225 36.038109 -9.610761 +v -7.494991 35.955177 -9.660946 +v -7.460512 35.880177 -9.714615 +v -7.410113 35.816002 -9.769706 +v -7.345731 35.765110 -9.824100 +v -7.269840 35.729458 -9.875708 +v -7.185357 35.710419 -9.922546 +v -7.095528 35.708725 -9.962814 +v -7.003804 35.724438 -9.994967 +v -6.913712 35.756954 -10.017766 +v -6.828713 35.805027 -10.030336 +v -6.752074 35.866806 -10.032194 +v -6.686740 35.939919 -10.023270 +v -6.635221 36.021557 -10.003904 +v -6.599498 36.108578 -9.974843 +v -6.580944 36.197643 -9.937202 +v -6.580270 36.285332 -9.892429 +v -6.350699 36.409924 -9.782704 +v -6.400754 36.518803 -9.704789 +v -6.473922 36.611977 -9.624811 +v -6.567390 36.685860 -9.545842 +v -6.677566 36.737617 -9.470920 +v -6.800217 36.765255 -9.402921 +v -6.930629 36.767719 -9.344460 +v -7.063791 36.744907 -9.297782 +v -7.194584 36.697701 -9.264683 +v -7.317984 36.627911 -9.246433 +v -7.429246 36.538219 -9.243735 +v -7.524097 36.432076 -9.256693 +v -7.598891 36.313557 -9.284806 +v -7.650753 36.187218 -9.326997 +v -7.677690 36.057915 -9.381642 +v -7.678668 35.930614 -9.446643 +v -7.653648 35.810211 -9.519501 +v -7.603592 35.701332 -9.597417 +v -7.530425 35.608162 -9.677395 +v -7.436957 35.534279 -9.756363 +v -7.326780 35.482521 -9.831286 +v -7.204129 35.454880 -9.899285 +v -7.073717 35.452419 -9.957747 +v -6.940556 35.475231 -10.004423 +v -6.809762 35.522438 -10.037522 +v -6.686363 35.592228 -10.055772 +v -6.575100 35.681919 -10.058470 +v -6.480249 35.788063 -10.045513 +v -6.405456 35.906582 -10.017399 +v -6.353594 36.032921 -9.975208 +v -6.326657 36.162224 -9.920563 +v -6.325680 36.289524 -9.855562 +v -6.113690 36.422199 -9.683360 +v -6.177399 36.560780 -9.584192 +v -6.270523 36.679363 -9.482399 +v -6.389485 36.773399 -9.381892 +v -6.529714 36.839275 -9.286532 +v -6.685819 36.874454 -9.199986 +v -6.851801 36.877586 -9.125580 +v -7.021284 36.848553 -9.066171 +v -7.187753 36.788471 -9.024044 +v -7.344810 36.699642 -9.000816 +v -7.486421 36.585491 -8.997382 +v -7.607143 36.450394 -9.013873 +v -7.702337 36.299549 -9.049656 +v -7.768345 36.138748 -9.103354 +v -7.802629 35.974178 -9.172904 +v -7.803874 35.812157 -9.255634 +v -7.772030 35.658913 -9.348366 +v -7.708322 35.520336 -9.447533 +v -7.615197 35.401752 -9.549326 +v -7.496234 35.307716 -9.649834 +v -7.356006 35.241840 -9.745193 +v -7.199901 35.206661 -9.831738 +v -7.033918 35.203529 -9.906146 +v -6.864436 35.232563 -9.965554 +v -6.697967 35.292645 -10.007682 +v -6.540909 35.381474 -10.030909 +v -6.399299 35.495628 -10.034342 +v -6.278577 35.630722 -10.017851 +v -6.183383 35.781567 -9.982069 +v -6.117375 35.942368 -9.928371 +v -6.083091 36.106937 -9.858820 +v -6.081847 36.268959 -9.776090 +v -5.895586 36.404625 -9.548028 +v -5.970499 36.567574 -9.431419 +v -6.080002 36.707016 -9.311723 +v -6.219887 36.817589 -9.193539 +v -6.384778 36.895050 -9.081409 +v -6.568337 36.936417 -8.979641 +v -6.763513 36.940102 -8.892148 +v -6.962803 36.905960 -8.822290 +v -7.158549 36.835308 -8.772754 +v -7.343230 36.730862 -8.745442 +v -7.509747 36.596630 -8.741404 +v -7.651700 36.437775 -8.760796 +v -7.763637 36.260399 -8.802871 +v -7.841254 36.071320 -8.866013 +v -7.881568 35.877804 -8.947796 +v -7.883032 35.687286 -9.045076 +v -7.845587 35.507092 -9.154116 +v -7.770674 35.344143 -9.270725 +v -7.661170 35.204700 -9.390421 +v -7.521286 35.094124 -9.508605 +v -7.356395 35.016666 -9.620736 +v -7.172834 34.975300 -9.722503 +v -6.977659 34.971615 -9.809997 +v -6.778369 35.005756 -9.879853 +v -6.582623 35.076408 -9.929390 +v -6.397943 35.180855 -9.956701 +v -6.231426 35.315086 -9.960739 +v -6.089472 35.473942 -9.941348 +v -5.977536 35.651318 -9.899273 +v -5.899920 35.840397 -9.836130 +v -5.859605 36.033913 -9.754348 +v -5.858142 36.224430 -9.657066 +v -5.704768 36.357864 -9.381910 +v -5.788007 36.538925 -9.252341 +v -5.909680 36.693867 -9.119342 +v -6.065111 36.816730 -8.988023 +v -6.248328 36.902798 -8.863430 +v -6.452289 36.948761 -8.750352 +v -6.669157 36.952858 -8.653134 +v -6.890596 36.914921 -8.575514 +v -7.108098 36.836418 -8.520472 +v -7.313303 36.720364 -8.490124 +v -7.498326 36.571213 -8.485637 +v -7.656057 36.394703 -8.507183 +v -7.780435 36.197613 -8.553935 +v -7.866678 35.987518 -8.624095 +v -7.911473 35.772495 -8.714967 +v -7.913099 35.560806 -8.823059 +v -7.871492 35.360584 -8.944218 +v -7.788253 35.179523 -9.073787 +v -7.666580 35.024586 -9.206786 +v -7.511148 34.901718 -9.338105 +v -7.327931 34.815651 -9.462698 +v -7.123971 34.769688 -9.575776 +v -6.907103 34.765594 -9.672994 +v -6.685664 34.803528 -9.750614 +v -6.468162 34.882030 -9.805656 +v -6.262957 34.998089 -9.836003 +v -6.077933 35.147240 -9.840490 +v -5.920202 35.323750 -9.818944 +v -5.795826 35.520840 -9.772192 +v -5.709583 35.730930 -9.702032 +v -5.664788 35.945957 -9.611159 +v -5.663162 36.157646 -9.503067 +v -5.548569 36.283726 -9.191389 +v -5.636934 36.475937 -9.053840 +v -5.766102 36.640423 -8.912648 +v -5.931107 36.770855 -8.773240 +v -6.125609 36.862225 -8.640973 +v -6.342133 36.911018 -8.520930 +v -6.572358 36.915363 -8.417725 +v -6.807437 36.875095 -8.335323 +v -7.038335 36.791756 -8.276891 +v -7.256181 36.668549 -8.244674 +v -7.452600 36.510216 -8.239911 +v -7.620047 36.322830 -8.262784 +v -7.752085 36.113602 -8.312415 +v -7.843640 35.890568 -8.386897 +v -7.891194 35.662300 -8.483366 +v -7.892920 35.437572 -8.598117 +v -7.848752 35.225018 -8.726738 +v -7.760385 35.032803 -8.864287 +v -7.631217 34.868320 -9.005479 +v -7.466212 34.737888 -9.144886 +v -7.271710 34.646519 -9.277153 +v -7.055186 34.597725 -9.397196 +v -6.824961 34.593380 -9.500401 +v -6.589882 34.633652 -9.582804 +v -6.358984 34.716988 -9.641235 +v -6.141139 34.840195 -9.673452 +v -5.944719 34.998531 -9.678215 +v -5.777273 35.185913 -9.655341 +v -5.645235 35.395142 -9.605710 +v -5.553680 35.618176 -9.531229 +v -5.506125 35.846443 -9.434759 +v -5.504400 36.071175 -9.320008 +v -5.432991 36.185055 -8.983787 +v -5.523088 36.381031 -8.843543 +v -5.654786 36.548737 -8.699585 +v -5.823024 36.681725 -8.557446 +v -6.021337 36.774883 -8.422588 +v -6.242102 36.824635 -8.300194 +v -6.476838 36.829067 -8.194966 +v -6.716522 36.788006 -8.110950 +v -6.951944 36.703037 -8.051373 +v -7.174057 36.577415 -8.018524 +v -7.374325 36.415977 -8.013668 +v -7.545052 36.224926 -8.036989 +v -7.679677 36.011597 -8.087593 +v -7.773026 35.784195 -8.163533 +v -7.821512 35.551453 -8.261893 +v -7.823271 35.322323 -8.378891 +v -7.778237 35.105602 -8.510033 +v -7.688140 34.909626 -8.650276 +v -7.556441 34.741920 -8.794234 +v -7.388203 34.608932 -8.936374 +v -7.189891 34.515774 -9.071231 +v -6.969125 34.466022 -9.193625 +v -6.734389 34.461590 -9.298853 +v -6.494705 34.502651 -9.382870 +v -6.259283 34.587624 -9.442447 +v -6.037170 34.713242 -9.475294 +v -5.836902 34.874680 -9.480150 +v -5.666176 35.065735 -9.456829 +v -5.531551 35.279060 -9.406225 +v -5.438202 35.506466 -9.330284 +v -5.389717 35.739204 -9.231925 +v -5.387957 35.968338 -9.114926 +v -5.362476 36.065639 -8.767081 +v -5.450842 36.257851 -8.629532 +v -5.580010 36.422333 -8.488340 +v -5.745015 36.552769 -8.348933 +v -5.939517 36.644135 -8.216666 +v -6.156041 36.692932 -8.096623 +v -6.386266 36.697277 -7.993418 +v -6.621345 36.657009 -7.911016 +v -6.852243 36.573669 -7.852583 +v -7.070088 36.450462 -7.820366 +v -7.266509 36.292126 -7.815603 +v -7.433955 36.104744 -7.838477 +v -7.565993 35.895515 -7.888108 +v -7.657548 35.672482 -7.962589 +v -7.705102 35.444214 -8.059059 +v -7.706829 35.219486 -8.173809 +v -7.662660 35.006931 -8.302430 +v -7.574293 34.814716 -8.439980 +v -7.445126 34.650234 -8.581171 +v -7.280120 34.519802 -8.720579 +v -7.085618 34.428432 -8.852846 +v -6.869094 34.379639 -8.972889 +v -6.638869 34.375294 -9.076094 +v -6.403790 34.415562 -9.158496 +v -6.172892 34.498901 -9.216928 +v -5.955047 34.622108 -9.249145 +v -5.758627 34.780445 -9.253908 +v -5.591181 34.967827 -9.231034 +v -5.459143 35.177055 -9.181403 +v -5.367588 35.400089 -9.106921 +v -5.320034 35.628357 -9.010451 +v -5.318308 35.853088 -8.895701 +v -5.339735 35.930073 -8.549601 +v -5.422974 36.111134 -8.420033 +v -5.544647 36.266071 -8.287033 +v -5.700079 36.388939 -8.155714 +v -5.883296 36.475006 -8.031121 +v -6.087256 36.520969 -7.918043 +v -6.304124 36.525063 -7.820826 +v -6.525563 36.487129 -7.743204 +v -6.743065 36.408627 -7.688162 +v -6.948271 36.292568 -7.657815 +v -7.133294 36.143421 -7.653328 +v -7.291025 35.966908 -7.674874 +v -7.415402 35.769821 -7.721626 +v -7.501646 35.559727 -7.791786 +v -7.546441 35.344704 -7.882658 +v -7.548066 35.133011 -7.990751 +v -7.506460 34.932789 -8.111909 +v -7.423221 34.751732 -8.241478 +v -7.301548 34.596790 -8.374477 +v -7.146116 34.473927 -8.505796 +v -6.962899 34.387859 -8.630389 +v -6.758938 34.341896 -8.743467 +v -6.542070 34.337799 -8.840685 +v -6.320631 34.375736 -8.918305 +v -6.103129 34.454239 -8.973348 +v -5.897924 34.570297 -9.003695 +v -5.712901 34.719444 -9.008182 +v -5.555170 34.895958 -8.986635 +v -5.430793 35.093044 -8.939883 +v -5.344550 35.303139 -8.869723 +v -5.299755 35.518162 -8.778851 +v -5.298130 35.729855 -8.670758 +v -5.365641 35.783566 -8.339703 +v -5.440554 35.946514 -8.223094 +v -5.550057 36.085957 -8.103397 +v -5.689941 36.196529 -7.985214 +v -5.854832 36.273991 -7.873083 +v -6.038393 36.315357 -7.771316 +v -6.233568 36.319042 -7.683823 +v -6.432858 36.284901 -7.613965 +v -6.628604 36.214249 -7.564428 +v -6.813285 36.109802 -7.537117 +v -6.979801 35.975571 -7.533079 +v -7.121756 35.816715 -7.552470 +v -7.233692 35.639339 -7.594545 +v -7.311309 35.450260 -7.657687 +v -7.351624 35.256744 -7.739470 +v -7.353086 35.066227 -7.836751 +v -7.315642 34.886032 -7.945791 +v -7.240729 34.723083 -8.062399 +v -7.131226 34.583641 -8.182096 +v -6.991341 34.473068 -8.300280 +v -6.826450 34.395607 -8.412411 +v -6.642889 34.354240 -8.514177 +v -6.447714 34.350555 -8.601671 +v -6.248424 34.384697 -8.671528 +v -6.052678 34.455349 -8.721065 +v -5.867998 34.559795 -8.748377 +v -5.701481 34.694027 -8.752415 +v -5.559527 34.852882 -8.733023 +v -5.447591 35.030258 -8.690948 +v -5.369974 35.219337 -8.627805 +v -5.329660 35.412853 -8.546022 +v -5.328197 35.603371 -8.448742 +v -5.439198 35.631744 -8.145453 +v -5.502907 35.770321 -8.046286 +v -5.596031 35.888905 -7.944492 +v -5.714993 35.982941 -7.843985 +v -5.855221 36.048817 -7.748626 +v -6.011326 36.083996 -7.662080 +v -6.177310 36.087128 -7.587673 +v -6.346792 36.058094 -7.528264 +v -6.513260 35.998013 -7.486137 +v -6.670318 35.909187 -7.462910 +v -6.811929 35.795033 -7.459476 +v -6.932651 35.659935 -7.475966 +v -7.027845 35.509090 -7.511749 +v -7.093853 35.348293 -7.565447 +v -7.128138 35.183720 -7.634997 +v -7.129382 35.021698 -7.717728 +v -7.097538 34.868454 -7.810459 +v -7.033829 34.729877 -7.909626 +v -6.940704 34.611294 -8.011419 +v -6.821742 34.517258 -8.111927 +v -6.681514 34.451382 -8.207286 +v -6.525409 34.416203 -8.293832 +v -6.359426 34.413071 -8.368239 +v -6.189943 34.442104 -8.427648 +v -6.023475 34.502190 -8.469775 +v -5.866417 34.591015 -8.493002 +v -5.724807 34.705170 -8.496436 +v -5.604085 34.840263 -8.479944 +v -5.508891 34.991112 -8.444162 +v -5.442883 35.151909 -8.390464 +v -5.408599 35.316479 -8.320913 +v -5.407354 35.478500 -8.238183 +v -5.557580 35.480442 -7.974318 +v -5.607635 35.589321 -7.896402 +v -5.680803 35.682495 -7.816424 +v -5.774271 35.756378 -7.737455 +v -5.884447 35.808136 -7.662532 +v -6.007098 35.835777 -7.594534 +v -6.137510 35.838238 -7.536072 +v -6.270672 35.815426 -7.489395 +v -6.401465 35.768219 -7.456296 +v -6.524865 35.698429 -7.438046 +v -6.636127 35.608738 -7.435349 +v -6.730978 35.502594 -7.448305 +v -6.805772 35.384075 -7.476419 +v -6.857634 35.257736 -7.518610 +v -6.884571 35.128433 -7.573255 +v -6.885549 35.001137 -7.638256 +v -6.860529 34.880733 -7.711114 +v -6.810473 34.771854 -7.789030 +v -6.737306 34.678680 -7.869008 +v -6.643838 34.604797 -7.947976 +v -6.533661 34.553040 -8.022900 +v -6.411010 34.525402 -8.090898 +v -6.280598 34.522938 -8.149359 +v -6.147437 34.545750 -8.196036 +v -6.016644 34.592957 -8.229136 +v -5.893244 34.662750 -8.247385 +v -5.781981 34.752438 -8.250083 +v -5.687131 34.858582 -8.237125 +v -5.612337 34.977100 -8.209012 +v -5.560475 35.103439 -8.166821 +v -5.533538 35.232742 -8.112176 +v -5.532561 35.360043 -8.047174 +v -5.716238 35.335480 -7.832872 +v -5.750716 35.410477 -7.779203 +v -5.801115 35.474655 -7.724113 +v -5.865497 35.525547 -7.669719 +v -5.941388 35.561199 -7.618111 +v -6.025871 35.580238 -7.571272 +v -6.115700 35.581932 -7.531004 +v -6.207423 35.566219 -7.498852 +v -6.297515 35.533703 -7.476053 +v -6.382514 35.485630 -7.463482 +v -6.459154 35.423851 -7.461624 +v -6.524488 35.350739 -7.470549 +v -6.576006 35.269100 -7.489914 +v -6.611730 35.182079 -7.518975 +v -6.630284 35.093014 -7.556616 +v -6.630958 35.005329 -7.601389 +v -6.613724 34.922394 -7.651574 +v -6.579246 34.847397 -7.705244 +v -6.528847 34.783218 -7.760334 +v -6.464465 34.732327 -7.814728 +v -6.388574 34.696674 -7.866336 +v -6.304090 34.677635 -7.913174 +v -6.214261 34.675941 -7.953443 +v -6.122538 34.691654 -7.985595 +v -6.032445 34.724171 -8.008393 +v -5.947447 34.772243 -8.020964 +v -5.870808 34.834023 -8.022822 +v -5.805473 34.907135 -8.013898 +v -5.753955 34.988773 -7.994532 +v -5.718232 35.075798 -7.965471 +v -5.699677 35.164864 -7.927831 +v -5.699004 35.252548 -7.883057 +v -5.909073 35.202427 -7.726552 +v -5.926650 35.240658 -7.699193 +v -5.952343 35.273376 -7.671108 +v -5.985165 35.299320 -7.643378 +v -6.023853 35.317493 -7.617068 +v -6.066923 35.327202 -7.593190 +v -6.112718 35.328064 -7.572661 +v -6.159477 35.320057 -7.556271 +v -6.205406 35.303478 -7.544648 +v -6.248738 35.278973 -7.538239 +v -6.287808 35.247475 -7.537292 +v -6.321115 35.210205 -7.541842 +v -6.347379 35.168587 -7.551714 +v -6.365591 35.124222 -7.566529 +v -6.375050 35.078815 -7.585718 +v -6.375393 35.034115 -7.608543 +v -6.366608 34.991837 -7.634128 +v -6.349030 34.953602 -7.661488 +v -6.323338 34.920883 -7.689573 +v -6.290516 34.894939 -7.717303 +v -6.251827 34.876766 -7.743612 +v -6.208758 34.867058 -7.767490 +v -6.162963 34.866196 -7.788019 +v -6.116203 34.874207 -7.804410 +v -6.070274 34.890781 -7.816032 +v -6.026943 34.915291 -7.822441 +v -5.987872 34.946785 -7.823388 +v -5.954565 34.984058 -7.818839 +v -5.928301 35.025677 -7.808966 +v -5.910090 35.070038 -7.794151 +v -5.900631 35.115444 -7.774962 +v -5.900288 35.160145 -7.752137 +v -6.128676 35.086391 -7.659445 +# 482 vertices + +vt 0.000000 1.000000 0.000000 +vt 0.000000 0.937500 0.000000 +vt 0.031250 0.937500 0.000000 +vt 0.031250 1.000000 0.000000 +vt 0.062500 0.937500 0.000000 +vt 0.062500 1.000000 0.000000 +vt 0.093750 0.937500 0.000000 +vt 0.093750 1.000000 0.000000 +vt 0.125000 0.937500 0.000000 +vt 0.125000 1.000000 0.000000 +vt 0.156250 0.937500 0.000000 +vt 0.156250 1.000000 0.000000 +vt 0.187500 0.937500 0.000000 +vt 0.187500 1.000000 0.000000 +vt 0.218750 0.937500 0.000000 +vt 0.218750 1.000000 0.000000 +vt 0.250000 0.937500 0.000000 +vt 0.250000 1.000000 0.000000 +vt 0.281250 0.937500 0.000000 +vt 0.281250 1.000000 0.000000 +vt 0.312500 0.937500 0.000000 +vt 0.312500 1.000000 0.000000 +vt 0.343750 0.937500 0.000000 +vt 0.343750 1.000000 0.000000 +vt 0.375000 0.937500 0.000000 +vt 0.375000 1.000000 0.000000 +vt 0.406250 0.937500 0.000000 +vt 0.406250 1.000000 0.000000 +vt 0.437500 0.937500 0.000000 +vt 0.437500 1.000000 0.000000 +vt 0.468750 0.937500 0.000000 +vt 0.468750 1.000000 0.000000 +vt 0.500000 0.937500 0.000000 +vt 0.500000 1.000000 0.000000 +vt 0.531250 0.937500 0.000000 +vt 0.531250 1.000000 0.000000 +vt 0.562500 0.937500 0.000000 +vt 0.562500 1.000000 0.000000 +vt 0.593750 0.937500 0.000000 +vt 0.593750 1.000000 0.000000 +vt 0.625000 0.937500 0.000000 +vt 0.625000 1.000000 0.000000 +vt 0.656250 0.937500 0.000000 +vt 0.656250 1.000000 0.000000 +vt 0.687500 0.937500 0.000000 +vt 0.687500 1.000000 0.000000 +vt 0.718750 0.937500 0.000000 +vt 0.718750 1.000000 0.000000 +vt 0.750000 0.937500 0.000000 +vt 0.750000 1.000000 0.000000 +vt 0.781250 0.937500 0.000000 +vt 0.781250 1.000000 0.000000 +vt 0.812500 0.937500 0.000000 +vt 0.812500 1.000000 0.000000 +vt 0.843750 0.937500 0.000000 +vt 0.843750 1.000000 0.000000 +vt 0.875000 0.937500 0.000000 +vt 0.875000 1.000000 0.000000 +vt 0.906250 0.937500 0.000000 +vt 0.906250 1.000000 0.000000 +vt 0.937500 0.937500 0.000000 +vt 0.937500 1.000000 0.000000 +vt 0.968750 0.937500 0.000000 +vt 0.968750 1.000000 0.000000 +vt 1.000000 0.937500 0.000000 +vt 0.000000 0.875000 0.000000 +vt 0.031250 0.875000 0.000000 +vt 0.062500 0.875000 0.000000 +vt 0.093750 0.875000 0.000000 +vt 0.125000 0.875000 0.000000 +vt 0.156250 0.875000 0.000000 +vt 0.187500 0.875000 0.000000 +vt 0.218750 0.875000 0.000000 +vt 0.250000 0.875000 0.000000 +vt 0.281250 0.875000 0.000000 +vt 0.312500 0.875000 0.000000 +vt 0.343750 0.875000 0.000000 +vt 0.375000 0.875000 0.000000 +vt 0.406250 0.875000 0.000000 +vt 0.437500 0.875000 0.000000 +vt 0.468750 0.875000 0.000000 +vt 0.500000 0.875000 0.000000 +vt 0.531250 0.875000 0.000000 +vt 0.562500 0.875000 0.000000 +vt 0.593750 0.875000 0.000000 +vt 0.625000 0.875000 0.000000 +vt 0.656250 0.875000 0.000000 +vt 0.687500 0.875000 0.000000 +vt 0.718750 0.875000 0.000000 +vt 0.750000 0.875000 0.000000 +vt 0.781250 0.875000 0.000000 +vt 0.812500 0.875000 0.000000 +vt 0.843750 0.875000 0.000000 +vt 0.875000 0.875000 0.000000 +vt 0.906250 0.875000 0.000000 +vt 0.937500 0.875000 0.000000 +vt 0.968750 0.875000 0.000000 +vt 1.000000 0.875000 0.000000 +vt 0.000000 0.812500 0.000000 +vt 0.031250 0.812500 0.000000 +vt 0.062500 0.812500 0.000000 +vt 0.093750 0.812500 0.000000 +vt 0.125000 0.812500 0.000000 +vt 0.156250 0.812500 0.000000 +vt 0.187500 0.812500 0.000000 +vt 0.218750 0.812500 0.000000 +vt 0.250000 0.812500 0.000000 +vt 0.281250 0.812500 0.000000 +vt 0.312500 0.812500 0.000000 +vt 0.343750 0.812500 0.000000 +vt 0.375000 0.812500 0.000000 +vt 0.406250 0.812500 0.000000 +vt 0.437500 0.812500 0.000000 +vt 0.468750 0.812500 0.000000 +vt 0.500000 0.812500 0.000000 +vt 0.531250 0.812500 0.000000 +vt 0.562500 0.812500 0.000000 +vt 0.593750 0.812500 0.000000 +vt 0.625000 0.812500 0.000000 +vt 0.656250 0.812500 0.000000 +vt 0.687500 0.812500 0.000000 +vt 0.718750 0.812500 0.000000 +vt 0.750000 0.812500 0.000000 +vt 0.781250 0.812500 0.000000 +vt 0.812500 0.812500 0.000000 +vt 0.843750 0.812500 0.000000 +vt 0.875000 0.812500 0.000000 +vt 0.906250 0.812500 0.000000 +vt 0.937500 0.812500 0.000000 +vt 0.968750 0.812500 0.000000 +vt 1.000000 0.812500 0.000000 +vt 0.000000 0.750000 0.000000 +vt 0.031250 0.750000 0.000000 +vt 0.062500 0.750000 0.000000 +vt 0.093750 0.750000 0.000000 +vt 0.125000 0.750000 0.000000 +vt 0.156250 0.750000 0.000000 +vt 0.187500 0.750000 0.000000 +vt 0.218750 0.750000 0.000000 +vt 0.250000 0.750000 0.000000 +vt 0.281250 0.750000 0.000000 +vt 0.312500 0.750000 0.000000 +vt 0.343750 0.750000 0.000000 +vt 0.375000 0.750000 0.000000 +vt 0.406250 0.750000 0.000000 +vt 0.437500 0.750000 0.000000 +vt 0.468750 0.750000 0.000000 +vt 0.500000 0.750000 0.000000 +vt 0.531250 0.750000 0.000000 +vt 0.562500 0.750000 0.000000 +vt 0.593750 0.750000 0.000000 +vt 0.625000 0.750000 0.000000 +vt 0.656250 0.750000 0.000000 +vt 0.687500 0.750000 0.000000 +vt 0.718750 0.750000 0.000000 +vt 0.750000 0.750000 0.000000 +vt 0.781250 0.750000 0.000000 +vt 0.812500 0.750000 0.000000 +vt 0.843750 0.750000 0.000000 +vt 0.875000 0.750000 0.000000 +vt 0.906250 0.750000 0.000000 +vt 0.937500 0.750000 0.000000 +vt 0.968750 0.750000 0.000000 +vt 1.000000 0.750000 0.000000 +vt 0.000000 0.687500 0.000000 +vt 0.031250 0.687500 0.000000 +vt 0.062500 0.687500 0.000000 +vt 0.093750 0.687500 0.000000 +vt 0.125000 0.687500 0.000000 +vt 0.156250 0.687500 0.000000 +vt 0.187500 0.687500 0.000000 +vt 0.218750 0.687500 0.000000 +vt 0.250000 0.687500 0.000000 +vt 0.281250 0.687500 0.000000 +vt 0.312500 0.687500 0.000000 +vt 0.343750 0.687500 0.000000 +vt 0.375000 0.687500 0.000000 +vt 0.406250 0.687500 0.000000 +vt 0.437500 0.687500 0.000000 +vt 0.468750 0.687500 0.000000 +vt 0.500000 0.687500 0.000000 +vt 0.531250 0.687500 0.000000 +vt 0.562500 0.687500 0.000000 +vt 0.593750 0.687500 0.000000 +vt 0.625000 0.687500 0.000000 +vt 0.656250 0.687500 0.000000 +vt 0.687500 0.687500 0.000000 +vt 0.718750 0.687500 0.000000 +vt 0.750000 0.687500 0.000000 +vt 0.781250 0.687500 0.000000 +vt 0.812500 0.687500 0.000000 +vt 0.843750 0.687500 0.000000 +vt 0.875000 0.687500 0.000000 +vt 0.906250 0.687500 0.000000 +vt 0.937500 0.687500 0.000000 +vt 0.968750 0.687500 0.000000 +vt 1.000000 0.687500 0.000000 +vt 0.000000 0.625000 0.000000 +vt 0.031250 0.625000 0.000000 +vt 0.062500 0.625000 0.000000 +vt 0.093750 0.625000 0.000000 +vt 0.125000 0.625000 0.000000 +vt 0.156250 0.625000 0.000000 +vt 0.187500 0.625000 0.000000 +vt 0.218750 0.625000 0.000000 +vt 0.250000 0.625000 0.000000 +vt 0.281250 0.625000 0.000000 +vt 0.312500 0.625000 0.000000 +vt 0.343750 0.625000 0.000000 +vt 0.375000 0.625000 0.000000 +vt 0.406250 0.625000 0.000000 +vt 0.437500 0.625000 0.000000 +vt 0.468750 0.625000 0.000000 +vt 0.500000 0.625000 0.000000 +vt 0.531250 0.625000 0.000000 +vt 0.562500 0.625000 0.000000 +vt 0.593750 0.625000 0.000000 +vt 0.625000 0.625000 0.000000 +vt 0.656250 0.625000 0.000000 +vt 0.687500 0.625000 0.000000 +vt 0.718750 0.625000 0.000000 +vt 0.750000 0.625000 0.000000 +vt 0.781250 0.625000 0.000000 +vt 0.812500 0.625000 0.000000 +vt 0.843750 0.625000 0.000000 +vt 0.875000 0.625000 0.000000 +vt 0.906250 0.625000 0.000000 +vt 0.937500 0.625000 0.000000 +vt 0.968750 0.625000 0.000000 +vt 1.000000 0.625000 0.000000 +vt 0.000000 0.562500 0.000000 +vt 0.031250 0.562500 0.000000 +vt 0.062500 0.562500 0.000000 +vt 0.093750 0.562500 0.000000 +vt 0.125000 0.562500 0.000000 +vt 0.156250 0.562500 0.000000 +vt 0.187500 0.562500 0.000000 +vt 0.218750 0.562500 0.000000 +vt 0.250000 0.562500 0.000000 +vt 0.281250 0.562500 0.000000 +vt 0.312500 0.562500 0.000000 +vt 0.343750 0.562500 0.000000 +vt 0.375000 0.562500 0.000000 +vt 0.406250 0.562500 0.000000 +vt 0.437500 0.562500 0.000000 +vt 0.468750 0.562500 0.000000 +vt 0.500000 0.562500 0.000000 +vt 0.531250 0.562500 0.000000 +vt 0.562500 0.562500 0.000000 +vt 0.593750 0.562500 0.000000 +vt 0.625000 0.562500 0.000000 +vt 0.656250 0.562500 0.000000 +vt 0.687500 0.562500 0.000000 +vt 0.718750 0.562500 0.000000 +vt 0.750000 0.562500 0.000000 +vt 0.781250 0.562500 0.000000 +vt 0.812500 0.562500 0.000000 +vt 0.843750 0.562500 0.000000 +vt 0.875000 0.562500 0.000000 +vt 0.906250 0.562500 0.000000 +vt 0.937500 0.562500 0.000000 +vt 0.968750 0.562500 0.000000 +vt 1.000000 0.562500 0.000000 +vt 0.000000 0.500000 0.000000 +vt 0.031250 0.500000 0.000000 +vt 0.062500 0.500000 0.000000 +vt 0.093750 0.500000 0.000000 +vt 0.125000 0.500000 0.000000 +vt 0.156250 0.500000 0.000000 +vt 0.187500 0.500000 0.000000 +vt 0.218750 0.500000 0.000000 +vt 0.250000 0.500000 0.000000 +vt 0.281250 0.500000 0.000000 +vt 0.312500 0.500000 0.000000 +vt 0.343750 0.500000 0.000000 +vt 0.375000 0.500000 0.000000 +vt 0.406250 0.500000 0.000000 +vt 0.437500 0.500000 0.000000 +vt 0.468750 0.500000 0.000000 +vt 0.500000 0.500000 0.000000 +vt 0.531250 0.500000 0.000000 +vt 0.562500 0.500000 0.000000 +vt 0.593750 0.500000 0.000000 +vt 0.625000 0.500000 0.000000 +vt 0.656250 0.500000 0.000000 +vt 0.687500 0.500000 0.000000 +vt 0.718750 0.500000 0.000000 +vt 0.750000 0.500000 0.000000 +vt 0.781250 0.500000 0.000000 +vt 0.812500 0.500000 0.000000 +vt 0.843750 0.500000 0.000000 +vt 0.875000 0.500000 0.000000 +vt 0.906250 0.500000 0.000000 +vt 0.937500 0.500000 0.000000 +vt 0.968750 0.500000 0.000000 +vt 1.000000 0.500000 0.000000 +vt 0.000000 0.437500 0.000000 +vt 0.031250 0.437500 0.000000 +vt 0.062500 0.437500 0.000000 +vt 0.093750 0.437500 0.000000 +vt 0.125000 0.437500 0.000000 +vt 0.156250 0.437500 0.000000 +vt 0.187500 0.437500 0.000000 +vt 0.218750 0.437500 0.000000 +vt 0.250000 0.437500 0.000000 +vt 0.281250 0.437500 0.000000 +vt 0.312500 0.437500 0.000000 +vt 0.343750 0.437500 0.000000 +vt 0.375000 0.437500 0.000000 +vt 0.406250 0.437500 0.000000 +vt 0.437500 0.437500 0.000000 +vt 0.468750 0.437500 0.000000 +vt 0.500000 0.437500 0.000000 +vt 0.531250 0.437500 0.000000 +vt 0.562500 0.437500 0.000000 +vt 0.593750 0.437500 0.000000 +vt 0.625000 0.437500 0.000000 +vt 0.656250 0.437500 0.000000 +vt 0.687500 0.437500 0.000000 +vt 0.718750 0.437500 0.000000 +vt 0.750000 0.437500 0.000000 +vt 0.781250 0.437500 0.000000 +vt 0.812500 0.437500 0.000000 +vt 0.843750 0.437500 0.000000 +vt 0.875000 0.437500 0.000000 +vt 0.906250 0.437500 0.000000 +vt 0.937500 0.437500 0.000000 +vt 0.968750 0.437500 0.000000 +vt 1.000000 0.437500 0.000000 +vt 0.000000 0.375000 0.000000 +vt 0.031250 0.375000 0.000000 +vt 0.062500 0.375000 0.000000 +vt 0.093750 0.375000 0.000000 +vt 0.125000 0.375000 0.000000 +vt 0.156250 0.375000 0.000000 +vt 0.187500 0.375000 0.000000 +vt 0.218750 0.375000 0.000000 +vt 0.250000 0.375000 0.000000 +vt 0.281250 0.375000 0.000000 +vt 0.312500 0.375000 0.000000 +vt 0.343750 0.375000 0.000000 +vt 0.375000 0.375000 0.000000 +vt 0.406250 0.375000 0.000000 +vt 0.437500 0.375000 0.000000 +vt 0.468750 0.375000 0.000000 +vt 0.500000 0.375000 0.000000 +vt 0.531250 0.375000 0.000000 +vt 0.562500 0.375000 0.000000 +vt 0.593750 0.375000 0.000000 +vt 0.625000 0.375000 0.000000 +vt 0.656250 0.375000 0.000000 +vt 0.687500 0.375000 0.000000 +vt 0.718750 0.375000 0.000000 +vt 0.750000 0.375000 0.000000 +vt 0.781250 0.375000 0.000000 +vt 0.812500 0.375000 0.000000 +vt 0.843750 0.375000 0.000000 +vt 0.875000 0.375000 0.000000 +vt 0.906250 0.375000 0.000000 +vt 0.937500 0.375000 0.000000 +vt 0.968750 0.375000 0.000000 +vt 1.000000 0.375000 0.000000 +vt 0.000000 0.312500 0.000000 +vt 0.031250 0.312500 0.000000 +vt 0.062500 0.312500 0.000000 +vt 0.093750 0.312500 0.000000 +vt 0.125000 0.312500 0.000000 +vt 0.156250 0.312500 0.000000 +vt 0.187500 0.312500 0.000000 +vt 0.218750 0.312500 0.000000 +vt 0.250000 0.312500 0.000000 +vt 0.281250 0.312500 0.000000 +vt 0.312500 0.312500 0.000000 +vt 0.343750 0.312500 0.000000 +vt 0.375000 0.312500 0.000000 +vt 0.406250 0.312500 0.000000 +vt 0.437500 0.312500 0.000000 +vt 0.468750 0.312500 0.000000 +vt 0.500000 0.312500 0.000000 +vt 0.531250 0.312500 0.000000 +vt 0.562500 0.312500 0.000000 +vt 0.593750 0.312500 0.000000 +vt 0.625000 0.312500 0.000000 +vt 0.656250 0.312500 0.000000 +vt 0.687500 0.312500 0.000000 +vt 0.718750 0.312500 0.000000 +vt 0.750000 0.312500 0.000000 +vt 0.781250 0.312500 0.000000 +vt 0.812500 0.312500 0.000000 +vt 0.843750 0.312500 0.000000 +vt 0.875000 0.312500 0.000000 +vt 0.906250 0.312500 0.000000 +vt 0.937500 0.312500 0.000000 +vt 0.968750 0.312500 0.000000 +vt 1.000000 0.312500 0.000000 +vt 0.000000 0.250000 0.000000 +vt 0.031250 0.250000 0.000000 +vt 0.062500 0.250000 0.000000 +vt 0.093750 0.250000 0.000000 +vt 0.125000 0.250000 0.000000 +vt 0.156250 0.250000 0.000000 +vt 0.187500 0.250000 0.000000 +vt 0.218750 0.250000 0.000000 +vt 0.250000 0.250000 0.000000 +vt 0.281250 0.250000 0.000000 +vt 0.312500 0.250000 0.000000 +vt 0.343750 0.250000 0.000000 +vt 0.375000 0.250000 0.000000 +vt 0.406250 0.250000 0.000000 +vt 0.437500 0.250000 0.000000 +vt 0.468750 0.250000 0.000000 +vt 0.500000 0.250000 0.000000 +vt 0.531250 0.250000 0.000000 +vt 0.562500 0.250000 0.000000 +vt 0.593750 0.250000 0.000000 +vt 0.625000 0.250000 0.000000 +vt 0.656250 0.250000 0.000000 +vt 0.687500 0.250000 0.000000 +vt 0.718750 0.250000 0.000000 +vt 0.750000 0.250000 0.000000 +vt 0.781250 0.250000 0.000000 +vt 0.812500 0.250000 0.000000 +vt 0.843750 0.250000 0.000000 +vt 0.875000 0.250000 0.000000 +vt 0.906250 0.250000 0.000000 +vt 0.937500 0.250000 0.000000 +vt 0.968750 0.250000 0.000000 +vt 1.000000 0.250000 0.000000 +vt 0.000000 0.187500 0.000000 +vt 0.031250 0.187500 0.000000 +vt 0.062500 0.187500 0.000000 +vt 0.093750 0.187500 0.000000 +vt 0.125000 0.187500 0.000000 +vt 0.156250 0.187500 0.000000 +vt 0.187500 0.187500 0.000000 +vt 0.218750 0.187500 0.000000 +vt 0.250000 0.187500 0.000000 +vt 0.281250 0.187500 0.000000 +vt 0.312500 0.187500 0.000000 +vt 0.343750 0.187500 0.000000 +vt 0.375000 0.187500 0.000000 +vt 0.406250 0.187500 0.000000 +vt 0.437500 0.187500 0.000000 +vt 0.468750 0.187500 0.000000 +vt 0.500000 0.187500 0.000000 +vt 0.531250 0.187500 0.000000 +vt 0.562500 0.187500 0.000000 +vt 0.593750 0.187500 0.000000 +vt 0.625000 0.187500 0.000000 +vt 0.656250 0.187500 0.000000 +vt 0.687500 0.187500 0.000000 +vt 0.718750 0.187500 0.000000 +vt 0.750000 0.187500 0.000000 +vt 0.781250 0.187500 0.000000 +vt 0.812500 0.187500 0.000000 +vt 0.843750 0.187500 0.000000 +vt 0.875000 0.187500 0.000000 +vt 0.906250 0.187500 0.000000 +vt 0.937500 0.187500 0.000000 +vt 0.968750 0.187500 0.000000 +vt 1.000000 0.187500 0.000000 +vt 0.000000 0.125000 0.000000 +vt 0.031250 0.125000 0.000000 +vt 0.062500 0.125000 0.000000 +vt 0.093750 0.125000 0.000000 +vt 0.125000 0.125000 0.000000 +vt 0.156250 0.125000 0.000000 +vt 0.187500 0.125000 0.000000 +vt 0.218750 0.125000 0.000000 +vt 0.250000 0.125000 0.000000 +vt 0.281250 0.125000 0.000000 +vt 0.312500 0.125000 0.000000 +vt 0.343750 0.125000 0.000000 +vt 0.375000 0.125000 0.000000 +vt 0.406250 0.125000 0.000000 +vt 0.437500 0.125000 0.000000 +vt 0.468750 0.125000 0.000000 +vt 0.500000 0.125000 0.000000 +vt 0.531250 0.125000 0.000000 +vt 0.562500 0.125000 0.000000 +vt 0.593750 0.125000 0.000000 +vt 0.625000 0.125000 0.000000 +vt 0.656250 0.125000 0.000000 +vt 0.687500 0.125000 0.000000 +vt 0.718750 0.125000 0.000000 +vt 0.750000 0.125000 0.000000 +vt 0.781250 0.125000 0.000000 +vt 0.812500 0.125000 0.000000 +vt 0.843750 0.125000 0.000000 +vt 0.875000 0.125000 0.000000 +vt 0.906250 0.125000 0.000000 +vt 0.937500 0.125000 0.000000 +vt 0.968750 0.125000 0.000000 +vt 1.000000 0.125000 0.000000 +vt 0.000000 0.062500 0.000000 +vt 0.031250 0.062500 0.000000 +vt 0.062500 0.062500 0.000000 +vt 0.093750 0.062500 0.000000 +vt 0.125000 0.062500 0.000000 +vt 0.156250 0.062500 0.000000 +vt 0.187500 0.062500 0.000000 +vt 0.218750 0.062500 0.000000 +vt 0.250000 0.062500 0.000000 +vt 0.281250 0.062500 0.000000 +vt 0.312500 0.062500 0.000000 +vt 0.343750 0.062500 0.000000 +vt 0.375000 0.062500 0.000000 +vt 0.406250 0.062500 0.000000 +vt 0.437500 0.062500 0.000000 +vt 0.468750 0.062500 0.000000 +vt 0.500000 0.062500 0.000000 +vt 0.531250 0.062500 0.000000 +vt 0.562500 0.062500 0.000000 +vt 0.593750 0.062500 0.000000 +vt 0.625000 0.062500 0.000000 +vt 0.656250 0.062500 0.000000 +vt 0.687500 0.062500 0.000000 +vt 0.718750 0.062500 0.000000 +vt 0.750000 0.062500 0.000000 +vt 0.781250 0.062500 0.000000 +vt 0.812500 0.062500 0.000000 +vt 0.843750 0.062500 0.000000 +vt 0.875000 0.062500 0.000000 +vt 0.906250 0.062500 0.000000 +vt 0.937500 0.062500 0.000000 +vt 0.968750 0.062500 0.000000 +vt 1.000000 0.062500 0.000000 +vt 0.000000 -0.000000 0.000000 +vt 0.031250 -0.000000 0.000000 +vt 0.062500 -0.000000 0.000000 +vt 0.093750 -0.000000 0.000000 +vt 0.125000 -0.000000 0.000000 +vt 0.156250 -0.000000 0.000000 +vt 0.187500 -0.000000 0.000000 +vt 0.218750 -0.000000 0.000000 +vt 0.250000 -0.000000 0.000000 +vt 0.281250 -0.000000 0.000000 +vt 0.312500 -0.000000 0.000000 +vt 0.343750 -0.000000 0.000000 +vt 0.375000 -0.000000 0.000000 +vt 0.406250 -0.000000 0.000000 +vt 0.437500 -0.000000 0.000000 +vt 0.468750 -0.000000 0.000000 +vt 0.500000 -0.000000 0.000000 +vt 0.531250 -0.000000 0.000000 +vt 0.562500 -0.000000 0.000000 +vt 0.593750 -0.000000 0.000000 +vt 0.625000 -0.000000 0.000000 +vt 0.656250 -0.000000 0.000000 +vt 0.687500 -0.000000 0.000000 +vt 0.718750 -0.000000 0.000000 +vt 0.750000 -0.000000 0.000000 +vt 0.781250 -0.000000 0.000000 +vt 0.812500 -0.000000 0.000000 +vt 0.843750 -0.000000 0.000000 +vt 0.875000 -0.000000 0.000000 +vt 0.906250 -0.000000 0.000000 +vt 0.937500 -0.000000 0.000000 +vt 0.968750 -0.000000 0.000000 +# 559 texture coords + +g Sphere005 +usemtl wire_255255255 +f -480/-557 -481/-558 -482/-559 +f -479/-555 -480/-557 -482/-556 +f -478/-553 -479/-555 -482/-554 +f -477/-551 -478/-553 -482/-552 +f -476/-549 -477/-551 -482/-550 +f -475/-547 -476/-549 -482/-548 +f -474/-545 -475/-547 -482/-546 +f -473/-543 -474/-545 -482/-544 +f -472/-541 -473/-543 -482/-542 +f -471/-539 -472/-541 -482/-540 +f -470/-537 -471/-539 -482/-538 +f -469/-535 -470/-537 -482/-536 +f -468/-533 -469/-535 -482/-534 +f -467/-531 -468/-533 -482/-532 +f -466/-529 -467/-531 -482/-530 +f -465/-527 -466/-529 -482/-528 +f -464/-525 -465/-527 -482/-526 +f -463/-523 -464/-525 -482/-524 +f -462/-521 -463/-523 -482/-522 +f -461/-519 -462/-521 -482/-520 +f -460/-517 -461/-519 -482/-518 +f -459/-515 -460/-517 -482/-516 +f -458/-513 -459/-515 -482/-514 +f -457/-511 -458/-513 -482/-512 +f -456/-509 -457/-511 -482/-510 +f -455/-507 -456/-509 -482/-508 +f -454/-505 -455/-507 -482/-506 +f -453/-503 -454/-505 -482/-504 +f -452/-501 -453/-503 -482/-502 +f -451/-499 -452/-501 -482/-500 +f -450/-497 -451/-499 -482/-498 +f -481/-495 -450/-497 -482/-496 +f -480/-557 -448/-493 -449/-494 -481/-558 +f -479/-555 -447/-492 -448/-493 -480/-557 +f -478/-553 -446/-491 -447/-492 -479/-555 +f -477/-551 -445/-490 -446/-491 -478/-553 +f -476/-549 -444/-489 -445/-490 -477/-551 +f -475/-547 -443/-488 -444/-489 -476/-549 +f -474/-545 -442/-487 -443/-488 -475/-547 +f -473/-543 -441/-486 -442/-487 -474/-545 +f -472/-541 -440/-485 -441/-486 -473/-543 +f -471/-539 -439/-484 -440/-485 -472/-541 +f -470/-537 -438/-483 -439/-484 -471/-539 +f -469/-535 -437/-482 -438/-483 -470/-537 +f -468/-533 -436/-481 -437/-482 -469/-535 +f -467/-531 -435/-480 -436/-481 -468/-533 +f -466/-529 -434/-479 -435/-480 -467/-531 +f -465/-527 -433/-478 -434/-479 -466/-529 +f -464/-525 -432/-477 -433/-478 -465/-527 +f -463/-523 -431/-476 -432/-477 -464/-525 +f -462/-521 -430/-475 -431/-476 -463/-523 +f -461/-519 -429/-474 -430/-475 -462/-521 +f -460/-517 -428/-473 -429/-474 -461/-519 +f -459/-515 -427/-472 -428/-473 -460/-517 +f -458/-513 -426/-471 -427/-472 -459/-515 +f -457/-511 -425/-470 -426/-471 -458/-513 +f -456/-509 -424/-469 -425/-470 -457/-511 +f -455/-507 -423/-468 -424/-469 -456/-509 +f -454/-505 -422/-467 -423/-468 -455/-507 +f -453/-503 -421/-466 -422/-467 -454/-505 +f -452/-501 -420/-465 -421/-466 -453/-503 +f -451/-499 -419/-464 -420/-465 -452/-501 +f -450/-497 -418/-463 -419/-464 -451/-499 +f -481/-495 -449/-462 -418/-463 -450/-497 +f -448/-493 -416/-460 -417/-461 -449/-494 +f -447/-492 -415/-459 -416/-460 -448/-493 +f -446/-491 -414/-458 -415/-459 -447/-492 +f -445/-490 -413/-457 -414/-458 -446/-491 +f -444/-489 -412/-456 -413/-457 -445/-490 +f -443/-488 -411/-455 -412/-456 -444/-489 +f -442/-487 -410/-454 -411/-455 -443/-488 +f -441/-486 -409/-453 -410/-454 -442/-487 +f -440/-485 -408/-452 -409/-453 -441/-486 +f -439/-484 -407/-451 -408/-452 -440/-485 +f -438/-483 -406/-450 -407/-451 -439/-484 +f -437/-482 -405/-449 -406/-450 -438/-483 +f -436/-481 -404/-448 -405/-449 -437/-482 +f -435/-480 -403/-447 -404/-448 -436/-481 +f -434/-479 -402/-446 -403/-447 -435/-480 +f -433/-478 -401/-445 -402/-446 -434/-479 +f -432/-477 -400/-444 -401/-445 -433/-478 +f -431/-476 -399/-443 -400/-444 -432/-477 +f -430/-475 -398/-442 -399/-443 -431/-476 +f -429/-474 -397/-441 -398/-442 -430/-475 +f -428/-473 -396/-440 -397/-441 -429/-474 +f -427/-472 -395/-439 -396/-440 -428/-473 +f -426/-471 -394/-438 -395/-439 -427/-472 +f -425/-470 -393/-437 -394/-438 -426/-471 +f -424/-469 -392/-436 -393/-437 -425/-470 +f -423/-468 -391/-435 -392/-436 -424/-469 +f -422/-467 -390/-434 -391/-435 -423/-468 +f -421/-466 -389/-433 -390/-434 -422/-467 +f -420/-465 -388/-432 -389/-433 -421/-466 +f -419/-464 -387/-431 -388/-432 -420/-465 +f -418/-463 -386/-430 -387/-431 -419/-464 +f -449/-462 -417/-429 -386/-430 -418/-463 +f -416/-460 -384/-427 -385/-428 -417/-461 +f -415/-459 -383/-426 -384/-427 -416/-460 +f -414/-458 -382/-425 -383/-426 -415/-459 +f -413/-457 -381/-424 -382/-425 -414/-458 +f -412/-456 -380/-423 -381/-424 -413/-457 +f -411/-455 -379/-422 -380/-423 -412/-456 +f -410/-454 -378/-421 -379/-422 -411/-455 +f -409/-453 -377/-420 -378/-421 -410/-454 +f -408/-452 -376/-419 -377/-420 -409/-453 +f -407/-451 -375/-418 -376/-419 -408/-452 +f -406/-450 -374/-417 -375/-418 -407/-451 +f -405/-449 -373/-416 -374/-417 -406/-450 +f -404/-448 -372/-415 -373/-416 -405/-449 +f -403/-447 -371/-414 -372/-415 -404/-448 +f -402/-446 -370/-413 -371/-414 -403/-447 +f -401/-445 -369/-412 -370/-413 -402/-446 +f -400/-444 -368/-411 -369/-412 -401/-445 +f -399/-443 -367/-410 -368/-411 -400/-444 +f -398/-442 -366/-409 -367/-410 -399/-443 +f -397/-441 -365/-408 -366/-409 -398/-442 +f -396/-440 -364/-407 -365/-408 -397/-441 +f -395/-439 -363/-406 -364/-407 -396/-440 +f -394/-438 -362/-405 -363/-406 -395/-439 +f -393/-437 -361/-404 -362/-405 -394/-438 +f -392/-436 -360/-403 -361/-404 -393/-437 +f -391/-435 -359/-402 -360/-403 -392/-436 +f -390/-434 -358/-401 -359/-402 -391/-435 +f -389/-433 -357/-400 -358/-401 -390/-434 +f -388/-432 -356/-399 -357/-400 -389/-433 +f -387/-431 -355/-398 -356/-399 -388/-432 +f -386/-430 -354/-397 -355/-398 -387/-431 +f -417/-429 -385/-396 -354/-397 -386/-430 +f -384/-427 -352/-394 -353/-395 -385/-428 +f -383/-426 -351/-393 -352/-394 -384/-427 +f -382/-425 -350/-392 -351/-393 -383/-426 +f -381/-424 -349/-391 -350/-392 -382/-425 +f -380/-423 -348/-390 -349/-391 -381/-424 +f -379/-422 -347/-389 -348/-390 -380/-423 +f -378/-421 -346/-388 -347/-389 -379/-422 +f -377/-420 -345/-387 -346/-388 -378/-421 +f -376/-419 -344/-386 -345/-387 -377/-420 +f -375/-418 -343/-385 -344/-386 -376/-419 +f -374/-417 -342/-384 -343/-385 -375/-418 +f -373/-416 -341/-383 -342/-384 -374/-417 +f -372/-415 -340/-382 -341/-383 -373/-416 +f -371/-414 -339/-381 -340/-382 -372/-415 +f -370/-413 -338/-380 -339/-381 -371/-414 +f -369/-412 -337/-379 -338/-380 -370/-413 +f -368/-411 -336/-378 -337/-379 -369/-412 +f -367/-410 -335/-377 -336/-378 -368/-411 +f -366/-409 -334/-376 -335/-377 -367/-410 +f -365/-408 -333/-375 -334/-376 -366/-409 +f -364/-407 -332/-374 -333/-375 -365/-408 +f -363/-406 -331/-373 -332/-374 -364/-407 +f -362/-405 -330/-372 -331/-373 -363/-406 +f -361/-404 -329/-371 -330/-372 -362/-405 +f -360/-403 -328/-370 -329/-371 -361/-404 +f -359/-402 -327/-369 -328/-370 -360/-403 +f -358/-401 -326/-368 -327/-369 -359/-402 +f -357/-400 -325/-367 -326/-368 -358/-401 +f -356/-399 -324/-366 -325/-367 -357/-400 +f -355/-398 -323/-365 -324/-366 -356/-399 +f -354/-397 -322/-364 -323/-365 -355/-398 +f -385/-396 -353/-363 -322/-364 -354/-397 +f -352/-394 -320/-361 -321/-362 -353/-395 +f -351/-393 -319/-360 -320/-361 -352/-394 +f -350/-392 -318/-359 -319/-360 -351/-393 +f -349/-391 -317/-358 -318/-359 -350/-392 +f -348/-390 -316/-357 -317/-358 -349/-391 +f -347/-389 -315/-356 -316/-357 -348/-390 +f -346/-388 -314/-355 -315/-356 -347/-389 +f -345/-387 -313/-354 -314/-355 -346/-388 +f -344/-386 -312/-353 -313/-354 -345/-387 +f -343/-385 -311/-352 -312/-353 -344/-386 +f -342/-384 -310/-351 -311/-352 -343/-385 +f -341/-383 -309/-350 -310/-351 -342/-384 +f -340/-382 -308/-349 -309/-350 -341/-383 +f -339/-381 -307/-348 -308/-349 -340/-382 +f -338/-380 -306/-347 -307/-348 -339/-381 +f -337/-379 -305/-346 -306/-347 -338/-380 +f -336/-378 -304/-345 -305/-346 -337/-379 +f -335/-377 -303/-344 -304/-345 -336/-378 +f -334/-376 -302/-343 -303/-344 -335/-377 +f -333/-375 -301/-342 -302/-343 -334/-376 +f -332/-374 -300/-341 -301/-342 -333/-375 +f -331/-373 -299/-340 -300/-341 -332/-374 +f -330/-372 -298/-339 -299/-340 -331/-373 +f -329/-371 -297/-338 -298/-339 -330/-372 +f -328/-370 -296/-337 -297/-338 -329/-371 +f -327/-369 -295/-336 -296/-337 -328/-370 +f -326/-368 -294/-335 -295/-336 -327/-369 +f -325/-367 -293/-334 -294/-335 -326/-368 +f -324/-366 -292/-333 -293/-334 -325/-367 +f -323/-365 -291/-332 -292/-333 -324/-366 +f -322/-364 -290/-331 -291/-332 -323/-365 +f -353/-363 -321/-330 -290/-331 -322/-364 +f -320/-361 -288/-328 -289/-329 -321/-362 +f -319/-360 -287/-327 -288/-328 -320/-361 +f -318/-359 -286/-326 -287/-327 -319/-360 +f -317/-358 -285/-325 -286/-326 -318/-359 +f -316/-357 -284/-324 -285/-325 -317/-358 +f -315/-356 -283/-323 -284/-324 -316/-357 +f -314/-355 -282/-322 -283/-323 -315/-356 +f -313/-354 -281/-321 -282/-322 -314/-355 +f -312/-353 -280/-320 -281/-321 -313/-354 +f -311/-352 -279/-319 -280/-320 -312/-353 +f -310/-351 -278/-318 -279/-319 -311/-352 +f -309/-350 -277/-317 -278/-318 -310/-351 +f -308/-349 -276/-316 -277/-317 -309/-350 +f -307/-348 -275/-315 -276/-316 -308/-349 +f -306/-347 -274/-314 -275/-315 -307/-348 +f -305/-346 -273/-313 -274/-314 -306/-347 +f -304/-345 -272/-312 -273/-313 -305/-346 +f -303/-344 -271/-311 -272/-312 -304/-345 +f -302/-343 -270/-310 -271/-311 -303/-344 +f -301/-342 -269/-309 -270/-310 -302/-343 +f -300/-341 -268/-308 -269/-309 -301/-342 +f -299/-340 -267/-307 -268/-308 -300/-341 +f -298/-339 -266/-306 -267/-307 -299/-340 +f -297/-338 -265/-305 -266/-306 -298/-339 +f -296/-337 -264/-304 -265/-305 -297/-338 +f -295/-336 -263/-303 -264/-304 -296/-337 +f -294/-335 -262/-302 -263/-303 -295/-336 +f -293/-334 -261/-301 -262/-302 -294/-335 +f -292/-333 -260/-300 -261/-301 -293/-334 +f -291/-332 -259/-299 -260/-300 -292/-333 +f -290/-331 -258/-298 -259/-299 -291/-332 +f -321/-330 -289/-297 -258/-298 -290/-331 +f -288/-328 -256/-295 -257/-296 -289/-329 +f -287/-327 -255/-294 -256/-295 -288/-328 +f -286/-326 -254/-293 -255/-294 -287/-327 +f -285/-325 -253/-292 -254/-293 -286/-326 +f -284/-324 -252/-291 -253/-292 -285/-325 +f -283/-323 -251/-290 -252/-291 -284/-324 +f -282/-322 -250/-289 -251/-290 -283/-323 +f -281/-321 -249/-288 -250/-289 -282/-322 +f -280/-320 -248/-287 -249/-288 -281/-321 +f -279/-319 -247/-286 -248/-287 -280/-320 +f -278/-318 -246/-285 -247/-286 -279/-319 +f -277/-317 -245/-284 -246/-285 -278/-318 +f -276/-316 -244/-283 -245/-284 -277/-317 +f -275/-315 -243/-282 -244/-283 -276/-316 +f -274/-314 -242/-281 -243/-282 -275/-315 +f -273/-313 -241/-280 -242/-281 -274/-314 +f -272/-312 -240/-279 -241/-280 -273/-313 +f -271/-311 -239/-278 -240/-279 -272/-312 +f -270/-310 -238/-277 -239/-278 -271/-311 +f -269/-309 -237/-276 -238/-277 -270/-310 +f -268/-308 -236/-275 -237/-276 -269/-309 +f -267/-307 -235/-274 -236/-275 -268/-308 +f -266/-306 -234/-273 -235/-274 -267/-307 +f -265/-305 -233/-272 -234/-273 -266/-306 +f -264/-304 -232/-271 -233/-272 -265/-305 +f -263/-303 -231/-270 -232/-271 -264/-304 +f -262/-302 -230/-269 -231/-270 -263/-303 +f -261/-301 -229/-268 -230/-269 -262/-302 +f -260/-300 -228/-267 -229/-268 -261/-301 +f -259/-299 -227/-266 -228/-267 -260/-300 +f -258/-298 -226/-265 -227/-266 -259/-299 +f -289/-297 -257/-264 -226/-265 -258/-298 +f -256/-295 -224/-262 -225/-263 -257/-296 +f -255/-294 -223/-261 -224/-262 -256/-295 +f -254/-293 -222/-260 -223/-261 -255/-294 +f -253/-292 -221/-259 -222/-260 -254/-293 +f -252/-291 -220/-258 -221/-259 -253/-292 +f -251/-290 -219/-257 -220/-258 -252/-291 +f -250/-289 -218/-256 -219/-257 -251/-290 +f -249/-288 -217/-255 -218/-256 -250/-289 +f -248/-287 -216/-254 -217/-255 -249/-288 +f -247/-286 -215/-253 -216/-254 -248/-287 +f -246/-285 -214/-252 -215/-253 -247/-286 +f -245/-284 -213/-251 -214/-252 -246/-285 +f -244/-283 -212/-250 -213/-251 -245/-284 +f -243/-282 -211/-249 -212/-250 -244/-283 +f -242/-281 -210/-248 -211/-249 -243/-282 +f -241/-280 -209/-247 -210/-248 -242/-281 +f -240/-279 -208/-246 -209/-247 -241/-280 +f -239/-278 -207/-245 -208/-246 -240/-279 +f -238/-277 -206/-244 -207/-245 -239/-278 +f -237/-276 -205/-243 -206/-244 -238/-277 +f -236/-275 -204/-242 -205/-243 -237/-276 +f -235/-274 -203/-241 -204/-242 -236/-275 +f -234/-273 -202/-240 -203/-241 -235/-274 +f -233/-272 -201/-239 -202/-240 -234/-273 +f -232/-271 -200/-238 -201/-239 -233/-272 +f -231/-270 -199/-237 -200/-238 -232/-271 +f -230/-269 -198/-236 -199/-237 -231/-270 +f -229/-268 -197/-235 -198/-236 -230/-269 +f -228/-267 -196/-234 -197/-235 -229/-268 +f -227/-266 -195/-233 -196/-234 -228/-267 +f -226/-265 -194/-232 -195/-233 -227/-266 +f -257/-264 -225/-231 -194/-232 -226/-265 +f -224/-262 -192/-229 -193/-230 -225/-263 +f -223/-261 -191/-228 -192/-229 -224/-262 +f -222/-260 -190/-227 -191/-228 -223/-261 +f -221/-259 -189/-226 -190/-227 -222/-260 +f -220/-258 -188/-225 -189/-226 -221/-259 +f -219/-257 -187/-224 -188/-225 -220/-258 +f -218/-256 -186/-223 -187/-224 -219/-257 +f -217/-255 -185/-222 -186/-223 -218/-256 +f -216/-254 -184/-221 -185/-222 -217/-255 +f -215/-253 -183/-220 -184/-221 -216/-254 +f -214/-252 -182/-219 -183/-220 -215/-253 +f -213/-251 -181/-218 -182/-219 -214/-252 +f -212/-250 -180/-217 -181/-218 -213/-251 +f -211/-249 -179/-216 -180/-217 -212/-250 +f -210/-248 -178/-215 -179/-216 -211/-249 +f -209/-247 -177/-214 -178/-215 -210/-248 +f -208/-246 -176/-213 -177/-214 -209/-247 +f -207/-245 -175/-212 -176/-213 -208/-246 +f -206/-244 -174/-211 -175/-212 -207/-245 +f -205/-243 -173/-210 -174/-211 -206/-244 +f -204/-242 -172/-209 -173/-210 -205/-243 +f -203/-241 -171/-208 -172/-209 -204/-242 +f -202/-240 -170/-207 -171/-208 -203/-241 +f -201/-239 -169/-206 -170/-207 -202/-240 +f -200/-238 -168/-205 -169/-206 -201/-239 +f -199/-237 -167/-204 -168/-205 -200/-238 +f -198/-236 -166/-203 -167/-204 -199/-237 +f -197/-235 -165/-202 -166/-203 -198/-236 +f -196/-234 -164/-201 -165/-202 -197/-235 +f -195/-233 -163/-200 -164/-201 -196/-234 +f -194/-232 -162/-199 -163/-200 -195/-233 +f -225/-231 -193/-198 -162/-199 -194/-232 +f -192/-229 -160/-196 -161/-197 -193/-230 +f -191/-228 -159/-195 -160/-196 -192/-229 +f -190/-227 -158/-194 -159/-195 -191/-228 +f -189/-226 -157/-193 -158/-194 -190/-227 +f -188/-225 -156/-192 -157/-193 -189/-226 +f -187/-224 -155/-191 -156/-192 -188/-225 +f -186/-223 -154/-190 -155/-191 -187/-224 +f -185/-222 -153/-189 -154/-190 -186/-223 +f -184/-221 -152/-188 -153/-189 -185/-222 +f -183/-220 -151/-187 -152/-188 -184/-221 +f -182/-219 -150/-186 -151/-187 -183/-220 +f -181/-218 -149/-185 -150/-186 -182/-219 +f -180/-217 -148/-184 -149/-185 -181/-218 +f -179/-216 -147/-183 -148/-184 -180/-217 +f -178/-215 -146/-182 -147/-183 -179/-216 +f -177/-214 -145/-181 -146/-182 -178/-215 +f -176/-213 -144/-180 -145/-181 -177/-214 +f -175/-212 -143/-179 -144/-180 -176/-213 +f -174/-211 -142/-178 -143/-179 -175/-212 +f -173/-210 -141/-177 -142/-178 -174/-211 +f -172/-209 -140/-176 -141/-177 -173/-210 +f -171/-208 -139/-175 -140/-176 -172/-209 +f -170/-207 -138/-174 -139/-175 -171/-208 +f -169/-206 -137/-173 -138/-174 -170/-207 +f -168/-205 -136/-172 -137/-173 -169/-206 +f -167/-204 -135/-171 -136/-172 -168/-205 +f -166/-203 -134/-170 -135/-171 -167/-204 +f -165/-202 -133/-169 -134/-170 -166/-203 +f -164/-201 -132/-168 -133/-169 -165/-202 +f -163/-200 -131/-167 -132/-168 -164/-201 +f -162/-199 -130/-166 -131/-167 -163/-200 +f -193/-198 -161/-165 -130/-166 -162/-199 +f -160/-196 -128/-163 -129/-164 -161/-197 +f -159/-195 -127/-162 -128/-163 -160/-196 +f -158/-194 -126/-161 -127/-162 -159/-195 +f -157/-193 -125/-160 -126/-161 -158/-194 +f -156/-192 -124/-159 -125/-160 -157/-193 +f -155/-191 -123/-158 -124/-159 -156/-192 +f -154/-190 -122/-157 -123/-158 -155/-191 +f -153/-189 -121/-156 -122/-157 -154/-190 +f -152/-188 -120/-155 -121/-156 -153/-189 +f -151/-187 -119/-154 -120/-155 -152/-188 +f -150/-186 -118/-153 -119/-154 -151/-187 +f -149/-185 -117/-152 -118/-153 -150/-186 +f -148/-184 -116/-151 -117/-152 -149/-185 +f -147/-183 -115/-150 -116/-151 -148/-184 +f -146/-182 -114/-149 -115/-150 -147/-183 +f -145/-181 -113/-148 -114/-149 -146/-182 +f -144/-180 -112/-147 -113/-148 -145/-181 +f -143/-179 -111/-146 -112/-147 -144/-180 +f -142/-178 -110/-145 -111/-146 -143/-179 +f -141/-177 -109/-144 -110/-145 -142/-178 +f -140/-176 -108/-143 -109/-144 -141/-177 +f -139/-175 -107/-142 -108/-143 -140/-176 +f -138/-174 -106/-141 -107/-142 -139/-175 +f -137/-173 -105/-140 -106/-141 -138/-174 +f -136/-172 -104/-139 -105/-140 -137/-173 +f -135/-171 -103/-138 -104/-139 -136/-172 +f -134/-170 -102/-137 -103/-138 -135/-171 +f -133/-169 -101/-136 -102/-137 -134/-170 +f -132/-168 -100/-135 -101/-136 -133/-169 +f -131/-167 -99/-134 -100/-135 -132/-168 +f -130/-166 -98/-133 -99/-134 -131/-167 +f -161/-165 -129/-132 -98/-133 -130/-166 +f -128/-163 -96/-130 -97/-131 -129/-164 +f -127/-162 -95/-129 -96/-130 -128/-163 +f -126/-161 -94/-128 -95/-129 -127/-162 +f -125/-160 -93/-127 -94/-128 -126/-161 +f -124/-159 -92/-126 -93/-127 -125/-160 +f -123/-158 -91/-125 -92/-126 -124/-159 +f -122/-157 -90/-124 -91/-125 -123/-158 +f -121/-156 -89/-123 -90/-124 -122/-157 +f -120/-155 -88/-122 -89/-123 -121/-156 +f -119/-154 -87/-121 -88/-122 -120/-155 +f -118/-153 -86/-120 -87/-121 -119/-154 +f -117/-152 -85/-119 -86/-120 -118/-153 +f -116/-151 -84/-118 -85/-119 -117/-152 +f -115/-150 -83/-117 -84/-118 -116/-151 +f -114/-149 -82/-116 -83/-117 -115/-150 +f -113/-148 -81/-115 -82/-116 -114/-149 +f -112/-147 -80/-114 -81/-115 -113/-148 +f -111/-146 -79/-113 -80/-114 -112/-147 +f -110/-145 -78/-112 -79/-113 -111/-146 +f -109/-144 -77/-111 -78/-112 -110/-145 +f -108/-143 -76/-110 -77/-111 -109/-144 +f -107/-142 -75/-109 -76/-110 -108/-143 +f -106/-141 -74/-108 -75/-109 -107/-142 +f -105/-140 -73/-107 -74/-108 -106/-141 +f -104/-139 -72/-106 -73/-107 -105/-140 +f -103/-138 -71/-105 -72/-106 -104/-139 +f -102/-137 -70/-104 -71/-105 -103/-138 +f -101/-136 -69/-103 -70/-104 -102/-137 +f -100/-135 -68/-102 -69/-103 -101/-136 +f -99/-134 -67/-101 -68/-102 -100/-135 +f -98/-133 -66/-100 -67/-101 -99/-134 +f -129/-132 -97/-99 -66/-100 -98/-133 +f -96/-130 -64/-97 -65/-98 -97/-131 +f -95/-129 -63/-96 -64/-97 -96/-130 +f -94/-128 -62/-95 -63/-96 -95/-129 +f -93/-127 -61/-94 -62/-95 -94/-128 +f -92/-126 -60/-93 -61/-94 -93/-127 +f -91/-125 -59/-92 -60/-93 -92/-126 +f -90/-124 -58/-91 -59/-92 -91/-125 +f -89/-123 -57/-90 -58/-91 -90/-124 +f -88/-122 -56/-89 -57/-90 -89/-123 +f -87/-121 -55/-88 -56/-89 -88/-122 +f -86/-120 -54/-87 -55/-88 -87/-121 +f -85/-119 -53/-86 -54/-87 -86/-120 +f -84/-118 -52/-85 -53/-86 -85/-119 +f -83/-117 -51/-84 -52/-85 -84/-118 +f -82/-116 -50/-83 -51/-84 -83/-117 +f -81/-115 -49/-82 -50/-83 -82/-116 +f -80/-114 -48/-81 -49/-82 -81/-115 +f -79/-113 -47/-80 -48/-81 -80/-114 +f -78/-112 -46/-79 -47/-80 -79/-113 +f -77/-111 -45/-78 -46/-79 -78/-112 +f -76/-110 -44/-77 -45/-78 -77/-111 +f -75/-109 -43/-76 -44/-77 -76/-110 +f -74/-108 -42/-75 -43/-76 -75/-109 +f -73/-107 -41/-74 -42/-75 -74/-108 +f -72/-106 -40/-73 -41/-74 -73/-107 +f -71/-105 -39/-72 -40/-73 -72/-106 +f -70/-104 -38/-71 -39/-72 -71/-105 +f -69/-103 -37/-70 -38/-71 -70/-104 +f -68/-102 -36/-69 -37/-70 -69/-103 +f -67/-101 -35/-68 -36/-69 -68/-102 +f -66/-100 -34/-67 -35/-68 -67/-101 +f -97/-99 -65/-66 -34/-67 -66/-100 +f -64/-97 -32/-64 -33/-65 -65/-98 +f -63/-96 -31/-63 -32/-64 -64/-97 +f -62/-95 -30/-62 -31/-63 -63/-96 +f -61/-94 -29/-61 -30/-62 -62/-95 +f -60/-93 -28/-60 -29/-61 -61/-94 +f -59/-92 -27/-59 -28/-60 -60/-93 +f -58/-91 -26/-58 -27/-59 -59/-92 +f -57/-90 -25/-57 -26/-58 -58/-91 +f -56/-89 -24/-56 -25/-57 -57/-90 +f -55/-88 -23/-55 -24/-56 -56/-89 +f -54/-87 -22/-54 -23/-55 -55/-88 +f -53/-86 -21/-53 -22/-54 -54/-87 +f -52/-85 -20/-52 -21/-53 -53/-86 +f -51/-84 -19/-51 -20/-52 -52/-85 +f -50/-83 -18/-50 -19/-51 -51/-84 +f -49/-82 -17/-49 -18/-50 -50/-83 +f -48/-81 -16/-48 -17/-49 -49/-82 +f -47/-80 -15/-47 -16/-48 -48/-81 +f -46/-79 -14/-46 -15/-47 -47/-80 +f -45/-78 -13/-45 -14/-46 -46/-79 +f -44/-77 -12/-44 -13/-45 -45/-78 +f -43/-76 -11/-43 -12/-44 -44/-77 +f -42/-75 -10/-42 -11/-43 -43/-76 +f -41/-74 -9/-41 -10/-42 -42/-75 +f -40/-73 -8/-40 -9/-41 -41/-74 +f -39/-72 -7/-39 -8/-40 -40/-73 +f -38/-71 -6/-38 -7/-39 -39/-72 +f -37/-70 -5/-37 -6/-38 -38/-71 +f -36/-69 -4/-36 -5/-37 -37/-70 +f -35/-68 -3/-35 -4/-36 -36/-69 +f -34/-67 -2/-34 -3/-35 -35/-68 +f -65/-66 -33/-33 -2/-34 -34/-67 +f -33/-65 -32/-64 -1/-32 +f -32/-64 -31/-63 -1/-31 +f -31/-63 -30/-62 -1/-30 +f -30/-62 -29/-61 -1/-29 +f -29/-61 -28/-60 -1/-28 +f -28/-60 -27/-59 -1/-27 +f -27/-59 -26/-58 -1/-26 +f -26/-58 -25/-57 -1/-25 +f -25/-57 -24/-56 -1/-24 +f -24/-56 -23/-55 -1/-23 +f -23/-55 -22/-54 -1/-22 +f -22/-54 -21/-53 -1/-21 +f -21/-53 -20/-52 -1/-20 +f -20/-52 -19/-51 -1/-19 +f -19/-51 -18/-50 -1/-18 +f -18/-50 -17/-49 -1/-17 +f -17/-49 -16/-48 -1/-16 +f -16/-48 -15/-47 -1/-15 +f -15/-47 -14/-46 -1/-14 +f -14/-46 -13/-45 -1/-13 +f -13/-45 -12/-44 -1/-12 +f -12/-44 -11/-43 -1/-11 +f -11/-43 -10/-42 -1/-10 +f -10/-42 -9/-41 -1/-9 +f -9/-41 -8/-40 -1/-8 +f -8/-40 -7/-39 -1/-7 +f -7/-39 -6/-38 -1/-6 +f -6/-38 -5/-37 -1/-5 +f -5/-37 -4/-36 -1/-4 +f -4/-36 -3/-35 -1/-3 +f -3/-35 -2/-34 -1/-2 +f -2/-34 -33/-33 -1/-1 +# 448 polygons - 64 triangles + diff --git a/mesh/simple_cube.obj b/mesh/simple_cube.obj new file mode 100644 index 0000000..a29f5ad --- /dev/null +++ b/mesh/simple_cube.obj @@ -0,0 +1,39 @@ +# cube.obj +# + +o cube + +v 1 1 0 +v 1 1 1 +v 1 0 1 +v 1 0 0 +v 0 1 0 +v 0 1 1 +v 0 0 1 +v 0 0 0 + +vn 1 0 0 +vn -1 0 0 +vn 0 0 -1 +vn 0 0 1 +vn 0 1 0 +vn 0 -1 0 + + +f 1//1 2//1 3//1 +f 1//1 3//1 4//1 + +f 6//2 5//2 7//2 +f 7//2 5//2 8//2 + +f 1//3 4//3 8//3 +f 1//3 8//3 5//3 + +f 2//4 6//4 3//4 +f 3//4 6//4 7//4 + +f 1//5 5//5 2//5 +f 2//5 5//5 6//5 + +f 4//6 3//6 8//6 +f 3//6 7//6 8//6 \ No newline at end of file diff --git a/scenes/cornell.txt b/scenes/cornell.txt index 83ff820..f030b63 100644 --- a/scenes/cornell.txt +++ b/scenes/cornell.txt @@ -52,14 +52,13 @@ EMITTANCE 0 CAMERA RES 800 800 FOVY 45 -ITERATIONS 5000 -DEPTH 8 +ITERATIONS 1000 +DEPTH 14 FILE cornell EYE 0.0 5 10.5 LOOKAT 0 5 0 UP 0 1 0 - // Ceiling light OBJECT 0 cube diff --git a/scenes/cornell_3_sphere.txt b/scenes/cornell_3_sphere.txt new file mode 100644 index 0000000..da45557 --- /dev/null +++ b/scenes/cornell_3_sphere.txt @@ -0,0 +1,161 @@ +// Emissive material (light) +MATERIAL 0 +RGB 1 1 1 +SPECEX 0 +SPECRGB 0 0 0 +REFL 0 +REFR 0 +REFRIOR 0 +EMITTANCE 5 + +// Diffuse white +MATERIAL 1 +RGB .98 .98 .98 +SPECEX 0 +SPECRGB 0 0 0 +REFL 0 +REFR 0 +REFRIOR 0 +EMITTANCE 0 + +// Diffuse red +MATERIAL 2 +RGB .85 .35 .35 +SPECEX 0 +SPECRGB 0 0 0 +REFL 0 +REFR 0 +REFRIOR 0 +EMITTANCE 0 + +// Diffuse green +MATERIAL 3 +RGB .35 .85 .35 +SPECEX 0 +SPECRGB 0 0 0 +REFL 0 +REFR 0 +REFRIOR 0 +EMITTANCE 0 + +// Specular white +MATERIAL 4 +RGB .98 .98 .98 +SPECEX 0 +SPECRGB .98 .98 .98 +REFL 1 +REFR 0 +REFRIOR 0 +EMITTANCE 0 + +// perfect refractive white +MATERIAL 5 +RGB .98 .98 .98 +SPECEX 0 +SPECRGB .98 .98 .98 +REFL 0 +REFR 1 +REFRIOR 1.5 +EMITTANCE 0 + +// glass white +MATERIAL 6 +RGB .98 .98 .98 +SPECEX 0 +SPECRGB .98 .98 .98 +REFL 0.2 +REFR 0.8 +REFRIOR 1.5 +EMITTANCE 0 + +// Camera +CAMERA +RES 800 800 +FOVY 45 +ITERATIONS 5000 +DEPTH 8 +FILE cornell +EYE 0.0 5 10.5 +LOOKAT 0 5 0 +UP 0 1 0 + + +// Ceiling light +OBJECT 0 +cube +material 0 +TRANS 0 10 0 +ROTAT 0 0 0 +SCALE 3 .3 3 + +// Floor +OBJECT 1 +cube +material 1 +TRANS 0 0 0 +ROTAT 0 0 0 +SCALE 10 .01 10 + +// Ceiling +OBJECT 2 +cube +material 1 +TRANS 0 10 0 +ROTAT 0 0 90 +SCALE .01 10 10 + +// Back wall +OBJECT 3 +cube +material 1 +TRANS 0 5 -5 +ROTAT 0 90 0 +SCALE .01 10 10 + +// Left wall +OBJECT 4 +cube +material 2 +TRANS -5 5 0 +ROTAT 0 0 0 +SCALE .01 10 10 + +// Right wall +OBJECT 5 +cube +material 3 +TRANS 5 5 0 +ROTAT 0 0 0 +SCALE .01 10 10 + +// metal Sphere +OBJECT 6 +sphere +material 4 +TRANS -1 4 -1 +ROTAT 0 0 0 +SCALE 2 2 2 + +// glass Sphere +OBJECT 7 +sphere +material 5 +TRANS 3 4 -1 +ROTAT 0 0 0 +SCALE 2 2 2 + +// glass Sphere +OBJECT 8 +sphere +material 6 +TRANS -4 4 -1 +ROTAT 0 0 0 +SCALE 2 2 2 + +// simple cube model +OBJECT 9 +obj_file ../mesh/simple_cube.obj +material 4 +TRANS -1 2 1 +ROTAT 0 1 0 +SCALE 2 2 2 diff --git a/scenes/cornell_different_specular.txt b/scenes/cornell_different_specular.txt new file mode 100644 index 0000000..be55be9 --- /dev/null +++ b/scenes/cornell_different_specular.txt @@ -0,0 +1,191 @@ +// Emissive material (light) +MATERIAL 0 +RGB 1 1 1 +SPECEX 0 +SPECRGB 0 0 0 +REFL 0 +REFR 0 +REFRIOR 0 +EMITTANCE 5 + +// Diffuse white +MATERIAL 1 +RGB .98 .98 .98 +SPECEX 0 +SPECRGB 0 0 0 +REFL 0 +REFR 0 +REFRIOR 0 +EMITTANCE 0 + +// Diffuse red +MATERIAL 2 +RGB .85 .35 .35 +SPECEX 0 +SPECRGB 0 0 0 +REFL 0 +REFR 0 +REFRIOR 0 +EMITTANCE 0 + +// Diffuse green +MATERIAL 3 +RGB .35 .85 .35 +SPECEX 0 +SPECRGB 0 0 0 +REFL 0 +REFR 0 +REFRIOR 0 +EMITTANCE 0 + +// perfect Specular white +MATERIAL 4 +RGB .98 .98 .98 +SPECEX 0 +SPECRGB .98 .98 .98 +REFL 1 +REFR 0 +REFRIOR 0 +EMITTANCE 0 + +// non-perfect Specular white +MATERIAL 5 +RGB .98 .98 .98 +SPECEX 0 +SPECRGB .98 .98 .98 +REFL 0.75 +REFR 0.25 +REFRIOR 1.5 +EMITTANCE 0 + +// non-perfect Specular white +MATERIAL 6 +RGB .98 .98 .98 +SPECEX 0 +SPECRGB .98 .98 .98 +REFL 0.5 +REFR 0.5 +REFRIOR 1.5 +EMITTANCE 0 + +// non-perfect Specular white +MATERIAL 7 +RGB .98 .98 .98 +SPECEX 0 +SPECRGB .98 .98 .98 +REFL 0.25 +REFR 0.75 +REFRIOR 1.5 +EMITTANCE 0 + +// perfect refractive white +MATERIAL 8 +RGB .98 .98 .98 +SPECEX 0 +SPECRGB .98 .98 .98 +REFL 0 +REFR 1 +REFRIOR 1.5 +EMITTANCE 0 + + + +// Camera +CAMERA +RES 800 800 +FOVY 45 +ITERATIONS 5000 +DEPTH 8 +FILE cornell +EYE 0.0 5 10.5 +LOOKAT 0 5 0 +UP 0 1 0 + + +// Ceiling light +OBJECT 0 +cube +material 0 +TRANS 0 10 0 +ROTAT 0 0 0 +SCALE 3 .3 3 + +// Floor +OBJECT 1 +cube +material 1 +TRANS 0 0 0 +ROTAT 0 0 0 +SCALE 10 .01 10 + +// Ceiling +OBJECT 2 +cube +material 1 +TRANS 0 10 0 +ROTAT 0 0 90 +SCALE .01 10 10 + +// Back wall +OBJECT 3 +cube +material 1 +TRANS 0 5 -5 +ROTAT 0 90 0 +SCALE .01 10 10 + +// Left wall +OBJECT 4 +cube +material 2 +TRANS -5 5 0 +ROTAT 0 0 0 +SCALE .01 10 10 + +// Right wall +OBJECT 5 +cube +material 3 +TRANS 5 5 0 +ROTAT 0 0 0 +SCALE .01 10 10 + +// Sphere +OBJECT 6 +sphere +material 4 +TRANS -3 3 0 +ROTAT 0 0 0 +SCALE 1.5 1.5 1.5 + +// Sphere +OBJECT 7 +sphere +material 5 +TRANS -1.5 3 0 +ROTAT 0 0 0 +SCALE 1.5 1.5 1.5 + +// Sphere +OBJECT 8 +sphere +material 6 +TRANS 0 3 0 +ROTAT 0 0 0 +SCALE 1.5 1.5 1.5 + +// Sphere +OBJECT 9 +sphere +material 7 +TRANS 1.5 3 0 +ROTAT 0 0 0 +SCALE 1.5 1.5 1.5 + +// Sphere +OBJECT 10 +sphere +material 8 +TRANS 3 3 0 +ROTAT 0 0 0 +SCALE 1.5 1.5 1.5 \ No newline at end of file diff --git a/scenes/cornell_glass_spec_refra.txt b/scenes/cornell_glass_spec_refra.txt new file mode 100644 index 0000000..4541915 --- /dev/null +++ b/scenes/cornell_glass_spec_refra.txt @@ -0,0 +1,153 @@ +// Emissive material (light) +MATERIAL 0 +RGB 1 1 1 +SPECEX 0 +SPECRGB 0 0 0 +REFL 0 +REFR 0 +REFRIOR 0 +EMITTANCE 5 + +// Diffuse white +MATERIAL 1 +RGB .98 .98 .98 +SPECEX 0 +SPECRGB 0 0 0 +REFL 0 +REFR 0 +REFRIOR 0 +EMITTANCE 0 + +// Diffuse red +MATERIAL 2 +RGB .85 .35 .35 +SPECEX 0 +SPECRGB 0 0 0 +REFL 0 +REFR 0 +REFRIOR 0 +EMITTANCE 0 + +// Diffuse green +MATERIAL 3 +RGB .35 .85 .35 +SPECEX 0 +SPECRGB 0 0 0 +REFL 0 +REFR 0 +REFRIOR 0 +EMITTANCE 0 + +// perfect Specular white +MATERIAL 4 +RGB .98 .98 .98 +SPECEX 0 +SPECRGB .98 .98 .98 +REFL 1 +REFR 0 +REFRIOR 0 +EMITTANCE 0 + +// perfect refractive white +MATERIAL 5 +RGB .98 .98 .98 +SPECEX 0 +SPECRGB .98 .98 .98 +REFL 0 +REFR 1 +REFRIOR 1.5 +EMITTANCE 0 + +// glass white +MATERIAL 6 +RGB .98 .98 .98 +SPECEX 0 +SPECRGB .98 .98 .98 +REFL 0.2 +REFR 0.7 +REFRIOR 1.5 +EMITTANCE 0 + +// Camera +CAMERA +RES 800 800 +FOVY 45 +ITERATIONS 5000 +DEPTH 8 +FILE cornell +EYE 0.0 5 10.5 +LOOKAT 0 5 0 +UP 0 1 0 + + +// Ceiling light +OBJECT 0 +cube +material 0 +TRANS 0 10 0 +ROTAT 0 0 0 +SCALE 3 .3 3 + +// Floor +OBJECT 1 +cube +material 1 +TRANS 0 0 0 +ROTAT 0 0 0 +SCALE 10 .01 10 + +// Ceiling +OBJECT 2 +cube +material 1 +TRANS 0 10 0 +ROTAT 0 0 90 +SCALE .01 10 10 + +// Back wall +OBJECT 3 +cube +material 1 +TRANS 0 5 -5 +ROTAT 0 90 0 +SCALE .01 10 10 + +// Left wall +OBJECT 4 +cube +material 2 +TRANS -5 5 0 +ROTAT 0 0 0 +SCALE .01 10 10 + +// Right wall +OBJECT 5 +cube +material 3 +TRANS 5 5 0 +ROTAT 0 0 0 +SCALE .01 10 10 + +// metal Sphere +OBJECT 6 +sphere +material 4 +TRANS -2 2 0 +ROTAT 0 0 0 +SCALE 2.5 2.5 2.5 + +// perfect refractive Sphere +OBJECT 7 +sphere +material 5 +TRANS 2 2 0 +ROTAT 0 0 0 +SCALE 2.5 2.5 2.5 + +// glass Sphere +OBJECT 8 +sphere +material 6 +TRANS 0 2 2 +ROTAT 0 0 0 +SCALE 2.5 2.5 2.5 \ No newline at end of file diff --git a/scenes/cornell_glass_spec_refra_multilight.txt b/scenes/cornell_glass_spec_refra_multilight.txt new file mode 100644 index 0000000..9ea212c --- /dev/null +++ b/scenes/cornell_glass_spec_refra_multilight.txt @@ -0,0 +1,211 @@ +// Emissive material (light) +MATERIAL 0 +RGB 1 1 1 +SPECEX 0 +SPECRGB 0 0 0 +REFL 0 +REFR 0 +REFRIOR 0 +EMITTANCE 5 + +// Diffuse white +MATERIAL 1 +RGB .98 .98 .98 +SPECEX 0 +SPECRGB 0 0 0 +REFL 0 +REFR 0 +REFRIOR 0 +EMITTANCE 0 + +// Diffuse red +MATERIAL 2 +RGB .85 .35 .35 +SPECEX 0 +SPECRGB 0 0 0 +REFL 0 +REFR 0 +REFRIOR 0 +EMITTANCE 0 + +// Diffuse green +MATERIAL 3 +RGB .35 .85 .35 +SPECEX 0 +SPECRGB 0 0 0 +REFL 0 +REFR 0 +REFRIOR 0 +EMITTANCE 0 + +// perfect Specular white +MATERIAL 4 +RGB .98 .98 .98 +SPECEX 0 +SPECRGB .98 .98 .98 +REFL 1 +REFR 0 +REFRIOR 0 +EMITTANCE 0 + +// perfect refractive white +MATERIAL 5 +RGB .98 .98 .98 +SPECEX 0 +SPECRGB .98 .98 .98 +REFL 0 +REFR 1 +REFRIOR 1.5 +EMITTANCE 0 + +// glass white +MATERIAL 6 +RGB .98 .98 .98 +SPECEX 0 +SPECRGB .98 .98 .98 +REFL 0.3 +REFR 0.3 +REFRIOR 1.5 +EMITTANCE 0 + +// Emissive yellow 1 (light) +MATERIAL 7 +RGB 0.85 0.69 0.27 +SPECEX 0 +SPECRGB 0 0 0 +REFL 0 +REFR 0 +REFRIOR 0 +EMITTANCE 4 + +// Emissive red 2 (light) +MATERIAL 8 +RGB 0.71 0.27 0.20 +SPECEX 0 +SPECRGB 0 0 0 +REFL 0 +REFR 0 +REFRIOR 0 +EMITTANCE 4 + +// Emissive white 3 (light) +MATERIAL 9 +RGB 1 1 1 +SPECEX 0 +SPECRGB 0 0 0 +REFL 0 +REFR 0 +REFRIOR 0 +EMITTANCE 4 + +// Diffuse fushia +MATERIAL 10 +RGB .85 .35 .85 +SPECEX 0 +SPECRGB 0 0 0 +REFL 0 +REFR 0 +REFRIOR 0 +EMITTANCE 0 + +// Camera +CAMERA +RES 800 800 +FOVY 45 +ITERATIONS 10000 +DEPTH 16 +FILE cornell +EYE 0.0 5 10.5 +LOOKAT 0 5 0 +UP 0 1 0 + +// white light +OBJECT 0 +cube +material 9 +TRANS 0 10 2 +ROTAT 0 0 0 +SCALE 2 2 2 + +// Floor +OBJECT 1 +cube +material 1 +TRANS 0 0 0 +ROTAT 0 0 0 +SCALE 10 .01 10 + +// Ceiling +OBJECT 2 +cube +material 1 +TRANS 0 10 0 +ROTAT 0 0 90 +SCALE .01 10 10 + +// Back wall +OBJECT 3 +cube +material 10 +TRANS 0 5 -5 +ROTAT 0 90 0 +SCALE .01 10 10 + +// Left wall +OBJECT 4 +cube +material 2 +TRANS -5 5 0 +ROTAT 0 0 0 +SCALE .01 10 10 + +// Right wall +OBJECT 5 +cube +material 3 +TRANS 5 5 0 +ROTAT 0 0 0 +SCALE .01 10 10 + +// metal Sphere +OBJECT 6 +sphere +material 4 +TRANS 0 1 2 +ROTAT 0 0 0 +SCALE 2 2 2 + +// perfect refractive Sphere +OBJECT 7 +sphere +material 5 +TRANS -2 1 0 +ROTAT 0 0 0 +SCALE 2 2 2 + +// glass Sphere +OBJECT 8 +sphere +material 6 +TRANS 2 1 0 +ROTAT 0 0 0 +SCALE 2 2 2 + +// yellow light +OBJECT 9 +cube +material 7 +TRANS -2 10 0 +ROTAT 0 0 0 +SCALE 2 2 2 + +// red light +OBJECT 10 +cube +material 8 +TRANS 2 10 0 +ROTAT 0 0 0 +SCALE 2 2 2 + + + diff --git a/scenes/single_cube.txt b/scenes/single_cube.txt new file mode 100644 index 0000000..88cd4ce --- /dev/null +++ b/scenes/single_cube.txt @@ -0,0 +1,169 @@ +// Emissive material (light) +MATERIAL 0 +RGB 1 1 1 +SPECEX 0 +SPECRGB 0 0 0 +REFL 0 +REFR 0 +REFRIOR 0 +EMITTANCE 5 + +// Diffuse white +MATERIAL 1 +RGB .98 .98 .98 +SPECEX 0 +SPECRGB 0 0 0 +REFL 0 +REFR 0 +REFRIOR 0 +EMITTANCE 0 + +// Diffuse red +MATERIAL 2 +RGB .85 .35 .35 +SPECEX 0 +SPECRGB 0 0 0 +REFL 0 +REFR 0 +REFRIOR 0 +EMITTANCE 0 + +// Diffuse green +MATERIAL 3 +RGB .35 .85 .35 +SPECEX 0 +SPECRGB 0 0 0 +REFL 0 +REFR 0 +REFRIOR 0 +EMITTANCE 0 + +// Specular white +MATERIAL 4 +RGB .98 .98 .98 +SPECEX 0 +SPECRGB .98 .98 .98 +REFL 1 +REFR 0 +REFRIOR 0 +EMITTANCE 0 + +// Diffuse fushia +MATERIAL 5 +RGB .85 .35 .85 +SPECEX 0 +SPECRGB 0 0 0 +REFL 0 +REFR 0 +REFRIOR 0 +EMITTANCE 0 + +// Diffuse yellow +MATERIAL 6 +RGB .85 .85 .35 +SPECEX 0 +SPECRGB 0 0 0 +REFL 0 +REFR 0 +REFRIOR 0 +EMITTANCE 0 + +// Diffuse blue +MATERIAL 7 +RGB .35 .35 .85 +SPECEX 0 +SPECRGB 0 0 0 +REFL 0 +REFR 0 +REFRIOR 0 +EMITTANCE 0 + +// glass +MATERIAL 8 +RGB .98 .98 .98 +SPECEX 0 +SPECRGB .98 .98 .98 +REFL 0.2 +REFR 0.8 +REFRIOR 1.5 +EMITTANCE 0 + +// Emissive yellow +MATERIAL 9 +RGB 0.85 0.85 0.35 +SPECEX 0 +SPECRGB 0 0 0 +REFL 0 +REFR 0 +REFRIOR 0 +EMITTANCE 2 + +// Camera +CAMERA +RES 800 800 +FOVY 45 +ITERATIONS 5000 +DEPTH 8 +FILE cornell +EYE 0.0 5 10.5 +LOOKAT 0 5 0 +UP 0 1 0 + + +// Ceiling light +OBJECT 0 +cube +material 0 +TRANS 0 10 0 +ROTAT 0 0 0 +SCALE 3 .3 3 + +// Floor +OBJECT 1 +cube +material 1 +TRANS 0 0 0 +ROTAT 0 0 0 +SCALE 10 .01 10 + +// Ceiling +OBJECT 2 +cube +material 1 +TRANS 0 10 0 +ROTAT 0 0 90 +SCALE .01 10 10 + +// Back wall +OBJECT 3 +cube +material 5 +TRANS 0 5 -5 +ROTAT 0 90 0 +SCALE .01 10 10 + +// Left wall +OBJECT 4 +cube +material 2 +TRANS -5 5 0 +ROTAT 0 0 0 +SCALE .01 10 10 + +// Right wall +OBJECT 5 +cube +material 3 +TRANS 5 5 0 +ROTAT 0 0 0 +SCALE .01 10 10 + +// android model +OBJECT 6 +obj_file ../mesh/android.obj +material 9 +TRANS 0 0.7 0 +ROTAT 0 0 0 +SCALE 0.07 0.07 0.07 + + diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index a1cb3fb..aaf8562 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -19,5 +19,5 @@ set(SOURCE_FILES cuda_add_library(src ${SOURCE_FILES} - OPTIONS -arch=sm_20 + OPTIONS -arch=sm_50 ) diff --git a/src/interactions.h b/src/interactions.h index 5ce3628..427972c 100644 --- a/src/interactions.h +++ b/src/interactions.h @@ -9,7 +9,7 @@ */ __host__ __device__ glm::vec3 calculateRandomDirectionInHemisphere( - glm::vec3 normal, thrust::default_random_engine &rng) { + glm::vec3 normal, thrust::default_random_engine &rng) { thrust::uniform_real_distribution u01(0, 1); float up = sqrt(u01(rng)); // cos(theta) @@ -24,9 +24,47 @@ glm::vec3 calculateRandomDirectionInHemisphere( glm::vec3 directionNotNormal; if (abs(normal.x) < SQRT_OF_ONE_THIRD) { directionNotNormal = glm::vec3(1, 0, 0); - } else if (abs(normal.y) < SQRT_OF_ONE_THIRD) { + } + else if (abs(normal.y) < SQRT_OF_ONE_THIRD) { directionNotNormal = glm::vec3(0, 1, 0); - } else { + } + else { + directionNotNormal = glm::vec3(0, 0, 1); + } + + // Use not-normal direction to generate two perpendicular directions + glm::vec3 perpendicularDirection1 = + glm::normalize(glm::cross(normal, directionNotNormal)); + glm::vec3 perpendicularDirection2 = + glm::normalize(glm::cross(normal, perpendicularDirection1)); + + return up * normal + + cos(around) * over * perpendicularDirection1 + + sin(around) * over * perpendicularDirection2; +} + +__forceinline__ +__host__ __device__ +glm::vec3 calculateRandomDirectionInHemisphere( + glm::vec3 normal, float rand1, float rand2) { + + float up = sqrt(rand1); // cos(theta) + float over = sqrt(1 - up * up); // sin(theta) + float around = rand2 * TWO_PI; + + // Find a direction that is not the normal based off of whether or not the + // normal's components are all equal to sqrt(1/3) or whether or not at + // least one component is less than sqrt(1/3). Learned this trick from + // Peter Kutz. + + glm::vec3 directionNotNormal; + if (abs(normal.x) < SQRT_OF_ONE_THIRD) { + directionNotNormal = glm::vec3(1, 0, 0); + } + else if (abs(normal.y) < SQRT_OF_ONE_THIRD) { + directionNotNormal = glm::vec3(0, 1, 0); + } + else { directionNotNormal = glm::vec3(0, 0, 1); } @@ -47,11 +85,11 @@ glm::vec3 calculateRandomDirectionInHemisphere( * A perfect specular surface scatters in the reflected ray direction. * In order to apply multiple effects to one surface, probabilistically choose * between them. - * + * * The visual effect you want is to straight-up add the diffuse and specular * components. You can do this in a few ways. This logic also applies to * combining other types of materias (such as refractive). - * + * * - Always take an even (50/50) split between a each effect (a diffuse bounce * and a specular bounce), but divide the resulting color of either branch * by its probability (0.5), to counteract the chance (0.5) of the branch @@ -68,12 +106,24 @@ glm::vec3 calculateRandomDirectionInHemisphere( */ __host__ __device__ void scatterRay( - PathSegment & pathSegment, - glm::vec3 intersect, - glm::vec3 normal, - const Material &m, - thrust::default_random_engine &rng) { - // TODO: implement this. + PathSegment& pathSegment, + glm::vec3 intersect, + glm::vec3 normal, + const Material& m, + thrust::default_random_engine& rng) { // A basic implementation of pure-diffuse shading will just call the // calculateRandomDirectionInHemisphere defined above. + thrust::uniform_real_distribution u01(0, 1); + float dice = u01(rng); + // shoot a ray from intersection point + pathSegment.ray.origin = intersect; + if (dice < m.hasReflective) + { + // go reflective + pathSegment.ray.direction = glm::reflect(pathSegment.ray.direction, normal); + } + else { + // go diffuse + pathSegment.ray.direction = calculateRandomDirectionInHemisphere(normal, rng); + } } diff --git a/src/intersections.h b/src/intersections.h index 6f23872..eefe872 100644 --- a/src/intersections.h +++ b/src/intersections.h @@ -142,3 +142,59 @@ __host__ __device__ float sphereIntersectionTest(Geom sphere, Ray r, return glm::length(r.origin - intersectionPoint); } + +__host__ __device__ float triangleIntersectionTest(Geom triangle, Ray r, + glm::vec3& intersectionPoint, glm::vec3& normal, bool& outside) { + + bool intersected = glm::intersectRayTriangle(r.origin, r.direction, + triangle.triangleInfo.v1, + triangle.triangleInfo.v2, + triangle.triangleInfo.v3, + intersectionPoint); + + normal = triangle.triangleInfo.normal; + // if ray direction and normal is different, then outside + outside = glm::dot(normal, r.direction) < 0.f; + + if (!intersected) { + return -1.f; + } + + return glm::length(r.origin - intersectionPoint); +} + +__host__ __device__ bool triangleIntersectionTestAll(const Geom& b_box, Triangle* triangles, Ray r, + glm::vec3& intersectionPoint_out, glm::vec3& normal_out, bool& outside_out) { + // TODO(zichuanyu) possible to do some unrolling / shared memeory ops + glm::vec3 tmp_intersect; + glm::vec3 tmp_normal; + bool has_hit = false; + float min_dis = FLT_MAX; + Triangle hit_triangle; + + for (int i = b_box.triangleIdx.start; i <= b_box.triangleIdx.end; ++i) { + Triangle triangle = triangles[i]; + + bool intersected = glm::intersectRayTriangle(r.origin, r.direction, + triangle.v1, + triangle.v2, + triangle.v3, + tmp_intersect); + + tmp_normal = triangle.normal; + + if (!intersected) { + continue; + } + + float dis = glm::length(r.origin - tmp_intersect); + if (dis < min_dis) { + normal_out = tmp_normal; + intersectionPoint_out = tmp_intersect; + min_dis = dis; + has_hit = true; + } + } + outside_out = glm::dot(normal_out, r.direction) < 0.f; + return has_hit; +} \ No newline at end of file diff --git a/src/main.cpp b/src/main.cpp index fe8e85e..f655420 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -1,5 +1,6 @@ #include "main.h" #include "preview.h" +#include "tiny_obj_loader/tiny_obj_loader.h" #include static std::string startTimeString; @@ -19,8 +20,8 @@ float zoom, theta, phi; glm::vec3 cameraPosition; glm::vec3 ogLookAt; // for recentering the camera -Scene *scene; -RenderState *renderState; +Scene* scene; +RenderState* renderState; int iteration; int width; @@ -100,19 +101,23 @@ void saveImage() { void runCuda() { if (camchanged) { + // if cam changed, reset all iteration = 0; - Camera &cam = renderState->camera; + Camera& cam = renderState->camera; cameraPosition.x = zoom * sin(phi) * sin(theta); cameraPosition.y = zoom * cos(theta); cameraPosition.z = zoom * cos(phi) * sin(theta); + // view is a normlized negative position cam.view = -glm::normalize(cameraPosition); + // view is a direction glm::vec3 v = cam.view; glm::vec3 u = glm::vec3(0, 1, 0);//glm::normalize(cam.up); glm::vec3 r = glm::cross(v, u); cam.up = glm::cross(r, v); cam.right = r; + // ??? cam.position = cameraPosition; cameraPosition += cam.lookAt; cam.position = cameraPosition; @@ -188,14 +193,14 @@ void mousePositionCallback(GLFWwindow* window, double xpos, double ypos) { } else if (middleMousePressed) { renderState = &scene->state; - Camera &cam = renderState->camera; + Camera& cam = renderState->camera; glm::vec3 forward = cam.view; forward.y = 0.0f; forward = glm::normalize(forward); glm::vec3 right = cam.right; right.y = 0.0f; right = glm::normalize(right); - + cam.lookAt -= (float) (xpos - lastX) * right * 0.01f; cam.lookAt += (float) (ypos - lastY) * forward * 0.01f; camchanged = true; diff --git a/src/pathtrace.cu b/src/pathtrace.cu index c1ec122..95adf9f 100644 --- a/src/pathtrace.cu +++ b/src/pathtrace.cu @@ -4,6 +4,7 @@ #include #include #include +#include #include "sceneStructs.h" #include "scene.h" @@ -15,6 +16,11 @@ #include "interactions.h" #define ERRORCHECK 1 +#define SORT_BY_MATERIAL 0 +#define CACHE_FIRST_BOUNCE 1 +#define ANTI_ALIASING 1 +#define OBJ_BOUND_CULLING 1 +#define STREAM_COMPACTION 0 #define FILENAME (strrchr(__FILE__, '/') ? strrchr(__FILE__, '/') + 1 : __FILE__) #define checkCUDAError(msg) checkCUDAErrorFn(msg, FILENAME, __LINE__) @@ -46,7 +52,7 @@ thrust::default_random_engine makeSeededRandomEngine(int iter, int index, int de //Kernel that writes the image to the OpenGL PBO directly. __global__ void sendImageToPBO(uchar4* pbo, glm::ivec2 resolution, - int iter, glm::vec3* image) { + int iter, glm::vec3* image) { int x = (blockIdx.x * blockDim.x) + threadIdx.x; int y = (blockIdx.y * blockDim.y) + threadIdx.y; @@ -55,9 +61,9 @@ __global__ void sendImageToPBO(uchar4* pbo, glm::ivec2 resolution, glm::vec3 pix = image[index]; glm::ivec3 color; - color.x = glm::clamp((int) (pix.x / iter * 255.0), 0, 255); - color.y = glm::clamp((int) (pix.y / iter * 255.0), 0, 255); - color.z = glm::clamp((int) (pix.z / iter * 255.0), 0, 255); + color.x = glm::clamp((int)(pix.x / iter * 255.0), 0, 255); + color.y = glm::clamp((int)(pix.y / iter * 255.0), 0, 255); + color.z = glm::clamp((int)(pix.z / iter * 255.0), 0, 255); // Each thread writes one pixel location in the texture (textel) pbo[index].w = 0; @@ -67,15 +73,47 @@ __global__ void sendImageToPBO(uchar4* pbo, glm::ivec2 resolution, } } -static Scene * hst_scene = NULL; -static glm::vec3 * dev_image = NULL; -static Geom * dev_geoms = NULL; -static Material * dev_materials = NULL; -static PathSegment * dev_paths = NULL; -static ShadeableIntersection * dev_intersections = NULL; +struct no_more_bounce +{ + __host__ __device__ + bool operator()(const PathSegment& x) + { + return x.remainingBounces <= 0; + } +}; + +struct has_more_bounce +{ + __host__ __device__ + bool operator()(const PathSegment& x) + { + return x.remainingBounces > 0; + } +}; + +struct material_comparator +{ + __host__ __device__ + bool operator()(const ShadeableIntersection& x, const ShadeableIntersection& y) + { + return (x.materialId > y.materialId); + } +}; + +static Scene* hst_scene = NULL; +static glm::vec3* dev_image = NULL; +static Geom* dev_geoms = NULL; +static Material* dev_materials = NULL; +static PathSegment* dev_paths = NULL; +static Triangle* dev_triangles = NULL; +#if CACHE_FIRST_BOUNCE +static ShadeableIntersection* dev_cached_first_intersection = NULL; +#endif +static ShadeableIntersection* dev_intersections = NULL; // TODO: static variables for device memory, any extra info you need, etc // ... +// basically it's copying all the geoms, mats, intersection to global memory void pathtraceInit(Scene *scene) { hst_scene = scene; const Camera &cam = hst_scene->state.camera; @@ -84,30 +122,37 @@ void pathtraceInit(Scene *scene) { cudaMalloc(&dev_image, pixelcount * sizeof(glm::vec3)); cudaMemset(dev_image, 0, pixelcount * sizeof(glm::vec3)); - cudaMalloc(&dev_paths, pixelcount * sizeof(PathSegment)); + cudaMalloc(&dev_paths, pixelcount * sizeof(PathSegment)); - cudaMalloc(&dev_geoms, scene->geoms.size() * sizeof(Geom)); - cudaMemcpy(dev_geoms, scene->geoms.data(), scene->geoms.size() * sizeof(Geom), cudaMemcpyHostToDevice); +#if CACHE_FIRST_BOUNCE + cudaMalloc(&dev_cached_first_intersection, pixelcount * sizeof(ShadeableIntersection)); +#endif - cudaMalloc(&dev_materials, scene->materials.size() * sizeof(Material)); - cudaMemcpy(dev_materials, scene->materials.data(), scene->materials.size() * sizeof(Material), cudaMemcpyHostToDevice); + cudaMalloc(&dev_geoms, scene->geoms_.size() * sizeof(Geom)); + cudaMemcpy(dev_geoms, scene->geoms_.data(), scene->geoms_.size() * sizeof(Geom), cudaMemcpyHostToDevice); - cudaMalloc(&dev_intersections, pixelcount * sizeof(ShadeableIntersection)); - cudaMemset(dev_intersections, 0, pixelcount * sizeof(ShadeableIntersection)); + cudaMalloc(&dev_triangles, scene->triangles_.size() * sizeof(Triangle)); + cudaMemcpy(dev_triangles, scene->triangles_.data(), scene->triangles_.size() * sizeof(Triangle), cudaMemcpyHostToDevice); - // TODO: initialize any extra device memeory you need + cudaMalloc(&dev_materials, scene->materials.size() * sizeof(Material)); + cudaMemcpy(dev_materials, scene->materials.data(), scene->materials.size() * sizeof(Material), cudaMemcpyHostToDevice); + cudaMalloc(&dev_intersections, pixelcount * sizeof(ShadeableIntersection)); + cudaMemset(dev_intersections, 0, pixelcount * sizeof(ShadeableIntersection)); + checkCUDAError("pathtraceInit"); } void pathtraceFree() { cudaFree(dev_image); // no-op if dev_image is null - cudaFree(dev_paths); - cudaFree(dev_geoms); - cudaFree(dev_materials); - cudaFree(dev_intersections); - // TODO: clean up any extra device memory you created - + cudaFree(dev_paths); + cudaFree(dev_geoms); + cudaFree(dev_triangles); + cudaFree(dev_materials); + cudaFree(dev_intersections); +#if CACHE_FIRST_BOUNCE + cudaFree(dev_cached_first_intersection); +#endif checkCUDAError("pathtraceFree"); } @@ -121,25 +166,39 @@ void pathtraceFree() { */ __global__ void generateRayFromCamera(Camera cam, int iter, int traceDepth, PathSegment* pathSegments) { - int x = (blockIdx.x * blockDim.x) + threadIdx.x; - int y = (blockIdx.y * blockDim.y) + threadIdx.y; + int x = (blockIdx.x * blockDim.x) + threadIdx.x; + int y = (blockIdx.y * blockDim.y) + threadIdx.y; + - if (x < cam.resolution.x && y < cam.resolution.y) { - int index = x + (y * cam.resolution.x); - PathSegment & segment = pathSegments[index]; - segment.ray.origin = cam.position; - segment.color = glm::vec3(1.0f, 1.0f, 1.0f); + if (x < cam.resolution.x && y < cam.resolution.y) { + int index = x + (y * cam.resolution.x); + PathSegment& segment = pathSegments[index]; - // TODO: implement antialiasing by jittering the ray - segment.ray.direction = glm::normalize(cam.view - - cam.right * cam.pixelLength.x * ((float)x - (float)cam.resolution.x * 0.5f) - - cam.up * cam.pixelLength.y * ((float)y - (float)cam.resolution.y * 0.5f) - ); + segment.ray.origin = cam.position; + segment.color = glm::vec3(1.0f, 1.0f, 1.0f); - segment.pixelIndex = index; - segment.remainingBounces = traceDepth; - } +#if ANTI_ALIASING + thrust::default_random_engine rng = makeSeededRandomEngine(iter, x, y); + thrust::uniform_real_distribution uPN(-0.3f, 0.3f); + + segment.ray.direction = glm::normalize(cam.view + - cam.right * cam.pixelLength.x * ((float)x - (float)cam.resolution.x * 0.5f + uPN(rng)) + - cam.up * cam.pixelLength.y * ((float)y - (float)cam.resolution.y * 0.5f + +uPN(rng)) + ); +#else + + // Use the camera's three directions and screen space to calculate + // the initial directions for each pixel + segment.ray.direction = glm::normalize(cam.view + - cam.right * cam.pixelLength.x * ((float)x - (float)cam.resolution.x * 0.5f) + - cam.up * cam.pixelLength.y * ((float)y - (float)cam.resolution.y * 0.5f) + ); +#endif + + segment.pixelIndex = index; + segment.remainingBounces = traceDepth; + } } // TODO: @@ -147,69 +206,97 @@ __global__ void generateRayFromCamera(Camera cam, int iter, int traceDepth, Path // Generating new rays is handled in your shader(s). // Feel free to modify the code below. __global__ void computeIntersections( - int depth - , int num_paths - , PathSegment * pathSegments - , Geom * geoms - , int geoms_size - , ShadeableIntersection * intersections - ) + int depth + , int num_paths + , PathSegment* pathSegments + , Geom* geoms + , Triangle* triangles + , int geoms_size + , ShadeableIntersection* intersections +) { - int path_index = blockIdx.x * blockDim.x + threadIdx.x; - - if (path_index < num_paths) - { - PathSegment pathSegment = pathSegments[path_index]; - - float t; - glm::vec3 intersect_point; - glm::vec3 normal; - float t_min = FLT_MAX; - int hit_geom_index = -1; - bool outside = true; - - glm::vec3 tmp_intersect; - glm::vec3 tmp_normal; - - // naive parse through global geoms - - for (int i = 0; i < geoms_size; i++) - { - Geom & geom = geoms[i]; - - if (geom.type == CUBE) - { - t = boxIntersectionTest(geom, pathSegment.ray, tmp_intersect, tmp_normal, outside); - } - else if (geom.type == SPHERE) - { - t = sphereIntersectionTest(geom, pathSegment.ray, tmp_intersect, tmp_normal, outside); - } - // TODO: add more intersection tests here... triangle? metaball? CSG? - - // Compute the minimum t from the intersection tests to determine what - // scene geometry object was hit first. - if (t > 0.0f && t_min > t) - { - t_min = t; - hit_geom_index = i; - intersect_point = tmp_intersect; - normal = tmp_normal; - } - } - - if (hit_geom_index == -1) - { - intersections[path_index].t = -1.0f; - } - else - { - //The ray hits something - intersections[path_index].t = t_min; - intersections[path_index].materialId = geoms[hit_geom_index].materialid; - intersections[path_index].surfaceNormal = normal; - } - } + int path_index = blockIdx.x * blockDim.x + threadIdx.x; + + if (path_index >= num_paths) return; + + PathSegment pathSegment = pathSegments[path_index]; + + float t; + glm::vec3 intersect_point; + glm::vec3 normal; + float t_min = FLT_MAX; + int hit_geom_index = -1; + bool outside = true; + + glm::vec3 tmp_intersect; + glm::vec3 tmp_normal; + + // naive parse through global geoms + // Per path goes through all the geoms + for (int i = 0; i < geoms_size; i++) + { + Geom& geom = geoms[i]; + + if (geom.type == CUBE) + { + t = boxIntersectionTest(geom, pathSegment.ray, tmp_intersect, tmp_normal, outside); + } + if (geom.type == SPHERE) + { + t = sphereIntersectionTest(geom, pathSegment.ray, tmp_intersect, tmp_normal, outside); + } + + if (geom.type == OBJ_BOX) + { + +#if OBJ_BOUND_CULLING + // Triangle material is dealt here, no need to do extra work + t = boxIntersectionTest(geom, pathSegment.ray, tmp_intersect, tmp_normal, outside); + if (t > 0.f) { + if (triangleIntersectionTestAll(geom, triangles, pathSegment.ray, tmp_intersect, tmp_normal, outside)) { + t = glm::distance(pathSegment.ray.origin, tmp_intersect); + } + else { + t = -1.f; + } + } +#else + if (triangleIntersectionTestAll(geom, triangles, pathSegment.ray, tmp_intersect, tmp_normal, outside)) { + t = glm::distance(pathSegment.ray.origin, tmp_intersect); + } + else { + t = -1.f; + } +#endif + } + + if (geom.type == TRIANGLE) + { + // do triangle first + t = triangleIntersectionTest(geom, pathSegment.ray, tmp_intersect, tmp_normal, outside); + } + + // Compute the minimum t from the intersection tests to determine what + // scene geometry object was hit first. + if (t > 0.0f && t < t_min) + { + t_min = t; + hit_geom_index = i; + intersect_point = tmp_intersect; + normal = tmp_normal; + } + } + + if (hit_geom_index == -1) + { + intersections[path_index].t = -1.0f; + return; + } + // The ray hits something + // ShadeableIntersection + intersections[path_index].t = t_min; + intersections[path_index].materialId = geoms[hit_geom_index].materialid; + intersections[path_index].surfaceNormal = normal; } // LOOK: "fake" shader demonstrating what you might do with the info in @@ -221,60 +308,209 @@ __global__ void computeIntersections( // Note that this shader does NOT do a BSDF evaluation! // Your shaders should handle that - this can allow techniques such as // bump mapping. -__global__ void shadeFakeMaterial ( - int iter - , int num_paths - , ShadeableIntersection * shadeableIntersections - , PathSegment * pathSegments - , Material * materials - ) +__global__ void shadeFakeMaterial( + int iter + , int num_paths + , ShadeableIntersection* shadeableIntersections + , PathSegment* pathSegments + , Material* materials +) { - int idx = blockIdx.x * blockDim.x + threadIdx.x; - if (idx < num_paths) - { + int idx = blockIdx.x * blockDim.x + threadIdx.x; + if (idx < num_paths) + { + ShadeableIntersection intersection = shadeableIntersections[idx]; + if (intersection.t > 0.0f) { // if the intersection exists... + // Set up the RNG + // LOOK: this is how you use thrust's RNG! Please look at + // makeSeededRandomEngine as well. + thrust::default_random_engine rng = makeSeededRandomEngine(iter, idx, 0); + thrust::uniform_real_distribution u01(0, 1); + + Material material = materials[intersection.materialId]; + glm::vec3 materialColor = material.color; + + // If the material indicates that the object was a light, "light" the ray + if (material.emittance > 0.0f) { + pathSegments[idx].color *= (materialColor * material.emittance); + } + // Otherwise, do some pseudo-lighting computation. This is actually more + // like what you would expect from shading in a rasterizer like OpenGL. + // TODO: replace this! you should be able to start with basically a one-liner + else { + float lightTerm = glm::dot(intersection.surfaceNormal, glm::vec3(0.0f, 1.0f, 0.0f)); + pathSegments[idx].color *= (materialColor * lightTerm) * 0.3f + ((1.0f - intersection.t * 0.02f) * materialColor) * 0.7f; + pathSegments[idx].color *= u01(rng); // apply some noise because why not + } + // If there was no intersection, color the ray black. + // Lots of renderers use 4 channel color, RGBA, where A = alpha, often + // used for opacity, in which case they can indicate "no opacity". + // This can be useful for post-processing and image compositing. + } + else { + pathSegments[idx].color = glm::vec3(0.0f); + } + } +} + +__forceinline__ +__host__ __device__ void BxDF_perfect_specular(glm::vec3& direction_out, glm::vec3& color_out, + const glm::vec4& dice, const Material& material, const PathSegment& pathSegment, + const ShadeableIntersection& intersection) { + direction_out = glm::reflect(pathSegment.ray.direction, intersection.surfaceNormal); + color_out = pathSegment.color * material.specular.color; +} + +__forceinline__ +__host__ __device__ void BxDF_perfect_refractive(glm::vec3& direction_out, glm::vec3& color_out, + const glm::vec4& dice, const Material& material, const PathSegment& pathSegment, + const ShadeableIntersection& intersection) { + float indexOfRefraction = material.indexOfRefraction; + if (glm::dot(intersection.surfaceNormal, pathSegment.ray.direction) < 0.f) { + indexOfRefraction = 1 / indexOfRefraction; + } + direction_out = glm::refract(pathSegment.ray.direction, intersection.surfaceNormal, + indexOfRefraction); + color_out = pathSegment.color * material.specular.color; +} + +__forceinline__ +__host__ __device__ void BxDF_specular_and_refractive(glm::vec3& direction_out, glm::vec3& color_out, + const glm::vec4& dice, const Material& material, const PathSegment& pathSegment, + const ShadeableIntersection& intersection) { + + + float indexOfRefraction = material.indexOfRefraction; + float cosine = glm::dot(glm::normalize(intersection.surfaceNormal), glm::normalize(pathSegment.ray.direction)); + if (cosine < 0.f) { + indexOfRefraction = 1 / indexOfRefraction; + } + float R = (1 - indexOfRefraction) / (1 + indexOfRefraction); + R = R * R; + + // one minus cosine + float omc = 1 + cosine; + float fresnel_term = R + (1 - R) * omc * omc * omc * omc * omc; + + if (dice.y < fresnel_term) { + // go reflective + direction_out = glm::reflect(pathSegment.ray.direction, intersection.surfaceNormal); + } + else { + // go refractive + direction_out = glm::refract(pathSegment.ray.direction, intersection.surfaceNormal, + indexOfRefraction); + } + + color_out = pathSegment.color * material.specular.color; +} + +__forceinline__ +__host__ __device__ void BxDF_diffuse(glm::vec3& direction_out, glm::vec3& color_out, + const glm::vec4& dice, const Material& material, const PathSegment& pathSegment, + const ShadeableIntersection& intersection) { + + direction_out = calculateRandomDirectionInHemisphere(intersection.surfaceNormal, dice.y, dice.z); + color_out = pathSegment.color * material.color; +} + +__global__ void shadeKernel( + int depth, + int iter + , int num_paths + , ShadeableIntersection* shadeableIntersections + , PathSegment* pathSegments + , Material* materials +) +{ + int idx = blockIdx.x * blockDim.x + threadIdx.x; + if (idx >= num_paths) return; + // Fetch global, hide latency + PathSegment pathSegment = pathSegments[idx]; ShadeableIntersection intersection = shadeableIntersections[idx]; - if (intersection.t > 0.0f) { // if the intersection exists... - // Set up the RNG - // LOOK: this is how you use thrust's RNG! Please look at - // makeSeededRandomEngine as well. - thrust::default_random_engine rng = makeSeededRandomEngine(iter, idx, 0); - thrust::uniform_real_distribution u01(0, 1); - - Material material = materials[intersection.materialId]; - glm::vec3 materialColor = material.color; - - // If the material indicates that the object was a light, "light" the ray - if (material.emittance > 0.0f) { - pathSegments[idx].color *= (materialColor * material.emittance); - } - // Otherwise, do some pseudo-lighting computation. This is actually more - // like what you would expect from shading in a rasterizer like OpenGL. - // TODO: replace this! you should be able to start with basically a one-liner - else { - float lightTerm = glm::dot(intersection.surfaceNormal, glm::vec3(0.0f, 1.0f, 0.0f)); - pathSegments[idx].color *= (materialColor * lightTerm) * 0.3f + ((1.0f - intersection.t * 0.02f) * materialColor) * 0.7f; - pathSegments[idx].color *= u01(rng); // apply some noise because why not - } + Material material = materials[intersection.materialId]; + + // Set up the RNG + thrust::default_random_engine rng = makeSeededRandomEngine(iter, idx, depth); + thrust::uniform_real_distribution u01(0, 1); + glm::vec4 dice = glm::vec4(u01(rng), u01(rng), u01(rng), u01(rng)); + // out vectors + glm::vec3 direction_out = glm::vec3(1.f); + glm::vec3 color_out = glm::vec3(1.f); + + +#if !STREAM_COMPACTION + // compaction + if (pathSegment.remainingBounces <= 0) { + return; + } +#endif + // If there was no intersection, color the ray black. - // Lots of renderers use 4 channel color, RGBA, where A = alpha, often - // used for opacity, in which case they can indicate "no opacity". - // This can be useful for post-processing and image compositing. - } else { - pathSegments[idx].color = glm::vec3(0.0f); + if (intersection.t <= 0.0f) { + pathSegment.color = glm::vec3(0.0f); + pathSegment.remainingBounces = 0; + pathSegments[idx] = pathSegment; + return; + } + + // If the material indicates that the object was a light, "light" the ray + // no more bounce + if (material.emittance > 0.0f) + { + pathSegment.color *= (material.color * material.emittance); + pathSegment.remainingBounces = 0; + pathSegments[idx] = pathSegment; + return; + } + + // TODO(zichuanyu) + // make this kernel big + // direction only deals with direction + // color only color + + // handle PathSegment: color, ray, remainingBounces; no need to do with pixelIndex + + glm::vec3 offset_direction = intersection.surfaceNormal; + + if (dice.x < material.hasReflective) { + // perfect specular + BxDF_perfect_specular(direction_out, color_out, dice, material, pathSegment, intersection); + offset_direction = glm::normalize(direction_out); + } + else if (dice.x < material.hasRefractive + material.hasReflective) { + // refractive + BxDF_specular_and_refractive(direction_out, color_out, dice, material, pathSegment, intersection); + offset_direction = glm::normalize(direction_out); } - } + else { + // diffuse + BxDF_diffuse(direction_out, color_out, dice, material, pathSegment, intersection); + } + + // offset the origin + glm::vec3 new_ray_roigin = pathSegment.ray.direction * intersection.t + + pathSegment.ray.origin + offset_direction * 0.0001f; + + --pathSegment.remainingBounces; + pathSegment.color = color_out; + pathSegment.ray.direction = glm::normalize(direction_out); + pathSegment.ray.origin = new_ray_roigin; + + // write back to postions + pathSegments[idx] = pathSegment; } // Add the current iteration's output to the overall image __global__ void finalGather(int nPaths, glm::vec3 * image, PathSegment * iterationPaths) { - int index = (blockIdx.x * blockDim.x) + threadIdx.x; + int index = (blockIdx.x * blockDim.x) + threadIdx.x; - if (index < nPaths) - { - PathSegment iterationPath = iterationPaths[index]; - image[iterationPath.pixelIndex] += iterationPath.color; - } + if (index < nPaths) + { + PathSegment iterationPath = iterationPaths[index]; + image[iterationPath.pixelIndex] += iterationPath.color; + } } /** @@ -286,14 +522,14 @@ void pathtrace(uchar4 *pbo, int frame, int iter) { const Camera &cam = hst_scene->state.camera; const int pixelcount = cam.resolution.x * cam.resolution.y; - // 2D block for generating ray from camera + // 2D block for generating ray from camera const dim3 blockSize2d(8, 8); const dim3 blocksPerGrid2d( - (cam.resolution.x + blockSize2d.x - 1) / blockSize2d.x, - (cam.resolution.y + blockSize2d.y - 1) / blockSize2d.y); + (cam.resolution.x + blockSize2d.x - 1) / blockSize2d.x, + (cam.resolution.y + blockSize2d.y - 1) / blockSize2d.y); - // 1D block for path tracing - const int blockSize1d = 128; + // 1D block for path tracing + const int blockSize1d = 128; /////////////////////////////////////////////////////////////////////////// @@ -326,68 +562,116 @@ void pathtrace(uchar4 *pbo, int frame, int iter) { // TODO: perform one iteration of path tracing - generateRayFromCamera <<>>(cam, iter, traceDepth, dev_paths); - checkCUDAError("generate camera ray"); - - int depth = 0; - PathSegment* dev_path_end = dev_paths + pixelcount; - int num_paths = dev_path_end - dev_paths; - - // --- PathSegment Tracing Stage --- - // Shoot ray into scene, bounce between objects, push shading chunks - - bool iterationComplete = false; - while (!iterationComplete) { - - // clean shading chunks - cudaMemset(dev_intersections, 0, pixelcount * sizeof(ShadeableIntersection)); - - // tracing - dim3 numblocksPathSegmentTracing = (num_paths + blockSize1d - 1) / blockSize1d; - computeIntersections <<>> ( - depth - , num_paths - , dev_paths - , dev_geoms - , hst_scene->geoms.size() - , dev_intersections - ); - checkCUDAError("trace one bounce"); - cudaDeviceSynchronize(); - depth++; - - - // TODO: - // --- Shading Stage --- - // Shade path segments based on intersections and generate new rays by - // evaluating the BSDF. - // Start off with just a big kernel that handles all the different - // materials you have in the scenefile. - // TODO: compare between directly shading the path segments and shading - // path segments that have been reshuffled to be contiguous in memory. - - shadeFakeMaterial<<>> ( - iter, - num_paths, - dev_intersections, - dev_paths, - dev_materials - ); - iterationComplete = true; // TODO: should be based off stream compaction results. - } - - // Assemble this iteration and apply it to the image - dim3 numBlocksPixels = (pixelcount + blockSize1d - 1) / blockSize1d; - finalGather<<>>(num_paths, dev_image, dev_paths); + generateRayFromCamera << > > (cam, iter, traceDepth, dev_paths); + checkCUDAError("generate camera ray"); + + int depth = 0; + PathSegment* dev_path_end = dev_paths + pixelcount; + int num_paths = dev_path_end - dev_paths; + + // --- PathSegment Tracing Stage --- + // Shoot ray into scene, bounce between objects, push shading chunks + + bool iterationComplete = false; + while (!iterationComplete) { + + // clean shading chunks + cudaMemset(dev_intersections, 0, pixelcount * sizeof(ShadeableIntersection)); + + + // tracing + dim3 numblocksPathSegmentTracing = (num_paths + blockSize1d - 1) / blockSize1d; + +#if CACHE_FIRST_BOUNCE && !ANTI_ALIASING + // iter != 1, depth == 0, use + // iter == 1, depth == 0, cache + // iter == 1, depth != 0, normal + // iter != 1, depth != 0, normal + + if (iter != 1 && depth == 0) { + // use + cudaMemcpy(dev_intersections, dev_cached_first_intersection, + pixelcount * sizeof(ShadeableIntersection), cudaMemcpyDeviceToDevice); + checkCUDAError("use cache"); + } + else { + computeIntersections << > > ( + depth + , num_paths + , dev_paths + , dev_geoms + , dev_triangles + , hst_scene->geoms_.size() + , dev_intersections + ); + if (iter == 1 && depth == 0) { + // cache + cudaMemcpy(dev_cached_first_intersection, dev_intersections, + pixelcount * sizeof(ShadeableIntersection), cudaMemcpyDeviceToDevice); + checkCUDAError("cache cache"); + } + // normal, do nothing + } +#else + // only compute intersections, dev_paths is input, dev_intersections is output + computeIntersections << > > ( + depth + , num_paths + , dev_paths + , dev_geoms + , dev_triangles + , hst_scene->geoms_.size() + , dev_intersections + ); +#endif + + checkCUDAError("trace one bounce"); + cudaDeviceSynchronize(); + depth++; + +#if SORT_BY_MATERIAL + // This step brings less branches in one warp + thrust::sort_by_key(thrust::device, dev_intersections, dev_intersections + num_paths, dev_paths, material_comparator()); +#endif + + // GUESS: dev_intersections is input, dev_paths is output + + shadeKernel << > > ( + depth, + iter, + num_paths, + dev_intersections, + dev_paths, + dev_materials + ); + +#if STREAM_COMPACTION + // compaction + dev_path_end = thrust::partition(thrust::device, dev_paths, dev_paths + num_paths, has_more_bounce()); + num_paths = dev_path_end - dev_paths; + if (num_paths <= 0) { + iterationComplete = true; + } +#else + if (depth == hst_scene->state.traceDepth) { + iterationComplete = true; + } +#endif + } + + // Assemble this iteration and apply it to the image + dim3 numBlocksPixels = (pixelcount + blockSize1d - 1) / blockSize1d; + finalGather << > > (pixelcount, dev_image, dev_paths); /////////////////////////////////////////////////////////////////////////// // Send results to OpenGL buffer for rendering - sendImageToPBO<<>>(pbo, cam.resolution, iter, dev_image); + sendImageToPBO << > > (pbo, cam.resolution, iter, dev_image); // Retrieve image from GPU cudaMemcpy(hst_scene->state.image.data(), dev_image, - pixelcount * sizeof(glm::vec3), cudaMemcpyDeviceToHost); + pixelcount * sizeof(glm::vec3), cudaMemcpyDeviceToHost); checkCUDAError("pathtrace"); } + diff --git a/src/scene.cpp b/src/scene.cpp index cbae043..2f77c71 100644 --- a/src/scene.cpp +++ b/src/scene.cpp @@ -1,5 +1,7 @@ #include #include "scene.h" +#include "tiny_obj_loader/loader_example.cc" +#include "tiny_obj_loader/tiny_obj_loader.h" #include #include #include @@ -21,10 +23,12 @@ Scene::Scene(string filename) { if (strcmp(tokens[0].c_str(), "MATERIAL") == 0) { loadMaterial(tokens[1]); cout << " " << endl; - } else if (strcmp(tokens[0].c_str(), "OBJECT") == 0) { + } + else if (strcmp(tokens[0].c_str(), "OBJECT") == 0) { loadGeom(tokens[1]); cout << " " << endl; - } else if (strcmp(tokens[0].c_str(), "CAMERA") == 0) { + } + else if (strcmp(tokens[0].c_str(), "CAMERA") == 0) { loadCamera(); cout << " " << endl; } @@ -34,24 +38,33 @@ Scene::Scene(string filename) { int Scene::loadGeom(string objectid) { int id = atoi(objectid.c_str()); - if (id != geoms.size()) { + if (id != geoms_.size()) { cout << "ERROR: OBJECT ID does not match expected number of geoms" << endl; return -1; - } else { + } + else { cout << "Loading Geom " << id << "..." << endl; Geom newGeom; string line; //load object type utilityCore::safeGetline(fp_in, line); + vector tokens = utilityCore::tokenizeString(line); + string obj_file_name; if (!line.empty() && fp_in.good()) { if (strcmp(line.c_str(), "sphere") == 0) { cout << "Creating new sphere..." << endl; newGeom.type = SPHERE; - } else if (strcmp(line.c_str(), "cube") == 0) { + } + else if (strcmp(line.c_str(), "cube") == 0) { cout << "Creating new cube..." << endl; newGeom.type = CUBE; } + else if (strcmp(tokens[0].c_str(), "obj_file") == 0) { + obj_file_name = tokens[1]; + cout << "Creating new object from obj file..." << endl; + newGeom.type = OBJ_BOX; + } } //link material @@ -70,9 +83,11 @@ int Scene::loadGeom(string objectid) { //load tranformations if (strcmp(tokens[0].c_str(), "TRANS") == 0) { newGeom.translation = glm::vec3(atof(tokens[1].c_str()), atof(tokens[2].c_str()), atof(tokens[3].c_str())); - } else if (strcmp(tokens[0].c_str(), "ROTAT") == 0) { + } + else if (strcmp(tokens[0].c_str(), "ROTAT") == 0) { newGeom.rotation = glm::vec3(atof(tokens[1].c_str()), atof(tokens[2].c_str()), atof(tokens[3].c_str())); - } else if (strcmp(tokens[0].c_str(), "SCALE") == 0) { + } + else if (strcmp(tokens[0].c_str(), "SCALE") == 0) { newGeom.scale = glm::vec3(atof(tokens[1].c_str()), atof(tokens[2].c_str()), atof(tokens[3].c_str())); } @@ -80,15 +95,177 @@ int Scene::loadGeom(string objectid) { } newGeom.transform = utilityCore::buildTransformationMatrix( - newGeom.translation, newGeom.rotation, newGeom.scale); + newGeom.translation, newGeom.rotation, newGeom.scale); newGeom.inverseTransform = glm::inverse(newGeom.transform); newGeom.invTranspose = glm::inverseTranspose(newGeom.transform); - geoms.push_back(newGeom); + // if obj file, construct more triangles + // must before push_back newGeom + if (newGeom.type == OBJ_BOX) { + // after this, the bounding box is already in the geoms vector + int res = loadTriangles(obj_file_name, newGeom); + if (res < 0) { + cout << "ERROR: fail to load obj file: " << obj_file_name << endl; + return -1; + } + } + + if (newGeom.type != OBJ_BOX) { + geoms_.push_back(newGeom); + } return 1; } } +int Scene::loadTriangles(const string& filename, const Geom& parent) { + std::cout << "Loading " << filename << std::endl; + + tinyobj::attrib_t attrib; + std::vector shapes; + std::vector materials; + + string basepath = "../mesh"; + const char* filename_char_ptr = filename.c_str(); + const char* basepath_char_ptr = basepath.c_str(); + + std::string err; + bool ret = tinyobj::LoadObj(&attrib, &shapes, &materials, &err, + filename_char_ptr, basepath_char_ptr, true); + + if (!err.empty()) { + std::cerr << err << std::endl; + } + + if (!ret) { + printf("Failed to load/parse .obj.\n"); + return -1; + } + + auto all_vertices = attrib.vertices; + auto all_normals = attrib.normals; + std::cout << "ALL VERT " << all_vertices.size() << std::endl; + + std::cout << "ALL NORMAL " << all_normals.size() << std::endl; + + // use size to mark the range of triangle geoms + int startIdx = triangles_.size(), endIdx; + + // x min, x max, y min, y max, z min, z max + float bound[6] = { FLT_MAX, FLT_MIN, FLT_MAX, FLT_MIN, FLT_MAX, FLT_MIN }; + + for (auto shape : shapes) { + auto indices = shape.mesh.indices; + for (int i = 0; i < indices.size() / 3; ++i) { + // i th triangle + + // copy all parent info + Triangle triangle; + + int vert1Id = indices[i * 3 + 0].vertex_index; + int vert2Id = indices[i * 3 + 1].vertex_index; + int vert3Id = indices[i * 3 + 2].vertex_index; + int normalId = normalId = indices[i * 3 + 0].normal_index; + + /*normalId = indices[i * 3 + 0].normal_index; + std::cout << "NORMAL IDX: " << normalId << std::endl; + + normalId = indices[i * 3 + 1].normal_index; + std::cout << "NORMAL IDX: " << normalId << std::endl; + + normalId = indices[i * 3 + 2].normal_index; + std::cout << "NORMAL IDX: " << normalId << std::endl;*/ + + glm::vec3 v1, v2, v3; + + v1.x = all_vertices[vert1Id * 3 + 0]; + v1.y = all_vertices[vert1Id * 3 + 1]; + v1.z = all_vertices[vert1Id * 3 + 2]; + + v2.x = all_vertices[vert2Id * 3 + 0]; + v2.y = all_vertices[vert2Id * 3 + 1]; + v2.z = all_vertices[vert2Id * 3 + 2]; + + v3.x = all_vertices[vert3Id * 3 + 0]; + v3.y = all_vertices[vert3Id * 3 + 1]; + v3.z = all_vertices[vert3Id * 3 + 2]; + + /*glm::vec3 display; + display = triangle.triangleInfo.normal; + + std::cout << "Triangle normal " << i << std::endl; + std::cout << triangle.triangleInfo.normal.x << " " << triangle.triangleInfo.normal.y << " " << triangle.triangleInfo.normal.z << std::endl; + std::cout << std::endl; + + display = triangle.triangleInfo.v1; + std::cout << "Triangle v1 " << i << std::endl; + std::cout << display.x << " " << display.y << " " << display.z << std::endl; + std::cout << std::endl; + + display = triangle.triangleInfo.v2; + std::cout << "Triangle v2 " << i << std::endl; + std::cout << display.x << " " << display.y << " " << display.z << std::endl; + std::cout << std::endl; + + display = triangle.triangleInfo.v3; + std::cout << "Triangle v3 " << i << std::endl; + std::cout << display.x << " " << display.y << " " << display.z << std::endl; + std::cout << std::endl; + + std::cout << "=====================================" << std::endl;*/ + + glm::mat4 mat = parent.transform; + glm::mat4 mat2 = parent.inverseTransform; + glm::mat4 mat3 = parent.invTranspose; + + v1 = glm::vec3(mat * glm::vec4(v1, 1.f)); + v2 = glm::vec3(mat * glm::vec4(v2, 1.f)); + v3 = glm::vec3(mat * glm::vec4(v3, 1.f)); + + // update bound + updateBound(bound, v1); + updateBound(bound, v2); + updateBound(bound, v3); + + triangle.normal = glm::normalize(glm::cross((v3 - v1), (v2 - v1))); + + triangle.v1 = v1; + triangle.v2 = v2; + triangle.v3 = v3; + + triangle.materialid = parent.materialid; + + triangles_.push_back(triangle); + } + } + endIdx = triangles_.size() - 1; + + // PrintInfo(attrib, shapes, materials); + + // Begin to construct bounding box + printBound(bound); + Geom boundingBox; + boundingBox.type = OBJ_BOX; + boundingBox.translation = glm::vec3((bound[0] + bound[1]) / 2, + (bound[2] + bound[3]) / 2, + (bound[4] + bound[5]) / 2); + boundingBox.rotation = glm::vec3(0, 0, 0); + boundingBox.scale = glm::vec3((bound[1] - bound[0]), + (bound[3] - bound[2]), + (bound[5] - bound[4])); + boundingBox.transform = utilityCore::buildTransformationMatrix( + boundingBox.translation, boundingBox.rotation, boundingBox.scale); + boundingBox.inverseTransform = glm::inverse(boundingBox.transform); + boundingBox.invTranspose = glm::inverseTranspose(boundingBox.transform); + boundingBox.materialid = parent.materialid; + boundingBox.triangleIdx.start = startIdx; + boundingBox.triangleIdx.end = endIdx; + + // push to geoms + geoms_.push_back(boundingBox); + + return 1; +} + int Scene::loadCamera() { cout << "Loading Camera ..." << endl; RenderState &state = this->state; @@ -103,13 +280,17 @@ int Scene::loadCamera() { if (strcmp(tokens[0].c_str(), "RES") == 0) { camera.resolution.x = atoi(tokens[1].c_str()); camera.resolution.y = atoi(tokens[2].c_str()); - } else if (strcmp(tokens[0].c_str(), "FOVY") == 0) { + } + else if (strcmp(tokens[0].c_str(), "FOVY") == 0) { fovy = atof(tokens[1].c_str()); - } else if (strcmp(tokens[0].c_str(), "ITERATIONS") == 0) { + } + else if (strcmp(tokens[0].c_str(), "ITERATIONS") == 0) { state.iterations = atoi(tokens[1].c_str()); - } else if (strcmp(tokens[0].c_str(), "DEPTH") == 0) { + } + else if (strcmp(tokens[0].c_str(), "DEPTH") == 0) { state.traceDepth = atoi(tokens[1].c_str()); - } else if (strcmp(tokens[0].c_str(), "FILE") == 0) { + } + else if (strcmp(tokens[0].c_str(), "FILE") == 0) { state.imageName = tokens[1]; } } @@ -120,9 +301,11 @@ int Scene::loadCamera() { vector tokens = utilityCore::tokenizeString(line); if (strcmp(tokens[0].c_str(), "EYE") == 0) { camera.position = glm::vec3(atof(tokens[1].c_str()), atof(tokens[2].c_str()), atof(tokens[3].c_str())); - } else if (strcmp(tokens[0].c_str(), "LOOKAT") == 0) { + } + else if (strcmp(tokens[0].c_str(), "LOOKAT") == 0) { camera.lookAt = glm::vec3(atof(tokens[1].c_str()), atof(tokens[2].c_str()), atof(tokens[3].c_str())); - } else if (strcmp(tokens[0].c_str(), "UP") == 0) { + } + else if (strcmp(tokens[0].c_str(), "UP") == 0) { camera.up = glm::vec3(atof(tokens[1].c_str()), atof(tokens[2].c_str()), atof(tokens[3].c_str())); } @@ -135,9 +318,9 @@ int Scene::loadCamera() { float fovx = (atan(xscaled) * 180) / PI; camera.fov = glm::vec2(fovx, fovy); - camera.right = glm::normalize(glm::cross(camera.view, camera.up)); - camera.pixelLength = glm::vec2(2 * xscaled / (float)camera.resolution.x - , 2 * yscaled / (float)camera.resolution.y); + camera.right = glm::normalize(glm::cross(camera.view, camera.up)); + camera.pixelLength = glm::vec2(2 * xscaled / (float)camera.resolution.x + , 2 * yscaled / (float)camera.resolution.y); camera.view = glm::normalize(camera.lookAt - camera.position); @@ -155,7 +338,8 @@ int Scene::loadMaterial(string materialid) { if (id != materials.size()) { cout << "ERROR: MATERIAL ID does not match expected number of materials" << endl; return -1; - } else { + } + else { cout << "Loading Material " << id << "..." << endl; Material newMaterial; @@ -165,20 +349,26 @@ int Scene::loadMaterial(string materialid) { utilityCore::safeGetline(fp_in, line); vector tokens = utilityCore::tokenizeString(line); if (strcmp(tokens[0].c_str(), "RGB") == 0) { - glm::vec3 color( atof(tokens[1].c_str()), atof(tokens[2].c_str()), atof(tokens[3].c_str()) ); + glm::vec3 color(atof(tokens[1].c_str()), atof(tokens[2].c_str()), atof(tokens[3].c_str())); newMaterial.color = color; - } else if (strcmp(tokens[0].c_str(), "SPECEX") == 0) { + } + else if (strcmp(tokens[0].c_str(), "SPECEX") == 0) { newMaterial.specular.exponent = atof(tokens[1].c_str()); - } else if (strcmp(tokens[0].c_str(), "SPECRGB") == 0) { + } + else if (strcmp(tokens[0].c_str(), "SPECRGB") == 0) { glm::vec3 specColor(atof(tokens[1].c_str()), atof(tokens[2].c_str()), atof(tokens[3].c_str())); newMaterial.specular.color = specColor; - } else if (strcmp(tokens[0].c_str(), "REFL") == 0) { + } + else if (strcmp(tokens[0].c_str(), "REFL") == 0) { newMaterial.hasReflective = atof(tokens[1].c_str()); - } else if (strcmp(tokens[0].c_str(), "REFR") == 0) { + } + else if (strcmp(tokens[0].c_str(), "REFR") == 0) { newMaterial.hasRefractive = atof(tokens[1].c_str()); - } else if (strcmp(tokens[0].c_str(), "REFRIOR") == 0) { + } + else if (strcmp(tokens[0].c_str(), "REFRIOR") == 0) { newMaterial.indexOfRefraction = atof(tokens[1].c_str()); - } else if (strcmp(tokens[0].c_str(), "EMITTANCE") == 0) { + } + else if (strcmp(tokens[0].c_str(), "EMITTANCE") == 0) { newMaterial.emittance = atof(tokens[1].c_str()); } } @@ -186,3 +376,26 @@ int Scene::loadMaterial(string materialid) { return 1; } } + +void Scene::updateBound(float* bound_out, const glm::vec3& vert) { + bound_out[0] = min(bound_out[0], vert.x); + bound_out[1] = max(bound_out[1], vert.x); + + bound_out[2] = min(bound_out[2], vert.y); + bound_out[3] = max(bound_out[3], vert.y); + + bound_out[4] = min(bound_out[4], vert.z); + bound_out[5] = max(bound_out[5], vert.z); +} + + +void Scene::printBound(const float* bound) { + std::cout << "=====Bounding Box=======" << std::endl; + std::cout << "x Min: " << bound[0] << std::endl; + std::cout << "x Max: " << bound[1] << std::endl; + std::cout << "y Min: " << bound[2] << std::endl; + std::cout << "y Max: " << bound[3] << std::endl; + std::cout << "z Min: " << bound[4] << std::endl; + std::cout << "z Max: " << bound[5] << std::endl; + std::cout << "=====Bounding Box=======" << std::endl; +} diff --git a/src/scene.h b/src/scene.h index f29a917..2036ed3 100644 --- a/src/scene.h +++ b/src/scene.h @@ -16,11 +16,15 @@ class Scene { int loadMaterial(string materialid); int loadGeom(string objectid); int loadCamera(); + int loadTriangles(const string& filename, const Geom& parent); + void updateBound(float* bound_out, const glm::vec3& vert); + void printBound(const float* bound); public: Scene(string filename); ~Scene(); - std::vector geoms; + std::vector geoms_; + std::vector triangles_; std::vector materials; RenderState state; }; diff --git a/src/sceneStructs.h b/src/sceneStructs.h index b38b820..2a677f7 100644 --- a/src/sceneStructs.h +++ b/src/sceneStructs.h @@ -10,6 +10,8 @@ enum GeomType { SPHERE, CUBE, + OBJ_BOX, + TRIANGLE, }; struct Ray { @@ -26,7 +28,29 @@ struct Geom { glm::mat4 transform; glm::mat4 inverseTransform; glm::mat4 invTranspose; + + // only used in OBJ_BOX + struct { + int start; + int end; + } triangleIdx; + + // only used in TRIANGLE + struct { + glm::vec3 v1; + glm::vec3 v2; + glm::vec3 v3; + glm::vec3 normal; + } triangleInfo; }; +struct Triangle { + int materialid; + glm::vec3 v1; + glm::vec3 v2; + glm::vec3 v3; + glm::vec3 normal; +}; + struct Material { glm::vec3 color; @@ -43,7 +67,9 @@ struct Material { struct Camera { glm::ivec2 resolution; glm::vec3 position; + // lookAt is a point glm::vec3 lookAt; + // view is a position glm::vec3 view; glm::vec3 up; glm::vec3 right; diff --git a/stream_compaction/CMakeLists.txt b/stream_compaction/CMakeLists.txt index ac358c9..1983b66 100644 --- a/stream_compaction/CMakeLists.txt +++ b/stream_compaction/CMakeLists.txt @@ -3,5 +3,5 @@ set(SOURCE_FILES cuda_add_library(stream_compaction ${SOURCE_FILES} - OPTIONS -arch=sm_20 + OPTIONS -arch=sm_50 ) diff --git a/tiny_obj_loader/CMakeLists.txt b/tiny_obj_loader/CMakeLists.txt new file mode 100644 index 0000000..1ee4125 --- /dev/null +++ b/tiny_obj_loader/CMakeLists.txt @@ -0,0 +1,10 @@ +set(SOURCE_FILES + "tiny_obj_loader.cc" + "tiny_obj_loader.h" + "loader_example.cc" + ) + +cuda_add_library(tiny_obj_loader + ${SOURCE_FILES} + OPTIONS -arch=sm_50 + ) diff --git a/tiny_obj_loader/loader_example.cc b/tiny_obj_loader/loader_example.cc new file mode 100644 index 0000000..ca7663b --- /dev/null +++ b/tiny_obj_loader/loader_example.cc @@ -0,0 +1,433 @@ +// +// g++ loader_example.cc +// +#define TINYOBJLOADER_IMPLEMENTATION +#include "tiny_obj_loader.h" + +#include +#include +#include +#include +#include +#include + +#ifdef _WIN32 +#ifdef __cplusplus +extern "C" { +#endif +#include +#include +#ifdef __cplusplus +} +#endif +#pragma comment(lib, "winmm.lib") +#else +#if defined(__unix__) || defined(__APPLE__) +#include +#else +#include +#endif +#endif + +#ifdef __clang__ +#pragma clang diagnostic push +#if __has_warning("-Wzero-as-null-pointer-constant") +#pragma clang diagnostic ignored "-Wzero-as-null-pointer-constant" +#endif +#endif + +class timerutil { + public: +#ifdef _WIN32 + typedef DWORD time_t; + + timerutil() { ::timeBeginPeriod(1); } + ~timerutil() { ::timeEndPeriod(1); } + + void start() { t_[0] = ::timeGetTime(); } + void end() { t_[1] = ::timeGetTime(); } + + time_t sec() { return (time_t)((t_[1] - t_[0]) / 1000); } + time_t msec() { return (time_t)((t_[1] - t_[0])); } + time_t usec() { return (time_t)((t_[1] - t_[0]) * 1000); } + time_t current() { return ::timeGetTime(); } + +#else +#if defined(__unix__) || defined(__APPLE__) + typedef unsigned long int time_t; + + void start() { gettimeofday(tv + 0, &tz); } + void end() { gettimeofday(tv + 1, &tz); } + + time_t sec() { return static_cast(tv[1].tv_sec - tv[0].tv_sec); } + time_t msec() { + return this->sec() * 1000 + + static_cast((tv[1].tv_usec - tv[0].tv_usec) / 1000); + } + time_t usec() { + return this->sec() * 1000000 + + static_cast(tv[1].tv_usec - tv[0].tv_usec); + } + time_t current() { + struct timeval t; + gettimeofday(&t, NULL); + return static_cast(t.tv_sec * 1000 + t.tv_usec); + } + +#else // C timer + // using namespace std; + typedef clock_t time_t; + + void start() { t_[0] = clock(); } + void end() { t_[1] = clock(); } + + time_t sec() { return (time_t)((t_[1] - t_[0]) / CLOCKS_PER_SEC); } + time_t msec() { return (time_t)((t_[1] - t_[0]) * 1000 / CLOCKS_PER_SEC); } + time_t usec() { return (time_t)((t_[1] - t_[0]) * 1000000 / CLOCKS_PER_SEC); } + time_t current() { return (time_t)clock(); } + +#endif +#endif + + private: +#ifdef _WIN32 + DWORD t_[2]; +#else +#if defined(__unix__) || defined(__APPLE__) + struct timeval tv[2]; + struct timezone tz; +#else + time_t t_[2]; +#endif +#endif +}; + +static void PrintInfo(const tinyobj::attrib_t& attrib, + const std::vector& shapes, + const std::vector& materials) { + std::cout << "# of vertices : " << (attrib.vertices.size() / 3) << std::endl; + std::cout << "# of normals : " << (attrib.normals.size() / 3) << std::endl; + std::cout << "# of texcoords : " << (attrib.texcoords.size() / 2) + << std::endl; + + std::cout << "# of shapes : " << shapes.size() << std::endl; + std::cout << "# of materials : " << materials.size() << std::endl; + + for (size_t v = 0; v < attrib.vertices.size() / 3; v++) { + printf(" v[%ld] = (%f, %f, %f)\n", static_cast(v), + static_cast(attrib.vertices[3 * v + 0]), + static_cast(attrib.vertices[3 * v + 1]), + static_cast(attrib.vertices[3 * v + 2])); + } + + for (size_t v = 0; v < attrib.normals.size() / 3; v++) { + printf(" n[%ld] = (%f, %f, %f)\n", static_cast(v), + static_cast(attrib.normals[3 * v + 0]), + static_cast(attrib.normals[3 * v + 1]), + static_cast(attrib.normals[3 * v + 2])); + } + + for (size_t v = 0; v < attrib.texcoords.size() / 2; v++) { + printf(" uv[%ld] = (%f, %f)\n", static_cast(v), + static_cast(attrib.texcoords[2 * v + 0]), + static_cast(attrib.texcoords[2 * v + 1])); + } + + // For each shape + for (size_t i = 0; i < shapes.size(); i++) { + printf("shape[%ld].name = %s\n", static_cast(i), + shapes[i].name.c_str()); + printf("Size of shape[%ld].mesh.indices: %lu\n", static_cast(i), + static_cast(shapes[i].mesh.indices.size())); + printf("Size of shape[%ld].path.indices: %lu\n", static_cast(i), + static_cast(shapes[i].path.indices.size())); + + size_t index_offset = 0; + + assert(shapes[i].mesh.num_face_vertices.size() == + shapes[i].mesh.material_ids.size()); + + assert(shapes[i].mesh.num_face_vertices.size() == + shapes[i].mesh.smoothing_group_ids.size()); + + printf("shape[%ld].num_faces: %lu\n", static_cast(i), + static_cast(shapes[i].mesh.num_face_vertices.size())); + + // For each face + for (size_t f = 0; f < shapes[i].mesh.num_face_vertices.size(); f++) { + size_t fnum = shapes[i].mesh.num_face_vertices[f]; + + printf(" face[%ld].fnum = %ld\n", static_cast(f), + static_cast(fnum)); + + // For each vertex in the face + for (size_t v = 0; v < fnum; v++) { + tinyobj::index_t idx = shapes[i].mesh.indices[index_offset + v]; + printf(" face[%ld].v[%ld].idx = %d/%d/%d\n", static_cast(f), + static_cast(v), idx.vertex_index, idx.normal_index, + idx.texcoord_index); + } + + printf(" face[%ld].material_id = %d\n", static_cast(f), + shapes[i].mesh.material_ids[f]); + printf(" face[%ld].smoothing_group_id = %d\n", static_cast(f), + shapes[i].mesh.smoothing_group_ids[f]); + + index_offset += fnum; + } + + printf("shape[%ld].num_tags: %lu\n", static_cast(i), + static_cast(shapes[i].mesh.tags.size())); + for (size_t t = 0; t < shapes[i].mesh.tags.size(); t++) { + printf(" tag[%ld] = %s ", static_cast(t), + shapes[i].mesh.tags[t].name.c_str()); + printf(" ints: ["); + for (size_t j = 0; j < shapes[i].mesh.tags[t].intValues.size(); ++j) { + printf("%ld", static_cast(shapes[i].mesh.tags[t].intValues[j])); + if (j < (shapes[i].mesh.tags[t].intValues.size() - 1)) { + printf(", "); + } + } + printf("]"); + + printf(" floats: ["); + for (size_t j = 0; j < shapes[i].mesh.tags[t].floatValues.size(); ++j) { + printf("%f", static_cast( + shapes[i].mesh.tags[t].floatValues[j])); + if (j < (shapes[i].mesh.tags[t].floatValues.size() - 1)) { + printf(", "); + } + } + printf("]"); + + printf(" strings: ["); + for (size_t j = 0; j < shapes[i].mesh.tags[t].stringValues.size(); ++j) { + printf("%s", shapes[i].mesh.tags[t].stringValues[j].c_str()); + if (j < (shapes[i].mesh.tags[t].stringValues.size() - 1)) { + printf(", "); + } + } + printf("]"); + printf("\n"); + } + } + + for (size_t i = 0; i < materials.size(); i++) { + printf("material[%ld].name = %s\n", static_cast(i), + materials[i].name.c_str()); + printf(" material.Ka = (%f, %f ,%f)\n", + static_cast(materials[i].ambient[0]), + static_cast(materials[i].ambient[1]), + static_cast(materials[i].ambient[2])); + printf(" material.Kd = (%f, %f ,%f)\n", + static_cast(materials[i].diffuse[0]), + static_cast(materials[i].diffuse[1]), + static_cast(materials[i].diffuse[2])); + printf(" material.Ks = (%f, %f ,%f)\n", + static_cast(materials[i].specular[0]), + static_cast(materials[i].specular[1]), + static_cast(materials[i].specular[2])); + printf(" material.Tr = (%f, %f ,%f)\n", + static_cast(materials[i].transmittance[0]), + static_cast(materials[i].transmittance[1]), + static_cast(materials[i].transmittance[2])); + printf(" material.Ke = (%f, %f ,%f)\n", + static_cast(materials[i].emission[0]), + static_cast(materials[i].emission[1]), + static_cast(materials[i].emission[2])); + printf(" material.Ns = %f\n", + static_cast(materials[i].shininess)); + printf(" material.Ni = %f\n", static_cast(materials[i].ior)); + printf(" material.dissolve = %f\n", + static_cast(materials[i].dissolve)); + printf(" material.illum = %d\n", materials[i].illum); + printf(" material.map_Ka = %s\n", materials[i].ambient_texname.c_str()); + printf(" material.map_Kd = %s\n", materials[i].diffuse_texname.c_str()); + printf(" material.map_Ks = %s\n", materials[i].specular_texname.c_str()); + printf(" material.map_Ns = %s\n", + materials[i].specular_highlight_texname.c_str()); + printf(" material.map_bump = %s\n", materials[i].bump_texname.c_str()); + printf(" bump_multiplier = %f\n", static_cast(materials[i].bump_texopt.bump_multiplier)); + printf(" material.map_d = %s\n", materials[i].alpha_texname.c_str()); + printf(" material.disp = %s\n", materials[i].displacement_texname.c_str()); + printf(" <>\n"); + printf(" material.Pr = %f\n", static_cast(materials[i].roughness)); + printf(" material.Pm = %f\n", static_cast(materials[i].metallic)); + printf(" material.Ps = %f\n", static_cast(materials[i].sheen)); + printf(" material.Pc = %f\n", static_cast(materials[i].clearcoat_thickness)); + printf(" material.Pcr = %f\n", static_cast(materials[i].clearcoat_thickness)); + printf(" material.aniso = %f\n", static_cast(materials[i].anisotropy)); + printf(" material.anisor = %f\n", static_cast(materials[i].anisotropy_rotation)); + printf(" material.map_Ke = %s\n", materials[i].emissive_texname.c_str()); + printf(" material.map_Pr = %s\n", materials[i].roughness_texname.c_str()); + printf(" material.map_Pm = %s\n", materials[i].metallic_texname.c_str()); + printf(" material.map_Ps = %s\n", materials[i].sheen_texname.c_str()); + printf(" material.norm = %s\n", materials[i].normal_texname.c_str()); + std::map::const_iterator it( + materials[i].unknown_parameter.begin()); + std::map::const_iterator itEnd( + materials[i].unknown_parameter.end()); + + for (; it != itEnd; it++) { + printf(" material.%s = %s\n", it->first.c_str(), it->second.c_str()); + } + printf("\n"); + } +} + +static bool TestLoadObj(const char* filename, const char* basepath = NULL, + bool triangulate = true) { + std::cout << "Loading " << filename << std::endl; + + tinyobj::attrib_t attrib; + std::vector shapes; + std::vector materials; + + timerutil t; + t.start(); + std::string err; + bool ret = tinyobj::LoadObj(&attrib, &shapes, &materials, &err, filename, + basepath, triangulate); + t.end(); + printf("Parsing time: %lu [msecs]\n", t.msec()); + + if (!err.empty()) { + std::cerr << err << std::endl; + } + + if (!ret) { + printf("Failed to load/parse .obj.\n"); + return false; + } + + PrintInfo(attrib, shapes, materials); + + return true; +} + +static bool TestStreamLoadObj() { + std::cout << "Stream Loading " << std::endl; + + std::stringstream objStream; + objStream << "mtllib cube.mtl\n" + "\n" + "v 0.000000 2.000000 2.000000\n" + "v 0.000000 0.000000 2.000000\n" + "v 2.000000 0.000000 2.000000\n" + "v 2.000000 2.000000 2.000000\n" + "v 0.000000 2.000000 0.000000\n" + "v 0.000000 0.000000 0.000000\n" + "v 2.000000 0.000000 0.000000\n" + "v 2.000000 2.000000 0.000000\n" + "# 8 vertices\n" + "\n" + "g front cube\n" + "usemtl white\n" + "f 1 2 3 4\n" + "g back cube\n" + "# expects white material\n" + "f 8 7 6 5\n" + "g right cube\n" + "usemtl red\n" + "f 4 3 7 8\n" + "g top cube\n" + "usemtl white\n" + "f 5 1 4 8\n" + "g left cube\n" + "usemtl green\n" + "f 5 6 2 1\n" + "g bottom cube\n" + "usemtl white\n" + "f 2 6 7 3\n" + "# 6 elements"; + + std::string matStream( + "newmtl white\n" + "Ka 0 0 0\n" + "Kd 1 1 1\n" + "Ks 0 0 0\n" + "\n" + "newmtl red\n" + "Ka 0 0 0\n" + "Kd 1 0 0\n" + "Ks 0 0 0\n" + "\n" + "newmtl green\n" + "Ka 0 0 0\n" + "Kd 0 1 0\n" + "Ks 0 0 0\n" + "\n" + "newmtl blue\n" + "Ka 0 0 0\n" + "Kd 0 0 1\n" + "Ks 0 0 0\n" + "\n" + "newmtl light\n" + "Ka 20 20 20\n" + "Kd 1 1 1\n" + "Ks 0 0 0"); + + using namespace tinyobj; + class MaterialStringStreamReader : public MaterialReader { + public: + MaterialStringStreamReader(const std::string& matSStream) + : m_matSStream(matSStream) {} + virtual ~MaterialStringStreamReader() {} + virtual bool operator()(const std::string& matId, + std::vector* materials, + std::map* matMap, + std::string* err) { + (void)matId; + std::string warning; + LoadMtl(matMap, materials, &m_matSStream, &warning); + + if (!warning.empty()) { + if (err) { + (*err) += warning; + } + } + return true; + } + + private: + std::stringstream m_matSStream; + }; + + MaterialStringStreamReader matSSReader(matStream); + tinyobj::attrib_t attrib; + std::vector shapes; + std::vector materials; + std::string err; + bool ret = tinyobj::LoadObj(&attrib, &shapes, &materials, &err, &objStream, + &matSSReader); + + if (!err.empty()) { + std::cerr << err << std::endl; + } + + if (!ret) { + return false; + } + + PrintInfo(attrib, shapes, materials); + + return true; +} + +//int main(int argc, char** argv) { +// if (argc > 1) { +// const char* basepath = "models/"; +// if (argc > 2) { +// basepath = argv[2]; +// } +// assert(true == TestLoadObj(argv[1], basepath)); +// } else { +// // assert(true == TestLoadObj("cornell_box.obj")); +// // assert(true == TestLoadObj("cube.obj")); +// assert(true == TestStreamLoadObj()); +// assert(true == +// TestLoadObj("models/catmark_torus_creases0.obj", "models/", false)); +// } +// +// return 0; +//} diff --git a/tiny_obj_loader/tiny_obj_loader.cc b/tiny_obj_loader/tiny_obj_loader.cc new file mode 100644 index 0000000..e57d044 --- /dev/null +++ b/tiny_obj_loader/tiny_obj_loader.cc @@ -0,0 +1,2 @@ +#define TINYOBJLOADER_IMPLEMENTATION +#include "tiny_obj_loader.h" diff --git a/tiny_obj_loader/tiny_obj_loader.h b/tiny_obj_loader/tiny_obj_loader.h new file mode 100644 index 0000000..5670075 --- /dev/null +++ b/tiny_obj_loader/tiny_obj_loader.h @@ -0,0 +1,2519 @@ +/* +The MIT License (MIT) + +Copyright (c) 2012-2018 Syoyo Fujita and many contributors. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. +*/ + +// +// version 1.2.3 : Added color space extension('-colorspace') to tex opts. +// version 1.2.2 : Parse multiple group names. +// version 1.2.1 : Added initial support for line('l') primitive(PR #178) +// version 1.2.0 : Hardened implementation(#175) +// version 1.1.1 : Support smoothing groups(#162) +// version 1.1.0 : Support parsing vertex color(#144) +// version 1.0.8 : Fix parsing `g` tag just after `usemtl`(#138) +// version 1.0.7 : Support multiple tex options(#126) +// version 1.0.6 : Add TINYOBJLOADER_USE_DOUBLE option(#124) +// version 1.0.5 : Ignore `Tr` when `d` exists in MTL(#43) +// version 1.0.4 : Support multiple filenames for 'mtllib'(#112) +// version 1.0.3 : Support parsing texture options(#85) +// version 1.0.2 : Improve parsing speed by about a factor of 2 for large +// files(#105) +// version 1.0.1 : Fixes a shape is lost if obj ends with a 'usemtl'(#104) +// version 1.0.0 : Change data structure. Change license from BSD to MIT. +// + +// +// Use this in *one* .cc +// #define TINYOBJLOADER_IMPLEMENTATION +// #include "tiny_obj_loader.h" +// + +#pragma once +#ifndef TINY_OBJ_LOADER_H_ +#define TINY_OBJ_LOADER_H_ + +#include +#include +#include + +namespace tinyobj { + +#ifdef __clang__ +#pragma clang diagnostic push +#if __has_warning("-Wzero-as-null-pointer-constant") +#pragma clang diagnostic ignored "-Wzero-as-null-pointer-constant" +#endif + +#pragma clang diagnostic ignored "-Wpadded" + +#endif + +// https://en.wikipedia.org/wiki/Wavefront_.obj_file says ... +// +// -blendu on | off # set horizontal texture blending +// (default on) +// -blendv on | off # set vertical texture blending +// (default on) +// -boost real_value # boost mip-map sharpness +// -mm base_value gain_value # modify texture map values (default +// 0 1) +// # base_value = brightness, +// gain_value = contrast +// -o u [v [w]] # Origin offset (default +// 0 0 0) +// -s u [v [w]] # Scale (default +// 1 1 1) +// -t u [v [w]] # Turbulence (default +// 0 0 0) +// -texres resolution # texture resolution to create +// -clamp on | off # only render texels in the clamped +// 0-1 range (default off) +// # When unclamped, textures are +// repeated across a surface, +// # when clamped, only texels which +// fall within the 0-1 +// # range are rendered. +// -bm mult_value # bump multiplier (for bump maps +// only) +// +// -imfchan r | g | b | m | l | z # specifies which channel of the file +// is used to +// # create a scalar or bump texture. +// r:red, g:green, +// # b:blue, m:matte, l:luminance, +// z:z-depth.. +// # (the default for bump is 'l' and +// for decal is 'm') +// bump -imfchan r bumpmap.tga # says to use the red channel of +// bumpmap.tga as the bumpmap +// +// For reflection maps... +// +// -type sphere # specifies a sphere for a "refl" +// reflection map +// -type cube_top | cube_bottom | # when using a cube map, the texture +// file for each +// cube_front | cube_back | # side of the cube is specified +// separately +// cube_left | cube_right +// +// TinyObjLoader extension. +// +// -colorspace SPACE # Color space of the texture. e.g. 'sRGB` or 'linear' +// + +#ifdef TINYOBJLOADER_USE_DOUBLE +//#pragma message "using double" +typedef double real_t; +#else +//#pragma message "using float" +typedef float real_t; +#endif + +typedef enum { + TEXTURE_TYPE_NONE, // default + TEXTURE_TYPE_SPHERE, + TEXTURE_TYPE_CUBE_TOP, + TEXTURE_TYPE_CUBE_BOTTOM, + TEXTURE_TYPE_CUBE_FRONT, + TEXTURE_TYPE_CUBE_BACK, + TEXTURE_TYPE_CUBE_LEFT, + TEXTURE_TYPE_CUBE_RIGHT +} texture_type_t; + +typedef struct { + texture_type_t type; // -type (default TEXTURE_TYPE_NONE) + real_t sharpness; // -boost (default 1.0?) + real_t brightness; // base_value in -mm option (default 0) + real_t contrast; // gain_value in -mm option (default 1) + real_t origin_offset[3]; // -o u [v [w]] (default 0 0 0) + real_t scale[3]; // -s u [v [w]] (default 1 1 1) + real_t turbulence[3]; // -t u [v [w]] (default 0 0 0) + // int texture_resolution; // -texres resolution (default = ?) TODO + bool clamp; // -clamp (default false) + char imfchan; // -imfchan (the default for bump is 'l' and for decal is 'm') + bool blendu; // -blendu (default on) + bool blendv; // -blendv (default on) + real_t bump_multiplier; // -bm (for bump maps only, default 1.0) + + // extension + std::string colorspace; // Explicitly specify color space of stored value. Usually `sRGB` or `linear` (default empty). +} texture_option_t; + +typedef struct { + std::string name; + + real_t ambient[3]; + real_t diffuse[3]; + real_t specular[3]; + real_t transmittance[3]; + real_t emission[3]; + real_t shininess; + real_t ior; // index of refraction + real_t dissolve; // 1 == opaque; 0 == fully transparent + // illumination model (see http://www.fileformat.info/format/material/) + int illum; + + int dummy; // Suppress padding warning. + + std::string ambient_texname; // map_Ka + std::string diffuse_texname; // map_Kd + std::string specular_texname; // map_Ks + std::string specular_highlight_texname; // map_Ns + std::string bump_texname; // map_bump, map_Bump, bump + std::string displacement_texname; // disp + std::string alpha_texname; // map_d + std::string reflection_texname; // refl + + texture_option_t ambient_texopt; + texture_option_t diffuse_texopt; + texture_option_t specular_texopt; + texture_option_t specular_highlight_texopt; + texture_option_t bump_texopt; + texture_option_t displacement_texopt; + texture_option_t alpha_texopt; + texture_option_t reflection_texopt; + + // PBR extension + // http://exocortex.com/blog/extending_wavefront_mtl_to_support_pbr + real_t roughness; // [0, 1] default 0 + real_t metallic; // [0, 1] default 0 + real_t sheen; // [0, 1] default 0 + real_t clearcoat_thickness; // [0, 1] default 0 + real_t clearcoat_roughness; // [0, 1] default 0 + real_t anisotropy; // aniso. [0, 1] default 0 + real_t anisotropy_rotation; // anisor. [0, 1] default 0 + real_t pad0; + std::string roughness_texname; // map_Pr + std::string metallic_texname; // map_Pm + std::string sheen_texname; // map_Ps + std::string emissive_texname; // map_Ke + std::string normal_texname; // norm. For normal mapping. + + texture_option_t roughness_texopt; + texture_option_t metallic_texopt; + texture_option_t sheen_texopt; + texture_option_t emissive_texopt; + texture_option_t normal_texopt; + + int pad2; + + std::map unknown_parameter; +} material_t; + +typedef struct { + std::string name; + + std::vector intValues; + std::vector floatValues; + std::vector stringValues; +} tag_t; + +// Index struct to support different indices for vtx/normal/texcoord. +// -1 means not used. +typedef struct { + int vertex_index; + int normal_index; + int texcoord_index; +} index_t; + +typedef struct { + std::vector indices; + std::vector num_face_vertices; // The number of vertices per + // face. 3 = polygon, 4 = quad, + // ... Up to 255. + std::vector material_ids; // per-face material ID + std::vector smoothing_group_ids; // per-face smoothing group + // ID(0 = off. positive value + // = group id) + std::vector tags; // SubD tag +} mesh_t; + +typedef struct { + std::vector indices; // pairs of indices for lines +} path_t; + +typedef struct { + std::string name; + mesh_t mesh; + path_t path; +} shape_t; + +// Vertex attributes +typedef struct { + std::vector vertices; // 'v' + std::vector normals; // 'vn' + std::vector texcoords; // 'vt' + std::vector colors; // extension: vertex colors +} attrib_t; + +typedef struct callback_t_ { + // W is optional and set to 1 if there is no `w` item in `v` line + void (*vertex_cb)(void *user_data, real_t x, real_t y, real_t z, real_t w); + void (*normal_cb)(void *user_data, real_t x, real_t y, real_t z); + + // y and z are optional and set to 0 if there is no `y` and/or `z` item(s) in + // `vt` line. + void (*texcoord_cb)(void *user_data, real_t x, real_t y, real_t z); + + // called per 'f' line. num_indices is the number of face indices(e.g. 3 for + // triangle, 4 for quad) + // 0 will be passed for undefined index in index_t members. + void (*index_cb)(void *user_data, index_t *indices, int num_indices); + // `name` material name, `material_id` = the array index of material_t[]. -1 + // if + // a material not found in .mtl + void (*usemtl_cb)(void *user_data, const char *name, int material_id); + // `materials` = parsed material data. + void (*mtllib_cb)(void *user_data, const material_t *materials, + int num_materials); + // There may be multiple group names + void (*group_cb)(void *user_data, const char **names, int num_names); + void (*object_cb)(void *user_data, const char *name); + + callback_t_() + : vertex_cb(NULL), + normal_cb(NULL), + texcoord_cb(NULL), + index_cb(NULL), + usemtl_cb(NULL), + mtllib_cb(NULL), + group_cb(NULL), + object_cb(NULL) {} +} callback_t; + +class MaterialReader { + public: + MaterialReader() {} + virtual ~MaterialReader(); + + virtual bool operator()(const std::string &matId, + std::vector *materials, + std::map *matMap, + std::string *err) = 0; +}; + +class MaterialFileReader : public MaterialReader { + public: + explicit MaterialFileReader(const std::string &mtl_basedir) + : m_mtlBaseDir(mtl_basedir) {} + virtual ~MaterialFileReader() {} + virtual bool operator()(const std::string &matId, + std::vector *materials, + std::map *matMap, std::string *err); + + private: + std::string m_mtlBaseDir; +}; + +class MaterialStreamReader : public MaterialReader { + public: + explicit MaterialStreamReader(std::istream &inStream) + : m_inStream(inStream) {} + virtual ~MaterialStreamReader() {} + virtual bool operator()(const std::string &matId, + std::vector *materials, + std::map *matMap, std::string *err); + + private: + std::istream &m_inStream; +}; + +/// Loads .obj from a file. +/// 'attrib', 'shapes' and 'materials' will be filled with parsed shape data +/// 'shapes' will be filled with parsed shape data +/// Returns true when loading .obj become success. +/// Returns warning and error message into `err` +/// 'mtl_basedir' is optional, and used for base directory for .mtl file. +/// In default(`NULL'), .mtl file is searched from an application's working +/// directory. +/// 'triangulate' is optional, and used whether triangulate polygon face in .obj +/// or not. +/// Option 'default_vcols_fallback' specifies whether vertex colors should +/// always be defined, even if no colors are given (fallback to white). +bool LoadObj(attrib_t *attrib, std::vector *shapes, + std::vector *materials, std::string *err, + const char *filename, const char *mtl_basedir = NULL, + bool triangulate = true, bool default_vcols_fallback = true); + +/// Loads .obj from a file with custom user callback. +/// .mtl is loaded as usual and parsed material_t data will be passed to +/// `callback.mtllib_cb`. +/// Returns true when loading .obj/.mtl become success. +/// Returns warning and error message into `err` +/// See `examples/callback_api/` for how to use this function. +bool LoadObjWithCallback(std::istream &inStream, const callback_t &callback, + void *user_data = NULL, + MaterialReader *readMatFn = NULL, + std::string *err = NULL); + +/// Loads object from a std::istream, uses GetMtlIStreamFn to retrieve +/// std::istream for materials. +/// Returns true when loading .obj become success. +/// Returns warning and error message into `err` +bool LoadObj(attrib_t *attrib, std::vector *shapes, + std::vector *materials, std::string *err, + std::istream *inStream, MaterialReader *readMatFn = NULL, + bool triangulate = true, bool default_vcols_fallback = true); + +/// Loads materials into std::map +void LoadMtl(std::map *material_map, + std::vector *materials, std::istream *inStream, + std::string *warning); + +} // namespace tinyobj + +#endif // TINY_OBJ_LOADER_H_ + +#ifdef TINYOBJLOADER_IMPLEMENTATION +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +namespace tinyobj { + +MaterialReader::~MaterialReader() {} + +struct vertex_index_t { + int v_idx, vt_idx, vn_idx; + vertex_index_t() : v_idx(-1), vt_idx(-1), vn_idx(-1) {} + explicit vertex_index_t(int idx) : v_idx(idx), vt_idx(idx), vn_idx(idx) {} + vertex_index_t(int vidx, int vtidx, int vnidx) + : v_idx(vidx), vt_idx(vtidx), vn_idx(vnidx) {} +}; + +// Internal data structure for face representation +// index + smoothing group. +struct face_t { + unsigned int + smoothing_group_id; // smoothing group id. 0 = smoothing groupd is off. + int pad_; + std::vector vertex_indices; // face vertex indices. + + face_t() : smoothing_group_id(0) {} +}; + +struct line_t { + int idx0; + int idx1; +}; + +struct tag_sizes { + tag_sizes() : num_ints(0), num_reals(0), num_strings(0) {} + int num_ints; + int num_reals; + int num_strings; +}; + +struct obj_shape { + std::vector v; + std::vector vn; + std::vector vt; +}; + +// See +// http://stackoverflow.com/questions/6089231/getting-std-ifstream-to-handle-lf-cr-and-crlf +static std::istream &safeGetline(std::istream &is, std::string &t) { + t.clear(); + + // The characters in the stream are read one-by-one using a std::streambuf. + // That is faster than reading them one-by-one using the std::istream. + // Code that uses streambuf this way must be guarded by a sentry object. + // The sentry object performs various tasks, + // such as thread synchronization and updating the stream state. + + std::istream::sentry se(is, true); + std::streambuf *sb = is.rdbuf(); + + if (se) { + for (;;) { + int c = sb->sbumpc(); + switch (c) { + case '\n': + return is; + case '\r': + if (sb->sgetc() == '\n') sb->sbumpc(); + return is; + case EOF: + // Also handle the case when the last line has no line ending + if (t.empty()) is.setstate(std::ios::eofbit); + return is; + default: + t += static_cast(c); + } + } + } + + return is; +} + +#define IS_SPACE(x) (((x) == ' ') || ((x) == '\t')) +#define IS_DIGIT(x) \ + (static_cast((x) - '0') < static_cast(10)) +#define IS_NEW_LINE(x) (((x) == '\r') || ((x) == '\n') || ((x) == '\0')) + +// Make index zero-base, and also support relative index. +static inline bool fixIndex(int idx, int n, int *ret) { + if (!ret) { + return false; + } + + if (idx > 0) { + (*ret) = idx - 1; + return true; + } + + if (idx == 0) { + // zero is not allowed according to the spec. + return false; + } + + if (idx < 0) { + (*ret) = n + idx; // negative value = relative + return true; + } + + return false; // never reach here. +} + +static inline std::string parseString(const char **token) { + std::string s; + (*token) += strspn((*token), " \t"); + size_t e = strcspn((*token), " \t\r"); + s = std::string((*token), &(*token)[e]); + (*token) += e; + return s; +} + +static inline int parseInt(const char **token) { + (*token) += strspn((*token), " \t"); + int i = atoi((*token)); + (*token) += strcspn((*token), " \t\r"); + return i; +} + +// Tries to parse a floating point number located at s. +// +// s_end should be a location in the string where reading should absolutely +// stop. For example at the end of the string, to prevent buffer overflows. +// +// Parses the following EBNF grammar: +// sign = "+" | "-" ; +// END = ? anything not in digit ? +// digit = "0" | "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9" ; +// integer = [sign] , digit , {digit} ; +// decimal = integer , ["." , integer] ; +// float = ( decimal , END ) | ( decimal , ("E" | "e") , integer , END ) ; +// +// Valid strings are for example: +// -0 +3.1417e+2 -0.0E-3 1.0324 -1.41 11e2 +// +// If the parsing is a success, result is set to the parsed value and true +// is returned. +// +// The function is greedy and will parse until any of the following happens: +// - a non-conforming character is encountered. +// - s_end is reached. +// +// The following situations triggers a failure: +// - s >= s_end. +// - parse failure. +// +static bool tryParseDouble(const char *s, const char *s_end, double *result) { + if (s >= s_end) { + return false; + } + + double mantissa = 0.0; + // This exponent is base 2 rather than 10. + // However the exponent we parse is supposed to be one of ten, + // thus we must take care to convert the exponent/and or the + // mantissa to a * 2^E, where a is the mantissa and E is the + // exponent. + // To get the final double we will use ldexp, it requires the + // exponent to be in base 2. + int exponent = 0; + + // NOTE: THESE MUST BE DECLARED HERE SINCE WE ARE NOT ALLOWED + // TO JUMP OVER DEFINITIONS. + char sign = '+'; + char exp_sign = '+'; + char const *curr = s; + + // How many characters were read in a loop. + int read = 0; + // Tells whether a loop terminated due to reaching s_end. + bool end_not_reached = false; + + /* + BEGIN PARSING. + */ + + // Find out what sign we've got. + if (*curr == '+' || *curr == '-') { + sign = *curr; + curr++; + } else if (IS_DIGIT(*curr)) { /* Pass through. */ + } else { + goto fail; + } + + // Read the integer part. + end_not_reached = (curr != s_end); + while (end_not_reached && IS_DIGIT(*curr)) { + mantissa *= 10; + mantissa += static_cast(*curr - 0x30); + curr++; + read++; + end_not_reached = (curr != s_end); + } + + // We must make sure we actually got something. + if (read == 0) goto fail; + // We allow numbers of form "#", "###" etc. + if (!end_not_reached) goto assemble; + + // Read the decimal part. + if (*curr == '.') { + curr++; + read = 1; + end_not_reached = (curr != s_end); + while (end_not_reached && IS_DIGIT(*curr)) { + static const double pow_lut[] = { + 1.0, 0.1, 0.01, 0.001, 0.0001, 0.00001, 0.000001, 0.0000001, + }; + const int lut_entries = sizeof pow_lut / sizeof pow_lut[0]; + + // NOTE: Don't use powf here, it will absolutely murder precision. + mantissa += static_cast(*curr - 0x30) * + (read < lut_entries ? pow_lut[read] : std::pow(10.0, -read)); + read++; + curr++; + end_not_reached = (curr != s_end); + } + } else if (*curr == 'e' || *curr == 'E') { + } else { + goto assemble; + } + + if (!end_not_reached) goto assemble; + + // Read the exponent part. + if (*curr == 'e' || *curr == 'E') { + curr++; + // Figure out if a sign is present and if it is. + end_not_reached = (curr != s_end); + if (end_not_reached && (*curr == '+' || *curr == '-')) { + exp_sign = *curr; + curr++; + } else if (IS_DIGIT(*curr)) { /* Pass through. */ + } else { + // Empty E is not allowed. + goto fail; + } + + read = 0; + end_not_reached = (curr != s_end); + while (end_not_reached && IS_DIGIT(*curr)) { + exponent *= 10; + exponent += static_cast(*curr - 0x30); + curr++; + read++; + end_not_reached = (curr != s_end); + } + exponent *= (exp_sign == '+' ? 1 : -1); + if (read == 0) goto fail; + } + +assemble: + *result = (sign == '+' ? 1 : -1) * + (exponent ? std::ldexp(mantissa * std::pow(5.0, exponent), exponent) + : mantissa); + return true; +fail: + return false; +} + +static inline real_t parseReal(const char **token, double default_value = 0.0) { + (*token) += strspn((*token), " \t"); + const char *end = (*token) + strcspn((*token), " \t\r"); + double val = default_value; + tryParseDouble((*token), end, &val); + real_t f = static_cast(val); + (*token) = end; + return f; +} + +static inline bool parseReal(const char **token, real_t *out) { + (*token) += strspn((*token), " \t"); + const char *end = (*token) + strcspn((*token), " \t\r"); + double val; + bool ret = tryParseDouble((*token), end, &val); + if (ret) { + real_t f = static_cast(val); + (*out) = f; + } + (*token) = end; + return ret; +} + +static inline void parseReal2(real_t *x, real_t *y, const char **token, + const double default_x = 0.0, + const double default_y = 0.0) { + (*x) = parseReal(token, default_x); + (*y) = parseReal(token, default_y); +} + +static inline void parseReal3(real_t *x, real_t *y, real_t *z, + const char **token, const double default_x = 0.0, + const double default_y = 0.0, + const double default_z = 0.0) { + (*x) = parseReal(token, default_x); + (*y) = parseReal(token, default_y); + (*z) = parseReal(token, default_z); +} + +static inline void parseV(real_t *x, real_t *y, real_t *z, real_t *w, + const char **token, const double default_x = 0.0, + const double default_y = 0.0, + const double default_z = 0.0, + const double default_w = 1.0) { + (*x) = parseReal(token, default_x); + (*y) = parseReal(token, default_y); + (*z) = parseReal(token, default_z); + (*w) = parseReal(token, default_w); +} + +// Extension: parse vertex with colors(6 items) +static inline bool parseVertexWithColor(real_t *x, real_t *y, real_t *z, + real_t *r, real_t *g, real_t *b, + const char **token, + const double default_x = 0.0, + const double default_y = 0.0, + const double default_z = 0.0) { + (*x) = parseReal(token, default_x); + (*y) = parseReal(token, default_y); + (*z) = parseReal(token, default_z); + + const bool found_color = parseReal(token, r) && parseReal(token, g) && parseReal(token, b); + + if (!found_color) { + (*r) = (*g) = (*b) = 1.0; + } + + return found_color; +} + +static inline bool parseOnOff(const char **token, bool default_value = true) { + (*token) += strspn((*token), " \t"); + const char *end = (*token) + strcspn((*token), " \t\r"); + + bool ret = default_value; + if ((0 == strncmp((*token), "on", 2))) { + ret = true; + } else if ((0 == strncmp((*token), "off", 3))) { + ret = false; + } + + (*token) = end; + return ret; +} + +static inline texture_type_t parseTextureType( + const char **token, texture_type_t default_value = TEXTURE_TYPE_NONE) { + (*token) += strspn((*token), " \t"); + const char *end = (*token) + strcspn((*token), " \t\r"); + texture_type_t ty = default_value; + + if ((0 == strncmp((*token), "cube_top", strlen("cube_top")))) { + ty = TEXTURE_TYPE_CUBE_TOP; + } else if ((0 == strncmp((*token), "cube_bottom", strlen("cube_bottom")))) { + ty = TEXTURE_TYPE_CUBE_BOTTOM; + } else if ((0 == strncmp((*token), "cube_left", strlen("cube_left")))) { + ty = TEXTURE_TYPE_CUBE_LEFT; + } else if ((0 == strncmp((*token), "cube_right", strlen("cube_right")))) { + ty = TEXTURE_TYPE_CUBE_RIGHT; + } else if ((0 == strncmp((*token), "cube_front", strlen("cube_front")))) { + ty = TEXTURE_TYPE_CUBE_FRONT; + } else if ((0 == strncmp((*token), "cube_back", strlen("cube_back")))) { + ty = TEXTURE_TYPE_CUBE_BACK; + } else if ((0 == strncmp((*token), "sphere", strlen("sphere")))) { + ty = TEXTURE_TYPE_SPHERE; + } + + (*token) = end; + return ty; +} + +static tag_sizes parseTagTriple(const char **token) { + tag_sizes ts; + + (*token) += strspn((*token), " \t"); + ts.num_ints = atoi((*token)); + (*token) += strcspn((*token), "/ \t\r"); + if ((*token)[0] != '/') { + return ts; + } + + (*token)++; // Skip '/' + + (*token) += strspn((*token), " \t"); + ts.num_reals = atoi((*token)); + (*token) += strcspn((*token), "/ \t\r"); + if ((*token)[0] != '/') { + return ts; + } + (*token)++; // Skip '/' + + ts.num_strings = parseInt(token); + + return ts; +} + +// Parse triples with index offsets: i, i/j/k, i//k, i/j +static bool parseTriple(const char **token, int vsize, int vnsize, int vtsize, + vertex_index_t *ret) { + if (!ret) { + return false; + } + + vertex_index_t vi(-1); + + if (!fixIndex(atoi((*token)), vsize, &(vi.v_idx))) { + return false; + } + + (*token) += strcspn((*token), "/ \t\r"); + if ((*token)[0] != '/') { + (*ret) = vi; + return true; + } + (*token)++; + + // i//k + if ((*token)[0] == '/') { + (*token)++; + if (!fixIndex(atoi((*token)), vnsize, &(vi.vn_idx))) { + return false; + } + (*token) += strcspn((*token), "/ \t\r"); + (*ret) = vi; + return true; + } + + // i/j/k or i/j + if (!fixIndex(atoi((*token)), vtsize, &(vi.vt_idx))) { + return false; + } + + (*token) += strcspn((*token), "/ \t\r"); + if ((*token)[0] != '/') { + (*ret) = vi; + return true; + } + + // i/j/k + (*token)++; // skip '/' + if (!fixIndex(atoi((*token)), vnsize, &(vi.vn_idx))) { + return false; + } + (*token) += strcspn((*token), "/ \t\r"); + + (*ret) = vi; + + return true; +} + +// Parse raw triples: i, i/j/k, i//k, i/j +static vertex_index_t parseRawTriple(const char **token) { + vertex_index_t vi(static_cast(0)); // 0 is an invalid index in OBJ + + vi.v_idx = atoi((*token)); + (*token) += strcspn((*token), "/ \t\r"); + if ((*token)[0] != '/') { + return vi; + } + (*token)++; + + // i//k + if ((*token)[0] == '/') { + (*token)++; + vi.vn_idx = atoi((*token)); + (*token) += strcspn((*token), "/ \t\r"); + return vi; + } + + // i/j/k or i/j + vi.vt_idx = atoi((*token)); + (*token) += strcspn((*token), "/ \t\r"); + if ((*token)[0] != '/') { + return vi; + } + + // i/j/k + (*token)++; // skip '/' + vi.vn_idx = atoi((*token)); + (*token) += strcspn((*token), "/ \t\r"); + return vi; +} + +static bool ParseTextureNameAndOption(std::string *texname, + texture_option_t *texopt, + const char *linebuf, const bool is_bump) { + // @todo { write more robust lexer and parser. } + bool found_texname = false; + std::string texture_name; + + // Fill with default value for texopt. + if (is_bump) { + texopt->imfchan = 'l'; + } else { + texopt->imfchan = 'm'; + } + texopt->bump_multiplier = static_cast(1.0); + texopt->clamp = false; + texopt->blendu = true; + texopt->blendv = true; + texopt->sharpness = static_cast(1.0); + texopt->brightness = static_cast(0.0); + texopt->contrast = static_cast(1.0); + texopt->origin_offset[0] = static_cast(0.0); + texopt->origin_offset[1] = static_cast(0.0); + texopt->origin_offset[2] = static_cast(0.0); + texopt->scale[0] = static_cast(1.0); + texopt->scale[1] = static_cast(1.0); + texopt->scale[2] = static_cast(1.0); + texopt->turbulence[0] = static_cast(0.0); + texopt->turbulence[1] = static_cast(0.0); + texopt->turbulence[2] = static_cast(0.0); + texopt->type = TEXTURE_TYPE_NONE; + + const char *token = linebuf; // Assume line ends with NULL + + while (!IS_NEW_LINE((*token))) { + token += strspn(token, " \t"); // skip space + if ((0 == strncmp(token, "-blendu", 7)) && IS_SPACE((token[7]))) { + token += 8; + texopt->blendu = parseOnOff(&token, /* default */ true); + } else if ((0 == strncmp(token, "-blendv", 7)) && IS_SPACE((token[7]))) { + token += 8; + texopt->blendv = parseOnOff(&token, /* default */ true); + } else if ((0 == strncmp(token, "-clamp", 6)) && IS_SPACE((token[6]))) { + token += 7; + texopt->clamp = parseOnOff(&token, /* default */ true); + } else if ((0 == strncmp(token, "-boost", 6)) && IS_SPACE((token[6]))) { + token += 7; + texopt->sharpness = parseReal(&token, 1.0); + } else if ((0 == strncmp(token, "-bm", 3)) && IS_SPACE((token[3]))) { + token += 4; + texopt->bump_multiplier = parseReal(&token, 1.0); + } else if ((0 == strncmp(token, "-o", 2)) && IS_SPACE((token[2]))) { + token += 3; + parseReal3(&(texopt->origin_offset[0]), &(texopt->origin_offset[1]), + &(texopt->origin_offset[2]), &token); + } else if ((0 == strncmp(token, "-s", 2)) && IS_SPACE((token[2]))) { + token += 3; + parseReal3(&(texopt->scale[0]), &(texopt->scale[1]), &(texopt->scale[2]), + &token, 1.0, 1.0, 1.0); + } else if ((0 == strncmp(token, "-t", 2)) && IS_SPACE((token[2]))) { + token += 3; + parseReal3(&(texopt->turbulence[0]), &(texopt->turbulence[1]), + &(texopt->turbulence[2]), &token); + } else if ((0 == strncmp(token, "-type", 5)) && IS_SPACE((token[5]))) { + token += 5; + texopt->type = parseTextureType((&token), TEXTURE_TYPE_NONE); + } else if ((0 == strncmp(token, "-imfchan", 8)) && IS_SPACE((token[8]))) { + token += 9; + token += strspn(token, " \t"); + const char *end = token + strcspn(token, " \t\r"); + if ((end - token) == 1) { // Assume one char for -imfchan + texopt->imfchan = (*token); + } + token = end; + } else if ((0 == strncmp(token, "-mm", 3)) && IS_SPACE((token[3]))) { + token += 4; + parseReal2(&(texopt->brightness), &(texopt->contrast), &token, 0.0, 1.0); + } else if ((0 == strncmp(token, "-colorspace", 11)) && IS_SPACE((token[11]))) { + token += 12; + texopt->colorspace = parseString(&token); + } else { + // Assume texture filename +#if 0 + size_t len = strcspn(token, " \t\r"); // untile next space + texture_name = std::string(token, token + len); + token += len; + + token += strspn(token, " \t"); // skip space +#else + // Read filename until line end to parse filename containing whitespace + // TODO(syoyo): Support parsing texture option flag after the filename. + texture_name = std::string(token); + token += texture_name.length(); +#endif + + found_texname = true; + } + } + + if (found_texname) { + (*texname) = texture_name; + return true; + } else { + return false; + } +} + +static void InitMaterial(material_t *material) { + material->name = ""; + material->ambient_texname = ""; + material->diffuse_texname = ""; + material->specular_texname = ""; + material->specular_highlight_texname = ""; + material->bump_texname = ""; + material->displacement_texname = ""; + material->reflection_texname = ""; + material->alpha_texname = ""; + for (int i = 0; i < 3; i++) { + material->ambient[i] = static_cast(0.0); + material->diffuse[i] = static_cast(0.0); + material->specular[i] = static_cast(0.0); + material->transmittance[i] = static_cast(0.0); + material->emission[i] = static_cast(0.0); + } + material->illum = 0; + material->dissolve = static_cast(1.0); + material->shininess = static_cast(1.0); + material->ior = static_cast(1.0); + + material->roughness = static_cast(0.0); + material->metallic = static_cast(0.0); + material->sheen = static_cast(0.0); + material->clearcoat_thickness = static_cast(0.0); + material->clearcoat_roughness = static_cast(0.0); + material->anisotropy_rotation = static_cast(0.0); + material->anisotropy = static_cast(0.0); + material->roughness_texname = ""; + material->metallic_texname = ""; + material->sheen_texname = ""; + material->emissive_texname = ""; + material->normal_texname = ""; + + material->unknown_parameter.clear(); +} + +// code from https://wrf.ecse.rpi.edu//Research/Short_Notes/pnpoly.html +template +static int pnpoly(int nvert, T *vertx, T *verty, T testx, T testy) { + int i, j, c = 0; + for (i = 0, j = nvert - 1; i < nvert; j = i++) { + if (((verty[i] > testy) != (verty[j] > testy)) && + (testx < + (vertx[j] - vertx[i]) * (testy - verty[i]) / (verty[j] - verty[i]) + + vertx[i])) + c = !c; + } + return c; +} + +// TODO(syoyo): refactor function. +static bool exportGroupsToShape(shape_t *shape, + const std::vector &faceGroup, + std::vector &lineGroup, + const std::vector &tags, + const int material_id, const std::string &name, + bool triangulate, + const std::vector &v) { + if (faceGroup.empty() && lineGroup.empty()) { + return false; + } + + if (!faceGroup.empty()) { + // Flatten vertices and indices + for (size_t i = 0; i < faceGroup.size(); i++) { + const face_t &face = faceGroup[i]; + + size_t npolys = face.vertex_indices.size(); + + if (npolys < 3) { + // Face must have 3+ vertices. + continue; + } + + vertex_index_t i0 = face.vertex_indices[0]; + vertex_index_t i1(-1); + vertex_index_t i2 = face.vertex_indices[1]; + + if (triangulate) { + // find the two axes to work in + size_t axes[2] = {1, 2}; + for (size_t k = 0; k < npolys; ++k) { + i0 = face.vertex_indices[(k + 0) % npolys]; + i1 = face.vertex_indices[(k + 1) % npolys]; + i2 = face.vertex_indices[(k + 2) % npolys]; + size_t vi0 = size_t(i0.v_idx); + size_t vi1 = size_t(i1.v_idx); + size_t vi2 = size_t(i2.v_idx); + + if (((3 * vi0 + 2) >= v.size()) || ((3 * vi1 + 2) >= v.size()) || + ((3 * vi2 + 2) >= v.size())) { + // Invalid triangle. + // FIXME(syoyo): Is it ok to simply skip this invalid triangle? + continue; + } + real_t v0x = v[vi0 * 3 + 0]; + real_t v0y = v[vi0 * 3 + 1]; + real_t v0z = v[vi0 * 3 + 2]; + real_t v1x = v[vi1 * 3 + 0]; + real_t v1y = v[vi1 * 3 + 1]; + real_t v1z = v[vi1 * 3 + 2]; + real_t v2x = v[vi2 * 3 + 0]; + real_t v2y = v[vi2 * 3 + 1]; + real_t v2z = v[vi2 * 3 + 2]; + real_t e0x = v1x - v0x; + real_t e0y = v1y - v0y; + real_t e0z = v1z - v0z; + real_t e1x = v2x - v1x; + real_t e1y = v2y - v1y; + real_t e1z = v2z - v1z; + real_t cx = std::fabs(e0y * e1z - e0z * e1y); + real_t cy = std::fabs(e0z * e1x - e0x * e1z); + real_t cz = std::fabs(e0x * e1y - e0y * e1x); + const real_t epsilon = std::numeric_limits::epsilon(); + if (cx > epsilon || cy > epsilon || cz > epsilon) { + // found a corner + if (cx > cy && cx > cz) { + } else { + axes[0] = 0; + if (cz > cx && cz > cy) axes[1] = 1; + } + break; + } + } + + real_t area = 0; + for (size_t k = 0; k < npolys; ++k) { + i0 = face.vertex_indices[(k + 0) % npolys]; + i1 = face.vertex_indices[(k + 1) % npolys]; + size_t vi0 = size_t(i0.v_idx); + size_t vi1 = size_t(i1.v_idx); + if (((vi0 * 3 + axes[0]) >= v.size()) || + ((vi0 * 3 + axes[1]) >= v.size()) || + ((vi1 * 3 + axes[0]) >= v.size()) || + ((vi1 * 3 + axes[1]) >= v.size())) { + // Invalid index. + continue; + } + real_t v0x = v[vi0 * 3 + axes[0]]; + real_t v0y = v[vi0 * 3 + axes[1]]; + real_t v1x = v[vi1 * 3 + axes[0]]; + real_t v1y = v[vi1 * 3 + axes[1]]; + area += (v0x * v1y - v0y * v1x) * static_cast(0.5); + } + + int maxRounds = 10; // arbitrary max loop count to protect against + // unexpected errors + + face_t remainingFace = face; // copy + size_t guess_vert = 0; + vertex_index_t ind[3]; + real_t vx[3]; + real_t vy[3]; + while (remainingFace.vertex_indices.size() > 3 && maxRounds > 0) { + npolys = remainingFace.vertex_indices.size(); + if (guess_vert >= npolys) { + maxRounds -= 1; + guess_vert -= npolys; + } + for (size_t k = 0; k < 3; k++) { + ind[k] = remainingFace.vertex_indices[(guess_vert + k) % npolys]; + size_t vi = size_t(ind[k].v_idx); + if (((vi * 3 + axes[0]) >= v.size()) || + ((vi * 3 + axes[1]) >= v.size())) { + // ??? + vx[k] = static_cast(0.0); + vy[k] = static_cast(0.0); + } else { + vx[k] = v[vi * 3 + axes[0]]; + vy[k] = v[vi * 3 + axes[1]]; + } + } + real_t e0x = vx[1] - vx[0]; + real_t e0y = vy[1] - vy[0]; + real_t e1x = vx[2] - vx[1]; + real_t e1y = vy[2] - vy[1]; + real_t cross = e0x * e1y - e0y * e1x; + // if an internal angle + if (cross * area < static_cast(0.0)) { + guess_vert += 1; + continue; + } + + // check all other verts in case they are inside this triangle + bool overlap = false; + for (size_t otherVert = 3; otherVert < npolys; ++otherVert) { + size_t idx = (guess_vert + otherVert) % npolys; + + if (idx >= remainingFace.vertex_indices.size()) { + // ??? + continue; + } + + size_t ovi = size_t(remainingFace.vertex_indices[idx].v_idx); + + if (((ovi * 3 + axes[0]) >= v.size()) || + ((ovi * 3 + axes[1]) >= v.size())) { + // ??? + continue; + } + real_t tx = v[ovi * 3 + axes[0]]; + real_t ty = v[ovi * 3 + axes[1]]; + if (pnpoly(3, vx, vy, tx, ty)) { + overlap = true; + break; + } + } + + if (overlap) { + guess_vert += 1; + continue; + } + + // this triangle is an ear + { + index_t idx0, idx1, idx2; + idx0.vertex_index = ind[0].v_idx; + idx0.normal_index = ind[0].vn_idx; + idx0.texcoord_index = ind[0].vt_idx; + idx1.vertex_index = ind[1].v_idx; + idx1.normal_index = ind[1].vn_idx; + idx1.texcoord_index = ind[1].vt_idx; + idx2.vertex_index = ind[2].v_idx; + idx2.normal_index = ind[2].vn_idx; + idx2.texcoord_index = ind[2].vt_idx; + + shape->mesh.indices.push_back(idx0); + shape->mesh.indices.push_back(idx1); + shape->mesh.indices.push_back(idx2); + + shape->mesh.num_face_vertices.push_back(3); + shape->mesh.material_ids.push_back(material_id); + shape->mesh.smoothing_group_ids.push_back(face.smoothing_group_id); + } + + // remove v1 from the list + size_t removed_vert_index = (guess_vert + 1) % npolys; + while (removed_vert_index + 1 < npolys) { + remainingFace.vertex_indices[removed_vert_index] = + remainingFace.vertex_indices[removed_vert_index + 1]; + removed_vert_index += 1; + } + remainingFace.vertex_indices.pop_back(); + } + + if (remainingFace.vertex_indices.size() == 3) { + i0 = remainingFace.vertex_indices[0]; + i1 = remainingFace.vertex_indices[1]; + i2 = remainingFace.vertex_indices[2]; + { + index_t idx0, idx1, idx2; + idx0.vertex_index = i0.v_idx; + idx0.normal_index = i0.vn_idx; + idx0.texcoord_index = i0.vt_idx; + idx1.vertex_index = i1.v_idx; + idx1.normal_index = i1.vn_idx; + idx1.texcoord_index = i1.vt_idx; + idx2.vertex_index = i2.v_idx; + idx2.normal_index = i2.vn_idx; + idx2.texcoord_index = i2.vt_idx; + + shape->mesh.indices.push_back(idx0); + shape->mesh.indices.push_back(idx1); + shape->mesh.indices.push_back(idx2); + + shape->mesh.num_face_vertices.push_back(3); + shape->mesh.material_ids.push_back(material_id); + shape->mesh.smoothing_group_ids.push_back(face.smoothing_group_id); + } + } + } else { + for (size_t k = 0; k < npolys; k++) { + index_t idx; + idx.vertex_index = face.vertex_indices[k].v_idx; + idx.normal_index = face.vertex_indices[k].vn_idx; + idx.texcoord_index = face.vertex_indices[k].vt_idx; + shape->mesh.indices.push_back(idx); + } + + shape->mesh.num_face_vertices.push_back( + static_cast(npolys)); + shape->mesh.material_ids.push_back(material_id); // per face + shape->mesh.smoothing_group_ids.push_back( + face.smoothing_group_id); // per face + } + } + + shape->name = name; + shape->mesh.tags = tags; + } + + if (!lineGroup.empty()) { + shape->path.indices.swap(lineGroup); + } + + return true; +} + +// Split a string with specified delimiter character. +// http://stackoverflow.com/questions/236129/split-a-string-in-c +static void SplitString(const std::string &s, char delim, + std::vector &elems) { + std::stringstream ss; + ss.str(s); + std::string item; + while (std::getline(ss, item, delim)) { + elems.push_back(item); + } +} + +void LoadMtl(std::map *material_map, + std::vector *materials, std::istream *inStream, + std::string *warning) { + // Create a default material anyway. + material_t material; + InitMaterial(&material); + + // Issue 43. `d` wins against `Tr` since `Tr` is not in the MTL specification. + bool has_d = false; + bool has_tr = false; + + std::stringstream ss; + + std::string linebuf; + while (inStream->peek() != -1) { + safeGetline(*inStream, linebuf); + + // Trim trailing whitespace. + if (linebuf.size() > 0) { + linebuf = linebuf.substr(0, linebuf.find_last_not_of(" \t") + 1); + } + + // Trim newline '\r\n' or '\n' + if (linebuf.size() > 0) { + if (linebuf[linebuf.size() - 1] == '\n') + linebuf.erase(linebuf.size() - 1); + } + if (linebuf.size() > 0) { + if (linebuf[linebuf.size() - 1] == '\r') + linebuf.erase(linebuf.size() - 1); + } + + // Skip if empty line. + if (linebuf.empty()) { + continue; + } + + // Skip leading space. + const char *token = linebuf.c_str(); + token += strspn(token, " \t"); + + assert(token); + if (token[0] == '\0') continue; // empty line + + if (token[0] == '#') continue; // comment line + + // new mtl + if ((0 == strncmp(token, "newmtl", 6)) && IS_SPACE((token[6]))) { + // flush previous material. + if (!material.name.empty()) { + material_map->insert(std::pair( + material.name, static_cast(materials->size()))); + materials->push_back(material); + } + + // initial temporary material + InitMaterial(&material); + + has_d = false; + has_tr = false; + + // set new mtl name + token += 7; + { + std::stringstream sstr; + sstr << token; + material.name = sstr.str(); + } + continue; + } + + // ambient + if (token[0] == 'K' && token[1] == 'a' && IS_SPACE((token[2]))) { + token += 2; + real_t r, g, b; + parseReal3(&r, &g, &b, &token); + material.ambient[0] = r; + material.ambient[1] = g; + material.ambient[2] = b; + continue; + } + + // diffuse + if (token[0] == 'K' && token[1] == 'd' && IS_SPACE((token[2]))) { + token += 2; + real_t r, g, b; + parseReal3(&r, &g, &b, &token); + material.diffuse[0] = r; + material.diffuse[1] = g; + material.diffuse[2] = b; + continue; + } + + // specular + if (token[0] == 'K' && token[1] == 's' && IS_SPACE((token[2]))) { + token += 2; + real_t r, g, b; + parseReal3(&r, &g, &b, &token); + material.specular[0] = r; + material.specular[1] = g; + material.specular[2] = b; + continue; + } + + // transmittance + if ((token[0] == 'K' && token[1] == 't' && IS_SPACE((token[2]))) || + (token[0] == 'T' && token[1] == 'f' && IS_SPACE((token[2])))) { + token += 2; + real_t r, g, b; + parseReal3(&r, &g, &b, &token); + material.transmittance[0] = r; + material.transmittance[1] = g; + material.transmittance[2] = b; + continue; + } + + // ior(index of refraction) + if (token[0] == 'N' && token[1] == 'i' && IS_SPACE((token[2]))) { + token += 2; + material.ior = parseReal(&token); + continue; + } + + // emission + if (token[0] == 'K' && token[1] == 'e' && IS_SPACE(token[2])) { + token += 2; + real_t r, g, b; + parseReal3(&r, &g, &b, &token); + material.emission[0] = r; + material.emission[1] = g; + material.emission[2] = b; + continue; + } + + // shininess + if (token[0] == 'N' && token[1] == 's' && IS_SPACE(token[2])) { + token += 2; + material.shininess = parseReal(&token); + continue; + } + + // illum model + if (0 == strncmp(token, "illum", 5) && IS_SPACE(token[5])) { + token += 6; + material.illum = parseInt(&token); + continue; + } + + // dissolve + if ((token[0] == 'd' && IS_SPACE(token[1]))) { + token += 1; + material.dissolve = parseReal(&token); + + if (has_tr) { + ss << "WARN: Both `d` and `Tr` parameters defined for \"" + << material.name << "\". Use the value of `d` for dissolve." + << std::endl; + } + has_d = true; + continue; + } + if (token[0] == 'T' && token[1] == 'r' && IS_SPACE(token[2])) { + token += 2; + if (has_d) { + // `d` wins. Ignore `Tr` value. + ss << "WARN: Both `d` and `Tr` parameters defined for \"" + << material.name << "\". Use the value of `d` for dissolve." + << std::endl; + } else { + // We invert value of Tr(assume Tr is in range [0, 1]) + // NOTE: Interpretation of Tr is application(exporter) dependent. For + // some application(e.g. 3ds max obj exporter), Tr = d(Issue 43) + material.dissolve = static_cast(1.0) - parseReal(&token); + } + has_tr = true; + continue; + } + + // PBR: roughness + if (token[0] == 'P' && token[1] == 'r' && IS_SPACE(token[2])) { + token += 2; + material.roughness = parseReal(&token); + continue; + } + + // PBR: metallic + if (token[0] == 'P' && token[1] == 'm' && IS_SPACE(token[2])) { + token += 2; + material.metallic = parseReal(&token); + continue; + } + + // PBR: sheen + if (token[0] == 'P' && token[1] == 's' && IS_SPACE(token[2])) { + token += 2; + material.sheen = parseReal(&token); + continue; + } + + // PBR: clearcoat thickness + if (token[0] == 'P' && token[1] == 'c' && IS_SPACE(token[2])) { + token += 2; + material.clearcoat_thickness = parseReal(&token); + continue; + } + + // PBR: clearcoat roughness + if ((0 == strncmp(token, "Pcr", 3)) && IS_SPACE(token[3])) { + token += 4; + material.clearcoat_roughness = parseReal(&token); + continue; + } + + // PBR: anisotropy + if ((0 == strncmp(token, "aniso", 5)) && IS_SPACE(token[5])) { + token += 6; + material.anisotropy = parseReal(&token); + continue; + } + + // PBR: anisotropy rotation + if ((0 == strncmp(token, "anisor", 6)) && IS_SPACE(token[6])) { + token += 7; + material.anisotropy_rotation = parseReal(&token); + continue; + } + + // ambient texture + if ((0 == strncmp(token, "map_Ka", 6)) && IS_SPACE(token[6])) { + token += 7; + ParseTextureNameAndOption(&(material.ambient_texname), + &(material.ambient_texopt), token, + /* is_bump */ false); + continue; + } + + // diffuse texture + if ((0 == strncmp(token, "map_Kd", 6)) && IS_SPACE(token[6])) { + token += 7; + ParseTextureNameAndOption(&(material.diffuse_texname), + &(material.diffuse_texopt), token, + /* is_bump */ false); + continue; + } + + // specular texture + if ((0 == strncmp(token, "map_Ks", 6)) && IS_SPACE(token[6])) { + token += 7; + ParseTextureNameAndOption(&(material.specular_texname), + &(material.specular_texopt), token, + /* is_bump */ false); + continue; + } + + // specular highlight texture + if ((0 == strncmp(token, "map_Ns", 6)) && IS_SPACE(token[6])) { + token += 7; + ParseTextureNameAndOption(&(material.specular_highlight_texname), + &(material.specular_highlight_texopt), token, + /* is_bump */ false); + continue; + } + + // bump texture + if ((0 == strncmp(token, "map_bump", 8)) && IS_SPACE(token[8])) { + token += 9; + ParseTextureNameAndOption(&(material.bump_texname), + &(material.bump_texopt), token, + /* is_bump */ true); + continue; + } + + // bump texture + if ((0 == strncmp(token, "map_Bump", 8)) && IS_SPACE(token[8])) { + token += 9; + ParseTextureNameAndOption(&(material.bump_texname), + &(material.bump_texopt), token, + /* is_bump */ true); + continue; + } + + // bump texture + if ((0 == strncmp(token, "bump", 4)) && IS_SPACE(token[4])) { + token += 5; + ParseTextureNameAndOption(&(material.bump_texname), + &(material.bump_texopt), token, + /* is_bump */ true); + continue; + } + + // alpha texture + if ((0 == strncmp(token, "map_d", 5)) && IS_SPACE(token[5])) { + token += 6; + material.alpha_texname = token; + ParseTextureNameAndOption(&(material.alpha_texname), + &(material.alpha_texopt), token, + /* is_bump */ false); + continue; + } + + // displacement texture + if ((0 == strncmp(token, "disp", 4)) && IS_SPACE(token[4])) { + token += 5; + ParseTextureNameAndOption(&(material.displacement_texname), + &(material.displacement_texopt), token, + /* is_bump */ false); + continue; + } + + // reflection map + if ((0 == strncmp(token, "refl", 4)) && IS_SPACE(token[4])) { + token += 5; + ParseTextureNameAndOption(&(material.reflection_texname), + &(material.reflection_texopt), token, + /* is_bump */ false); + continue; + } + + // PBR: roughness texture + if ((0 == strncmp(token, "map_Pr", 6)) && IS_SPACE(token[6])) { + token += 7; + ParseTextureNameAndOption(&(material.roughness_texname), + &(material.roughness_texopt), token, + /* is_bump */ false); + continue; + } + + // PBR: metallic texture + if ((0 == strncmp(token, "map_Pm", 6)) && IS_SPACE(token[6])) { + token += 7; + ParseTextureNameAndOption(&(material.metallic_texname), + &(material.metallic_texopt), token, + /* is_bump */ false); + continue; + } + + // PBR: sheen texture + if ((0 == strncmp(token, "map_Ps", 6)) && IS_SPACE(token[6])) { + token += 7; + ParseTextureNameAndOption(&(material.sheen_texname), + &(material.sheen_texopt), token, + /* is_bump */ false); + continue; + } + + // PBR: emissive texture + if ((0 == strncmp(token, "map_Ke", 6)) && IS_SPACE(token[6])) { + token += 7; + ParseTextureNameAndOption(&(material.emissive_texname), + &(material.emissive_texopt), token, + /* is_bump */ false); + continue; + } + + // PBR: normal map texture + if ((0 == strncmp(token, "norm", 4)) && IS_SPACE(token[4])) { + token += 5; + ParseTextureNameAndOption( + &(material.normal_texname), &(material.normal_texopt), token, + /* is_bump */ false); // @fixme { is_bump will be true? } + continue; + } + + // unknown parameter + const char *_space = strchr(token, ' '); + if (!_space) { + _space = strchr(token, '\t'); + } + if (_space) { + std::ptrdiff_t len = _space - token; + std::string key(token, static_cast(len)); + std::string value = _space + 1; + material.unknown_parameter.insert( + std::pair(key, value)); + } + } + // flush last material. + material_map->insert(std::pair( + material.name, static_cast(materials->size()))); + materials->push_back(material); + + if (warning) { + (*warning) = ss.str(); + } +} + +bool MaterialFileReader::operator()(const std::string &matId, + std::vector *materials, + std::map *matMap, + std::string *err) { + std::string filepath; + + if (!m_mtlBaseDir.empty()) { + filepath = std::string(m_mtlBaseDir) + matId; + } else { + filepath = matId; + } + + std::ifstream matIStream(filepath.c_str()); + if (!matIStream) { + std::stringstream ss; + ss << "WARN: Material file [ " << filepath << " ] not found." << std::endl; + if (err) { + (*err) += ss.str(); + } + return false; + } + + std::string warning; + LoadMtl(matMap, materials, &matIStream, &warning); + + if (!warning.empty()) { + if (err) { + (*err) += warning; + } + } + + return true; +} + +bool MaterialStreamReader::operator()(const std::string &matId, + std::vector *materials, + std::map *matMap, + std::string *err) { + (void)matId; + if (!m_inStream) { + std::stringstream ss; + ss << "WARN: Material stream in error state. " << std::endl; + if (err) { + (*err) += ss.str(); + } + return false; + } + + std::string warning; + LoadMtl(matMap, materials, &m_inStream, &warning); + + if (!warning.empty()) { + if (err) { + (*err) += warning; + } + } + + return true; +} + +bool LoadObj(attrib_t *attrib, std::vector *shapes, + std::vector *materials, std::string *err, + const char *filename, const char *mtl_basedir, + bool trianglulate, bool default_vcols_fallback) { + attrib->vertices.clear(); + attrib->normals.clear(); + attrib->texcoords.clear(); + attrib->colors.clear(); + shapes->clear(); + + std::stringstream errss; + + std::ifstream ifs(filename); + if (!ifs) { + errss << "Cannot open file [" << filename << "]" << std::endl; + if (err) { + (*err) = errss.str(); + } + return false; + } + + std::string baseDir = mtl_basedir ? mtl_basedir : ""; + if (!baseDir.empty()) { +#ifndef _WIN32 + const char dirsep = '/'; +#else + const char dirsep = '\\'; +#endif + if (baseDir[baseDir.length() - 1] != dirsep) baseDir += dirsep; + } + MaterialFileReader matFileReader(baseDir); + + return LoadObj(attrib, shapes, materials, err, &ifs, &matFileReader, + trianglulate, default_vcols_fallback); +} + +bool LoadObj(attrib_t *attrib, std::vector *shapes, + std::vector *materials, std::string *err, + std::istream *inStream, MaterialReader *readMatFn /*= NULL*/, + bool triangulate, bool default_vcols_fallback) { + std::stringstream errss; + + std::vector v; + std::vector vn; + std::vector vt; + std::vector vc; + std::vector tags; + std::vector faceGroup; + std::vector lineGroup; + std::string name; + + // material + std::map material_map; + int material = -1; + + // smoothing group id + unsigned int current_smoothing_id = + 0; // Initial value. 0 means no smoothing. + + int greatest_v_idx = -1; + int greatest_vn_idx = -1; + int greatest_vt_idx = -1; + + shape_t shape; + + bool found_all_colors = true; + + size_t line_num = 0; + std::string linebuf; + while (inStream->peek() != -1) { + safeGetline(*inStream, linebuf); + + line_num++; + + // Trim newline '\r\n' or '\n' + if (linebuf.size() > 0) { + if (linebuf[linebuf.size() - 1] == '\n') + linebuf.erase(linebuf.size() - 1); + } + if (linebuf.size() > 0) { + if (linebuf[linebuf.size() - 1] == '\r') + linebuf.erase(linebuf.size() - 1); + } + + // Skip if empty line. + if (linebuf.empty()) { + continue; + } + + // Skip leading space. + const char *token = linebuf.c_str(); + token += strspn(token, " \t"); + + assert(token); + if (token[0] == '\0') continue; // empty line + + if (token[0] == '#') continue; // comment line + + // vertex + if (token[0] == 'v' && IS_SPACE((token[1]))) { + token += 2; + real_t x, y, z; + real_t r, g, b; + + found_all_colors &= parseVertexWithColor(&x, &y, &z, &r, &g, &b, &token); + + v.push_back(x); + v.push_back(y); + v.push_back(z); + + if (found_all_colors || default_vcols_fallback) { + vc.push_back(r); + vc.push_back(g); + vc.push_back(b); + } + + continue; + } + + // normal + if (token[0] == 'v' && token[1] == 'n' && IS_SPACE((token[2]))) { + token += 3; + real_t x, y, z; + parseReal3(&x, &y, &z, &token); + vn.push_back(x); + vn.push_back(y); + vn.push_back(z); + continue; + } + + // texcoord + if (token[0] == 'v' && token[1] == 't' && IS_SPACE((token[2]))) { + token += 3; + real_t x, y; + parseReal2(&x, &y, &token); + vt.push_back(x); + vt.push_back(y); + continue; + } + + // line + if (token[0] == 'l' && IS_SPACE((token[1]))) { + token += 2; + + line_t line_cache; + bool end_line_bit = 0; + while (!IS_NEW_LINE(token[0])) { + // get index from string + int idx; + fixIndex(parseInt(&token), 0, &idx); + + size_t n = strspn(token, " \t\r"); + token += n; + + if (!end_line_bit) { + line_cache.idx0 = idx; + } else { + line_cache.idx1 = idx; + lineGroup.push_back(line_cache.idx0); + lineGroup.push_back(line_cache.idx1); + line_cache = line_t(); + } + end_line_bit = !end_line_bit; + } + + continue; + } + // face + if (token[0] == 'f' && IS_SPACE((token[1]))) { + token += 2; + token += strspn(token, " \t"); + + face_t face; + + face.smoothing_group_id = current_smoothing_id; + face.vertex_indices.reserve(3); + + while (!IS_NEW_LINE(token[0])) { + vertex_index_t vi; + if (!parseTriple(&token, static_cast(v.size() / 3), + static_cast(vn.size() / 3), + static_cast(vt.size() / 2), &vi)) { + if (err) { + (*err) = "Failed parse `f' line(e.g. zero value for face index).\n"; + } + return false; + } + + greatest_v_idx = greatest_v_idx > vi.v_idx ? greatest_v_idx : vi.v_idx; + greatest_vn_idx = greatest_vn_idx > vi.vn_idx ? greatest_vn_idx : vi.vn_idx; + greatest_vt_idx = greatest_vt_idx > vi.vt_idx ? greatest_vt_idx : vi.vt_idx; + + face.vertex_indices.push_back(vi); + size_t n = strspn(token, " \t\r"); + token += n; + } + + // replace with emplace_back + std::move on C++11 + faceGroup.push_back(face); + + continue; + } + + // use mtl + if ((0 == strncmp(token, "usemtl", 6)) && IS_SPACE((token[6]))) { + token += 7; + std::stringstream ss; + ss << token; + std::string namebuf = ss.str(); + + int newMaterialId = -1; + if (material_map.find(namebuf) != material_map.end()) { + newMaterialId = material_map[namebuf]; + } else { + // { error!! material not found } + } + + if (newMaterialId != material) { + // Create per-face material. Thus we don't add `shape` to `shapes` at + // this time. + // just clear `faceGroup` after `exportGroupsToShape()` call. + exportGroupsToShape(&shape, faceGroup, lineGroup, tags, material, name, + triangulate, v); + faceGroup.clear(); + material = newMaterialId; + } + + continue; + } + + // load mtl + if ((0 == strncmp(token, "mtllib", 6)) && IS_SPACE((token[6]))) { + if (readMatFn) { + token += 7; + + std::vector filenames; + SplitString(std::string(token), ' ', filenames); + + if (filenames.empty()) { + if (err) { + (*err) += + "WARN: Looks like empty filename for mtllib. Use default " + "material. \n"; + } + } else { + bool found = false; + for (size_t s = 0; s < filenames.size(); s++) { + std::string err_mtl; + bool ok = (*readMatFn)(filenames[s].c_str(), materials, + &material_map, &err_mtl); + if (err && (!err_mtl.empty())) { + (*err) += err_mtl; // This should be warn message. + } + + if (ok) { + found = true; + break; + } + } + + if (!found) { + if (err) { + (*err) += + "WARN: Failed to load material file(s). Use default " + "material.\n"; + } + } + } + } + + continue; + } + + // group name + if (token[0] == 'g' && IS_SPACE((token[1]))) { + // flush previous face group. + bool ret = exportGroupsToShape(&shape, faceGroup, lineGroup, tags, + material, name, triangulate, v); + (void)ret; // return value not used. + + if (shape.mesh.indices.size() > 0) { + shapes->push_back(shape); + } + + shape = shape_t(); + + // material = -1; + faceGroup.clear(); + + std::vector names; + + while (!IS_NEW_LINE(token[0])) { + std::string str = parseString(&token); + names.push_back(str); + token += strspn(token, " \t\r"); // skip tag + } + + // names[0] must be 'g' + + if (names.size() < 2) { + // 'g' with empty names + if (err) { + std::stringstream ss; + ss << "WARN: Empty group name. line: " << line_num << "\n"; + (*err) += ss.str(); + name = ""; + } + } else { + + std::stringstream ss; + ss << names[1]; + + // tinyobjloader does not support multiple groups for a primitive. + // Currently we concatinate multiple group names with a space to get + // single group name. + + for (size_t i = 2; i < names.size(); i++) { + ss << " " << names[i]; + } + + name = ss.str(); + + } + + continue; + } + + // object name + if (token[0] == 'o' && IS_SPACE((token[1]))) { + // flush previous face group. + bool ret = exportGroupsToShape(&shape, faceGroup, lineGroup, tags, + material, name, triangulate, v); + if (ret) { + shapes->push_back(shape); + } + + // material = -1; + faceGroup.clear(); + shape = shape_t(); + + // @todo { multiple object name? } + token += 2; + std::stringstream ss; + ss << token; + name = ss.str(); + + continue; + } + + if (token[0] == 't' && IS_SPACE(token[1])) { + const int max_tag_nums = 8192; // FIXME(syoyo): Parameterize. + tag_t tag; + + token += 2; + + tag.name = parseString(&token); + + tag_sizes ts = parseTagTriple(&token); + + if (ts.num_ints < 0) { + ts.num_ints = 0; + } + if (ts.num_ints > max_tag_nums) { + ts.num_ints = max_tag_nums; + } + + if (ts.num_reals < 0) { + ts.num_reals = 0; + } + if (ts.num_reals > max_tag_nums) { + ts.num_reals = max_tag_nums; + } + + if (ts.num_strings < 0) { + ts.num_strings = 0; + } + if (ts.num_strings > max_tag_nums) { + ts.num_strings = max_tag_nums; + } + + tag.intValues.resize(static_cast(ts.num_ints)); + + for (size_t i = 0; i < static_cast(ts.num_ints); ++i) { + tag.intValues[i] = parseInt(&token); + } + + tag.floatValues.resize(static_cast(ts.num_reals)); + for (size_t i = 0; i < static_cast(ts.num_reals); ++i) { + tag.floatValues[i] = parseReal(&token); + } + + tag.stringValues.resize(static_cast(ts.num_strings)); + for (size_t i = 0; i < static_cast(ts.num_strings); ++i) { + tag.stringValues[i] = parseString(&token); + } + + tags.push_back(tag); + + continue; + } + + if (token[0] == 's' && IS_SPACE(token[1])) { + // smoothing group id + token += 2; + + // skip space. + token += strspn(token, " \t"); // skip space + + if (token[0] == '\0') { + continue; + } + + if (token[0] == '\r' || token[1] == '\n') { + continue; + } + + if (strlen(token) >= 3) { + if (token[0] == 'o' && token[1] == 'f' && token[2] == 'f') { + current_smoothing_id = 0; + } + } else { + // assume number + int smGroupId = parseInt(&token); + if (smGroupId < 0) { + // parse error. force set to 0. + // FIXME(syoyo): Report warning. + current_smoothing_id = 0; + } else { + current_smoothing_id = static_cast(smGroupId); + } + } + + continue; + } // smoothing group id + + // Ignore unknown command. + } + + // not all vertices have colors, no default colors desired? -> clear colors + if (!found_all_colors && !default_vcols_fallback) { + vc.clear(); + } + + if (greatest_v_idx >= static_cast(v.size() / 3)) + { + if (err) { + std::stringstream ss; + ss << "WARN: Vertex indices out of bounds.\n" << std::endl; + (*err) += ss.str(); + } + } + if (greatest_vn_idx >= static_cast(vn.size() / 3)) + { + if (err) { + std::stringstream ss; + ss << "WARN: Vertex normal indices out of bounds.\n" << std::endl; + (*err) += ss.str(); + } + } + if (greatest_vt_idx >= static_cast(vt.size() / 2)) + { + if (err) { + std::stringstream ss; + ss << "WARN: Vertex texcoord indices out of bounds.\n" << std::endl; + (*err) += ss.str(); + } + } + + bool ret = exportGroupsToShape(&shape, faceGroup, lineGroup, tags, material, + name, triangulate, v); + // exportGroupsToShape return false when `usemtl` is called in the last + // line. + // we also add `shape` to `shapes` when `shape.mesh` has already some + // faces(indices) + if (ret || shape.mesh.indices.size()) { + shapes->push_back(shape); + } + faceGroup.clear(); // for safety + + if (err) { + (*err) += errss.str(); + } + + attrib->vertices.swap(v); + attrib->normals.swap(vn); + attrib->texcoords.swap(vt); + attrib->colors.swap(vc); + + return true; +} + +bool LoadObjWithCallback(std::istream &inStream, const callback_t &callback, + void *user_data /*= NULL*/, + MaterialReader *readMatFn /*= NULL*/, + std::string *err /*= NULL*/) { + std::stringstream errss; + + // material + std::map material_map; + int material_id = -1; // -1 = invalid + + std::vector indices; + std::vector materials; + std::vector names; + names.reserve(2); + std::vector names_out; + + std::string linebuf; + while (inStream.peek() != -1) { + safeGetline(inStream, linebuf); + + // Trim newline '\r\n' or '\n' + if (linebuf.size() > 0) { + if (linebuf[linebuf.size() - 1] == '\n') + linebuf.erase(linebuf.size() - 1); + } + if (linebuf.size() > 0) { + if (linebuf[linebuf.size() - 1] == '\r') + linebuf.erase(linebuf.size() - 1); + } + + // Skip if empty line. + if (linebuf.empty()) { + continue; + } + + // Skip leading space. + const char *token = linebuf.c_str(); + token += strspn(token, " \t"); + + assert(token); + if (token[0] == '\0') continue; // empty line + + if (token[0] == '#') continue; // comment line + + // vertex + if (token[0] == 'v' && IS_SPACE((token[1]))) { + token += 2; + // TODO(syoyo): Support parsing vertex color extension. + real_t x, y, z, w; // w is optional. default = 1.0 + parseV(&x, &y, &z, &w, &token); + if (callback.vertex_cb) { + callback.vertex_cb(user_data, x, y, z, w); + } + continue; + } + + // normal + if (token[0] == 'v' && token[1] == 'n' && IS_SPACE((token[2]))) { + token += 3; + real_t x, y, z; + parseReal3(&x, &y, &z, &token); + if (callback.normal_cb) { + callback.normal_cb(user_data, x, y, z); + } + continue; + } + + // texcoord + if (token[0] == 'v' && token[1] == 't' && IS_SPACE((token[2]))) { + token += 3; + real_t x, y, z; // y and z are optional. default = 0.0 + parseReal3(&x, &y, &z, &token); + if (callback.texcoord_cb) { + callback.texcoord_cb(user_data, x, y, z); + } + continue; + } + + // face + if (token[0] == 'f' && IS_SPACE((token[1]))) { + token += 2; + token += strspn(token, " \t"); + + indices.clear(); + while (!IS_NEW_LINE(token[0])) { + vertex_index_t vi = parseRawTriple(&token); + + index_t idx; + idx.vertex_index = vi.v_idx; + idx.normal_index = vi.vn_idx; + idx.texcoord_index = vi.vt_idx; + + indices.push_back(idx); + size_t n = strspn(token, " \t\r"); + token += n; + } + + if (callback.index_cb && indices.size() > 0) { + callback.index_cb(user_data, &indices.at(0), + static_cast(indices.size())); + } + + continue; + } + + // use mtl + if ((0 == strncmp(token, "usemtl", 6)) && IS_SPACE((token[6]))) { + token += 7; + std::stringstream ss; + ss << token; + std::string namebuf = ss.str(); + + int newMaterialId = -1; + if (material_map.find(namebuf) != material_map.end()) { + newMaterialId = material_map[namebuf]; + } else { + // { error!! material not found } + } + + if (newMaterialId != material_id) { + material_id = newMaterialId; + } + + if (callback.usemtl_cb) { + callback.usemtl_cb(user_data, namebuf.c_str(), material_id); + } + + continue; + } + + // load mtl + if ((0 == strncmp(token, "mtllib", 6)) && IS_SPACE((token[6]))) { + if (readMatFn) { + token += 7; + + std::vector filenames; + SplitString(std::string(token), ' ', filenames); + + if (filenames.empty()) { + if (err) { + (*err) += + "WARN: Looks like empty filename for mtllib. Use default " + "material. \n"; + } + } else { + bool found = false; + for (size_t s = 0; s < filenames.size(); s++) { + std::string err_mtl; + bool ok = (*readMatFn)(filenames[s].c_str(), &materials, + &material_map, &err_mtl); + if (err && (!err_mtl.empty())) { + (*err) += err_mtl; // This should be warn message. + } + + if (ok) { + found = true; + break; + } + } + + if (!found) { + if (err) { + (*err) += + "WARN: Failed to load material file(s). Use default " + "material.\n"; + } + } else { + if (callback.mtllib_cb) { + callback.mtllib_cb(user_data, &materials.at(0), + static_cast(materials.size())); + } + } + } + } + + continue; + } + + // group name + if (token[0] == 'g' && IS_SPACE((token[1]))) { + names.clear(); + + while (!IS_NEW_LINE(token[0])) { + std::string str = parseString(&token); + names.push_back(str); + token += strspn(token, " \t\r"); // skip tag + } + + assert(names.size() > 0); + + if (callback.group_cb) { + if (names.size() > 1) { + // create const char* array. + names_out.resize(names.size() - 1); + for (size_t j = 0; j < names_out.size(); j++) { + names_out[j] = names[j + 1].c_str(); + } + callback.group_cb(user_data, &names_out.at(0), + static_cast(names_out.size())); + + } else { + callback.group_cb(user_data, NULL, 0); + } + } + + continue; + } + + // object name + if (token[0] == 'o' && IS_SPACE((token[1]))) { + // @todo { multiple object name? } + token += 2; + + std::stringstream ss; + ss << token; + std::string object_name = ss.str(); + + if (callback.object_cb) { + callback.object_cb(user_data, object_name.c_str()); + } + + continue; + } + +#if 0 // @todo + if (token[0] == 't' && IS_SPACE(token[1])) { + tag_t tag; + + token += 2; + std::stringstream ss; + ss << token; + tag.name = ss.str(); + + token += tag.name.size() + 1; + + tag_sizes ts = parseTagTriple(&token); + + tag.intValues.resize(static_cast(ts.num_ints)); + + for (size_t i = 0; i < static_cast(ts.num_ints); ++i) { + tag.intValues[i] = atoi(token); + token += strcspn(token, "/ \t\r") + 1; + } + + tag.floatValues.resize(static_cast(ts.num_reals)); + for (size_t i = 0; i < static_cast(ts.num_reals); ++i) { + tag.floatValues[i] = parseReal(&token); + token += strcspn(token, "/ \t\r") + 1; + } + + tag.stringValues.resize(static_cast(ts.num_strings)); + for (size_t i = 0; i < static_cast(ts.num_strings); ++i) { + std::stringstream ss; + ss << token; + tag.stringValues[i] = ss.str(); + token += tag.stringValues[i].size() + 1; + } + + tags.push_back(tag); + } +#endif + + // Ignore unknown command. + } + + if (err) { + (*err) += errss.str(); + } + + return true; +} + +#ifdef __clang__ +#pragma clang diagnostic pop +#endif +} // namespace tinyobj + +#endif