├── .gitignore ├── GLPlugin.jucer ├── JuceLibraryCode ├── AppConfig.h ├── BinaryData.cpp ├── BinaryData.h ├── JuceHeader.h ├── ReadMe.txt ├── include_juce_audio_basics.cpp ├── include_juce_audio_basics.mm ├── include_juce_audio_devices.cpp ├── include_juce_audio_devices.mm ├── include_juce_audio_formats.cpp ├── include_juce_audio_formats.mm ├── include_juce_audio_plugin_client_AAX.cpp ├── include_juce_audio_plugin_client_AAX.mm ├── include_juce_audio_plugin_client_AU.r ├── include_juce_audio_plugin_client_AU_1.mm ├── include_juce_audio_plugin_client_AU_2.mm ├── include_juce_audio_plugin_client_AUv3.mm ├── include_juce_audio_plugin_client_RTAS.r ├── include_juce_audio_plugin_client_RTAS_1.cpp ├── include_juce_audio_plugin_client_RTAS_2.cpp ├── include_juce_audio_plugin_client_RTAS_3.cpp ├── include_juce_audio_plugin_client_RTAS_4.cpp ├── include_juce_audio_plugin_client_RTAS_utils.cpp ├── include_juce_audio_plugin_client_RTAS_utils.mm ├── include_juce_audio_plugin_client_Standalone.cpp ├── include_juce_audio_plugin_client_Unity.cpp ├── include_juce_audio_plugin_client_VST2.cpp ├── include_juce_audio_plugin_client_VST3.cpp ├── include_juce_audio_plugin_client_VST_utils.mm ├── include_juce_audio_plugin_client_utils.cpp ├── include_juce_audio_processors.cpp ├── include_juce_audio_processors.mm ├── include_juce_audio_utils.cpp ├── include_juce_audio_utils.mm ├── include_juce_core.cpp ├── include_juce_core.mm ├── include_juce_cryptography.cpp ├── include_juce_cryptography.mm ├── include_juce_data_structures.cpp ├── include_juce_data_structures.mm ├── include_juce_events.cpp ├── include_juce_events.mm ├── include_juce_graphics.cpp ├── include_juce_graphics.mm ├── include_juce_gui_basics.cpp ├── include_juce_gui_basics.mm ├── include_juce_gui_extra.cpp ├── include_juce_gui_extra.mm ├── include_juce_opengl.cpp ├── include_juce_opengl.mm ├── include_juce_video.cpp └── include_juce_video.mm ├── LICENSE ├── README.md └── Source ├── Attributes.h ├── GLUtils.h ├── PluginEditor.cpp ├── PluginEditor.h ├── PluginProcessor.cpp ├── PluginProcessor.h ├── ShaderPreset.h ├── Shape.h ├── Textures.h ├── Uniforms.h ├── Vertex.h ├── WavefrontObjParser.h ├── pianokey_rectangle.obj ├── portmeirion.jpg └── teapot.obj /.gitignore: -------------------------------------------------------------------------------- 1 | *.DS_Store 2 | /Builds 3 | #GLPlugin_Logic.logicx 4 | /DemoContent 5 | -------------------------------------------------------------------------------- /GLPlugin.jucer: -------------------------------------------------------------------------------- 1 | 2 | 3 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 22 | 23 | 25 | 26 | 27 | 28 | 29 | 30 | 32 | 33 | 35 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | -------------------------------------------------------------------------------- /JuceLibraryCode/AppConfig.h: -------------------------------------------------------------------------------- 1 | /* 2 | 3 | IMPORTANT! This file is auto-generated each time you save your 4 | project - if you alter its contents, your changes may be overwritten! 5 | 6 | There's a section below where you can add your own custom code safely, and the 7 | Projucer will preserve the contents of that block, but the best way to change 8 | any of these definitions is by using the Projucer's project settings. 9 | 10 | Any commented-out settings will assume their default values. 11 | 12 | */ 13 | 14 | #pragma once 15 | 16 | //============================================================================== 17 | // [BEGIN_USER_CODE_SECTION] 18 | 19 | // (You can add your own code in this section, and the Projucer will not overwrite it) 20 | 21 | // [END_USER_CODE_SECTION] 22 | 23 | /* 24 | ============================================================================== 25 | 26 | In accordance with the terms of the JUCE 5 End-Use License Agreement, the 27 | JUCE Code in SECTION A cannot be removed, changed or otherwise rendered 28 | ineffective unless you have a JUCE Indie or Pro license, or are using JUCE 29 | under the GPL v3 license. 30 | 31 | End User License Agreement: www.juce.com/juce-5-licence 32 | 33 | ============================================================================== 34 | */ 35 | 36 | // BEGIN SECTION A 37 | 38 | #ifndef JUCE_DISPLAY_SPLASH_SCREEN 39 | #define JUCE_DISPLAY_SPLASH_SCREEN 1 40 | #endif 41 | 42 | #ifndef JUCE_REPORT_APP_USAGE 43 | #define JUCE_REPORT_APP_USAGE 1 44 | #endif 45 | 46 | // END SECTION A 47 | 48 | #define JUCE_USE_DARK_SPLASH_SCREEN 1 49 | 50 | #define JUCE_PROJUCER_VERSION 0x50405 51 | 52 | //============================================================================== 53 | #define JUCE_MODULE_AVAILABLE_juce_audio_basics 1 54 | #define JUCE_MODULE_AVAILABLE_juce_audio_devices 1 55 | #define JUCE_MODULE_AVAILABLE_juce_audio_formats 1 56 | #define JUCE_MODULE_AVAILABLE_juce_audio_plugin_client 1 57 | #define JUCE_MODULE_AVAILABLE_juce_audio_processors 1 58 | #define JUCE_MODULE_AVAILABLE_juce_audio_utils 1 59 | #define JUCE_MODULE_AVAILABLE_juce_core 1 60 | #define JUCE_MODULE_AVAILABLE_juce_cryptography 1 61 | #define JUCE_MODULE_AVAILABLE_juce_data_structures 1 62 | #define JUCE_MODULE_AVAILABLE_juce_events 1 63 | #define JUCE_MODULE_AVAILABLE_juce_graphics 1 64 | #define JUCE_MODULE_AVAILABLE_juce_gui_basics 1 65 | #define JUCE_MODULE_AVAILABLE_juce_gui_extra 1 66 | #define JUCE_MODULE_AVAILABLE_juce_opengl 1 67 | #define JUCE_MODULE_AVAILABLE_juce_video 1 68 | 69 | #define JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED 1 70 | 71 | //============================================================================== 72 | // juce_audio_devices flags: 73 | 74 | #ifndef JUCE_USE_WINRT_MIDI 75 | //#define JUCE_USE_WINRT_MIDI 0 76 | #endif 77 | 78 | #ifndef JUCE_ASIO 79 | //#define JUCE_ASIO 0 80 | #endif 81 | 82 | #ifndef JUCE_WASAPI 83 | //#define JUCE_WASAPI 1 84 | #endif 85 | 86 | #ifndef JUCE_WASAPI_EXCLUSIVE 87 | //#define JUCE_WASAPI_EXCLUSIVE 0 88 | #endif 89 | 90 | #ifndef JUCE_DIRECTSOUND 91 | //#define JUCE_DIRECTSOUND 1 92 | #endif 93 | 94 | #ifndef JUCE_ALSA 95 | //#define JUCE_ALSA 1 96 | #endif 97 | 98 | #ifndef JUCE_JACK 99 | //#define JUCE_JACK 0 100 | #endif 101 | 102 | #ifndef JUCE_BELA 103 | //#define JUCE_BELA 0 104 | #endif 105 | 106 | #ifndef JUCE_USE_ANDROID_OBOE 107 | //#define JUCE_USE_ANDROID_OBOE 0 108 | #endif 109 | 110 | #ifndef JUCE_USE_ANDROID_OPENSLES 111 | //#define JUCE_USE_ANDROID_OPENSLES 0 112 | #endif 113 | 114 | #ifndef JUCE_DISABLE_AUDIO_MIXING_WITH_OTHER_APPS 115 | //#define JUCE_DISABLE_AUDIO_MIXING_WITH_OTHER_APPS 0 116 | #endif 117 | 118 | //============================================================================== 119 | // juce_audio_formats flags: 120 | 121 | #ifndef JUCE_USE_FLAC 122 | //#define JUCE_USE_FLAC 1 123 | #endif 124 | 125 | #ifndef JUCE_USE_OGGVORBIS 126 | //#define JUCE_USE_OGGVORBIS 1 127 | #endif 128 | 129 | #ifndef JUCE_USE_MP3AUDIOFORMAT 130 | //#define JUCE_USE_MP3AUDIOFORMAT 0 131 | #endif 132 | 133 | #ifndef JUCE_USE_LAME_AUDIO_FORMAT 134 | //#define JUCE_USE_LAME_AUDIO_FORMAT 0 135 | #endif 136 | 137 | #ifndef JUCE_USE_WINDOWS_MEDIA_FORMAT 138 | //#define JUCE_USE_WINDOWS_MEDIA_FORMAT 1 139 | #endif 140 | 141 | //============================================================================== 142 | // juce_audio_plugin_client flags: 143 | 144 | #ifndef JUCE_VST3_CAN_REPLACE_VST2 145 | //#define JUCE_VST3_CAN_REPLACE_VST2 1 146 | #endif 147 | 148 | #ifndef JUCE_FORCE_USE_LEGACY_PARAM_IDS 149 | //#define JUCE_FORCE_USE_LEGACY_PARAM_IDS 0 150 | #endif 151 | 152 | #ifndef JUCE_FORCE_LEGACY_PARAMETER_AUTOMATION_TYPE 153 | //#define JUCE_FORCE_LEGACY_PARAMETER_AUTOMATION_TYPE 0 154 | #endif 155 | 156 | #ifndef JUCE_USE_STUDIO_ONE_COMPATIBLE_PARAMETERS 157 | //#define JUCE_USE_STUDIO_ONE_COMPATIBLE_PARAMETERS 1 158 | #endif 159 | 160 | #ifndef JUCE_STANDALONE_FILTER_WINDOW_USE_KIOSK_MODE 161 | //#define JUCE_STANDALONE_FILTER_WINDOW_USE_KIOSK_MODE 0 162 | #endif 163 | 164 | //============================================================================== 165 | // juce_audio_processors flags: 166 | 167 | #ifndef JUCE_PLUGINHOST_VST 168 | //#define JUCE_PLUGINHOST_VST 0 169 | #endif 170 | 171 | #ifndef JUCE_PLUGINHOST_VST3 172 | //#define JUCE_PLUGINHOST_VST3 0 173 | #endif 174 | 175 | #ifndef JUCE_PLUGINHOST_AU 176 | //#define JUCE_PLUGINHOST_AU 0 177 | #endif 178 | 179 | #ifndef JUCE_PLUGINHOST_LADSPA 180 | //#define JUCE_PLUGINHOST_LADSPA 0 181 | #endif 182 | 183 | //============================================================================== 184 | // juce_audio_utils flags: 185 | 186 | #ifndef JUCE_USE_CDREADER 187 | //#define JUCE_USE_CDREADER 0 188 | #endif 189 | 190 | #ifndef JUCE_USE_CDBURNER 191 | //#define JUCE_USE_CDBURNER 0 192 | #endif 193 | 194 | //============================================================================== 195 | // juce_core flags: 196 | 197 | #ifndef JUCE_FORCE_DEBUG 198 | //#define JUCE_FORCE_DEBUG 0 199 | #endif 200 | 201 | #ifndef JUCE_LOG_ASSERTIONS 202 | //#define JUCE_LOG_ASSERTIONS 0 203 | #endif 204 | 205 | #ifndef JUCE_CHECK_MEMORY_LEAKS 206 | //#define JUCE_CHECK_MEMORY_LEAKS 1 207 | #endif 208 | 209 | #ifndef JUCE_DONT_AUTOLINK_TO_WIN32_LIBRARIES 210 | //#define JUCE_DONT_AUTOLINK_TO_WIN32_LIBRARIES 0 211 | #endif 212 | 213 | #ifndef JUCE_INCLUDE_ZLIB_CODE 214 | //#define JUCE_INCLUDE_ZLIB_CODE 1 215 | #endif 216 | 217 | #ifndef JUCE_USE_CURL 218 | //#define JUCE_USE_CURL 1 219 | #endif 220 | 221 | #ifndef JUCE_LOAD_CURL_SYMBOLS_LAZILY 222 | //#define JUCE_LOAD_CURL_SYMBOLS_LAZILY 0 223 | #endif 224 | 225 | #ifndef JUCE_CATCH_UNHANDLED_EXCEPTIONS 226 | //#define JUCE_CATCH_UNHANDLED_EXCEPTIONS 0 227 | #endif 228 | 229 | #ifndef JUCE_ALLOW_STATIC_NULL_VARIABLES 230 | //#define JUCE_ALLOW_STATIC_NULL_VARIABLES 0 231 | #endif 232 | 233 | #ifndef JUCE_STRICT_REFCOUNTEDPOINTER 234 | //#define JUCE_STRICT_REFCOUNTEDPOINTER 0 235 | #endif 236 | 237 | //============================================================================== 238 | // juce_events flags: 239 | 240 | #ifndef JUCE_EXECUTE_APP_SUSPEND_ON_IOS_BACKGROUND_TASK 241 | //#define JUCE_EXECUTE_APP_SUSPEND_ON_IOS_BACKGROUND_TASK 0 242 | #endif 243 | 244 | //============================================================================== 245 | // juce_graphics flags: 246 | 247 | #ifndef JUCE_USE_COREIMAGE_LOADER 248 | //#define JUCE_USE_COREIMAGE_LOADER 1 249 | #endif 250 | 251 | #ifndef JUCE_USE_DIRECTWRITE 252 | //#define JUCE_USE_DIRECTWRITE 1 253 | #endif 254 | 255 | #ifndef JUCE_DISABLE_COREGRAPHICS_FONT_SMOOTHING 256 | //#define JUCE_DISABLE_COREGRAPHICS_FONT_SMOOTHING 0 257 | #endif 258 | 259 | //============================================================================== 260 | // juce_gui_basics flags: 261 | 262 | #ifndef JUCE_ENABLE_REPAINT_DEBUGGING 263 | //#define JUCE_ENABLE_REPAINT_DEBUGGING 0 264 | #endif 265 | 266 | #ifndef JUCE_USE_XRANDR 267 | //#define JUCE_USE_XRANDR 1 268 | #endif 269 | 270 | #ifndef JUCE_USE_XINERAMA 271 | //#define JUCE_USE_XINERAMA 1 272 | #endif 273 | 274 | #ifndef JUCE_USE_XSHM 275 | //#define JUCE_USE_XSHM 1 276 | #endif 277 | 278 | #ifndef JUCE_USE_XRENDER 279 | //#define JUCE_USE_XRENDER 0 280 | #endif 281 | 282 | #ifndef JUCE_USE_XCURSOR 283 | //#define JUCE_USE_XCURSOR 1 284 | #endif 285 | 286 | #ifndef JUCE_WIN_PER_MONITOR_DPI_AWARE 287 | //#define JUCE_WIN_PER_MONITOR_DPI_AWARE 1 288 | #endif 289 | 290 | //============================================================================== 291 | // juce_gui_extra flags: 292 | 293 | #ifndef JUCE_WEB_BROWSER 294 | //#define JUCE_WEB_BROWSER 1 295 | #endif 296 | 297 | #ifndef JUCE_ENABLE_LIVE_CONSTANT_EDITOR 298 | //#define JUCE_ENABLE_LIVE_CONSTANT_EDITOR 0 299 | #endif 300 | 301 | //============================================================================== 302 | // juce_video flags: 303 | 304 | #ifndef JUCE_USE_CAMERA 305 | //#define JUCE_USE_CAMERA 0 306 | #endif 307 | 308 | #ifndef JUCE_SYNC_VIDEO_VOLUME_WITH_OS_MEDIA_VOLUME 309 | //#define JUCE_SYNC_VIDEO_VOLUME_WITH_OS_MEDIA_VOLUME 1 310 | #endif 311 | 312 | //============================================================================== 313 | // Audio plugin settings.. 314 | 315 | #ifndef JucePlugin_Build_VST 316 | #define JucePlugin_Build_VST 0 317 | #endif 318 | #ifndef JucePlugin_Build_VST3 319 | #define JucePlugin_Build_VST3 0 320 | #endif 321 | #ifndef JucePlugin_Build_AU 322 | #define JucePlugin_Build_AU 1 323 | #endif 324 | #ifndef JucePlugin_Build_AUv3 325 | #define JucePlugin_Build_AUv3 0 326 | #endif 327 | #ifndef JucePlugin_Build_RTAS 328 | #define JucePlugin_Build_RTAS 0 329 | #endif 330 | #ifndef JucePlugin_Build_AAX 331 | #define JucePlugin_Build_AAX 0 332 | #endif 333 | #ifndef JucePlugin_Build_Standalone 334 | #define JucePlugin_Build_Standalone 1 335 | #endif 336 | #ifndef JucePlugin_Build_Unity 337 | #define JucePlugin_Build_Unity 0 338 | #endif 339 | #ifndef JucePlugin_Enable_IAA 340 | #define JucePlugin_Enable_IAA 0 341 | #endif 342 | #ifndef JucePlugin_Name 343 | #define JucePlugin_Name "GLPlugin" 344 | #endif 345 | #ifndef JucePlugin_Desc 346 | #define JucePlugin_Desc "GLPlugin" 347 | #endif 348 | #ifndef JucePlugin_Manufacturer 349 | #define JucePlugin_Manufacturer "yourcompany" 350 | #endif 351 | #ifndef JucePlugin_ManufacturerWebsite 352 | #define JucePlugin_ManufacturerWebsite "" 353 | #endif 354 | #ifndef JucePlugin_ManufacturerEmail 355 | #define JucePlugin_ManufacturerEmail "" 356 | #endif 357 | #ifndef JucePlugin_ManufacturerCode 358 | #define JucePlugin_ManufacturerCode 0x4d616e75 // 'Manu' 359 | #endif 360 | #ifndef JucePlugin_PluginCode 361 | #define JucePlugin_PluginCode 0x58673264 // 'Xg2d' 362 | #endif 363 | #ifndef JucePlugin_IsSynth 364 | #define JucePlugin_IsSynth 0 365 | #endif 366 | #ifndef JucePlugin_WantsMidiInput 367 | #define JucePlugin_WantsMidiInput 1 368 | #endif 369 | #ifndef JucePlugin_ProducesMidiOutput 370 | #define JucePlugin_ProducesMidiOutput 1 371 | #endif 372 | #ifndef JucePlugin_IsMidiEffect 373 | #define JucePlugin_IsMidiEffect 0 374 | #endif 375 | #ifndef JucePlugin_EditorRequiresKeyboardFocus 376 | #define JucePlugin_EditorRequiresKeyboardFocus 0 377 | #endif 378 | #ifndef JucePlugin_Version 379 | #define JucePlugin_Version 1.0.0 380 | #endif 381 | #ifndef JucePlugin_VersionCode 382 | #define JucePlugin_VersionCode 0x10000 383 | #endif 384 | #ifndef JucePlugin_VersionString 385 | #define JucePlugin_VersionString "1.0.0" 386 | #endif 387 | #ifndef JucePlugin_VSTUniqueID 388 | #define JucePlugin_VSTUniqueID JucePlugin_PluginCode 389 | #endif 390 | #ifndef JucePlugin_VSTCategory 391 | #define JucePlugin_VSTCategory kPlugCategEffect 392 | #endif 393 | #ifndef JucePlugin_Vst3Category 394 | #define JucePlugin_Vst3Category "Fx" 395 | #endif 396 | #ifndef JucePlugin_AUMainType 397 | #define JucePlugin_AUMainType 'aumf' 398 | #endif 399 | #ifndef JucePlugin_AUSubType 400 | #define JucePlugin_AUSubType JucePlugin_PluginCode 401 | #endif 402 | #ifndef JucePlugin_AUExportPrefix 403 | #define JucePlugin_AUExportPrefix GLPluginAU 404 | #endif 405 | #ifndef JucePlugin_AUExportPrefixQuoted 406 | #define JucePlugin_AUExportPrefixQuoted "GLPluginAU" 407 | #endif 408 | #ifndef JucePlugin_AUManufacturerCode 409 | #define JucePlugin_AUManufacturerCode JucePlugin_ManufacturerCode 410 | #endif 411 | #ifndef JucePlugin_CFBundleIdentifier 412 | #define JucePlugin_CFBundleIdentifier com.yourcompany.GLPlugin 413 | #endif 414 | #ifndef JucePlugin_RTASCategory 415 | #define JucePlugin_RTASCategory 0 416 | #endif 417 | #ifndef JucePlugin_RTASManufacturerCode 418 | #define JucePlugin_RTASManufacturerCode JucePlugin_ManufacturerCode 419 | #endif 420 | #ifndef JucePlugin_RTASProductId 421 | #define JucePlugin_RTASProductId JucePlugin_PluginCode 422 | #endif 423 | #ifndef JucePlugin_RTASDisableBypass 424 | #define JucePlugin_RTASDisableBypass 0 425 | #endif 426 | #ifndef JucePlugin_RTASDisableMultiMono 427 | #define JucePlugin_RTASDisableMultiMono 0 428 | #endif 429 | #ifndef JucePlugin_AAXIdentifier 430 | #define JucePlugin_AAXIdentifier com.yourcompany.GLPlugin 431 | #endif 432 | #ifndef JucePlugin_AAXManufacturerCode 433 | #define JucePlugin_AAXManufacturerCode JucePlugin_ManufacturerCode 434 | #endif 435 | #ifndef JucePlugin_AAXProductId 436 | #define JucePlugin_AAXProductId JucePlugin_PluginCode 437 | #endif 438 | #ifndef JucePlugin_AAXCategory 439 | #define JucePlugin_AAXCategory 2 440 | #endif 441 | #ifndef JucePlugin_AAXDisableBypass 442 | #define JucePlugin_AAXDisableBypass 0 443 | #endif 444 | #ifndef JucePlugin_AAXDisableMultiMono 445 | #define JucePlugin_AAXDisableMultiMono 0 446 | #endif 447 | #ifndef JucePlugin_IAAType 448 | #define JucePlugin_IAAType 0x6175726d // 'aurm' 449 | #endif 450 | #ifndef JucePlugin_IAASubType 451 | #define JucePlugin_IAASubType JucePlugin_PluginCode 452 | #endif 453 | #ifndef JucePlugin_IAAName 454 | #define JucePlugin_IAAName "yourcompany: GLPlugin" 455 | #endif 456 | #ifndef JucePlugin_VSTNumMidiInputs 457 | #define JucePlugin_VSTNumMidiInputs 16 458 | #endif 459 | #ifndef JucePlugin_VSTNumMidiOutputs 460 | #define JucePlugin_VSTNumMidiOutputs 16 461 | #endif 462 | 463 | //============================================================================== 464 | #ifndef JUCE_STANDALONE_APPLICATION 465 | #if defined(JucePlugin_Name) && defined(JucePlugin_Build_Standalone) 466 | #define JUCE_STANDALONE_APPLICATION JucePlugin_Build_Standalone 467 | #else 468 | #define JUCE_STANDALONE_APPLICATION 0 469 | #endif 470 | #endif 471 | -------------------------------------------------------------------------------- /JuceLibraryCode/BinaryData.h: -------------------------------------------------------------------------------- 1 | /* ========================================================================================= 2 | 3 | This is an auto-generated file: Any edits you make may be overwritten! 4 | 5 | */ 6 | 7 | #pragma once 8 | 9 | namespace BinaryData 10 | { 11 | extern const char* portmeirion_jpg; 12 | const int portmeirion_jpgSize = 145904; 13 | 14 | extern const char* teapot_obj; 15 | const int teapot_objSize = 95004; 16 | 17 | extern const char* pianokey_rectangle_obj; 18 | const int pianokey_rectangle_objSize = 417; 19 | 20 | // Number of elements in the namedResourceList and originalFileNames arrays. 21 | const int namedResourceListSize = 3; 22 | 23 | // Points to the start of a list of resource names. 24 | extern const char* namedResourceList[]; 25 | 26 | // Points to the start of a list of resource filenames. 27 | extern const char* originalFilenames[]; 28 | 29 | // If you provide the name of one of the binary resource variables above, this function will 30 | // return the corresponding data and its size (or a null pointer if the name isn't found). 31 | const char* getNamedResource (const char* resourceNameUTF8, int& dataSizeInBytes); 32 | 33 | // If you provide the name of one of the binary resource variables above, this function will 34 | // return the corresponding original, non-mangled filename (or a null pointer if the name isn't found). 35 | const char* getNamedResourceOriginalFilename (const char* resourceNameUTF8); 36 | } 37 | -------------------------------------------------------------------------------- /JuceLibraryCode/JuceHeader.h: -------------------------------------------------------------------------------- 1 | /* 2 | 3 | IMPORTANT! This file is auto-generated each time you save your 4 | project - if you alter its contents, your changes may be overwritten! 5 | 6 | This is the header file that your files should include in order to get all the 7 | JUCE library headers. You should avoid including the JUCE headers directly in 8 | your own source files, because that wouldn't pick up the correct configuration 9 | options for your app. 10 | 11 | */ 12 | 13 | #pragma once 14 | 15 | #include "AppConfig.h" 16 | 17 | #include 18 | #include 19 | #include 20 | #include 21 | #include 22 | #include 23 | #include 24 | #include 25 | #include 26 | #include 27 | #include 28 | #include 29 | #include 30 | #include 31 | #include 32 | 33 | #include "BinaryData.h" 34 | 35 | #if defined (JUCE_PROJUCER_VERSION) && JUCE_PROJUCER_VERSION < JUCE_VERSION 36 | /** If you've hit this error then the version of the Projucer that was used to generate this project is 37 | older than the version of the JUCE modules being included. To fix this error, re-save your project 38 | using the latest version of the Projucer or, if you aren't using the Projucer to manage your project, 39 | remove the JUCE_PROJUCER_VERSION define from the AppConfig.h file. 40 | */ 41 | #error "This project was last saved using an outdated version of the Projucer! Re-save this project with the latest version to fix this error." 42 | #endif 43 | 44 | #if ! DONT_SET_USING_JUCE_NAMESPACE 45 | // If your code uses a lot of JUCE classes, then this will obviously save you 46 | // a lot of typing, but can be disabled by setting DONT_SET_USING_JUCE_NAMESPACE. 47 | using namespace juce; 48 | #endif 49 | 50 | #if ! JUCE_DONT_DECLARE_PROJECTINFO 51 | namespace ProjectInfo 52 | { 53 | const char* const projectName = "GLPlugin"; 54 | const char* const companyName = ""; 55 | const char* const versionString = "1.0.0"; 56 | const int versionNumber = 0x10000; 57 | } 58 | #endif 59 | -------------------------------------------------------------------------------- /JuceLibraryCode/ReadMe.txt: -------------------------------------------------------------------------------- 1 | 2 | Important Note!! 3 | ================ 4 | 5 | The purpose of this folder is to contain files that are auto-generated by the Projucer, 6 | and ALL files in this folder will be mercilessly DELETED and completely re-written whenever 7 | the Projucer saves your project. 8 | 9 | Therefore, it's a bad idea to make any manual changes to the files in here, or to 10 | put any of your own files in here if you don't want to lose them. (Of course you may choose 11 | to add the folder's contents to your version-control system so that you can re-merge your own 12 | modifications after the Projucer has saved its changes). 13 | -------------------------------------------------------------------------------- /JuceLibraryCode/include_juce_audio_basics.cpp: -------------------------------------------------------------------------------- 1 | /* 2 | 3 | IMPORTANT! This file is auto-generated each time you save your 4 | project - if you alter its contents, your changes may be overwritten! 5 | 6 | */ 7 | 8 | #include "AppConfig.h" 9 | #include 10 | -------------------------------------------------------------------------------- /JuceLibraryCode/include_juce_audio_basics.mm: -------------------------------------------------------------------------------- 1 | /* 2 | 3 | IMPORTANT! This file is auto-generated each time you save your 4 | project - if you alter its contents, your changes may be overwritten! 5 | 6 | */ 7 | 8 | #include "AppConfig.h" 9 | #include 10 | -------------------------------------------------------------------------------- /JuceLibraryCode/include_juce_audio_devices.cpp: -------------------------------------------------------------------------------- 1 | /* 2 | 3 | IMPORTANT! This file is auto-generated each time you save your 4 | project - if you alter its contents, your changes may be overwritten! 5 | 6 | */ 7 | 8 | #include "AppConfig.h" 9 | #include 10 | -------------------------------------------------------------------------------- /JuceLibraryCode/include_juce_audio_devices.mm: -------------------------------------------------------------------------------- 1 | /* 2 | 3 | IMPORTANT! This file is auto-generated each time you save your 4 | project - if you alter its contents, your changes may be overwritten! 5 | 6 | */ 7 | 8 | #include "AppConfig.h" 9 | #include 10 | -------------------------------------------------------------------------------- /JuceLibraryCode/include_juce_audio_formats.cpp: -------------------------------------------------------------------------------- 1 | /* 2 | 3 | IMPORTANT! This file is auto-generated each time you save your 4 | project - if you alter its contents, your changes may be overwritten! 5 | 6 | */ 7 | 8 | #include "AppConfig.h" 9 | #include 10 | -------------------------------------------------------------------------------- /JuceLibraryCode/include_juce_audio_formats.mm: -------------------------------------------------------------------------------- 1 | /* 2 | 3 | IMPORTANT! This file is auto-generated each time you save your 4 | project - if you alter its contents, your changes may be overwritten! 5 | 6 | */ 7 | 8 | #include "AppConfig.h" 9 | #include 10 | -------------------------------------------------------------------------------- /JuceLibraryCode/include_juce_audio_plugin_client_AAX.cpp: -------------------------------------------------------------------------------- 1 | /* 2 | 3 | IMPORTANT! This file is auto-generated each time you save your 4 | project - if you alter its contents, your changes may be overwritten! 5 | 6 | */ 7 | 8 | #include "AppConfig.h" 9 | #include 10 | -------------------------------------------------------------------------------- /JuceLibraryCode/include_juce_audio_plugin_client_AAX.mm: -------------------------------------------------------------------------------- 1 | /* 2 | 3 | IMPORTANT! This file is auto-generated each time you save your 4 | project - if you alter its contents, your changes may be overwritten! 5 | 6 | */ 7 | 8 | #include "AppConfig.h" 9 | #include 10 | -------------------------------------------------------------------------------- /JuceLibraryCode/include_juce_audio_plugin_client_AU.r: -------------------------------------------------------------------------------- 1 | /* 2 | 3 | IMPORTANT! This file is auto-generated each time you save your 4 | project - if you alter its contents, your changes may be overwritten! 5 | 6 | */ 7 | 8 | #include "AppConfig.h" 9 | #include 10 | -------------------------------------------------------------------------------- /JuceLibraryCode/include_juce_audio_plugin_client_AU_1.mm: -------------------------------------------------------------------------------- 1 | /* 2 | 3 | IMPORTANT! This file is auto-generated each time you save your 4 | project - if you alter its contents, your changes may be overwritten! 5 | 6 | */ 7 | 8 | #include "AppConfig.h" 9 | #include 10 | -------------------------------------------------------------------------------- /JuceLibraryCode/include_juce_audio_plugin_client_AU_2.mm: -------------------------------------------------------------------------------- 1 | /* 2 | 3 | IMPORTANT! This file is auto-generated each time you save your 4 | project - if you alter its contents, your changes may be overwritten! 5 | 6 | */ 7 | 8 | #include "AppConfig.h" 9 | #include 10 | -------------------------------------------------------------------------------- /JuceLibraryCode/include_juce_audio_plugin_client_AUv3.mm: -------------------------------------------------------------------------------- 1 | /* 2 | 3 | IMPORTANT! This file is auto-generated each time you save your 4 | project - if you alter its contents, your changes may be overwritten! 5 | 6 | */ 7 | 8 | #include "AppConfig.h" 9 | #include 10 | -------------------------------------------------------------------------------- /JuceLibraryCode/include_juce_audio_plugin_client_RTAS.r: -------------------------------------------------------------------------------- 1 | /* 2 | 3 | IMPORTANT! This file is auto-generated each time you save your 4 | project - if you alter its contents, your changes may be overwritten! 5 | 6 | */ 7 | 8 | #include "AppConfig.h" 9 | #include 10 | -------------------------------------------------------------------------------- /JuceLibraryCode/include_juce_audio_plugin_client_RTAS_1.cpp: -------------------------------------------------------------------------------- 1 | /* 2 | 3 | IMPORTANT! This file is auto-generated each time you save your 4 | project - if you alter its contents, your changes may be overwritten! 5 | 6 | */ 7 | 8 | #include "AppConfig.h" 9 | #include 10 | -------------------------------------------------------------------------------- /JuceLibraryCode/include_juce_audio_plugin_client_RTAS_2.cpp: -------------------------------------------------------------------------------- 1 | /* 2 | 3 | IMPORTANT! This file is auto-generated each time you save your 4 | project - if you alter its contents, your changes may be overwritten! 5 | 6 | */ 7 | 8 | #include "AppConfig.h" 9 | #include 10 | -------------------------------------------------------------------------------- /JuceLibraryCode/include_juce_audio_plugin_client_RTAS_3.cpp: -------------------------------------------------------------------------------- 1 | /* 2 | 3 | IMPORTANT! This file is auto-generated each time you save your 4 | project - if you alter its contents, your changes may be overwritten! 5 | 6 | */ 7 | 8 | #include "AppConfig.h" 9 | #include 10 | -------------------------------------------------------------------------------- /JuceLibraryCode/include_juce_audio_plugin_client_RTAS_4.cpp: -------------------------------------------------------------------------------- 1 | /* 2 | 3 | IMPORTANT! This file is auto-generated each time you save your 4 | project - if you alter its contents, your changes may be overwritten! 5 | 6 | */ 7 | 8 | #include "AppConfig.h" 9 | #include 10 | -------------------------------------------------------------------------------- /JuceLibraryCode/include_juce_audio_plugin_client_RTAS_utils.cpp: -------------------------------------------------------------------------------- 1 | /* 2 | 3 | IMPORTANT! This file is auto-generated each time you save your 4 | project - if you alter its contents, your changes may be overwritten! 5 | 6 | */ 7 | 8 | #include "AppConfig.h" 9 | #include 10 | -------------------------------------------------------------------------------- /JuceLibraryCode/include_juce_audio_plugin_client_RTAS_utils.mm: -------------------------------------------------------------------------------- 1 | /* 2 | 3 | IMPORTANT! This file is auto-generated each time you save your 4 | project - if you alter its contents, your changes may be overwritten! 5 | 6 | */ 7 | 8 | #include "AppConfig.h" 9 | #include 10 | -------------------------------------------------------------------------------- /JuceLibraryCode/include_juce_audio_plugin_client_Standalone.cpp: -------------------------------------------------------------------------------- 1 | /* 2 | 3 | IMPORTANT! This file is auto-generated each time you save your 4 | project - if you alter its contents, your changes may be overwritten! 5 | 6 | */ 7 | 8 | #include "AppConfig.h" 9 | #include 10 | -------------------------------------------------------------------------------- /JuceLibraryCode/include_juce_audio_plugin_client_Unity.cpp: -------------------------------------------------------------------------------- 1 | /* 2 | 3 | IMPORTANT! This file is auto-generated each time you save your 4 | project - if you alter its contents, your changes may be overwritten! 5 | 6 | */ 7 | 8 | #include "AppConfig.h" 9 | #include 10 | -------------------------------------------------------------------------------- /JuceLibraryCode/include_juce_audio_plugin_client_VST2.cpp: -------------------------------------------------------------------------------- 1 | /* 2 | 3 | IMPORTANT! This file is auto-generated each time you save your 4 | project - if you alter its contents, your changes may be overwritten! 5 | 6 | */ 7 | 8 | #include "AppConfig.h" 9 | #include 10 | -------------------------------------------------------------------------------- /JuceLibraryCode/include_juce_audio_plugin_client_VST3.cpp: -------------------------------------------------------------------------------- 1 | /* 2 | 3 | IMPORTANT! This file is auto-generated each time you save your 4 | project - if you alter its contents, your changes may be overwritten! 5 | 6 | */ 7 | 8 | #include "AppConfig.h" 9 | #include 10 | -------------------------------------------------------------------------------- /JuceLibraryCode/include_juce_audio_plugin_client_VST_utils.mm: -------------------------------------------------------------------------------- 1 | /* 2 | 3 | IMPORTANT! This file is auto-generated each time you save your 4 | project - if you alter its contents, your changes may be overwritten! 5 | 6 | */ 7 | 8 | #include "AppConfig.h" 9 | #include 10 | -------------------------------------------------------------------------------- /JuceLibraryCode/include_juce_audio_plugin_client_utils.cpp: -------------------------------------------------------------------------------- 1 | /* 2 | 3 | IMPORTANT! This file is auto-generated each time you save your 4 | project - if you alter its contents, your changes may be overwritten! 5 | 6 | */ 7 | 8 | #include "AppConfig.h" 9 | #include 10 | -------------------------------------------------------------------------------- /JuceLibraryCode/include_juce_audio_processors.cpp: -------------------------------------------------------------------------------- 1 | /* 2 | 3 | IMPORTANT! This file is auto-generated each time you save your 4 | project - if you alter its contents, your changes may be overwritten! 5 | 6 | */ 7 | 8 | #include "AppConfig.h" 9 | #include 10 | -------------------------------------------------------------------------------- /JuceLibraryCode/include_juce_audio_processors.mm: -------------------------------------------------------------------------------- 1 | /* 2 | 3 | IMPORTANT! This file is auto-generated each time you save your 4 | project - if you alter its contents, your changes may be overwritten! 5 | 6 | */ 7 | 8 | #include "AppConfig.h" 9 | #include 10 | -------------------------------------------------------------------------------- /JuceLibraryCode/include_juce_audio_utils.cpp: -------------------------------------------------------------------------------- 1 | /* 2 | 3 | IMPORTANT! This file is auto-generated each time you save your 4 | project - if you alter its contents, your changes may be overwritten! 5 | 6 | */ 7 | 8 | #include "AppConfig.h" 9 | #include 10 | -------------------------------------------------------------------------------- /JuceLibraryCode/include_juce_audio_utils.mm: -------------------------------------------------------------------------------- 1 | /* 2 | 3 | IMPORTANT! This file is auto-generated each time you save your 4 | project - if you alter its contents, your changes may be overwritten! 5 | 6 | */ 7 | 8 | #include "AppConfig.h" 9 | #include 10 | -------------------------------------------------------------------------------- /JuceLibraryCode/include_juce_core.cpp: -------------------------------------------------------------------------------- 1 | /* 2 | 3 | IMPORTANT! This file is auto-generated each time you save your 4 | project - if you alter its contents, your changes may be overwritten! 5 | 6 | */ 7 | 8 | #include "AppConfig.h" 9 | #include 10 | -------------------------------------------------------------------------------- /JuceLibraryCode/include_juce_core.mm: -------------------------------------------------------------------------------- 1 | /* 2 | 3 | IMPORTANT! This file is auto-generated each time you save your 4 | project - if you alter its contents, your changes may be overwritten! 5 | 6 | */ 7 | 8 | #include "AppConfig.h" 9 | #include 10 | -------------------------------------------------------------------------------- /JuceLibraryCode/include_juce_cryptography.cpp: -------------------------------------------------------------------------------- 1 | /* 2 | 3 | IMPORTANT! This file is auto-generated each time you save your 4 | project - if you alter its contents, your changes may be overwritten! 5 | 6 | */ 7 | 8 | #include "AppConfig.h" 9 | #include 10 | -------------------------------------------------------------------------------- /JuceLibraryCode/include_juce_cryptography.mm: -------------------------------------------------------------------------------- 1 | /* 2 | 3 | IMPORTANT! This file is auto-generated each time you save your 4 | project - if you alter its contents, your changes may be overwritten! 5 | 6 | */ 7 | 8 | #include "AppConfig.h" 9 | #include 10 | -------------------------------------------------------------------------------- /JuceLibraryCode/include_juce_data_structures.cpp: -------------------------------------------------------------------------------- 1 | /* 2 | 3 | IMPORTANT! This file is auto-generated each time you save your 4 | project - if you alter its contents, your changes may be overwritten! 5 | 6 | */ 7 | 8 | #include "AppConfig.h" 9 | #include 10 | -------------------------------------------------------------------------------- /JuceLibraryCode/include_juce_data_structures.mm: -------------------------------------------------------------------------------- 1 | /* 2 | 3 | IMPORTANT! This file is auto-generated each time you save your 4 | project - if you alter its contents, your changes may be overwritten! 5 | 6 | */ 7 | 8 | #include "AppConfig.h" 9 | #include 10 | -------------------------------------------------------------------------------- /JuceLibraryCode/include_juce_events.cpp: -------------------------------------------------------------------------------- 1 | /* 2 | 3 | IMPORTANT! This file is auto-generated each time you save your 4 | project - if you alter its contents, your changes may be overwritten! 5 | 6 | */ 7 | 8 | #include "AppConfig.h" 9 | #include 10 | -------------------------------------------------------------------------------- /JuceLibraryCode/include_juce_events.mm: -------------------------------------------------------------------------------- 1 | /* 2 | 3 | IMPORTANT! This file is auto-generated each time you save your 4 | project - if you alter its contents, your changes may be overwritten! 5 | 6 | */ 7 | 8 | #include "AppConfig.h" 9 | #include 10 | -------------------------------------------------------------------------------- /JuceLibraryCode/include_juce_graphics.cpp: -------------------------------------------------------------------------------- 1 | /* 2 | 3 | IMPORTANT! This file is auto-generated each time you save your 4 | project - if you alter its contents, your changes may be overwritten! 5 | 6 | */ 7 | 8 | #include "AppConfig.h" 9 | #include 10 | -------------------------------------------------------------------------------- /JuceLibraryCode/include_juce_graphics.mm: -------------------------------------------------------------------------------- 1 | /* 2 | 3 | IMPORTANT! This file is auto-generated each time you save your 4 | project - if you alter its contents, your changes may be overwritten! 5 | 6 | */ 7 | 8 | #include "AppConfig.h" 9 | #include 10 | -------------------------------------------------------------------------------- /JuceLibraryCode/include_juce_gui_basics.cpp: -------------------------------------------------------------------------------- 1 | /* 2 | 3 | IMPORTANT! This file is auto-generated each time you save your 4 | project - if you alter its contents, your changes may be overwritten! 5 | 6 | */ 7 | 8 | #include "AppConfig.h" 9 | #include 10 | -------------------------------------------------------------------------------- /JuceLibraryCode/include_juce_gui_basics.mm: -------------------------------------------------------------------------------- 1 | /* 2 | 3 | IMPORTANT! This file is auto-generated each time you save your 4 | project - if you alter its contents, your changes may be overwritten! 5 | 6 | */ 7 | 8 | #include "AppConfig.h" 9 | #include 10 | -------------------------------------------------------------------------------- /JuceLibraryCode/include_juce_gui_extra.cpp: -------------------------------------------------------------------------------- 1 | /* 2 | 3 | IMPORTANT! This file is auto-generated each time you save your 4 | project - if you alter its contents, your changes may be overwritten! 5 | 6 | */ 7 | 8 | #include "AppConfig.h" 9 | #include 10 | -------------------------------------------------------------------------------- /JuceLibraryCode/include_juce_gui_extra.mm: -------------------------------------------------------------------------------- 1 | /* 2 | 3 | IMPORTANT! This file is auto-generated each time you save your 4 | project - if you alter its contents, your changes may be overwritten! 5 | 6 | */ 7 | 8 | #include "AppConfig.h" 9 | #include 10 | -------------------------------------------------------------------------------- /JuceLibraryCode/include_juce_opengl.cpp: -------------------------------------------------------------------------------- 1 | /* 2 | 3 | IMPORTANT! This file is auto-generated each time you save your 4 | project - if you alter its contents, your changes may be overwritten! 5 | 6 | */ 7 | 8 | #include "AppConfig.h" 9 | #include 10 | -------------------------------------------------------------------------------- /JuceLibraryCode/include_juce_opengl.mm: -------------------------------------------------------------------------------- 1 | /* 2 | 3 | IMPORTANT! This file is auto-generated each time you save your 4 | project - if you alter its contents, your changes may be overwritten! 5 | 6 | */ 7 | 8 | #include "AppConfig.h" 9 | #include 10 | -------------------------------------------------------------------------------- /JuceLibraryCode/include_juce_video.cpp: -------------------------------------------------------------------------------- 1 | /* 2 | 3 | IMPORTANT! This file is auto-generated each time you save your 4 | project - if you alter its contents, your changes may be overwritten! 5 | 6 | */ 7 | 8 | #include "AppConfig.h" 9 | #include 10 | -------------------------------------------------------------------------------- /JuceLibraryCode/include_juce_video.mm: -------------------------------------------------------------------------------- 1 | /* 2 | 3 | IMPORTANT! This file is auto-generated each time you save your 4 | project - if you alter its contents, your changes may be overwritten! 5 | 6 | */ 7 | 8 | #include "AppConfig.h" 9 | #include 10 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2021 Ross Hoyt 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Spiral Array 3D Visualizer Plugin - C++, JUCE, OpenGL 2 | 3 | A 3D MIDI visualizer that listens to incoming MIDI and generates a 3D visualization using the helix 'Spiral-Array' model rendered with OpenGL. A full video demonstration of the plugin can be viewed [here!](https://www.youtube.com/watch?v=Tsdqzs6BkKM) 4 | 5 | ![example](../media/GLDEMO2_yt.gif?raw=true) 6 | 7 | ## References: 8 | [Chew, Elaine & Chen, Y.-C. (2002). Mapping Midi to the Spiral Array: Disambiguating Pitch Spellings. 21. 10.1007/978-1-4615-1043-7_13.](https://www.academia.edu/31215169/Mapping_midi_to_the_spiral_array_Disambiguating_pitch_spellings). 9 | -------------------------------------------------------------------------------- /Source/Attributes.h: -------------------------------------------------------------------------------- 1 | /* 2 | ============================================================================== 3 | 4 | Ross Hoyt 5 | Attributes.h 6 | This class manages the attributes that the shaders use 7 | ============================================================================== 8 | */ 9 | 10 | #pragma once 11 | #include "Vertex.h" 12 | 13 | //============================================================================== 14 | struct Attributes 15 | { 16 | Attributes (OpenGLContext& openGLContext, OpenGLShaderProgram& shader) 17 | { 18 | position = createAttribute (openGLContext, shader, "position"); 19 | normal = createAttribute (openGLContext, shader, "normal"); 20 | sourceColour = createAttribute (openGLContext, shader, "sourceColour"); 21 | texureCoordIn = createAttribute (openGLContext, shader, "texureCoordIn"); 22 | } 23 | 24 | void enable (OpenGLContext& openGLContext) 25 | { 26 | if (position != nullptr) 27 | { 28 | openGLContext.extensions.glVertexAttribPointer (position->attributeID, 3, GL_FLOAT, GL_FALSE, sizeof (Vertex), 0); 29 | openGLContext.extensions.glEnableVertexAttribArray (position->attributeID); 30 | } 31 | 32 | if (normal != nullptr) 33 | { 34 | openGLContext.extensions.glVertexAttribPointer (normal->attributeID, 3, GL_FLOAT, GL_FALSE, sizeof (Vertex), (GLvoid*) (sizeof (float) * 3)); 35 | openGLContext.extensions.glEnableVertexAttribArray (normal->attributeID); 36 | } 37 | 38 | if (sourceColour != nullptr) 39 | { 40 | openGLContext.extensions.glVertexAttribPointer (sourceColour->attributeID, 4, GL_FLOAT, GL_FALSE, sizeof (Vertex), (GLvoid*) (sizeof (float) * 6)); 41 | openGLContext.extensions.glEnableVertexAttribArray (sourceColour->attributeID); 42 | } 43 | 44 | if (texureCoordIn != nullptr) 45 | { 46 | openGLContext.extensions.glVertexAttribPointer (texureCoordIn->attributeID, 2, GL_FLOAT, GL_FALSE, sizeof (Vertex), (GLvoid*) (sizeof (float) * 10)); 47 | openGLContext.extensions.glEnableVertexAttribArray (texureCoordIn->attributeID); 48 | } 49 | } 50 | 51 | void disable (OpenGLContext& openGLContext) 52 | { 53 | if (position != nullptr) openGLContext.extensions.glDisableVertexAttribArray (position->attributeID); 54 | if (normal != nullptr) openGLContext.extensions.glDisableVertexAttribArray (normal->attributeID); 55 | if (sourceColour != nullptr) openGLContext.extensions.glDisableVertexAttribArray (sourceColour->attributeID); 56 | if (texureCoordIn != nullptr) openGLContext.extensions.glDisableVertexAttribArray (texureCoordIn->attributeID); 57 | } 58 | 59 | ScopedPointer position, normal, sourceColour, texureCoordIn; 60 | 61 | private: 62 | static OpenGLShaderProgram::Attribute* createAttribute (OpenGLContext& openGLContext, 63 | OpenGLShaderProgram& shader, 64 | const char* attributeName) 65 | { 66 | if (openGLContext.extensions.glGetAttribLocation (shader.getProgramID(), attributeName) < 0) 67 | return nullptr; 68 | 69 | return new OpenGLShaderProgram::Attribute (shader, attributeName); 70 | } 71 | }; 72 | -------------------------------------------------------------------------------- /Source/GLUtils.h: -------------------------------------------------------------------------------- 1 | /* 2 | ============================================================================== 3 | 4 | Ross Hoyt 5 | Utility.h 6 | 7 | 8 | ============================================================================== 9 | */ 10 | 11 | #pragma once 12 | #include "ShaderPreset.h" 13 | 14 | static Image resizeImageToPowerOfTwo (Image image) 15 | { 16 | if (! (isPowerOfTwo (image.getWidth()) && isPowerOfTwo (image.getHeight()))) 17 | return image.rescaled (jmin (1024, nextPowerOfTwo (image.getWidth())), 18 | jmin (1024, nextPowerOfTwo (image.getHeight()))); 19 | 20 | return image; 21 | } 22 | 23 | static Array getShaderPresets() 24 | { 25 | ShaderPreset presets[] = 26 | { 27 | { 28 | "Spiral Array Shader", 29 | 30 | "attribute vec4 position;\n" 31 | "attribute vec4 sourceColour;\n" 32 | "attribute vec2 textureCoordIn;\n" 33 | "\n" 34 | "uniform mat4 projectionMatrix;\n" 35 | "uniform mat4 viewMatrix;\n" 36 | "\n" 37 | "varying vec4 destinationColour;\n" 38 | "varying vec2 textureCoordOut;\n" 39 | "\n" 40 | "varying float xPos;\n" 41 | "varying float yPos;\n" 42 | "varying float zPos;\n" 43 | "\n" 44 | "void main()\n" 45 | "{\n" 46 | " vec4 v = vec4 (position);\n" 47 | " xPos = clamp (v.x, 0.0, 1.0);\n" 48 | " yPos = clamp (v.y, 0.0, 1.0);\n" 49 | " zPos = clamp (v.z, 0.0, 1.0);\n" 50 | " gl_Position = projectionMatrix * viewMatrix * position;\n" 51 | "}", 52 | 53 | 54 | #if JUCE_OPENGL_ES 55 | "varying lowp vec4 destinationColour;\n" 56 | "varying lowp vec2 textureCoordOut;\n" 57 | "varying lowp float xPos;\n" 58 | "varying lowp float yPos;\n" 59 | "varying lowp float zPos;\n" 60 | #else 61 | "varying vec4 destinationColour;\n" 62 | "varying vec2 textureCoordOut;\n" 63 | "varying float xPos;\n" 64 | "varying float yPos;\n" 65 | "varying float zPos;\n" 66 | #endif 67 | "\n" 68 | "void main()\n" 69 | "{\n" 70 | " gl_FragColor = vec4 (xPos, yPos, zPos, 1.0);\n" 71 | "}" 72 | }, 73 | 74 | { 75 | "Texture + Lighting", 76 | 77 | 78 | "attribute vec4 position;\n" 79 | "attribute vec4 normal;\n" 80 | "attribute vec4 sourceColour;\n" 81 | "attribute vec2 textureCoordIn;\n" 82 | "\n" 83 | "uniform mat4 projectionMatrix;\n" 84 | "uniform mat4 viewMatrix;\n" 85 | "uniform vec4 lightPosition;\n" 86 | "\n" 87 | "varying vec4 destinationColour;\n" 88 | "varying vec2 textureCoordOut;\n" 89 | "varying float lightIntensity;\n" 90 | "\n" 91 | "void main()\n" 92 | "{\n" 93 | " destinationColour = sourceColour;\n" 94 | " textureCoordOut = textureCoordIn;\n" 95 | "\n" 96 | " vec4 light = viewMatrix * lightPosition;\n" 97 | " lightIntensity = dot (light, normal);\n" 98 | " gl_Position = projectionMatrix * viewMatrix * position;\n" 99 | "}\n", 100 | 101 | 102 | #if JUCE_OPENGL_ES 103 | "varying lowp vec4 destinationColour;\n" 104 | "varying lowp vec2 textureCoordOut;\n" 105 | "varying highp float lightIntensity;\n" 106 | #else 107 | "varying vec4 destinationColour;\n" 108 | "varying vec2 textureCoordOut;\n" 109 | "varying float lightIntensity;\n" 110 | #endif 111 | "\n" 112 | "uniform sampler2D demoTexture;\n" 113 | "\n" 114 | "void main()\n" 115 | "{\n" 116 | #if JUCE_OPENGL_ES 117 | " highp float l = max (0.3, lightIntensity * 0.3);\n" 118 | " highp vec4 colour = vec4 (l, l, l, 1.0);\n" 119 | #else 120 | " float l = max (0.3, lightIntensity * 0.3);\n" 121 | " vec4 colour = vec4 (l, l, l, 1.0);\n" 122 | #endif 123 | " gl_FragColor = colour * texture2D (demoTexture, textureCoordOut);\n" 124 | "}\n" 125 | }, 126 | 127 | { 128 | "Textured", 129 | 130 | 131 | "attribute vec4 position;\n" 132 | "attribute vec4 sourceColour;\n" 133 | "attribute vec2 textureCoordIn;\n" 134 | "\n" 135 | "uniform mat4 projectionMatrix;\n" 136 | "uniform mat4 viewMatrix;\n" 137 | "\n" 138 | "varying vec4 destinationColour;\n" 139 | "varying vec2 textureCoordOut;\n" 140 | "\n" 141 | "void main()\n" 142 | "{\n" 143 | " destinationColour = sourceColour;\n" 144 | " textureCoordOut = textureCoordIn;\n" 145 | " gl_Position = projectionMatrix * viewMatrix * position;\n" 146 | "}\n", 147 | 148 | 149 | #if JUCE_OPENGL_ES 150 | "varying lowp vec4 destinationColour;\n" 151 | "varying lowp vec2 textureCoordOut;\n" 152 | #else 153 | "varying vec4 destinationColour;\n" 154 | "varying vec2 textureCoordOut;\n" 155 | #endif 156 | "\n" 157 | "uniform sampler2D demoTexture;\n" 158 | "\n" 159 | "void main()\n" 160 | "{\n" 161 | " gl_FragColor = texture2D (demoTexture, textureCoordOut);\n" 162 | "}\n" 163 | }, 164 | 165 | { 166 | "Flat Colour", 167 | 168 | 169 | "attribute vec4 position;\n" 170 | "attribute vec4 sourceColour;\n" 171 | "attribute vec2 textureCoordIn;\n" 172 | "\n" 173 | "uniform mat4 projectionMatrix;\n" 174 | "uniform mat4 viewMatrix;\n" 175 | "\n" 176 | "varying vec4 destinationColour;\n" 177 | "varying vec2 textureCoordOut;\n" 178 | "\n" 179 | "void main()\n" 180 | "{\n" 181 | " destinationColour = sourceColour;\n" 182 | " textureCoordOut = textureCoordIn;\n" 183 | " gl_Position = projectionMatrix * viewMatrix * position;\n" 184 | "}\n", 185 | 186 | 187 | #if JUCE_OPENGL_ES 188 | "varying lowp vec4 destinationColour;\n" 189 | "varying lowp vec2 textureCoordOut;\n" 190 | #else 191 | "varying vec4 destinationColour;\n" 192 | "varying vec2 textureCoordOut;\n" 193 | #endif 194 | "\n" 195 | "void main()\n" 196 | "{\n" 197 | " gl_FragColor = destinationColour;\n" 198 | "}\n" 199 | }, 200 | 201 | { 202 | "Rainbow", 203 | 204 | 205 | "attribute vec4 position;\n" 206 | "attribute vec4 sourceColour;\n" 207 | "attribute vec2 textureCoordIn;\n" 208 | "\n" 209 | "uniform mat4 projectionMatrix;\n" 210 | "uniform mat4 viewMatrix;\n" 211 | "\n" 212 | "varying vec4 destinationColour;\n" 213 | "varying vec2 textureCoordOut;\n" 214 | "\n" 215 | "varying float xPos;\n" 216 | "varying float yPos;\n" 217 | "varying float zPos;\n" 218 | "\n" 219 | "void main()\n" 220 | "{\n" 221 | " vec4 v = vec4 (position);\n" 222 | " xPos = clamp (v.x, 0.0, 1.0);\n" 223 | " yPos = clamp (v.y, 0.0, 1.0);\n" 224 | " zPos = clamp (v.z, 0.0, 1.0);\n" 225 | " gl_Position = projectionMatrix * viewMatrix * position;\n" 226 | "}", 227 | 228 | 229 | #if JUCE_OPENGL_ES 230 | "varying lowp vec4 destinationColour;\n" 231 | "varying lowp vec2 textureCoordOut;\n" 232 | "varying lowp float xPos;\n" 233 | "varying lowp float yPos;\n" 234 | "varying lowp float zPos;\n" 235 | #else 236 | "varying vec4 destinationColour;\n" 237 | "varying vec2 textureCoordOut;\n" 238 | "varying float xPos;\n" 239 | "varying float yPos;\n" 240 | "varying float zPos;\n" 241 | #endif 242 | "\n" 243 | "void main()\n" 244 | "{\n" 245 | " gl_FragColor = vec4 (xPos, yPos, zPos, 1.0);\n" 246 | "}" 247 | }, 248 | 249 | { 250 | "Changing Colour", 251 | "attribute vec4 position;\n" 252 | "attribute vec2 textureCoordIn;\n" 253 | "\n" 254 | "uniform mat4 projectionMatrix;\n" 255 | "uniform mat4 viewMatrix;\n" 256 | "\n" 257 | "varying vec2 textureCoordOut;\n" 258 | "\n" 259 | "void main()\n" 260 | "{\n" 261 | " textureCoordOut = textureCoordIn;\n" 262 | " gl_Position = projectionMatrix * viewMatrix * position;\n" 263 | " //(projectionMatrix + mat4(gl_InstanceID, 1, 1, 1))\n" 264 | " int id = gl_InstanceID;\n" 265 | "}\n", 266 | 267 | 268 | "#define PI 3.1415926535897932384626433832795\n" 269 | "\n" 270 | #if JUCE_OPENGL_ES 271 | "precision mediump float;\n" 272 | "varying lowp vec2 textureCoordOut;\n" 273 | #else 274 | "varying vec2 textureCoordOut;\n" 275 | #endif 276 | "uniform float bouncingNumber;\n" 277 | "\n" 278 | "void main()\n" 279 | "{\n" 280 | " float b = bouncingNumber;\n" 281 | " float n = b * PI * 2.0;\n" 282 | " float sn = (sin (n * textureCoordOut.x) * 0.5) + 0.5;\n" 283 | " float cn = (sin (n * textureCoordOut.y) * 0.5) + 0.5;\n" 284 | "\n" 285 | " vec4 col = vec4 (b, sn, cn, 1.0);\n" 286 | " gl_FragColor = col;\n" 287 | "}\n" 288 | }, 289 | 290 | { 291 | "Simple Light", 292 | 293 | 294 | "attribute vec4 position;\n" 295 | "attribute vec4 normal;\n" 296 | "\n" 297 | "uniform mat4 projectionMatrix;\n" 298 | "uniform mat4 viewMatrix;\n" 299 | "uniform vec4 lightPosition;\n" 300 | "\n" 301 | "varying float lightIntensity;\n" 302 | "\n" 303 | "void main()\n" 304 | "{\n" 305 | " vec4 light = viewMatrix * lightPosition;\n" 306 | " lightIntensity = dot (light, normal);\n" 307 | "\n" 308 | " gl_Position = projectionMatrix * viewMatrix * position;\n" 309 | "}\n", 310 | 311 | 312 | #if JUCE_OPENGL_ES 313 | "varying highp float lightIntensity;\n" 314 | #else 315 | "varying float lightIntensity;\n" 316 | #endif 317 | "\n" 318 | "void main()\n" 319 | "{\n" 320 | #if JUCE_OPENGL_ES 321 | " highp float l = lightIntensity * 0.25;\n" 322 | " highp vec4 colour = vec4 (l, l, l, 1.0);\n" 323 | #else 324 | " float l = lightIntensity * 0.25;\n" 325 | " vec4 colour = vec4 (l, l, l, 1.0);\n" 326 | #endif 327 | "\n" 328 | " gl_FragColor = colour;\n" 329 | "}\n" 330 | }, 331 | 332 | { 333 | "Flattened", 334 | 335 | 336 | "attribute vec4 position;\n" 337 | "attribute vec4 normal;\n" 338 | "\n" 339 | "uniform mat4 projectionMatrix;\n" 340 | "uniform mat4 viewMatrix;\n" 341 | "uniform vec4 lightPosition;\n" 342 | "\n" 343 | "varying float lightIntensity;\n" 344 | "\n" 345 | "void main()\n" 346 | "{\n" 347 | " vec4 light = viewMatrix * lightPosition;\n" 348 | " lightIntensity = dot (light, normal);\n" 349 | "\n" 350 | " vec4 v = vec4 (position);\n" 351 | " v.z = v.z * 0.1;\n" 352 | "\n" 353 | " gl_Position = projectionMatrix * viewMatrix * v;\n" 354 | "}\n", 355 | 356 | 357 | #if JUCE_OPENGL_ES 358 | "varying highp float lightIntensity;\n" 359 | #else 360 | "varying float lightIntensity;\n" 361 | #endif 362 | "\n" 363 | "void main()\n" 364 | "{\n" 365 | #if JUCE_OPENGL_ES 366 | " highp float l = lightIntensity * 0.25;\n" 367 | " highp vec4 colour = vec4 (l, l, l, 1.0);\n" 368 | #else 369 | " float l = lightIntensity * 0.25;\n" 370 | " vec4 colour = vec4 (l, l, l, 1.0);\n" 371 | #endif 372 | "\n" 373 | " gl_FragColor = colour;\n" 374 | "}\n" 375 | }, 376 | 377 | { 378 | "Toon Shader", 379 | 380 | 381 | "attribute vec4 position;\n" 382 | "attribute vec4 normal;\n" 383 | "\n" 384 | "uniform mat4 projectionMatrix;\n" 385 | "uniform mat4 viewMatrix;\n" 386 | "uniform vec4 lightPosition;\n" 387 | "\n" 388 | "varying float lightIntensity;\n" 389 | "\n" 390 | "void main()\n" 391 | "{\n" 392 | " vec4 light = viewMatrix * lightPosition;\n" 393 | " lightIntensity = dot (light, normal);\n" 394 | "\n" 395 | " gl_Position = projectionMatrix * viewMatrix * position;\n" 396 | "}\n", 397 | 398 | 399 | #if JUCE_OPENGL_ES 400 | "varying highp float lightIntensity;\n" 401 | #else 402 | "varying float lightIntensity;\n" 403 | #endif 404 | "\n" 405 | "void main()\n" 406 | "{\n" 407 | #if JUCE_OPENGL_ES 408 | " highp float intensity = lightIntensity * 0.5;\n" 409 | " highp vec4 colour;\n" 410 | #else 411 | " float intensity = lightIntensity * 0.5;\n" 412 | " vec4 colour;\n" 413 | #endif 414 | "\n" 415 | " if (intensity > 0.95)\n" 416 | " colour = vec4 (1.0, 0.5, 0.5, 1.0);\n" 417 | " else if (intensity > 0.5)\n" 418 | " colour = vec4 (0.6, 0.3, 0.3, 1.0);\n" 419 | " else if (intensity > 0.25)\n" 420 | " colour = vec4 (0.4, 0.2, 0.2, 1.0);\n" 421 | " else\n" 422 | " colour = vec4 (0.2, 0.1, 0.1, 1.0);\n" 423 | "\n" 424 | " gl_FragColor = colour;\n" 425 | "}\n" 426 | } 427 | }; 428 | 429 | return Array (presets, numElementsInArray (presets)); 430 | } 431 | -------------------------------------------------------------------------------- /Source/PluginEditor.cpp: -------------------------------------------------------------------------------- 1 | /* 2 | ============================================================================== 3 | Ross Hoyt 4 | PluginEditor.cpp 5 | ============================================================================== 6 | */ 7 | 8 | #include "PluginProcessor.h" 9 | #include "PluginEditor.h" 10 | #include "WavefrontObjParser.h" 11 | #include "Shape.h" 12 | #include "Textures.h" 13 | #include "Uniforms.h" 14 | #include "Attributes.h" 15 | #include "ShaderPreset.h" 16 | #include "GLUtils.h" 17 | 18 | //============================================================================== 19 | class GLComponent : public Component, private OpenGLRenderer, public Slider::Listener 20 | { 21 | public: 22 | GLComponent(MidiKeyboardState &mKeybState, PluginEditor *par) : 23 | rotation (0.0f), scale (0.5f), rotationSpeed (0.1f), 24 | textureToUse (nullptr), lastTexture (nullptr) 25 | { 26 | parent = par; 27 | 28 | midiKeyboardState = &mKeybState; 29 | Array shaders = getShaderPresets(); 30 | 31 | if (shaders.size() > 0) 32 | { 33 | newVertexShader = shaders.getReference (0).vertexShader; 34 | newFragmentShader = shaders.getReference (0).fragmentShader; 35 | } 36 | 37 | lastTexture = textureToUse = new BuiltInTexture ("Portmeirion", BinaryData::portmeirion_jpg, BinaryData::portmeirion_jpgSize); 38 | 39 | openGLContext.setComponentPaintingEnabled (false); 40 | openGLContext.setContinuousRepainting (true); 41 | 42 | openGLContext.setRenderer (this); 43 | openGLContext.attachTo (*this); 44 | } 45 | 46 | ~GLComponent() 47 | { 48 | openGLContext.detach(); 49 | openGLContext.setRenderer (nullptr); 50 | 51 | if (lastTexture != nullptr) 52 | delete lastTexture; 53 | } 54 | 55 | bool drawPianoKeys = true; 56 | bool drawControlMesh = true; 57 | 58 | String newVertexShader, newFragmentShader; 59 | private: 60 | 61 | void newOpenGLContextCreated() override 62 | { 63 | freeAllContextObjects(); 64 | } 65 | 66 | void renderOpenGL() override 67 | { 68 | jassert (OpenGLHelpers::isContextActive()); 69 | 70 | const float desktopScale = (float) openGLContext.getRenderingScale(); 71 | OpenGLHelpers::clear (Colours::cadetblue); 72 | 73 | updateShader(); // Check whether we need to compile a new shader 74 | 75 | if (shader == nullptr) 76 | return; 77 | 78 | glEnable (GL_DEPTH_TEST); 79 | glDepthFunc (GL_LESS); 80 | glEnable (GL_BLEND); 81 | glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); 82 | openGLContext.extensions.glActiveTexture (GL_TEXTURE0); 83 | glEnable (GL_TEXTURE_2D); 84 | 85 | glViewport (0, 0, roundToInt (desktopScale * getWidth()), roundToInt (desktopScale * getHeight())); 86 | texture.bind(); 87 | 88 | glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); 89 | glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); 90 | 91 | shader->use(); 92 | 93 | if (uniforms->projectionMatrix != nullptr) 94 | uniforms->projectionMatrix->setMatrix4 (getProjectionMatrix().mat, 1, false); 95 | 96 | if (uniforms->texture != nullptr) 97 | uniforms->texture->set ((GLint) 0); 98 | 99 | if (uniforms->lightPosition != nullptr) 100 | uniforms->lightPosition->set (-15.0f, 10.0f, 15.0f, 0.0f); 101 | 102 | 103 | for(int i = 0; i < 128; i++) 104 | { 105 | 106 | if (uniforms->viewMatrix != nullptr) 107 | uniforms->viewMatrix->setMatrix4 (getViewMatrix(i).mat, 1, false); 108 | 109 | // TODO could add automatic MidiChannel Sensing 110 | if(drawPianoKeys) 111 | { 112 | if(drawControlMesh) 113 | shapePianoKey->drawControlMesh(openGLContext, *attributes); 114 | if(midiKeyboardState->isNoteOn(1, i)) 115 | shapePianoKey->draw (openGLContext, *attributes); 116 | } 117 | else 118 | { 119 | if(drawControlMesh) 120 | shapeTeapot->drawControlMesh(openGLContext, *attributes); 121 | if(midiKeyboardState->isNoteOn(1, i)) 122 | shapeTeapot->draw(openGLContext, *attributes); 123 | } 124 | 125 | } 126 | 127 | // Reset the element buffers so child Components draw correctly 128 | openGLContext.extensions.glBindBuffer (GL_ARRAY_BUFFER, 0); 129 | openGLContext.extensions.glBindBuffer (GL_ELEMENT_ARRAY_BUFFER, 0); 130 | 131 | rotation += (float) rotationSpeed; 132 | } 133 | 134 | Matrix3D getProjectionMatrix() const 135 | { 136 | auto w = 1.0f / (scale + 0.1f); 137 | auto h = w * getLocalBounds().toFloat().getAspectRatio (false); 138 | return Matrix3D::fromFrustum (-w, w, -h, h, 4.0f, 30.0f); 139 | } 140 | 141 | Matrix3D getViewMatrix(int i) const 142 | { 143 | int fundamentalPitch = i % 12; 144 | auto viewMatrix = draggableOrientation.getRotationMatrix() 145 | * Vector3D (0.0f, 1.0f, -10.0f); 146 | 147 | float angle = 360.0f / 12.0f; 148 | float rotY = degreesToRadians(angle) * ((fundamentalPitch + 9) % 12); 149 | auto rotationMatrix = Matrix3D::rotation ({ 1.55f, rotY, -1.55f }); 150 | // TODO Control Cylinder Radius with Slider 151 | float cylinderRadius = 2.0f; 152 | 153 | float translateY = i * -.5f + 30.0f; 154 | float translateX = cylinderRadius * sin(degreesToRadians(fundamentalPitch * angle)); 155 | float translateZ = cylinderRadius * cos(degreesToRadians(fundamentalPitch * angle)); 156 | auto translationVector = Matrix3D(Vector3D ({ translateX, translateY, translateZ})); 157 | 158 | return rotationMatrix * translationVector * viewMatrix; 159 | 160 | } 161 | void openGLContextClosing() override 162 | { 163 | freeAllContextObjects(); 164 | 165 | if (lastTexture != nullptr) 166 | setTexture (lastTexture); 167 | } 168 | 169 | void paint(Graphics& g) override {} 170 | 171 | void setTexture (DemoTexture* t) 172 | { 173 | lastTexture = textureToUse = t; 174 | } 175 | 176 | void freeAllContextObjects() 177 | { 178 | shapePianoKey = nullptr; 179 | shader = nullptr; 180 | attributes = nullptr; 181 | uniforms = nullptr; 182 | texture.release(); 183 | } 184 | 185 | void resized() override 186 | { 187 | draggableOrientation.setViewport (getLocalBounds()); 188 | } 189 | 190 | Draggable3DOrientation draggableOrientation; 191 | float rotation; 192 | float scale, rotationSpeed; 193 | 194 | ScopedPointer shader; 195 | ScopedPointer shapePianoKey; 196 | ScopedPointer shapeTeapot; 197 | 198 | ScopedPointer attributes; 199 | ScopedPointer uniforms; 200 | 201 | OpenGLTexture texture; 202 | DemoTexture* textureToUse, *lastTexture; 203 | 204 | OpenGLContext openGLContext; 205 | 206 | //============================================================================== 207 | 208 | 209 | void updateShader() 210 | { 211 | if (newVertexShader.isNotEmpty() || newFragmentShader.isNotEmpty()) 212 | { 213 | ScopedPointer newShader (new OpenGLShaderProgram (openGLContext)); 214 | String statusText; 215 | 216 | if (newShader->addVertexShader (OpenGLHelpers::translateVertexShaderToV3 (newVertexShader)) 217 | && newShader->addFragmentShader (OpenGLHelpers::translateFragmentShaderToV3 (newFragmentShader)) 218 | && newShader->link()) 219 | { 220 | shapePianoKey = nullptr; 221 | shapeTeapot = nullptr; 222 | attributes = nullptr; 223 | uniforms = nullptr; 224 | 225 | shader = newShader; 226 | shader->use(); 227 | 228 | shapePianoKey = new Shape (openGLContext, BinaryData::pianokey_rectangle_obj); 229 | shapeTeapot = new Shape (openGLContext, BinaryData::teapot_obj); 230 | attributes = new Attributes (openGLContext, *shader); 231 | uniforms = new Uniforms (openGLContext, *shader); 232 | 233 | statusText = "GLSL: v" + String (OpenGLShaderProgram::getLanguageVersion(), 2); 234 | } 235 | else 236 | { 237 | statusText = newShader->getLastError(); 238 | } 239 | 240 | newVertexShader = String(); 241 | newFragmentShader = String(); 242 | } 243 | } 244 | 245 | //============================================================================== 246 | // INPUT HANDLING 247 | 248 | void sliderValueChanged (Slider*) override 249 | { 250 | scale = (float) parent->zoomSlider.getValue(); 251 | } 252 | 253 | void mouseDown (const MouseEvent& e) override 254 | { 255 | draggableOrientation.mouseDown (e.getPosition()); 256 | } 257 | 258 | void mouseDrag (const MouseEvent& e) override 259 | { 260 | draggableOrientation.mouseDrag (e.getPosition()); 261 | } 262 | void mouseWheelMove (const MouseEvent&, const MouseWheelDetails& d) override 263 | { 264 | parent->zoomSlider.setValue(parent->zoomSlider.getValue() + d.deltaY); 265 | } 266 | MidiKeyboardState * midiKeyboardState; 267 | PluginEditor *parent; 268 | }; 269 | 270 | //============================================================================== 271 | PluginEditor::PluginEditor (PluginProcessor& p, MidiKeyboardState& midiKeyboardState) 272 | : AudioProcessorEditor (&p), processor (p), midiKeyboardComponent(midiKeyboardState, MidiKeyboardComponent::horizontalKeyboard) 273 | { 274 | // TOP MIDI KEYBOARD DISPLAY 275 | addAndMakeVisible(midiKeyboardComponent); 276 | 277 | // BOTTOM RIGHT - OPENGL DISPLAY 278 | glComponent = new GLComponent(midiKeyboardState, this); 279 | addAndMakeVisible (glComponent); 280 | 281 | // LEFT - OBJ FILE SELECTOR (RADIO BOX GROUP) 282 | radioButtonsObjSelector = new GroupComponent ("OBJ Selector", "Use Obj File:"); 283 | addAndMakeVisible (radioButtonsObjSelector); 284 | togglePianoKeyObj = new ToggleButton("Pianokey_rectangle.obj"); 285 | toggleTeapotObj = new ToggleButton("Teapot.obj"); 286 | togglePianoKeyObj->setRadioGroupId(ObjSelectorButtons); 287 | toggleTeapotObj ->setRadioGroupId(ObjSelectorButtons); 288 | togglePianoKeyObj->onClick = [this] { updateToggleState (togglePianoKeyObj, "Pianokey_rectangle.obj"); }; 289 | toggleTeapotObj ->onClick = [this] { updateToggleState (toggleTeapotObj, "Teapot.obj"); }; 290 | addAndMakeVisible(togglePianoKeyObj); 291 | addAndMakeVisible(toggleTeapotObj); 292 | 293 | // LEFT - ZOOM SLIDER 294 | addAndMakeVisible (zoomSlider); 295 | zoomSlider.setRange (0.0, 1.0, 0.001); 296 | zoomSlider.addListener (glComponent); 297 | zoomSlider.setSliderStyle (Slider::LinearVertical); 298 | zoomLabel.attachToComponent (&zoomSlider, false); 299 | addAndMakeVisible (zoomLabel); 300 | 301 | // LEFT RADIO BOX: Draw Points 302 | toggleDrawControlMesh = new ToggleButton("Draw Points"); 303 | toggleDrawControlMesh->onClick = [this] { updateToggleState (toggleDrawControlMesh, "Draw Points"); }; 304 | addAndMakeVisible(toggleDrawControlMesh); 305 | 306 | 307 | addAndMakeVisible (shaderPresetBox); 308 | shaderPresetBox.onChange = [this] { selectShaderPreset (shaderPresetBox.getSelectedItemIndex()); }; 309 | 310 | auto presets = getShaderPresets(); 311 | 312 | for (int i = 0; i < presets.size(); ++i) 313 | shaderPresetBox.addItem (presets[i].name, i + 1); 314 | 315 | addAndMakeVisible (shaderPresetBoxLabel); 316 | shaderPresetBoxLabel.attachToComponent (&shaderPresetBox, true); 317 | 318 | initialise(); 319 | 320 | //setResizable(true, true); 321 | setSize (1000, 725); 322 | } 323 | 324 | PluginEditor::~PluginEditor() 325 | { 326 | glComponent = nullptr; 327 | } 328 | 329 | void PluginEditor::initialise() 330 | { 331 | togglePianoKeyObj->setToggleState(true, false); 332 | toggleDrawControlMesh->setToggleState(true, false); 333 | zoomSlider .setValue (0.5); 334 | 335 | } 336 | 337 | void PluginEditor::updateToggleState (Button* button, String name) 338 | { 339 | if(name == "Draw Points") glComponent->drawControlMesh = button->getToggleState(); 340 | else if(button->getToggleState()) 341 | { 342 | if(name == "Pianokey_rectangle.obj") glComponent->drawPianoKeys = true; 343 | else if(name == "Teapot.obj") glComponent->drawPianoKeys = false; 344 | } 345 | } 346 | 347 | void PluginEditor::selectShaderPreset (int preset) 348 | { 349 | const auto& p = getShaderPresets()[preset]; 350 | setShaderProgram(p.vertexShader, p.fragmentShader); 351 | } 352 | 353 | void PluginEditor::setShaderProgram (const String& vertexShader, const String& fragmentShader) 354 | { 355 | glComponent->newVertexShader = vertexShader; 356 | glComponent->newFragmentShader = fragmentShader; 357 | } 358 | //============================================================================== 359 | 360 | //============================================================================== 361 | void PluginEditor::paint (Graphics& g) 362 | { 363 | g.fillAll(backgroundColor); 364 | } 365 | 366 | Rectangle PluginEditor::getSubdividedRegion(Rectangle region, int numer, int denom, SubdividedOrientation orientation) 367 | { 368 | int x, y, height, width; 369 | if(orientation == Vertical) 370 | { 371 | x = region.getX(); 372 | width = region.getWidth(); 373 | height = region.getHeight() / denom; 374 | y = region.getY() + numer * height; 375 | } 376 | else 377 | { 378 | y = region.getY(); 379 | height = region.getHeight(); 380 | width = region.getWidth() / denom; 381 | x = region.getX() + numer * width; 382 | } 383 | return Rectangle(x, y, width, height); 384 | } 385 | 386 | void PluginEditor::resized() 387 | { 388 | Rectangle r = getLocalBounds(); 389 | float resizedKeybWidth = r.getWidth() - MARGIN * 2, resizedKeybHeight = r.getHeight() - 5; 390 | float keybWidth = resizedKeybWidth > MAX_KEYB_WIDTH ? MAX_KEYB_WIDTH : resizedKeybWidth; 391 | float keybHeight = resizedKeybHeight > MAX_KEYB_HEIGHT ? MAX_KEYB_HEIGHT : resizedKeybHeight; 392 | midiKeyboardComponent.setBounds (MARGIN, MARGIN, keybWidth, keybHeight ); 393 | 394 | auto areaBelowKeyboard = r.removeFromBottom(r.getHeight() - (keybHeight + MARGIN)); 395 | 396 | int leftToolbarWidth = r.getWidth() / 7; 397 | 398 | auto glArea = areaBelowKeyboard.removeFromRight(r.getWidth() - leftToolbarWidth); 399 | glComponent->setBounds(glArea); 400 | 401 | auto leftButtonToolbarArea = areaBelowKeyboard.removeFromLeft(glArea.getWidth()); 402 | auto radioObjSelectorRegion = leftButtonToolbarArea.removeFromTop((BUTTON_HEIGHT * 2 + MARGIN*3)); 403 | radioObjSelectorRegion.translate(0, MARGIN); 404 | radioButtonsObjSelector->setBounds (radioObjSelectorRegion);//MARGIN, keybHeight + MARGIN, 220, 140); 405 | togglePianoKeyObj->setBounds(getSubdividedRegion(radioObjSelectorRegion, 1, 3, Vertical));// 406 | toggleTeapotObj->setBounds (getSubdividedRegion(radioObjSelectorRegion, 2, 3, Vertical)); 407 | 408 | int sliderRegionHeight = leftButtonToolbarArea.getHeight() / 4 + BUTTON_HEIGHT; 409 | auto sliderRegion1 = leftButtonToolbarArea.removeFromTop(sliderRegionHeight); 410 | zoomSlider.setBounds(sliderRegion1.removeFromBottom(sliderRegion1.getHeight() - BUTTON_HEIGHT)); 411 | zoomSlider.setTextBoxStyle (Slider::TextBoxBelow, false, BUTTON_WIDTH, 20); 412 | 413 | toggleDrawControlMesh->setBounds(leftButtonToolbarArea.removeFromTop(radioObjSelectorRegion.getHeight())); 414 | 415 | shaderPresetBox.setBounds(leftButtonToolbarArea.removeFromTop(BUTTON_HEIGHT * 3)); 416 | 417 | } 418 | -------------------------------------------------------------------------------- /Source/PluginEditor.h: -------------------------------------------------------------------------------- 1 | /* 2 | ============================================================================== 3 | Ross Hoyt 4 | PluginEditor.h 5 | The Plugin Window, and the GL Component are declared here. 6 | They are defined PluginEditor.h 7 | 8 | ============================================================================== 9 | */ 10 | 11 | #ifndef PLUGINEDITOR_H_INCLUDED 12 | #define PLUGINEDITOR_H_INCLUDED 13 | 14 | 15 | #include "../JuceLibraryCode/JuceHeader.h" 16 | #include "PluginProcessor.h" 17 | 18 | 19 | //============================================================================== 20 | /** 21 | */ 22 | class GLComponent; // forward declared 23 | class PluginEditor : public AudioProcessorEditor 24 | { 25 | public: 26 | PluginEditor (PluginProcessor&, MidiKeyboardState&); 27 | ~PluginEditor(); 28 | 29 | //============================================================================== 30 | void paint (Graphics&) override; 31 | void resized() override; 32 | 33 | // SLIDERS FOR GL WINDOW PARAMS THAT NEED TO BE ACCESSED BY CHILDREN 34 | Slider zoomSlider; 35 | Slider rotationSlider; 36 | 37 | // SHADER SELECTOR 38 | ComboBox shaderPresetBox; 39 | 40 | private: 41 | 42 | 43 | // RADIO BUTTONS: 44 | enum RadioButtonIds { ObjSelectorButtons = 1001 }; 45 | // RB->OBJ SELECTOR RADIO BOX 46 | GroupComponent* radioButtonsObjSelector; 47 | ToggleButton* togglePianoKeyObj; 48 | ToggleButton* toggleTeapotObj; 49 | 50 | 51 | // OBJ SELECTOR RADIO BOX 52 | ToggleButton* toggleDrawControlMesh; 53 | //ToggleButton* toggleButton_TeapotObj; 54 | 55 | 56 | // LABELS 57 | Label zoomLabel { {}, "Zoom:" }; 58 | Label shaderPresetBoxLabel; 59 | //Label rotationLabel { {}, "Rotation:" }; 60 | 61 | 62 | void initialise(); 63 | 64 | void updateToggleState(Button*, String); 65 | 66 | void selectShaderPreset(int); 67 | void setShaderProgram(const String&, const String&); 68 | void updateShader(); 69 | 70 | // class that created this class 71 | PluginProcessor& processor; 72 | 73 | 74 | MidiKeyboardComponent midiKeyboardComponent; 75 | MidiKeyboardState * midiKeyboardState; 76 | 77 | ScopedPointer glComponent; 78 | 79 | // GUI constants 80 | static const int MARGIN = 4, MAX_WINDOW_HEIGHT = 800, MAX_WINDOW_WIDTH = 1200 + 2 * MARGIN, 81 | MAX_KEYB_WIDTH = 1200, MAX_KEYB_HEIGHT = 82, BUTTON_WIDTH = 50, BUTTON_HEIGHT = 30; 82 | Colour backgroundColor { 44,54,60 }; // stock bckgrd colour 83 | 84 | // Display Helper Method 85 | enum SubdividedOrientation { Vertical, Horizontal}; 86 | static Rectangle getSubdividedRegion(const Rectangle, int, int, SubdividedOrientation); 87 | 88 | JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (PluginEditor) 89 | }; 90 | 91 | 92 | #endif // PLUGINEDITOR_H_INCLUDED 93 | -------------------------------------------------------------------------------- /Source/PluginProcessor.cpp: -------------------------------------------------------------------------------- 1 | /* 2 | ============================================================================== 3 | 4 | 5 | Ross Hoyt 6 | PluginProcessor.cpp 7 | 8 | ============================================================================== 9 | */ 10 | 11 | #include "PluginProcessor.h" 12 | #include "PluginEditor.h" 13 | 14 | 15 | //============================================================================== 16 | PluginProcessor::PluginProcessor() 17 | #ifndef JucePlugin_PreferredChannelConfigurations 18 | : AudioProcessor (BusesProperties() 19 | #if ! JucePlugin_IsMidiEffect 20 | #if ! JucePlugin_IsSynth 21 | .withInput ("Input", AudioChannelSet::stereo(), true) 22 | #endif 23 | .withOutput ("Output", AudioChannelSet::stereo(), true) 24 | #endif 25 | ) 26 | #endif 27 | { 28 | } 29 | 30 | PluginProcessor::~PluginProcessor() 31 | { 32 | } 33 | 34 | //============================================================================== 35 | const String PluginProcessor::getName() const 36 | { 37 | return JucePlugin_Name; 38 | } 39 | 40 | bool PluginProcessor::acceptsMidi() const 41 | { 42 | #if JucePlugin_WantsMidiInput 43 | return true; 44 | #else 45 | return false; 46 | #endif 47 | } 48 | 49 | bool PluginProcessor::producesMidi() const 50 | { 51 | #if JucePlugin_ProducesMidiOutput 52 | return true; 53 | #else 54 | return false; 55 | #endif 56 | } 57 | 58 | double PluginProcessor::getTailLengthSeconds() const 59 | { 60 | return 0.0; 61 | } 62 | 63 | int PluginProcessor::getNumPrograms() 64 | { 65 | return 1; // NB: some hosts don't cope very well if you tell them there are 0 programs, 66 | // so this should be at least 1, even if you're not really implementing programs. 67 | } 68 | 69 | int PluginProcessor::getCurrentProgram() 70 | { 71 | return 0; 72 | } 73 | 74 | void PluginProcessor::setCurrentProgram (int index) 75 | { 76 | } 77 | 78 | const String PluginProcessor::getProgramName (int index) 79 | { 80 | return String(); 81 | } 82 | 83 | void PluginProcessor::changeProgramName (int index, const String& newName) 84 | { 85 | } 86 | 87 | //============================================================================== 88 | void PluginProcessor::prepareToPlay (double sampleRate, int samplesPerBlock) 89 | { 90 | // Use this method as the place to do any pre-playback 91 | // initialisation that you need.. 92 | } 93 | 94 | void PluginProcessor::releaseResources() 95 | { 96 | // When playback stops, you can use this as an opportunity to free up any 97 | // spare memory, etc. 98 | } 99 | 100 | #ifndef JucePlugin_PreferredChannelConfigurations 101 | bool PluginProcessor::isBusesLayoutSupported (const BusesLayout& layouts) const 102 | { 103 | #if JucePlugin_IsMidiEffect 104 | ignoreUnused (layouts); 105 | return true; 106 | #else 107 | // This is the place where you check if the layout is supported. 108 | // In this template code we only support mono or stereo. 109 | if (layouts.getMainOutputChannelSet() != AudioChannelSet::mono() 110 | && layouts.getMainOutputChannelSet() != AudioChannelSet::stereo()) 111 | return false; 112 | 113 | // This checks if the input layout matches the output layout 114 | #if ! JucePlugin_IsSynth 115 | if (layouts.getMainOutputChannelSet() != layouts.getMainInputChannelSet()) 116 | return false; 117 | #endif 118 | 119 | return true; 120 | #endif 121 | } 122 | #endif 123 | 124 | void PluginProcessor::processBlock (AudioSampleBuffer& buffer, MidiBuffer& midiMessages) 125 | { 126 | const int totalNumInputChannels = getTotalNumInputChannels(); 127 | const int totalNumOutputChannels = getTotalNumOutputChannels(); 128 | 129 | // MIDI Processing Occurs here 130 | int numMidiEvents = midiMessages.getNumEvents(); 131 | midiKeyboardState.processNextMidiBuffer(midiMessages, midiSampleCounter, numMidiEvents, true); 132 | midiSampleCounter += numMidiEvents; 133 | 134 | // AUDIO BUFFER HANDLING (DEFAULT - DOES NOTHING BUT MUTE ANY INPUT DATA 135 | // In case we have more outputs than inputs, this code clears any output 136 | // channels that didn't contain input data, (because these aren't 137 | // guaranteed to be empty - they may contain garbage). 138 | // This is here to avoid people getting screaming feedback 139 | // when they first compile a plugin, but obviously you don't need to keep 140 | // this code if your algorithm always overwrites all the output channels. 141 | for (int i = totalNumInputChannels; i < totalNumOutputChannels; ++i) 142 | buffer.clear (i, 0, buffer.getNumSamples()); 143 | 144 | // This is the place where you'd normally do the guts of your plugin's 145 | // audio processing... 146 | //for (int channel = 0; channel < totalNumInputChannels; ++channel) 147 | //{ 148 | //float* channelData = buffer.getWritePointer (channel); 149 | // ..do something to the data... 150 | //} 151 | } 152 | 153 | //============================================================================== 154 | bool PluginProcessor::hasEditor() const 155 | { 156 | return true; // (change this to false if you choose to not supply an editor) 157 | } 158 | 159 | AudioProcessorEditor* PluginProcessor::createEditor() 160 | { 161 | return new PluginEditor (*this, midiKeyboardState); 162 | } 163 | 164 | //============================================================================== 165 | void PluginProcessor::getStateInformation (MemoryBlock& destData) 166 | { 167 | // You should use this method to store your parameters in the memory block. 168 | // You could do that either as raw data, or use the XML or ValueTree classes 169 | // as intermediaries to make it easy to save and load complex data. 170 | } 171 | 172 | void PluginProcessor::setStateInformation (const void* data, int sizeInBytes) 173 | { 174 | // You should use this method to restore your parameters from this memory block, 175 | // whose contents will have been created by the getStateInformation() call. 176 | } 177 | 178 | //============================================================================== 179 | // This creates new instances of the plugin.. 180 | AudioProcessor* JUCE_CALLTYPE createPluginFilter() 181 | { 182 | return new PluginProcessor(); 183 | } 184 | -------------------------------------------------------------------------------- /Source/PluginProcessor.h: -------------------------------------------------------------------------------- 1 | /* 2 | ============================================================================== 3 | 4 | Ross Hoyt 5 | PluginProcessor.h 6 | 7 | Contains framework code for a JUCE plugin processor. 8 | 9 | ============================================================================== 10 | */ 11 | 12 | //#ifndef PLUGINPROCESSOR_H_INCLUDED 13 | //#define PLUGINPROCESSOR_H_INCLUDED 14 | #pragma once 15 | 16 | #include "../JuceLibraryCode/JuceHeader.h" 17 | 18 | 19 | //============================================================================== 20 | /** 21 | */ 22 | class PluginProcessor : public AudioProcessor 23 | { 24 | public: 25 | //============================================================================== 26 | PluginProcessor(); 27 | ~PluginProcessor(); 28 | 29 | //============================================================================== 30 | void prepareToPlay (double sampleRate, int samplesPerBlock) override; 31 | void releaseResources() override; 32 | 33 | #ifndef JucePlugin_PreferredChannelConfigurations 34 | bool isBusesLayoutSupported (const BusesLayout& layouts) const override; 35 | #endif 36 | 37 | void processBlock (AudioSampleBuffer&, MidiBuffer&) override; 38 | 39 | //============================================================================== 40 | AudioProcessorEditor* createEditor() override; 41 | bool hasEditor() const override; 42 | 43 | //============================================================================== 44 | const String getName() const override; 45 | 46 | bool acceptsMidi() const override; 47 | bool producesMidi() const override; 48 | double getTailLengthSeconds() const override; 49 | 50 | //============================================================================== 51 | int getNumPrograms() override; 52 | int getCurrentProgram() override; 53 | void setCurrentProgram (int index) override; 54 | const String getProgramName (int index) override; 55 | void changeProgramName (int index, const String& newName) override; 56 | 57 | //============================================================================== 58 | void getStateInformation (MemoryBlock& destData) override; 59 | void setStateInformation (const void* data, int sizeInBytes) override; 60 | 61 | private: 62 | //============================================================================== 63 | MidiKeyboardState midiKeyboardState; 64 | int midiSampleCounter; 65 | JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (PluginProcessor) 66 | }; 67 | 68 | 69 | //#endif // PLUGINPROCESSOR_H_INCLUDED 70 | -------------------------------------------------------------------------------- /Source/ShaderPreset.h: -------------------------------------------------------------------------------- 1 | /* 2 | ============================================================================== 3 | 4 | Ross Hoyt 5 | ShaderPreset.h 6 | Each Shader is stored with a Name (for dispay in the selector box), 7 | a vertexShader, and a Fragment Shader. 8 | ============================================================================== 9 | */ 10 | 11 | #pragma once 12 | 13 | struct ShaderPreset 14 | { 15 | const char* name; 16 | const char* vertexShader; 17 | const char* fragmentShader; 18 | }; 19 | -------------------------------------------------------------------------------- /Source/Shape.h: -------------------------------------------------------------------------------- 1 | /* 2 | ============================================================================== 3 | 4 | Ross Hoyt 5 | Shape.h 6 | 7 | ============================================================================== 8 | */ 9 | 10 | #pragma once 11 | #include "Attributes.h" 12 | #include "WavefrontObjParser.h" 13 | #include "Vertex.h" 14 | 15 | //============================================================================== 16 | /** This loads a 3D model from an OBJ file and converts it into some vertex buffers 17 | that we can draw. 18 | */ 19 | struct Shape 20 | { 21 | Shape (OpenGLContext& openGLContext, const String& objFileContent) 22 | { 23 | if (shapeFile.load (objFileContent).wasOk()) 24 | for (int i = 0; i < shapeFile.shapes.size(); ++i) 25 | vertexBuffers.add (new VertexBuffer (openGLContext, *shapeFile.shapes.getUnchecked(i))); 26 | 27 | } 28 | 29 | void draw (OpenGLContext& openGLContext, Attributes& attributes) 30 | { 31 | for (int i = 0; i < vertexBuffers.size(); ++i) 32 | { 33 | VertexBuffer& vertexBuffer = *vertexBuffers.getUnchecked (i); 34 | vertexBuffer.bind(); 35 | 36 | attributes.enable (openGLContext); 37 | 38 | glDrawElements (GL_TRIANGLES, vertexBuffer.numIndices, GL_UNSIGNED_INT, 0); 39 | 40 | attributes.disable (openGLContext); 41 | } 42 | } 43 | 44 | void drawControlMesh(OpenGLContext& openGLContext, Attributes& attributes) 45 | { 46 | glLineWidth(1); 47 | 48 | for (int i = 0; i < vertexBuffers.size(); ++i) 49 | { 50 | VertexBuffer& vertexBuffer = *vertexBuffers.getUnchecked (i); 51 | vertexBuffer.bind(); 52 | 53 | attributes.enable (openGLContext); 54 | 55 | glDrawArrays(GL_LINE_LOOP, vertexBuffer.indexBuffer, vertexBuffer.numIndices); 56 | 57 | attributes.disable (openGLContext); 58 | 59 | } 60 | 61 | glFlush(); 62 | } 63 | 64 | private: 65 | struct VertexBuffer 66 | { 67 | VertexBuffer (OpenGLContext& context, WavefrontObjFile::Shape& shape) : openGLContext (context) 68 | { 69 | numIndices = shape.mesh.indices.size(); 70 | 71 | openGLContext.extensions.glGenBuffers (1, &vertexBuffer); 72 | openGLContext.extensions.glBindBuffer (GL_ARRAY_BUFFER, vertexBuffer); 73 | 74 | Array vertices; 75 | createVertexListFromMesh (shape.mesh, vertices, Colours::green); 76 | 77 | openGLContext.extensions.glBufferData (GL_ARRAY_BUFFER, vertices.size() * (int) sizeof (Vertex), 78 | vertices.getRawDataPointer(), GL_STATIC_DRAW); 79 | 80 | openGLContext.extensions.glGenBuffers (1, &indexBuffer); 81 | openGLContext.extensions.glBindBuffer (GL_ELEMENT_ARRAY_BUFFER, indexBuffer); 82 | openGLContext.extensions.glBufferData (GL_ELEMENT_ARRAY_BUFFER, numIndices * (int) sizeof (juce::uint32), 83 | shape.mesh.indices.getRawDataPointer(), GL_STATIC_DRAW); 84 | } 85 | 86 | ~VertexBuffer() 87 | { 88 | openGLContext.extensions.glDeleteBuffers (1, &vertexBuffer); 89 | openGLContext.extensions.glDeleteBuffers (1, &indexBuffer); 90 | } 91 | 92 | void bind() 93 | { 94 | openGLContext.extensions.glBindBuffer (GL_ARRAY_BUFFER, vertexBuffer); 95 | openGLContext.extensions.glBindBuffer (GL_ELEMENT_ARRAY_BUFFER, indexBuffer); 96 | } 97 | 98 | GLuint vertexBuffer, indexBuffer; 99 | int numIndices; 100 | OpenGLContext& openGLContext; 101 | 102 | JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (VertexBuffer) 103 | }; 104 | 105 | WavefrontObjFile shapeFile; 106 | OwnedArray vertexBuffers; 107 | 108 | static void createVertexListFromMesh (const WavefrontObjFile::Mesh& mesh, Array& list, Colour colour) 109 | { 110 | const float scale = 0.2f; 111 | WavefrontObjFile::TextureCoord defaultTexCoord = { 0.5f, 0.5f }; 112 | WavefrontObjFile::Vertex defaultNormal = { 0.5f, 0.5f, 0.5f }; 113 | 114 | for (int i = 0; i < mesh.vertices.size(); ++i) 115 | { 116 | const WavefrontObjFile::Vertex& v = mesh.vertices.getReference (i); 117 | 118 | const WavefrontObjFile::Vertex& n 119 | = i < mesh.normals.size() ? mesh.normals.getReference (i) : defaultNormal; 120 | 121 | const WavefrontObjFile::TextureCoord& tc 122 | = i < mesh.textureCoords.size() ? mesh.textureCoords.getReference (i) : defaultTexCoord; 123 | 124 | Vertex vert = 125 | { 126 | { scale * v.x, scale * v.y, scale * v.z, }, 127 | { scale * n.x, scale * n.y, scale * n.z, }, 128 | { colour.getFloatRed(), colour.getFloatGreen(), colour.getFloatBlue(), colour.getFloatAlpha() }, 129 | { tc.x, tc.y } 130 | }; 131 | 132 | list.add (vert); 133 | } 134 | } 135 | }; 136 | 137 | -------------------------------------------------------------------------------- /Source/Textures.h: -------------------------------------------------------------------------------- 1 | /* 2 | ============================================================================== 3 | 4 | Ross Hoyt 5 | Textures.h 6 | ============================================================================== 7 | */ 8 | 9 | #pragma once 10 | #include "GLUtils.h" 11 | 12 | struct DemoTexture 13 | { 14 | virtual ~DemoTexture() {} 15 | virtual bool applyTo (OpenGLTexture&) = 0; 16 | 17 | String name; 18 | }; 19 | 20 | struct BuiltInTexture : public DemoTexture 21 | { 22 | BuiltInTexture (const char* nm, const void* imageData, size_t imageSize) 23 | : image (resizeImageToPowerOfTwo (ImageFileFormat::loadFrom (imageData, imageSize))) 24 | { 25 | name = nm; 26 | } 27 | 28 | Image image; 29 | 30 | bool applyTo (OpenGLTexture& texture) override 31 | { 32 | texture.loadImage (image); 33 | return false; 34 | } 35 | }; 36 | -------------------------------------------------------------------------------- /Source/Uniforms.h: -------------------------------------------------------------------------------- 1 | /* 2 | ============================================================================== 3 | 4 | Ross Hoyt 5 | Uniforms.h 6 | ============================================================================== 7 | */ 8 | 9 | #pragma once 10 | 11 | //============================================================================== 12 | // Class that manages the uniform values that the shaders use. 13 | struct Uniforms 14 | { 15 | Uniforms (OpenGLContext& openGLContext, OpenGLShaderProgram& shader) 16 | { 17 | projectionMatrix = createUniform (openGLContext, shader, "projectionMatrix"); 18 | viewMatrix = createUniform (openGLContext, shader, "viewMatrix"); 19 | texture = createUniform (openGLContext, shader, "demoTexture"); 20 | lightPosition = createUniform (openGLContext, shader, "lightPosition"); 21 | } 22 | 23 | ScopedPointer projectionMatrix, viewMatrix, texture, lightPosition; 24 | 25 | private: 26 | static OpenGLShaderProgram::Uniform* createUniform (OpenGLContext& openGLContext, 27 | OpenGLShaderProgram& shader, 28 | const char* uniformName) 29 | { 30 | if (openGLContext.extensions.glGetUniformLocation (shader.getProgramID(), uniformName) < 0) 31 | return nullptr; 32 | 33 | return new OpenGLShaderProgram::Uniform (shader, uniformName); 34 | } 35 | }; 36 | -------------------------------------------------------------------------------- /Source/Vertex.h: -------------------------------------------------------------------------------- 1 | /* 2 | ============================================================================== 3 | 4 | Ross Hoyt 5 | Vertex.h 6 | 7 | 8 | ============================================================================== 9 | */ 10 | 11 | #pragma once 12 | 13 | /** 14 | Vertex data to be passed to the shaders. 15 | Each Vertex has a 3D position, a colour and a 2D texture co-ordinate 16 | */ 17 | struct Vertex 18 | { 19 | float position[3]; 20 | float normal[3]; 21 | float colour[4]; 22 | float texCoord[2]; 23 | }; 24 | -------------------------------------------------------------------------------- /Source/WavefrontObjParser.h: -------------------------------------------------------------------------------- 1 | /* 2 | ============================================================================== 3 | 4 | This file is part of the JUCE examples. 5 | Copyright (c) 2017 - ROLI Ltd. 6 | 7 | The code included in this file is provided under the terms of the ISC license 8 | http://www.isc.org/downloads/software-support-policy/isc-license. Permission 9 | To use, copy, modify, and/or distribute this software for any purpose with or 10 | without fee is hereby granted provided that the above copyright notice and 11 | this permission notice appear in all copies. 12 | 13 | THE SOFTWARE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, 14 | WHETHER EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR 15 | PURPOSE, ARE DISCLAIMED. 16 | 17 | ============================================================================== 18 | */ 19 | 20 | #pragma once 21 | 22 | #include 23 | 24 | //============================================================================== 25 | /** 26 | This is a quick-and-dirty parser for the 3D OBJ file format. 27 | 28 | Just call load() and if there aren't any errors, the 'shapes' array should 29 | be filled with all the shape objects that were loaded from the file. 30 | */ 31 | class WavefrontObjFile 32 | { 33 | public: 34 | WavefrontObjFile() {} 35 | 36 | Result load (const String& objFileContent) 37 | { 38 | DBG("In load String& objFIleContnt"); 39 | shapes.clear(); 40 | return parseObjFile (StringArray::fromLines (objFileContent)); 41 | } 42 | 43 | Result load (const File& file) 44 | { 45 | DBG("In load constFile file"); 46 | sourceFile = file; 47 | return load (file.loadFileAsString()); 48 | } 49 | 50 | //============================================================================== 51 | typedef juce::uint32 Index; 52 | 53 | struct Vertex { float x, y, z; }; 54 | struct TextureCoord { float x, y; }; 55 | 56 | struct Mesh 57 | { 58 | Array vertices, normals; 59 | Array textureCoords; 60 | Array indices; 61 | }; 62 | 63 | struct Material 64 | { 65 | Material() noexcept 66 | { 67 | zerostruct (ambient); 68 | zerostruct (diffuse); 69 | zerostruct (specular); 70 | zerostruct (transmittance); 71 | zerostruct (emission); 72 | } 73 | 74 | String name; 75 | 76 | Vertex ambient, diffuse, specular, transmittance, emission; 77 | float shininess = 1.0f, refractiveIndex = 0.0f; 78 | 79 | String ambientTextureName, diffuseTextureName, 80 | specularTextureName, normalTextureName; 81 | 82 | StringPairArray parameters; 83 | }; 84 | 85 | struct Shape 86 | { 87 | String name; 88 | Mesh mesh; 89 | Material material; 90 | }; 91 | 92 | OwnedArray shapes; 93 | 94 | private: 95 | //============================================================================== 96 | File sourceFile; 97 | 98 | struct TripleIndex 99 | { 100 | TripleIndex() noexcept {} 101 | 102 | bool operator< (const TripleIndex& other) const noexcept 103 | { 104 | if (this == &other) 105 | return false; 106 | 107 | if (vertexIndex != other.vertexIndex) 108 | return vertexIndex < other.vertexIndex; 109 | 110 | if (textureIndex != other.textureIndex) 111 | return textureIndex < other.textureIndex; 112 | 113 | return normalIndex < other.normalIndex; 114 | } 115 | 116 | int vertexIndex = -1, textureIndex = -1, normalIndex = -1; 117 | }; 118 | 119 | struct IndexMap 120 | { 121 | std::map map; 122 | 123 | Index getIndexFor (TripleIndex i, Mesh& newMesh, const Mesh& srcMesh) 124 | { 125 | const std::map::iterator it (map.find (i)); 126 | 127 | if (it != map.end()) 128 | return it->second; 129 | 130 | auto index = (Index) newMesh.vertices.size(); 131 | 132 | if (isPositiveAndBelow (i.vertexIndex, srcMesh.vertices.size())) 133 | newMesh.vertices.add (srcMesh.vertices.getReference (i.vertexIndex)); 134 | 135 | if (isPositiveAndBelow (i.normalIndex, srcMesh.normals.size())) 136 | newMesh.normals.add (srcMesh.normals.getReference (i.normalIndex)); 137 | 138 | if (isPositiveAndBelow (i.textureIndex, srcMesh.textureCoords.size())) 139 | newMesh.textureCoords.add (srcMesh.textureCoords.getReference (i.textureIndex)); 140 | 141 | map[i] = index; 142 | return index; 143 | } 144 | }; 145 | 146 | static float parseFloat (String::CharPointerType& t) 147 | { 148 | t = t.findEndOfWhitespace(); 149 | return (float) CharacterFunctions::readDoubleValue (t); 150 | } 151 | 152 | static Vertex parseVertex (String::CharPointerType t) 153 | { 154 | Vertex v; 155 | v.x = parseFloat (t); 156 | v.y = parseFloat (t); 157 | v.z = parseFloat (t); 158 | return v; 159 | } 160 | 161 | static TextureCoord parseTextureCoord (String::CharPointerType t) 162 | { 163 | TextureCoord tc; 164 | tc.x = parseFloat (t); 165 | tc.y = parseFloat (t); 166 | return tc; 167 | } 168 | 169 | static bool matchToken (String::CharPointerType& t, const char* token) 170 | { 171 | auto len = (int) strlen (token); 172 | 173 | if (CharacterFunctions::compareUpTo (CharPointer_ASCII (token), t, len) == 0) 174 | { 175 | auto end = t + len; 176 | 177 | if (end.isEmpty() || end.isWhitespace()) 178 | { 179 | t = end.findEndOfWhitespace(); 180 | return true; 181 | } 182 | } 183 | 184 | return false; 185 | } 186 | 187 | struct Face 188 | { 189 | Face (String::CharPointerType t) 190 | { 191 | while (! t.isEmpty()) 192 | triples.add (parseTriple (t)); 193 | } 194 | 195 | Array triples; 196 | 197 | void addIndices (Mesh& newMesh, const Mesh& srcMesh, IndexMap& indexMap) 198 | { 199 | TripleIndex i0 (triples[0]), i1, i2 (triples[1]); 200 | 201 | for (auto i = 2; i < triples.size(); ++i) 202 | { 203 | i1 = i2; 204 | i2 = triples.getReference (i); 205 | 206 | newMesh.indices.add (indexMap.getIndexFor (i0, newMesh, srcMesh)); 207 | newMesh.indices.add (indexMap.getIndexFor (i1, newMesh, srcMesh)); 208 | newMesh.indices.add (indexMap.getIndexFor (i2, newMesh, srcMesh)); 209 | } 210 | } 211 | 212 | static TripleIndex parseTriple (String::CharPointerType& t) 213 | { 214 | TripleIndex i; 215 | 216 | t = t.findEndOfWhitespace(); 217 | i.vertexIndex = t.getIntValue32() - 1; 218 | t = findEndOfFaceToken (t); 219 | 220 | if (t.isEmpty() || t.getAndAdvance() != '/') 221 | return i; 222 | 223 | if (*t == '/') 224 | { 225 | ++t; 226 | } 227 | else 228 | { 229 | i.textureIndex = t.getIntValue32() - 1; 230 | t = findEndOfFaceToken (t); 231 | 232 | if (t.isEmpty() || t.getAndAdvance() != '/') 233 | return i; 234 | } 235 | 236 | i.normalIndex = t.getIntValue32() - 1; 237 | t = findEndOfFaceToken (t); 238 | return i; 239 | } 240 | 241 | static String::CharPointerType findEndOfFaceToken (String::CharPointerType t) noexcept 242 | { 243 | return CharacterFunctions::findEndOfToken (t, CharPointer_ASCII ("/ \t"), String().getCharPointer()); 244 | } 245 | }; 246 | 247 | static Shape* parseFaceGroup (const Mesh& srcMesh, 248 | Array& faceGroup, 249 | const Material& material, 250 | const String& name) 251 | { 252 | if (faceGroup.size() == 0) 253 | return nullptr; 254 | 255 | std::unique_ptr shape (new Shape()); 256 | shape->name = name; 257 | shape->material = material; 258 | 259 | IndexMap indexMap; 260 | 261 | for (auto& f : faceGroup) 262 | f.addIndices (shape->mesh, srcMesh, indexMap); 263 | 264 | return shape.release(); 265 | } 266 | 267 | Result parseObjFile (const StringArray& lines) 268 | { 269 | Mesh mesh; 270 | Array faceGroup; 271 | 272 | Array knownMaterials; 273 | Material lastMaterial; 274 | String lastName; 275 | 276 | for (auto lineNum = 0; lineNum < lines.size(); ++lineNum) 277 | { 278 | auto l = lines[lineNum].getCharPointer().findEndOfWhitespace(); 279 | 280 | if (matchToken (l, "v")) { mesh.vertices .add (parseVertex (l)); continue; } 281 | if (matchToken (l, "vn")) { mesh.normals .add (parseVertex (l)); continue; } 282 | if (matchToken (l, "vt")) { mesh.textureCoords.add (parseTextureCoord (l)); continue; } 283 | if (matchToken (l, "f")) { faceGroup .add (Face (l)); continue; } 284 | 285 | if (matchToken (l, "usemtl")) 286 | { 287 | auto name = String (l).trim(); 288 | 289 | for (auto i = knownMaterials.size(); --i >= 0;) 290 | { 291 | if (knownMaterials.getReference (i).name == name) 292 | { 293 | lastMaterial = knownMaterials.getReference (i); 294 | break; 295 | } 296 | } 297 | 298 | continue; 299 | } 300 | 301 | if (matchToken (l, "mtllib")) 302 | { 303 | auto r = parseMaterial (knownMaterials, String (l).trim()); 304 | continue; 305 | } 306 | 307 | if (matchToken (l, "g") || matchToken (l, "o")) 308 | { 309 | if (auto* shape = parseFaceGroup (mesh, faceGroup, lastMaterial, lastName)) 310 | shapes.add (shape); 311 | 312 | faceGroup.clear(); 313 | lastName = StringArray::fromTokens (l, " \t", "")[0]; 314 | continue; 315 | } 316 | } 317 | 318 | if (auto* shape = parseFaceGroup (mesh, faceGroup, lastMaterial, lastName)) 319 | shapes.add (shape); 320 | 321 | return Result::ok(); 322 | } 323 | 324 | Result parseMaterial (Array& materials, const String& filename) 325 | { 326 | jassert (sourceFile.exists()); 327 | auto f = sourceFile.getSiblingFile (filename); 328 | 329 | if (! f.exists()) 330 | return Result::fail ("Cannot open file: " + filename); 331 | 332 | auto lines = StringArray::fromLines (f.loadFileAsString()); 333 | 334 | materials.clear(); 335 | Material material; 336 | 337 | for (auto line : lines) 338 | { 339 | auto l = line.getCharPointer().findEndOfWhitespace(); 340 | 341 | if (matchToken (l, "newmtl")) { materials.add (material); material.name = String (l).trim(); continue; } 342 | 343 | if (matchToken (l, "Ka")) { material.ambient = parseVertex (l); continue; } 344 | if (matchToken (l, "Kd")) { material.diffuse = parseVertex (l); continue; } 345 | if (matchToken (l, "Ks")) { material.specular = parseVertex (l); continue; } 346 | if (matchToken (l, "Kt")) { material.transmittance = parseVertex (l); continue; } 347 | if (matchToken (l, "Ke")) { material.emission = parseVertex (l); continue; } 348 | if (matchToken (l, "Ni")) { material.refractiveIndex = parseFloat (l); continue; } 349 | if (matchToken (l, "Ns")) { material.shininess = parseFloat (l); continue; } 350 | 351 | if (matchToken (l, "map_Ka")) { material.ambientTextureName = String (l).trim(); continue; } 352 | if (matchToken (l, "map_Kd")) { material.diffuseTextureName = String (l).trim(); continue; } 353 | if (matchToken (l, "map_Ks")) { material.specularTextureName = String (l).trim(); continue; } 354 | if (matchToken (l, "map_Ns")) { material.normalTextureName = String (l).trim(); continue; } 355 | 356 | auto tokens = StringArray::fromTokens (l, " \t", ""); 357 | 358 | if (tokens.size() >= 2) 359 | material.parameters.set (tokens[0].trim(), tokens[1].trim()); 360 | } 361 | 362 | materials.add (material); 363 | return Result::ok(); 364 | } 365 | 366 | JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (WavefrontObjFile) 367 | }; 368 | -------------------------------------------------------------------------------- /Source/pianokey_rectangle.obj: -------------------------------------------------------------------------------- 1 | # Object Export From Tinkercad Server 2015 2 | 3 | mtllib obj.mtl 4 | 5 | o obj_0 6 | v 1 -7.5 0.75 7 | v 1 -7.5 0 8 | v 1 1.5 0 9 | v 1 1.5 0.75 10 | v -0.5 1.5 0.75 11 | v -0.5 1.5 0 12 | v -0.5 -7.5 0 13 | v -0.5 -7.5 0.75 14 | # 8 vertices 15 | 16 | g group_0_16089887 17 | 18 | usemtl color_16089887 19 | s 0 20 | 21 | f 1 2 3 22 | f 1 3 4 23 | f 5 6 7 24 | f 5 7 8 25 | f 4 5 8 26 | f 4 8 1 27 | f 2 7 6 28 | f 2 6 3 29 | f 4 3 6 30 | f 4 6 5 31 | f 8 7 2 32 | f 8 2 1 33 | # 12 faces 34 | 35 | #end of obj_0 36 | 37 | -------------------------------------------------------------------------------- /Source/portmeirion.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rosshoyt/juce-midi-visualizer-AU-plugin/06892697f52c73a2e70cd27b9d4ad8cd300e5485/Source/portmeirion.jpg -------------------------------------------------------------------------------- /Source/teapot.obj: -------------------------------------------------------------------------------- 1 | # teapot.obj 2 | # The Teapot Model that is used in JUCE Framework Examples. 3 | # 4 | v 5.929688 4.125000 0.000000 5 | v 5.832031 4.494141 0.000000 6 | v 5.945313 4.617188 0.000000 7 | v 6.175781 4.494141 0.000000 8 | v 6.429688 4.125000 0.000000 9 | v 5.387188 4.125000 2.747500 10 | v 5.297100 4.494141 2.709170 11 | v 5.401602 4.617188 2.753633 12 | v 5.614209 4.494141 2.844092 13 | v 5.848437 4.125000 2.943750 14 | v 3.899688 4.125000 4.970000 15 | v 3.830352 4.494141 4.900664 16 | v 3.910782 4.617188 4.981094 17 | v 4.074414 4.494141 5.144727 18 | v 4.254687 4.125000 5.325000 19 | v 1.677188 4.125000 6.457500 20 | v 1.638858 4.494141 6.367412 21 | v 1.683320 4.617188 6.471914 22 | v 1.773780 4.494141 6.684522 23 | v 1.873438 4.125000 6.918750 24 | v -1.070312 4.125000 7.000000 25 | v -1.070312 4.494141 6.902344 26 | v -1.070312 4.617188 7.015625 27 | v -1.070312 4.494141 7.246094 28 | v -1.070312 4.125000 7.500000 29 | v -4.007656 4.125000 6.457500 30 | v -3.859572 4.494141 6.367412 31 | v -3.847676 4.617188 6.471914 32 | v -3.917371 4.494141 6.684522 33 | v -4.014062 4.125000 6.918750 34 | v -6.209063 4.125000 4.970000 35 | v -6.042168 4.494141 4.900664 36 | v -6.072500 4.617188 4.981094 37 | v -6.217675 4.494141 5.144727 38 | v -6.395312 4.125000 5.325000 39 | v -7.591093 4.125000 2.747500 40 | v -7.464421 4.494141 2.709170 41 | v -7.550137 4.617188 2.753633 42 | v -7.755822 4.494141 2.844092 43 | v -7.989062 4.125000 2.943750 44 | v -8.070313 4.125000 0.000000 45 | v -7.972656 4.494141 0.000000 46 | v -8.085938 4.617188 0.000000 47 | v -8.316406 4.494141 0.000000 48 | v -8.570313 4.125000 0.000000 49 | v -7.527812 4.125000 -2.747500 50 | v -7.437724 4.494141 -2.709170 51 | v -7.542227 4.617188 -2.753633 52 | v -7.754834 4.494141 -2.844092 53 | v -7.989062 4.125000 -2.943750 54 | v -6.040312 4.125000 -4.970000 55 | v -5.970977 4.494141 -4.900664 56 | v -6.051406 4.617188 -4.981094 57 | v -6.215039 4.494141 -5.144727 58 | v -6.395312 4.125000 -5.325000 59 | v -3.817812 4.125000 -6.457500 60 | v -3.779482 4.494141 -6.367412 61 | v -3.823945 4.617188 -6.471914 62 | v -3.914404 4.494141 -6.684522 63 | v -4.014062 4.125000 -6.918750 64 | v -1.070312 4.125000 -7.000000 65 | v -1.070312 4.494141 -6.902344 66 | v -1.070312 4.617188 -7.015625 67 | v -1.070312 4.494141 -7.246094 68 | v -1.070312 4.125000 -7.500000 69 | v 1.677188 4.125000 -6.457500 70 | v 1.638858 4.494141 -6.367412 71 | v 1.683320 4.617188 -6.471914 72 | v 1.773780 4.494141 -6.684522 73 | v 1.873438 4.125000 -6.918750 74 | v 3.899688 4.125000 -4.970000 75 | v 3.830352 4.494141 -4.900664 76 | v 3.910782 4.617188 -4.981094 77 | v 4.074414 4.494141 -5.144727 78 | v 4.254687 4.125000 -5.325000 79 | v 5.387188 4.125000 -2.747500 80 | v 5.297100 4.494141 -2.709170 81 | v 5.401602 4.617188 -2.753633 82 | v 5.614209 4.494141 -2.844092 83 | v 5.848437 4.125000 -2.943750 84 | v 7.347656 2.162109 0.000000 85 | v 8.148438 0.234375 0.000000 86 | v 8.714844 -1.623047 0.000000 87 | v 8.929688 -3.375000 0.000000 88 | v 6.695264 2.162109 3.304053 89 | v 7.433985 0.234375 3.618360 90 | v 7.956494 -1.623047 3.840674 91 | v 8.154688 -3.375000 3.925000 92 | v 4.906446 2.162109 5.976758 93 | v 5.475000 0.234375 6.545312 94 | v 5.877149 -1.623047 6.947461 95 | v 6.029688 -3.375000 7.100000 96 | v 2.233740 2.162109 7.765576 97 | v 2.548047 0.234375 8.504297 98 | v 2.770362 -1.623047 9.026807 99 | v 2.854688 -3.375000 9.225000 100 | v -1.070312 2.162109 8.417969 101 | v -1.070312 0.234375 9.218750 102 | v -1.070312 -1.623047 9.785156 103 | v -1.070312 -3.375000 10.000000 104 | v -4.374365 2.162109 7.765576 105 | v -4.688672 0.234375 8.504297 106 | v -4.910986 -1.623047 9.026807 107 | v -4.995313 -3.375000 9.225000 108 | v -7.047071 2.162109 5.976758 109 | v -7.615624 0.234375 6.545312 110 | v -8.017773 -1.623047 6.947461 111 | v -8.170312 -3.375000 7.100000 112 | v -8.835889 2.162109 3.304053 113 | v -9.574610 0.234375 3.618360 114 | v -10.097119 -1.623047 3.840674 115 | v -10.295313 -3.375000 3.925000 116 | v -9.488281 2.162109 0.000000 117 | v -10.289063 0.234375 0.000000 118 | v -10.855469 -1.623047 0.000000 119 | v -11.070313 -3.375000 0.000000 120 | v -8.835889 2.162109 -3.304053 121 | v -9.574610 0.234375 -3.618360 122 | v -10.097119 -1.623047 -3.840674 123 | v -10.295313 -3.375000 -3.925000 124 | v -7.047071 2.162109 -5.976758 125 | v -7.615624 0.234375 -6.545312 126 | v -8.017773 -1.623047 -6.947461 127 | v -8.170312 -3.375000 -7.100000 128 | v -4.374365 2.162109 -7.765576 129 | v -4.688672 0.234375 -8.504297 130 | v -4.910986 -1.623047 -9.026807 131 | v -4.995313 -3.375000 -9.225000 132 | v -1.070312 2.162109 -8.417969 133 | v -1.070312 0.234375 -9.218750 134 | v -1.070312 -1.623047 -9.785156 135 | v -1.070312 -3.375000 -10.000000 136 | v 2.233740 2.162109 -7.765576 137 | v 2.548047 0.234375 -8.504297 138 | v 2.770362 -1.623047 -9.026807 139 | v 2.854688 -3.375000 -9.225000 140 | v 4.906446 2.162109 -5.976758 141 | v 5.475000 0.234375 -6.545312 142 | v 5.877149 -1.623047 -6.947461 143 | v 6.029688 -3.375000 -7.100000 144 | v 6.695264 2.162109 -3.304053 145 | v 7.433985 0.234375 -3.618360 146 | v 7.956494 -1.623047 -3.840674 147 | v 8.154688 -3.375000 -3.925000 148 | v 8.539063 -4.857422 0.000000 149 | v 7.679688 -5.953125 0.000000 150 | v 6.820313 -6.697266 0.000000 151 | v 6.429688 -7.125000 0.000000 152 | v 7.794336 -4.857422 3.771680 153 | v 7.001562 -5.953125 3.434375 154 | v 6.208789 -6.697266 3.097070 155 | v 5.848437 -7.125000 2.943750 156 | v 5.752343 -4.857422 6.822656 157 | v 5.142187 -5.953125 6.212500 158 | v 4.532031 -6.697266 5.602344 159 | v 4.254687 -7.125000 5.325000 160 | v 2.701367 -4.857422 8.864649 161 | v 2.364063 -5.953125 8.071875 162 | v 2.026758 -6.697266 7.279101 163 | v 1.873438 -7.125000 6.918750 164 | v -1.070312 -4.857422 9.609375 165 | v -1.070312 -5.953125 8.750000 166 | v -1.070312 -6.697266 7.890625 167 | v -1.070312 -7.125000 7.500000 168 | v -4.841992 -4.857422 8.864649 169 | v -4.504687 -5.953125 8.071875 170 | v -4.167383 -6.697266 7.279101 171 | v -4.014062 -7.125000 6.918750 172 | v -7.892968 -4.857422 6.822656 173 | v -7.282812 -5.953125 6.212500 174 | v -6.672656 -6.697266 5.602344 175 | v -6.395312 -7.125000 5.325000 176 | v -9.934961 -4.857422 3.771680 177 | v -9.142187 -5.953125 3.434375 178 | v -8.349414 -6.697266 3.097070 179 | v -7.989062 -7.125000 2.943750 180 | v -10.679688 -4.857422 0.000000 181 | v -9.820313 -5.953125 0.000000 182 | v -8.960938 -6.697266 0.000000 183 | v -8.570313 -7.125000 0.000000 184 | v -9.934961 -4.857422 -3.771680 185 | v -9.142187 -5.953125 -3.434375 186 | v -8.349414 -6.697266 -3.097070 187 | v -7.989062 -7.125000 -2.943750 188 | v -7.892968 -4.857422 -6.822656 189 | v -7.282812 -5.953125 -6.212500 190 | v -6.672656 -6.697266 -5.602344 191 | v -6.395312 -7.125000 -5.325000 192 | v -4.841992 -4.857422 -8.864649 193 | v -4.504687 -5.953125 -8.071875 194 | v -4.167383 -6.697266 -7.279101 195 | v -4.014062 -7.125000 -6.918750 196 | v -1.070312 -4.857422 -9.609375 197 | v -1.070312 -5.953125 -8.750000 198 | v -1.070312 -6.697266 -7.890625 199 | v -1.070312 -7.125000 -7.500000 200 | v 2.701367 -4.857422 -8.864649 201 | v 2.364063 -5.953125 -8.071875 202 | v 2.026758 -6.697266 -7.279101 203 | v 1.873438 -7.125000 -6.918750 204 | v 5.752343 -4.857422 -6.822656 205 | v 5.142187 -5.953125 -6.212500 206 | v 4.532031 -6.697266 -5.602344 207 | v 4.254687 -7.125000 -5.325000 208 | v 7.794336 -4.857422 -3.771680 209 | v 7.001562 -5.953125 -3.434375 210 | v 6.208789 -6.697266 -3.097070 211 | v 5.848437 -7.125000 -2.943750 212 | v 6.259766 -7.400391 0.000000 213 | v 5.351563 -7.640625 0.000000 214 | v 3.107422 -7.810547 0.000000 215 | v -1.070312 -7.875000 0.000000 216 | v 5.691685 -7.400391 2.877056 217 | v 4.853868 -7.640625 2.520586 218 | v 2.783648 -7.810547 1.639761 219 | v 4.134043 -7.400391 5.204355 220 | v 3.489219 -7.640625 4.559531 221 | v 1.895879 -7.810547 2.966191 222 | v 1.806743 -7.400391 6.761997 223 | v 1.450274 -7.640625 5.924180 224 | v 0.569448 -7.810547 3.853960 225 | v -1.070312 -7.400391 7.330078 226 | v -1.070312 -7.640625 6.421875 227 | v -1.070312 -7.810547 4.177734 228 | v -3.947368 -7.400391 6.761997 229 | v -3.590898 -7.640625 5.924180 230 | v -2.710073 -7.810547 3.853960 231 | v -6.274668 -7.400391 5.204355 232 | v -5.629844 -7.640625 4.559531 233 | v -4.036504 -7.810547 2.966191 234 | v -7.832309 -7.400391 2.877056 235 | v -6.994492 -7.640625 2.520586 236 | v -4.924272 -7.810547 1.639761 237 | v -8.400391 -7.400391 0.000000 238 | v -7.492188 -7.640625 0.000000 239 | v -5.248047 -7.810547 0.000000 240 | v -7.832309 -7.400391 -2.877056 241 | v -6.994492 -7.640625 -2.520586 242 | v -4.924272 -7.810547 -1.639761 243 | v -6.274668 -7.400391 -5.204355 244 | v -5.629844 -7.640625 -4.559531 245 | v -4.036504 -7.810547 -2.966191 246 | v -3.947368 -7.400391 -6.761997 247 | v -3.590898 -7.640625 -5.924180 248 | v -2.710073 -7.810547 -3.853960 249 | v -1.070312 -7.400391 -7.330078 250 | v -1.070312 -7.640625 -6.421875 251 | v -1.070312 -7.810547 -4.177734 252 | v 1.806743 -7.400391 -6.761997 253 | v 1.450274 -7.640625 -5.924180 254 | v 0.569448 -7.810547 -3.853960 255 | v 4.134043 -7.400391 -5.204355 256 | v 3.489219 -7.640625 -4.559531 257 | v 1.895879 -7.810547 -2.966191 258 | v 5.691685 -7.400391 -2.877056 259 | v 4.853868 -7.640625 -2.520586 260 | v 2.783648 -7.810547 -1.639761 261 | v -9.070313 2.250000 0.000000 262 | v -11.406250 2.232422 0.000000 263 | v -13.132813 2.109375 0.000000 264 | v -14.203125 1.775391 0.000000 265 | v -14.570313 1.125000 0.000000 266 | v -8.992188 2.425781 0.843750 267 | v -11.475830 2.405457 0.843750 268 | v -13.298828 2.263184 0.843750 269 | v -14.421631 1.877014 0.843750 270 | v -14.804688 1.125000 0.843750 271 | v -8.820313 2.812500 1.125000 272 | v -11.628906 2.786134 1.125000 273 | v -13.664063 2.601563 1.125000 274 | v -14.902344 2.100586 1.125000 275 | v -15.320313 1.125000 1.125000 276 | v -8.648438 3.199219 0.843750 277 | v -11.781982 3.166809 0.843750 278 | v -14.029297 2.939941 0.843750 279 | v -15.383057 2.324158 0.843750 280 | v -15.835938 1.125000 0.843750 281 | v -8.570313 3.375000 0.000000 282 | v -11.851563 3.339844 0.000000 283 | v -14.195313 3.093750 0.000000 284 | v -15.601563 2.425781 0.000000 285 | v -16.070313 1.125000 0.000000 286 | v -8.648438 3.199219 -0.843750 287 | v -11.781982 3.166809 -0.843750 288 | v -14.029297 2.939941 -0.843750 289 | v -15.383057 2.324158 -0.843750 290 | v -15.835938 1.125000 -0.843750 291 | v -8.820313 2.812500 -1.125000 292 | v -11.628906 2.786134 -1.125000 293 | v -13.664063 2.601563 -1.125000 294 | v -14.902344 2.100586 -1.125000 295 | v -15.320313 1.125000 -1.125000 296 | v -8.992188 2.425781 -0.843750 297 | v -11.475830 2.405457 -0.843750 298 | v -13.298828 2.263184 -0.843750 299 | v -14.421631 1.877014 -0.843750 300 | v -14.804688 1.125000 -0.843750 301 | v -14.375000 0.105469 0.000000 302 | v -13.757813 -1.125000 0.000000 303 | v -12.671875 -2.355469 0.000000 304 | v -11.070313 -3.375000 0.000000 305 | v -14.588013 0.007050 0.843750 306 | v -13.909180 -1.275146 0.843750 307 | v -12.724976 -2.540863 0.843750 308 | v -10.992188 -3.609375 0.843750 309 | v -15.056641 -0.209473 1.125000 310 | v -14.242188 -1.605469 1.125000 311 | v -12.841797 -2.948730 1.125000 312 | v -10.820313 -4.125000 1.125000 313 | v -15.525269 -0.425995 0.843750 314 | v -14.575195 -1.935791 0.843750 315 | v -12.958618 -3.356598 0.843750 316 | v -10.648438 -4.640625 0.843750 317 | v -15.738281 -0.524414 0.000000 318 | v -14.726563 -2.085938 0.000000 319 | v -13.011719 -3.541992 0.000000 320 | v -10.570313 -4.875000 0.000000 321 | v -15.525269 -0.425995 -0.843750 322 | v -14.575195 -1.935791 -0.843750 323 | v -12.958618 -3.356598 -0.843750 324 | v -10.648438 -4.640625 -0.843750 325 | v -15.056641 -0.209473 -1.125000 326 | v -14.242188 -1.605469 -1.125000 327 | v -12.841797 -2.948730 -1.125000 328 | v -10.820313 -4.125000 -1.125000 329 | v -14.588013 0.007050 -0.843750 330 | v -13.909180 -1.275146 -0.843750 331 | v -12.724976 -2.540863 -0.843750 332 | v -10.992188 -3.609375 -0.843750 333 | v 7.429688 -0.750000 0.000000 334 | v 9.828125 -0.199219 0.000000 335 | v 10.867188 1.125000 0.000000 336 | v 11.437500 2.730469 0.000000 337 | v 12.429688 4.125000 0.000000 338 | v 7.429688 -1.394531 1.856250 339 | v 10.011230 -0.677124 1.676074 340 | v 11.101563 0.846680 1.279688 341 | v 11.723145 2.629761 0.883301 342 | v 12.898438 4.125000 0.703125 343 | v 7.429688 -2.812500 2.475000 344 | v 10.414063 -1.728516 2.234766 345 | v 11.617188 0.234375 1.706250 346 | v 12.351563 2.408203 1.177734 347 | v 13.929688 4.125000 0.937500 348 | v 7.429688 -4.230469 1.856250 349 | v 10.816895 -2.779907 1.676074 350 | v 12.132813 -0.377930 1.279688 351 | v 12.979980 2.186646 0.883301 352 | v 14.960938 4.125000 0.703125 353 | v 7.429688 -4.875000 0.000000 354 | v 11.000000 -3.257813 0.000000 355 | v 12.367188 -0.656250 0.000000 356 | v 13.265625 2.085938 0.000000 357 | v 15.429688 4.125000 0.000000 358 | v 7.429688 -4.230469 -1.856250 359 | v 10.816895 -2.779907 -1.676074 360 | v 12.132813 -0.377930 -1.279688 361 | v 12.979980 2.186646 -0.883301 362 | v 14.960938 4.125000 -0.703125 363 | v 7.429688 -2.812500 -2.475000 364 | v 10.414063 -1.728516 -2.234766 365 | v 11.617188 0.234375 -1.706250 366 | v 12.351563 2.408203 -1.177734 367 | v 13.929688 4.125000 -0.937500 368 | v 7.429688 -1.394531 -1.856250 369 | v 10.011230 -0.677124 -1.676074 370 | v 11.101563 0.846680 -1.279688 371 | v 11.723145 2.629761 -0.883301 372 | v 12.898438 4.125000 -0.703125 373 | v 12.789063 4.335938 0.000000 374 | v 13.054688 4.406250 0.000000 375 | v 13.132813 4.335938 0.000000 376 | v 12.929688 4.125000 0.000000 377 | v 13.291077 4.346237 0.659180 378 | v 13.525879 4.422729 0.562500 379 | v 13.532898 4.350357 0.465820 380 | v 13.242188 4.125000 0.421875 381 | v 14.395508 4.368896 0.878906 382 | v 14.562500 4.458984 0.750000 383 | v 14.413086 4.382080 0.621094 384 | v 13.929688 4.125000 0.562500 385 | v 15.499939 4.391556 0.659180 386 | v 15.599121 4.495239 0.562500 387 | v 15.293274 4.413804 0.465820 388 | v 14.617188 4.125000 0.421875 389 | v 16.001953 4.401855 0.000000 390 | v 16.070313 4.511719 0.000000 391 | v 15.693359 4.428224 0.000000 392 | v 14.929688 4.125000 0.000000 393 | v 15.499939 4.391556 -0.659180 394 | v 15.599121 4.495239 -0.562500 395 | v 15.293274 4.413804 -0.465820 396 | v 14.617188 4.125000 -0.421875 397 | v 14.395508 4.368896 -0.878906 398 | v 14.562500 4.458984 -0.750000 399 | v 14.413086 4.382080 -0.621094 400 | v 13.929688 4.125000 -0.562500 401 | v 13.291077 4.346237 -0.659180 402 | v 13.525879 4.422729 -0.562500 403 | v 13.532898 4.350357 -0.465820 404 | v 13.242188 4.125000 -0.421875 405 | v -1.070312 7.875000 0.000000 406 | v 0.632813 7.628906 0.000000 407 | v 0.554688 7.031250 0.000000 408 | v -0.085937 6.292969 0.000000 409 | v -0.070312 5.625000 0.000000 410 | v 0.501414 7.628906 0.670256 411 | v 0.429278 7.031250 0.639395 412 | v -0.162029 6.292969 0.386960 413 | v -0.147812 5.625000 0.392500 414 | v 0.140489 7.628906 1.210801 415 | v 0.084844 7.031250 1.155156 416 | v -0.370879 6.292969 0.699434 417 | v -0.360312 5.625000 0.710000 418 | v -0.400056 7.628906 1.571726 419 | v -0.430918 7.031250 1.499590 420 | v -0.683352 6.292969 0.908284 421 | v -0.677812 5.625000 0.922500 422 | v -1.070312 7.628906 1.703125 423 | v -1.070312 7.031250 1.625000 424 | v -1.070312 6.292969 0.984375 425 | v -1.070312 5.625000 1.000000 426 | v -1.740569 7.628906 1.571726 427 | v -1.709707 7.031250 1.499590 428 | v -1.457273 6.292969 0.908284 429 | v -1.462812 5.625000 0.922500 430 | v -2.281113 7.628906 1.210801 431 | v -2.225469 7.031250 1.155156 432 | v -1.769746 6.292969 0.699434 433 | v -1.780312 5.625000 0.710000 434 | v -2.642038 7.628906 0.670256 435 | v -2.569902 7.031250 0.639395 436 | v -1.978596 6.292969 0.386960 437 | v -1.992812 5.625000 0.392500 438 | v -2.773438 7.628906 0.000000 439 | v -2.695313 7.031250 0.000000 440 | v -2.054687 6.292969 0.000000 441 | v -2.070312 5.625000 0.000000 442 | v -2.642038 7.628906 -0.670256 443 | v -2.569902 7.031250 -0.639395 444 | v -1.978596 6.292969 -0.386960 445 | v -1.992812 5.625000 -0.392500 446 | v -2.281113 7.628906 -1.210801 447 | v -2.225469 7.031250 -1.155156 448 | v -1.769746 6.292969 -0.699434 449 | v -1.780312 5.625000 -0.710000 450 | v -1.740569 7.628906 -1.571726 451 | v -1.709707 7.031250 -1.499590 452 | v -1.457273 6.292969 -0.908284 453 | v -1.462812 5.625000 -0.922500 454 | v -1.070312 7.628906 -1.703125 455 | v -1.070312 7.031250 -1.625000 456 | v -1.070312 6.292969 -0.984375 457 | v -1.070312 5.625000 -1.000000 458 | v -0.400056 7.628906 -1.571726 459 | v -0.430918 7.031250 -1.499590 460 | v -0.683352 6.292969 -0.908284 461 | v -0.677812 5.625000 -0.922500 462 | v 0.140489 7.628906 -1.210801 463 | v 0.084844 7.031250 -1.155156 464 | v -0.370879 6.292969 -0.699434 465 | v -0.360312 5.625000 -0.710000 466 | v 0.501414 7.628906 -0.670256 467 | v 0.429278 7.031250 -0.639395 468 | v -0.162029 6.292969 -0.386960 469 | v -0.147812 5.625000 -0.392500 470 | v 1.210938 5.179688 0.000000 471 | v 3.054688 4.875000 0.000000 472 | v 4.710938 4.570313 0.000000 473 | v 5.429688 4.125000 0.000000 474 | v 1.034141 5.179688 0.895391 475 | v 2.735000 4.875000 1.619062 476 | v 4.262891 4.570313 2.269140 477 | v 4.925938 4.125000 2.551250 478 | v 0.549375 5.179688 1.619688 479 | v 1.858438 4.875000 2.928750 480 | v 3.034375 4.570313 4.104687 481 | v 3.544688 4.125000 4.615000 482 | v -0.174922 5.179688 2.104453 483 | v 0.548750 4.875000 3.805313 484 | v 1.198828 4.570313 5.333203 485 | v 1.480938 4.125000 5.996250 486 | v -1.070312 5.179688 2.281250 487 | v -1.070312 4.875000 4.125000 488 | v -1.070312 4.570313 5.781250 489 | v -1.070312 4.125000 6.500000 490 | v -1.965703 5.179688 2.104453 491 | v -2.689375 4.875000 3.805313 492 | v -3.339453 4.570313 5.333203 493 | v -3.621562 4.125000 5.996250 494 | v -2.690000 5.179688 1.619688 495 | v -3.999062 4.875000 2.928750 496 | v -5.174999 4.570313 4.104687 497 | v -5.685312 4.125000 4.615000 498 | v -3.174765 5.179688 0.895391 499 | v -4.875625 4.875000 1.619062 500 | v -6.403516 4.570313 2.269140 501 | v -7.066563 4.125000 2.551250 502 | v -3.351562 5.179688 0.000000 503 | v -5.195313 4.875000 0.000000 504 | v -6.851563 4.570313 0.000000 505 | v -7.570313 4.125000 0.000000 506 | v -3.174765 5.179688 -0.895391 507 | v -4.875625 4.875000 -1.619062 508 | v -6.403516 4.570313 -2.269140 509 | v -7.066563 4.125000 -2.551250 510 | v -2.690000 5.179688 -1.619688 511 | v -3.999062 4.875000 -2.928750 512 | v -5.174999 4.570313 -4.104687 513 | v -5.685312 4.125000 -4.615000 514 | v -1.965703 5.179688 -2.104453 515 | v -2.689375 4.875000 -3.805313 516 | v -3.339453 4.570313 -5.333203 517 | v -3.621562 4.125000 -5.996250 518 | v -1.070312 5.179688 -2.281250 519 | v -1.070312 4.875000 -4.125000 520 | v -1.070312 4.570313 -5.781250 521 | v -1.070312 4.125000 -6.500000 522 | v -0.174922 5.179688 -2.104453 523 | v 0.548750 4.875000 -3.805313 524 | v 1.198828 4.570313 -5.333203 525 | v 1.480938 4.125000 -5.996250 526 | v 0.549375 5.179688 -1.619688 527 | v 1.858438 4.875000 -2.928750 528 | v 3.034375 4.570313 -4.104687 529 | v 3.544688 4.125000 -4.615000 530 | v 1.034141 5.179688 -0.895391 531 | v 2.735000 4.875000 -1.619062 532 | v 4.262891 4.570313 -2.269140 533 | v 4.925938 4.125000 -2.551250 534 | # 530 vertices 535 | 536 | vt 2.000000 2.000000 0.000000 537 | vt 2.000000 1.975000 0.000000 538 | vt 2.000000 1.950000 0.000000 539 | vt 2.000000 1.925000 0.000000 540 | vt 2.000000 1.900000 0.000000 541 | vt 1.750000 2.000000 0.000000 542 | vt 1.750000 1.975000 0.000000 543 | vt 1.750000 1.950000 0.000000 544 | vt 1.750000 1.925000 0.000000 545 | vt 1.750000 1.900000 0.000000 546 | vt 1.500000 2.000000 0.000000 547 | vt 1.500000 1.975000 0.000000 548 | vt 1.500000 1.950000 0.000000 549 | vt 1.500000 1.925000 0.000000 550 | vt 1.500000 1.900000 0.000000 551 | vt 1.250000 2.000000 0.000000 552 | vt 1.250000 1.975000 0.000000 553 | vt 1.250000 1.950000 0.000000 554 | vt 1.250000 1.925000 0.000000 555 | vt 1.250000 1.900000 0.000000 556 | vt 1.000000 2.000000 0.000000 557 | vt 1.000000 1.975000 0.000000 558 | vt 1.000000 1.950000 0.000000 559 | vt 1.000000 1.925000 0.000000 560 | vt 1.000000 1.900000 0.000000 561 | vt 1.000000 2.000000 0.000000 562 | vt 1.000000 1.975000 0.000000 563 | vt 1.000000 1.950000 0.000000 564 | vt 1.000000 1.925000 0.000000 565 | vt 1.000000 1.900000 0.000000 566 | vt 0.750000 2.000000 0.000000 567 | vt 0.750000 1.975000 0.000000 568 | vt 0.750000 1.950000 0.000000 569 | vt 0.750000 1.925000 0.000000 570 | vt 0.750000 1.900000 0.000000 571 | vt 0.500000 2.000000 0.000000 572 | vt 0.500000 1.975000 0.000000 573 | vt 0.500000 1.950000 0.000000 574 | vt 0.500000 1.925000 0.000000 575 | vt 0.500000 1.900000 0.000000 576 | vt 0.250000 2.000000 0.000000 577 | vt 0.250000 1.975000 0.000000 578 | vt 0.250000 1.950000 0.000000 579 | vt 0.250000 1.925000 0.000000 580 | vt 0.250000 1.900000 0.000000 581 | vt 0.000000 2.000000 0.000000 582 | vt 0.000000 1.975000 0.000000 583 | vt 0.000000 1.950000 0.000000 584 | vt 0.000000 1.925000 0.000000 585 | vt 0.000000 1.900000 0.000000 586 | vt 2.000000 2.000000 0.000000 587 | vt 2.000000 1.975000 0.000000 588 | vt 2.000000 1.950000 0.000000 589 | vt 2.000000 1.925000 0.000000 590 | vt 2.000000 1.900000 0.000000 591 | vt 1.750000 2.000000 0.000000 592 | vt 1.750000 1.975000 0.000000 593 | vt 1.750000 1.950000 0.000000 594 | vt 1.750000 1.925000 0.000000 595 | vt 1.750000 1.900000 0.000000 596 | vt 1.500000 2.000000 0.000000 597 | vt 1.500000 1.975000 0.000000 598 | vt 1.500000 1.950000 0.000000 599 | vt 1.500000 1.925000 0.000000 600 | vt 1.500000 1.900000 0.000000 601 | vt 1.250000 2.000000 0.000000 602 | vt 1.250000 1.975000 0.000000 603 | vt 1.250000 1.950000 0.000000 604 | vt 1.250000 1.925000 0.000000 605 | vt 1.250000 1.900000 0.000000 606 | vt 1.000000 2.000000 0.000000 607 | vt 1.000000 1.975000 0.000000 608 | vt 1.000000 1.950000 0.000000 609 | vt 1.000000 1.925000 0.000000 610 | vt 1.000000 1.900000 0.000000 611 | vt 1.000000 2.000000 0.000000 612 | vt 1.000000 1.975000 0.000000 613 | vt 1.000000 1.950000 0.000000 614 | vt 1.000000 1.925000 0.000000 615 | vt 1.000000 1.900000 0.000000 616 | vt 0.750000 2.000000 0.000000 617 | vt 0.750000 1.975000 0.000000 618 | vt 0.750000 1.950000 0.000000 619 | vt 0.750000 1.925000 0.000000 620 | vt 0.750000 1.900000 0.000000 621 | vt 0.500000 2.000000 0.000000 622 | vt 0.500000 1.975000 0.000000 623 | vt 0.500000 1.950000 0.000000 624 | vt 0.500000 1.925000 0.000000 625 | vt 0.500000 1.900000 0.000000 626 | vt 0.250000 2.000000 0.000000 627 | vt 0.250000 1.975000 0.000000 628 | vt 0.250000 1.950000 0.000000 629 | vt 0.250000 1.925000 0.000000 630 | vt 0.250000 1.900000 0.000000 631 | vt 0.000000 2.000000 0.000000 632 | vt 0.000000 1.975000 0.000000 633 | vt 0.000000 1.950000 0.000000 634 | vt 0.000000 1.925000 0.000000 635 | vt 0.000000 1.900000 0.000000 636 | vt 2.000000 1.900000 0.000000 637 | vt 2.000000 1.675000 0.000000 638 | vt 2.000000 1.450000 0.000000 639 | vt 2.000000 1.225000 0.000000 640 | vt 2.000000 1.000000 0.000000 641 | vt 1.750000 1.900000 0.000000 642 | vt 1.750000 1.675000 0.000000 643 | vt 1.750000 1.450000 0.000000 644 | vt 1.750000 1.225000 0.000000 645 | vt 1.750000 1.000000 0.000000 646 | vt 1.500000 1.900000 0.000000 647 | vt 1.500000 1.675000 0.000000 648 | vt 1.500000 1.450000 0.000000 649 | vt 1.500000 1.225000 0.000000 650 | vt 1.500000 1.000000 0.000000 651 | vt 1.250000 1.900000 0.000000 652 | vt 1.250000 1.675000 0.000000 653 | vt 1.250000 1.450000 0.000000 654 | vt 1.250000 1.225000 0.000000 655 | vt 1.250000 1.000000 0.000000 656 | vt 1.000000 1.900000 0.000000 657 | vt 1.000000 1.675000 0.000000 658 | vt 1.000000 1.450000 0.000000 659 | vt 1.000000 1.225000 0.000000 660 | vt 1.000000 1.000000 0.000000 661 | vt 1.000000 1.900000 0.000000 662 | vt 1.000000 1.675000 0.000000 663 | vt 1.000000 1.450000 0.000000 664 | vt 1.000000 1.225000 0.000000 665 | vt 1.000000 1.000000 0.000000 666 | vt 0.750000 1.900000 0.000000 667 | vt 0.750000 1.675000 0.000000 668 | vt 0.750000 1.450000 0.000000 669 | vt 0.750000 1.225000 0.000000 670 | vt 0.750000 1.000000 0.000000 671 | vt 0.500000 1.900000 0.000000 672 | vt 0.500000 1.675000 0.000000 673 | vt 0.500000 1.450000 0.000000 674 | vt 0.500000 1.225000 0.000000 675 | vt 0.500000 1.000000 0.000000 676 | vt 0.250000 1.900000 0.000000 677 | vt 0.250000 1.675000 0.000000 678 | vt 0.250000 1.450000 0.000000 679 | vt 0.250000 1.225000 0.000000 680 | vt 0.250000 1.000000 0.000000 681 | vt 0.000000 1.900000 0.000000 682 | vt 0.000000 1.675000 0.000000 683 | vt 0.000000 1.450000 0.000000 684 | vt 0.000000 1.225000 0.000000 685 | vt 0.000000 1.000000 0.000000 686 | vt 2.000000 1.900000 0.000000 687 | vt 2.000000 1.675000 0.000000 688 | vt 2.000000 1.450000 0.000000 689 | vt 2.000000 1.225000 0.000000 690 | vt 2.000000 1.000000 0.000000 691 | vt 1.750000 1.900000 0.000000 692 | vt 1.750000 1.675000 0.000000 693 | vt 1.750000 1.450000 0.000000 694 | vt 1.750000 1.225000 0.000000 695 | vt 1.750000 1.000000 0.000000 696 | vt 1.500000 1.900000 0.000000 697 | vt 1.500000 1.675000 0.000000 698 | vt 1.500000 1.450000 0.000000 699 | vt 1.500000 1.225000 0.000000 700 | vt 1.500000 1.000000 0.000000 701 | vt 1.250000 1.900000 0.000000 702 | vt 1.250000 1.675000 0.000000 703 | vt 1.250000 1.450000 0.000000 704 | vt 1.250000 1.225000 0.000000 705 | vt 1.250000 1.000000 0.000000 706 | vt 1.000000 1.900000 0.000000 707 | vt 1.000000 1.675000 0.000000 708 | vt 1.000000 1.450000 0.000000 709 | vt 1.000000 1.225000 0.000000 710 | vt 1.000000 1.000000 0.000000 711 | vt 1.000000 1.900000 0.000000 712 | vt 1.000000 1.675000 0.000000 713 | vt 1.000000 1.450000 0.000000 714 | vt 1.000000 1.225000 0.000000 715 | vt 1.000000 1.000000 0.000000 716 | vt 0.750000 1.900000 0.000000 717 | vt 0.750000 1.675000 0.000000 718 | vt 0.750000 1.450000 0.000000 719 | vt 0.750000 1.225000 0.000000 720 | vt 0.750000 1.000000 0.000000 721 | vt 0.500000 1.900000 0.000000 722 | vt 0.500000 1.675000 0.000000 723 | vt 0.500000 1.450000 0.000000 724 | vt 0.500000 1.225000 0.000000 725 | vt 0.500000 1.000000 0.000000 726 | vt 0.250000 1.900000 0.000000 727 | vt 0.250000 1.675000 0.000000 728 | vt 0.250000 1.450000 0.000000 729 | vt 0.250000 1.225000 0.000000 730 | vt 0.250000 1.000000 0.000000 731 | vt 0.000000 1.900000 0.000000 732 | vt 0.000000 1.675000 0.000000 733 | vt 0.000000 1.450000 0.000000 734 | vt 0.000000 1.225000 0.000000 735 | vt 0.000000 1.000000 0.000000 736 | vt 2.000000 1.000000 0.000000 737 | vt 2.000000 0.850000 0.000000 738 | vt 2.000000 0.700000 0.000000 739 | vt 2.000000 0.550000 0.000000 740 | vt 2.000000 0.400000 0.000000 741 | vt 1.750000 1.000000 0.000000 742 | vt 1.750000 0.850000 0.000000 743 | vt 1.750000 0.700000 0.000000 744 | vt 1.750000 0.550000 0.000000 745 | vt 1.750000 0.400000 0.000000 746 | vt 1.500000 1.000000 0.000000 747 | vt 1.500000 0.850000 0.000000 748 | vt 1.500000 0.700000 0.000000 749 | vt 1.500000 0.550000 0.000000 750 | vt 1.500000 0.400000 0.000000 751 | vt 1.250000 1.000000 0.000000 752 | vt 1.250000 0.850000 0.000000 753 | vt 1.250000 0.700000 0.000000 754 | vt 1.250000 0.550000 0.000000 755 | vt 1.250000 0.400000 0.000000 756 | vt 1.000000 1.000000 0.000000 757 | vt 1.000000 0.850000 0.000000 758 | vt 1.000000 0.700000 0.000000 759 | vt 1.000000 0.550000 0.000000 760 | vt 1.000000 0.400000 0.000000 761 | vt 1.000000 1.000000 0.000000 762 | vt 1.000000 0.850000 0.000000 763 | vt 1.000000 0.700000 0.000000 764 | vt 1.000000 0.550000 0.000000 765 | vt 1.000000 0.400000 0.000000 766 | vt 0.750000 1.000000 0.000000 767 | vt 0.750000 0.850000 0.000000 768 | vt 0.750000 0.700000 0.000000 769 | vt 0.750000 0.550000 0.000000 770 | vt 0.750000 0.400000 0.000000 771 | vt 0.500000 1.000000 0.000000 772 | vt 0.500000 0.850000 0.000000 773 | vt 0.500000 0.700000 0.000000 774 | vt 0.500000 0.550000 0.000000 775 | vt 0.500000 0.400000 0.000000 776 | vt 0.250000 1.000000 0.000000 777 | vt 0.250000 0.850000 0.000000 778 | vt 0.250000 0.700000 0.000000 779 | vt 0.250000 0.550000 0.000000 780 | vt 0.250000 0.400000 0.000000 781 | vt 0.000000 1.000000 0.000000 782 | vt 0.000000 0.850000 0.000000 783 | vt 0.000000 0.700000 0.000000 784 | vt 0.000000 0.550000 0.000000 785 | vt 0.000000 0.400000 0.000000 786 | vt 2.000000 1.000000 0.000000 787 | vt 2.000000 0.850000 0.000000 788 | vt 2.000000 0.700000 0.000000 789 | vt 2.000000 0.550000 0.000000 790 | vt 2.000000 0.400000 0.000000 791 | vt 1.750000 1.000000 0.000000 792 | vt 1.750000 0.850000 0.000000 793 | vt 1.750000 0.700000 0.000000 794 | vt 1.750000 0.550000 0.000000 795 | vt 1.750000 0.400000 0.000000 796 | vt 1.500000 1.000000 0.000000 797 | vt 1.500000 0.850000 0.000000 798 | vt 1.500000 0.700000 0.000000 799 | vt 1.500000 0.550000 0.000000 800 | vt 1.500000 0.400000 0.000000 801 | vt 1.250000 1.000000 0.000000 802 | vt 1.250000 0.850000 0.000000 803 | vt 1.250000 0.700000 0.000000 804 | vt 1.250000 0.550000 0.000000 805 | vt 1.250000 0.400000 0.000000 806 | vt 1.000000 1.000000 0.000000 807 | vt 1.000000 0.850000 0.000000 808 | vt 1.000000 0.700000 0.000000 809 | vt 1.000000 0.550000 0.000000 810 | vt 1.000000 0.400000 0.000000 811 | vt 1.000000 1.000000 0.000000 812 | vt 1.000000 0.850000 0.000000 813 | vt 1.000000 0.700000 0.000000 814 | vt 1.000000 0.550000 0.000000 815 | vt 1.000000 0.400000 0.000000 816 | vt 0.750000 1.000000 0.000000 817 | vt 0.750000 0.850000 0.000000 818 | vt 0.750000 0.700000 0.000000 819 | vt 0.750000 0.550000 0.000000 820 | vt 0.750000 0.400000 0.000000 821 | vt 0.500000 1.000000 0.000000 822 | vt 0.500000 0.850000 0.000000 823 | vt 0.500000 0.700000 0.000000 824 | vt 0.500000 0.550000 0.000000 825 | vt 0.500000 0.400000 0.000000 826 | vt 0.250000 1.000000 0.000000 827 | vt 0.250000 0.850000 0.000000 828 | vt 0.250000 0.700000 0.000000 829 | vt 0.250000 0.550000 0.000000 830 | vt 0.250000 0.400000 0.000000 831 | vt 0.000000 1.000000 0.000000 832 | vt 0.000000 0.850000 0.000000 833 | vt 0.000000 0.700000 0.000000 834 | vt 0.000000 0.550000 0.000000 835 | vt 0.000000 0.400000 0.000000 836 | vt 2.000000 0.400000 0.000000 837 | vt 2.000000 0.300000 0.000000 838 | vt 2.000000 0.200000 0.000000 839 | vt 2.000000 0.100000 0.000000 840 | vt 2.000000 0.000000 0.000000 841 | vt 1.750000 0.400000 0.000000 842 | vt 1.750000 0.300000 0.000000 843 | vt 1.750000 0.200000 0.000000 844 | vt 1.750000 0.100000 0.000000 845 | vt 1.750000 0.000000 0.000000 846 | vt 1.500000 0.400000 0.000000 847 | vt 1.500000 0.300000 0.000000 848 | vt 1.500000 0.200000 0.000000 849 | vt 1.500000 0.100000 0.000000 850 | vt 1.500000 0.000000 0.000000 851 | vt 1.250000 0.400000 0.000000 852 | vt 1.250000 0.300000 0.000000 853 | vt 1.250000 0.200000 0.000000 854 | vt 1.250000 0.100000 0.000000 855 | vt 1.250000 0.000000 0.000000 856 | vt 1.000000 0.400000 0.000000 857 | vt 1.000000 0.300000 0.000000 858 | vt 1.000000 0.200000 0.000000 859 | vt 1.000000 0.100000 0.000000 860 | vt 1.000000 0.000000 0.000000 861 | vt 1.000000 0.400000 0.000000 862 | vt 1.000000 0.300000 0.000000 863 | vt 1.000000 0.200000 0.000000 864 | vt 1.000000 0.100000 0.000000 865 | vt 1.000000 0.000000 0.000000 866 | vt 0.750000 0.400000 0.000000 867 | vt 0.750000 0.300000 0.000000 868 | vt 0.750000 0.200000 0.000000 869 | vt 0.750000 0.100000 0.000000 870 | vt 0.750000 0.000000 0.000000 871 | vt 0.500000 0.400000 0.000000 872 | vt 0.500000 0.300000 0.000000 873 | vt 0.500000 0.200000 0.000000 874 | vt 0.500000 0.100000 0.000000 875 | vt 0.500000 0.000000 0.000000 876 | vt 0.250000 0.400000 0.000000 877 | vt 0.250000 0.300000 0.000000 878 | vt 0.250000 0.200000 0.000000 879 | vt 0.250000 0.100000 0.000000 880 | vt 0.250000 0.000000 0.000000 881 | vt 0.000000 0.400000 0.000000 882 | vt 0.000000 0.300000 0.000000 883 | vt 0.000000 0.200000 0.000000 884 | vt 0.000000 0.100000 0.000000 885 | vt 0.000000 0.000000 0.000000 886 | vt 2.000000 0.400000 0.000000 887 | vt 2.000000 0.300000 0.000000 888 | vt 2.000000 0.200000 0.000000 889 | vt 2.000000 0.100000 0.000000 890 | vt 2.000000 0.000000 0.000000 891 | vt 1.750000 0.400000 0.000000 892 | vt 1.750000 0.300000 0.000000 893 | vt 1.750000 0.200000 0.000000 894 | vt 1.750000 0.100000 0.000000 895 | vt 1.750000 0.000000 0.000000 896 | vt 1.500000 0.400000 0.000000 897 | vt 1.500000 0.300000 0.000000 898 | vt 1.500000 0.200000 0.000000 899 | vt 1.500000 0.100000 0.000000 900 | vt 1.500000 0.000000 0.000000 901 | vt 1.250000 0.400000 0.000000 902 | vt 1.250000 0.300000 0.000000 903 | vt 1.250000 0.200000 0.000000 904 | vt 1.250000 0.100000 0.000000 905 | vt 1.250000 0.000000 0.000000 906 | vt 1.000000 0.400000 0.000000 907 | vt 1.000000 0.300000 0.000000 908 | vt 1.000000 0.200000 0.000000 909 | vt 1.000000 0.100000 0.000000 910 | vt 1.000000 0.000000 0.000000 911 | vt 1.000000 0.400000 0.000000 912 | vt 1.000000 0.300000 0.000000 913 | vt 1.000000 0.200000 0.000000 914 | vt 1.000000 0.100000 0.000000 915 | vt 1.000000 0.000000 0.000000 916 | vt 0.750000 0.400000 0.000000 917 | vt 0.750000 0.300000 0.000000 918 | vt 0.750000 0.200000 0.000000 919 | vt 0.750000 0.100000 0.000000 920 | vt 0.750000 0.000000 0.000000 921 | vt 0.500000 0.400000 0.000000 922 | vt 0.500000 0.300000 0.000000 923 | vt 0.500000 0.200000 0.000000 924 | vt 0.500000 0.100000 0.000000 925 | vt 0.500000 0.000000 0.000000 926 | vt 0.250000 0.400000 0.000000 927 | vt 0.250000 0.300000 0.000000 928 | vt 0.250000 0.200000 0.000000 929 | vt 0.250000 0.100000 0.000000 930 | vt 0.250000 0.000000 0.000000 931 | vt 0.000000 0.400000 0.000000 932 | vt 0.000000 0.300000 0.000000 933 | vt 0.000000 0.200000 0.000000 934 | vt 0.000000 0.100000 0.000000 935 | vt 0.000000 0.000000 0.000000 936 | vt 1.000000 1.000000 0.000000 937 | vt 1.000000 0.875000 0.000000 938 | vt 1.000000 0.750000 0.000000 939 | vt 1.000000 0.625000 0.000000 940 | vt 1.000000 0.500000 0.000000 941 | vt 0.875000 1.000000 0.000000 942 | vt 0.875000 0.875000 0.000000 943 | vt 0.875000 0.750000 0.000000 944 | vt 0.875000 0.625000 0.000000 945 | vt 0.875000 0.500000 0.000000 946 | vt 0.750000 1.000000 0.000000 947 | vt 0.750000 0.875000 0.000000 948 | vt 0.750000 0.750000 0.000000 949 | vt 0.750000 0.625000 0.000000 950 | vt 0.750000 0.500000 0.000000 951 | vt 0.625000 1.000000 0.000000 952 | vt 0.625000 0.875000 0.000000 953 | vt 0.625000 0.750000 0.000000 954 | vt 0.625000 0.625000 0.000000 955 | vt 0.625000 0.500000 0.000000 956 | vt 0.500000 1.000000 0.000000 957 | vt 0.500000 0.875000 0.000000 958 | vt 0.500000 0.750000 0.000000 959 | vt 0.500000 0.625000 0.000000 960 | vt 0.500000 0.500000 0.000000 961 | vt 0.500000 1.000000 0.000000 962 | vt 0.500000 0.875000 0.000000 963 | vt 0.500000 0.750000 0.000000 964 | vt 0.500000 0.625000 0.000000 965 | vt 0.500000 0.500000 0.000000 966 | vt 0.375000 1.000000 0.000000 967 | vt 0.375000 0.875000 0.000000 968 | vt 0.375000 0.750000 0.000000 969 | vt 0.375000 0.625000 0.000000 970 | vt 0.375000 0.500000 0.000000 971 | vt 0.250000 1.000000 0.000000 972 | vt 0.250000 0.875000 0.000000 973 | vt 0.250000 0.750000 0.000000 974 | vt 0.250000 0.625000 0.000000 975 | vt 0.250000 0.500000 0.000000 976 | vt 0.125000 1.000000 0.000000 977 | vt 0.125000 0.875000 0.000000 978 | vt 0.125000 0.750000 0.000000 979 | vt 0.125000 0.625000 0.000000 980 | vt 0.125000 0.500000 0.000000 981 | vt 0.000000 1.000000 0.000000 982 | vt 0.000000 0.875000 0.000000 983 | vt 0.000000 0.750000 0.000000 984 | vt 0.000000 0.625000 0.000000 985 | vt 0.000000 0.500000 0.000000 986 | vt 1.000000 0.500000 0.000000 987 | vt 1.000000 0.375000 0.000000 988 | vt 1.000000 0.250000 0.000000 989 | vt 1.000000 0.125000 0.000000 990 | vt 1.000000 0.000000 0.000000 991 | vt 0.875000 0.500000 0.000000 992 | vt 0.875000 0.375000 0.000000 993 | vt 0.875000 0.250000 0.000000 994 | vt 0.875000 0.125000 0.000000 995 | vt 0.875000 0.000000 0.000000 996 | vt 0.750000 0.500000 0.000000 997 | vt 0.750000 0.375000 0.000000 998 | vt 0.750000 0.250000 0.000000 999 | vt 0.750000 0.125000 0.000000 1000 | vt 0.750000 0.000000 0.000000 1001 | vt 0.625000 0.500000 0.000000 1002 | vt 0.625000 0.375000 0.000000 1003 | vt 0.625000 0.250000 0.000000 1004 | vt 0.625000 0.125000 0.000000 1005 | vt 0.625000 0.000000 0.000000 1006 | vt 0.500000 0.500000 0.000000 1007 | vt 0.500000 0.375000 0.000000 1008 | vt 0.500000 0.250000 0.000000 1009 | vt 0.500000 0.125000 0.000000 1010 | vt 0.500000 0.000000 0.000000 1011 | vt 0.500000 0.500000 0.000000 1012 | vt 0.500000 0.375000 0.000000 1013 | vt 0.500000 0.250000 0.000000 1014 | vt 0.500000 0.125000 0.000000 1015 | vt 0.500000 0.000000 0.000000 1016 | vt 0.375000 0.500000 0.000000 1017 | vt 0.375000 0.375000 0.000000 1018 | vt 0.375000 0.250000 0.000000 1019 | vt 0.375000 0.125000 0.000000 1020 | vt 0.375000 0.000000 0.000000 1021 | vt 0.250000 0.500000 0.000000 1022 | vt 0.250000 0.375000 0.000000 1023 | vt 0.250000 0.250000 0.000000 1024 | vt 0.250000 0.125000 0.000000 1025 | vt 0.250000 0.000000 0.000000 1026 | vt 0.125000 0.500000 0.000000 1027 | vt 0.125000 0.375000 0.000000 1028 | vt 0.125000 0.250000 0.000000 1029 | vt 0.125000 0.125000 0.000000 1030 | vt 0.125000 0.000000 0.000000 1031 | vt 0.000000 0.500000 0.000000 1032 | vt 0.000000 0.375000 0.000000 1033 | vt 0.000000 0.250000 0.000000 1034 | vt 0.000000 0.125000 0.000000 1035 | vt 0.000000 0.000000 0.000000 1036 | vt 0.500000 0.000000 0.000000 1037 | vt 0.500000 0.225000 0.000000 1038 | vt 0.500000 0.450000 0.000000 1039 | vt 0.500000 0.675000 0.000000 1040 | vt 0.500000 0.900000 0.000000 1041 | vt 0.625000 0.000000 0.000000 1042 | vt 0.625000 0.225000 0.000000 1043 | vt 0.625000 0.450000 0.000000 1044 | vt 0.625000 0.675000 0.000000 1045 | vt 0.625000 0.900000 0.000000 1046 | vt 0.750000 0.000000 0.000000 1047 | vt 0.750000 0.225000 0.000000 1048 | vt 0.750000 0.450000 0.000000 1049 | vt 0.750000 0.675000 0.000000 1050 | vt 0.750000 0.900000 0.000000 1051 | vt 0.875000 0.000000 0.000000 1052 | vt 0.875000 0.225000 0.000000 1053 | vt 0.875000 0.450000 0.000000 1054 | vt 0.875000 0.675000 0.000000 1055 | vt 0.875000 0.900000 0.000000 1056 | vt 1.000000 0.000000 0.000000 1057 | vt 1.000000 0.225000 0.000000 1058 | vt 1.000000 0.450000 0.000000 1059 | vt 1.000000 0.675000 0.000000 1060 | vt 1.000000 0.900000 0.000000 1061 | vt 0.000000 0.000000 0.000000 1062 | vt 0.000000 0.225000 0.000000 1063 | vt 0.000000 0.450000 0.000000 1064 | vt 0.000000 0.675000 0.000000 1065 | vt 0.000000 0.900000 0.000000 1066 | vt 0.125000 0.000000 0.000000 1067 | vt 0.125000 0.225000 0.000000 1068 | vt 0.125000 0.450000 0.000000 1069 | vt 0.125000 0.675000 0.000000 1070 | vt 0.125000 0.900000 0.000000 1071 | vt 0.250000 0.000000 0.000000 1072 | vt 0.250000 0.225000 0.000000 1073 | vt 0.250000 0.450000 0.000000 1074 | vt 0.250000 0.675000 0.000000 1075 | vt 0.250000 0.900000 0.000000 1076 | vt 0.375000 0.000000 0.000000 1077 | vt 0.375000 0.225000 0.000000 1078 | vt 0.375000 0.450000 0.000000 1079 | vt 0.375000 0.675000 0.000000 1080 | vt 0.375000 0.900000 0.000000 1081 | vt 0.500000 0.000000 0.000000 1082 | vt 0.500000 0.225000 0.000000 1083 | vt 0.500000 0.450000 0.000000 1084 | vt 0.500000 0.675000 0.000000 1085 | vt 0.500000 0.900000 0.000000 1086 | vt 0.500000 0.900000 0.000000 1087 | vt 0.500000 0.925000 0.000000 1088 | vt 0.500000 0.950000 0.000000 1089 | vt 0.500000 0.975000 0.000000 1090 | vt 0.500000 1.000000 0.000000 1091 | vt 0.625000 0.900000 0.000000 1092 | vt 0.625000 0.925000 0.000000 1093 | vt 0.625000 0.950000 0.000000 1094 | vt 0.625000 0.975000 0.000000 1095 | vt 0.625000 1.000000 0.000000 1096 | vt 0.750000 0.900000 0.000000 1097 | vt 0.750000 0.925000 0.000000 1098 | vt 0.750000 0.950000 0.000000 1099 | vt 0.750000 0.975000 0.000000 1100 | vt 0.750000 1.000000 0.000000 1101 | vt 0.875000 0.900000 0.000000 1102 | vt 0.875000 0.925000 0.000000 1103 | vt 0.875000 0.950000 0.000000 1104 | vt 0.875000 0.975000 0.000000 1105 | vt 0.875000 1.000000 0.000000 1106 | vt 1.000000 0.900000 0.000000 1107 | vt 1.000000 0.925000 0.000000 1108 | vt 1.000000 0.950000 0.000000 1109 | vt 1.000000 0.975000 0.000000 1110 | vt 1.000000 1.000000 0.000000 1111 | vt 0.000000 0.900000 0.000000 1112 | vt 0.000000 0.925000 0.000000 1113 | vt 0.000000 0.950000 0.000000 1114 | vt 0.000000 0.975000 0.000000 1115 | vt 0.000000 1.000000 0.000000 1116 | vt 0.125000 0.900000 0.000000 1117 | vt 0.125000 0.925000 0.000000 1118 | vt 0.125000 0.950000 0.000000 1119 | vt 0.125000 0.975000 0.000000 1120 | vt 0.125000 1.000000 0.000000 1121 | vt 0.250000 0.900000 0.000000 1122 | vt 0.250000 0.925000 0.000000 1123 | vt 0.250000 0.950000 0.000000 1124 | vt 0.250000 0.975000 0.000000 1125 | vt 0.250000 1.000000 0.000000 1126 | vt 0.375000 0.900000 0.000000 1127 | vt 0.375000 0.925000 0.000000 1128 | vt 0.375000 0.950000 0.000000 1129 | vt 0.375000 0.975000 0.000000 1130 | vt 0.375000 1.000000 0.000000 1131 | vt 0.500000 0.900000 0.000000 1132 | vt 0.500000 0.925000 0.000000 1133 | vt 0.500000 0.950000 0.000000 1134 | vt 0.500000 0.975000 0.000000 1135 | vt 0.500000 1.000000 0.000000 1136 | vt 1.000000 1.000000 0.000000 1137 | vt 1.000000 0.750000 0.000000 1138 | vt 1.000000 0.500000 0.000000 1139 | vt 1.000000 0.250000 0.000000 1140 | vt 1.000000 0.000000 0.000000 1141 | vt 0.875000 1.000000 0.000000 1142 | vt 0.875000 0.750000 0.000000 1143 | vt 0.875000 0.500000 0.000000 1144 | vt 0.875000 0.250000 0.000000 1145 | vt 0.875000 0.000000 0.000000 1146 | vt 0.750000 1.000000 0.000000 1147 | vt 0.750000 0.750000 0.000000 1148 | vt 0.750000 0.500000 0.000000 1149 | vt 0.750000 0.250000 0.000000 1150 | vt 0.750000 0.000000 0.000000 1151 | vt 0.625000 1.000000 0.000000 1152 | vt 0.625000 0.750000 0.000000 1153 | vt 0.625000 0.500000 0.000000 1154 | vt 0.625000 0.250000 0.000000 1155 | vt 0.625000 0.000000 0.000000 1156 | vt 0.500000 1.000000 0.000000 1157 | vt 0.500000 0.750000 0.000000 1158 | vt 0.500000 0.500000 0.000000 1159 | vt 0.500000 0.250000 0.000000 1160 | vt 0.500000 0.000000 0.000000 1161 | vt 0.500000 1.000000 0.000000 1162 | vt 0.500000 0.750000 0.000000 1163 | vt 0.500000 0.500000 0.000000 1164 | vt 0.500000 0.250000 0.000000 1165 | vt 0.500000 0.000000 0.000000 1166 | vt 0.375000 1.000000 0.000000 1167 | vt 0.375000 0.750000 0.000000 1168 | vt 0.375000 0.500000 0.000000 1169 | vt 0.375000 0.250000 0.000000 1170 | vt 0.375000 0.000000 0.000000 1171 | vt 0.250000 1.000000 0.000000 1172 | vt 0.250000 0.750000 0.000000 1173 | vt 0.250000 0.500000 0.000000 1174 | vt 0.250000 0.250000 0.000000 1175 | vt 0.250000 0.000000 0.000000 1176 | vt 0.125000 1.000000 0.000000 1177 | vt 0.125000 0.750000 0.000000 1178 | vt 0.125000 0.500000 0.000000 1179 | vt 0.125000 0.250000 0.000000 1180 | vt 0.125000 0.000000 0.000000 1181 | vt 0.000000 1.000000 0.000000 1182 | vt 0.000000 0.750000 0.000000 1183 | vt 0.000000 0.500000 0.000000 1184 | vt 0.000000 0.250000 0.000000 1185 | vt 0.000000 0.000000 0.000000 1186 | vt 1.000000 1.000000 0.000000 1187 | vt 1.000000 0.750000 0.000000 1188 | vt 1.000000 0.500000 0.000000 1189 | vt 1.000000 0.250000 0.000000 1190 | vt 1.000000 0.000000 0.000000 1191 | vt 0.875000 1.000000 0.000000 1192 | vt 0.875000 0.750000 0.000000 1193 | vt 0.875000 0.500000 0.000000 1194 | vt 0.875000 0.250000 0.000000 1195 | vt 0.875000 0.000000 0.000000 1196 | vt 0.750000 1.000000 0.000000 1197 | vt 0.750000 0.750000 0.000000 1198 | vt 0.750000 0.500000 0.000000 1199 | vt 0.750000 0.250000 0.000000 1200 | vt 0.750000 0.000000 0.000000 1201 | vt 0.625000 1.000000 0.000000 1202 | vt 0.625000 0.750000 0.000000 1203 | vt 0.625000 0.500000 0.000000 1204 | vt 0.625000 0.250000 0.000000 1205 | vt 0.625000 0.000000 0.000000 1206 | vt 0.500000 1.000000 0.000000 1207 | vt 0.500000 0.750000 0.000000 1208 | vt 0.500000 0.500000 0.000000 1209 | vt 0.500000 0.250000 0.000000 1210 | vt 0.500000 0.000000 0.000000 1211 | vt 0.500000 1.000000 0.000000 1212 | vt 0.500000 0.750000 0.000000 1213 | vt 0.500000 0.500000 0.000000 1214 | vt 0.500000 0.250000 0.000000 1215 | vt 0.500000 0.000000 0.000000 1216 | vt 0.375000 1.000000 0.000000 1217 | vt 0.375000 0.750000 0.000000 1218 | vt 0.375000 0.500000 0.000000 1219 | vt 0.375000 0.250000 0.000000 1220 | vt 0.375000 0.000000 0.000000 1221 | vt 0.250000 1.000000 0.000000 1222 | vt 0.250000 0.750000 0.000000 1223 | vt 0.250000 0.500000 0.000000 1224 | vt 0.250000 0.250000 0.000000 1225 | vt 0.250000 0.000000 0.000000 1226 | vt 0.125000 1.000000 0.000000 1227 | vt 0.125000 0.750000 0.000000 1228 | vt 0.125000 0.500000 0.000000 1229 | vt 0.125000 0.250000 0.000000 1230 | vt 0.125000 0.000000 0.000000 1231 | vt 0.000000 1.000000 0.000000 1232 | vt 0.000000 0.750000 0.000000 1233 | vt 0.000000 0.500000 0.000000 1234 | vt 0.000000 0.250000 0.000000 1235 | vt 0.000000 0.000000 0.000000 1236 | vt 1.000000 1.000000 0.000000 1237 | vt 1.000000 0.750000 0.000000 1238 | vt 1.000000 0.500000 0.000000 1239 | vt 1.000000 0.250000 0.000000 1240 | vt 1.000000 0.000000 0.000000 1241 | vt 0.875000 1.000000 0.000000 1242 | vt 0.875000 0.750000 0.000000 1243 | vt 0.875000 0.500000 0.000000 1244 | vt 0.875000 0.250000 0.000000 1245 | vt 0.875000 0.000000 0.000000 1246 | vt 0.750000 1.000000 0.000000 1247 | vt 0.750000 0.750000 0.000000 1248 | vt 0.750000 0.500000 0.000000 1249 | vt 0.750000 0.250000 0.000000 1250 | vt 0.750000 0.000000 0.000000 1251 | vt 0.625000 1.000000 0.000000 1252 | vt 0.625000 0.750000 0.000000 1253 | vt 0.625000 0.500000 0.000000 1254 | vt 0.625000 0.250000 0.000000 1255 | vt 0.625000 0.000000 0.000000 1256 | vt 0.500000 1.000000 0.000000 1257 | vt 0.500000 0.750000 0.000000 1258 | vt 0.500000 0.500000 0.000000 1259 | vt 0.500000 0.250000 0.000000 1260 | vt 0.500000 0.000000 0.000000 1261 | vt 0.500000 1.000000 0.000000 1262 | vt 0.500000 0.750000 0.000000 1263 | vt 0.500000 0.500000 0.000000 1264 | vt 0.500000 0.250000 0.000000 1265 | vt 0.500000 0.000000 0.000000 1266 | vt 0.375000 1.000000 0.000000 1267 | vt 0.375000 0.750000 0.000000 1268 | vt 0.375000 0.500000 0.000000 1269 | vt 0.375000 0.250000 0.000000 1270 | vt 0.375000 0.000000 0.000000 1271 | vt 0.250000 1.000000 0.000000 1272 | vt 0.250000 0.750000 0.000000 1273 | vt 0.250000 0.500000 0.000000 1274 | vt 0.250000 0.250000 0.000000 1275 | vt 0.250000 0.000000 0.000000 1276 | vt 0.125000 1.000000 0.000000 1277 | vt 0.125000 0.750000 0.000000 1278 | vt 0.125000 0.500000 0.000000 1279 | vt 0.125000 0.250000 0.000000 1280 | vt 0.125000 0.000000 0.000000 1281 | vt 0.000000 1.000000 0.000000 1282 | vt 0.000000 0.750000 0.000000 1283 | vt 0.000000 0.500000 0.000000 1284 | vt 0.000000 0.250000 0.000000 1285 | vt 0.000000 0.000000 0.000000 1286 | vt 1.000000 1.000000 0.000000 1287 | vt 1.000000 0.750000 0.000000 1288 | vt 1.000000 0.500000 0.000000 1289 | vt 1.000000 0.250000 0.000000 1290 | vt 1.000000 0.000000 0.000000 1291 | vt 0.875000 1.000000 0.000000 1292 | vt 0.875000 0.750000 0.000000 1293 | vt 0.875000 0.500000 0.000000 1294 | vt 0.875000 0.250000 0.000000 1295 | vt 0.875000 0.000000 0.000000 1296 | vt 0.750000 1.000000 0.000000 1297 | vt 0.750000 0.750000 0.000000 1298 | vt 0.750000 0.500000 0.000000 1299 | vt 0.750000 0.250000 0.000000 1300 | vt 0.750000 0.000000 0.000000 1301 | vt 0.625000 1.000000 0.000000 1302 | vt 0.625000 0.750000 0.000000 1303 | vt 0.625000 0.500000 0.000000 1304 | vt 0.625000 0.250000 0.000000 1305 | vt 0.625000 0.000000 0.000000 1306 | vt 0.500000 1.000000 0.000000 1307 | vt 0.500000 0.750000 0.000000 1308 | vt 0.500000 0.500000 0.000000 1309 | vt 0.500000 0.250000 0.000000 1310 | vt 0.500000 0.000000 0.000000 1311 | vt 0.500000 1.000000 0.000000 1312 | vt 0.500000 0.750000 0.000000 1313 | vt 0.500000 0.500000 0.000000 1314 | vt 0.500000 0.250000 0.000000 1315 | vt 0.500000 0.000000 0.000000 1316 | vt 0.375000 1.000000 0.000000 1317 | vt 0.375000 0.750000 0.000000 1318 | vt 0.375000 0.500000 0.000000 1319 | vt 0.375000 0.250000 0.000000 1320 | vt 0.375000 0.000000 0.000000 1321 | vt 0.250000 1.000000 0.000000 1322 | vt 0.250000 0.750000 0.000000 1323 | vt 0.250000 0.500000 0.000000 1324 | vt 0.250000 0.250000 0.000000 1325 | vt 0.250000 0.000000 0.000000 1326 | vt 0.125000 1.000000 0.000000 1327 | vt 0.125000 0.750000 0.000000 1328 | vt 0.125000 0.500000 0.000000 1329 | vt 0.125000 0.250000 0.000000 1330 | vt 0.125000 0.000000 0.000000 1331 | vt 0.000000 1.000000 0.000000 1332 | vt 0.000000 0.750000 0.000000 1333 | vt 0.000000 0.500000 0.000000 1334 | vt 0.000000 0.250000 0.000000 1335 | vt 0.000000 0.000000 0.000000 1336 | # 800 texture vertices 1337 | 1338 | vn -0.966742 -0.255752 0.000000 1339 | vn -0.966824 0.255443 0.000000 1340 | vn -0.092052 0.995754 0.000000 1341 | vn 0.682050 0.731305 0.000000 1342 | vn 0.870301 0.492521 0.000000 1343 | vn -0.893014 -0.256345 -0.369882 1344 | vn -0.893437 0.255996 -0.369102 1345 | vn -0.083877 0.995843 -0.035507 1346 | vn 0.629724 0.731860 0.260439 1347 | vn 0.803725 0.493370 0.332584 1348 | vn -0.683407 -0.256728 -0.683407 1349 | vn -0.683531 0.256068 -0.683531 1350 | vn -0.064925 0.995776 -0.064925 1351 | vn 0.481399 0.732469 0.481399 1352 | vn 0.614804 0.493997 0.614804 1353 | vn -0.369882 -0.256345 -0.893014 1354 | vn -0.369102 0.255996 -0.893437 1355 | vn -0.035507 0.995843 -0.083877 1356 | vn 0.260439 0.731860 0.629724 1357 | vn 0.332584 0.493369 0.803725 1358 | vn -0.002848 -0.257863 -0.966177 1359 | vn -0.001923 0.254736 -0.967009 1360 | vn -0.000266 0.995734 -0.092270 1361 | vn 0.000024 0.731295 0.682061 1362 | vn -0.000000 0.492521 0.870301 1363 | vn 0.379058 -0.359300 -0.852771 1364 | vn 0.377110 0.149085 -0.914091 1365 | vn 0.027502 0.992081 -0.122552 1366 | vn -0.261010 0.726762 0.635367 1367 | vn -0.332485 0.492546 0.804271 1368 | vn 0.663548 -0.410790 -0.625264 1369 | vn 0.712664 0.073722 -0.697621 1370 | vn 0.099726 0.987509 -0.121983 1371 | vn -0.487320 0.723754 0.488569 1372 | vn -0.615242 0.492602 0.615484 1373 | vn 0.880028 -0.332906 -0.338709 1374 | vn 0.917276 0.167113 -0.361493 1375 | vn 0.113584 0.992365 -0.048070 1376 | vn -0.634150 0.727508 0.261889 1377 | vn -0.804126 0.492634 0.332705 1378 | vn 0.966690 -0.255738 0.010454 1379 | vn 0.967442 0.252962 0.008103 1380 | vn 0.093436 0.995624 0.001281 1381 | vn -0.682167 0.731196 -0.000343 1382 | vn -0.870322 0.492483 -0.000054 1383 | vn 0.893014 -0.256345 0.369882 1384 | vn 0.893437 0.255996 0.369102 1385 | vn 0.083877 0.995843 0.035507 1386 | vn -0.629724 0.731860 -0.260439 1387 | vn -0.803725 0.493370 -0.332584 1388 | vn 0.683407 -0.256728 0.683407 1389 | vn 0.683531 0.256068 0.683531 1390 | vn 0.064925 0.995776 0.064925 1391 | vn -0.481399 0.732469 -0.481399 1392 | vn -0.614804 0.493997 -0.614804 1393 | vn 0.369882 -0.256345 0.893014 1394 | vn 0.369102 0.255996 0.893437 1395 | vn 0.035507 0.995843 0.083877 1396 | vn -0.260439 0.731860 -0.629724 1397 | vn -0.332584 0.493369 -0.803725 1398 | vn 0.000000 -0.255752 0.966742 1399 | vn 0.000000 0.255443 0.966824 1400 | vn 0.000000 0.995754 0.092052 1401 | vn 0.000000 0.731305 -0.682050 1402 | vn 0.000000 0.492521 -0.870301 1403 | vn -0.369882 -0.256345 0.893014 1404 | vn -0.369102 0.255996 0.893437 1405 | vn -0.035507 0.995843 0.083877 1406 | vn 0.260439 0.731860 -0.629724 1407 | vn 0.332584 0.493370 -0.803725 1408 | vn -0.683407 -0.256728 0.683407 1409 | vn -0.683531 0.256068 0.683531 1410 | vn -0.064925 0.995776 0.064925 1411 | vn 0.481399 0.732469 -0.481399 1412 | vn 0.614804 0.493997 -0.614804 1413 | vn -0.893014 -0.256345 0.369882 1414 | vn -0.893437 0.255996 0.369102 1415 | vn -0.083877 0.995843 0.035507 1416 | vn 0.629724 0.731860 -0.260439 1417 | vn 0.803725 0.493369 -0.332584 1418 | vn 0.915321 0.402725 -0.000000 1419 | vn 0.941808 0.336151 0.000000 1420 | vn 0.978690 0.205342 0.000000 1421 | vn 0.997804 -0.066240 -0.000000 1422 | vn 0.845438 0.403546 0.349835 1423 | vn 0.869996 0.336859 0.360047 1424 | vn 0.904193 0.205791 0.374280 1425 | vn 0.921879 -0.066370 0.381752 1426 | vn 0.646802 0.404096 0.646802 1427 | vn 0.665655 0.337351 0.665655 1428 | vn 0.691923 0.206120 0.691923 1429 | vn 0.705543 -0.066480 0.705542 1430 | vn 0.349835 0.403546 0.845438 1431 | vn 0.360047 0.336859 0.869996 1432 | vn 0.374280 0.205791 0.904193 1433 | vn 0.381752 -0.066369 0.921879 1434 | vn 0.000000 0.402725 0.915321 1435 | vn -0.000000 0.336151 0.941808 1436 | vn 0.000000 0.205342 0.978690 1437 | vn 0.000000 -0.066240 0.997804 1438 | vn -0.349835 0.403546 0.845438 1439 | vn -0.360047 0.336859 0.869996 1440 | vn -0.374280 0.205791 0.904193 1441 | vn -0.381752 -0.066370 0.921879 1442 | vn -0.646802 0.404096 0.646802 1443 | vn -0.665655 0.337351 0.665655 1444 | vn -0.691923 0.206120 0.691923 1445 | vn -0.705542 -0.066480 0.705543 1446 | vn -0.845438 0.403546 0.349835 1447 | vn -0.869996 0.336859 0.360047 1448 | vn -0.904193 0.205791 0.374280 1449 | vn -0.921879 -0.066369 0.381752 1450 | vn -0.915321 0.402725 0.000000 1451 | vn -0.941808 0.336151 -0.000000 1452 | vn -0.978690 0.205342 0.000000 1453 | vn -0.997804 -0.066240 0.000000 1454 | vn -0.845438 0.403546 -0.349835 1455 | vn -0.869996 0.336859 -0.360047 1456 | vn -0.904193 0.205791 -0.374280 1457 | vn -0.921879 -0.066370 -0.381752 1458 | vn -0.646802 0.404096 -0.646802 1459 | vn -0.665655 0.337351 -0.665655 1460 | vn -0.691923 0.206120 -0.691923 1461 | vn -0.705543 -0.066480 -0.705542 1462 | vn -0.349835 0.403546 -0.845438 1463 | vn -0.360047 0.336859 -0.869996 1464 | vn -0.374280 0.205791 -0.904193 1465 | vn -0.381752 -0.066369 -0.921879 1466 | vn -0.000000 0.402725 -0.915321 1467 | vn 0.000000 0.336151 -0.941808 1468 | vn -0.000000 0.205342 -0.978690 1469 | vn -0.000000 -0.066240 -0.997804 1470 | vn 0.349835 0.403546 -0.845438 1471 | vn 0.360047 0.336859 -0.869996 1472 | vn 0.374280 0.205791 -0.904193 1473 | vn 0.381752 -0.066370 -0.921879 1474 | vn 0.646802 0.404096 -0.646802 1475 | vn 0.665655 0.337351 -0.665655 1476 | vn 0.691923 0.206120 -0.691923 1477 | vn 0.705542 -0.066480 -0.705543 1478 | vn 0.845438 0.403546 -0.349835 1479 | vn 0.869996 0.336859 -0.360047 1480 | vn 0.904193 0.205791 -0.374280 1481 | vn 0.921879 -0.066369 -0.381752 1482 | vn 0.900182 -0.435513 0.000000 1483 | vn 0.729611 -0.683863 0.000000 1484 | vn 0.693951 -0.720022 -0.000000 1485 | vn 0.793950 -0.607983 0.000000 1486 | vn 0.831437 -0.436180 0.344179 1487 | vn 0.673512 -0.684666 0.278594 1488 | vn 0.640399 -0.720924 0.264874 1489 | vn 0.732949 -0.608995 0.303167 1490 | vn 0.636092 -0.436778 0.636092 1491 | vn 0.514965 -0.685290 0.514965 1492 | vn 0.489651 -0.721446 0.489651 1493 | vn 0.560555 -0.609554 0.560555 1494 | vn 0.344179 -0.436180 0.831437 1495 | vn 0.278595 -0.684666 0.673512 1496 | vn 0.264874 -0.720924 0.640399 1497 | vn 0.303167 -0.608995 0.732949 1498 | vn -0.000000 -0.435513 0.900182 1499 | vn -0.000000 -0.683863 0.729611 1500 | vn 0.000000 -0.720022 0.693951 1501 | vn -0.000000 -0.607983 0.793950 1502 | vn -0.344179 -0.436180 0.831437 1503 | vn -0.278594 -0.684666 0.673512 1504 | vn -0.264874 -0.720924 0.640399 1505 | vn -0.303167 -0.608995 0.732949 1506 | vn -0.636092 -0.436778 0.636092 1507 | vn -0.514965 -0.685290 0.514965 1508 | vn -0.489651 -0.721446 0.489651 1509 | vn -0.560555 -0.609554 0.560555 1510 | vn -0.831437 -0.436180 0.344179 1511 | vn -0.673512 -0.684666 0.278595 1512 | vn -0.640399 -0.720924 0.264874 1513 | vn -0.732949 -0.608995 0.303167 1514 | vn -0.900182 -0.435513 -0.000000 1515 | vn -0.729611 -0.683863 -0.000000 1516 | vn -0.693951 -0.720022 0.000000 1517 | vn -0.793950 -0.607983 -0.000000 1518 | vn -0.831437 -0.436180 -0.344179 1519 | vn -0.673512 -0.684666 -0.278594 1520 | vn -0.640399 -0.720924 -0.264874 1521 | vn -0.732949 -0.608995 -0.303167 1522 | vn -0.636092 -0.436778 -0.636092 1523 | vn -0.514965 -0.685290 -0.514965 1524 | vn -0.489651 -0.721446 -0.489651 1525 | vn -0.560555 -0.609554 -0.560555 1526 | vn -0.344179 -0.436180 -0.831437 1527 | vn -0.278595 -0.684666 -0.673512 1528 | vn -0.264874 -0.720924 -0.640399 1529 | vn -0.303167 -0.608995 -0.732949 1530 | vn 0.000000 -0.435513 -0.900182 1531 | vn 0.000000 -0.683863 -0.729611 1532 | vn -0.000000 -0.720022 -0.693951 1533 | vn 0.000000 -0.607983 -0.793950 1534 | vn 0.344179 -0.436180 -0.831437 1535 | vn 0.278594 -0.684666 -0.673512 1536 | vn 0.264874 -0.720924 -0.640399 1537 | vn 0.303167 -0.608995 -0.732949 1538 | vn 0.636092 -0.436778 -0.636092 1539 | vn 0.514965 -0.685290 -0.514965 1540 | vn 0.489651 -0.721446 -0.489651 1541 | vn 0.560555 -0.609554 -0.560555 1542 | vn 0.831437 -0.436180 -0.344179 1543 | vn 0.673512 -0.684666 -0.278595 1544 | vn 0.640399 -0.720924 -0.264874 1545 | vn 0.732949 -0.608995 -0.303167 1546 | vn 0.623860 -0.781536 0.000000 1547 | vn 0.177291 -0.984159 -0.000000 1548 | vn 0.049207 -0.998789 0.000000 1549 | vn 0.000000 -1.000000 0.000000 1550 | vn 0.576230 -0.781801 0.238217 1551 | vn 0.163628 -0.984208 0.067527 1552 | vn 0.045422 -0.998792 0.018736 1553 | vn 0.440416 -0.782348 0.440416 1554 | vn 0.124903 -0.984276 0.124903 1555 | vn 0.034662 -0.998798 0.034662 1556 | vn 0.238217 -0.781801 0.576230 1557 | vn 0.067527 -0.984208 0.163628 1558 | vn 0.018736 -0.998792 0.045422 1559 | vn -0.000000 -0.781536 0.623860 1560 | vn 0.000000 -0.984159 0.177291 1561 | vn -0.000000 -0.998789 0.049207 1562 | vn -0.238217 -0.781801 0.576230 1563 | vn -0.067527 -0.984208 0.163628 1564 | vn -0.018736 -0.998792 0.045422 1565 | vn -0.440416 -0.782348 0.440416 1566 | vn -0.124903 -0.984276 0.124903 1567 | vn -0.034662 -0.998798 0.034662 1568 | vn -0.576230 -0.781801 0.238217 1569 | vn -0.163628 -0.984208 0.067527 1570 | vn -0.045422 -0.998792 0.018736 1571 | vn -0.623860 -0.781536 -0.000000 1572 | vn -0.177291 -0.984159 0.000000 1573 | vn -0.049207 -0.998789 -0.000000 1574 | vn -0.576230 -0.781801 -0.238217 1575 | vn -0.163628 -0.984208 -0.067527 1576 | vn -0.045422 -0.998792 -0.018736 1577 | vn -0.440416 -0.782348 -0.440416 1578 | vn -0.124903 -0.984276 -0.124903 1579 | vn -0.034662 -0.998798 -0.034662 1580 | vn -0.238217 -0.781801 -0.576230 1581 | vn -0.067527 -0.984208 -0.163628 1582 | vn -0.018736 -0.998792 -0.045422 1583 | vn 0.000000 -0.781536 -0.623860 1584 | vn -0.000000 -0.984159 -0.177291 1585 | vn 0.000000 -0.998789 -0.049207 1586 | vn 0.238217 -0.781801 -0.576230 1587 | vn 0.067527 -0.984208 -0.163628 1588 | vn 0.018736 -0.998792 -0.045422 1589 | vn 0.440416 -0.782348 -0.440416 1590 | vn 0.124903 -0.984276 -0.124903 1591 | vn 0.034662 -0.998798 -0.034662 1592 | vn 0.576230 -0.781801 -0.238217 1593 | vn 0.163628 -0.984208 -0.067527 1594 | vn 0.045422 -0.998792 -0.018736 1595 | vn 0.007786 -0.999970 -0.000216 1596 | vn 0.039138 -0.999233 -0.000989 1597 | vn 0.179512 -0.983746 -0.004369 1598 | vn 0.612299 -0.790557 -0.010460 1599 | vn 0.986152 -0.165708 -0.006670 1600 | vn 0.007039 -0.812495 0.582926 1601 | vn 0.036127 -0.837257 0.545614 1602 | vn 0.161846 -0.810421 0.563048 1603 | vn 0.482365 -0.595148 0.642746 1604 | vn 0.738720 -0.114594 0.664199 1605 | vn -0.001909 0.162121 0.986769 1606 | vn 0.002762 0.017107 0.999850 1607 | vn 0.010533 0.073398 0.997247 1608 | vn -0.066041 0.130070 0.989303 1609 | vn -0.094427 0.016594 0.995393 1610 | vn -0.009203 0.871509 0.490293 1611 | vn -0.048606 0.840609 0.539457 1612 | vn -0.223298 0.802880 0.552739 1613 | vn -0.596365 0.559971 0.575135 1614 | vn -0.803337 0.068236 0.591603 1615 | vn -0.010561 0.999944 0.000103 1616 | vn -0.058798 0.998270 0.000710 1617 | vn -0.280710 0.959787 0.003269 1618 | vn -0.749723 0.661738 0.004268 1619 | vn -0.997351 0.072714 0.002059 1620 | vn -0.008792 0.871493 -0.490330 1621 | vn -0.046494 0.841178 -0.538756 1622 | vn -0.217909 0.806807 -0.549161 1623 | vn -0.597291 0.560026 -0.574121 1624 | vn -0.804000 0.062913 -0.591292 1625 | vn -0.001806 0.161691 -0.986840 1626 | vn 0.002031 0.014555 -0.999892 1627 | vn 0.009215 0.060069 -0.998152 1628 | vn -0.059334 0.113865 -0.991723 1629 | vn -0.086899 0.012290 -0.996141 1630 | vn 0.006418 -0.812379 -0.583095 1631 | vn 0.033783 -0.837512 -0.545373 1632 | vn 0.157113 -0.811947 -0.562190 1633 | vn 0.484406 -0.589366 -0.646528 1634 | vn 0.738870 -0.101320 -0.666187 1635 | vn 0.946512 0.322650 -0.003357 1636 | vn 0.825830 0.563870 -0.007452 1637 | vn 0.650011 0.759893 -0.006937 1638 | vn 0.532429 0.846459 -0.005245 1639 | vn 0.725608 0.259351 0.637361 1640 | vn 0.645945 0.461988 0.607719 1641 | vn 0.531615 0.636660 0.558614 1642 | vn 0.424964 0.681717 0.595540 1643 | vn -0.049562 -0.019755 0.998576 1644 | vn -0.037816 -0.035624 0.998650 1645 | vn -0.037914 -0.036512 0.998614 1646 | vn -0.168854 -0.297945 0.939530 1647 | vn -0.742342 -0.299166 0.599523 1648 | vn -0.619602 -0.529406 0.579502 1649 | vn -0.483708 -0.685760 0.543837 1650 | vn -0.445293 -0.794355 0.413177 1651 | vn -0.926513 -0.376258 0.001996 1652 | vn -0.753920 -0.656952 0.004317 1653 | vn -0.566224 -0.824244 0.003461 1654 | vn -0.481804 -0.876277 0.001850 1655 | vn -0.744675 -0.294425 -0.598977 1656 | vn -0.621949 -0.528114 -0.578165 1657 | vn -0.481171 -0.688340 -0.542828 1658 | vn -0.438055 -0.797035 -0.415744 1659 | vn -0.044337 -0.017056 -0.998871 1660 | vn -0.026176 -0.028166 -0.999260 1661 | vn -0.025294 -0.028332 -0.999278 1662 | vn -0.157482 -0.289392 -0.944167 1663 | vn 0.728244 0.252410 -0.637142 1664 | vn 0.647055 0.459725 -0.608254 1665 | vn 0.522994 0.640657 -0.562170 1666 | vn 0.409978 0.682857 -0.604669 1667 | vn -0.230787 0.972982 -0.006523 1668 | vn -0.548936 0.835863 -0.001511 1669 | vn -0.875671 0.482806 0.009893 1670 | vn -0.877554 0.479097 0.019092 1671 | vn -0.696190 0.717439 0.024497 1672 | vn -0.152877 0.687211 0.710190 1673 | vn -0.316721 0.637750 0.702113 1674 | vn -0.601067 0.471452 0.645330 1675 | vn -0.635889 0.446090 0.629801 1676 | vn -0.435746 0.601008 0.670011 1677 | vn 0.111113 -0.085070 0.990160 1678 | vn 0.223310 0.006540 0.974726 1679 | vn 0.190097 0.154964 0.969458 1680 | vn 0.005271 0.189482 0.981870 1681 | vn -0.011752 0.246688 0.969024 1682 | vn 0.343906 -0.722796 0.599412 1683 | vn 0.572489 -0.567656 0.591627 1684 | vn 0.787436 -0.256459 0.560512 1685 | vn 0.647097 -0.306374 0.698141 1686 | vn 0.427528 -0.499343 0.753576 1687 | vn 0.410926 -0.911668 0.001284 1688 | vn 0.671520 -0.740986 -0.000899 1689 | vn 0.922026 -0.387060 -0.007253 1690 | vn 0.846910 -0.531556 -0.013854 1691 | vn 0.535924 -0.844201 -0.010505 1692 | vn 0.341188 -0.722823 -0.600931 1693 | vn 0.578664 -0.561139 -0.591838 1694 | vn 0.784869 -0.251020 -0.566542 1695 | vn 0.642681 -0.302257 -0.703990 1696 | vn 0.418589 -0.500042 -0.758117 1697 | vn 0.115806 -0.079139 -0.990114 1698 | vn 0.232811 0.012565 -0.972441 1699 | vn 0.206662 0.153601 -0.966280 1700 | vn 0.024500 0.161443 -0.986578 1701 | vn 0.003382 0.211115 -0.977455 1702 | vn -0.134912 0.687491 -0.713551 1703 | vn -0.319540 0.633073 -0.705063 1704 | vn -0.603902 0.461442 -0.649903 1705 | vn -0.631815 0.437169 -0.640072 1706 | vn -0.424306 0.612706 -0.666750 1707 | vn -0.425801 0.904753 0.010805 1708 | vn 0.022046 0.999756 0.001623 1709 | vn 0.999598 0.025875 0.011556 1710 | vn 0.709587 -0.704552 0.009672 1711 | vn -0.259858 0.791937 0.552548 1712 | vn 0.009539 0.999720 -0.021674 1713 | vn 0.410157 0.332912 -0.849082 1714 | vn 0.541523 -0.548619 -0.637001 1715 | vn 0.046311 0.455223 0.889172 1716 | vn -0.010688 0.988794 0.148900 1717 | vn -0.044376 0.682946 -0.729120 1718 | vn 0.122824 0.009233 -0.992385 1719 | vn 0.481839 -0.180440 0.857480 1720 | vn 0.455272 0.736752 0.499925 1721 | vn -0.220542 0.907193 -0.358277 1722 | vn -0.235919 0.657250 -0.715797 1723 | vn 0.728094 -0.685300 -0.015585 1724 | vn 0.888738 0.458112 -0.016679 1725 | vn -0.260098 0.965582 0.000800 1726 | vn -0.371611 0.928378 -0.004418 1727 | vn 0.480165 -0.178362 -0.858853 1728 | vn 0.488102 0.716802 -0.497947 1729 | vn -0.222004 0.905399 0.361892 1730 | vn -0.235405 0.663180 0.710477 1731 | vn 0.058720 0.437702 -0.897200 1732 | vn 0.001326 0.986459 -0.164002 1733 | vn -0.044190 0.681675 0.730319 1734 | vn 0.138801 -0.034188 0.989730 1735 | vn -0.258890 0.797206 -0.545380 1736 | vn 0.012270 0.999739 0.019287 1737 | vn 0.398632 0.354890 0.845663 1738 | vn 0.537564 -0.581398 0.610738 1739 | vn 0.000000 1.000000 0.000000 1740 | vn 0.824540 0.565804 0.000017 1741 | vn 0.917701 -0.397272 0.000034 1742 | vn 0.935269 -0.353939 0.000113 1743 | vn 0.780712 0.624890 0.000075 1744 | vn 0.762640 0.565035 0.314825 1745 | vn 0.847982 -0.397998 0.350034 1746 | vn 0.864141 -0.355261 0.356441 1747 | vn 0.720992 0.625625 0.297933 1748 | vn 0.583357 0.565165 0.583338 1749 | vn 0.648485 -0.398726 0.648448 1750 | vn 0.660872 -0.355894 0.660748 1751 | vn 0.551862 0.625290 0.551780 1752 | vn 0.314824 0.565051 0.762629 1753 | vn 0.350045 -0.397976 0.847988 1754 | vn 0.356474 -0.355199 0.864153 1755 | vn 0.297983 0.625515 0.721067 1756 | vn -0.000017 0.565804 0.824540 1757 | vn -0.000034 -0.397272 0.917701 1758 | vn -0.000113 -0.353939 0.935269 1759 | vn -0.000075 0.624890 0.780712 1760 | vn -0.314825 0.565035 0.762640 1761 | vn -0.350034 -0.397998 0.847982 1762 | vn -0.356441 -0.355261 0.864141 1763 | vn -0.297933 0.625625 0.720992 1764 | vn -0.583338 0.565165 0.583357 1765 | vn -0.648448 -0.398726 0.648485 1766 | vn -0.660748 -0.355894 0.660872 1767 | vn -0.551780 0.625290 0.551862 1768 | vn -0.762629 0.565051 0.314824 1769 | vn -0.847988 -0.397976 0.350045 1770 | vn -0.864153 -0.355199 0.356474 1771 | vn -0.721067 0.625515 0.297983 1772 | vn -0.824540 0.565804 -0.000017 1773 | vn -0.917701 -0.397272 -0.000034 1774 | vn -0.935269 -0.353939 -0.000113 1775 | vn -0.780712 0.624890 -0.000075 1776 | vn -0.762640 0.565035 -0.314825 1777 | vn -0.847982 -0.397998 -0.350034 1778 | vn -0.864141 -0.355261 -0.356441 1779 | vn -0.720992 0.625625 -0.297933 1780 | vn -0.583357 0.565165 -0.583338 1781 | vn -0.648485 -0.398726 -0.648448 1782 | vn -0.660872 -0.355894 -0.660748 1783 | vn -0.551862 0.625290 -0.551780 1784 | vn -0.314824 0.565051 -0.762629 1785 | vn -0.350045 -0.397976 -0.847988 1786 | vn -0.356474 -0.355199 -0.864153 1787 | vn -0.297983 0.625515 -0.721067 1788 | vn 0.000017 0.565804 -0.824540 1789 | vn 0.000034 -0.397272 -0.917701 1790 | vn 0.000113 -0.353939 -0.935269 1791 | vn 0.000075 0.624890 -0.780712 1792 | vn 0.314825 0.565035 -0.762640 1793 | vn 0.350034 -0.397998 -0.847982 1794 | vn 0.356441 -0.355261 -0.864141 1795 | vn 0.297933 0.625625 -0.720992 1796 | vn 0.583338 0.565165 -0.583357 1797 | vn 0.648448 -0.398726 -0.648485 1798 | vn 0.660748 -0.355894 -0.660872 1799 | vn 0.551780 0.625290 -0.551862 1800 | vn 0.762629 0.565051 -0.314824 1801 | vn 0.847988 -0.397976 -0.350045 1802 | vn 0.864153 -0.355199 -0.356474 1803 | vn 0.721067 0.625515 -0.297983 1804 | vn 0.236583 0.971611 -0.000000 1805 | vn 0.173084 0.984907 -0.000000 1806 | vn 0.379703 0.925108 -0.000000 1807 | vn 0.526673 0.850068 0.000000 1808 | vn 0.217978 0.971775 0.090216 1809 | vn 0.159589 0.984977 0.065961 1810 | vn 0.350498 0.925311 0.144740 1811 | vn 0.485590 0.850653 0.201474 1812 | vn 0.166631 0.971838 0.166631 1813 | vn 0.121908 0.985026 0.121908 1814 | vn 0.267668 0.925585 0.267668 1815 | vn 0.371315 0.851029 0.371315 1816 | vn 0.090216 0.971775 0.217978 1817 | vn 0.065961 0.984977 0.159589 1818 | vn 0.144740 0.925311 0.350498 1819 | vn 0.201475 0.850653 0.485590 1820 | vn 0.000000 0.971611 0.236583 1821 | vn 0.000000 0.984907 0.173084 1822 | vn 0.000000 0.925108 0.379703 1823 | vn -0.000000 0.850068 0.526673 1824 | vn -0.090216 0.971775 0.217978 1825 | vn -0.065961 0.984977 0.159589 1826 | vn -0.144740 0.925311 0.350498 1827 | vn -0.201474 0.850653 0.485590 1828 | vn -0.166631 0.971838 0.166631 1829 | vn -0.121908 0.985026 0.121908 1830 | vn -0.267668 0.925585 0.267668 1831 | vn -0.371315 0.851029 0.371315 1832 | vn -0.217978 0.971775 0.090216 1833 | vn -0.159589 0.984977 0.065961 1834 | vn -0.350498 0.925311 0.144740 1835 | vn -0.485590 0.850653 0.201475 1836 | vn -0.236583 0.971611 0.000000 1837 | vn -0.173084 0.984907 0.000000 1838 | vn -0.379703 0.925108 0.000000 1839 | vn -0.526673 0.850068 -0.000000 1840 | vn -0.217978 0.971775 -0.090216 1841 | vn -0.159589 0.984977 -0.065961 1842 | vn -0.350498 0.925311 -0.144740 1843 | vn -0.485590 0.850653 -0.201474 1844 | vn -0.166631 0.971838 -0.166631 1845 | vn -0.121908 0.985026 -0.121908 1846 | vn -0.267668 0.925585 -0.267668 1847 | vn -0.371315 0.851029 -0.371315 1848 | vn -0.090216 0.971775 -0.217978 1849 | vn -0.065961 0.984977 -0.159589 1850 | vn -0.144740 0.925311 -0.350498 1851 | vn -0.201475 0.850653 -0.485590 1852 | vn -0.000000 0.971611 -0.236583 1853 | vn -0.000000 0.984907 -0.173084 1854 | vn -0.000000 0.925108 -0.379703 1855 | vn 0.000000 0.850068 -0.526673 1856 | vn 0.090216 0.971775 -0.217978 1857 | vn 0.065961 0.984977 -0.159589 1858 | vn 0.144740 0.925311 -0.350498 1859 | vn 0.201474 0.850653 -0.485590 1860 | vn 0.166631 0.971838 -0.166631 1861 | vn 0.121908 0.985026 -0.121908 1862 | vn 0.267668 0.925585 -0.267668 1863 | vn 0.371315 0.851029 -0.371315 1864 | vn 0.217978 0.971775 -0.090216 1865 | vn 0.159589 0.984977 -0.065961 1866 | vn 0.350498 0.925311 -0.144740 1867 | vn 0.485590 0.850653 -0.201475 1868 | # 530 vertex normals 1869 | 1870 | g Teapot01 1871 | f 1/1/1 6/6/6 7/7/7 1872 | f 7/7/7 2/2/2 1/1/1 1873 | f 2/2/2 7/7/7 8/8/8 1874 | f 8/8/8 3/3/3 2/2/2 1875 | f 3/3/3 8/8/8 9/9/9 1876 | f 9/9/9 4/4/4 3/3/3 1877 | f 4/4/4 9/9/9 10/10/10 1878 | f 10/10/10 5/5/5 4/4/4 1879 | f 6/6/6 11/11/11 12/12/12 1880 | f 12/12/12 7/7/7 6/6/6 1881 | f 7/7/7 12/12/12 13/13/13 1882 | f 13/13/13 8/8/8 7/7/7 1883 | f 8/8/8 13/13/13 14/14/14 1884 | f 14/14/14 9/9/9 8/8/8 1885 | f 9/9/9 14/14/14 15/15/15 1886 | f 15/15/15 10/10/10 9/9/9 1887 | f 11/11/11 16/16/16 17/17/17 1888 | f 17/17/17 12/12/12 11/11/11 1889 | f 12/12/12 17/17/17 18/18/18 1890 | f 18/18/18 13/13/13 12/12/12 1891 | f 13/13/13 18/18/18 19/19/19 1892 | f 19/19/19 14/14/14 13/13/13 1893 | f 14/14/14 19/19/19 20/20/20 1894 | f 20/20/20 15/15/15 14/14/14 1895 | f 16/16/16 21/21/21 22/22/22 1896 | f 22/22/22 17/17/17 16/16/16 1897 | f 17/17/17 22/22/22 23/23/23 1898 | f 23/23/23 18/18/18 17/17/17 1899 | f 18/18/18 23/23/23 24/24/24 1900 | f 24/24/24 19/19/19 18/18/18 1901 | f 19/19/19 24/24/24 25/25/25 1902 | f 25/25/25 20/20/20 19/19/19 1903 | f 21/26/21 26/31/26 27/32/27 1904 | f 27/32/27 22/27/22 21/26/21 1905 | f 22/27/22 27/32/27 28/33/28 1906 | f 28/33/28 23/28/23 22/27/22 1907 | f 23/28/23 28/33/28 29/34/29 1908 | f 29/34/29 24/29/24 23/28/23 1909 | f 24/29/24 29/34/29 30/35/30 1910 | f 30/35/30 25/30/25 24/29/24 1911 | f 26/31/26 31/36/31 32/37/32 1912 | f 32/37/32 27/32/27 26/31/26 1913 | f 27/32/27 32/37/32 33/38/33 1914 | f 33/38/33 28/33/28 27/32/27 1915 | f 28/33/28 33/38/33 34/39/34 1916 | f 34/39/34 29/34/29 28/33/28 1917 | f 29/34/29 34/39/34 35/40/35 1918 | f 35/40/35 30/35/30 29/34/29 1919 | f 31/36/31 36/41/36 37/42/37 1920 | f 37/42/37 32/37/32 31/36/31 1921 | f 32/37/32 37/42/37 38/43/38 1922 | f 38/43/38 33/38/33 32/37/32 1923 | f 33/38/33 38/43/38 39/44/39 1924 | f 39/44/39 34/39/34 33/38/33 1925 | f 34/39/34 39/44/39 40/45/40 1926 | f 40/45/40 35/40/35 34/39/34 1927 | f 36/41/36 41/46/41 42/47/42 1928 | f 42/47/42 37/42/37 36/41/36 1929 | f 37/42/37 42/47/42 43/48/43 1930 | f 43/48/43 38/43/38 37/42/37 1931 | f 38/43/38 43/48/43 44/49/44 1932 | f 44/49/44 39/44/39 38/43/38 1933 | f 39/44/39 44/49/44 45/50/45 1934 | f 45/50/45 40/45/40 39/44/39 1935 | f 41/51/41 46/56/46 47/57/47 1936 | f 47/57/47 42/52/42 41/51/41 1937 | f 42/52/42 47/57/47 48/58/48 1938 | f 48/58/48 43/53/43 42/52/42 1939 | f 43/53/43 48/58/48 49/59/49 1940 | f 49/59/49 44/54/44 43/53/43 1941 | f 44/54/44 49/59/49 50/60/50 1942 | f 50/60/50 45/55/45 44/54/44 1943 | f 46/56/46 51/61/51 52/62/52 1944 | f 52/62/52 47/57/47 46/56/46 1945 | f 47/57/47 52/62/52 53/63/53 1946 | f 53/63/53 48/58/48 47/57/47 1947 | f 48/58/48 53/63/53 54/64/54 1948 | f 54/64/54 49/59/49 48/58/48 1949 | f 49/59/49 54/64/54 55/65/55 1950 | f 55/65/55 50/60/50 49/59/49 1951 | f 51/61/51 56/66/56 57/67/57 1952 | f 57/67/57 52/62/52 51/61/51 1953 | f 52/62/52 57/67/57 58/68/58 1954 | f 58/68/58 53/63/53 52/62/52 1955 | f 53/63/53 58/68/58 59/69/59 1956 | f 59/69/59 54/64/54 53/63/53 1957 | f 54/64/54 59/69/59 60/70/60 1958 | f 60/70/60 55/65/55 54/64/54 1959 | f 56/66/56 61/71/61 62/72/62 1960 | f 62/72/62 57/67/57 56/66/56 1961 | f 57/67/57 62/72/62 63/73/63 1962 | f 63/73/63 58/68/58 57/67/57 1963 | f 58/68/58 63/73/63 64/74/64 1964 | f 64/74/64 59/69/59 58/68/58 1965 | f 59/69/59 64/74/64 65/75/65 1966 | f 65/75/65 60/70/60 59/69/59 1967 | f 61/76/61 66/81/66 67/82/67 1968 | f 67/82/67 62/77/62 61/76/61 1969 | f 62/77/62 67/82/67 68/83/68 1970 | f 68/83/68 63/78/63 62/77/62 1971 | f 63/78/63 68/83/68 69/84/69 1972 | f 69/84/69 64/79/64 63/78/63 1973 | f 64/79/64 69/84/69 70/85/70 1974 | f 70/85/70 65/80/65 64/79/64 1975 | f 66/81/66 71/86/71 72/87/72 1976 | f 72/87/72 67/82/67 66/81/66 1977 | f 67/82/67 72/87/72 73/88/73 1978 | f 73/88/73 68/83/68 67/82/67 1979 | f 68/83/68 73/88/73 74/89/74 1980 | f 74/89/74 69/84/69 68/83/68 1981 | f 69/84/69 74/89/74 75/90/75 1982 | f 75/90/75 70/85/70 69/84/69 1983 | f 71/86/71 76/91/76 77/92/77 1984 | f 77/92/77 72/87/72 71/86/71 1985 | f 72/87/72 77/92/77 78/93/78 1986 | f 78/93/78 73/88/73 72/87/72 1987 | f 73/88/73 78/93/78 79/94/79 1988 | f 79/94/79 74/89/74 73/88/73 1989 | f 74/89/74 79/94/79 80/95/80 1990 | f 80/95/80 75/90/75 74/89/74 1991 | f 76/91/76 1/96/1 2/97/2 1992 | f 2/97/2 77/92/77 76/91/76 1993 | f 77/92/77 2/97/2 3/98/3 1994 | f 3/98/3 78/93/78 77/92/77 1995 | f 78/93/78 3/98/3 4/99/4 1996 | f 4/99/4 79/94/79 78/93/78 1997 | f 79/94/79 4/99/4 5/100/5 1998 | f 5/100/5 80/95/80 79/94/79 1999 | f 5/101/5 10/106/10 85/107/85 2000 | f 85/107/85 81/102/81 5/101/5 2001 | f 81/102/81 85/107/85 86/108/86 2002 | f 86/108/86 82/103/82 81/102/81 2003 | f 82/103/82 86/108/86 87/109/87 2004 | f 87/109/87 83/104/83 82/103/82 2005 | f 83/104/83 87/109/87 88/110/88 2006 | f 88/110/88 84/105/84 83/104/83 2007 | f 10/106/10 15/111/15 89/112/89 2008 | f 89/112/89 85/107/85 10/106/10 2009 | f 85/107/85 89/112/89 90/113/90 2010 | f 90/113/90 86/108/86 85/107/85 2011 | f 86/108/86 90/113/90 91/114/91 2012 | f 91/114/91 87/109/87 86/108/86 2013 | f 87/109/87 91/114/91 92/115/92 2014 | f 92/115/92 88/110/88 87/109/87 2015 | f 15/111/15 20/116/20 93/117/93 2016 | f 93/117/93 89/112/89 15/111/15 2017 | f 89/112/89 93/117/93 94/118/94 2018 | f 94/118/94 90/113/90 89/112/89 2019 | f 90/113/90 94/118/94 95/119/95 2020 | f 95/119/95 91/114/91 90/113/90 2021 | f 91/114/91 95/119/95 96/120/96 2022 | f 96/120/96 92/115/92 91/114/91 2023 | f 20/116/20 25/121/25 97/122/97 2024 | f 97/122/97 93/117/93 20/116/20 2025 | f 93/117/93 97/122/97 98/123/98 2026 | f 98/123/98 94/118/94 93/117/93 2027 | f 94/118/94 98/123/98 99/124/99 2028 | f 99/124/99 95/119/95 94/118/94 2029 | f 95/119/95 99/124/99 100/125/100 2030 | f 100/125/100 96/120/96 95/119/95 2031 | f 25/126/25 30/131/30 101/132/101 2032 | f 101/132/101 97/127/97 25/126/25 2033 | f 97/127/97 101/132/101 102/133/102 2034 | f 102/133/102 98/128/98 97/127/97 2035 | f 98/128/98 102/133/102 103/134/103 2036 | f 103/134/103 99/129/99 98/128/98 2037 | f 99/129/99 103/134/103 104/135/104 2038 | f 104/135/104 100/130/100 99/129/99 2039 | f 30/131/30 35/136/35 105/137/105 2040 | f 105/137/105 101/132/101 30/131/30 2041 | f 101/132/101 105/137/105 106/138/106 2042 | f 106/138/106 102/133/102 101/132/101 2043 | f 102/133/102 106/138/106 107/139/107 2044 | f 107/139/107 103/134/103 102/133/102 2045 | f 103/134/103 107/139/107 108/140/108 2046 | f 108/140/108 104/135/104 103/134/103 2047 | f 35/136/35 40/141/40 109/142/109 2048 | f 109/142/109 105/137/105 35/136/35 2049 | f 105/137/105 109/142/109 110/143/110 2050 | f 110/143/110 106/138/106 105/137/105 2051 | f 106/138/106 110/143/110 111/144/111 2052 | f 111/144/111 107/139/107 106/138/106 2053 | f 107/139/107 111/144/111 112/145/112 2054 | f 112/145/112 108/140/108 107/139/107 2055 | f 40/141/40 45/146/45 113/147/113 2056 | f 113/147/113 109/142/109 40/141/40 2057 | f 109/142/109 113/147/113 114/148/114 2058 | f 114/148/114 110/143/110 109/142/109 2059 | f 110/143/110 114/148/114 115/149/115 2060 | f 115/149/115 111/144/111 110/143/110 2061 | f 111/144/111 115/149/115 116/150/116 2062 | f 116/150/116 112/145/112 111/144/111 2063 | f 45/151/45 50/156/50 117/157/117 2064 | f 117/157/117 113/152/113 45/151/45 2065 | f 113/152/113 117/157/117 118/158/118 2066 | f 118/158/118 114/153/114 113/152/113 2067 | f 114/153/114 118/158/118 119/159/119 2068 | f 119/159/119 115/154/115 114/153/114 2069 | f 115/154/115 119/159/119 120/160/120 2070 | f 120/160/120 116/155/116 115/154/115 2071 | f 50/156/50 55/161/55 121/162/121 2072 | f 121/162/121 117/157/117 50/156/50 2073 | f 117/157/117 121/162/121 122/163/122 2074 | f 122/163/122 118/158/118 117/157/117 2075 | f 118/158/118 122/163/122 123/164/123 2076 | f 123/164/123 119/159/119 118/158/118 2077 | f 119/159/119 123/164/123 124/165/124 2078 | f 124/165/124 120/160/120 119/159/119 2079 | f 55/161/55 60/166/60 125/167/125 2080 | f 125/167/125 121/162/121 55/161/55 2081 | f 121/162/121 125/167/125 126/168/126 2082 | f 126/168/126 122/163/122 121/162/121 2083 | f 122/163/122 126/168/126 127/169/127 2084 | f 127/169/127 123/164/123 122/163/122 2085 | f 123/164/123 127/169/127 128/170/128 2086 | f 128/170/128 124/165/124 123/164/123 2087 | f 60/166/60 65/171/65 129/172/129 2088 | f 129/172/129 125/167/125 60/166/60 2089 | f 125/167/125 129/172/129 130/173/130 2090 | f 130/173/130 126/168/126 125/167/125 2091 | f 126/168/126 130/173/130 131/174/131 2092 | f 131/174/131 127/169/127 126/168/126 2093 | f 127/169/127 131/174/131 132/175/132 2094 | f 132/175/132 128/170/128 127/169/127 2095 | f 65/176/65 70/181/70 133/182/133 2096 | f 133/182/133 129/177/129 65/176/65 2097 | f 129/177/129 133/182/133 134/183/134 2098 | f 134/183/134 130/178/130 129/177/129 2099 | f 130/178/130 134/183/134 135/184/135 2100 | f 135/184/135 131/179/131 130/178/130 2101 | f 131/179/131 135/184/135 136/185/136 2102 | f 136/185/136 132/180/132 131/179/131 2103 | f 70/181/70 75/186/75 137/187/137 2104 | f 137/187/137 133/182/133 70/181/70 2105 | f 133/182/133 137/187/137 138/188/138 2106 | f 138/188/138 134/183/134 133/182/133 2107 | f 134/183/134 138/188/138 139/189/139 2108 | f 139/189/139 135/184/135 134/183/134 2109 | f 135/184/135 139/189/139 140/190/140 2110 | f 140/190/140 136/185/136 135/184/135 2111 | f 75/186/75 80/191/80 141/192/141 2112 | f 141/192/141 137/187/137 75/186/75 2113 | f 137/187/137 141/192/141 142/193/142 2114 | f 142/193/142 138/188/138 137/187/137 2115 | f 138/188/138 142/193/142 143/194/143 2116 | f 143/194/143 139/189/139 138/188/138 2117 | f 139/189/139 143/194/143 144/195/144 2118 | f 144/195/144 140/190/140 139/189/139 2119 | f 80/191/80 5/196/5 81/197/81 2120 | f 81/197/81 141/192/141 80/191/80 2121 | f 141/192/141 81/197/81 82/198/82 2122 | f 82/198/82 142/193/142 141/192/141 2123 | f 142/193/142 82/198/82 83/199/83 2124 | f 83/199/83 143/194/143 142/193/142 2125 | f 143/194/143 83/199/83 84/200/84 2126 | f 84/200/84 144/195/144 143/194/143 2127 | f 84/201/84 88/206/88 149/207/149 2128 | f 149/207/149 145/202/145 84/201/84 2129 | f 145/202/145 149/207/149 150/208/150 2130 | f 150/208/150 146/203/146 145/202/145 2131 | f 146/203/146 150/208/150 151/209/151 2132 | f 151/209/151 147/204/147 146/203/146 2133 | f 147/204/147 151/209/151 152/210/152 2134 | f 152/210/152 148/205/148 147/204/147 2135 | f 88/206/88 92/211/92 153/212/153 2136 | f 153/212/153 149/207/149 88/206/88 2137 | f 149/207/149 153/212/153 154/213/154 2138 | f 154/213/154 150/208/150 149/207/149 2139 | f 150/208/150 154/213/154 155/214/155 2140 | f 155/214/155 151/209/151 150/208/150 2141 | f 151/209/151 155/214/155 156/215/156 2142 | f 156/215/156 152/210/152 151/209/151 2143 | f 92/211/92 96/216/96 157/217/157 2144 | f 157/217/157 153/212/153 92/211/92 2145 | f 153/212/153 157/217/157 158/218/158 2146 | f 158/218/158 154/213/154 153/212/153 2147 | f 154/213/154 158/218/158 159/219/159 2148 | f 159/219/159 155/214/155 154/213/154 2149 | f 155/214/155 159/219/159 160/220/160 2150 | f 160/220/160 156/215/156 155/214/155 2151 | f 96/216/96 100/221/100 161/222/161 2152 | f 161/222/161 157/217/157 96/216/96 2153 | f 157/217/157 161/222/161 162/223/162 2154 | f 162/223/162 158/218/158 157/217/157 2155 | f 158/218/158 162/223/162 163/224/163 2156 | f 163/224/163 159/219/159 158/218/158 2157 | f 159/219/159 163/224/163 164/225/164 2158 | f 164/225/164 160/220/160 159/219/159 2159 | f 100/226/100 104/231/104 165/232/165 2160 | f 165/232/165 161/227/161 100/226/100 2161 | f 161/227/161 165/232/165 166/233/166 2162 | f 166/233/166 162/228/162 161/227/161 2163 | f 162/228/162 166/233/166 167/234/167 2164 | f 167/234/167 163/229/163 162/228/162 2165 | f 163/229/163 167/234/167 168/235/168 2166 | f 168/235/168 164/230/164 163/229/163 2167 | f 104/231/104 108/236/108 169/237/169 2168 | f 169/237/169 165/232/165 104/231/104 2169 | f 165/232/165 169/237/169 170/238/170 2170 | f 170/238/170 166/233/166 165/232/165 2171 | f 166/233/166 170/238/170 171/239/171 2172 | f 171/239/171 167/234/167 166/233/166 2173 | f 167/234/167 171/239/171 172/240/172 2174 | f 172/240/172 168/235/168 167/234/167 2175 | f 108/236/108 112/241/112 173/242/173 2176 | f 173/242/173 169/237/169 108/236/108 2177 | f 169/237/169 173/242/173 174/243/174 2178 | f 174/243/174 170/238/170 169/237/169 2179 | f 170/238/170 174/243/174 175/244/175 2180 | f 175/244/175 171/239/171 170/238/170 2181 | f 171/239/171 175/244/175 176/245/176 2182 | f 176/245/176 172/240/172 171/239/171 2183 | f 112/241/112 116/246/116 177/247/177 2184 | f 177/247/177 173/242/173 112/241/112 2185 | f 173/242/173 177/247/177 178/248/178 2186 | f 178/248/178 174/243/174 173/242/173 2187 | f 174/243/174 178/248/178 179/249/179 2188 | f 179/249/179 175/244/175 174/243/174 2189 | f 175/244/175 179/249/179 180/250/180 2190 | f 180/250/180 176/245/176 175/244/175 2191 | f 116/251/116 120/256/120 181/257/181 2192 | f 181/257/181 177/252/177 116/251/116 2193 | f 177/252/177 181/257/181 182/258/182 2194 | f 182/258/182 178/253/178 177/252/177 2195 | f 178/253/178 182/258/182 183/259/183 2196 | f 183/259/183 179/254/179 178/253/178 2197 | f 179/254/179 183/259/183 184/260/184 2198 | f 184/260/184 180/255/180 179/254/179 2199 | f 120/256/120 124/261/124 185/262/185 2200 | f 185/262/185 181/257/181 120/256/120 2201 | f 181/257/181 185/262/185 186/263/186 2202 | f 186/263/186 182/258/182 181/257/181 2203 | f 182/258/182 186/263/186 187/264/187 2204 | f 187/264/187 183/259/183 182/258/182 2205 | f 183/259/183 187/264/187 188/265/188 2206 | f 188/265/188 184/260/184 183/259/183 2207 | f 124/261/124 128/266/128 189/267/189 2208 | f 189/267/189 185/262/185 124/261/124 2209 | f 185/262/185 189/267/189 190/268/190 2210 | f 190/268/190 186/263/186 185/262/185 2211 | f 186/263/186 190/268/190 191/269/191 2212 | f 191/269/191 187/264/187 186/263/186 2213 | f 187/264/187 191/269/191 192/270/192 2214 | f 192/270/192 188/265/188 187/264/187 2215 | f 128/266/128 132/271/132 193/272/193 2216 | f 193/272/193 189/267/189 128/266/128 2217 | f 189/267/189 193/272/193 194/273/194 2218 | f 194/273/194 190/268/190 189/267/189 2219 | f 190/268/190 194/273/194 195/274/195 2220 | f 195/274/195 191/269/191 190/268/190 2221 | f 191/269/191 195/274/195 196/275/196 2222 | f 196/275/196 192/270/192 191/269/191 2223 | f 132/276/132 136/281/136 197/282/197 2224 | f 197/282/197 193/277/193 132/276/132 2225 | f 193/277/193 197/282/197 198/283/198 2226 | f 198/283/198 194/278/194 193/277/193 2227 | f 194/278/194 198/283/198 199/284/199 2228 | f 199/284/199 195/279/195 194/278/194 2229 | f 195/279/195 199/284/199 200/285/200 2230 | f 200/285/200 196/280/196 195/279/195 2231 | f 136/281/136 140/286/140 201/287/201 2232 | f 201/287/201 197/282/197 136/281/136 2233 | f 197/282/197 201/287/201 202/288/202 2234 | f 202/288/202 198/283/198 197/282/197 2235 | f 198/283/198 202/288/202 203/289/203 2236 | f 203/289/203 199/284/199 198/283/198 2237 | f 199/284/199 203/289/203 204/290/204 2238 | f 204/290/204 200/285/200 199/284/199 2239 | f 140/286/140 144/291/144 205/292/205 2240 | f 205/292/205 201/287/201 140/286/140 2241 | f 201/287/201 205/292/205 206/293/206 2242 | f 206/293/206 202/288/202 201/287/201 2243 | f 202/288/202 206/293/206 207/294/207 2244 | f 207/294/207 203/289/203 202/288/202 2245 | f 203/289/203 207/294/207 208/295/208 2246 | f 208/295/208 204/290/204 203/289/203 2247 | f 144/291/144 84/296/84 145/297/145 2248 | f 145/297/145 205/292/205 144/291/144 2249 | f 205/292/205 145/297/145 146/298/146 2250 | f 146/298/146 206/293/206 205/292/205 2251 | f 206/293/206 146/298/146 147/299/147 2252 | f 147/299/147 207/294/207 206/293/206 2253 | f 207/294/207 147/299/147 148/300/148 2254 | f 148/300/148 208/295/208 207/294/207 2255 | f 148/301/148 152/306/152 213/307/213 2256 | f 213/307/213 209/302/209 148/301/148 2257 | f 209/302/209 213/307/213 214/308/214 2258 | f 214/308/214 210/303/210 209/302/209 2259 | f 210/303/210 214/308/214 215/309/215 2260 | f 215/309/215 211/304/211 210/303/210 2261 | f 211/304/211 215/309/215 212/310/212 2262 | f 152/306/152 156/311/156 216/312/216 2263 | f 216/312/216 213/307/213 152/306/152 2264 | f 213/307/213 216/312/216 217/313/217 2265 | f 217/313/217 214/308/214 213/307/213 2266 | f 214/308/214 217/313/217 218/314/218 2267 | f 218/314/218 215/309/215 214/308/214 2268 | f 215/309/215 218/314/218 212/315/212 2269 | f 156/311/156 160/316/160 219/317/219 2270 | f 219/317/219 216/312/216 156/311/156 2271 | f 216/312/216 219/317/219 220/318/220 2272 | f 220/318/220 217/313/217 216/312/216 2273 | f 217/313/217 220/318/220 221/319/221 2274 | f 221/319/221 218/314/218 217/313/217 2275 | f 218/314/218 221/319/221 212/320/212 2276 | f 160/316/160 164/321/164 222/322/222 2277 | f 222/322/222 219/317/219 160/316/160 2278 | f 219/317/219 222/322/222 223/323/223 2279 | f 223/323/223 220/318/220 219/317/219 2280 | f 220/318/220 223/323/223 224/324/224 2281 | f 224/324/224 221/319/221 220/318/220 2282 | f 221/319/221 224/324/224 212/325/212 2283 | f 164/326/164 168/331/168 225/332/225 2284 | f 225/332/225 222/327/222 164/326/164 2285 | f 222/327/222 225/332/225 226/333/226 2286 | f 226/333/226 223/328/223 222/327/222 2287 | f 223/328/223 226/333/226 227/334/227 2288 | f 227/334/227 224/329/224 223/328/223 2289 | f 224/329/224 227/334/227 212/335/212 2290 | f 168/331/168 172/336/172 228/337/228 2291 | f 228/337/228 225/332/225 168/331/168 2292 | f 225/332/225 228/337/228 229/338/229 2293 | f 229/338/229 226/333/226 225/332/225 2294 | f 226/333/226 229/338/229 230/339/230 2295 | f 230/339/230 227/334/227 226/333/226 2296 | f 227/334/227 230/339/230 212/340/212 2297 | f 172/336/172 176/341/176 231/342/231 2298 | f 231/342/231 228/337/228 172/336/172 2299 | f 228/337/228 231/342/231 232/343/232 2300 | f 232/343/232 229/338/229 228/337/228 2301 | f 229/338/229 232/343/232 233/344/233 2302 | f 233/344/233 230/339/230 229/338/229 2303 | f 230/339/230 233/344/233 212/345/212 2304 | f 176/341/176 180/346/180 234/347/234 2305 | f 234/347/234 231/342/231 176/341/176 2306 | f 231/342/231 234/347/234 235/348/235 2307 | f 235/348/235 232/343/232 231/342/231 2308 | f 232/343/232 235/348/235 236/349/236 2309 | f 236/349/236 233/344/233 232/343/232 2310 | f 233/344/233 236/349/236 212/350/212 2311 | f 180/351/180 184/356/184 237/357/237 2312 | f 237/357/237 234/352/234 180/351/180 2313 | f 234/352/234 237/357/237 238/358/238 2314 | f 238/358/238 235/353/235 234/352/234 2315 | f 235/353/235 238/358/238 239/359/239 2316 | f 239/359/239 236/354/236 235/353/235 2317 | f 236/354/236 239/359/239 212/360/212 2318 | f 184/356/184 188/361/188 240/362/240 2319 | f 240/362/240 237/357/237 184/356/184 2320 | f 237/357/237 240/362/240 241/363/241 2321 | f 241/363/241 238/358/238 237/357/237 2322 | f 238/358/238 241/363/241 242/364/242 2323 | f 242/364/242 239/359/239 238/358/238 2324 | f 239/359/239 242/364/242 212/365/212 2325 | f 188/361/188 192/366/192 243/367/243 2326 | f 243/367/243 240/362/240 188/361/188 2327 | f 240/362/240 243/367/243 244/368/244 2328 | f 244/368/244 241/363/241 240/362/240 2329 | f 241/363/241 244/368/244 245/369/245 2330 | f 245/369/245 242/364/242 241/363/241 2331 | f 242/364/242 245/369/245 212/370/212 2332 | f 192/366/192 196/371/196 246/372/246 2333 | f 246/372/246 243/367/243 192/366/192 2334 | f 243/367/243 246/372/246 247/373/247 2335 | f 247/373/247 244/368/244 243/367/243 2336 | f 244/368/244 247/373/247 248/374/248 2337 | f 248/374/248 245/369/245 244/368/244 2338 | f 245/369/245 248/374/248 212/375/212 2339 | f 196/376/196 200/381/200 249/382/249 2340 | f 249/382/249 246/377/246 196/376/196 2341 | f 246/377/246 249/382/249 250/383/250 2342 | f 250/383/250 247/378/247 246/377/246 2343 | f 247/378/247 250/383/250 251/384/251 2344 | f 251/384/251 248/379/248 247/378/247 2345 | f 248/379/248 251/384/251 212/385/212 2346 | f 200/381/200 204/386/204 252/387/252 2347 | f 252/387/252 249/382/249 200/381/200 2348 | f 249/382/249 252/387/252 253/388/253 2349 | f 253/388/253 250/383/250 249/382/249 2350 | f 250/383/250 253/388/253 254/389/254 2351 | f 254/389/254 251/384/251 250/383/250 2352 | f 251/384/251 254/389/254 212/390/212 2353 | f 204/386/204 208/391/208 255/392/255 2354 | f 255/392/255 252/387/252 204/386/204 2355 | f 252/387/252 255/392/255 256/393/256 2356 | f 256/393/256 253/388/253 252/387/252 2357 | f 253/388/253 256/393/256 257/394/257 2358 | f 257/394/257 254/389/254 253/388/253 2359 | f 254/389/254 257/394/257 212/395/212 2360 | f 208/391/208 148/396/148 209/397/209 2361 | f 209/397/209 255/392/255 208/391/208 2362 | f 255/392/255 209/397/209 210/398/210 2363 | f 210/398/210 256/393/256 255/392/255 2364 | f 256/393/256 210/398/210 211/399/211 2365 | f 211/399/211 257/394/257 256/393/256 2366 | f 257/394/257 211/399/211 212/400/212 2367 | f 258/401/258 263/406/263 264/407/264 2368 | f 264/407/264 259/402/259 258/401/258 2369 | f 259/402/259 264/407/264 265/408/265 2370 | f 265/408/265 260/403/260 259/402/259 2371 | f 260/403/260 265/408/265 266/409/266 2372 | f 266/409/266 261/404/261 260/403/260 2373 | f 261/404/261 266/409/266 267/410/267 2374 | f 267/410/267 262/405/262 261/404/261 2375 | f 263/406/263 268/411/268 269/412/269 2376 | f 269/412/269 264/407/264 263/406/263 2377 | f 264/407/264 269/412/269 270/413/270 2378 | f 270/413/270 265/408/265 264/407/264 2379 | f 265/408/265 270/413/270 271/414/271 2380 | f 271/414/271 266/409/266 265/408/265 2381 | f 266/409/266 271/414/271 272/415/272 2382 | f 272/415/272 267/410/267 266/409/266 2383 | f 268/411/268 273/416/273 274/417/274 2384 | f 274/417/274 269/412/269 268/411/268 2385 | f 269/412/269 274/417/274 275/418/275 2386 | f 275/418/275 270/413/270 269/412/269 2387 | f 270/413/270 275/418/275 276/419/276 2388 | f 276/419/276 271/414/271 270/413/270 2389 | f 271/414/271 276/419/276 277/420/277 2390 | f 277/420/277 272/415/272 271/414/271 2391 | f 273/416/273 278/421/278 279/422/279 2392 | f 279/422/279 274/417/274 273/416/273 2393 | f 274/417/274 279/422/279 280/423/280 2394 | f 280/423/280 275/418/275 274/417/274 2395 | f 275/418/275 280/423/280 281/424/281 2396 | f 281/424/281 276/419/276 275/418/275 2397 | f 276/419/276 281/424/281 282/425/282 2398 | f 282/425/282 277/420/277 276/419/276 2399 | f 278/426/278 283/431/283 284/432/284 2400 | f 284/432/284 279/427/279 278/426/278 2401 | f 279/427/279 284/432/284 285/433/285 2402 | f 285/433/285 280/428/280 279/427/279 2403 | f 280/428/280 285/433/285 286/434/286 2404 | f 286/434/286 281/429/281 280/428/280 2405 | f 281/429/281 286/434/286 287/435/287 2406 | f 287/435/287 282/430/282 281/429/281 2407 | f 283/431/283 288/436/288 289/437/289 2408 | f 289/437/289 284/432/284 283/431/283 2409 | f 284/432/284 289/437/289 290/438/290 2410 | f 290/438/290 285/433/285 284/432/284 2411 | f 285/433/285 290/438/290 291/439/291 2412 | f 291/439/291 286/434/286 285/433/285 2413 | f 286/434/286 291/439/291 292/440/292 2414 | f 292/440/292 287/435/287 286/434/286 2415 | f 288/436/288 293/441/293 294/442/294 2416 | f 294/442/294 289/437/289 288/436/288 2417 | f 289/437/289 294/442/294 295/443/295 2418 | f 295/443/295 290/438/290 289/437/289 2419 | f 290/438/290 295/443/295 296/444/296 2420 | f 296/444/296 291/439/291 290/438/290 2421 | f 291/439/291 296/444/296 297/445/297 2422 | f 297/445/297 292/440/292 291/439/291 2423 | f 293/441/293 258/446/258 259/447/259 2424 | f 259/447/259 294/442/294 293/441/293 2425 | f 294/442/294 259/447/259 260/448/260 2426 | f 260/448/260 295/443/295 294/442/294 2427 | f 295/443/295 260/448/260 261/449/261 2428 | f 261/449/261 296/444/296 295/443/295 2429 | f 296/444/296 261/449/261 262/450/262 2430 | f 262/450/262 297/445/297 296/444/296 2431 | f 262/451/262 267/456/267 302/457/302 2432 | f 302/457/302 298/452/298 262/451/262 2433 | f 298/452/298 302/457/302 303/458/303 2434 | f 303/458/303 299/453/299 298/452/298 2435 | f 299/453/299 303/458/303 304/459/304 2436 | f 304/459/304 300/454/300 299/453/299 2437 | f 300/454/300 304/459/304 305/460/305 2438 | f 305/460/305 301/455/301 300/454/300 2439 | f 267/456/267 272/461/272 306/462/306 2440 | f 306/462/306 302/457/302 267/456/267 2441 | f 302/457/302 306/462/306 307/463/307 2442 | f 307/463/307 303/458/303 302/457/302 2443 | f 303/458/303 307/463/307 308/464/308 2444 | f 308/464/308 304/459/304 303/458/303 2445 | f 304/459/304 308/464/308 309/465/309 2446 | f 309/465/309 305/460/305 304/459/304 2447 | f 272/461/272 277/466/277 310/467/310 2448 | f 310/467/310 306/462/306 272/461/272 2449 | f 306/462/306 310/467/310 311/468/311 2450 | f 311/468/311 307/463/307 306/462/306 2451 | f 307/463/307 311/468/311 312/469/312 2452 | f 312/469/312 308/464/308 307/463/307 2453 | f 308/464/308 312/469/312 313/470/313 2454 | f 313/470/313 309/465/309 308/464/308 2455 | f 277/466/277 282/471/282 314/472/314 2456 | f 314/472/314 310/467/310 277/466/277 2457 | f 310/467/310 314/472/314 315/473/315 2458 | f 315/473/315 311/468/311 310/467/310 2459 | f 311/468/311 315/473/315 316/474/316 2460 | f 316/474/316 312/469/312 311/468/311 2461 | f 312/469/312 316/474/316 317/475/317 2462 | f 317/475/317 313/470/313 312/469/312 2463 | f 282/476/282 287/481/287 318/482/318 2464 | f 318/482/318 314/477/314 282/476/282 2465 | f 314/477/314 318/482/318 319/483/319 2466 | f 319/483/319 315/478/315 314/477/314 2467 | f 315/478/315 319/483/319 320/484/320 2468 | f 320/484/320 316/479/316 315/478/315 2469 | f 316/479/316 320/484/320 321/485/321 2470 | f 321/485/321 317/480/317 316/479/316 2471 | f 287/481/287 292/486/292 322/487/322 2472 | f 322/487/322 318/482/318 287/481/287 2473 | f 318/482/318 322/487/322 323/488/323 2474 | f 323/488/323 319/483/319 318/482/318 2475 | f 319/483/319 323/488/323 324/489/324 2476 | f 324/489/324 320/484/320 319/483/319 2477 | f 320/484/320 324/489/324 325/490/325 2478 | f 325/490/325 321/485/321 320/484/320 2479 | f 292/486/292 297/491/297 326/492/326 2480 | f 326/492/326 322/487/322 292/486/292 2481 | f 322/487/322 326/492/326 327/493/327 2482 | f 327/493/327 323/488/323 322/487/322 2483 | f 323/488/323 327/493/327 328/494/328 2484 | f 328/494/328 324/489/324 323/488/323 2485 | f 324/489/324 328/494/328 329/495/329 2486 | f 329/495/329 325/490/325 324/489/324 2487 | f 297/491/297 262/496/262 298/497/298 2488 | f 298/497/298 326/492/326 297/491/297 2489 | f 326/492/326 298/497/298 299/498/299 2490 | f 299/498/299 327/493/327 326/492/326 2491 | f 327/493/327 299/498/299 300/499/300 2492 | f 300/499/300 328/494/328 327/493/327 2493 | f 328/494/328 300/499/300 301/500/301 2494 | f 301/500/301 329/495/329 328/494/328 2495 | f 330/501/330 335/506/335 336/507/336 2496 | f 336/507/336 331/502/331 330/501/330 2497 | f 331/502/331 336/507/336 337/508/337 2498 | f 337/508/337 332/503/332 331/502/331 2499 | f 332/503/332 337/508/337 338/509/338 2500 | f 338/509/338 333/504/333 332/503/332 2501 | f 333/504/333 338/509/338 339/510/339 2502 | f 339/510/339 334/505/334 333/504/333 2503 | f 335/506/335 340/511/340 341/512/341 2504 | f 341/512/341 336/507/336 335/506/335 2505 | f 336/507/336 341/512/341 342/513/342 2506 | f 342/513/342 337/508/337 336/507/336 2507 | f 337/508/337 342/513/342 343/514/343 2508 | f 343/514/343 338/509/338 337/508/337 2509 | f 338/509/338 343/514/343 344/515/344 2510 | f 344/515/344 339/510/339 338/509/338 2511 | f 340/511/340 345/516/345 346/517/346 2512 | f 346/517/346 341/512/341 340/511/340 2513 | f 341/512/341 346/517/346 347/518/347 2514 | f 347/518/347 342/513/342 341/512/341 2515 | f 342/513/342 347/518/347 348/519/348 2516 | f 348/519/348 343/514/343 342/513/342 2517 | f 343/514/343 348/519/348 349/520/349 2518 | f 349/520/349 344/515/344 343/514/343 2519 | f 345/516/345 350/521/350 351/522/351 2520 | f 351/522/351 346/517/346 345/516/345 2521 | f 346/517/346 351/522/351 352/523/352 2522 | f 352/523/352 347/518/347 346/517/346 2523 | f 347/518/347 352/523/352 353/524/353 2524 | f 353/524/353 348/519/348 347/518/347 2525 | f 348/519/348 353/524/353 354/525/354 2526 | f 354/525/354 349/520/349 348/519/348 2527 | f 350/526/350 355/531/355 356/532/356 2528 | f 356/532/356 351/527/351 350/526/350 2529 | f 351/527/351 356/532/356 357/533/357 2530 | f 357/533/357 352/528/352 351/527/351 2531 | f 352/528/352 357/533/357 358/534/358 2532 | f 358/534/358 353/529/353 352/528/352 2533 | f 353/529/353 358/534/358 359/535/359 2534 | f 359/535/359 354/530/354 353/529/353 2535 | f 355/531/355 360/536/360 361/537/361 2536 | f 361/537/361 356/532/356 355/531/355 2537 | f 356/532/356 361/537/361 362/538/362 2538 | f 362/538/362 357/533/357 356/532/356 2539 | f 357/533/357 362/538/362 363/539/363 2540 | f 363/539/363 358/534/358 357/533/357 2541 | f 358/534/358 363/539/363 364/540/364 2542 | f 364/540/364 359/535/359 358/534/358 2543 | f 360/536/360 365/541/365 366/542/366 2544 | f 366/542/366 361/537/361 360/536/360 2545 | f 361/537/361 366/542/366 367/543/367 2546 | f 367/543/367 362/538/362 361/537/361 2547 | f 362/538/362 367/543/367 368/544/368 2548 | f 368/544/368 363/539/363 362/538/362 2549 | f 363/539/363 368/544/368 369/545/369 2550 | f 369/545/369 364/540/364 363/539/363 2551 | f 365/541/365 330/546/330 331/547/331 2552 | f 331/547/331 366/542/366 365/541/365 2553 | f 366/542/366 331/547/331 332/548/332 2554 | f 332/548/332 367/543/367 366/542/366 2555 | f 367/543/367 332/548/332 333/549/333 2556 | f 333/549/333 368/544/368 367/543/367 2557 | f 368/544/368 333/549/333 334/550/334 2558 | f 334/550/334 369/545/369 368/544/368 2559 | f 334/551/334 339/556/339 374/557/374 2560 | f 374/557/374 370/552/370 334/551/334 2561 | f 370/552/370 374/557/374 375/558/375 2562 | f 375/558/375 371/553/371 370/552/370 2563 | f 371/553/371 375/558/375 376/559/376 2564 | f 376/559/376 372/554/372 371/553/371 2565 | f 372/554/372 376/559/376 377/560/377 2566 | f 377/560/377 373/555/373 372/554/372 2567 | f 339/556/339 344/561/344 378/562/378 2568 | f 378/562/378 374/557/374 339/556/339 2569 | f 374/557/374 378/562/378 379/563/379 2570 | f 379/563/379 375/558/375 374/557/374 2571 | f 375/558/375 379/563/379 380/564/380 2572 | f 380/564/380 376/559/376 375/558/375 2573 | f 376/559/376 380/564/380 381/565/381 2574 | f 381/565/381 377/560/377 376/559/376 2575 | f 344/561/344 349/566/349 382/567/382 2576 | f 382/567/382 378/562/378 344/561/344 2577 | f 378/562/378 382/567/382 383/568/383 2578 | f 383/568/383 379/563/379 378/562/378 2579 | f 379/563/379 383/568/383 384/569/384 2580 | f 384/569/384 380/564/380 379/563/379 2581 | f 380/564/380 384/569/384 385/570/385 2582 | f 385/570/385 381/565/381 380/564/380 2583 | f 349/566/349 354/571/354 386/572/386 2584 | f 386/572/386 382/567/382 349/566/349 2585 | f 382/567/382 386/572/386 387/573/387 2586 | f 387/573/387 383/568/383 382/567/382 2587 | f 383/568/383 387/573/387 388/574/388 2588 | f 388/574/388 384/569/384 383/568/383 2589 | f 384/569/384 388/574/388 389/575/389 2590 | f 389/575/389 385/570/385 384/569/384 2591 | f 354/576/354 359/581/359 390/582/390 2592 | f 390/582/390 386/577/386 354/576/354 2593 | f 386/577/386 390/582/390 391/583/391 2594 | f 391/583/391 387/578/387 386/577/386 2595 | f 387/578/387 391/583/391 392/584/392 2596 | f 392/584/392 388/579/388 387/578/387 2597 | f 388/579/388 392/584/392 393/585/393 2598 | f 393/585/393 389/580/389 388/579/388 2599 | f 359/581/359 364/586/364 394/587/394 2600 | f 394/587/394 390/582/390 359/581/359 2601 | f 390/582/390 394/587/394 395/588/395 2602 | f 395/588/395 391/583/391 390/582/390 2603 | f 391/583/391 395/588/395 396/589/396 2604 | f 396/589/396 392/584/392 391/583/391 2605 | f 392/584/392 396/589/396 397/590/397 2606 | f 397/590/397 393/585/393 392/584/392 2607 | f 364/586/364 369/591/369 398/592/398 2608 | f 398/592/398 394/587/394 364/586/364 2609 | f 394/587/394 398/592/398 399/593/399 2610 | f 399/593/399 395/588/395 394/587/394 2611 | f 395/588/395 399/593/399 400/594/400 2612 | f 400/594/400 396/589/396 395/588/395 2613 | f 396/589/396 400/594/400 401/595/401 2614 | f 401/595/401 397/590/397 396/589/396 2615 | f 369/591/369 334/596/334 370/597/370 2616 | f 370/597/370 398/592/398 369/591/369 2617 | f 398/592/398 370/597/370 371/598/371 2618 | f 371/598/371 399/593/399 398/592/398 2619 | f 399/593/399 371/598/371 372/599/372 2620 | f 372/599/372 400/594/400 399/593/399 2621 | f 400/594/400 372/599/372 373/600/373 2622 | f 373/600/373 401/595/401 400/594/400 2623 | f 407/607/407 403/602/403 402/601/402 2624 | f 403/602/403 407/607/407 408/608/408 2625 | f 408/608/408 404/603/404 403/602/403 2626 | f 404/603/404 408/608/408 409/609/409 2627 | f 409/609/409 405/604/405 404/603/404 2628 | f 405/604/405 409/609/409 410/610/410 2629 | f 410/610/410 406/605/406 405/604/405 2630 | f 411/612/411 407/607/407 402/606/402 2631 | f 407/607/407 411/612/411 412/613/412 2632 | f 412/613/412 408/608/408 407/607/407 2633 | f 408/608/408 412/613/412 413/614/413 2634 | f 413/614/413 409/609/409 408/608/408 2635 | f 409/609/409 413/614/413 414/615/414 2636 | f 414/615/414 410/610/410 409/609/409 2637 | f 415/617/415 411/612/411 402/611/402 2638 | f 411/612/411 415/617/415 416/618/416 2639 | f 416/618/416 412/613/412 411/612/411 2640 | f 412/613/412 416/618/416 417/619/417 2641 | f 417/619/417 413/614/413 412/613/412 2642 | f 413/614/413 417/619/417 418/620/418 2643 | f 418/620/418 414/615/414 413/614/413 2644 | f 419/622/419 415/617/415 402/616/402 2645 | f 415/617/415 419/622/419 420/623/420 2646 | f 420/623/420 416/618/416 415/617/415 2647 | f 416/618/416 420/623/420 421/624/421 2648 | f 421/624/421 417/619/417 416/618/416 2649 | f 417/619/417 421/624/421 422/625/422 2650 | f 422/625/422 418/620/418 417/619/417 2651 | f 423/632/423 419/627/419 402/626/402 2652 | f 419/627/419 423/632/423 424/633/424 2653 | f 424/633/424 420/628/420 419/627/419 2654 | f 420/628/420 424/633/424 425/634/425 2655 | f 425/634/425 421/629/421 420/628/420 2656 | f 421/629/421 425/634/425 426/635/426 2657 | f 426/635/426 422/630/422 421/629/421 2658 | f 427/637/427 423/632/423 402/631/402 2659 | f 423/632/423 427/637/427 428/638/428 2660 | f 428/638/428 424/633/424 423/632/423 2661 | f 424/633/424 428/638/428 429/639/429 2662 | f 429/639/429 425/634/425 424/633/424 2663 | f 425/634/425 429/639/429 430/640/430 2664 | f 430/640/430 426/635/426 425/634/425 2665 | f 431/642/431 427/637/427 402/636/402 2666 | f 427/637/427 431/642/431 432/643/432 2667 | f 432/643/432 428/638/428 427/637/427 2668 | f 428/638/428 432/643/432 433/644/433 2669 | f 433/644/433 429/639/429 428/638/428 2670 | f 429/639/429 433/644/433 434/645/434 2671 | f 434/645/434 430/640/430 429/639/429 2672 | f 435/647/435 431/642/431 402/641/402 2673 | f 431/642/431 435/647/435 436/648/436 2674 | f 436/648/436 432/643/432 431/642/431 2675 | f 432/643/432 436/648/436 437/649/437 2676 | f 437/649/437 433/644/433 432/643/432 2677 | f 433/644/433 437/649/437 438/650/438 2678 | f 438/650/438 434/645/434 433/644/433 2679 | f 439/657/439 435/652/435 402/651/402 2680 | f 435/652/435 439/657/439 440/658/440 2681 | f 440/658/440 436/653/436 435/652/435 2682 | f 436/653/436 440/658/440 441/659/441 2683 | f 441/659/441 437/654/437 436/653/436 2684 | f 437/654/437 441/659/441 442/660/442 2685 | f 442/660/442 438/655/438 437/654/437 2686 | f 443/662/443 439/657/439 402/656/402 2687 | f 439/657/439 443/662/443 444/663/444 2688 | f 444/663/444 440/658/440 439/657/439 2689 | f 440/658/440 444/663/444 445/664/445 2690 | f 445/664/445 441/659/441 440/658/440 2691 | f 441/659/441 445/664/445 446/665/446 2692 | f 446/665/446 442/660/442 441/659/441 2693 | f 447/667/447 443/662/443 402/661/402 2694 | f 443/662/443 447/667/447 448/668/448 2695 | f 448/668/448 444/663/444 443/662/443 2696 | f 444/663/444 448/668/448 449/669/449 2697 | f 449/669/449 445/664/445 444/663/444 2698 | f 445/664/445 449/669/449 450/670/450 2699 | f 450/670/450 446/665/446 445/664/445 2700 | f 451/672/451 447/667/447 402/666/402 2701 | f 447/667/447 451/672/451 452/673/452 2702 | f 452/673/452 448/668/448 447/667/447 2703 | f 448/668/448 452/673/452 453/674/453 2704 | f 453/674/453 449/669/449 448/668/448 2705 | f 449/669/449 453/674/453 454/675/454 2706 | f 454/675/454 450/670/450 449/669/449 2707 | f 455/682/455 451/677/451 402/676/402 2708 | f 451/677/451 455/682/455 456/683/456 2709 | f 456/683/456 452/678/452 451/677/451 2710 | f 452/678/452 456/683/456 457/684/457 2711 | f 457/684/457 453/679/453 452/678/452 2712 | f 453/679/453 457/684/457 458/685/458 2713 | f 458/685/458 454/680/454 453/679/453 2714 | f 459/687/459 455/682/455 402/681/402 2715 | f 455/682/455 459/687/459 460/688/460 2716 | f 460/688/460 456/683/456 455/682/455 2717 | f 456/683/456 460/688/460 461/689/461 2718 | f 461/689/461 457/684/457 456/683/456 2719 | f 457/684/457 461/689/461 462/690/462 2720 | f 462/690/462 458/685/458 457/684/457 2721 | f 463/692/463 459/687/459 402/686/402 2722 | f 459/687/459 463/692/463 464/693/464 2723 | f 464/693/464 460/688/460 459/687/459 2724 | f 460/688/460 464/693/464 465/694/465 2725 | f 465/694/465 461/689/461 460/688/460 2726 | f 461/689/461 465/694/465 466/695/466 2727 | f 466/695/466 462/690/462 461/689/461 2728 | f 403/697/403 463/692/463 402/691/402 2729 | f 463/692/463 403/697/403 404/698/404 2730 | f 404/698/404 464/693/464 463/692/463 2731 | f 464/693/464 404/698/404 405/699/405 2732 | f 405/699/405 465/694/465 464/693/464 2733 | f 465/694/465 405/699/405 406/700/406 2734 | f 406/700/406 466/695/466 465/694/465 2735 | f 406/701/406 410/706/410 471/707/471 2736 | f 471/707/471 467/702/467 406/701/406 2737 | f 467/702/467 471/707/471 472/708/472 2738 | f 472/708/472 468/703/468 467/702/467 2739 | f 468/703/468 472/708/472 473/709/473 2740 | f 473/709/473 469/704/469 468/703/468 2741 | f 469/704/469 473/709/473 474/710/474 2742 | f 474/710/474 470/705/470 469/704/469 2743 | f 410/706/410 414/711/414 475/712/475 2744 | f 475/712/475 471/707/471 410/706/410 2745 | f 471/707/471 475/712/475 476/713/476 2746 | f 476/713/476 472/708/472 471/707/471 2747 | f 472/708/472 476/713/476 477/714/477 2748 | f 477/714/477 473/709/473 472/708/472 2749 | f 473/709/473 477/714/477 478/715/478 2750 | f 478/715/478 474/710/474 473/709/473 2751 | f 414/711/414 418/716/418 479/717/479 2752 | f 479/717/479 475/712/475 414/711/414 2753 | f 475/712/475 479/717/479 480/718/480 2754 | f 480/718/480 476/713/476 475/712/475 2755 | f 476/713/476 480/718/480 481/719/481 2756 | f 481/719/481 477/714/477 476/713/476 2757 | f 477/714/477 481/719/481 482/720/482 2758 | f 482/720/482 478/715/478 477/714/477 2759 | f 418/716/418 422/721/422 483/722/483 2760 | f 483/722/483 479/717/479 418/716/418 2761 | f 479/717/479 483/722/483 484/723/484 2762 | f 484/723/484 480/718/480 479/717/479 2763 | f 480/718/480 484/723/484 485/724/485 2764 | f 485/724/485 481/719/481 480/718/480 2765 | f 481/719/481 485/724/485 486/725/486 2766 | f 486/725/486 482/720/482 481/719/481 2767 | f 422/726/422 426/731/426 487/732/487 2768 | f 487/732/487 483/727/483 422/726/422 2769 | f 483/727/483 487/732/487 488/733/488 2770 | f 488/733/488 484/728/484 483/727/483 2771 | f 484/728/484 488/733/488 489/734/489 2772 | f 489/734/489 485/729/485 484/728/484 2773 | f 485/729/485 489/734/489 490/735/490 2774 | f 490/735/490 486/730/486 485/729/485 2775 | f 426/731/426 430/736/430 491/737/491 2776 | f 491/737/491 487/732/487 426/731/426 2777 | f 487/732/487 491/737/491 492/738/492 2778 | f 492/738/492 488/733/488 487/732/487 2779 | f 488/733/488 492/738/492 493/739/493 2780 | f 493/739/493 489/734/489 488/733/488 2781 | f 489/734/489 493/739/493 494/740/494 2782 | f 494/740/494 490/735/490 489/734/489 2783 | f 430/736/430 434/741/434 495/742/495 2784 | f 495/742/495 491/737/491 430/736/430 2785 | f 491/737/491 495/742/495 496/743/496 2786 | f 496/743/496 492/738/492 491/737/491 2787 | f 492/738/492 496/743/496 497/744/497 2788 | f 497/744/497 493/739/493 492/738/492 2789 | f 493/739/493 497/744/497 498/745/498 2790 | f 498/745/498 494/740/494 493/739/493 2791 | f 434/741/434 438/746/438 499/747/499 2792 | f 499/747/499 495/742/495 434/741/434 2793 | f 495/742/495 499/747/499 500/748/500 2794 | f 500/748/500 496/743/496 495/742/495 2795 | f 496/743/496 500/748/500 501/749/501 2796 | f 501/749/501 497/744/497 496/743/496 2797 | f 497/744/497 501/749/501 502/750/502 2798 | f 502/750/502 498/745/498 497/744/497 2799 | f 438/751/438 442/756/442 503/757/503 2800 | f 503/757/503 499/752/499 438/751/438 2801 | f 499/752/499 503/757/503 504/758/504 2802 | f 504/758/504 500/753/500 499/752/499 2803 | f 500/753/500 504/758/504 505/759/505 2804 | f 505/759/505 501/754/501 500/753/500 2805 | f 501/754/501 505/759/505 506/760/506 2806 | f 506/760/506 502/755/502 501/754/501 2807 | f 442/756/442 446/761/446 507/762/507 2808 | f 507/762/507 503/757/503 442/756/442 2809 | f 503/757/503 507/762/507 508/763/508 2810 | f 508/763/508 504/758/504 503/757/503 2811 | f 504/758/504 508/763/508 509/764/509 2812 | f 509/764/509 505/759/505 504/758/504 2813 | f 505/759/505 509/764/509 510/765/510 2814 | f 510/765/510 506/760/506 505/759/505 2815 | f 446/761/446 450/766/450 511/767/511 2816 | f 511/767/511 507/762/507 446/761/446 2817 | f 507/762/507 511/767/511 512/768/512 2818 | f 512/768/512 508/763/508 507/762/507 2819 | f 508/763/508 512/768/512 513/769/513 2820 | f 513/769/513 509/764/509 508/763/508 2821 | f 509/764/509 513/769/513 514/770/514 2822 | f 514/770/514 510/765/510 509/764/509 2823 | f 450/766/450 454/771/454 515/772/515 2824 | f 515/772/515 511/767/511 450/766/450 2825 | f 511/767/511 515/772/515 516/773/516 2826 | f 516/773/516 512/768/512 511/767/511 2827 | f 512/768/512 516/773/516 517/774/517 2828 | f 517/774/517 513/769/513 512/768/512 2829 | f 513/769/513 517/774/517 518/775/518 2830 | f 518/775/518 514/770/514 513/769/513 2831 | f 454/776/454 458/781/458 519/782/519 2832 | f 519/782/519 515/777/515 454/776/454 2833 | f 515/777/515 519/782/519 520/783/520 2834 | f 520/783/520 516/778/516 515/777/515 2835 | f 516/778/516 520/783/520 521/784/521 2836 | f 521/784/521 517/779/517 516/778/516 2837 | f 517/779/517 521/784/521 522/785/522 2838 | f 522/785/522 518/780/518 517/779/517 2839 | f 458/781/458 462/786/462 523/787/523 2840 | f 523/787/523 519/782/519 458/781/458 2841 | f 519/782/519 523/787/523 524/788/524 2842 | f 524/788/524 520/783/520 519/782/519 2843 | f 520/783/520 524/788/524 525/789/525 2844 | f 525/789/525 521/784/521 520/783/520 2845 | f 521/784/521 525/789/525 526/790/526 2846 | f 526/790/526 522/785/522 521/784/521 2847 | f 462/786/462 466/791/466 527/792/527 2848 | f 527/792/527 523/787/523 462/786/462 2849 | f 523/787/523 527/792/527 528/793/528 2850 | f 528/793/528 524/788/524 523/787/523 2851 | f 524/788/524 528/793/528 529/794/529 2852 | f 529/794/529 525/789/525 524/788/524 2853 | f 525/789/525 529/794/529 530/795/530 2854 | f 530/795/530 526/790/526 525/789/525 2855 | f 466/791/466 406/796/406 467/797/467 2856 | f 467/797/467 527/792/527 466/791/466 2857 | f 527/792/527 467/797/467 468/798/468 2858 | f 468/798/468 528/793/528 527/792/527 2859 | f 528/793/528 468/798/468 469/799/469 2860 | f 469/799/469 529/794/529 528/793/528 2861 | f 529/794/529 469/799/469 470/800/470 2862 | f 470/800/470 530/795/530 529/794/529 2863 | # 992 faces 2864 | 2865 | g 2866 | --------------------------------------------------------------------------------