diff options
Diffstat (limited to 'examples')
107 files changed, 4824 insertions, 7339 deletions
diff --git a/examples/makefile b/examples/Makefile index 2a9e88ba..98129990 100644 --- a/examples/makefile +++ b/examples/Makefile @@ -2,7 +2,9 @@ # # raylib makefile for desktop platforms, Raspberry Pi and HTML5 (emscripten) # -# Copyright (c) 2015 Ramon Santamaria (@raysan5) +# NOTE: By default examples are compiled using raylib static library and OpenAL Soft shared library +# +# Copyright (c) 2013-2016 Ramon Santamaria (@raysan5) # # This software is provided "as-is", without any express or implied warranty. In no event # will the authors be held liable for any damages arising from the use of this software. @@ -26,6 +28,9 @@ # WARNING: To compile to HTML5, code must be redesigned to use emscripten.h and emscripten_set_main_loop() PLATFORM ?= PLATFORM_DESKTOP +# define NO to use OpenAL Soft as static library (shared by default) +SHARED_OPENAL ?= YES + # determine PLATFORM_OS in case PLATFORM_DESKTOP selected ifeq ($(PLATFORM),PLATFORM_DESKTOP) # No uname.exe on MinGW!, but OS=Windows_NT on Windows! ifeq ($(UNAME),Msys) -> Windows @@ -62,12 +67,13 @@ endif # define compiler flags: # -O2 defines optimization level +# -s strip unnecessary data from build # -Wall turns on most, but not all, compiler warnings # -std=c99 use standard C from 1999 revision ifeq ($(PLATFORM),PLATFORM_RPI) - CFLAGS = -O2 -Wall -std=gnu99 -fgnu89-inline + CFLAGS = -O2 -s -Wall -std=gnu99 -fgnu89-inline else - CFLAGS = -O2 -Wall -std=c99 + CFLAGS = -O2 -s -Wall -std=c99 endif ifeq ($(PLATFORM),PLATFORM_WEB) CFLAGS = -O1 -Wall -std=c99 -s USE_GLFW=3 -s ASSERTIONS=1 --preload-file resources @@ -77,33 +83,58 @@ endif #CFLAGSEXTRA = -Wextra -Wmissing-prototypes -Wstrict-prototypes +# define raylib release directory for compiled library +ifeq ($(PLATFORM),PLATFORM_DESKTOP) + ifeq ($(PLATFORM_OS),WINDOWS) + RAYLIB_PATH = ../release/win32/mingw32 + endif + ifeq ($(PLATFORM_OS),LINUX) + RAYLIB_PATH = ../release/linux + endif + ifeq ($(PLATFORM_OS),OSX) + RAYLIB_PATH = ../release/osx + endif +endif +ifeq ($(PLATFORM),PLATFORM_WEB) + RAYLIB_PATH = ../release/html5 +endif +ifeq ($(PLATFORM),PLATFORM_RPI) + RAYLIB_PATH = ../release/rpi +endif + # define any directories containing required header files +INCLUDES = -I. -I../src -I../src/external -I$(RAYLIB_PATH) + ifeq ($(PLATFORM),PLATFORM_RPI) - INCLUDES = -I. -I../src -I/opt/vc/include -I/opt/vc/include/interface/vcos/pthreads -else - INCLUDES = -I. -I../src -# external libraries headers -# GLFW3 - INCLUDES += -I../external/glfw3/include -# GLEW - Not required any more, replaced by GLAD - #INCLUDES += -I../external/glew/include -# OpenAL Soft - INCLUDES += -I../external/openal_soft/include + INCLUDES += -I/opt/vc/include -I/opt/vc/include/interface/vcos/pthreads +endif +ifeq ($(PLATFORM),PLATFORM_DESKTOP) + # add standard directories for GNU/Linux + ifeq ($(PLATFORM_OS),LINUX) + INCLUDES += -I/usr/local/include/raylib/ + else ifeq ($(PLATFORM_OS),WINDOWS) + # external libraries headers + # GLFW3 + INCLUDES += -I../src/external/glfw3/include + # OpenAL Soft + INCLUDES += -I../src/external/openal_soft/include + endif endif # define library paths containing required libs +LFLAGS = -L. -L../src -L$(RAYLIB_PATH) + ifeq ($(PLATFORM),PLATFORM_RPI) - LFLAGS = -L. -L../src -L/opt/vc/lib -else - LFLAGS = -L. -L../src -# external libraries to link with -# GLFW3 - LFLAGS += -L../external/glfw3/lib/$(LIBPATH) - ifneq ($(PLATFORM_OS),OSX) - # OpenAL Soft - LFLAGS += -L../external/openal_soft/lib/$(LIBPATH) - # GLEW - Not required any more, replaced by GLAD - #LFLAGS += -L../external/glew/lib/$(LIBPATH) + LFLAGS += -L/opt/vc/lib +endif +ifeq ($(PLATFORM),PLATFORM_DESKTOP) + # add standard directories for GNU/Linux + ifeq ($(PLATFORM_OS),WINDOWS) + # external libraries to link with + # GLFW3 + LFLAGS += -L../src/external/glfw3/lib/$(LIBPATH) + # OpenAL Soft + LFLAGS += -L../src/external/openal_soft/lib/$(LIBPATH) endif endif @@ -113,20 +144,27 @@ ifeq ($(PLATFORM),PLATFORM_DESKTOP) ifeq ($(PLATFORM_OS),LINUX) # libraries for Debian GNU/Linux desktop compiling # requires the following packages: - # libglfw3-dev libopenal-dev libglew-dev libegl1-mesa-dev - LIBS = -lraylib -lglfw3 -lGLEW -lGL -lopenal -lm -pthread - # on XWindow could require also below libraries, just uncomment - #LIBS += -lX11 -lXrandr -lXinerama -lXi -lXxf86vm -lXcursor + # libglfw3-dev libopenal-dev libegl1-mesa-dev + LIBS = -lraylib -lglfw3 -lGL -lopenal -lm -lpthread -ldl + # on XWindow could require also below libraries, just uncomment + LIBS += -lX11 -lXrandr -lXinerama -lXi -lXxf86vm -lXcursor else ifeq ($(PLATFORM_OS),OSX) # libraries for OS X 10.9 desktop compiling # requires the following packages: - # libglfw3-dev libopenal-dev libglew-dev libegl1-mesa-dev - LIBS = -lraylib -lglfw -framework OpenGL -framework OpenAl -framework Cocoa + # libglfw3-dev libopenal-dev libegl1-mesa-dev + LIBS = -lraylib -lglfw -framework OpenGL -framework OpenAL -framework Cocoa else # libraries for Windows desktop compiling # NOTE: GLFW3 and OpenAL Soft libraries should be installed - LIBS = -lraylib -lglfw3 -lopengl32 -lopenal32 -lgdi32 + LIBS = -lraylib -lglfw3 -lopengl32 -lgdi32 + # if static OpenAL Soft required, define the corresponding libs + ifeq ($(SHARED_OPENAL),NO) + LIBS += -lopenal32 -lwinmm + CFLAGS += -Wl,-allow-multiple-definition + else + LIBS += -lopenal32dll + endif endif endif endif @@ -137,7 +175,7 @@ ifeq ($(PLATFORM),PLATFORM_RPI) endif ifeq ($(PLATFORM),PLATFORM_WEB) # just adjust the correct path to libraylib.bc - LIBS = ../src/libraylib.bc + LIBS = ../release/html5/libraylib.bc endif # define additional parameters and flags for windows @@ -167,6 +205,9 @@ EXAMPLES = \ core_3d_picking \ core_3d_camera_free \ core_3d_camera_first_person \ + core_2d_camera \ + core_world_screen \ + core_oculus_rift \ shapes_logo_raylib \ shapes_basic_shapes \ shapes_colors_palette \ @@ -187,24 +228,35 @@ EXAMPLES = \ text_format_text \ text_font_select \ text_writing_anim \ + text_ttf_loading \ + text_bmfont_unordered \ models_geometric_shapes \ models_box_collisions \ models_billboard \ models_obj_loading \ models_heightmap \ models_cubicmap \ + models_ray_picking \ shaders_model_shader \ shaders_shapes_textures \ shaders_custom_uniform \ shaders_postprocessing \ + shaders_standard_lighting \ audio_sound_loading \ audio_music_stream \ + audio_module_playing \ + audio_raw_stream \ + physics_demo \ + physics_friction \ + physics_movement \ + physics_restitution \ + physics_shatter \ fix_dylib \ -# typing 'make' will invoke the first target entry in the file, +# typing 'make' will invoke the default target entry called 'all', # in this case, the 'default' target entry is raylib -default: examples +all: examples # compile all examples examples: $(EXAMPLES) @@ -276,7 +328,19 @@ core_3d_camera_free: core_3d_camera_free.c # compile [core] example - 3d camera first person core_3d_camera_first_person: core_3d_camera_first_person.c $(CC) -o $@$(EXT) $< $(CFLAGS) $(INCLUDES) $(LFLAGS) $(LIBS) -D$(PLATFORM) $(WINFLAGS) + +# compile [core] example - 2d camera +core_2d_camera: core_2d_camera.c + $(CC) -o $@$(EXT) $< $(CFLAGS) $(INCLUDES) $(LFLAGS) $(LIBS) -D$(PLATFORM) $(WINFLAGS) +# compile [core] example - world screen +core_world_screen: core_world_screen.c + $(CC) -o $@$(EXT) $< $(CFLAGS) $(INCLUDES) $(LFLAGS) $(LIBS) -D$(PLATFORM) $(WINFLAGS) + +# compile [core] example - oculus rift +core_oculus_rift: core_oculus_rift.c + $(CC) -o $@$(EXT) $< $(CFLAGS) $(INCLUDES) $(LFLAGS) $(LIBS) -D$(PLATFORM) $(WINFLAGS) + # compile [shapes] example - raylib logo (with basic shapes) shapes_logo_raylib: shapes_logo_raylib.c $(CC) -o $@$(EXT) $< $(CFLAGS) $(INCLUDES) $(LFLAGS) $(LIBS) -D$(PLATFORM) $(WINFLAGS) @@ -357,6 +421,14 @@ text_font_select: text_font_select.c text_writing_anim: text_writing_anim.c $(CC) -o $@$(EXT) $< $(CFLAGS) $(INCLUDES) $(LFLAGS) $(LIBS) -D$(PLATFORM) $(WINFLAGS) +# compile [text] example - text ttf loading +text_ttf_loading: text_ttf_loading.c + $(CC) -o $@$(EXT) $< $(CFLAGS) $(INCLUDES) $(LFLAGS) $(LIBS) -D$(PLATFORM) $(WINFLAGS) + +# compile [text] example - text bmfont unordered +text_bmfont_unordered: text_bmfont_unordered.c + $(CC) -o $@$(EXT) $< $(CFLAGS) $(INCLUDES) $(LFLAGS) $(LIBS) -D$(PLATFORM) $(WINFLAGS) + # compile [models] example - basic geometric 3d shapes models_geometric_shapes: models_geometric_shapes.c $(CC) -o $@$(EXT) $< $(CFLAGS) $(INCLUDES) $(LFLAGS) $(LIBS) -D$(PLATFORM) $(WINFLAGS) @@ -385,6 +457,10 @@ models_heightmap: models_heightmap.c models_cubicmap: models_cubicmap.c $(CC) -o $@$(EXT) $< $(CFLAGS) $(INCLUDES) $(LFLAGS) $(LIBS) -D$(PLATFORM) $(WINFLAGS) +# compile [models] example - model ray picking +models_ray_picking: models_ray_picking.c + $(CC) -o $@$(EXT) $< $(CFLAGS) $(INCLUDES) $(LFLAGS) $(LIBS) -D$(PLATFORM) $(WINFLAGS) + # compile [shaders] example - model shader shaders_model_shader: shaders_model_shader.c $(CC) -o $@$(EXT) $< $(CFLAGS) $(INCLUDES) $(LFLAGS) $(LIBS) -D$(PLATFORM) $(WINFLAGS) @@ -400,7 +476,11 @@ shaders_custom_uniform: shaders_custom_uniform.c # compile [shaders] example - postprocessing shader shaders_postprocessing: shaders_postprocessing.c $(CC) -o $@$(EXT) $< $(CFLAGS) $(INCLUDES) $(LFLAGS) $(LIBS) -D$(PLATFORM) $(WINFLAGS) - + +# compile [shaders] example - standard lighting +shaders_standard_lighting: shaders_standard_lighting.c + $(CC) -o $@$(EXT) $< $(CFLAGS) $(INCLUDES) $(LFLAGS) $(LIBS) -D$(PLATFORM) $(WINFLAGS) + # compile [audio] example - sound loading and playing (WAV and OGG) audio_sound_loading: audio_sound_loading.c $(CC) -o $@$(EXT) $< $(CFLAGS) $(INCLUDES) $(LFLAGS) $(LIBS) -D$(PLATFORM) $(WINFLAGS) @@ -409,6 +489,41 @@ audio_sound_loading: audio_sound_loading.c audio_music_stream: audio_music_stream.c $(CC) -o $@$(EXT) $< $(CFLAGS) $(INCLUDES) $(LFLAGS) $(LIBS) -D$(PLATFORM) $(WINFLAGS) +# compile [audio] example - module playing (XM) +audio_module_playing: audio_module_playing.c + $(CC) -o $@$(EXT) $< $(CFLAGS) $(INCLUDES) $(LFLAGS) $(LIBS) -D$(PLATFORM) $(WINFLAGS) + +# compile [audio] example - raw audio streaming +audio_raw_stream: audio_raw_stream.c + $(CC) -o $@$(EXT) $< $(CFLAGS) $(INCLUDES) $(LFLAGS) $(LIBS) -D$(PLATFORM) $(WINFLAGS) + +# Linux Fix to timespect from +ifeq ($(PLATFORM),PLATFORM_DESKTOP) + ifeq ($(PLATFORM_OS),LINUX) + CFLAGS += -D_POSIX_C_SOURCE=199309L + endif +endif + +# compile [physac] example - physics demo +physics_demo: physics_demo.c + $(CC) -o $@$(EXT) $< $(CFLAGS) $(INCLUDES) $(LFLAGS) $(LIBS) -lpthread -D$(PLATFORM) $(WINFLAGS) + +# compile [physac] example - physics friction +physics_friction: physics_friction.c + $(CC) -o $@$(EXT) $< $(CFLAGS) $(INCLUDES) $(LFLAGS) $(LIBS) -lpthread -D$(PLATFORM) $(WINFLAGS) + +# compile [physac] example - physics movement +physics_movement: physics_movement.c + $(CC) -o $@$(EXT) $< $(CFLAGS) $(INCLUDES) $(LFLAGS) $(LIBS) -lpthread -D$(PLATFORM) $(WINFLAGS) + +# compile [physac] example - physics restitution +physics_restitution: physics_restitution.c + $(CC) -o $@$(EXT) $< $(CFLAGS) $(INCLUDES) $(LFLAGS) $(LIBS) -lpthread -D$(PLATFORM) $(WINFLAGS) + +# compile [physac] example - physics shatter +physics_shatter: physics_shatter.c + $(CC) -o $@$(EXT) $< $(CFLAGS) $(INCLUDES) $(LFLAGS) $(LIBS) -lpthread -D$(PLATFORM) $(WINFLAGS) + # fix dylib install path name for each executable (MAC) fix_dylib: ifeq ($(PLATFORM_OS),OSX) diff --git a/examples/audio_module_playing.c b/examples/audio_module_playing.c new file mode 100644 index 00000000..08ae2b05 --- /dev/null +++ b/examples/audio_module_playing.c @@ -0,0 +1,141 @@ +/******************************************************************************************* +* +* raylib [audio] example - Module playing (streaming) +* +* NOTE: This example requires OpenAL Soft library installed +* +* This example has been created using raylib 1.5 (www.raylib.com) +* raylib is licensed under an unmodified zlib/libpng license (View raylib.h for details) +* +* Copyright (c) 2016 Ramon Santamaria (@raysan5) +* +********************************************************************************************/ + +#include "raylib.h" + +#define MAX_CIRCLES 64 + +typedef struct { + Vector2 position; + float radius; + float alpha; + float speed; + Color color; +} CircleWave; + +int main() +{ + // Initialization + //-------------------------------------------------------------------------------------- + int screenWidth = 800; + int screenHeight = 450; + + SetConfigFlags(FLAG_MSAA_4X_HINT); // NOTE: Try to enable MSAA 4X + + InitWindow(screenWidth, screenHeight, "raylib [audio] example - module playing (streaming)"); + + InitAudioDevice(); // Initialize audio device + + Color colors[14] = { ORANGE, RED, GOLD, LIME, BLUE, VIOLET, BROWN, LIGHTGRAY, PINK, + YELLOW, GREEN, SKYBLUE, PURPLE, BEIGE }; + + // Creates ome circles for visual effect + CircleWave circles[MAX_CIRCLES]; + + for (int i = MAX_CIRCLES - 1; i >= 0; i--) + { + circles[i].alpha = 0.0f; + circles[i].radius = GetRandomValue(10, 40); + circles[i].position.x = GetRandomValue(circles[i].radius, screenWidth - circles[i].radius); + circles[i].position.y = GetRandomValue(circles[i].radius, screenHeight - circles[i].radius); + circles[i].speed = (float)GetRandomValue(1, 100)/20000.0f; + circles[i].color = colors[GetRandomValue(0, 13)]; + } + + Music xm = LoadMusicStream("resources/audio/mini1111.xm"); + + PlayMusicStream(xm); + + float timePlayed = 0.0f; + bool pause = false; + + SetTargetFPS(60); // Set our game to run at 60 frames-per-second + //-------------------------------------------------------------------------------------- + + // Main game loop + while (!WindowShouldClose()) // Detect window close button or ESC key + { + // Update + //---------------------------------------------------------------------------------- + UpdateMusicStream(xm); // Update music buffer with new stream data + + // Restart music playing (stop and play) + if (IsKeyPressed(KEY_SPACE)) + { + StopMusicStream(xm); + PlayMusicStream(xm); + } + + // Pause/Resume music playing + if (IsKeyPressed(KEY_P)) + { + pause = !pause; + + if (pause) PauseMusicStream(xm); + else ResumeMusicStream(xm); + } + + // Get timePlayed scaled to bar dimensions + timePlayed = GetMusicTimePlayed(xm)/GetMusicTimeLength(xm)*(screenWidth - 40); + + // Color circles animation + for (int i = MAX_CIRCLES - 1; (i >= 0) && !pause; i--) + { + circles[i].alpha += circles[i].speed; + circles[i].radius += circles[i].speed*10.0f; + + if (circles[i].alpha > 1.0f) circles[i].speed *= -1; + + if (circles[i].alpha <= 0.0f) + { + circles[i].alpha = 0.0f; + circles[i].radius = GetRandomValue(10, 40); + circles[i].position.x = GetRandomValue(circles[i].radius, screenWidth - circles[i].radius); + circles[i].position.y = GetRandomValue(circles[i].radius, screenHeight - circles[i].radius); + circles[i].color = colors[GetRandomValue(0, 13)]; + circles[i].speed = (float)GetRandomValue(1, 100)/20000.0f; + } + } + //---------------------------------------------------------------------------------- + + // Draw + //---------------------------------------------------------------------------------- + BeginDrawing(); + + ClearBackground(RAYWHITE); + + for (int i = MAX_CIRCLES - 1; i >= 0; i--) + { + DrawCircleV(circles[i].position, circles[i].radius, Fade(circles[i].color, circles[i].alpha)); + } + + // Draw time bar + DrawRectangle(20, screenHeight - 20 - 12, screenWidth - 40, 12, LIGHTGRAY); + DrawRectangle(20, screenHeight - 20 - 12, (int)timePlayed, 12, MAROON); + DrawRectangleLines(20, screenHeight - 20 - 12, screenWidth - 40, 12, GRAY); + + EndDrawing(); + //---------------------------------------------------------------------------------- + } + + // De-Initialization + //-------------------------------------------------------------------------------------- + UnloadMusicStream(xm); // Unload music stream buffers from RAM + + CloseAudioDevice(); // Close audio device (music streaming is automatically stopped) + + CloseWindow(); // Close window and OpenGL context + //-------------------------------------------------------------------------------------- + + return 0; +}
\ No newline at end of file diff --git a/examples/audio_module_playing.png b/examples/audio_module_playing.png Binary files differnew file mode 100644 index 00000000..8bde9879 --- /dev/null +++ b/examples/audio_module_playing.png diff --git a/examples/audio_music_stream.c b/examples/audio_music_stream.c index 8c668cce..9c1ca4df 100644 --- a/examples/audio_music_stream.c +++ b/examples/audio_music_stream.c @@ -24,11 +24,12 @@ int main() InitAudioDevice(); // Initialize audio device - PlayMusicStream("resources/audio/guitar_noodling.ogg"); // Play music stream + Music music = LoadMusicStream("resources/audio/guitar_noodling.ogg"); + + PlayMusicStream(music); - int framesCounter = 0; float timePlayed = 0.0f; - //float volume = 1.0; + bool pause = false; SetTargetFPS(60); // Set our game to run at 60 frames-per-second //-------------------------------------------------------------------------------------- @@ -38,32 +39,26 @@ int main() { // Update //---------------------------------------------------------------------------------- - framesCounter++; - - // Testing music fading from one file to another -/* - if (framesCounter > 600) // Wait for 10 seconds (600 frames) + UpdateMusicStream(music); // Update music buffer with new stream data + + // Restart music playing (stop and play) + if (IsKeyPressed(KEY_SPACE)) { - volume -= 0.01; // Decrement music volume level - - // When music volume level equal or lower than 0, - // restore volume level and init another music file - if (volume <= 0) - { - volume = 1.0; - framesCounter = 0; - PlayMusicStream("resources/audio/another_file.ogg"); - } - - SetMusicVolume(volume); + StopMusicStream(music); + PlayMusicStream(music); } -*/ - if (IsWindowMinimized()) PauseMusicStream(); - else ResumeMusicStream(); - - timePlayed = GetMusicTimePlayed()/GetMusicTimeLength()*100*4; // We scale by 4 to fit 400 pixels - UpdateMusicStream(); // Update music buffer with new stream data + // Pause/Resume music playing + if (IsKeyPressed(KEY_P)) + { + pause = !pause; + + if (pause) PauseMusicStream(music); + else ResumeMusicStream(music); + } + + // Get timePlayed scaled to bar dimensions (400 pixels) + timePlayed = GetMusicTimePlayed(music)/GetMusicTimeLength(music)*400; //---------------------------------------------------------------------------------- // Draw @@ -72,10 +67,14 @@ int main() ClearBackground(RAYWHITE); - DrawText("MUSIC SHOULD BE PLAYING!", 255, 200, 20, LIGHTGRAY); + DrawText("MUSIC SHOULD BE PLAYING!", 255, 150, 20, LIGHTGRAY); - DrawRectangle(200, 250, 400, 12, LIGHTGRAY); - DrawRectangle(200, 250, (int)timePlayed, 12, MAROON); + DrawRectangle(200, 200, 400, 12, LIGHTGRAY); + DrawRectangle(200, 200, (int)timePlayed, 12, MAROON); + DrawRectangleLines(200, 200, 400, 12, GRAY); + + DrawText("PRESS SPACE TO RESTART MUSIC", 215, 250, 20, LIGHTGRAY); + DrawText("PRESS P TO PAUSE/RESUME MUSIC", 208, 280, 20, LIGHTGRAY); EndDrawing(); //---------------------------------------------------------------------------------- @@ -83,9 +82,11 @@ int main() // De-Initialization //-------------------------------------------------------------------------------------- - CloseAudioDevice(); // Close audio device (music streaming is automatically stopped) + UnloadMusicStream(music); // Unload music stream buffers from RAM + + CloseAudioDevice(); // Close audio device (music streaming is automatically stopped) - CloseWindow(); // Close window and OpenGL context + CloseWindow(); // Close window and OpenGL context //-------------------------------------------------------------------------------------- return 0; diff --git a/examples/audio_raw_stream.c b/examples/audio_raw_stream.c new file mode 100644 index 00000000..80c83e96 --- /dev/null +++ b/examples/audio_raw_stream.c @@ -0,0 +1,114 @@ +/******************************************************************************************* +* +* raylib [audio] example - Raw audio streaming +* +* NOTE: This example requires OpenAL Soft library installed +* +* This example has been created using raylib 1.6 (www.raylib.com) +* raylib is licensed under an unmodified zlib/libpng license (View raylib.h for details) +* +* Copyright (c) 2015 Ramon Santamaria (@raysan5) +* +********************************************************************************************/ + +#include "raylib.h" + +#include <stdlib.h> // Required for: malloc(), free() +#include <math.h> // Required for: sinf() + +#define MAX_SAMPLES 22050 +#define MAX_SAMPLES_PER_UPDATE 4096 + +int main() +{ + // Initialization + //-------------------------------------------------------------------------------------- + int screenWidth = 800; + int screenHeight = 450; + + InitWindow(screenWidth, screenHeight, "raylib [audio] example - raw audio streaming"); + + InitAudioDevice(); // Initialize audio device + + // Init raw audio stream (sample rate: 22050, sample size: 16bit-short, channels: 1-mono) + AudioStream stream = InitAudioStream(22050, 16, 1); + + // Generate samples data from sine wave + short *data = (short *)malloc(sizeof(short)*MAX_SAMPLES); + + // TODO: Review data generation, it seems data is discontinued for loop, + // for that reason, there is a clip everytime audio stream is looped... + for (int i = 0; i < MAX_SAMPLES; i++) + { + data[i] = (short)(sinf(((2*PI*(float)i)/2)*DEG2RAD)*32000); + } + + PlayAudioStream(stream); // Start processing stream buffer (no data loaded currently) + + int totalSamples = MAX_SAMPLES; + int samplesLeft = totalSamples; + + Vector2 position = { 0, 0 }; + + SetTargetFPS(30); // Set our game to run at 30 frames-per-second + //-------------------------------------------------------------------------------------- + + // Main game loop + while (!WindowShouldClose()) // Detect window close button or ESC key + { + // Update + //---------------------------------------------------------------------------------- + + // Refill audio stream if required + // NOTE: Every update we check if stream data has been already consumed and we update + // buffer with new data from the generated samples, we upload data at a rate (MAX_SAMPLES_PER_UPDATE), + // but notice that at some point we update < MAX_SAMPLES_PER_UPDATE data... + if (IsAudioBufferProcessed(stream)) + { + int numSamples = 0; + if (samplesLeft >= MAX_SAMPLES_PER_UPDATE) numSamples = MAX_SAMPLES_PER_UPDATE; + else numSamples = samplesLeft; + + UpdateAudioStream(stream, data + (totalSamples - samplesLeft), numSamples); + + samplesLeft -= numSamples; + + // Reset samples feeding (loop audio) + if (samplesLeft <= 0) samplesLeft = totalSamples; + } + //---------------------------------------------------------------------------------- + + // Draw + //---------------------------------------------------------------------------------- + BeginDrawing(); + + ClearBackground(RAYWHITE); + + DrawText("SINE WAVE SHOULD BE PLAYING!", 240, 140, 20, LIGHTGRAY); + + // NOTE: Draw a part of the sine wave (only screen width, proportional values) + for (int i = 0; i < GetScreenWidth(); i++) + { + position.x = i; + position.y = 250 + 50*data[i]/32000; + + DrawPixelV(position, RED); + } + + EndDrawing(); + //---------------------------------------------------------------------------------- + } + + // De-Initialization + //-------------------------------------------------------------------------------------- + free(data); // Unload sine wave data + + CloseAudioStream(stream); // Close raw audio stream and delete buffers from RAM + + CloseAudioDevice(); // Close audio device (music streaming is automatically stopped) + + CloseWindow(); // Close window and OpenGL context + //-------------------------------------------------------------------------------------- + + return 0; +}
\ No newline at end of file diff --git a/examples/audio_raw_stream.png b/examples/audio_raw_stream.png Binary files differnew file mode 100644 index 00000000..344f4a71 --- /dev/null +++ b/examples/audio_raw_stream.png diff --git a/examples/audio_sound_loading.c b/examples/audio_sound_loading.c index 8819aad1..feb30563 100644 --- a/examples/audio_sound_loading.c +++ b/examples/audio_sound_loading.c @@ -24,7 +24,7 @@ int main() InitAudioDevice(); // Initialize audio device - Sound fxWav = LoadSound("resources/audio/weird.wav"); // Load WAV audio file + Sound fxWav = LoadSound("resources/audio/sound.wav"); // Load WAV audio file Sound fxOgg = LoadSound("resources/audio/tanatana.ogg"); // Load OGG audio file SetTargetFPS(60); @@ -36,7 +36,6 @@ int main() // Update //---------------------------------------------------------------------------------- if (IsKeyPressed(KEY_SPACE)) PlaySound(fxWav); // Play WAV sound - if (IsKeyPressed(KEY_ENTER)) PlaySound(fxOgg); // Play OGG sound //---------------------------------------------------------------------------------- diff --git a/examples/audio_standalone.c b/examples/audio_standalone.c new file mode 100644 index 00000000..d090bb83 --- /dev/null +++ b/examples/audio_standalone.c @@ -0,0 +1,123 @@ +/******************************************************************************************* +* +* raylib [audio] example - Using audio module as standalone module +* +* NOTE: This example does not require any graphic device, it can run directly on console. +* +* [audio] module requires some external libs: +* OpenAL Soft - Audio device management lib (http://kcat.strangesoft.net/openal.html) +* stb_vorbis - Ogg audio files loading (http://www.nothings.org/stb_vorbis/) +* jar_xm - XM module file loading +* jar_mod - MOD audio file loading +* +* Compile audio module using: +* gcc -c audio.c stb_vorbis.c -Wall -std=c99 -DAUDIO_STANDALONE +* +* Compile example using: +* gcc -o $(NAME_PART).exe $(FILE_NAME) audio.o stb_vorbis.o -lopenal32 -std=c99 +* +* This example has been created using raylib 1.5 (www.raylib.com) +* raylib is licensed under an unmodified zlib/libpng license (View raylib.h for details) +* +* Copyright (c) 2015 Ramon Santamaria (@raysan5) +* +********************************************************************************************/ + +#include <stdio.h> +#if defined(_WIN32) +#include <conio.h> // Windows only, no stardard library +#endif +#include "audio.h" + +#if defined(__linux) + +#include <stdio.h> +#include <termios.h> +#include <unistd.h> +#include <fcntl.h> + +static int kbhit(void) +{ + struct termios oldt, newt; + int ch; + int oldf; + + tcgetattr(STDIN_FILENO, &oldt); + newt = oldt; + newt.c_lflag &= ~(ICANON | ECHO); + tcsetattr(STDIN_FILENO, TCSANOW, &newt); + oldf = fcntl(STDIN_FILENO, F_GETFL, 0); + fcntl(STDIN_FILENO, F_SETFL, oldf | O_NONBLOCK); + + ch = getchar(); + + tcsetattr(STDIN_FILENO, TCSANOW, &oldt); + fcntl(STDIN_FILENO, F_SETFL, oldf); + + if(ch != EOF) + { + ungetc(ch, stdin); + return 1; + } + + return 0; +} + +static char getch() +{ + return getchar(); +} + +#endif + +#define KEY_ESCAPE 27 + +int main() +{ + // Initialization + //-------------------------------------------------------------------------------------- + unsigned char key; + + InitAudioDevice(); + + Sound fxWav = LoadSound("resources/audio/weird.wav"); // Load WAV audio file + Sound fxOgg = LoadSound("resources/audio/tanatana.ogg"); // Load OGG audio file + + Music music = LoadMusicStream("resources/audio/guitar_noodling.ogg"); + PlayMusicStream(music); + + printf("\nPress s or d to play sounds...\n"); + //-------------------------------------------------------------------------------------- + + // Main loop + while (key != KEY_ESCAPE) + { + if (kbhit()) key = getch(); + + if (key == 's') + { + PlaySound(fxWav); + key = 0; + } + + if (key == 'd') + { + PlaySound(fxOgg); + key = 0; + } + + UpdateMusicStream(music); + } + + // De-Initialization + //-------------------------------------------------------------------------------------- + UnloadSound(fxWav); // Unload sound data + UnloadSound(fxOgg); // Unload sound data + + UnloadMusicStream(music); // Unload music stream data + + CloseAudioDevice(); + //-------------------------------------------------------------------------------------- + + return 0; +} diff --git a/examples/core_2d_camera.c b/examples/core_2d_camera.c new file mode 100644 index 00000000..f2f219ef --- /dev/null +++ b/examples/core_2d_camera.c @@ -0,0 +1,139 @@ +/******************************************************************************************* +* +* raylib [core] example - 2d camera +* +* This example has been created using raylib 1.5 (www.raylib.com) +* raylib is licensed under an unmodified zlib/libpng license (View raylib.h for details) +* +* Copyright (c) 2016 Ramon Santamaria (@raysan5) +* +********************************************************************************************/ + +#include "raylib.h" + +#define MAX_BUILDINGS 100 + +int main() +{ + // Initialization + //-------------------------------------------------------------------------------------- + int screenWidth = 800; + int screenHeight = 450; + + InitWindow(screenWidth, screenHeight, "raylib [core] example - 2d camera"); + + Rectangle player = { 400, 280, 40, 40 }; + Rectangle buildings[MAX_BUILDINGS]; + Color buildColors[MAX_BUILDINGS]; + + int spacing = 0; + + for (int i = 0; i < MAX_BUILDINGS; i++) + { + buildings[i].width = GetRandomValue(50, 200); + buildings[i].height = GetRandomValue(100, 800); + buildings[i].y = screenHeight - 130 - buildings[i].height; + buildings[i].x = -6000 + spacing; + + spacing += buildings[i].width; + + buildColors[i] = (Color){ GetRandomValue(200, 240), GetRandomValue(200, 240), GetRandomValue(200, 250), 255 }; + } + + Camera2D camera; + + camera.target = (Vector2){ player.x + 20, player.y + 20 }; + camera.offset = (Vector2){ 0, 0 }; + camera.rotation = 0.0f; + camera.zoom = 1.0f; + + SetTargetFPS(60); + //-------------------------------------------------------------------------------------- + + // Main game loop + while (!WindowShouldClose()) // Detect window close button or ESC key + { + // Update + //---------------------------------------------------------------------------------- + if (IsKeyDown(KEY_RIGHT)) + { + player.x += 2; // Player movement + camera.offset.x -= 2; // Camera displacement with player movement + } + else if (IsKeyDown(KEY_LEFT)) + { + player.x -= 2; // Player movement + camera.offset.x += 2; // Camera displacement with player movement + } + + // Camera target follows player + camera.target = (Vector2){ player.x + 20, player.y + 20 }; + + // Camera rotation controls + if (IsKeyDown(KEY_A)) camera.rotation--; + else if (IsKeyDown(KEY_S)) camera.rotation++; + + // Limit camera rotation to 80 degrees (-40 to 40) + if (camera.rotation > 40) camera.rotation = 40; + else if (camera.rotation < -40) camera.rotation = -40; + + // Camera zoom controls + camera.zoom += ((float)GetMouseWheelMove()*0.05f); + + if (camera.zoom > 3.0f) camera.zoom = 3.0f; + else if (camera.zoom < 0.1f) camera.zoom = 0.1f; + + // Camera reset (zoom and rotation) + if (IsKeyPressed(KEY_R)) + { + camera.zoom = 1.0f; + camera.rotation = 0.0f; + } + //---------------------------------------------------------------------------------- + + // Draw + //---------------------------------------------------------------------------------- + BeginDrawing(); + + ClearBackground(RAYWHITE); + + Begin2dMode(camera); + + DrawRectangle(-6000, 320, 13000, 8000, DARKGRAY); + + for (int i = 0; i < MAX_BUILDINGS; i++) DrawRectangleRec(buildings[i], buildColors[i]); + + DrawRectangleRec(player, RED); + + DrawRectangle(camera.target.x, -500, 1, screenHeight*4, GREEN); + DrawRectangle(-500, camera.target.y, screenWidth*4, 1, GREEN); + + End2dMode(); + + DrawText("SCREEN AREA", 640, 10, 20, RED); + + DrawRectangle(0, 0, screenWidth, 5, RED); + DrawRectangle(0, 5, 5, screenHeight - 10, RED); + DrawRectangle(screenWidth - 5, 5, 5, screenHeight - 10, RED); + DrawRectangle(0, screenHeight - 5, screenWidth, 5, RED); + + DrawRectangle( 10, 10, 250, 113, Fade(SKYBLUE, 0.5f)); + DrawRectangleLines( 10, 10, 250, 113, BLUE); + + DrawText("Free 2d camera controls:", 20, 20, 10, BLACK); + DrawText("- Right/Left to move Offset", 40, 40, 10, DARKGRAY); + DrawText("- Mouse Wheel to Zoom in-out", 40, 60, 10, DARKGRAY); + DrawText("- A / S to Rotate", 40, 80, 10, DARKGRAY); + DrawText("- R to reset Zoom and Rotation", 40, 100, 10, DARKGRAY); + + EndDrawing(); + //---------------------------------------------------------------------------------- + } + + // De-Initialization + //-------------------------------------------------------------------------------------- + CloseWindow(); // Close window and OpenGL context + //-------------------------------------------------------------------------------------- + + return 0; +}
\ No newline at end of file diff --git a/examples/core_2d_camera.png b/examples/core_2d_camera.png Binary files differnew file mode 100644 index 00000000..d2f9e634 --- /dev/null +++ b/examples/core_2d_camera.png diff --git a/examples/core_3d_camera_first_person.c b/examples/core_3d_camera_first_person.c index 2b8dc7fc..3998af81 100644 --- a/examples/core_3d_camera_first_person.c +++ b/examples/core_3d_camera_first_person.c @@ -23,7 +23,7 @@ int main() InitWindow(screenWidth, screenHeight, "raylib [core] example - 3d camera first person"); // Define the camera to look into our 3d world (position, target, up vector) - Camera camera = {{ 0.0f, 10.0f, 10.0f }, { 0.0f, 0.0f, 0.0f }, { 0.0f, 1.0f, 0.0f }}; + Camera camera = {{ 4.0f, 2.0f, 4.0f }, { 0.0f, 1.8f, 0.0f }, { 0.0f, 1.0f, 0.0f }, 60.0f }; // Generates some random columns float heights[MAX_COLUMNS]; @@ -37,9 +37,7 @@ int main() colors[i] = (Color){ GetRandomValue(20, 255), GetRandomValue(10, 55), 30, 255 }; } - Vector3 playerPosition = { 4.0f, 2.0f, 4.0f }; // Define player position - - SetCameraMode(CAMERA_FIRST_PERSON); // Set a first person camera mode + SetCameraMode(camera, CAMERA_FIRST_PERSON); // Set a first person camera mode SetTargetFPS(60); // Set our game to run at 60 frames-per-second //-------------------------------------------------------------------------------------- @@ -49,7 +47,7 @@ int main() { // Update //---------------------------------------------------------------------------------- - UpdateCameraPlayer(&camera, &playerPosition); // Update camera and player position + UpdateCamera(&camera); // Update camera //---------------------------------------------------------------------------------- // Draw @@ -73,10 +71,13 @@ int main() } End3dMode(); + + DrawRectangle( 10, 10, 220, 70, Fade(SKYBLUE, 0.5f)); + DrawRectangleLines( 10, 10, 220, 70, BLUE); - DrawText("First person camera default controls:", 20, 20, 10, GRAY); - DrawText("- Move with keys: W, A, S, D", 40, 50, 10, DARKGRAY); - DrawText("- Mouse move to look around", 40, 70, 10, DARKGRAY); + DrawText("First person camera default controls:", 20, 20, 10, BLACK); + DrawText("- Move with keys: W, A, S, D", 40, 40, 10, DARKGRAY); + DrawText("- Mouse move to look around", 40, 60, 10, DARKGRAY); EndDrawing(); //---------------------------------------------------------------------------------- diff --git a/examples/core_3d_camera_first_person.png b/examples/core_3d_camera_first_person.png Binary files differindex 9373da2d..a995591f 100644 --- a/examples/core_3d_camera_first_person.png +++ b/examples/core_3d_camera_first_person.png diff --git a/examples/core_3d_camera_free.c b/examples/core_3d_camera_free.c index 4b45373d..d446e14a 100644 --- a/examples/core_3d_camera_free.c +++ b/examples/core_3d_camera_free.c @@ -22,15 +22,14 @@ int main() // Define the camera to look into our 3d world Camera camera; - camera.position = (Vector3){ 0.0f, 10.0f, 10.0f }; // Camera position + camera.position = (Vector3){ 10.0f, 10.0f, 10.0f }; // Camera position camera.target = (Vector3){ 0.0f, 0.0f, 0.0f }; // Camera looking at point camera.up = (Vector3){ 0.0f, 1.0f, 0.0f }; // Camera up vector (rotation towards target) + camera.fovy = 45.0f; // Camera field-of-view Y Vector3 cubePosition = { 0.0f, 0.0f, 0.0f }; - SetCameraMode(CAMERA_FREE); // Set a free camera mode - SetCameraPosition(camera.position); // Set internal camera position to match our camera position - SetCameraTarget(camera.target); // Set internal camera target to match our camera target + SetCameraMode(camera, CAMERA_FREE); // Set a free camera mode SetTargetFPS(60); // Set our game to run at 60 frames-per-second //-------------------------------------------------------------------------------------- @@ -40,7 +39,9 @@ int main() { // Update //---------------------------------------------------------------------------------- - UpdateCamera(&camera); // Update internal camera and our camera + UpdateCamera(&camera); // Update camera + + if (IsKeyDown('Z')) camera.target = (Vector3){ 0.0f, 0.0f, 0.0f }; //---------------------------------------------------------------------------------- // Draw @@ -57,13 +58,16 @@ int main() DrawGrid(10, 1.0f); End3dMode(); - - DrawText("Free camera default controls:", 20, 20, 10, GRAY); - DrawText("- Mouse Wheel to Zoom in-out", 40, 50, 10, DARKGRAY); - DrawText("- Mouse Wheel Pressed to Pan", 40, 70, 10, DARKGRAY); - DrawText("- Alt + Mouse Wheel Pressed to Rotate", 40, 90, 10, DARKGRAY); - DrawText("- Alt + Ctrl + Mouse Wheel Pressed for Smooth Zoom", 40, 110, 10, DARKGRAY); - DrawText("- Z to zoom to (0, 0, 0)", 40, 130, 10, DARKGRAY); + + DrawRectangle( 10, 10, 320, 133, Fade(SKYBLUE, 0.5f)); + DrawRectangleLines( 10, 10, 320, 133, BLUE); + + DrawText("Free camera default controls:", 20, 20, 10, BLACK); + DrawText("- Mouse Wheel to Zoom in-out", 40, 40, 10, DARKGRAY); + DrawText("- Mouse Wheel Pressed to Pan", 40, 60, 10, DARKGRAY); + DrawText("- Alt + Mouse Wheel Pressed to Rotate", 40, 80, 10, DARKGRAY); + DrawText("- Alt + Ctrl + Mouse Wheel Pressed for Smooth Zoom", 40, 100, 10, DARKGRAY); + DrawText("- Z to zoom to (0, 0, 0)", 40, 120, 10, DARKGRAY); EndDrawing(); //---------------------------------------------------------------------------------- diff --git a/examples/core_3d_camera_free.png b/examples/core_3d_camera_free.png Binary files differindex 17920620..7874eedc 100644 --- a/examples/core_3d_camera_free.png +++ b/examples/core_3d_camera_free.png diff --git a/examples/core_3d_mode.c b/examples/core_3d_mode.c index 7be5dd45..5f761655 100644 --- a/examples/core_3d_mode.c +++ b/examples/core_3d_mode.c @@ -25,6 +25,7 @@ int main() camera.position = (Vector3){ 0.0f, 10.0f, 10.0f }; // Camera position camera.target = (Vector3){ 0.0f, 0.0f, 0.0f }; // Camera looking at point camera.up = (Vector3){ 0.0f, 1.0f, 0.0f }; // Camera up vector (rotation towards target) + camera.fovy = 45.0f; // Camera field-of-view Y Vector3 cubePosition = { 0.0f, 0.0f, 0.0f }; diff --git a/examples/core_3d_picking.c b/examples/core_3d_picking.c index fdf77030..bd5c3347 100644 --- a/examples/core_3d_picking.c +++ b/examples/core_3d_picking.c @@ -22,9 +22,10 @@ int main() // Define the camera to look into our 3d world Camera camera; - camera.position = (Vector3){ 0.0f, 10.0f, 10.0f }; // Camera position + camera.position = (Vector3){ 10.0f, 10.0f, 10.0f }; // Camera position camera.target = (Vector3){ 0.0f, 0.0f, 0.0f }; // Camera looking at point camera.up = (Vector3){ 0.0f, 1.0f, 0.0f }; // Camera up vector (rotation towards target) + camera.fovy = 45.0f; // Camera field-of-view Y Vector3 cubePosition = { 0.0f, 1.0f, 0.0f }; Vector3 cubeSize = { 2.0f, 2.0f, 2.0f }; @@ -33,8 +34,7 @@ int main() bool collision = false; - SetCameraMode(CAMERA_FREE); // Set a free camera mode - SetCameraPosition(camera.position); // Set internal camera position to match our camera position + SetCameraMode(camera, CAMERA_FREE); // Set a free camera mode SetTargetFPS(60); // Set our game to run at 60 frames-per-second //-------------------------------------------------------------------------------------- @@ -44,7 +44,7 @@ int main() { // Update //---------------------------------------------------------------------------------- - UpdateCamera(&camera); // Update internal camera and our camera + UpdateCamera(&camera); // Update camera if (IsMouseButtonPressed(MOUSE_LEFT_BUTTON)) { @@ -53,8 +53,8 @@ int main() // Check collision between ray and box collision = CheckCollisionRayBox(ray, - (Vector3){ cubePosition.x - cubeSize.x/2, cubePosition.y - cubeSize.y/2, cubePosition.z - cubeSize.z/2 }, - (Vector3){ cubePosition.x + cubeSize.x/2, cubePosition.y + cubeSize.y/2, cubePosition.z + cubeSize.z/2 }); + (BoundingBox){(Vector3){ cubePosition.x - cubeSize.x/2, cubePosition.y - cubeSize.y/2, cubePosition.z - cubeSize.z/2 }, + (Vector3){ cubePosition.x + cubeSize.x/2, cubePosition.y + cubeSize.y/2, cubePosition.z + cubeSize.z/2 }}); } //---------------------------------------------------------------------------------- @@ -66,8 +66,18 @@ int main() Begin3dMode(camera); - DrawCube(cubePosition, cubeSize.x, cubeSize.y, cubeSize.z, GRAY); - DrawCubeWires(cubePosition, cubeSize.x, cubeSize.y, cubeSize.z, DARKGRAY); + if (collision) + { + DrawCube(cubePosition, cubeSize.x, cubeSize.y, cubeSize.z, RED); + DrawCubeWires(cubePosition, cubeSize.x, cubeSize.y, cubeSize.z, MAROON); + + DrawCubeWires(cubePosition, cubeSize.x + 0.2f, cubeSize.y + 0.2f, cubeSize.z + 0.2f, GREEN); + } + else + { + DrawCube(cubePosition, cubeSize.x, cubeSize.y, cubeSize.z, GRAY); + DrawCubeWires(cubePosition, cubeSize.x, cubeSize.y, cubeSize.z, DARKGRAY); + } DrawRay(ray, MAROON); @@ -75,7 +85,7 @@ int main() End3dMode(); - DrawText("Try selecting the box with mouse!", 240, 10, 20, GRAY); + DrawText("Try selecting the box with mouse!", 240, 10, 20, DARKGRAY); if(collision) DrawText("BOX SELECTED", (screenWidth - MeasureText("BOX SELECTED", 30)) / 2, screenHeight * 0.1f, 30, GREEN); diff --git a/examples/core_3d_picking.png b/examples/core_3d_picking.png Binary files differindex bb7660b0..254f2f88 100644 --- a/examples/core_3d_picking.png +++ b/examples/core_3d_picking.png diff --git a/examples/core_basic_window.cpp b/examples/core_basic_window.cpp new file mode 100644 index 00000000..fa12026a --- /dev/null +++ b/examples/core_basic_window.cpp @@ -0,0 +1,62 @@ +/******************************************************************************************* +* +* raylib [core] example - Basic window +* +* Welcome to raylib! +* +* To test examples, just press F6 and execute raylib_compile_execute script +* Note that compiled executable is placed in the same folder as .c file +* +* You can find all basic examples on C:\raylib\raylib\examples folder or +* raylib official webpage: www.raylib.com +* +* Enjoy using raylib. :) +* +* This example has been created using raylib 1.0 (www.raylib.com) +* raylib is licensed under an unmodified zlib/libpng license (View raylib.h for details) +* +* Copyright (c) 2014 Ramon Santamaria (@raysan5) +* +********************************************************************************************/ + +#include "raylib.h" + +int main(int argc, char* argv[]) +{ + // Initialization + //-------------------------------------------------------------------------------------- + int screenWidth = 800; + int screenHeight = 450; + + InitWindow(screenWidth, screenHeight, "raylib [core] example - basic window"); + + SetTargetFPS(60); + //-------------------------------------------------------------------------------------- + + // Main game loop + while (!WindowShouldClose()) // Detect window close button or ESC key + { + // Update + //---------------------------------------------------------------------------------- + // TODO: Update your variables here + //---------------------------------------------------------------------------------- + + // Draw + //---------------------------------------------------------------------------------- + BeginDrawing(); + + ClearBackground(RAYWHITE); + + DrawText("Congrats! You created your first window!", 190, 200, 20, LIGHTGRAY); + + EndDrawing(); + //---------------------------------------------------------------------------------- + } + + // De-Initialization + //-------------------------------------------------------------------------------------- + CloseWindow(); // Close window and OpenGL context + //-------------------------------------------------------------------------------------- + + return 0; +}
\ No newline at end of file diff --git a/examples/core_color_select.c b/examples/core_color_select.c index 118dc88a..002a6931 100644 --- a/examples/core_color_select.c +++ b/examples/core_color_select.c @@ -16,7 +16,7 @@ int main() // Initialization //-------------------------------------------------------------------------------------- int screenWidth = 800; - int screenHeight = 400; + int screenHeight = 450; InitWindow(screenWidth, screenHeight, "raylib [core] example - color selection (collision detection)"); @@ -30,7 +30,7 @@ int main() for (int i = 0; i < 21; i++) { colorsRecs[i].x = 20 + 100*(i%7) + 10*(i%7); - colorsRecs[i].y = 40 + 100*(i/7) + 10*(i/7); + colorsRecs[i].y = 60 + 100*(i/7) + 10*(i/7); colorsRecs[i].width = 100; colorsRecs[i].height = 100; } diff --git a/examples/core_drop_files.c b/examples/core_drop_files.c index 5eea35f3..5c1501b8 100644 --- a/examples/core_drop_files.c +++ b/examples/core_drop_files.c @@ -23,7 +23,7 @@ int main() InitWindow(screenWidth, screenHeight, "raylib [core] example - drop files"); int count = 0; - char **droppedFiles; + char **droppedFiles = { 0 }; SetTargetFPS(60); //-------------------------------------------------------------------------------------- diff --git a/examples/core_gestures_detection.c b/examples/core_gestures_detection.c index b69497c5..63a1e6bd 100644 --- a/examples/core_gestures_detection.c +++ b/examples/core_gestures_detection.c @@ -34,7 +34,7 @@ int main() //SetGesturesEnabled(0b0000000000001001); // Enable only some gestures to be detected - SetTargetFPS(30); + SetTargetFPS(60); //-------------------------------------------------------------------------------------- // Main game loop @@ -43,12 +43,11 @@ int main() // Update //---------------------------------------------------------------------------------- lastGesture = currentGesture; + currentGesture = GetGestureDetected(); touchPosition = GetTouchPosition(0); - - if (CheckCollisionPointRec(touchPosition, touchArea) && IsGestureDetected()) + + if (CheckCollisionPointRec(touchPosition, touchArea) && (currentGesture != GESTURE_NONE)) { - currentGesture = GetGestureType(); - if (currentGesture != lastGesture) { // Store gesture string @@ -62,6 +61,8 @@ int main() case GESTURE_SWIPE_LEFT: strcpy(gestureStrings[gesturesCount], "GESTURE SWIPE LEFT"); break; case GESTURE_SWIPE_UP: strcpy(gestureStrings[gesturesCount], "GESTURE SWIPE UP"); break; case GESTURE_SWIPE_DOWN: strcpy(gestureStrings[gesturesCount], "GESTURE SWIPE DOWN"); break; + case GESTURE_PINCH_IN: strcpy(gestureStrings[gesturesCount], "GESTURE PINCH IN"); break; + case GESTURE_PINCH_OUT: strcpy(gestureStrings[gesturesCount], "GESTURE PINCH OUT"); break; default: break; } @@ -76,7 +77,6 @@ int main() } } } - else currentGesture = GESTURE_NONE; //---------------------------------------------------------------------------------- // Draw diff --git a/examples/core_input_gamepad.c b/examples/core_input_gamepad.c index 1de2d424..f98885e3 100644 --- a/examples/core_input_gamepad.c +++ b/examples/core_input_gamepad.c @@ -3,17 +3,29 @@ * raylib [core] example - Gamepad input * * NOTE: This example requires a Gamepad connected to the system -* raylib is configured to work with Xbox 360 gamepad, check raylib.h for buttons configuration +* raylib is configured to work with the following gamepads: +* Xbox 360 Controller (Xbox 360, Xbox One) +* PLAYSTATION(R)3 Controller +* Check raylib.h for buttons configuration * -* This example has been created using raylib 1.0 (www.raylib.com) +* This example has been created using raylib 1.6 (www.raylib.com) * raylib is licensed under an unmodified zlib/libpng license (View raylib.h for details) * -* Copyright (c) 2014 Ramon Santamaria (@raysan5) +* Copyright (c) 2013-2016 Ramon Santamaria (@raysan5) * ********************************************************************************************/ #include "raylib.h" +// NOTE: Gamepad name ID depends on drivers and OS +#if defined(PLATFORM_RPI) + #define XBOX360_NAME_ID "Microsoft X-Box 360 pad" + #define PS3_NAME_ID "PLAYSTATION(R)3 Controller" +#else + #define XBOX360_NAME_ID "Xbox 360 Controller" + #define PS3_NAME_ID "PLAYSTATION(R)3 Controller" +#endif + int main() { // Initialization @@ -21,12 +33,14 @@ int main() int screenWidth = 800; int screenHeight = 450; + SetConfigFlags(FLAG_MSAA_4X_HINT); // Set MSAA 4X hint before windows creation + InitWindow(screenWidth, screenHeight, "raylib [core] example - gamepad input"); + + Texture2D texPs3Pad = LoadTexture("resources/ps3.png"); + Texture2D texXboxPad = LoadTexture("resources/xbox.png"); - Vector2 ballPosition = { (float)screenWidth/2, (float)screenHeight/2 }; - Vector2 gamepadMovement = { 0.0f, 0.0f }; - - SetTargetFPS(60); // Set target frames-per-second + SetTargetFPS(60); //-------------------------------------------------------------------------------------- // Main game loop @@ -34,19 +48,7 @@ int main() { // Update //---------------------------------------------------------------------------------- - if (IsGamepadAvailable(GAMEPAD_PLAYER1)) - { - gamepadMovement = GetGamepadMovement(GAMEPAD_PLAYER1); - - ballPosition.x += gamepadMovement.x; - ballPosition.y -= gamepadMovement.y; - - if (IsGamepadButtonPressed(GAMEPAD_PLAYER1, GAMEPAD_BUTTON_A)) - { - ballPosition.x = (float)screenWidth/2; - ballPosition.y = (float)screenHeight/2; - } - } + // ... //---------------------------------------------------------------------------------- // Draw @@ -54,10 +56,127 @@ int main() BeginDrawing(); ClearBackground(RAYWHITE); + + if (IsGamepadAvailable(GAMEPAD_PLAYER1)) + { + DrawText(FormatText("GP1: %s", GetGamepadName(GAMEPAD_PLAYER1)), 10, 10, 10, BLACK); + + if (IsGamepadName(GAMEPAD_PLAYER1, XBOX360_NAME_ID)) + { + DrawTexture(texXboxPad, 0, 0, DARKGRAY); + + // Draw buttons: xbox home + if (IsGamepadButtonDown(GAMEPAD_PLAYER1, GAMEPAD_XBOX_BUTTON_HOME)) DrawCircle(394, 89, 19, RED); - DrawText("move the ball with gamepad", 10, 10, 20, DARKGRAY); + // Draw buttons: basic + if (IsGamepadButtonDown(GAMEPAD_PLAYER1, GAMEPAD_XBOX_BUTTON_START)) DrawCircle(436, 150, 9, RED); + if (IsGamepadButtonDown(GAMEPAD_PLAYER1, GAMEPAD_XBOX_BUTTON_SELECT)) DrawCircle(352, 150, 9, RED); + if (IsGamepadButtonDown(GAMEPAD_PLAYER1, GAMEPAD_XBOX_BUTTON_X)) DrawCircle(501, 151, 15, BLUE); + if (IsGamepadButtonDown(GAMEPAD_PLAYER1, GAMEPAD_XBOX_BUTTON_A)) DrawCircle(536, 187, 15, LIME); + if (IsGamepadButtonDown(GAMEPAD_PLAYER1, GAMEPAD_XBOX_BUTTON_B)) DrawCircle(572, 151, 15, MAROON); + if (IsGamepadButtonDown(GAMEPAD_PLAYER1, GAMEPAD_XBOX_BUTTON_Y)) DrawCircle(536, 115, 15, GOLD); + + // Draw buttons: d-pad + DrawRectangle(317, 202, 19, 71, BLACK); + DrawRectangle(293, 228, 69, 19, BLACK); + if (IsGamepadButtonDown(GAMEPAD_PLAYER1, GAMEPAD_XBOX_BUTTON_UP)) DrawRectangle(317, 202, 19, 26, RED); + if (IsGamepadButtonDown(GAMEPAD_PLAYER1, GAMEPAD_XBOX_BUTTON_DOWN)) DrawRectangle(317, 202 + 45, 19, 26, RED); + if (IsGamepadButtonDown(GAMEPAD_PLAYER1, GAMEPAD_XBOX_BUTTON_LEFT)) DrawRectangle(292, 228, 25, 19, RED); + if (IsGamepadButtonDown(GAMEPAD_PLAYER1, GAMEPAD_XBOX_BUTTON_RIGHT)) DrawRectangle(292 + 44, 228, 26, 19, RED); + + // Draw buttons: left-right back + if (IsGamepadButtonDown(GAMEPAD_PLAYER1, GAMEPAD_XBOX_BUTTON_LB)) DrawCircle(259, 61, 20, RED); + if (IsGamepadButtonDown(GAMEPAD_PLAYER1, GAMEPAD_XBOX_BUTTON_RB)) DrawCircle(536, 61, 20, RED); - DrawCircleV(ballPosition, 50, MAROON); + // Draw axis: left joystick + DrawCircle(259, 152, 39, BLACK); + DrawCircle(259, 152, 34, LIGHTGRAY); + DrawCircle(259 + (GetGamepadAxisMovement(GAMEPAD_PLAYER1, GAMEPAD_XBOX_AXIS_LEFT_X)*20), + 152 - (GetGamepadAxisMovement(GAMEPAD_PLAYER1, GAMEPAD_XBOX_AXIS_LEFT_Y)*20), 25, BLACK); + + // Draw axis: right joystick + DrawCircle(461, 237, 38, BLACK); + DrawCircle(461, 237, 33, LIGHTGRAY); + DrawCircle(461 + (GetGamepadAxisMovement(GAMEPAD_PLAYER1, GAMEPAD_XBOX_AXIS_RIGHT_X)*20), + 237 - (GetGamepadAxisMovement(GAMEPAD_PLAYER1, GAMEPAD_XBOX_AXIS_RIGHT_Y)*20), 25, BLACK); + + // Draw axis: left-right triggers + DrawRectangle(170, 30, 15, 70, GRAY); + DrawRectangle(604, 30, 15, 70, GRAY); + DrawRectangle(170, 30, 15, (((1.0f + GetGamepadAxisMovement(GAMEPAD_PLAYER1, GAMEPAD_XBOX_AXIS_LT))/2.0f)*70), RED); + DrawRectangle(604, 30, 15, (((1.0f + GetGamepadAxisMovement(GAMEPAD_PLAYER1, GAMEPAD_XBOX_AXIS_RT))/2.0f)*70), RED); + + //DrawText(FormatText("Xbox axis LT: %02.02f", GetGamepadAxisMovement(GAMEPAD_PLAYER1, GAMEPAD_XBOX_AXIS_LT)), 10, 40, 10, BLACK); + //DrawText(FormatText("Xbox axis RT: %02.02f", GetGamepadAxisMovement(GAMEPAD_PLAYER1, GAMEPAD_XBOX_AXIS_RT)), 10, 60, 10, BLACK); + } + else if (IsGamepadName(GAMEPAD_PLAYER1, PS3_NAME_ID)) + { + DrawTexture(texPs3Pad, 0, 0, DARKGRAY); + + // Draw buttons: ps + if (IsGamepadButtonDown(GAMEPAD_PLAYER1, GAMEPAD_PS3_BUTTON_PS)) DrawCircle(396, 222, 13, RED); + + // Draw buttons: basic + if (IsGamepadButtonDown(GAMEPAD_PLAYER1, GAMEPAD_PS3_BUTTON_SELECT)) DrawRectangle(328, 170, 32, 13, RED); + if (IsGamepadButtonDown(GAMEPAD_PLAYER1, GAMEPAD_PS3_BUTTON_START)) DrawTriangle((Vector2){ 436, 168 }, (Vector2){ 436, 185 }, (Vector2){ 464, 177 }, RED); + if (IsGamepadButtonDown(GAMEPAD_PLAYER1, GAMEPAD_PS3_BUTTON_TRIANGLE)) DrawCircle(557, 144, 13, LIME); + if (IsGamepadButtonDown(GAMEPAD_PLAYER1, GAMEPAD_PS3_BUTTON_CIRCLE)) DrawCircle(586, 173, 13, RED); + if (IsGamepadButtonDown(GAMEPAD_PLAYER1, GAMEPAD_PS3_BUTTON_CROSS)) DrawCircle(557, 203, 13, VIOLET); + if (IsGamepadButtonDown(GAMEPAD_PLAYER1, GAMEPAD_PS3_BUTTON_SQUARE)) DrawCircle(527, 173, 13, PINK); + + // Draw buttons: d-pad + DrawRectangle(225, 132, 24, 84, BLACK); + DrawRectangle(195, 161, 84, 25, BLACK); + if (IsGamepadButtonDown(GAMEPAD_PLAYER1, GAMEPAD_PS3_BUTTON_UP)) DrawRectangle(225, 132, 24, 29, RED); + if (IsGamepadButtonDown(GAMEPAD_PLAYER1, GAMEPAD_PS3_BUTTON_DOWN)) DrawRectangle(225, 132 + 54, 24, 30, RED); + if (IsGamepadButtonDown(GAMEPAD_PLAYER1, GAMEPAD_PS3_BUTTON_LEFT)) DrawRectangle(195, 161, 30, 25, RED); + if (IsGamepadButtonDown(GAMEPAD_PLAYER1, GAMEPAD_PS3_BUTTON_RIGHT)) DrawRectangle(195 + 54, 161, 30, 25, RED); + + // Draw buttons: left-right back buttons + if (IsGamepadButtonDown(GAMEPAD_PLAYER1, GAMEPAD_PS3_BUTTON_L1)) DrawCircle(239, 82, 20, RED); + if (IsGamepadButtonDown(GAMEPAD_PLAYER1, GAMEPAD_PS3_BUTTON_R1)) DrawCircle(557, 82, 20, RED); + + // Draw axis: left joystick + DrawCircle(319, 255, 35, BLACK); + DrawCircle(319, 255, 31, LIGHTGRAY); + DrawCircle(319 + (GetGamepadAxisMovement(GAMEPAD_PLAYER1, GAMEPAD_PS3_AXIS_LEFT_X)*20), + 255 + (GetGamepadAxisMovement(GAMEPAD_PLAYER1, GAMEPAD_PS3_AXIS_LEFT_Y)*20), 25, BLACK); + + // Draw axis: right joystick + DrawCircle(475, 255, 35, BLACK); + DrawCircle(475, 255, 31, LIGHTGRAY); + DrawCircle(475 + (GetGamepadAxisMovement(GAMEPAD_PLAYER1, GAMEPAD_PS3_AXIS_RIGHT_X)*20), + 255 + (GetGamepadAxisMovement(GAMEPAD_PLAYER1, GAMEPAD_PS3_AXIS_RIGHT_Y)*20), 25, BLACK); + + // Draw axis: left-right triggers + DrawRectangle(169, 48, 15, 70, GRAY); + DrawRectangle(611, 48, 15, 70, GRAY); + DrawRectangle(169, 48, 15, (((1.0f - GetGamepadAxisMovement(GAMEPAD_PLAYER1, GAMEPAD_PS3_AXIS_L2))/2.0f)*70), RED); + DrawRectangle(611, 48, 15, (((1.0f - GetGamepadAxisMovement(GAMEPAD_PLAYER1, GAMEPAD_PS3_AXIS_R2))/2.0f)*70), RED); + } + else + { + DrawText("- GENERIC GAMEPAD -", 280, 180, 20, GRAY); + + // TODO: Draw generic gamepad + } + + DrawText(FormatText("DETECTED AXIS [%i]:", GetGamepadAxisCount(GAMEPAD_PLAYER1)), 10, 50, 10, MAROON); + + for (int i = 0; i < GetGamepadAxisCount(GAMEPAD_PLAYER1); i++) + { + DrawText(FormatText("AXIS %i: %.02f", i, GetGamepadAxisMovement(GAMEPAD_PLAYER1, i)), 20, 70 + 20*i, 10, DARKGRAY); + } + + if (GetGamepadButtonPressed() != -1) DrawText(FormatText("DETECTED BUTTON: %i", GetGamepadButtonPressed()), 10, 430, 10, RED); + else DrawText("DETECTED BUTTON: NONE", 10, 430, 10, GRAY); + } + else + { + DrawText("GP1: NOT DETECTED", 10, 10, 10, GRAY); + + DrawTexture(texXboxPad, 0, 0, LIGHTGRAY); + } EndDrawing(); //---------------------------------------------------------------------------------- @@ -65,6 +184,9 @@ int main() // De-Initialization //-------------------------------------------------------------------------------------- + UnloadTexture(texPs3Pad); + UnloadTexture(texXboxPad); + CloseWindow(); // Close window and OpenGL context //-------------------------------------------------------------------------------------- diff --git a/examples/core_input_gamepad.png b/examples/core_input_gamepad.png Binary files differindex f7e55658..5996eece 100644 --- a/examples/core_input_gamepad.png +++ b/examples/core_input_gamepad.png diff --git a/examples/core_input_mouse.png b/examples/core_input_mouse.png Binary files differindex 76567281..a96e7faf 100644 --- a/examples/core_input_mouse.png +++ b/examples/core_input_mouse.png diff --git a/examples/core_oculus_rift.c b/examples/core_oculus_rift.c new file mode 100644 index 00000000..eb628cd7 --- /dev/null +++ b/examples/core_oculus_rift.c @@ -0,0 +1,85 @@ +/******************************************************************************************* +* +* raylib [core] example - Oculus Rift CV1 +* +* Compile example using: +* gcc -o $(NAME_PART).exe $(FILE_NAME) -L. -L..\src\external\OculusSDK\LibOVR -lLibOVRRT32_1 -lraylib -lglfw3 -lopengl32 -lgdi32 -std=c99 +* +* This example has been created using raylib 1.5 (www.raylib.com) +* raylib is licensed under an unmodified zlib/libpng license (View raylib.h for details) +* +* Copyright (c) 2016 Ramon Santamaria (@raysan5) +* +********************************************************************************************/ + +#include "raylib.h" + +int main() +{ + // Initialization + //-------------------------------------------------------------------------------------- + int screenWidth = 1080; + int screenHeight = 600; + + // NOTE: screenWidth/screenHeight should match VR device aspect ratio + + InitWindow(screenWidth, screenHeight, "raylib [core] example - oculus rift"); + + // NOTE: If device is not available, it fallbacks to default device (simulator) + InitVrDevice(HMD_OCULUS_RIFT_CV1); // Init VR device (Oculus Rift CV1) + + // Define the camera to look into our 3d world + Camera camera; + camera.position = (Vector3){ 5.0f, 2.0f, 5.0f }; // Camera position + camera.target = (Vector3){ 0.0f, 2.0f, 0.0f }; // Camera looking at point + camera.up = (Vector3){ 0.0f, 1.0f, 0.0f }; // Camera up vector (rotation towards target) + camera.fovy = 60.0f; // Camera field-of-view Y + + Vector3 cubePosition = { 0.0f, 0.0f, 0.0f }; + + SetCameraMode(camera, CAMERA_FIRST_PERSON); // Set first person camera mode + + SetTargetFPS(90); // Set our game to run at 90 frames-per-second + //-------------------------------------------------------------------------------------- + + // Main game loop + while (!WindowShouldClose()) // Detect window close button or ESC key + { + // Update + //---------------------------------------------------------------------------------- + if (IsVrSimulator()) UpdateCamera(&camera); // Update camera (simulator mode) + else if (IsVrDeviceReady()) UpdateVrTracking(&camera); // Update camera with device tracking data + + if (IsKeyPressed(KEY_SPACE)) ToggleVrMode(); // Toggle VR mode + //---------------------------------------------------------------------------------- + + // Draw + //---------------------------------------------------------------------------------- + BeginDrawing(); + + ClearBackground(RAYWHITE); + + Begin3dMode(camera); + + DrawCube(cubePosition, 2.0f, 2.0f, 2.0f, RED); + DrawCubeWires(cubePosition, 2.0f, 2.0f, 2.0f, MAROON); + + DrawGrid(40, 1.0f); + + End3dMode(); + + DrawFPS(10, 10); + + EndDrawing(); + //---------------------------------------------------------------------------------- + } + + // De-Initialization + //-------------------------------------------------------------------------------------- + CloseVrDevice(); // Close VR device + + CloseWindow(); // Close window and OpenGL context + //-------------------------------------------------------------------------------------- + + return 0; +} diff --git a/examples/core_oculus_rift.png b/examples/core_oculus_rift.png Binary files differnew file mode 100644 index 00000000..aa4d0932 --- /dev/null +++ b/examples/core_oculus_rift.png diff --git a/examples/core_world_screen.c b/examples/core_world_screen.c index b70b40dd..f8c53c70 100644 --- a/examples/core_world_screen.c +++ b/examples/core_world_screen.c @@ -21,15 +21,13 @@ int main() InitWindow(screenWidth, screenHeight, "raylib [core] example - 3d camera free"); // Define the camera to look into our 3d world - Camera camera = {{ 0.0f, 10.0f, 10.0f }, { 0.0f, 0.0f, 0.0f }, { 0.0f, 1.0f, 0.0f }}; + Camera camera = {{ 10.0f, 10.0f, 10.0f }, { 0.0f, 0.0f, 0.0f }, { 0.0f, 1.0f, 0.0f }, 45.0f }; Vector3 cubePosition = { 0.0f, 0.0f, 0.0f }; Vector2 cubeScreenPosition; - SetCameraMode(CAMERA_FREE); // Set a free camera mode - SetCameraPosition(camera.position); // Set internal camera position to match our camera position - SetCameraTarget(camera.target); // Set internal camera target to match our camera target + SetCameraMode(camera, CAMERA_FREE); // Set a free camera mode SetTargetFPS(60); // Set our game to run at 60 frames-per-second //-------------------------------------------------------------------------------------- @@ -39,10 +37,10 @@ int main() { // Update //---------------------------------------------------------------------------------- - UpdateCamera(&camera); // Update internal camera and our camera + UpdateCamera(&camera); // Update camera // Calculate cube screen space position (with a little offset to be in top) - cubeScreenPosition = WorldToScreen((Vector3){cubePosition.x, cubePosition.y + 2.5f, cubePosition.z}, camera); + cubeScreenPosition = GetWorldToScreen((Vector3){cubePosition.x, cubePosition.y + 2.5f, cubePosition.z}, camera); //---------------------------------------------------------------------------------- // Draw @@ -62,7 +60,6 @@ int main() DrawText("Enemy: 100 / 100", cubeScreenPosition.x - MeasureText("Enemy: 100 / 100", 20) / 2, cubeScreenPosition.y, 20, BLACK); DrawText("Text is always on top of the cube", (screenWidth - MeasureText("Text is always on top of the cube", 20)) / 2, 25, 20, GRAY); - EndDrawing(); //---------------------------------------------------------------------------------- diff --git a/examples/core_world_screen.png b/examples/core_world_screen.png Binary files differnew file mode 100644 index 00000000..b4853b45 --- /dev/null +++ b/examples/core_world_screen.png diff --git a/examples/lighting_blinn_phong.png b/examples/lighting_blinn_phong.png Binary files differdeleted file mode 100644 index 4a3c5d18..00000000 --- a/examples/lighting_blinn_phong.png +++ /dev/null diff --git a/examples/models_billboard.c b/examples/models_billboard.c index bac42d35..bca9faf8 100644 --- a/examples/models_billboard.c +++ b/examples/models_billboard.c @@ -21,24 +21,22 @@ int main() InitWindow(screenWidth, screenHeight, "raylib [models] example - drawing billboards"); // Define the camera to look into our 3d world - Camera camera = {{ 5.0f, 4.0f, 5.0f }, { 0.0f, 2.0f, 0.0f }, { 0.0f, 1.0f, 0.0f }}; + Camera camera = {{ 5.0f, 4.0f, 5.0f }, { 0.0f, 2.0f, 0.0f }, { 0.0f, 1.0f, 0.0f }, 45.0f }; Texture2D bill = LoadTexture("resources/billboard.png"); // Our texture billboard Vector3 billPosition = { 0.0f, 2.0f, 0.0f }; // Position where draw billboard - SetCameraMode(CAMERA_ORBITAL); // Set an orbital camera mode - SetCameraPosition(camera.position); // Set internal camera position to match our camera position - SetCameraTarget(camera.target); // Set internal camera target to match our camera target + SetCameraMode(camera, CAMERA_ORBITAL); // Set an orbital camera mode - SetTargetFPS(60); // Set our game to run at 60 frames-per-second + SetTargetFPS(60); // Set our game to run at 60 frames-per-second //-------------------------------------------------------------------------------------- // Main game loop - while (!WindowShouldClose()) // Detect window close button or ESC key + while (!WindowShouldClose()) // Detect window close button or ESC key { // Update //---------------------------------------------------------------------------------- - UpdateCamera(&camera); // Update internal camera and our camera + UpdateCamera(&camera); // Update camera //---------------------------------------------------------------------------------- // Draw diff --git a/examples/models_box_collisions.c b/examples/models_box_collisions.c index 3751041f..69cec418 100644 --- a/examples/models_box_collisions.c +++ b/examples/models_box_collisions.c @@ -21,7 +21,7 @@ int main() InitWindow(screenWidth, screenHeight, "raylib [models] example - box collisions"); // Define the camera to look into our 3d world - Camera camera = {{ 0.0f, 10.0f, 10.0f }, { 0.0f, 0.0f, 0.0f }, { 0.0f, 1.0f, 0.0f }}; + Camera camera = {{ 0.0f, 10.0f, 10.0f }, { 0.0f, 0.0f, 0.0f }, { 0.0f, 1.0f, 0.0f }, 45.0f }; Vector3 playerPosition = { 0.0f, 1.0f, 2.0f }; Vector3 playerSize = { 1.0f, 2.0f, 1.0f }; @@ -53,27 +53,29 @@ int main() collision = false; // Check collisions player vs enemy-box - if (CheckCollisionBoxes((Vector3){ playerPosition.x - playerSize.x/2, - playerPosition.y - playerSize.y/2, - playerPosition.z - playerSize.z/2 }, - (Vector3){ playerPosition.x + playerSize.x/2, - playerPosition.y + playerSize.y/2, - playerPosition.z + playerSize.z/2 }, - (Vector3){ enemyBoxPos.x - enemyBoxSize.x/2, - enemyBoxPos.y - enemyBoxSize.y/2, - enemyBoxPos.z - enemyBoxSize.z/2 }, - (Vector3){ enemyBoxPos.x + enemyBoxSize.x/2, - enemyBoxPos.y + enemyBoxSize.y/2, - enemyBoxPos.z + enemyBoxSize.z/2 })) collision = true; + if (CheckCollisionBoxes( + (BoundingBox){(Vector3){ playerPosition.x - playerSize.x/2, + playerPosition.y - playerSize.y/2, + playerPosition.z - playerSize.z/2 }, + (Vector3){ playerPosition.x + playerSize.x/2, + playerPosition.y + playerSize.y/2, + playerPosition.z + playerSize.z/2 }}, + (BoundingBox){(Vector3){ enemyBoxPos.x - enemyBoxSize.x/2, + enemyBoxPos.y - enemyBoxSize.y/2, + enemyBoxPos.z - enemyBoxSize.z/2 }, + (Vector3){ enemyBoxPos.x + enemyBoxSize.x/2, + enemyBoxPos.y + enemyBoxSize.y/2, + enemyBoxPos.z + enemyBoxSize.z/2 }})) collision = true; // Check collisions player vs enemy-sphere - if (CheckCollisionBoxSphere((Vector3){ playerPosition.x - playerSize.x/2, - playerPosition.y - playerSize.y/2, - playerPosition.z - playerSize.z/2 }, - (Vector3){ playerPosition.x + playerSize.x/2, - playerPosition.y + playerSize.y/2, - playerPosition.z + playerSize.z/2 }, - enemySpherePos, enemySphereSize)) collision = true; + if (CheckCollisionBoxSphere( + (BoundingBox){(Vector3){ playerPosition.x - playerSize.x/2, + playerPosition.y - playerSize.y/2, + playerPosition.z - playerSize.z/2 }, + (Vector3){ playerPosition.x + playerSize.x/2, + playerPosition.y + playerSize.y/2, + playerPosition.z + playerSize.z/2 }}, + enemySpherePos, enemySphereSize)) collision = true; if (collision) playerColor = RED; else playerColor = GREEN; diff --git a/examples/models_cubicmap.c b/examples/models_cubicmap.c index e2a902ef..0e613029 100644 --- a/examples/models_cubicmap.c +++ b/examples/models_cubicmap.c @@ -21,7 +21,7 @@ int main() InitWindow(screenWidth, screenHeight, "raylib [models] example - cubesmap loading and drawing"); // Define the camera to look into our 3d world - Camera camera = {{ 16.0f, 14.0f, 16.0f }, { 0.0f, 0.0f, 0.0f }, { 0.0f, 1.0f, 0.0f }}; + Camera camera = {{ 16.0f, 14.0f, 16.0f }, { 0.0f, 0.0f, 0.0f }, { 0.0f, 1.0f, 0.0f }, 45.0f }; Image image = LoadImage("resources/cubicmap.png"); // Load cubicmap image (RAM) Texture2D cubicmap = LoadTextureFromImage(image); // Convert image to texture to display (VRAM) @@ -29,24 +29,23 @@ int main() // NOTE: By default each cube is mapped to one part of texture atlas Texture2D texture = LoadTexture("resources/cubicmap_atlas.png"); // Load map texture - SetModelTexture(&map, texture); // Bind texture to map model + map.material.texDiffuse = texture; // Set map diffuse texture Vector3 mapPosition = { -16.0f, 0.0f, -8.0f }; // Set model position UnloadImage(image); // Unload cubesmap image from RAM, already uploaded to VRAM - SetCameraMode(CAMERA_ORBITAL); // Set an orbital camera mode - SetCameraPosition(camera.position); // Set internal camera position to match our custom camera position + SetCameraMode(camera, CAMERA_ORBITAL); // Set an orbital camera mode - SetTargetFPS(60); // Set our game to run at 60 frames-per-second + SetTargetFPS(60); // Set our game to run at 60 frames-per-second //-------------------------------------------------------------------------------------- // Main game loop - while (!WindowShouldClose()) // Detect window close button or ESC key + while (!WindowShouldClose()) // Detect window close button or ESC key { // Update //---------------------------------------------------------------------------------- - UpdateCamera(&camera); // Update internal camera and our camera + UpdateCamera(&camera); // Update camera //---------------------------------------------------------------------------------- // Draw diff --git a/examples/models_geometric_shapes.c b/examples/models_geometric_shapes.c index 9ea5b423..a13a1f3b 100644 --- a/examples/models_geometric_shapes.c +++ b/examples/models_geometric_shapes.c @@ -21,7 +21,7 @@ int main() InitWindow(screenWidth, screenHeight, "raylib [models] example - geometric shapes"); // Define the camera to look into our 3d world - Camera camera = {{ 0.0f, 10.0f, 10.0f }, { 0.0f, 0.0f, 0.0f }, { 0.0f, 1.0f, 0.0f }}; + Camera camera = {{ 0.0f, 10.0f, 10.0f }, { 0.0f, 0.0f, 0.0f }, { 0.0f, 1.0f, 0.0f }, 45.0f }; SetTargetFPS(60); // Set our game to run at 60 frames-per-second //-------------------------------------------------------------------------------------- diff --git a/examples/models_heightmap.c b/examples/models_heightmap.c index f1da3301..10069e03 100644 --- a/examples/models_heightmap.c +++ b/examples/models_heightmap.c @@ -21,28 +21,27 @@ int main() InitWindow(screenWidth, screenHeight, "raylib [models] example - heightmap loading and drawing"); // Define our custom camera to look into our 3d world - Camera camera = {{ 18.0f, 16.0f, 18.0f }, { 0.0f, 0.0f, 0.0f }, { 0.0f, 1.0f, 0.0f }}; + Camera camera = {{ 18.0f, 16.0f, 18.0f }, { 0.0f, 0.0f, 0.0f }, { 0.0f, 1.0f, 0.0f }, 45.0f }; Image image = LoadImage("resources/heightmap.png"); // Load heightmap image (RAM) Texture2D texture = LoadTextureFromImage(image); // Convert image to texture (VRAM) Model map = LoadHeightmap(image, (Vector3){ 16, 8, 16 }); // Load heightmap model with defined size - SetModelTexture(&map, texture); // Bind texture to model + map.material.texDiffuse = texture; // Set map diffuse texture Vector3 mapPosition = { -8.0f, 0.0f, -8.0f }; // Set model position (depends on model scaling!) - UnloadImage(image); // Unload heightmap image from RAM, already uploaded to VRAM + UnloadImage(image); // Unload heightmap image from RAM, already uploaded to VRAM - SetCameraMode(CAMERA_ORBITAL); // Set an orbital camera mode - SetCameraPosition(camera.position); // Set internal camera position to match our custom camera position + SetCameraMode(camera, CAMERA_ORBITAL); // Set an orbital camera mode - SetTargetFPS(60); // Set our game to run at 60 frames-per-second + SetTargetFPS(60); // Set our game to run at 60 frames-per-second //-------------------------------------------------------------------------------------- // Main game loop - while (!WindowShouldClose()) // Detect window close button or ESC key + while (!WindowShouldClose()) // Detect window close button or ESC key { // Update //---------------------------------------------------------------------------------- - UpdateCamera(&camera); // Update internal camera and our camera + UpdateCamera(&camera); // Update camera //---------------------------------------------------------------------------------- // Draw diff --git a/examples/models_obj_loading.c b/examples/models_obj_loading.c index 41f4569a..50d42d2e 100644 --- a/examples/models_obj_loading.c +++ b/examples/models_obj_loading.c @@ -21,11 +21,11 @@ int main() InitWindow(screenWidth, screenHeight, "raylib [models] example - obj model loading"); // Define the camera to look into our 3d world - Camera camera = {{ 3.0f, 3.0f, 3.0f }, { 0.0f, 1.5f, 0.0f }, { 0.0f, 1.0f, 0.0f }}; + Camera camera = {{ 3.0f, 3.0f, 3.0f }, { 0.0f, 1.5f, 0.0f }, { 0.0f, 1.0f, 0.0f }, 45.0f }; Model dwarf = LoadModel("resources/model/dwarf.obj"); // Load OBJ model Texture2D texture = LoadTexture("resources/model/dwarf_diffuse.png"); // Load model texture - SetModelTexture(&dwarf, texture); // Bind texture to model + dwarf.material.texDiffuse = texture; // Set dwarf model diffuse texture Vector3 position = { 0.0f, 0.0f, 0.0f }; // Set model position SetTargetFPS(60); // Set our game to run at 60 frames-per-second @@ -49,7 +49,7 @@ int main() DrawModel(dwarf, position, 2.0f, WHITE); // Draw 3d model with texture - DrawGrid(10, 1.0f); // Draw a grid + DrawGrid(10, 1.0f); // Draw a grid DrawGizmo(position); // Draw gizmo diff --git a/examples/models_ray_picking.c b/examples/models_ray_picking.c new file mode 100644 index 00000000..c578a185 --- /dev/null +++ b/examples/models_ray_picking.c @@ -0,0 +1,197 @@ +/******************************************************************************************* +* +* raylib [models] example - Ray picking in 3d mode, ground plane, triangle, mesh +* +* This example has been created using raylib 1.7 (www.raylib.com) +* raylib is licensed under an unmodified zlib/libpng license (View raylib.h for details) +* +* Copyright (c) 2015 Ramon Santamaria (@raysan5) +* Example contributed by Joel Davis (@joeld42) +* +********************************************************************************************/ + +#include "raylib.h" +#include "../src/raymath.h" + +#include <stdio.h> +#include <float.h> + + +int main() +{ + // Initialization + //-------------------------------------------------------------------------------------- + int screenWidth = 800; + int screenHeight = 450; + + InitWindow(screenWidth, screenHeight, "raylib [models] example - 3d ray picking"); + + // Define the camera to look into our 3d world + Camera camera; + camera.position = (Vector3){ 10.0f, 8.0f, 10.0f }; // Camera position + camera.target = (Vector3){ 0.0f, 2.3f, 0.0f }; // Camera looking at point + camera.up = (Vector3){ 0.0f, 1.6f, 0.0f }; // Camera up vector (rotation towards target) + camera.fovy = 45.0f; // Camera field-of-view Y + + Vector3 cubePosition = { 0.0f, 1.0f, 0.0f }; + Vector3 cubeSize = { 2.0f, 2.0f, 2.0f }; + + Ray ray; // Picking line ray + + Model tower = LoadModel("resources/model/lowpoly-tower.obj"); // Load OBJ model + Texture2D texture = LoadTexture("resources/model/lowpoly-tower.png"); // Load model texture + tower.material.texDiffuse = texture; // Set model diffuse texture + + Vector3 towerPos = { 0.0f, 0.0f, 0.0f }; // Set model position + BoundingBox towerBBox = CalculateBoundingBox( tower.mesh ); + bool hitMeshBBox = false; + bool hitTriangle = false; + + // Test triangle + Vector3 ta = (Vector3){ -25.0, 0.5, 0.0 }; + Vector3 tb = (Vector3){ -4.0, 2.5, 1.0 }; + Vector3 tc = (Vector3){ -8.0, 6.5, 0.0 }; + + Vector3 bary = { 0.0f, 0.0f, 0.0f }; + + SetCameraMode(camera, CAMERA_FREE); // Set a free camera mode + + SetTargetFPS(60); // Set our game to run at 60 frames-per-second + //-------------------------------------------------------------------------------------- + // Main game loop + while (!WindowShouldClose()) // Detect window close button or ESC key + { + // Update + //---------------------------------------------------------------------------------- + UpdateCamera(&camera); // Update camera + + // Display information about closest hit + RayHitInfo nearestHit; + char *hitObjectName = "None"; + nearestHit.distance = FLT_MAX; + nearestHit.hit = false; + Color cursorColor = WHITE; + + // Get ray and test against ground, triangle, and mesh + ray = GetMouseRay(GetMousePosition(), camera); + + // Check ray collision aginst ground plane + RayHitInfo groundHitInfo = GetCollisionRayGround(ray, 0.0f); + + if ((groundHitInfo.hit) && (groundHitInfo.distance < nearestHit.distance)) + { + nearestHit = groundHitInfo; + cursorColor = GREEN; + hitObjectName = "Ground"; + } + + // Check ray collision against test triangle + RayHitInfo triHitInfo = GetCollisionRayTriangle(ray, ta, tb, tc); + + if ((triHitInfo.hit) && (triHitInfo.distance < nearestHit.distance)) + { + nearestHit = triHitInfo; + cursorColor = PURPLE; + hitObjectName = "Triangle"; + + bary = Barycenter(nearestHit.hitPosition, ta, tb, tc); + hitTriangle = true; + } + else hitTriangle = false; + + RayHitInfo meshHitInfo; + + // Check ray collision against bounding box first, before trying the full ray-mesh test + if (CheckCollisionRayBox(ray, towerBBox)) + { + hitMeshBBox = true; + + // Check ray collision against mesh + meshHitInfo = GetCollisionRayMesh(ray, &tower.mesh); + + if ((meshHitInfo.hit) && (meshHitInfo.distance < nearestHit.distance)) + { + nearestHit = meshHitInfo; + cursorColor = ORANGE; + hitObjectName = "Mesh"; + } + + } hitMeshBBox = false; + //---------------------------------------------------------------------------------- + + // Draw + //---------------------------------------------------------------------------------- + BeginDrawing(); + + ClearBackground(RAYWHITE); + + Begin3dMode(camera); + + // Draw the tower + DrawModel(tower, towerPos, 1.0, WHITE); + + // Draw the test triangle + DrawLine3D(ta, tb, PURPLE); + DrawLine3D(tb, tc, PURPLE); + DrawLine3D(tc, ta, PURPLE); + + // Draw the mesh bbox if we hit it + if (hitMeshBBox) DrawBoundingBox(towerBBox, LIME); + + // If we hit something, draw the cursor at the hit point + if (nearestHit.hit) + { + DrawCube(nearestHit.hitPosition, 0.5, 0.5, 0.5, cursorColor); + DrawCubeWires(nearestHit.hitPosition, 0.5, 0.5, 0.5, YELLOW); + + Vector3 normalEnd; + normalEnd.x = nearestHit.hitPosition.x + nearestHit.hitNormal.x; + normalEnd.y = nearestHit.hitPosition.y + nearestHit.hitNormal.y; + normalEnd.z = nearestHit.hitPosition.z + nearestHit.hitNormal.z; + + DrawLine3D(nearestHit.hitPosition, normalEnd, YELLOW); + } + + DrawRay(ray, MAROON); + + DrawGrid(100, 1.0f); + + End3dMode(); + + // Draw some debug GUI text + DrawText(FormatText("Hit Object: %s", hitObjectName), 10, 50, 10, BLACK); + + if (nearestHit.hit) + { + int ypos = 70; + + DrawText(FormatText("Distance: %3.2f", nearestHit.distance), 10, ypos, 10, BLACK); + + DrawText(FormatText("Hit Pos: %3.2f %3.2f %3.2f", + nearestHit.hitPosition.x, + nearestHit.hitPosition.y, + nearestHit.hitPosition.z), 10, ypos + 15, 10, BLACK); + + DrawText(FormatText("Hit Norm: %3.2f %3.2f %3.2f", + nearestHit.hitNormal.x, + nearestHit.hitNormal.y, + nearestHit.hitNormal.z), 10, ypos + 30, 10, BLACK); + + if (hitTriangle) DrawText(FormatText("Barycenter: %3.2f %3.2f %3.2f", bary.x, bary.y, bary.z), 10, ypos + 45, 10, BLACK); + } + + DrawText("Use Mouse to Move Camera", 10, 430, 10, GRAY); + + DrawFPS(10, 10); + + EndDrawing(); + //---------------------------------------------------------------------------------- + } + + // De-Initialization + //-------------------------------------------------------------------------------------- + CloseWindow(); // Close window and OpenGL context + //-------------------------------------------------------------------------------------- + + return 0; +}
\ No newline at end of file diff --git a/examples/physics_basic_rigidbody.c b/examples/physics_basic_rigidbody.c deleted file mode 100644 index 6c354eb7..00000000 --- a/examples/physics_basic_rigidbody.c +++ /dev/null @@ -1,124 +0,0 @@ -/******************************************************************************************* -* -* raylib [physac] physics example - Basic rigidbody -* -* This example has been created using raylib 1.4 (www.raylib.com) -* raylib is licensed under an unmodified zlib/libpng license (View raylib.h for details) -* -* Copyright (c) 2016 Victor Fisac and Ramon Santamaria (@raysan5) -* -********************************************************************************************/ - -#include "raylib.h" - -#define OBJECT_SIZE 50 -#define PLAYER_INDEX 0 - -int main() -{ - // Initialization - //-------------------------------------------------------------------------------------- - int screenWidth = 800; - int screenHeight = 450; - - InitWindow(screenWidth, screenHeight, "raylib [physics] example - basic rigidbody"); - - InitPhysics(3); // Initialize physics system with maximum physic objects - - // Object initialization - Transform player = (Transform){(Vector2){(screenWidth - OBJECT_SIZE) / 2, (screenHeight - OBJECT_SIZE) / 2}, 0.0f, (Vector2){OBJECT_SIZE, OBJECT_SIZE}}; - AddCollider(PLAYER_INDEX, (Collider){true, COLLIDER_RECTANGLE, (Rectangle){player.position.x, player.position.y, player.scale.x, player.scale.y}, 0}); - AddRigidbody(PLAYER_INDEX, (Rigidbody){true, 1.0f, (Vector2){0, 0}, (Vector2){0, 0}, false, false, true, 0.5f, 1.0f}); - - // Floor initialization - // NOTE: floor doesn't need a rigidbody because it's a static physic object, just a collider to collide with other dynamic colliders (with rigidbody) - Transform floor = (Transform){(Vector2){0, screenHeight * 0.8f}, 0.0f, (Vector2){screenWidth, screenHeight * 0.2f}}; - AddCollider(PLAYER_INDEX + 1, (Collider){true, COLLIDER_RECTANGLE, (Rectangle){floor.position.x, floor.position.y, floor.scale.x, floor.scale.y}, 0}); - - // Object properties initialization - float moveSpeed = 6.0f; - float jumpForce = 5.0f; - - bool physicsDebug = false; - - SetTargetFPS(60); - //-------------------------------------------------------------------------------------- - - // Main game loop - while (!WindowShouldClose()) // Detect window close button or ESC key - { - // Update - //---------------------------------------------------------------------------------- - - // Update object physics - // NOTE: all physics detections and reactions are calculated in ApplyPhysics() function (You will live happier :D) - ApplyPhysics(PLAYER_INDEX, &player.position); - - // Check jump button input - if (IsKeyDown(KEY_SPACE) && GetRigidbody(PLAYER_INDEX).isGrounded) - { - // Reset object Y velocity to avoid double jumping cases but keep the same X velocity that it already has - SetRigidbodyVelocity(PLAYER_INDEX, (Vector2){GetRigidbody(PLAYER_INDEX).velocity.x, 0}); - - // Add jumping force in Y axis - AddRigidbodyForce(PLAYER_INDEX, (Vector2){0, jumpForce}); - } - - // Check movement buttons input - if (IsKeyDown(KEY_RIGHT) || IsKeyDown(KEY_D)) - { - // Set rigidbody velocity in X based on moveSpeed value and apply the same Y velocity that it already has - SetRigidbodyVelocity(PLAYER_INDEX, (Vector2){moveSpeed, GetRigidbody(PLAYER_INDEX).velocity.y}); - } - else if (IsKeyDown(KEY_LEFT) || IsKeyDown(KEY_A)) - { - // Set rigidbody velocity in X based on moveSpeed negative value and apply the same Y velocity that it already has - SetRigidbodyVelocity(PLAYER_INDEX, (Vector2){-moveSpeed, GetRigidbody(PLAYER_INDEX).velocity.y}); - } - - // Check debug mode toggle button input - if (IsKeyPressed(KEY_P)) physicsDebug = !physicsDebug; - //---------------------------------------------------------------------------------- - - // Draw - //---------------------------------------------------------------------------------- - BeginDrawing(); - - ClearBackground(RAYWHITE); - - // Draw information - DrawText("Use LEFT / RIGHT to MOVE and SPACE to JUMP", (screenWidth - MeasureText("Use LEFT / RIGHT to MOVE and SPACE to JUMP", 20)) / 2, screenHeight * 0.20f, 20, LIGHTGRAY); - DrawText("Use P to switch DEBUG MODE", (screenWidth - MeasureText("Use P to switch DEBUG MODE", 20)) / 2, screenHeight * 0.3f, 20, LIGHTGRAY); - - // Check if debug mode is enabled - if (physicsDebug) - { - // Draw every internal physics stored collider if it is active - for (int i = 0; i < 2; i++) - { - if (GetCollider(i).enabled) - { - DrawRectangleLines(GetCollider(i).bounds.x, GetCollider(i).bounds.y, GetCollider(i).bounds.width, GetCollider(i).bounds.height, GREEN); - } - } - } - else - { - // Draw player and floor - DrawRectangleRec((Rectangle){player.position.x, player.position.y, player.scale.x, player.scale.y}, GRAY); - DrawRectangleRec((Rectangle){floor.position.x, floor.position.y, floor.scale.x, floor.scale.y}, BLACK); - } - - EndDrawing(); - //---------------------------------------------------------------------------------- - } - - // De-Initialization - //-------------------------------------------------------------------------------------- - UnloadPhysics(); // Unload physic objects - - CloseWindow(); // Close window and OpenGL context - //-------------------------------------------------------------------------------------- - - return 0; -}
\ No newline at end of file diff --git a/examples/physics_basic_rigidbody.png b/examples/physics_basic_rigidbody.png Binary files differdeleted file mode 100644 index 3d691637..00000000 --- a/examples/physics_basic_rigidbody.png +++ /dev/null diff --git a/examples/physics_demo.c b/examples/physics_demo.c new file mode 100644 index 00000000..de8d515e --- /dev/null +++ b/examples/physics_demo.c @@ -0,0 +1,122 @@ +/******************************************************************************************* +* +* Physac - Physics demo +* +* NOTE: Physac requires multi-threading, when InitPhysics() a second thread is created to manage physics calculations. +* The file pthreadGC2.dll is required to run the program; you can find it in 'src\external' +* +* Copyright (c) 2016 Victor Fisac +* +********************************************************************************************/ + +#include "raylib.h" + +#define PHYSAC_IMPLEMENTATION +#include "../src/physac.h" + +int main() +{ + // Initialization + //-------------------------------------------------------------------------------------- + int screenWidth = 800; + int screenHeight = 450; + + SetConfigFlags(FLAG_MSAA_4X_HINT); + InitWindow(screenWidth, screenHeight, "Physac [raylib] - Physics demo"); + SetTargetFPS(60); + + // Physac logo drawing position + int logoX = screenWidth - MeasureText("Physac", 30) - 10; + int logoY = 15; + + // Initialize physics and default physics bodies + InitPhysics(); + + // Create floor rectangle physics body + PhysicsBody floor = CreatePhysicsBodyRectangle((Vector2){ screenWidth/2, screenHeight }, 500, 100, 10); + floor->enabled = false; // Disable body state to convert it to static (no dynamics, but collisions) + + // Create obstacle circle physics body + PhysicsBody circle = CreatePhysicsBodyCircle((Vector2){ screenWidth/2, screenHeight/2 }, 45, 10); + circle->enabled = false; // Disable body state to convert it to static (no dynamics, but collisions) + //-------------------------------------------------------------------------------------- + + // Main game loop + while (!WindowShouldClose()) // Detect window close button or ESC key + { + // Update + //---------------------------------------------------------------------------------- + if (IsKeyPressed('R')) // Reset physics input + { + ResetPhysics(); + + floor = CreatePhysicsBodyRectangle((Vector2){ screenWidth/2, screenHeight }, 500, 100, 10); + floor->enabled = false; + + circle = CreatePhysicsBodyCircle((Vector2){ screenWidth/2, screenHeight/2 }, 45, 10); + circle->enabled = false; + } + + // Physics body creation inputs + if (IsMouseButtonPressed(MOUSE_LEFT_BUTTON)) CreatePhysicsBodyPolygon(GetMousePosition(), GetRandomValue(20, 80), GetRandomValue(3, 8), 10); + else if (IsMouseButtonPressed(MOUSE_RIGHT_BUTTON)) CreatePhysicsBodyCircle(GetMousePosition(), GetRandomValue(10, 45), 10); + + // Destroy falling physics bodies + int bodiesCount = GetPhysicsBodiesCount(); + for (int i = bodiesCount - 1; i >= 0; i--) + { + PhysicsBody body = GetPhysicsBody(i); + if (body != NULL && (body->position.y > screenHeight*2)) DestroyPhysicsBody(body); + } + //---------------------------------------------------------------------------------- + + // Draw + //---------------------------------------------------------------------------------- + BeginDrawing(); + + ClearBackground(BLACK); + + DrawFPS(screenWidth - 90, screenHeight - 30); + + // Draw created physics bodies + bodiesCount = GetPhysicsBodiesCount(); + for (int i = 0; i < bodiesCount; i++) + { + PhysicsBody body = GetPhysicsBody(i); + + if (body != NULL) + { + int vertexCount = GetPhysicsShapeVerticesCount(i); + for (int j = 0; j < vertexCount; j++) + { + // Get physics bodies shape vertices to draw lines + // Note: GetPhysicsShapeVertex() already calculates rotation transformations + Vector2 vertexA = GetPhysicsShapeVertex(body, j); + + int jj = (((j + 1) < vertexCount) ? (j + 1) : 0); // Get next vertex or first to close the shape + Vector2 vertexB = GetPhysicsShapeVertex(body, jj); + + DrawLineV(vertexA, vertexB, GREEN); // Draw a line between two vertex positions + } + } + } + + DrawText("Left mouse button to create a polygon", 10, 10, 10, WHITE); + DrawText("Right mouse button to create a circle", 10, 25, 10, WHITE); + DrawText("Press 'R' to reset example", 10, 40, 10, WHITE); + + DrawText("Physac", logoX, logoY, 30, WHITE); + DrawText("Powered by", logoX + 50, logoY - 7, 10, WHITE); + + EndDrawing(); + //---------------------------------------------------------------------------------- + } + + // De-Initialization + //-------------------------------------------------------------------------------------- + ClosePhysics(); // Unitialize physics + CloseWindow(); // Close window and OpenGL context + //-------------------------------------------------------------------------------------- + + return 0; +} diff --git a/examples/physics_demo.png b/examples/physics_demo.png Binary files differnew file mode 100644 index 00000000..12dc7e72 --- /dev/null +++ b/examples/physics_demo.png diff --git a/examples/physics_friction.c b/examples/physics_friction.c new file mode 100644 index 00000000..a4baad53 --- /dev/null +++ b/examples/physics_friction.c @@ -0,0 +1,136 @@ +/******************************************************************************************* +* +* Physac - Physics friction +* +* NOTE: Physac requires multi-threading, when InitPhysics() a second thread is created to manage physics calculations. +* The file pthreadGC2.dll is required to run the program; you can find it in 'src\external' +* +* Copyright (c) 2016 Victor Fisac +* +********************************************************************************************/ + +#include "raylib.h" + +#define PHYSAC_IMPLEMENTATION +#include "../src/physac.h" + +int main() +{ + // Initialization + //-------------------------------------------------------------------------------------- + int screenWidth = 800; + int screenHeight = 450; + + SetConfigFlags(FLAG_MSAA_4X_HINT); + InitWindow(screenWidth, screenHeight, "Physac [raylib] - Physics friction"); + SetTargetFPS(60); + + // Physac logo drawing position + int logoX = screenWidth - MeasureText("Physac", 30) - 10; + int logoY = 15; + + // Initialize physics and default physics bodies + InitPhysics(); + + // Create floor rectangle physics body + PhysicsBody floor = CreatePhysicsBodyRectangle((Vector2){ screenWidth/2, screenHeight }, screenWidth, 100, 10); + floor->enabled = false; // Disable body state to convert it to static (no dynamics, but collisions) + PhysicsBody wall = CreatePhysicsBodyRectangle((Vector2){ screenWidth/2, screenHeight*0.8f }, 10, 80, 10); + wall->enabled = false; // Disable body state to convert it to static (no dynamics, but collisions) + + // Create left ramp physics body + PhysicsBody rectLeft = CreatePhysicsBodyRectangle((Vector2){ 25, screenHeight - 5 }, 250, 250, 10); + rectLeft->enabled = false; // Disable body state to convert it to static (no dynamics, but collisions) + SetPhysicsBodyRotation(rectLeft, 30*DEG2RAD); + + // Create right ramp physics body + PhysicsBody rectRight = CreatePhysicsBodyRectangle((Vector2){ screenWidth - 25, screenHeight - 5 }, 250, 250, 10); + rectRight->enabled = false; // Disable body state to convert it to static (no dynamics, but collisions) + SetPhysicsBodyRotation(rectRight, 330*DEG2RAD); + + // Create dynamic physics bodies + PhysicsBody bodyA = CreatePhysicsBodyRectangle((Vector2){ 35, screenHeight*0.6f }, 40, 40, 10); + bodyA->staticFriction = 0.1f; + bodyA->dynamicFriction = 0.1f; + SetPhysicsBodyRotation(bodyA, 30*DEG2RAD); + + PhysicsBody bodyB = CreatePhysicsBodyRectangle((Vector2){ screenWidth - 35, screenHeight*0.6f }, 40, 40, 10); + bodyB->staticFriction = 1; + bodyB->dynamicFriction = 1; + SetPhysicsBodyRotation(bodyB, 330*DEG2RAD); + //-------------------------------------------------------------------------------------- + + // Main game loop + while (!WindowShouldClose()) // Detect window close button or ESC key + { + // Update + //---------------------------------------------------------------------------------- + if (IsKeyPressed('R')) // Reset physics input + { + // Reset dynamic physics bodies position, velocity and rotation + bodyA->position = (Vector2){ 35, screenHeight*0.6f }; + bodyA->velocity = (Vector2){ 0, 0 }; + bodyA->angularVelocity = 0; + SetPhysicsBodyRotation(bodyA, 30*DEG2RAD); + + bodyB->position = (Vector2){ screenWidth - 35, screenHeight*0.6f }; + bodyB->velocity = (Vector2){ 0, 0 }; + bodyB->angularVelocity = 0; + SetPhysicsBodyRotation(bodyB, 330*DEG2RAD); + } + //---------------------------------------------------------------------------------- + + // Draw + //---------------------------------------------------------------------------------- + BeginDrawing(); + + ClearBackground(BLACK); + + DrawFPS(screenWidth - 90, screenHeight - 30); + + // Draw created physics bodies + int bodiesCount = GetPhysicsBodiesCount(); + for (int i = 0; i < bodiesCount; i++) + { + PhysicsBody body = GetPhysicsBody(i); + + if (body != NULL) + { + int vertexCount = GetPhysicsShapeVerticesCount(i); + for (int j = 0; j < vertexCount; j++) + { + // Get physics bodies shape vertices to draw lines + // Note: GetPhysicsShapeVertex() already calculates rotation transformations + Vector2 vertexA = GetPhysicsShapeVertex(body, j); + + int jj = (((j + 1) < vertexCount) ? (j + 1) : 0); // Get next vertex or first to close the shape + Vector2 vertexB = GetPhysicsShapeVertex(body, jj); + + DrawLineV(vertexA, vertexB, GREEN); // Draw a line between two vertex positions + } + } + } + + DrawRectangle(0, screenHeight - 49, screenWidth, 49, BLACK); + + DrawText("Friction amount", (screenWidth - MeasureText("Friction amount", 30))/2, 75, 30, WHITE); + DrawText("0.1", bodyA->position.x - MeasureText("0.1", 20)/2, bodyA->position.y - 7, 20, WHITE); + DrawText("1", bodyB->position.x - MeasureText("1", 20)/2, bodyB->position.y - 7, 20, WHITE); + + DrawText("Press 'R' to reset example", 10, 10, 10, WHITE); + + DrawText("Physac", logoX, logoY, 30, WHITE); + DrawText("Powered by", logoX + 50, logoY - 7, 10, WHITE); + + EndDrawing(); + //---------------------------------------------------------------------------------- + } + + // De-Initialization + //-------------------------------------------------------------------------------------- + ClosePhysics(); // Unitialize physics + CloseWindow(); // Close window and OpenGL context + //-------------------------------------------------------------------------------------- + + return 0; +} diff --git a/examples/physics_friction.png b/examples/physics_friction.png Binary files differnew file mode 100644 index 00000000..e791ec2b --- /dev/null +++ b/examples/physics_friction.png diff --git a/examples/physics_movement.c b/examples/physics_movement.c new file mode 100644 index 00000000..ee97845f --- /dev/null +++ b/examples/physics_movement.c @@ -0,0 +1,122 @@ +/******************************************************************************************* +* +* Physac - Physics movement +* +* NOTE: Physac requires multi-threading, when InitPhysics() a second thread is created to manage physics calculations. +* The file pthreadGC2.dll is required to run the program; you can find it in 'src\external' +* +* Copyright (c) 2016 Victor Fisac +* +********************************************************************************************/ + +#include "raylib.h" + +#define PHYSAC_IMPLEMENTATION +#include "../src/physac.h" + +#define VELOCITY 0.5f + +int main() +{ + // Initialization + //-------------------------------------------------------------------------------------- + int screenWidth = 800; + int screenHeight = 450; + + SetConfigFlags(FLAG_MSAA_4X_HINT); + InitWindow(screenWidth, screenHeight, "Physac [raylib] - Physics movement"); + SetTargetFPS(60); + + // Physac logo drawing position + int logoX = screenWidth - MeasureText("Physac", 30) - 10; + int logoY = 15; + + // Initialize physics and default physics bodies + InitPhysics(); + + // Create floor and walls rectangle physics body + PhysicsBody floor = CreatePhysicsBodyRectangle((Vector2){ screenWidth/2, screenHeight }, screenWidth, 100, 10); + PhysicsBody platformLeft = CreatePhysicsBodyRectangle((Vector2){ screenWidth*0.25f, screenHeight*0.6f }, screenWidth*0.25f, 10, 10); + PhysicsBody platformRight = CreatePhysicsBodyRectangle((Vector2){ screenWidth*0.75f, screenHeight*0.6f }, screenWidth*0.25f, 10, 10); + PhysicsBody wallLeft = CreatePhysicsBodyRectangle((Vector2){ -5, screenHeight/2 }, 10, screenHeight, 10); + PhysicsBody wallRight = CreatePhysicsBodyRectangle((Vector2){ screenWidth + 5, screenHeight/2 }, 10, screenHeight, 10); + + // Disable dynamics to floor and walls physics bodies + floor->enabled = false; + platformLeft->enabled = false; + platformRight->enabled = false; + wallLeft->enabled = false; + wallRight->enabled = false; + + // Create movement physics body + PhysicsBody body = CreatePhysicsBodyRectangle((Vector2){ screenWidth/2, screenHeight/2 }, 50, 50, 1); + body->freezeOrient = true; // Constrain body rotation to avoid little collision torque amounts + //-------------------------------------------------------------------------------------- + + // Main game loop + while (!WindowShouldClose()) // Detect window close button or ESC key + { + // Update + //---------------------------------------------------------------------------------- + if (IsKeyPressed('R')) // Reset physics input + { + // Reset movement physics body position, velocity and rotation + body->position = (Vector2){ screenWidth/2, screenHeight/2 }; + body->velocity = (Vector2){ 0, 0 }; + SetPhysicsBodyRotation(body, 0); + } + + // Horizontal movement input + if (IsKeyDown(KEY_RIGHT)) body->velocity.x = VELOCITY; + else if (IsKeyDown(KEY_LEFT)) body->velocity.x = -VELOCITY; + + // Vertical movement input checking if player physics body is grounded + if (IsKeyDown(KEY_UP) && body->isGrounded) body->velocity.y = -VELOCITY*4; + //---------------------------------------------------------------------------------- + + // Draw + //---------------------------------------------------------------------------------- + BeginDrawing(); + + ClearBackground(BLACK); + + DrawFPS(screenWidth - 90, screenHeight - 30); + + // Draw created physics bodies + int bodiesCount = GetPhysicsBodiesCount(); + for (int i = 0; i < bodiesCount; i++) + { + PhysicsBody body = GetPhysicsBody(i); + + int vertexCount = GetPhysicsShapeVerticesCount(i); + for (int j = 0; j < vertexCount; j++) + { + // Get physics bodies shape vertices to draw lines + // Note: GetPhysicsShapeVertex() already calculates rotation transformations + Vector2 vertexA = GetPhysicsShapeVertex(body, j); + + int jj = (((j + 1) < vertexCount) ? (j + 1) : 0); // Get next vertex or first to close the shape + Vector2 vertexB = GetPhysicsShapeVertex(body, jj); + + DrawLineV(vertexA, vertexB, GREEN); // Draw a line between two vertex positions + } + } + + DrawText("Use 'ARROWS' to move player", 10, 10, 10, WHITE); + DrawText("Press 'R' to reset example", 10, 30, 10, WHITE); + + DrawText("Physac", logoX, logoY, 30, WHITE); + DrawText("Powered by", logoX + 50, logoY - 7, 10, WHITE); + + EndDrawing(); + //---------------------------------------------------------------------------------- + } + + // De-Initialization + //-------------------------------------------------------------------------------------- + ClosePhysics(); // Unitialize physics + CloseWindow(); // Close window and OpenGL context + //-------------------------------------------------------------------------------------- + + return 0; +} diff --git a/examples/physics_movement.png b/examples/physics_movement.png Binary files differnew file mode 100644 index 00000000..a88a7d79 --- /dev/null +++ b/examples/physics_movement.png diff --git a/examples/physics_restitution.c b/examples/physics_restitution.c new file mode 100644 index 00000000..378f6f24 --- /dev/null +++ b/examples/physics_restitution.c @@ -0,0 +1,115 @@ +/******************************************************************************************* +* +* Physac - Physics restitution +* +* NOTE: Physac requires multi-threading, when InitPhysics() a second thread is created to manage physics calculations. +* The file pthreadGC2.dll is required to run the program; you can find it in 'src\external' +* +* Copyright (c) 2016 Victor Fisac +* +********************************************************************************************/ + +#include "raylib.h" + +#define PHYSAC_IMPLEMENTATION +#include "../src/physac.h" + +int main() +{ + // Initialization + //-------------------------------------------------------------------------------------- + int screenWidth = 800; + int screenHeight = 450; + + SetConfigFlags(FLAG_MSAA_4X_HINT); + InitWindow(screenWidth, screenHeight, "Physac [raylib] - Physics restitution"); + SetTargetFPS(60); + + // Physac logo drawing position + int logoX = screenWidth - MeasureText("Physac", 30) - 10; + int logoY = 15; + + // Initialize physics and default physics bodies + InitPhysics(); + + // Create floor rectangle physics body + PhysicsBody floor = CreatePhysicsBodyRectangle((Vector2){ screenWidth/2, screenHeight }, screenWidth, 100, 10); + floor->enabled = false; // Disable body state to convert it to static (no dynamics, but collisions) + floor->restitution = 1; + + // Create circles physics body + PhysicsBody circleA = CreatePhysicsBodyCircle((Vector2){ screenWidth*0.25f, screenHeight/2 }, 30, 10); + circleA->restitution = 0; + PhysicsBody circleB = CreatePhysicsBodyCircle((Vector2){ screenWidth*0.5f, screenHeight/2 }, 30, 10); + circleB->restitution = 0.5f; + PhysicsBody circleC = CreatePhysicsBodyCircle((Vector2){ screenWidth*0.75f, screenHeight/2 }, 30, 10); + circleC->restitution = 1; + //-------------------------------------------------------------------------------------- + + // Main game loop + while (!WindowShouldClose()) // Detect window close button or ESC key + { + // Update + //---------------------------------------------------------------------------------- + if (IsKeyPressed('R')) // Reset physics input + { + // Reset circles physics bodies position and velocity + circleA->position = (Vector2){ screenWidth*0.25f, screenHeight/2 }; + circleA->velocity = (Vector2){ 0, 0 }; + circleB->position = (Vector2){ screenWidth*0.5f, screenHeight/2 }; + circleB->velocity = (Vector2){ 0, 0 }; + circleC->position = (Vector2){ screenWidth*0.75f, screenHeight/2 }; + circleC->velocity = (Vector2){ 0, 0 }; + } + //---------------------------------------------------------------------------------- + + // Draw + //---------------------------------------------------------------------------------- + BeginDrawing(); + + ClearBackground(BLACK); + + DrawFPS(screenWidth - 90, screenHeight - 30); + + // Draw created physics bodies + int bodiesCount = GetPhysicsBodiesCount(); + for (int i = 0; i < bodiesCount; i++) + { + PhysicsBody body = GetPhysicsBody(i); + + int vertexCount = GetPhysicsShapeVerticesCount(i); + for (int j = 0; j < vertexCount; j++) + { + // Get physics bodies shape vertices to draw lines + // Note: GetPhysicsShapeVertex() already calculates rotation transformations + Vector2 vertexA = GetPhysicsShapeVertex(body, j); + + int jj = (((j + 1) < vertexCount) ? (j + 1) : 0); // Get next vertex or first to close the shape + Vector2 vertexB = GetPhysicsShapeVertex(body, jj); + + DrawLineV(vertexA, vertexB, GREEN); // Draw a line between two vertex positions + } + } + + DrawText("Restitution amount", (screenWidth - MeasureText("Restitution amount", 30))/2, 75, 30, WHITE); + DrawText("0", circleA->position.x - MeasureText("0", 20)/2, circleA->position.y - 7, 20, WHITE); + DrawText("0.5", circleB->position.x - MeasureText("0.5", 20)/2, circleB->position.y - 7, 20, WHITE); + DrawText("1", circleC->position.x - MeasureText("1", 20)/2, circleC->position.y - 7, 20, WHITE); + + DrawText("Press 'R' to reset example", 10, 10, 10, WHITE); + + DrawText("Physac", logoX, logoY, 30, WHITE); + DrawText("Powered by", logoX + 50, logoY - 7, 10, WHITE); + + EndDrawing(); + //---------------------------------------------------------------------------------- + } + + // De-Initialization + //-------------------------------------------------------------------------------------- + ClosePhysics(); // Unitialize physics + CloseWindow(); // Close window and OpenGL context + //-------------------------------------------------------------------------------------- + + return 0; +} diff --git a/examples/physics_restitution.png b/examples/physics_restitution.png Binary files differnew file mode 100644 index 00000000..8ec4b3f3 --- /dev/null +++ b/examples/physics_restitution.png diff --git a/examples/physics_rigidbody_force.c b/examples/physics_rigidbody_force.c deleted file mode 100644 index 74a88a97..00000000 --- a/examples/physics_rigidbody_force.c +++ /dev/null @@ -1,135 +0,0 @@ -/******************************************************************************************* -* -* raylib [physac] physics example - Rigidbody forces -* -* This example has been created using raylib 1.4 (www.raylib.com) -* raylib is licensed under an unmodified zlib/libpng license (View raylib.h for details) -* -* Copyright (c) 2016 Victor Fisac and Ramon Santamaria (@raysan5) -* -********************************************************************************************/ - -#include "raylib.h" - -#define MAX_OBJECTS 5 -#define OBJECTS_OFFSET 150 - -#define FORCE_INTENSITY 250.0f // Customize by user -#define FORCE_RADIUS 100 // Customize by user - -int main() -{ - // Initialization - //-------------------------------------------------------------------------------------- - int screenWidth = 800; - int screenHeight = 450; - - InitWindow(screenWidth, screenHeight, "raylib [physics] example - rigidbodies forces"); - - InitPhysics(MAX_OBJECTS + 1); // Initialize physics system with maximum physic objects - - // Physic Objects initialization - Transform objects[MAX_OBJECTS]; - - for (int i = 0; i < MAX_OBJECTS; i++) - { - objects[i] = (Transform){(Vector2){75 + OBJECTS_OFFSET * i, (screenHeight - 50) / 2}, 0.0f, (Vector2){50, 50}}; - AddCollider(i, (Collider){true, COLLIDER_RECTANGLE, (Rectangle){objects[i].position.x, objects[i].position.y, objects[i].scale.x, objects[i].scale.y}, 0}); - AddRigidbody(i, (Rigidbody){true, 1.0f, (Vector2){0, 0}, (Vector2){0, 0}, false, false, true, 0.5f, 0.5f}); - } - - // Floor initialization - // NOTE: floor doesn't need a rigidbody because it's a static physic object, just a collider to collide with other dynamic colliders (with rigidbody) - Transform floor = (Transform){(Vector2){0, screenHeight * 0.8f}, 0.0f, (Vector2){screenWidth, screenHeight * 0.2f}}; - AddCollider(MAX_OBJECTS, (Collider){true, COLLIDER_RECTANGLE, (Rectangle){floor.position.x, floor.position.y, floor.scale.x, floor.scale.y}, 0}); - - bool physicsDebug = false; - - SetTargetFPS(60); - //-------------------------------------------------------------------------------------- - - // Main game loop - while (!WindowShouldClose()) // Detect window close button or ESC key - { - // Update - //---------------------------------------------------------------------------------- - - // Update object physics - // NOTE: all physics detections and reactions are calculated in ApplyPhysics() function (You will live happier :D) - for (int i = 0; i < MAX_OBJECTS; i++) - { - ApplyPhysics(i, &objects[i].position); - } - - // Check foce button input - if (IsMouseButtonPressed(MOUSE_LEFT_BUTTON)) - { - AddForceAtPosition(GetMousePosition(), FORCE_INTENSITY, FORCE_RADIUS); - } - - // Check debug mode toggle button input - if (IsKeyPressed(KEY_P)) physicsDebug = !physicsDebug; - //---------------------------------------------------------------------------------- - - // Draw - //---------------------------------------------------------------------------------- - BeginDrawing(); - - ClearBackground(RAYWHITE); - - // Check if debug mode is enabled - if (physicsDebug) - { - // Draw every internal physics stored collider if it is active (floor included) - for (int i = 0; i < MAX_OBJECTS; i++) - { - if (GetCollider(i).enabled) - { - // Draw collider bounds - DrawRectangleLines(GetCollider(i).bounds.x, GetCollider(i).bounds.y, GetCollider(i).bounds.width, GetCollider(i).bounds.height, GREEN); - - // Check if current collider is not floor - if (i < MAX_OBJECTS) - { - // Draw lines between mouse position and objects if they are in force range - if (CheckCollisionPointCircle(GetMousePosition(), (Vector2){GetCollider(i).bounds.x + GetCollider(i).bounds.width / 2, GetCollider(i).bounds.y + GetCollider(i).bounds.height / 2}, FORCE_RADIUS)) - { - DrawLineV(GetMousePosition(), (Vector2){GetCollider(i).bounds.x + GetCollider(i).bounds.width / 2, GetCollider(i).bounds.y + GetCollider(i).bounds.height / 2}, RED); - } - } - } - } - - // Draw radius circle - DrawCircleLines(GetMousePosition().x, GetMousePosition().y, FORCE_RADIUS, RED); - } - else - { - // Draw objects - for (int i = 0; i < MAX_OBJECTS; i++) - { - DrawRectangleRec((Rectangle){objects[i].position.x, objects[i].position.y, objects[i].scale.x, objects[i].scale.y}, GRAY); - } - - // Draw floor - DrawRectangleRec((Rectangle){floor.position.x, floor.position.y, floor.scale.x, floor.scale.y}, BLACK); - } - - - // Draw help messages - DrawText("Use LEFT MOUSE BUTTON to create a force in mouse position", (screenWidth - MeasureText("Use LEFT MOUSE BUTTON to create a force in mouse position", 20)) / 2, screenHeight * 0.20f, 20, LIGHTGRAY); - DrawText("Use P to switch DEBUG MODE", (screenWidth - MeasureText("Use P to switch DEBUG MODE", 20)) / 2, screenHeight * 0.3f, 20, LIGHTGRAY); - - EndDrawing(); - //---------------------------------------------------------------------------------- - } - - // De-Initialization - //-------------------------------------------------------------------------------------- - UnloadPhysics(); // Unload physic objects - - CloseWindow(); // Close window and OpenGL context - //-------------------------------------------------------------------------------------- - - return 0; -} diff --git a/examples/physics_rigidbody_force.png b/examples/physics_rigidbody_force.png Binary files differdeleted file mode 100644 index 48afa91b..00000000 --- a/examples/physics_rigidbody_force.png +++ /dev/null diff --git a/examples/physics_shatter.c b/examples/physics_shatter.c new file mode 100644 index 00000000..637a163e --- /dev/null +++ b/examples/physics_shatter.c @@ -0,0 +1,107 @@ +/******************************************************************************************* +* +* Physac - Body shatter +* +* NOTE: Physac requires multi-threading, when InitPhysics() a second thread is created to manage physics calculations. +* The file pthreadGC2.dll is required to run the program; you can find it in 'src\external' +* +* Copyright (c) 2016 Victor Fisac +* +********************************************************************************************/ + +#include "raylib.h" + +#define PHYSAC_IMPLEMENTATION +#include "../src/physac.h" + +int main() +{ + // Initialization + //-------------------------------------------------------------------------------------- + int screenWidth = 800; + int screenHeight = 450; + + SetConfigFlags(FLAG_MSAA_4X_HINT); + InitWindow(screenWidth, screenHeight, "Physac [raylib] - Body shatter"); + SetTargetFPS(60); + + // Physac logo drawing position + int logoX = screenWidth - MeasureText("Physac", 30) - 10; + int logoY = 15; + + // Initialize physics and default physics bodies + InitPhysics(); + SetPhysicsGravity(0, 0); + + // Create random polygon physics body to shatter + PhysicsBody body = CreatePhysicsBodyPolygon((Vector2){ screenWidth/2, screenHeight/2 }, GetRandomValue(80, 200), GetRandomValue(3, 8), 10); + //-------------------------------------------------------------------------------------- + + // Main game loop + while (!WindowShouldClose()) // Detect window close button or ESC key + { + // Update + //---------------------------------------------------------------------------------- + if (IsKeyPressed('R')) // Reset physics input + { + ResetPhysics(); + + // Create random polygon physics body to shatter + body = CreatePhysicsBodyPolygon((Vector2){ screenWidth/2, screenHeight/2 }, GetRandomValue(80, 200), GetRandomValue(3, 8), 10); + } + + if (IsMouseButtonPressed(MOUSE_LEFT_BUTTON)) // Physics shatter input + { + // Note: some values need to be stored in variables due to asynchronous changes during main thread + int count = GetPhysicsBodiesCount(); + for (int i = count - 1; i >= 0; i--) + { + PhysicsBody currentBody = GetPhysicsBody(i); + if (currentBody != NULL) PhysicsShatter(currentBody, GetMousePosition(), 10/currentBody->inverseMass); + } + } + //---------------------------------------------------------------------------------- + + // Draw + //---------------------------------------------------------------------------------- + BeginDrawing(); + + ClearBackground(BLACK); + + // Draw created physics bodies + int bodiesCount = GetPhysicsBodiesCount(); + for (int i = 0; i < bodiesCount; i++) + { + PhysicsBody currentBody = GetPhysicsBody(i); + + int vertexCount = GetPhysicsShapeVerticesCount(i); + for (int j = 0; j < vertexCount; j++) + { + // Get physics bodies shape vertices to draw lines + // Note: GetPhysicsShapeVertex() already calculates rotation transformations + Vector2 vertexA = GetPhysicsShapeVertex(currentBody, j); + + int jj = (((j + 1) < vertexCount) ? (j + 1) : 0); // Get next vertex or first to close the shape + Vector2 vertexB = GetPhysicsShapeVertex(currentBody, jj); + + DrawLineV(vertexA, vertexB, GREEN); // Draw a line between two vertex positions + } + } + + DrawText("Left mouse button in polygon area to shatter body\nPress 'R' to reset example", 10, 10, 10, WHITE); + + DrawText("Physac", logoX, logoY, 30, WHITE); + DrawText("Powered by", logoX + 50, logoY - 7, 10, WHITE); + + EndDrawing(); + //---------------------------------------------------------------------------------- + } + + // De-Initialization + //-------------------------------------------------------------------------------------- + ClosePhysics(); // Unitialize physics + CloseWindow(); // Close window and OpenGL context + //-------------------------------------------------------------------------------------- + + return 0; +} diff --git a/examples/physics_shatter.png b/examples/physics_shatter.png Binary files differnew file mode 100644 index 00000000..68f9a1b7 --- /dev/null +++ b/examples/physics_shatter.png diff --git a/examples/resources/audio/chiptun1.mod b/examples/resources/audio/chiptun1.mod Binary files differnew file mode 100644 index 00000000..00d16885 --- /dev/null +++ b/examples/resources/audio/chiptun1.mod diff --git a/examples/resources/audio/mini1111.xm b/examples/resources/audio/mini1111.xm Binary files differnew file mode 100644 index 00000000..a185c1a2 --- /dev/null +++ b/examples/resources/audio/mini1111.xm diff --git a/examples/resources/audio/sound.wav b/examples/resources/audio/sound.wav Binary files differnew file mode 100644 index 00000000..b5d01c9b --- /dev/null +++ b/examples/resources/audio/sound.wav diff --git a/examples/resources/audio/tanatana.flac b/examples/resources/audio/tanatana.flac Binary files differnew file mode 100644 index 00000000..dfe735cd --- /dev/null +++ b/examples/resources/audio/tanatana.flac diff --git a/examples/resources/fonts/KAISG.ttf b/examples/resources/fonts/KAISG.ttf Binary files differnew file mode 100644 index 00000000..04478b25 --- /dev/null +++ b/examples/resources/fonts/KAISG.ttf diff --git a/examples/resources/fonts/pixantiqua.fnt b/examples/resources/fonts/pixantiqua.fnt new file mode 100644 index 00000000..971b9b0b --- /dev/null +++ b/examples/resources/fonts/pixantiqua.fnt @@ -0,0 +1,188 @@ +info face="PixAntiqua" size=32 bold=0 italic=0 charset="" unicode=1 stretchH=100 smooth=1 aa=1 padding=2,2,2,2 spacing=2,2 outline=0 +common lineHeight=32 base=27 scaleW=512 scaleH=512 pages=1 packed=0 alphaChnl=0 redChnl=4 greenChnl=4 blueChnl=4 +page id=0 file="pixantiqua_0.png" +chars count=184 +char id=32 x=9 y=304 width=7 height=36 xoffset=-3 yoffset=-2 xadvance=8 page=0 chnl=15 +char id=33 x=391 y=266 width=11 height=36 xoffset=-3 yoffset=-2 xadvance=8 page=0 chnl=15 +char id=34 x=240 y=266 width=14 height=36 xoffset=-3 yoffset=-2 xadvance=11 page=0 chnl=15 +char id=35 x=468 y=38 width=24 height=36 xoffset=-3 yoffset=-2 xadvance=21 page=0 chnl=15 +char id=36 x=152 y=76 width=22 height=36 xoffset=-3 yoffset=-2 xadvance=19 page=0 chnl=15 +char id=37 x=176 y=76 width=22 height=36 xoffset=-3 yoffset=-2 xadvance=19 page=0 chnl=15 +char id=38 x=303 y=0 width=24 height=36 xoffset=-3 yoffset=-2 xadvance=21 page=0 chnl=15 +char id=39 x=495 y=266 width=8 height=36 xoffset=-3 yoffset=-2 xadvance=5 page=0 chnl=15 +char id=40 x=256 y=266 width=14 height=36 xoffset=-3 yoffset=-2 xadvance=11 page=0 chnl=15 +char id=199 x=432 y=152 width=22 height=36 xoffset=-3 yoffset=-2 xadvance=19 page=0 chnl=15 +char id=200 x=126 y=228 width=19 height=36 xoffset=-3 yoffset=-2 xadvance=16 page=0 chnl=15 +char id=201 x=147 y=228 width=19 height=36 xoffset=-3 yoffset=-2 xadvance=16 page=0 chnl=15 +char id=202 x=288 y=190 width=19 height=36 xoffset=-3 yoffset=-2 xadvance=16 page=0 chnl=15 +char id=203 x=189 y=228 width=19 height=36 xoffset=-3 yoffset=-2 xadvance=16 page=0 chnl=15 +char id=204 x=468 y=228 width=16 height=36 xoffset=-3 yoffset=-2 xadvance=13 page=0 chnl=15 +char id=205 x=486 y=228 width=16 height=36 xoffset=-3 yoffset=-2 xadvance=13 page=0 chnl=15 +char id=206 x=0 y=266 width=16 height=36 xoffset=-3 yoffset=-2 xadvance=13 page=0 chnl=15 +char id=207 x=72 y=266 width=16 height=36 xoffset=-3 yoffset=-2 xadvance=13 page=0 chnl=15 +char id=208 x=329 y=0 width=24 height=36 xoffset=-3 yoffset=-2 xadvance=21 page=0 chnl=15 +char id=209 x=277 y=0 width=24 height=36 xoffset=-3 yoffset=-2 xadvance=21 page=0 chnl=15 +char id=210 x=182 y=38 width=24 height=36 xoffset=-3 yoffset=-2 xadvance=21 page=0 chnl=15 +char id=211 x=26 y=76 width=24 height=36 xoffset=-3 yoffset=-2 xadvance=21 page=0 chnl=15 +char id=41 x=272 y=266 width=14 height=36 xoffset=-3 yoffset=-2 xadvance=11 page=0 chnl=15 +char id=42 x=288 y=266 width=14 height=36 xoffset=-3 yoffset=-2 xadvance=11 page=0 chnl=15 +char id=43 x=414 y=190 width=19 height=36 xoffset=-3 yoffset=-2 xadvance=16 page=0 chnl=15 +char id=44 x=378 y=266 width=11 height=36 xoffset=-3 yoffset=-2 xadvance=8 page=0 chnl=15 +char id=45 x=414 y=228 width=16 height=36 xoffset=-3 yoffset=-2 xadvance=13 page=0 chnl=15 +char id=46 x=443 y=266 width=11 height=36 xoffset=-3 yoffset=-2 xadvance=8 page=0 chnl=15 +char id=47 x=392 y=76 width=22 height=36 xoffset=-3 yoffset=-2 xadvance=19 page=0 chnl=15 +char id=48 x=485 y=0 width=24 height=36 xoffset=-3 yoffset=-2 xadvance=21 page=0 chnl=15 +char id=49 x=450 y=228 width=16 height=36 xoffset=-3 yoffset=-2 xadvance=13 page=0 chnl=15 +char id=50 x=21 y=228 width=19 height=36 xoffset=-3 yoffset=-2 xadvance=16 page=0 chnl=15 +char id=51 x=42 y=228 width=19 height=36 xoffset=-3 yoffset=-2 xadvance=16 page=0 chnl=15 +char id=59 x=456 y=266 width=11 height=36 xoffset=-3 yoffset=-2 xadvance=8 page=0 chnl=15 +char id=60 x=168 y=228 width=19 height=36 xoffset=-3 yoffset=-2 xadvance=16 page=0 chnl=15 +char id=61 x=309 y=190 width=19 height=36 xoffset=-3 yoffset=-2 xadvance=16 page=0 chnl=15 +char id=62 x=336 y=228 width=19 height=36 xoffset=-3 yoffset=-2 xadvance=16 page=0 chnl=15 +char id=63 x=315 y=228 width=19 height=36 xoffset=-3 yoffset=-2 xadvance=16 page=0 chnl=15 +char id=64 x=364 y=38 width=24 height=36 xoffset=-3 yoffset=-2 xadvance=21 page=0 chnl=15 +char id=65 x=390 y=38 width=24 height=36 xoffset=-3 yoffset=-2 xadvance=21 page=0 chnl=15 +char id=66 x=120 y=114 width=22 height=36 xoffset=-3 yoffset=-2 xadvance=19 page=0 chnl=15 +char id=67 x=144 y=114 width=22 height=36 xoffset=-3 yoffset=-2 xadvance=19 page=0 chnl=15 +char id=68 x=168 y=114 width=22 height=36 xoffset=-3 yoffset=-2 xadvance=19 page=0 chnl=15 +char id=69 x=294 y=228 width=19 height=36 xoffset=-3 yoffset=-2 xadvance=16 page=0 chnl=15 +char id=52 x=488 y=76 width=22 height=36 xoffset=-3 yoffset=-2 xadvance=19 page=0 chnl=15 +char id=53 x=63 y=228 width=19 height=36 xoffset=-3 yoffset=-2 xadvance=16 page=0 chnl=15 +char id=54 x=24 y=114 width=22 height=36 xoffset=-3 yoffset=-2 xadvance=19 page=0 chnl=15 +char id=55 x=48 y=114 width=22 height=36 xoffset=-3 yoffset=-2 xadvance=19 page=0 chnl=15 +char id=56 x=72 y=114 width=22 height=36 xoffset=-3 yoffset=-2 xadvance=19 page=0 chnl=15 +char id=57 x=96 y=114 width=22 height=36 xoffset=-3 yoffset=-2 xadvance=19 page=0 chnl=15 +char id=58 x=404 y=266 width=11 height=36 xoffset=-3 yoffset=-2 xadvance=8 page=0 chnl=15 +char id=70 x=252 y=228 width=19 height=36 xoffset=-3 yoffset=-2 xadvance=16 page=0 chnl=15 +char id=71 x=192 y=114 width=22 height=36 xoffset=-3 yoffset=-2 xadvance=19 page=0 chnl=15 +char id=72 x=78 y=76 width=24 height=36 xoffset=-3 yoffset=-2 xadvance=21 page=0 chnl=15 +char id=78 x=78 y=38 width=24 height=36 xoffset=-3 yoffset=-2 xadvance=21 page=0 chnl=15 +char id=79 x=355 y=0 width=24 height=36 xoffset=-3 yoffset=-2 xadvance=21 page=0 chnl=15 +char id=80 x=264 y=114 width=22 height=36 xoffset=-3 yoffset=-2 xadvance=19 page=0 chnl=15 +char id=81 x=381 y=0 width=24 height=36 xoffset=-3 yoffset=-2 xadvance=21 page=0 chnl=15 +char id=82 x=288 y=114 width=22 height=36 xoffset=-3 yoffset=-2 xadvance=19 page=0 chnl=15 +char id=83 x=312 y=114 width=22 height=36 xoffset=-3 yoffset=-2 xadvance=19 page=0 chnl=15 +char id=91 x=144 y=266 width=14 height=36 xoffset=-3 yoffset=-2 xadvance=11 page=0 chnl=15 +char id=92 x=108 y=266 width=16 height=36 xoffset=-3 yoffset=-2 xadvance=13 page=0 chnl=15 +char id=93 x=304 y=266 width=14 height=36 xoffset=-3 yoffset=-2 xadvance=11 page=0 chnl=15 +char id=94 x=34 y=0 width=32 height=36 xoffset=-3 yoffset=-2 xadvance=29 page=0 chnl=15 +char id=95 x=231 y=228 width=19 height=36 xoffset=-3 yoffset=-2 xadvance=16 page=0 chnl=15 +char id=96 x=442 y=38 width=24 height=36 xoffset=-3 yoffset=-2 xadvance=21 page=0 chnl=15 +char id=97 x=408 y=114 width=22 height=36 xoffset=-3 yoffset=-2 xadvance=19 page=0 chnl=15 +char id=98 x=432 y=114 width=22 height=36 xoffset=-3 yoffset=-2 xadvance=19 page=0 chnl=15 +char id=99 x=210 y=228 width=19 height=36 xoffset=-3 yoffset=-2 xadvance=16 page=0 chnl=15 +char id=84 x=336 y=114 width=22 height=36 xoffset=-3 yoffset=-2 xadvance=19 page=0 chnl=15 +char id=85 x=360 y=114 width=22 height=36 xoffset=-3 yoffset=-2 xadvance=19 page=0 chnl=15 +char id=86 x=0 y=38 width=24 height=36 xoffset=-3 yoffset=-2 xadvance=21 page=0 chnl=15 +char id=87 x=68 y=0 width=30 height=36 xoffset=-3 yoffset=-2 xadvance=27 page=0 chnl=15 +char id=88 x=26 y=38 width=24 height=36 xoffset=-3 yoffset=-2 xadvance=21 page=0 chnl=15 +char id=89 x=384 y=114 width=22 height=36 xoffset=-3 yoffset=-2 xadvance=19 page=0 chnl=15 +char id=90 x=84 y=228 width=19 height=36 xoffset=-3 yoffset=-2 xadvance=16 page=0 chnl=15 +char id=100 x=456 y=114 width=22 height=36 xoffset=-3 yoffset=-2 xadvance=19 page=0 chnl=15 +char id=101 x=480 y=114 width=22 height=36 xoffset=-3 yoffset=-2 xadvance=19 page=0 chnl=15 +char id=102 x=54 y=266 width=16 height=36 xoffset=-3 yoffset=-2 xadvance=13 page=0 chnl=15 +char id=103 x=0 y=152 width=22 height=36 xoffset=-3 yoffset=-2 xadvance=19 page=0 chnl=15 +char id=104 x=24 y=152 width=22 height=36 xoffset=-3 yoffset=-2 xadvance=19 page=0 chnl=15 +char id=105 x=469 y=266 width=11 height=36 xoffset=-3 yoffset=-2 xadvance=8 page=0 chnl=15 +char id=106 x=18 y=266 width=16 height=36 xoffset=-8 yoffset=-2 xadvance=8 page=0 chnl=15 +char id=107 x=48 y=152 width=22 height=36 xoffset=-3 yoffset=-2 xadvance=19 page=0 chnl=15 +char id=108 x=417 y=266 width=11 height=36 xoffset=-3 yoffset=-2 xadvance=8 page=0 chnl=15 +char id=109 x=161 y=0 width=27 height=36 xoffset=-3 yoffset=-2 xadvance=24 page=0 chnl=15 +char id=110 x=72 y=152 width=22 height=36 xoffset=-3 yoffset=-2 xadvance=19 page=0 chnl=15 +char id=111 x=96 y=152 width=22 height=36 xoffset=-3 yoffset=-2 xadvance=19 page=0 chnl=15 +char id=117 x=192 y=152 width=22 height=36 xoffset=-3 yoffset=-2 xadvance=19 page=0 chnl=15 +char id=118 x=216 y=152 width=22 height=36 xoffset=-3 yoffset=-2 xadvance=19 page=0 chnl=15 +char id=119 x=248 y=0 width=27 height=36 xoffset=-3 yoffset=-2 xadvance=24 page=0 chnl=15 +char id=120 x=240 y=152 width=22 height=36 xoffset=-3 yoffset=-2 xadvance=19 page=0 chnl=15 +char id=121 x=264 y=152 width=22 height=36 xoffset=-3 yoffset=-2 xadvance=19 page=0 chnl=15 +char id=122 x=288 y=152 width=22 height=36 xoffset=-3 yoffset=-2 xadvance=19 page=0 chnl=15 +char id=123 x=432 y=228 width=16 height=36 xoffset=-3 yoffset=-2 xadvance=13 page=0 chnl=15 +char id=124 x=365 y=266 width=11 height=36 xoffset=-3 yoffset=-2 xadvance=8 page=0 chnl=15 +char id=125 x=378 y=228 width=16 height=36 xoffset=-3 yoffset=-2 xadvance=13 page=0 chnl=15 +char id=126 x=393 y=190 width=19 height=36 xoffset=-3 yoffset=-2 xadvance=16 page=0 chnl=15 +char id=127 x=132 y=0 width=27 height=36 xoffset=-3 yoffset=-2 xadvance=24 page=0 chnl=15 +char id=160 x=0 y=304 width=7 height=36 xoffset=-3 yoffset=-2 xadvance=8 page=0 chnl=15 +char id=161 x=352 y=266 width=11 height=36 xoffset=-3 yoffset=-2 xadvance=8 page=0 chnl=15 +char id=162 x=351 y=190 width=19 height=36 xoffset=-3 yoffset=-2 xadvance=16 page=0 chnl=15 +char id=163 x=336 y=152 width=22 height=36 xoffset=-3 yoffset=-2 xadvance=19 page=0 chnl=15 +char id=165 x=360 y=152 width=22 height=36 xoffset=-3 yoffset=-2 xadvance=19 page=0 chnl=15 +char id=167 x=384 y=152 width=22 height=36 xoffset=-3 yoffset=-2 xadvance=19 page=0 chnl=15 +char id=169 x=433 y=0 width=24 height=36 xoffset=-3 yoffset=-2 xadvance=21 page=0 chnl=15 +char id=170 x=224 y=266 width=14 height=36 xoffset=-3 yoffset=-2 xadvance=11 page=0 chnl=15 +char id=171 x=105 y=228 width=19 height=36 xoffset=-3 yoffset=-2 xadvance=16 page=0 chnl=15 +char id=172 x=0 y=0 width=32 height=36 xoffset=-3 yoffset=-2 xadvance=29 page=0 chnl=15 +char id=173 x=494 y=38 width=16 height=36 xoffset=-3 yoffset=-2 xadvance=13 page=0 chnl=15 +char id=174 x=52 y=76 width=24 height=36 xoffset=-3 yoffset=-2 xadvance=21 page=0 chnl=15 +char id=175 x=52 y=38 width=24 height=36 xoffset=-3 yoffset=-2 xadvance=21 page=0 chnl=15 +char id=176 x=126 y=266 width=16 height=36 xoffset=-3 yoffset=-2 xadvance=13 page=0 chnl=15 +char id=177 x=435 y=190 width=19 height=36 xoffset=-3 yoffset=-2 xadvance=16 page=0 chnl=15 +char id=178 x=320 y=266 width=14 height=36 xoffset=-3 yoffset=-2 xadvance=11 page=0 chnl=15 +char id=179 x=336 y=266 width=14 height=36 xoffset=-3 yoffset=-2 xadvance=11 page=0 chnl=15 +char id=181 x=459 y=0 width=24 height=36 xoffset=-3 yoffset=-2 xadvance=21 page=0 chnl=15 +char id=112 x=120 y=152 width=22 height=36 xoffset=-3 yoffset=-2 xadvance=19 page=0 chnl=15 +char id=113 x=144 y=152 width=22 height=36 xoffset=-3 yoffset=-2 xadvance=19 page=0 chnl=15 +char id=114 x=396 y=228 width=16 height=36 xoffset=-3 yoffset=-2 xadvance=13 page=0 chnl=15 +char id=115 x=168 y=152 width=22 height=36 xoffset=-3 yoffset=-2 xadvance=19 page=0 chnl=15 +char id=116 x=36 y=266 width=16 height=36 xoffset=-3 yoffset=-2 xadvance=13 page=0 chnl=15 +char id=182 x=408 y=152 width=22 height=36 xoffset=-3 yoffset=-2 xadvance=19 page=0 chnl=15 +char id=183 x=498 y=190 width=11 height=36 xoffset=-3 yoffset=-2 xadvance=8 page=0 chnl=15 +char id=185 x=192 y=266 width=14 height=36 xoffset=-3 yoffset=-2 xadvance=11 page=0 chnl=15 +char id=186 x=208 y=266 width=14 height=36 xoffset=-3 yoffset=-2 xadvance=11 page=0 chnl=15 +char id=187 x=477 y=190 width=19 height=36 xoffset=-3 yoffset=-2 xadvance=16 page=0 chnl=15 +char id=191 x=456 y=190 width=19 height=36 xoffset=-3 yoffset=-2 xadvance=16 page=0 chnl=15 +char id=192 x=407 y=0 width=24 height=36 xoffset=-3 yoffset=-2 xadvance=21 page=0 chnl=15 +char id=193 x=234 y=38 width=24 height=36 xoffset=-3 yoffset=-2 xadvance=21 page=0 chnl=15 +char id=194 x=416 y=38 width=24 height=36 xoffset=-3 yoffset=-2 xadvance=21 page=0 chnl=15 +char id=195 x=156 y=38 width=24 height=36 xoffset=-3 yoffset=-2 xadvance=21 page=0 chnl=15 +char id=196 x=130 y=38 width=24 height=36 xoffset=-3 yoffset=-2 xadvance=21 page=0 chnl=15 +char id=197 x=104 y=38 width=24 height=36 xoffset=-3 yoffset=-2 xadvance=21 page=0 chnl=15 +char id=198 x=190 y=0 width=27 height=36 xoffset=-3 yoffset=-2 xadvance=24 page=0 chnl=15 +char id=212 x=0 y=76 width=24 height=36 xoffset=-3 yoffset=-2 xadvance=21 page=0 chnl=15 +char id=213 x=338 y=38 width=24 height=36 xoffset=-3 yoffset=-2 xadvance=21 page=0 chnl=15 +char id=214 x=312 y=38 width=24 height=36 xoffset=-3 yoffset=-2 xadvance=21 page=0 chnl=15 +char id=215 x=357 y=228 width=19 height=36 xoffset=-3 yoffset=-2 xadvance=16 page=0 chnl=15 +char id=216 x=286 y=38 width=24 height=36 xoffset=-3 yoffset=-2 xadvance=21 page=0 chnl=15 +char id=217 x=456 y=152 width=22 height=36 xoffset=-3 yoffset=-2 xadvance=19 page=0 chnl=15 +char id=218 x=480 y=152 width=22 height=36 xoffset=-3 yoffset=-2 xadvance=19 page=0 chnl=15 +char id=219 x=0 y=190 width=22 height=36 xoffset=-3 yoffset=-2 xadvance=19 page=0 chnl=15 +char id=220 x=24 y=190 width=22 height=36 xoffset=-3 yoffset=-2 xadvance=19 page=0 chnl=15 +char id=221 x=48 y=190 width=22 height=36 xoffset=-3 yoffset=-2 xadvance=19 page=0 chnl=15 +char id=222 x=260 y=38 width=24 height=36 xoffset=-3 yoffset=-2 xadvance=21 page=0 chnl=15 +char id=223 x=72 y=190 width=22 height=36 xoffset=-3 yoffset=-2 xadvance=19 page=0 chnl=15 +char id=224 x=96 y=190 width=22 height=36 xoffset=-3 yoffset=-2 xadvance=19 page=0 chnl=15 +char id=225 x=120 y=190 width=22 height=36 xoffset=-3 yoffset=-2 xadvance=19 page=0 chnl=15 +char id=226 x=144 y=190 width=22 height=36 xoffset=-3 yoffset=-2 xadvance=19 page=0 chnl=15 +char id=227 x=168 y=190 width=22 height=36 xoffset=-3 yoffset=-2 xadvance=19 page=0 chnl=15 +char id=228 x=192 y=190 width=22 height=36 xoffset=-3 yoffset=-2 xadvance=19 page=0 chnl=15 +char id=229 x=216 y=190 width=22 height=36 xoffset=-3 yoffset=-2 xadvance=19 page=0 chnl=15 +char id=230 x=219 y=0 width=27 height=36 xoffset=-3 yoffset=-2 xadvance=24 page=0 chnl=15 +char id=231 x=372 y=190 width=19 height=36 xoffset=-3 yoffset=-2 xadvance=16 page=0 chnl=15 +char id=73 x=90 y=266 width=16 height=36 xoffset=-3 yoffset=-2 xadvance=13 page=0 chnl=15 +char id=74 x=216 y=114 width=22 height=36 xoffset=-3 yoffset=-2 xadvance=19 page=0 chnl=15 +char id=75 x=240 y=114 width=22 height=36 xoffset=-3 yoffset=-2 xadvance=19 page=0 chnl=15 +char id=76 x=273 y=228 width=19 height=36 xoffset=-3 yoffset=-2 xadvance=16 page=0 chnl=15 +char id=77 x=100 y=0 width=30 height=36 xoffset=-3 yoffset=-2 xadvance=27 page=0 chnl=15 +char id=232 x=312 y=152 width=22 height=36 xoffset=-3 yoffset=-2 xadvance=19 page=0 chnl=15 +char id=233 x=240 y=190 width=22 height=36 xoffset=-3 yoffset=-2 xadvance=19 page=0 chnl=15 +char id=234 x=264 y=190 width=22 height=36 xoffset=-3 yoffset=-2 xadvance=19 page=0 chnl=15 +char id=235 x=104 y=76 width=22 height=36 xoffset=-3 yoffset=-2 xadvance=19 page=0 chnl=15 +char id=236 x=430 y=266 width=11 height=36 xoffset=-3 yoffset=-2 xadvance=8 page=0 chnl=15 +char id=237 x=482 y=266 width=11 height=36 xoffset=-3 yoffset=-2 xadvance=8 page=0 chnl=15 +char id=238 x=160 y=266 width=14 height=36 xoffset=-3 yoffset=-2 xadvance=11 page=0 chnl=15 +char id=239 x=176 y=266 width=14 height=36 xoffset=-3 yoffset=-2 xadvance=8 page=0 chnl=15 +char id=240 x=128 y=76 width=22 height=36 xoffset=-3 yoffset=-2 xadvance=19 page=0 chnl=15 +char id=241 x=200 y=76 width=22 height=36 xoffset=-3 yoffset=-2 xadvance=19 page=0 chnl=15 +char id=242 x=224 y=76 width=22 height=36 xoffset=-3 yoffset=-2 xadvance=19 page=0 chnl=15 +char id=243 x=248 y=76 width=22 height=36 xoffset=-3 yoffset=-2 xadvance=19 page=0 chnl=15 +char id=244 x=272 y=76 width=22 height=36 xoffset=-3 yoffset=-2 xadvance=19 page=0 chnl=15 +char id=245 x=296 y=76 width=22 height=36 xoffset=-3 yoffset=-2 xadvance=19 page=0 chnl=15 +char id=246 x=320 y=76 width=22 height=36 xoffset=-3 yoffset=-2 xadvance=19 page=0 chnl=15 +char id=247 x=330 y=190 width=19 height=36 xoffset=-3 yoffset=-2 xadvance=16 page=0 chnl=15 +char id=248 x=208 y=38 width=24 height=36 xoffset=-3 yoffset=-2 xadvance=21 page=0 chnl=15 +char id=249 x=344 y=76 width=22 height=36 xoffset=-3 yoffset=-2 xadvance=19 page=0 chnl=15 +char id=250 x=368 y=76 width=22 height=36 xoffset=-3 yoffset=-2 xadvance=19 page=0 chnl=15 +char id=251 x=416 y=76 width=22 height=36 xoffset=-3 yoffset=-2 xadvance=19 page=0 chnl=15 +char id=252 x=440 y=76 width=22 height=36 xoffset=-3 yoffset=-2 xadvance=19 page=0 chnl=15 +char id=253 x=464 y=76 width=22 height=36 xoffset=-3 yoffset=-2 xadvance=19 page=0 chnl=15 +char id=254 x=0 y=228 width=19 height=36 xoffset=-3 yoffset=-2 xadvance=16 page=0 chnl=15 +char id=255 x=0 y=114 width=22 height=36 xoffset=-3 yoffset=-2 xadvance=19 page=0 chnl=15 diff --git a/examples/resources/fonts/pixantiqua_0.png b/examples/resources/fonts/pixantiqua_0.png Binary files differnew file mode 100644 index 00000000..2aa2870f --- /dev/null +++ b/examples/resources/fonts/pixantiqua_0.png diff --git a/examples/resources/model/dwarf_normal.png b/examples/resources/model/dwarf_normal.png Binary files differnew file mode 100644 index 00000000..ae2babfd --- /dev/null +++ b/examples/resources/model/dwarf_normal.png diff --git a/examples/resources/model/dwarf_specular.png b/examples/resources/model/dwarf_specular.png Binary files differnew file mode 100644 index 00000000..5f51039f --- /dev/null +++ b/examples/resources/model/dwarf_specular.png diff --git a/examples/resources/model/lowpoly-tower.obj b/examples/resources/model/lowpoly-tower.obj new file mode 100644 index 00000000..ea03a9fc --- /dev/null +++ b/examples/resources/model/lowpoly-tower.obj @@ -0,0 +1,456 @@ +# Blender v2.78 (sub 0) OBJ File: 'lowpoly-tower.blend' +# www.blender.org +o Grid +v -4.000000 0.000000 4.000000 +v -2.327363 0.000000 4.654725 +v 0.000000 0.000000 4.654725 +v 2.327363 0.000000 4.654725 +v 4.000000 0.000000 4.000000 +v -4.654725 0.955085 2.327363 +v -2.000000 0.815050 2.000000 +v 0.000000 0.476341 2.423448 +v 2.000000 0.476341 2.000000 +v 4.654725 0.000000 2.327363 +v -4.654725 1.649076 0.000000 +v -2.423448 1.092402 0.000000 +v 2.423448 0.198579 0.000000 +v 4.654725 0.000000 0.000000 +v -4.654725 1.649076 -2.327363 +v -2.000000 1.092402 -2.000000 +v 0.000000 0.476341 -2.423448 +v 2.000000 -0.012791 -2.000000 +v 4.654725 0.000000 -2.612731 +v -4.000000 0.955085 -4.000000 +v -2.327363 0.955085 -4.654725 +v 0.000000 0.955085 -4.654725 +v 2.327363 0.000000 -4.654725 +v 4.000000 0.000000 -4.000000 +v 2.423448 0.682825 0.000000 +v 2.000000 0.565423 -2.000000 +v -4.654725 -0.020560 2.327363 +v -4.654725 0.000000 0.000000 +v -4.654725 0.000000 -2.327363 +v -4.000000 0.000000 -4.000000 +v -2.327363 0.000000 -4.654725 +v 0.000000 -0.020560 -4.654725 +v 0.000000 0.709880 -1.230535 +v -0.000000 7.395413 0.000000 +v 0.962071 0.709880 -0.767226 +v -0.533909 0.709880 1.108674 +v -1.199683 0.709880 0.273820 +v -0.962071 0.709880 -0.767226 +v 1.506076 0.859071 1.325337 +v 1.199683 0.709880 0.273820 +v 0.533909 0.709880 1.108674 +v 0.000000 1.875340 -1.177842 +v -0.000000 2.293973 -0.649884 +v -0.000000 4.365648 -0.627970 +v 0.000000 6.167194 -0.942957 +v 0.000000 6.232434 -1.708677 +v 1.335898 6.232434 -1.065343 +v 0.737233 6.167195 -0.587924 +v 0.490966 4.365648 -0.391533 +v 0.508100 2.293973 -0.405196 +v 0.920874 1.875340 -0.734372 +v -0.741367 6.232434 1.539465 +v -0.409133 6.167195 0.849574 +v -0.272466 4.365648 0.565781 +v -0.281974 2.293973 0.585526 +v -0.511047 1.875340 1.061199 +v -1.665837 6.232434 0.380217 +v -0.919314 6.167195 0.209828 +v -0.612225 4.365648 0.139736 +v -0.633590 2.293973 0.144613 +v -1.148311 1.875340 0.262095 +v -1.335898 6.232434 -1.065343 +v -0.737233 6.167195 -0.587924 +v -0.490967 4.365648 -0.391533 +v -0.508100 2.293973 -0.405196 +v -0.920874 1.875340 -0.734372 +v 1.665837 6.232434 0.380216 +v 0.919315 6.167195 0.209828 +v 0.612225 4.365648 0.139736 +v 0.633590 2.293973 0.144613 +v 1.148311 1.875340 0.262095 +v 0.741367 6.232434 1.539465 +v 0.409133 6.167195 0.849575 +v 0.272466 4.365648 0.565781 +v 0.281974 2.293973 0.585526 +v 0.511046 1.875340 1.061199 +v 0.000000 5.012550 -0.969733 +v 0.758168 5.012550 -0.604618 +v -0.420751 5.012550 0.873699 +v -0.945419 5.012550 0.215786 +v -0.758168 5.012550 -0.604618 +v 0.945419 5.012550 0.215786 +v 0.420751 5.012550 0.873699 +vt 0.0523 0.5444 +vt 0.1817 0.4284 +vt 0.1641 0.5859 +vt 0.0177 0.4451 +vt 0.1526 0.3090 +vt 0.0189 0.1737 +vt 0.0188 0.3088 +vt 0.0561 0.0762 +vt 0.1757 0.1924 +vt 0.3024 0.4534 +vt 0.3071 0.5902 +vt 0.3413 0.2459 +vt 0.2906 0.1614 +vt 0.4116 0.1801 +vt 0.2834 0.3774 +vt 0.1526 0.0362 +vt 0.2917 0.1622 +vt 0.4446 0.5865 +vt 0.4443 0.2989 +vt 0.3711 0.3021 +vt 0.4396 0.0275 +vt 0.4094 0.1829 +vt 0.4219 0.4255 +vt 0.5474 0.5381 +vt 0.5811 0.4376 +vt 0.5715 0.1505 +vt 0.5811 0.2997 +vt 0.5272 0.0533 +vt 0.2208 0.2194 +vt 0.3456 0.3610 +vt 0.2878 0.0321 +vt 0.2321 0.3392 +vt 0.4432 0.0177 +vt 0.7347 0.7934 +vt 0.7382 0.7595 +vt 0.8982 0.7768 +vt 0.6169 0.7595 +vt 0.6139 0.7879 +vt 0.4951 0.7634 +vt 0.1551 0.6832 +vt 0.2925 0.6268 +vt 0.2925 0.6832 +vt 0.7795 0.6832 +vt 0.6421 0.6268 +vt 0.7795 0.6255 +vt 0.5046 0.7241 +vt 0.6421 0.7241 +vt 0.3986 0.6268 +vt 0.3986 0.6832 +vt 0.5046 0.6268 +vt 0.0177 0.6268 +vt 0.1551 0.6255 +vt 0.8856 0.6268 +vt 0.1899 0.9579 +vt 0.1194 0.8696 +vt 0.2324 0.8696 +vt 0.1899 0.7813 +vt 0.0943 0.7595 +vt 0.0177 0.8206 +vt 0.0177 0.9186 +vt 0.0943 0.9797 +vt 0.2793 0.2349 +vt 0.2304 0.2758 +vt 0.6597 0.0177 +vt 0.6954 0.0993 +vt 0.6367 0.0768 +vt 0.7558 0.0777 +vt 0.7238 0.0440 +vt 0.8840 0.1330 +vt 0.7385 0.1141 +vt 0.9157 0.0886 +vt 0.9781 0.1232 +vt 0.9224 0.1276 +vt 0.2677 0.8141 +vt 0.3463 0.8037 +vt 0.3086 0.8339 +vt 0.6387 0.3550 +vt 0.7130 0.3801 +vt 0.6596 0.4053 +vt 0.7245 0.3245 +vt 0.6919 0.3383 +vt 0.8655 0.3566 +vt 0.7351 0.3577 +vt 0.9770 0.3365 +vt 0.9078 0.3751 +vt 0.9174 0.3282 +vt 0.2677 0.9018 +vt 0.3086 0.8821 +vt 0.6803 0.2948 +vt 0.6251 0.3035 +vt 0.7194 0.2854 +vt 0.8764 0.2832 +vt 0.9221 0.2861 +vt 0.3363 0.9565 +vt 0.3464 0.9122 +vt 0.6751 0.2482 +vt 0.6178 0.2499 +vt 0.7179 0.2431 +vt 0.9823 0.2484 +vt 0.9247 0.2452 +vt 0.3935 0.9014 +vt 0.6755 0.1996 +vt 0.6164 0.1941 +vt 0.7201 0.1992 +vt 0.8793 0.2446 +vt 0.9823 0.2060 +vt 0.9257 0.2051 +vt 0.4598 0.8580 +vt 0.4144 0.8579 +vt 0.6819 0.1498 +vt 0.6222 0.1361 +vt 0.7266 0.1555 +vt 0.8831 0.1684 +vt 0.9252 0.1659 +vt 0.4218 0.7790 +vt 0.3934 0.8145 +vt 0.3363 0.7595 +vt 0.8815 0.2060 +vt 0.8720 0.3208 +vt 0.8825 0.1012 +vt 0.9735 0.0816 +vt 0.9718 0.3817 +vt 0.9807 0.2918 +vt 0.4218 0.9370 +vt 0.9810 0.1644 +vn 0.1035 0.8806 0.4623 +vn 0.0964 0.9481 0.3030 +vn 0.0000 0.9780 0.2088 +vn 0.0659 0.9835 0.1683 +vn 0.2325 0.9320 0.2779 +vn 0.0553 0.9960 -0.0702 +vn 0.2827 0.9564 0.0728 +vn 0.1873 0.9776 -0.0961 +vn 0.2421 0.9703 0.0000 +vn 0.0921 0.9772 -0.1913 +vn -0.0277 0.9947 -0.0993 +vn 0.2308 0.9274 -0.2944 +vn 0.2771 0.9572 -0.0837 +vn 0.3724 0.9074 0.1947 +vn 0.0777 0.9770 -0.1985 +vn -0.1094 0.9539 0.2794 +vn 0.0364 0.9844 0.1721 +vn 0.1683 0.9835 0.0659 +vn 0.0674 0.9901 0.1230 +vn 0.4338 0.8823 0.1829 +vn 0.2845 0.9565 0.0649 +vn 0.0886 0.9961 0.0000 +vn 0.2000 0.9789 0.0424 +vn 0.1417 0.9830 0.1171 +vn 0.3021 0.9524 0.0412 +vn -0.0193 0.9986 -0.0493 +vn 0.0000 0.9777 0.2098 +vn 0.0005 0.9781 -0.2083 +vn 0.1879 0.9782 -0.0887 +vn 0.2249 0.0000 0.9744 +vn 0.9783 0.0000 -0.2071 +vn 0.9783 0.0000 0.2071 +vn 0.0000 0.0000 -1.0000 +vn -1.0000 0.0000 0.0000 +vn -0.3645 0.0000 -0.9312 +vn -0.9312 0.0000 -0.3645 +vn -0.9312 0.0000 0.3645 +vn 0.2615 0.7979 -0.5431 +vn 0.5877 0.7979 -0.1341 +vn 0.4713 0.7979 0.3758 +vn -0.0000 0.7979 0.6028 +vn -0.4713 0.7979 0.3758 +vn -0.5877 0.7979 -0.1341 +vn -0.2615 0.7979 -0.5431 +vn -0.1285 0.9864 -0.1025 +vn 0.0929 0.8937 0.4389 +vn -0.4335 0.0407 -0.9002 +vn -0.2867 0.7507 -0.5952 +vn -0.4339 0.0095 -0.9009 +vn -0.4338 0.0209 -0.9008 +vn -0.0408 -0.9956 -0.0848 +vn -0.9741 0.0407 -0.2223 +vn -0.6441 0.7507 -0.1470 +vn -0.9749 0.0095 -0.2225 +vn -0.9747 0.0209 -0.2225 +vn -0.0918 -0.9956 -0.0209 +vn -0.7812 0.0407 0.6230 +vn -0.5165 0.7507 0.4119 +vn -0.7818 0.0095 0.6235 +vn -0.7817 0.0209 0.6234 +vn -0.0736 -0.9956 0.0587 +vn -0.0000 0.0407 0.9992 +vn 0.0000 0.7507 0.6607 +vn 0.0000 0.0095 1.0000 +vn -0.0000 0.0209 0.9998 +vn -0.0000 -0.9956 0.0941 +vn 0.7812 0.0407 0.6230 +vn 0.5165 0.7507 0.4119 +vn 0.7818 0.0095 0.6235 +vn 0.7817 0.0209 0.6234 +vn 0.0736 -0.9956 0.0587 +vn 0.9741 0.0407 -0.2223 +vn 0.6441 0.7507 -0.1470 +vn 0.9749 0.0095 -0.2225 +vn 0.9747 0.0209 -0.2225 +vn 0.0918 -0.9956 -0.0209 +vn 0.4335 0.0407 -0.9002 +vn 0.2867 0.7507 -0.5952 +vn 0.4339 0.0095 -0.9009 +vn 0.4338 0.0209 -0.9008 +vn 0.0408 -0.9956 -0.0848 +vn 0.3918 -0.4298 -0.8135 +vn 0.8803 -0.4298 -0.2009 +vn 0.7059 -0.4298 0.5630 +vn -0.0000 -0.4298 0.9029 +vn -0.7059 -0.4298 0.5630 +vn -0.8803 -0.4298 -0.2009 +vn -0.3918 -0.4298 -0.8135 +vn 0.0210 0.9998 -0.0048 +vn 0.0482 0.9981 -0.0385 +vn -0.0166 0.9914 -0.1301 +vn -0.0090 0.9904 -0.1379 +vn 0.2820 0.9576 0.0597 +vn -0.0000 0.9846 0.1749 +vn -0.0921 0.9772 -0.1913 +vn -0.1734 0.9794 0.1036 +s off +f 1/1/1 7/2/1 6/3/1 +f 2/4/2 8/5/2 7/2/2 +f 4/6/3 8/5/3 3/7/3 +f 5/8/4 9/9/4 4/6/4 +f 6/3/5 12/10/5 11/11/5 +f 35/12/6 25/13/6 26/14/6 +f 7/2/7 37/15/7 12/10/7 +f 10/16/8 13/17/8 9/9/8 +f 12/10/9 15/18/9 11/11/9 +f 35/12/10 17/19/10 33/20/10 +f 13/17/11 19/21/11 18/22/11 +f 16/23/12 20/24/12 15/18/12 +f 17/19/13 21/25/13 16/23/13 +f 17/19/14 23/26/14 22/27/14 +f 26/14/15 24/28/15 23/26/15 +f 1/1/16 2/4/16 7/2/16 +f 2/4/3 3/7/3 8/5/3 +f 4/6/17 9/9/17 8/5/17 +f 5/8/18 10/16/18 9/9/18 +f 6/3/19 7/2/19 12/10/19 +f 25/13/20 39/29/20 9/9/20 +f 38/30/21 12/10/21 37/15/21 +f 10/16/22 14/31/22 13/17/22 +f 12/10/23 16/23/23 15/18/23 +f 8/5/24 36/32/24 7/2/24 +f 38/30/25 17/19/25 16/23/25 +f 13/17/22 14/31/22 19/21/22 +f 16/23/26 21/25/26 20/24/26 +f 17/19/27 22/27/27 21/25/27 +f 17/19/28 26/14/28 23/26/28 +f 26/14/29 19/33/29 24/28/29 +f 26/34/30 18/35/30 19/36/30 +f 26/34/31 13/37/31 18/35/31 +f 25/38/32 9/39/32 13/37/32 +f 22/40/33 31/41/33 21/42/33 +f 6/43/34 28/44/34 27/45/34 +f 15/46/34 28/44/34 11/47/34 +f 21/42/35 30/48/35 20/49/35 +f 20/49/36 29/50/36 15/46/36 +f 22/40/33 23/51/33 32/52/33 +f 6/43/37 27/45/37 1/53/37 +f 46/54/38 34/55/38 47/56/38 +f 47/56/39 34/55/39 67/57/39 +f 67/57/40 34/55/40 72/58/40 +f 72/58/41 34/55/41 52/59/41 +f 52/59/42 34/55/42 57/60/42 +f 57/60/43 34/55/43 62/61/43 +f 62/61/44 34/55/44 46/54/44 +f 40/62/45 41/63/45 39/29/45 +f 39/29/46 8/5/46 9/9/46 +f 38/64/47 42/65/47 33/66/47 +f 65/67/48 42/65/48 66/68/48 +f 65/67/49 44/69/49 43/70/49 +f 81/71/50 45/72/50 77/73/50 +f 62/74/51 45/75/51 63/76/51 +f 37/77/52 66/78/52 38/79/52 +f 60/80/53 66/78/53 61/81/53 +f 60/80/54 64/82/54 65/83/54 +f 58/84/55 81/85/55 80/86/55 +f 57/87/56 63/76/56 58/88/56 +f 56/89/57 37/77/57 36/90/57 +f 55/91/58 61/81/58 56/89/58 +f 54/92/59 60/80/59 55/91/59 +f 79/93/60 58/84/60 80/86/60 +f 52/94/61 58/88/61 53/95/61 +f 76/96/62 36/90/62 41/97/62 +f 75/98/63 56/89/63 76/96/63 +f 75/98/64 54/92/64 55/91/64 +f 73/99/65 79/93/65 83/100/65 +f 73/101/66 52/94/66 53/95/66 +f 71/102/67 41/97/67 40/103/67 +f 70/104/68 76/96/68 71/102/68 +f 70/104/69 74/105/69 75/98/69 +f 68/106/70 83/100/70 82/107/70 +f 67/108/71 73/101/71 68/109/71 +f 51/110/72 40/103/72 35/111/72 +f 50/112/73 71/102/73 51/110/73 +f 49/113/74 70/104/74 50/112/74 +f 78/114/75 68/106/75 82/107/75 +f 47/115/76 68/109/76 48/116/76 +f 42/65/77 35/111/77 33/66/77 +f 43/70/78 51/110/78 42/65/78 +f 44/69/79 50/112/79 43/70/79 +f 45/72/80 78/114/80 77/73/80 +f 46/117/81 48/116/81 45/75/81 +f 44/69/82 78/114/82 49/113/82 +f 49/113/83 82/107/83 69/118/83 +f 82/107/84 74/105/84 69/118/84 +f 83/100/85 54/92/85 74/105/85 +f 79/93/86 59/119/86 54/92/86 +f 80/86/87 64/82/87 59/119/87 +f 64/120/88 77/73/88 44/69/88 +f 35/12/89 40/62/89 25/13/89 +f 7/2/90 36/32/90 37/15/90 +f 35/12/91 26/14/91 17/19/91 +f 25/13/92 40/62/92 39/29/92 +f 38/30/93 16/23/93 12/10/93 +f 8/5/94 41/63/94 36/32/94 +f 38/30/95 33/20/95 17/19/95 +f 26/34/31 25/38/31 13/37/31 +f 22/40/33 32/52/33 31/41/33 +f 6/43/34 11/47/34 28/44/34 +f 15/46/34 29/50/34 28/44/34 +f 21/42/35 31/41/35 30/48/35 +f 20/49/36 30/48/36 29/50/36 +f 39/29/96 41/63/96 8/5/96 +f 38/64/47 66/68/47 42/65/47 +f 65/67/48 43/70/48 42/65/48 +f 65/67/49 64/120/49 44/69/49 +f 81/71/50 63/121/50 45/72/50 +f 62/74/51 46/117/51 45/75/51 +f 37/77/52 61/81/52 66/78/52 +f 60/80/53 65/83/53 66/78/53 +f 60/80/54 59/119/54 64/82/54 +f 58/84/55 63/122/55 81/85/55 +f 57/87/56 62/74/56 63/76/56 +f 56/89/57 61/81/57 37/77/57 +f 55/91/58 60/80/58 61/81/58 +f 54/92/59 59/119/59 60/80/59 +f 79/93/60 53/123/60 58/84/60 +f 52/94/61 57/87/61 58/88/61 +f 76/96/62 56/89/62 36/90/62 +f 75/98/63 55/91/63 56/89/63 +f 75/98/64 74/105/64 54/92/64 +f 73/99/65 53/123/65 79/93/65 +f 73/101/66 72/124/66 52/94/66 +f 71/102/67 76/96/67 41/97/67 +f 70/104/68 75/98/68 76/96/68 +f 70/104/69 69/118/69 74/105/69 +f 68/106/70 73/99/70 83/100/70 +f 67/108/71 72/124/71 73/101/71 +f 51/110/72 71/102/72 40/103/72 +f 50/112/73 70/104/73 71/102/73 +f 49/113/74 69/118/74 70/104/74 +f 78/114/75 48/125/75 68/106/75 +f 47/115/76 67/108/76 68/109/76 +f 42/65/77 51/110/77 35/111/77 +f 43/70/78 50/112/78 51/110/78 +f 44/69/79 49/113/79 50/112/79 +f 45/72/80 48/125/80 78/114/80 +f 46/117/81 47/115/81 48/116/81 +f 44/69/82 77/73/82 78/114/82 +f 49/113/83 78/114/83 82/107/83 +f 82/107/84 83/100/84 74/105/84 +f 83/100/85 79/93/85 54/92/85 +f 79/93/86 80/86/86 59/119/86 +f 80/86/87 81/85/87 64/82/87 +f 64/120/88 81/71/88 77/73/88 diff --git a/examples/resources/model/lowpoly-tower.png b/examples/resources/model/lowpoly-tower.png Binary files differnew file mode 100644 index 00000000..7c9239e2 --- /dev/null +++ b/examples/resources/model/lowpoly-tower.png diff --git a/examples/resources/model/shapes.obj b/examples/resources/model/shapes.obj deleted file mode 100644 index 80205310..00000000 --- a/examples/resources/model/shapes.obj +++ /dev/null @@ -1,6433 +0,0 @@ -# 3ds Max Wavefront OBJ Exporter v0.97b - (c)2007 guruware -# File Created: 17.12.2015 16:35:37 - -# -# object Box001 -# - -v -29.206673 -11.629548 3.941377 -v -6.725425 -11.629548 -1.993001 -v -35.141048 -11.629548 -18.539871 -v -12.659802 -11.629548 -24.474247 -v -29.206673 11.621758 3.941377 -v -6.725425 11.621758 -1.993001 -v -35.141048 11.621758 -18.539871 -v -12.659802 11.621758 -24.474247 -v 9.611540 16.536621 -13.505542 -v 9.611540 16.218872 -16.731674 -v 8.982153 16.218872 -16.669687 -v 8.376951 16.218872 -16.486101 -v 7.819195 16.218872 -16.187973 -v 7.330318 16.218872 -15.786763 -v 6.929106 16.218872 -15.297886 -v 6.630980 16.218872 -14.740129 -v 6.447395 16.218872 -14.134929 -v 6.385406 16.218872 -13.505540 -v 6.447397 16.218872 -12.876153 -v 6.630980 16.218872 -12.270952 -v 6.929110 16.218872 -11.713196 -v 7.330320 16.218872 -11.224319 -v 7.819201 16.218872 -10.823108 -v 8.376955 16.218872 -10.524981 -v 8.982157 16.218872 -10.341396 -v 9.611546 16.218872 -10.279408 -v 10.240931 16.218872 -10.341396 -v 10.846130 16.218872 -10.524984 -v 11.403891 16.218872 -10.823111 -v 11.892763 16.218872 -11.224323 -v 12.293978 16.218872 -11.713202 -v 12.592104 16.218872 -12.270958 -v 12.775690 16.218872 -12.876159 -v 12.837675 16.218872 -13.505547 -v 12.775686 16.218872 -14.134933 -v 12.592100 16.218872 -14.740135 -v 12.293974 16.218872 -15.297892 -v 11.892759 16.218872 -15.786766 -v 11.403879 16.218872 -16.187979 -v 10.846123 16.218872 -16.486103 -v 10.240921 16.218872 -16.669687 -v 9.611540 15.277844 -19.833832 -v 8.376951 15.277844 -19.712234 -v 7.189810 15.277844 -19.352119 -v 6.095730 15.277844 -18.767323 -v 5.136763 15.277844 -17.980320 -v 4.349756 15.277844 -17.021351 -v 3.764961 15.277844 -15.927273 -v 3.404844 15.277844 -14.740128 -v 3.283251 15.277844 -13.505539 -v 3.404846 15.277844 -12.270950 -v 3.764965 15.277844 -11.083807 -v 4.349760 15.277844 -9.989729 -v 5.136766 15.277844 -9.030762 -v 6.095734 15.277844 -8.243757 -v 7.189814 15.277844 -7.658960 -v 8.376957 15.277844 -7.298847 -v 9.611546 15.277844 -7.177250 -v 10.846136 15.277844 -7.298848 -v 12.033278 15.277844 -7.658965 -v 13.127356 15.277844 -8.243764 -v 14.086321 15.277844 -9.030769 -v 14.873327 15.277844 -9.989739 -v 15.458120 15.277844 -11.083817 -v 15.818235 15.277844 -12.270962 -v 15.939829 15.277844 -13.505550 -v 15.818232 15.277844 -14.740141 -v 15.458117 15.277844 -15.927283 -v 14.873316 15.277844 -17.021362 -v 14.086309 15.277844 -17.980328 -v 13.127340 15.277844 -18.767330 -v 12.033262 15.277844 -19.352125 -v 10.846117 15.277844 -19.712238 -v 9.611540 13.749696 -22.692797 -v 7.819195 13.749696 -22.516266 -v 6.095732 13.749696 -21.993458 -v 4.507378 13.749696 -21.144464 -v 3.115171 13.749696 -20.001911 -v 1.972616 13.749696 -18.609707 -v 1.123623 13.749696 -17.021351 -v 0.600817 13.749696 -15.297884 -v 0.424284 13.749696 -13.505539 -v 0.600817 13.749696 -11.713193 -v 1.123625 13.749696 -9.989727 -v 1.972622 13.749696 -8.401373 -v 3.115173 13.749696 -7.009167 -v 4.507380 13.749696 -5.866615 -v 6.095739 13.749696 -5.017623 -v 7.819202 13.749696 -4.494817 -v 9.611549 13.749696 -4.318287 -v 11.403894 13.749696 -4.494820 -v 13.127363 13.749696 -5.017629 -v 14.715715 13.749696 -5.866625 -v 16.107920 13.749696 -7.009181 -v 17.250471 13.749696 -8.401387 -v 18.099459 13.749696 -9.989742 -v 18.622267 13.749696 -11.713211 -v 18.798796 13.749696 -13.505556 -v 18.622259 13.749696 -15.297901 -v 18.099455 13.749696 -17.021366 -v 17.250452 13.749696 -18.609722 -v 16.107897 13.749696 -20.001925 -v 14.715693 13.749696 -21.144474 -v 13.127333 13.749696 -21.993465 -v 11.403864 13.749696 -22.516270 -v 9.611540 11.693156 -25.198696 -v 7.330318 11.693156 -24.974016 -v 5.136763 11.693156 -24.308609 -v 3.115171 11.693156 -23.228046 -v 1.343229 11.693156 -21.773851 -v -0.110964 11.693156 -20.001911 -v -1.191528 11.693156 -17.980316 -v -1.856936 11.693156 -15.786760 -v -2.081615 11.693156 -13.505538 -v -1.856934 11.693156 -11.224315 -v -1.191525 11.693156 -9.030760 -v -0.110960 11.693156 -7.009166 -v 1.343235 11.693156 -5.237227 -v 3.115177 11.693156 -3.783033 -v 5.136772 11.693156 -2.702470 -v 7.330328 11.693156 -2.037066 -v 9.611549 11.693156 -1.812386 -v 11.892775 11.693156 -2.037068 -v 14.086332 11.693156 -2.702479 -v 16.107920 11.693156 -3.783048 -v 17.879862 11.693156 -5.237242 -v 19.334051 11.693156 -7.009185 -v 20.414614 11.693156 -9.030780 -v 21.080019 11.693156 -11.224338 -v 21.304697 11.693156 -13.505560 -v 21.080015 11.693156 -15.786782 -v 20.414602 11.693156 -17.980339 -v 19.334028 11.693156 -20.001928 -v 17.879831 11.693156 -21.773867 -v 16.107893 11.693156 -23.228058 -v 14.086294 11.693156 -24.308619 -v 11.892736 11.693156 -24.974022 -v 9.611540 9.187253 -27.255239 -v 6.929108 9.187253 -26.991041 -v 4.349760 9.187253 -26.208607 -v 1.972618 9.187253 -24.938000 -v -0.110964 9.187253 -23.228046 -v -1.820917 9.187253 -21.144463 -v -3.091526 9.187253 -18.767321 -v -3.873960 9.187253 -16.187971 -v -4.138157 9.187253 -13.505537 -v -3.873959 9.187253 -10.823103 -v -3.091520 9.187253 -8.243754 -v -1.820911 9.187253 -5.866612 -v -0.110958 9.187253 -3.783032 -v 1.972626 9.187253 -2.073080 -v 4.349768 9.187253 -0.802473 -v 6.929121 9.187253 -0.020039 -v 9.611553 9.187253 0.244156 -v 12.293989 9.187253 -0.020043 -v 14.873335 9.187253 -0.802485 -v 17.250479 9.187253 -2.073095 -v 19.334059 9.187253 -3.783049 -v 21.044004 9.187253 -5.866634 -v 22.314611 9.187253 -8.243777 -v 23.097048 9.187253 -10.823130 -v 23.361238 9.187253 -13.505564 -v 23.097036 9.187253 -16.187996 -v 22.314596 9.187253 -18.767345 -v 21.043982 9.187253 -21.144485 -v 19.334024 9.187253 -23.228065 -v 17.250437 9.187253 -24.938011 -v 14.873293 9.187253 -26.208616 -v 12.293943 9.187253 -26.991047 -v 9.611538 6.328290 -28.783384 -v 6.630981 6.328290 -28.489828 -v 3.764963 6.328290 -27.620428 -v 1.123625 6.328290 -26.208605 -v -1.191526 6.328290 -24.308609 -v -3.091524 6.328290 -21.993456 -v -4.503347 6.328290 -19.352118 -v -5.372744 6.328290 -16.486097 -v -5.666305 6.328290 -13.505537 -v -5.372743 6.328290 -10.524976 -v -4.503345 6.328290 -7.658957 -v -3.091518 6.328290 -5.017619 -v -1.191521 6.328290 -2.702466 -v 1.123632 6.328290 -0.802471 -v 3.764975 6.328290 0.609350 -v 6.630993 6.328290 1.478745 -v 9.611555 6.328290 1.772303 -v 12.592115 6.328290 1.478741 -v 15.458136 6.328290 0.609339 -v 18.099470 6.328290 -0.802490 -v 20.414621 6.328290 -2.702490 -v 22.314619 6.328290 -5.017643 -v 23.726439 6.328290 -7.658983 -v 24.595831 6.328290 -10.525005 -v 24.889383 6.328290 -13.505566 -v 24.595819 6.328290 -16.486126 -v 23.726416 6.328290 -19.352144 -v 22.314589 6.328290 -21.993481 -v 20.414587 6.328290 -24.308628 -v 18.099432 6.328290 -26.208620 -v 15.458090 6.328290 -27.620440 -v 12.592066 6.328290 -28.489836 -v 9.611540 3.226134 -29.724413 -v 6.447395 3.226134 -29.412773 -v 3.404846 3.226134 -28.489826 -v 0.600817 3.226134 -26.991041 -v -1.856936 3.226134 -24.974018 -v -3.873960 3.226134 -22.516266 -v -5.372746 3.226134 -19.712233 -v -6.295692 3.226134 -16.669682 -v -6.607332 3.226134 -13.505536 -v -6.295691 3.226134 -10.341390 -v -5.372740 3.226134 -7.298840 -v -3.873955 3.226134 -4.494810 -v -1.856928 3.226134 -2.037058 -v 0.600828 3.226134 -0.020035 -v 3.404858 3.226134 1.478746 -v 6.447409 3.226134 2.401691 -v 9.611555 3.226134 2.713330 -v 12.775702 3.226134 2.401687 -v 15.818251 3.226134 1.478735 -v 18.622282 3.226134 -0.020055 -v 21.080030 3.226134 -2.037082 -v 23.097055 3.226134 -4.494838 -v 24.595835 3.226134 -7.298870 -v 25.518774 3.226134 -10.341419 -v 25.830408 3.226134 -13.505567 -v 25.518766 3.226134 -16.669714 -v 24.595812 3.226134 -19.712261 -v 23.097025 3.226134 -22.516289 -v 21.079992 3.226134 -24.974037 -v 18.622236 3.226134 -26.991058 -v 15.818205 3.226134 -28.489840 -v 12.775652 3.226134 -29.412781 -v 9.611538 0.000001 -30.042162 -v 6.385406 0.000001 -29.724417 -v 3.283249 0.000001 -28.783388 -v 0.424286 0.000001 -27.255239 -v -2.081615 0.000001 -25.198698 -v -4.138157 0.000001 -22.692795 -v -5.666304 0.000001 -19.833830 -v -6.607334 0.000001 -16.731672 -v -6.925080 0.000001 -13.505536 -v -6.607332 0.000001 -10.279400 -v -5.666301 0.000001 -7.177244 -v -4.138151 0.000001 -4.318279 -v -2.081610 0.000001 -1.812377 -v 0.424297 0.000001 0.244163 -v 3.283260 0.000001 1.772307 -v 6.385422 0.000001 2.713336 -v 9.611557 0.000001 3.031079 -v 12.837690 0.000001 2.713330 -v 15.939848 0.000001 1.772296 -v 18.798811 0.000001 0.244145 -v 21.304712 0.000001 -1.812400 -v 23.361250 0.000001 -4.318306 -v 24.889395 0.000001 -7.177274 -v 25.830423 0.000001 -10.279431 -v 26.148161 0.000001 -13.505568 -v 25.830408 0.000001 -16.731703 -v 24.889376 0.000001 -19.833858 -v 23.361219 0.000001 -22.692820 -v 21.304674 0.000001 -25.198719 -v 18.798765 0.000001 -27.255259 -v 15.939802 0.000001 -28.783400 -v 12.837637 0.000001 -29.724421 -v 9.611540 -3.226133 -29.724415 -v 6.447395 -3.226133 -29.412775 -v 3.404846 -3.226133 -28.489828 -v 0.600817 -3.226133 -26.991045 -v -1.856936 -3.226133 -24.974018 -v -3.873960 -3.226133 -22.516266 -v -5.372747 -3.226133 -19.712233 -v -6.295694 -3.226133 -16.669683 -v -6.607334 -3.226133 -13.505536 -v -6.295692 -3.226133 -10.341390 -v -5.372742 -3.226133 -7.298840 -v -3.873957 -3.226133 -4.494810 -v -1.856928 -3.226133 -2.037058 -v 0.600826 -3.226133 -0.020033 -v 3.404856 -3.226133 1.478751 -v 6.447409 -3.226133 2.401693 -v 9.611555 -3.226133 2.713333 -v 12.775705 -3.226133 2.401688 -v 15.818251 -3.226133 1.478737 -v 18.622282 -3.226133 -0.020053 -v 21.080030 -3.226133 -2.037082 -v 23.097052 -3.226133 -4.494835 -v 24.595835 -3.226133 -7.298868 -v 25.518778 -3.226133 -10.341420 -v 25.830412 -3.226133 -13.505567 -v 25.518766 -3.226133 -16.669714 -v 24.595812 -3.226133 -19.712261 -v 23.097025 -3.226133 -22.516291 -v 21.079996 -3.226133 -24.974041 -v 18.622236 -3.226133 -26.991062 -v 15.818201 -3.226133 -28.489841 -v 12.775652 -3.226133 -29.412783 -v 9.611538 -6.328289 -28.783388 -v 6.630981 -6.328289 -28.489828 -v 3.764963 -6.328289 -27.620430 -v 1.123625 -6.328289 -26.208607 -v -1.191526 -6.328289 -24.308609 -v -3.091524 -6.328289 -21.993456 -v -4.503351 -6.328289 -19.352118 -v -5.372746 -6.328289 -16.486097 -v -5.666306 -6.328289 -13.505537 -v -5.372745 -6.328289 -10.524975 -v -4.503345 -6.328289 -7.658956 -v -3.091518 -6.328289 -5.017619 -v -1.191521 -6.328289 -2.702466 -v 1.123632 -6.328289 -0.802471 -v 3.764973 -6.328289 0.609352 -v 6.630993 -6.328289 1.478746 -v 9.611555 -6.328289 1.772305 -v 12.592115 -6.328289 1.478741 -v 15.458136 -6.328289 0.609339 -v 18.099474 -6.328289 -0.802486 -v 20.414621 -6.328289 -2.702488 -v 22.314619 -6.328289 -5.017643 -v 23.726439 -6.328289 -7.658984 -v 24.595831 -6.328289 -10.525005 -v 24.889387 -6.328289 -13.505566 -v 24.595819 -6.328289 -16.486126 -v 23.726416 -6.328289 -19.352144 -v 22.314589 -6.328289 -21.993481 -v 20.414591 -6.328289 -24.308630 -v 18.099432 -6.328289 -26.208622 -v 15.458090 -6.328289 -27.620440 -v 12.592066 -6.328289 -28.489836 -v 9.611540 -9.187254 -27.255239 -v 6.929108 -9.187254 -26.991041 -v 4.349760 -9.187254 -26.208607 -v 1.972618 -9.187254 -24.938000 -v -0.110964 -9.187254 -23.228046 -v -1.820917 -9.187254 -21.144463 -v -3.091526 -9.187254 -18.767321 -v -3.873960 -9.187254 -16.187971 -v -4.138157 -9.187254 -13.505537 -v -3.873959 -9.187254 -10.823103 -v -3.091520 -9.187254 -8.243754 -v -1.820911 -9.187254 -5.866612 -v -0.110958 -9.187254 -3.783032 -v 1.972626 -9.187254 -2.073080 -v 4.349768 -9.187254 -0.802473 -v 6.929121 -9.187254 -0.020039 -v 9.611553 -9.187254 0.244156 -v 12.293989 -9.187254 -0.020043 -v 14.873335 -9.187254 -0.802485 -v 17.250479 -9.187254 -2.073095 -v 19.334059 -9.187254 -3.783049 -v 21.044004 -9.187254 -5.866634 -v 22.314611 -9.187254 -8.243777 -v 23.097048 -9.187254 -10.823130 -v 23.361238 -9.187254 -13.505564 -v 23.097036 -9.187254 -16.187996 -v 22.314596 -9.187254 -18.767345 -v 21.043982 -9.187254 -21.144485 -v 19.334024 -9.187254 -23.228065 -v 17.250437 -9.187254 -24.938011 -v 14.873293 -9.187254 -26.208616 -v 12.293943 -9.187254 -26.991047 -v 9.611540 -11.693157 -25.198696 -v 7.330318 -11.693157 -24.974016 -v 5.136763 -11.693157 -24.308609 -v 3.115171 -11.693157 -23.228046 -v 1.343229 -11.693157 -21.773851 -v -0.110964 -11.693157 -20.001911 -v -1.191528 -11.693157 -17.980316 -v -1.856936 -11.693157 -15.786760 -v -2.081615 -11.693157 -13.505538 -v -1.856934 -11.693157 -11.224315 -v -1.191525 -11.693157 -9.030760 -v -0.110960 -11.693157 -7.009166 -v 1.343235 -11.693157 -5.237227 -v 3.115177 -11.693157 -3.783033 -v 5.136772 -11.693157 -2.702470 -v 7.330328 -11.693157 -2.037066 -v 9.611549 -11.693157 -1.812386 -v 11.892775 -11.693157 -2.037068 -v 14.086332 -11.693157 -2.702479 -v 16.107920 -11.693157 -3.783048 -v 17.879862 -11.693157 -5.237242 -v 19.334051 -11.693157 -7.009185 -v 20.414614 -11.693157 -9.030780 -v 21.080019 -11.693157 -11.224338 -v 21.304697 -11.693157 -13.505560 -v 21.080015 -11.693157 -15.786782 -v 20.414602 -11.693157 -17.980339 -v 19.334028 -11.693157 -20.001928 -v 17.879831 -11.693157 -21.773867 -v 16.107893 -11.693157 -23.228058 -v 14.086294 -11.693157 -24.308619 -v 11.892736 -11.693157 -24.974022 -v 9.611540 -13.749699 -22.692795 -v 7.819195 -13.749699 -22.516264 -v 6.095732 -13.749699 -21.993458 -v 4.507378 -13.749699 -21.144464 -v 3.115171 -13.749699 -20.001911 -v 1.972616 -13.749699 -18.609705 -v 1.123623 -13.749699 -17.021349 -v 0.600817 -13.749699 -15.297884 -v 0.424286 -13.749699 -13.505538 -v 0.600817 -13.749699 -11.713193 -v 1.123625 -13.749699 -9.989727 -v 1.972622 -13.749699 -8.401373 -v 3.115175 -13.749699 -7.009168 -v 4.507381 -13.749699 -5.866616 -v 6.095739 -13.749699 -5.017623 -v 7.819206 -13.749699 -4.494817 -v 9.611549 -13.749699 -4.318288 -v 11.403894 -13.749699 -4.494821 -v 13.127359 -13.749699 -5.017631 -v 14.715715 -13.749699 -5.866625 -v 16.107920 -13.749699 -7.009181 -v 17.250467 -13.749699 -8.401387 -v 18.099459 -13.749699 -9.989744 -v 18.622267 -13.749699 -11.713211 -v 18.798796 -13.749699 -13.505556 -v 18.622259 -13.749699 -15.297901 -v 18.099451 -13.749699 -17.021366 -v 17.250452 -13.749699 -18.609718 -v 16.107897 -13.749699 -20.001923 -v 14.715693 -13.749699 -21.144474 -v 13.127333 -13.749699 -21.993464 -v 11.403864 -13.749699 -22.516270 -v 9.611540 -15.277846 -19.833830 -v 8.376951 -15.277846 -19.712233 -v 7.189810 -15.277846 -19.352118 -v 6.095734 -15.277846 -18.767323 -v 5.136765 -15.277846 -17.980316 -v 4.349762 -15.277846 -17.021349 -v 3.764965 -15.277846 -15.927272 -v 3.404848 -15.277846 -14.740128 -v 3.283253 -15.277846 -13.505540 -v 3.404848 -15.277846 -12.270950 -v 3.764967 -15.277846 -11.083808 -v 4.349762 -15.277846 -9.989730 -v 5.136768 -15.277846 -9.030764 -v 6.095736 -15.277846 -8.243760 -v 7.189816 -15.277846 -7.658964 -v 8.376957 -15.277846 -7.298849 -v 9.611546 -15.277846 -7.177253 -v 10.846136 -15.277846 -7.298851 -v 12.033278 -15.277846 -7.658967 -v 13.127356 -15.277846 -8.243767 -v 14.086321 -15.277846 -9.030771 -v 14.873323 -15.277846 -9.989740 -v 15.458120 -15.277846 -11.083818 -v 15.818235 -15.277846 -12.270964 -v 15.939829 -15.277846 -13.505552 -v 15.818228 -15.277846 -14.740139 -v 15.458113 -15.277846 -15.927282 -v 14.873312 -15.277846 -17.021358 -v 14.086306 -15.277846 -17.980324 -v 13.127340 -15.277846 -18.767326 -v 12.033258 -15.277846 -19.352121 -v 10.846113 -15.277846 -19.712234 -v 9.611542 -16.218876 -16.731672 -v 8.982155 -16.218876 -16.669683 -v 8.376953 -16.218876 -16.486097 -v 7.819199 -16.218876 -16.187971 -v 7.330320 -16.218876 -15.786760 -v 6.929110 -16.218876 -15.297883 -v 6.630983 -16.218876 -14.740128 -v 6.447399 -16.218876 -14.134928 -v 6.385410 -16.218876 -13.505540 -v 6.447399 -16.218876 -12.876153 -v 6.630985 -16.218876 -12.270953 -v 6.929111 -16.218876 -11.713198 -v 7.330322 -16.218876 -11.224320 -v 7.819199 -16.218876 -10.823111 -v 8.376955 -16.218876 -10.524984 -v 8.982157 -16.218876 -10.341399 -v 9.611544 -16.218876 -10.279411 -v 10.240929 -16.218876 -10.341400 -v 10.846130 -16.218876 -10.524986 -v 11.403883 -16.218876 -10.823112 -v 11.892759 -16.218876 -11.224325 -v 12.293974 -16.218876 -11.713202 -v 12.592100 -16.218876 -12.270960 -v 12.775686 -16.218876 -12.876160 -v 12.837671 -16.218876 -13.505547 -v 12.775682 -16.218876 -14.134933 -v 12.592093 -16.218876 -14.740133 -v 12.293966 -16.218876 -15.297888 -v 11.892756 -16.218876 -15.786764 -v 11.403879 -16.218876 -16.187975 -v 10.846121 -16.218876 -16.486099 -v 10.240923 -16.218876 -16.669685 -v 9.611540 -16.536621 -13.505542 -v 7.404444 -11.629548 14.999386 -v 6.914089 -11.629548 11.274763 -v 5.476439 -11.629548 7.803965 -v 3.189468 -11.629548 4.823524 -v 0.209024 -11.629548 2.536550 -v -3.261770 -11.629548 1.098902 -v -6.986394 -11.629548 0.608545 -v -10.711016 -11.629548 1.098901 -v -14.181813 -11.629548 2.536551 -v -17.162252 -11.629548 4.823524 -v -19.449226 -11.629548 7.803963 -v -20.886879 -11.629548 11.274757 -v -21.377235 -11.629548 14.999380 -v -20.886881 -11.629548 18.724003 -v -19.449232 -11.629548 22.194799 -v -17.162262 -11.629548 25.175241 -v -14.181819 -11.629548 27.462217 -v -10.711023 -11.629548 28.899866 -v -6.986402 -11.629548 29.390230 -v -3.261778 -11.629548 28.899870 -v 0.209021 -11.629548 27.462225 -v 3.189459 -11.629548 25.175253 -v 5.476435 -11.629548 22.194815 -v 6.914087 -11.629548 18.724018 -v 4.526278 -6.021804 14.999386 -v 4.133991 -6.021804 12.019686 -v 2.983871 -6.021804 9.243050 -v 1.154293 -6.021804 6.858698 -v -1.230059 -6.021804 5.029119 -v -4.006697 -6.021804 3.878999 -v -6.986394 -6.021804 3.486713 -v -9.966091 -6.021804 3.878998 -v -12.742728 -6.021804 5.029119 -v -15.127081 -6.021804 6.858694 -v -16.956659 -6.021804 9.243046 -v -18.106781 -6.021804 12.019682 -v -18.499065 -6.021804 14.999382 -v -18.106783 -6.021804 17.979080 -v -16.956663 -6.021804 20.755716 -v -15.127088 -6.021804 23.140070 -v -12.742735 -6.021804 24.969648 -v -9.966098 -6.021804 26.119772 -v -6.986401 -6.021804 26.512056 -v -4.006702 -6.021804 26.119776 -v -1.230064 -6.021804 24.969656 -v 1.154287 -6.021804 23.140078 -v 2.983870 -6.021804 20.755726 -v 4.133989 -6.021804 17.979094 -v 1.648109 -0.414061 14.999384 -v 1.353897 -0.414061 12.764610 -v 0.491306 -0.414061 10.682133 -v -0.880878 -0.414061 8.893867 -v -2.669142 -0.414061 7.521685 -v -4.751619 -0.414061 6.659094 -v -6.986394 -0.414061 6.364882 -v -9.221169 -0.414061 6.659092 -v -11.303646 -0.414061 7.521683 -v -13.091910 -0.414061 8.893866 -v -14.464094 -0.414061 10.682131 -v -15.326685 -0.414061 12.764608 -v -15.620899 -0.414061 14.999384 -v -15.326687 -0.414061 17.234158 -v -14.464097 -0.414061 19.316635 -v -13.091915 -0.414061 21.104900 -v -11.303650 -0.414061 22.477083 -v -9.221172 -0.414061 23.339674 -v -6.986399 -0.414061 23.633890 -v -4.751623 -0.414061 23.339678 -v -2.669146 -0.414061 22.477091 -v -0.880880 -0.414061 21.104906 -v 0.491302 -0.414061 19.316643 -v 1.353895 -0.414061 17.234167 -v -1.230061 5.193685 14.999384 -v -1.426203 5.193685 13.509537 -v -2.001261 5.193685 12.121216 -v -2.916052 5.193685 10.929041 -v -4.108227 5.193685 10.014252 -v -5.496546 5.193685 9.439192 -v -6.986395 5.193685 9.243050 -v -8.476243 5.193685 9.439192 -v -9.864561 5.193685 10.014252 -v -11.056738 5.193685 10.929039 -v -11.971527 5.193685 12.121216 -v -12.546587 5.193685 13.509535 -v -12.742730 5.193685 14.999382 -v -12.546589 5.193685 16.489231 -v -11.971529 5.193685 17.877550 -v -11.056741 5.193685 19.069729 -v -9.864565 5.193685 19.984518 -v -8.476246 5.193685 20.559580 -v -6.986398 5.193685 20.755722 -v -5.496548 5.193685 20.559580 -v -4.108229 5.193685 19.984522 -v -2.916054 5.193685 19.069735 -v -2.001265 5.193685 17.877556 -v -1.426203 5.193685 16.489239 -v -4.108227 10.801427 14.999386 -v -4.206299 10.801427 14.254461 -v -4.493828 10.801427 13.560303 -v -4.951223 10.801427 12.964212 -v -5.547310 10.801427 12.506819 -v -6.241470 10.801427 12.219290 -v -6.986395 10.801427 12.121216 -v -7.731319 10.801427 12.219288 -v -8.425478 10.801427 12.506819 -v -9.021566 10.801427 12.964212 -v -9.478960 10.801427 13.560303 -v -9.766491 10.801427 14.254459 -v -9.864563 10.801427 14.999384 -v -9.766492 10.801427 15.744308 -v -9.478962 10.801427 16.438467 -v -9.021568 10.801427 17.034555 -v -8.425480 10.801427 17.491951 -v -7.731320 10.801427 17.779482 -v -6.986397 10.801427 17.877552 -v -6.241472 10.801427 17.779484 -v -5.547312 10.801427 17.491953 -v -4.951224 10.801427 17.034559 -v -4.493830 10.801427 16.438471 -v -4.206299 10.801427 15.744314 -v -6.986395 16.409168 14.999386 -v -6.986395 16.409168 14.999386 -v -6.986395 16.409168 14.999386 -v -6.986395 16.409168 14.999386 -v -6.986395 16.409168 14.999386 -v -6.986395 16.409168 14.999386 -v -6.986395 16.409168 14.999386 -v -6.986395 16.409168 14.999386 -v -6.986395 16.409168 14.999386 -v -6.986395 16.409168 14.999386 -v -6.986395 16.409168 14.999386 -v -6.986395 16.409168 14.999386 -v -6.986395 16.409168 14.999386 -v -6.986395 16.409168 14.999386 -v -6.986395 16.409168 14.999386 -v -6.986395 16.409168 14.999386 -v -6.986395 16.409168 14.999386 -v -6.986395 16.409168 14.999386 -v -6.986395 16.409168 14.999386 -v -6.986395 16.409168 14.999386 -v -6.986395 16.409168 14.999386 -v -6.986395 16.409168 14.999386 -v -6.986395 16.409168 14.999386 -v -6.986395 16.409168 14.999386 -# 634 vertices - -vn 0.000000 -1.000000 -0.000000 -vn 0.000000 -1.000000 -0.000000 -vn 0.000000 -1.000000 -0.000000 -vn 0.000000 -1.000000 -0.000000 -vn 0.000000 -1.000000 -0.000000 -vn 0.000000 -1.000000 -0.000000 -vn 0.000000 1.000000 -0.000000 -vn 0.000000 1.000000 -0.000000 -vn 0.000000 1.000000 -0.000000 -vn 0.000000 1.000000 -0.000000 -vn 0.000000 1.000000 -0.000000 -vn 0.000000 1.000000 -0.000000 -vn 0.255228 0.000000 0.966881 -vn 0.255228 0.000000 0.966881 -vn 0.255228 0.000000 0.966881 -vn 0.255228 0.000000 0.966881 -vn 0.255228 0.000000 0.966881 -vn 0.255228 0.000000 0.966881 -vn 0.966881 0.000000 -0.255228 -vn 0.966881 0.000000 -0.255228 -vn 0.966881 0.000000 -0.255228 -vn 0.966881 0.000000 -0.255228 -vn 0.966881 0.000000 -0.255228 -vn 0.966881 0.000000 -0.255228 -vn -0.255228 0.000000 -0.966881 -vn -0.255228 0.000000 -0.966881 -vn -0.255228 0.000000 -0.966881 -vn -0.255228 0.000000 -0.966881 -vn -0.255228 0.000000 -0.966881 -vn -0.255228 0.000000 -0.966881 -vn -0.966881 0.000000 0.255228 -vn -0.966881 0.000000 0.255228 -vn -0.966881 0.000000 0.255228 -vn -0.966881 0.000000 0.255228 -vn -0.966881 0.000000 0.255228 -vn -0.966881 0.000000 0.255228 -vn -0.000000 1.000000 0.000000 -vn -0.000000 0.979598 -0.200969 -vn -0.039207 0.979598 -0.197107 -vn -0.000000 1.000000 0.000000 -vn -0.039207 0.979598 -0.197107 -vn -0.076907 0.979598 -0.185671 -vn -0.000000 1.000000 0.000000 -vn -0.076907 0.979598 -0.185671 -vn -0.111652 0.979598 -0.167099 -vn -0.000000 1.000000 0.000000 -vn -0.111652 0.979598 -0.167099 -vn -0.142106 0.979598 -0.142106 -vn -0.000000 1.000000 0.000000 -vn -0.142106 0.979598 -0.142106 -vn -0.167099 0.979598 -0.111652 -vn -0.000000 1.000000 0.000000 -vn -0.167099 0.979598 -0.111652 -vn -0.185671 0.979598 -0.076907 -vn -0.000000 1.000000 0.000000 -vn -0.185671 0.979598 -0.076907 -vn -0.197107 0.979598 -0.039207 -vn -0.000000 1.000000 0.000000 -vn -0.197107 0.979598 -0.039207 -vn -0.200969 0.979598 0.000000 -vn -0.000000 1.000000 0.000000 -vn -0.200969 0.979598 0.000000 -vn -0.197107 0.979598 0.039207 -vn -0.000000 1.000000 0.000000 -vn -0.197107 0.979598 0.039207 -vn -0.185671 0.979598 0.076907 -vn -0.000000 1.000000 0.000000 -vn -0.185671 0.979598 0.076907 -vn -0.167099 0.979598 0.111652 -vn -0.000000 1.000000 0.000000 -vn -0.167099 0.979598 0.111652 -vn -0.142106 0.979598 0.142107 -vn -0.000000 1.000000 0.000000 -vn -0.142106 0.979598 0.142107 -vn -0.111652 0.979598 0.167099 -vn -0.000000 1.000000 0.000000 -vn -0.111652 0.979598 0.167099 -vn -0.076907 0.979598 0.185671 -vn -0.000000 1.000000 0.000000 -vn -0.076907 0.979598 0.185671 -vn -0.039207 0.979598 0.197107 -vn -0.000000 1.000000 0.000000 -vn -0.039207 0.979598 0.197107 -vn 0.000000 0.979598 0.200969 -vn -0.000000 1.000000 0.000000 -vn 0.000000 0.979598 0.200969 -vn 0.039207 0.979598 0.197107 -vn -0.000000 1.000000 0.000000 -vn 0.039207 0.979598 0.197107 -vn 0.076908 0.979598 0.185671 -vn -0.000000 1.000000 0.000000 -vn 0.076908 0.979598 0.185671 -vn 0.111652 0.979598 0.167099 -vn -0.000000 1.000000 0.000000 -vn 0.111652 0.979598 0.167099 -vn 0.142107 0.979598 0.142106 -vn -0.000000 1.000000 0.000000 -vn 0.142107 0.979598 0.142106 -vn 0.167100 0.979598 0.111652 -vn -0.000000 1.000000 0.000000 -vn 0.167100 0.979598 0.111652 -vn 0.185671 0.979598 0.076907 -vn -0.000000 1.000000 0.000000 -vn 0.185671 0.979598 0.076907 -vn 0.197107 0.979598 0.039206 -vn -0.000000 1.000000 0.000000 -vn 0.197107 0.979598 0.039206 -vn 0.200969 0.979598 -0.000001 -vn -0.000000 1.000000 0.000000 -vn 0.200969 0.979598 -0.000001 -vn 0.197107 0.979598 -0.039207 -vn -0.000000 1.000000 0.000000 -vn 0.197107 0.979598 -0.039207 -vn 0.185671 0.979598 -0.076908 -vn -0.000000 1.000000 0.000000 -vn 0.185671 0.979598 -0.076908 -vn 0.167099 0.979598 -0.111653 -vn -0.000000 1.000000 0.000000 -vn 0.167099 0.979598 -0.111653 -vn 0.142106 0.979598 -0.142107 -vn -0.000000 1.000000 0.000000 -vn 0.142106 0.979598 -0.142107 -vn 0.111652 0.979598 -0.167100 -vn -0.000000 1.000000 0.000000 -vn 0.111652 0.979598 -0.167100 -vn 0.076907 0.979598 -0.185671 -vn -0.000000 1.000000 0.000000 -vn 0.076907 0.979598 -0.185671 -vn 0.039207 0.979598 -0.197107 -vn -0.000000 1.000000 0.000000 -vn 0.039207 0.979598 -0.197107 -vn -0.000000 0.979598 -0.200969 -vn -0.075673 0.921707 -0.380434 -vn -0.039207 0.979598 -0.197107 -vn -0.000000 0.979598 -0.200969 -vn -0.000000 0.979598 -0.200969 -vn -0.000000 0.921707 -0.387887 -vn -0.075673 0.921707 -0.380434 -vn -0.148438 0.921707 -0.358361 -vn -0.076907 0.979598 -0.185671 -vn -0.039207 0.979598 -0.197107 -vn -0.039207 0.979598 -0.197107 -vn -0.075673 0.921707 -0.380434 -vn -0.148438 0.921707 -0.358361 -vn -0.215499 0.921707 -0.322516 -vn -0.111652 0.979598 -0.167099 -vn -0.076907 0.979598 -0.185671 -vn -0.076907 0.979598 -0.185671 -vn -0.148438 0.921707 -0.358361 -vn -0.215499 0.921707 -0.322516 -vn -0.274278 0.921707 -0.274278 -vn -0.142106 0.979598 -0.142106 -vn -0.111652 0.979598 -0.167099 -vn -0.111652 0.979598 -0.167099 -vn -0.215499 0.921707 -0.322516 -vn -0.274278 0.921707 -0.274278 -vn -0.322516 0.921707 -0.215499 -vn -0.167099 0.979598 -0.111652 -vn -0.142106 0.979598 -0.142106 -vn -0.142106 0.979598 -0.142106 -vn -0.274278 0.921707 -0.274278 -vn -0.322516 0.921707 -0.215499 -vn -0.358361 0.921707 -0.148438 -vn -0.185671 0.979598 -0.076907 -vn -0.167099 0.979598 -0.111652 -vn -0.167099 0.979598 -0.111652 -vn -0.322516 0.921707 -0.215499 -vn -0.358361 0.921707 -0.148438 -vn -0.380434 0.921707 -0.075673 -vn -0.197107 0.979598 -0.039207 -vn -0.185671 0.979598 -0.076907 -vn -0.185671 0.979598 -0.076907 -vn -0.358361 0.921707 -0.148438 -vn -0.380434 0.921707 -0.075673 -vn -0.387887 0.921707 0.000000 -vn -0.200969 0.979598 0.000000 -vn -0.197107 0.979598 -0.039207 -vn -0.197107 0.979598 -0.039207 -vn -0.380434 0.921707 -0.075673 -vn -0.387887 0.921707 0.000000 -vn -0.380434 0.921707 0.075673 -vn -0.197107 0.979598 0.039207 -vn -0.200969 0.979598 0.000000 -vn -0.200969 0.979598 0.000000 -vn -0.387887 0.921707 0.000000 -vn -0.380434 0.921707 0.075673 -vn -0.358361 0.921707 0.148438 -vn -0.185671 0.979598 0.076907 -vn -0.197107 0.979598 0.039207 -vn -0.197107 0.979598 0.039207 -vn -0.380434 0.921707 0.075673 -vn -0.358361 0.921707 0.148438 -vn -0.322516 0.921707 0.215498 -vn -0.167099 0.979598 0.111652 -vn -0.185671 0.979598 0.076907 -vn -0.185671 0.979598 0.076907 -vn -0.358361 0.921707 0.148438 -vn -0.322516 0.921707 0.215498 -vn -0.274277 0.921707 0.274278 -vn -0.142106 0.979598 0.142107 -vn -0.167099 0.979598 0.111652 -vn -0.167099 0.979598 0.111652 -vn -0.322516 0.921707 0.215498 -vn -0.274277 0.921707 0.274278 -vn -0.215498 0.921707 0.322516 -vn -0.111652 0.979598 0.167099 -vn -0.142106 0.979598 0.142107 -vn -0.142106 0.979598 0.142107 -vn -0.274277 0.921707 0.274278 -vn -0.215498 0.921707 0.322516 -vn -0.148438 0.921707 0.358361 -vn -0.076907 0.979598 0.185671 -vn -0.111652 0.979598 0.167099 -vn -0.111652 0.979598 0.167099 -vn -0.215498 0.921707 0.322516 -vn -0.148438 0.921707 0.358361 -vn -0.075673 0.921707 0.380434 -vn -0.039207 0.979598 0.197107 -vn -0.076907 0.979598 0.185671 -vn -0.076907 0.979598 0.185671 -vn -0.148438 0.921707 0.358361 -vn -0.075673 0.921707 0.380434 -vn 0.000000 0.921707 0.387887 -vn 0.000000 0.979598 0.200969 -vn -0.039207 0.979598 0.197107 -vn -0.039207 0.979598 0.197107 -vn -0.075673 0.921707 0.380434 -vn 0.000000 0.921707 0.387887 -vn 0.075673 0.921707 0.380434 -vn 0.039207 0.979598 0.197107 -vn 0.000000 0.979598 0.200969 -vn 0.000000 0.979598 0.200969 -vn 0.000000 0.921707 0.387887 -vn 0.075673 0.921707 0.380434 -vn 0.148438 0.921707 0.358361 -vn 0.076908 0.979598 0.185671 -vn 0.039207 0.979598 0.197107 -vn 0.039207 0.979598 0.197107 -vn 0.075673 0.921707 0.380434 -vn 0.148438 0.921707 0.358361 -vn 0.215499 0.921707 0.322516 -vn 0.111652 0.979598 0.167099 -vn 0.076908 0.979598 0.185671 -vn 0.076908 0.979598 0.185671 -vn 0.148438 0.921707 0.358361 -vn 0.215499 0.921707 0.322516 -vn 0.274278 0.921707 0.274277 -vn 0.142107 0.979598 0.142106 -vn 0.111652 0.979598 0.167099 -vn 0.111652 0.979598 0.167099 -vn 0.215499 0.921707 0.322516 -vn 0.274278 0.921707 0.274277 -vn 0.322517 0.921707 0.215498 -vn 0.167100 0.979598 0.111652 -vn 0.142107 0.979598 0.142106 -vn 0.142107 0.979598 0.142106 -vn 0.274278 0.921707 0.274277 -vn 0.322517 0.921707 0.215498 -vn 0.358361 0.921707 0.148437 -vn 0.185671 0.979598 0.076907 -vn 0.167100 0.979598 0.111652 -vn 0.167100 0.979598 0.111652 -vn 0.322517 0.921707 0.215498 -vn 0.358361 0.921707 0.148437 -vn 0.380434 0.921707 0.075673 -vn 0.197107 0.979598 0.039206 -vn 0.185671 0.979598 0.076907 -vn 0.185671 0.979598 0.076907 -vn 0.358361 0.921707 0.148437 -vn 0.380434 0.921707 0.075673 -vn 0.387887 0.921707 -0.000001 -vn 0.200969 0.979598 -0.000001 -vn 0.197107 0.979598 0.039206 -vn 0.197107 0.979598 0.039206 -vn 0.380434 0.921707 0.075673 -vn 0.387887 0.921707 -0.000001 -vn 0.380434 0.921707 -0.075674 -vn 0.197107 0.979598 -0.039207 -vn 0.200969 0.979598 -0.000001 -vn 0.200969 0.979598 -0.000001 -vn 0.387887 0.921707 -0.000001 -vn 0.380434 0.921707 -0.075674 -vn 0.358361 0.921707 -0.148438 -vn 0.185671 0.979598 -0.076908 -vn 0.197107 0.979598 -0.039207 -vn 0.197107 0.979598 -0.039207 -vn 0.380434 0.921707 -0.075674 -vn 0.358361 0.921707 -0.148438 -vn 0.322516 0.921707 -0.215499 -vn 0.167099 0.979598 -0.111653 -vn 0.185671 0.979598 -0.076908 -vn 0.185671 0.979598 -0.076908 -vn 0.358361 0.921707 -0.148438 -vn 0.322516 0.921707 -0.215499 -vn 0.274277 0.921707 -0.274278 -vn 0.142106 0.979598 -0.142107 -vn 0.167099 0.979598 -0.111653 -vn 0.167099 0.979598 -0.111653 -vn 0.322516 0.921707 -0.215499 -vn 0.274277 0.921707 -0.274278 -vn 0.215498 0.921707 -0.322517 -vn 0.111652 0.979598 -0.167100 -vn 0.142106 0.979598 -0.142107 -vn 0.142106 0.979598 -0.142107 -vn 0.274277 0.921707 -0.274278 -vn 0.215498 0.921707 -0.322517 -vn 0.148437 0.921707 -0.358361 -vn 0.076907 0.979598 -0.185671 -vn 0.111652 0.979598 -0.167100 -vn 0.111652 0.979598 -0.167100 -vn 0.215498 0.921707 -0.322517 -vn 0.148437 0.921707 -0.358361 -vn 0.075672 0.921707 -0.380434 -vn 0.039207 0.979598 -0.197107 -vn 0.076907 0.979598 -0.185671 -vn 0.076907 0.979598 -0.185671 -vn 0.148437 0.921707 -0.358361 -vn 0.075672 0.921707 -0.380434 -vn -0.000000 0.921707 -0.387887 -vn -0.000000 0.979598 -0.200969 -vn 0.039207 0.979598 -0.197107 -vn 0.039207 0.979598 -0.197107 -vn 0.075672 0.921707 -0.380434 -vn -0.000000 0.921707 -0.387887 -vn -0.109207 0.828645 -0.549019 -vn -0.075673 0.921707 -0.380434 -vn -0.000000 0.921707 -0.387887 -vn -0.000000 0.921707 -0.387887 -vn -0.000000 0.828645 -0.559775 -vn -0.109207 0.828645 -0.549019 -vn -0.214217 0.828645 -0.517165 -vn -0.148438 0.921707 -0.358361 -vn -0.075673 0.921707 -0.380434 -vn -0.075673 0.921707 -0.380434 -vn -0.109207 0.828645 -0.549019 -vn -0.214217 0.828645 -0.517165 -vn -0.310994 0.828645 -0.465436 -vn -0.215499 0.921707 -0.322516 -vn -0.148438 0.921707 -0.358361 -vn -0.148438 0.921707 -0.358361 -vn -0.214217 0.828645 -0.517165 -vn -0.310994 0.828645 -0.465436 -vn -0.395821 0.828645 -0.395821 -vn -0.274278 0.921707 -0.274278 -vn -0.215499 0.921707 -0.322516 -vn -0.215499 0.921707 -0.322516 -vn -0.310994 0.828645 -0.465436 -vn -0.395821 0.828645 -0.395821 -vn -0.465436 0.828645 -0.310995 -vn -0.322516 0.921707 -0.215499 -vn -0.274278 0.921707 -0.274278 -vn -0.274278 0.921707 -0.274278 -vn -0.395821 0.828645 -0.395821 -vn -0.465436 0.828645 -0.310995 -vn -0.517165 0.828645 -0.214216 -vn -0.358361 0.921707 -0.148438 -vn -0.322516 0.921707 -0.215499 -vn -0.322516 0.921707 -0.215499 -vn -0.465436 0.828645 -0.310995 -vn -0.517165 0.828645 -0.214216 -vn -0.549019 0.828645 -0.109207 -vn -0.380434 0.921707 -0.075673 -vn -0.358361 0.921707 -0.148438 -vn -0.358361 0.921707 -0.148438 -vn -0.517165 0.828645 -0.214216 -vn -0.549019 0.828645 -0.109207 -vn -0.559775 0.828645 -0.000000 -vn -0.387887 0.921707 0.000000 -vn -0.380434 0.921707 -0.075673 -vn -0.380434 0.921707 -0.075673 -vn -0.549019 0.828645 -0.109207 -vn -0.559775 0.828645 -0.000000 -vn -0.549019 0.828645 0.109207 -vn -0.380434 0.921707 0.075673 -vn -0.387887 0.921707 0.000000 -vn -0.387887 0.921707 0.000000 -vn -0.559775 0.828645 -0.000000 -vn -0.549019 0.828645 0.109207 -vn -0.517165 0.828645 0.214217 -vn -0.358361 0.921707 0.148438 -vn -0.380434 0.921707 0.075673 -vn -0.380434 0.921707 0.075673 -vn -0.549019 0.828645 0.109207 -vn -0.517165 0.828645 0.214217 -vn -0.465436 0.828645 0.310995 -vn -0.322516 0.921707 0.215498 -vn -0.358361 0.921707 0.148438 -vn -0.358361 0.921707 0.148438 -vn -0.517165 0.828645 0.214217 -vn -0.465436 0.828645 0.310995 -vn -0.395821 0.828645 0.395821 -vn -0.274277 0.921707 0.274278 -vn -0.322516 0.921707 0.215498 -vn -0.322516 0.921707 0.215498 -vn -0.465436 0.828645 0.310995 -vn -0.395821 0.828645 0.395821 -vn -0.310994 0.828645 0.465436 -vn -0.215498 0.921707 0.322516 -vn -0.274277 0.921707 0.274278 -vn -0.274277 0.921707 0.274278 -vn -0.395821 0.828645 0.395821 -vn -0.310994 0.828645 0.465436 -vn -0.214216 0.828645 0.517165 -vn -0.148438 0.921707 0.358361 -vn -0.215498 0.921707 0.322516 -vn -0.215498 0.921707 0.322516 -vn -0.310994 0.828645 0.465436 -vn -0.214216 0.828645 0.517165 -vn -0.109206 0.828645 0.549019 -vn -0.075673 0.921707 0.380434 -vn -0.148438 0.921707 0.358361 -vn -0.148438 0.921707 0.358361 -vn -0.214216 0.828645 0.517165 -vn -0.109206 0.828645 0.549019 -vn 0.000001 0.828645 0.559775 -vn 0.000000 0.921707 0.387887 -vn -0.075673 0.921707 0.380434 -vn -0.075673 0.921707 0.380434 -vn -0.109206 0.828645 0.549019 -vn 0.000001 0.828645 0.559775 -vn 0.109207 0.828645 0.549019 -vn 0.075673 0.921707 0.380434 -vn 0.000000 0.921707 0.387887 -vn 0.000000 0.921707 0.387887 -vn 0.000001 0.828645 0.559775 -vn 0.109207 0.828645 0.549019 -vn 0.214217 0.828645 0.517165 -vn 0.148438 0.921707 0.358361 -vn 0.075673 0.921707 0.380434 -vn 0.075673 0.921707 0.380434 -vn 0.109207 0.828645 0.549019 -vn 0.214217 0.828645 0.517165 -vn 0.310995 0.828645 0.465436 -vn 0.215499 0.921707 0.322516 -vn 0.148438 0.921707 0.358361 -vn 0.148438 0.921707 0.358361 -vn 0.214217 0.828645 0.517165 -vn 0.310995 0.828645 0.465436 -vn 0.395821 0.828645 0.395820 -vn 0.274278 0.921707 0.274277 -vn 0.215499 0.921707 0.322516 -vn 0.215499 0.921707 0.322516 -vn 0.310995 0.828645 0.465436 -vn 0.395821 0.828645 0.395820 -vn 0.465436 0.828645 0.310994 -vn 0.322517 0.921707 0.215498 -vn 0.274278 0.921707 0.274277 -vn 0.274278 0.921707 0.274277 -vn 0.395821 0.828645 0.395820 -vn 0.465436 0.828645 0.310994 -vn 0.517165 0.828645 0.214216 -vn 0.358361 0.921707 0.148437 -vn 0.322517 0.921707 0.215498 -vn 0.322517 0.921707 0.215498 -vn 0.465436 0.828645 0.310994 -vn 0.517165 0.828645 0.214216 -vn 0.549019 0.828645 0.109206 -vn 0.380434 0.921707 0.075673 -vn 0.358361 0.921707 0.148437 -vn 0.358361 0.921707 0.148437 -vn 0.517165 0.828645 0.214216 -vn 0.549019 0.828645 0.109206 -vn 0.559775 0.828645 -0.000001 -vn 0.387887 0.921707 -0.000001 -vn 0.380434 0.921707 0.075673 -vn 0.380434 0.921707 0.075673 -vn 0.549019 0.828645 0.109206 -vn 0.559775 0.828645 -0.000001 -vn 0.549019 0.828645 -0.109208 -vn 0.380434 0.921707 -0.075674 -vn 0.387887 0.921707 -0.000001 -vn 0.387887 0.921707 -0.000001 -vn 0.559775 0.828645 -0.000001 -vn 0.549019 0.828645 -0.109208 -vn 0.517165 0.828645 -0.214217 -vn 0.358361 0.921707 -0.148438 -vn 0.380434 0.921707 -0.075674 -vn 0.380434 0.921707 -0.075674 -vn 0.549019 0.828645 -0.109208 -vn 0.517165 0.828645 -0.214217 -vn 0.465435 0.828645 -0.310995 -vn 0.322516 0.921707 -0.215499 -vn 0.358361 0.921707 -0.148438 -vn 0.358361 0.921707 -0.148438 -vn 0.517165 0.828645 -0.214217 -vn 0.465435 0.828645 -0.310995 -vn 0.395820 0.828645 -0.395822 -vn 0.274277 0.921707 -0.274278 -vn 0.322516 0.921707 -0.215499 -vn 0.322516 0.921707 -0.215499 -vn 0.465435 0.828645 -0.310995 -vn 0.395820 0.828645 -0.395822 -vn 0.310993 0.828645 -0.465437 -vn 0.215498 0.921707 -0.322517 -vn 0.274277 0.921707 -0.274278 -vn 0.274277 0.921707 -0.274278 -vn 0.395820 0.828645 -0.395822 -vn 0.310993 0.828645 -0.465437 -vn 0.214216 0.828645 -0.517165 -vn 0.148437 0.921707 -0.358361 -vn 0.215498 0.921707 -0.322517 -vn 0.215498 0.921707 -0.322517 -vn 0.310993 0.828645 -0.465437 -vn 0.214216 0.828645 -0.517165 -vn 0.109206 0.828645 -0.549019 -vn 0.075672 0.921707 -0.380434 -vn 0.148437 0.921707 -0.358361 -vn 0.148437 0.921707 -0.358361 -vn 0.214216 0.828645 -0.517165 -vn 0.109206 0.828645 -0.549019 -vn -0.000000 0.828645 -0.559775 -vn -0.000000 0.921707 -0.387887 -vn 0.075672 0.921707 -0.380434 -vn 0.075672 0.921707 -0.380434 -vn 0.109206 0.828645 -0.549019 -vn -0.000000 0.828645 -0.559775 -vn -0.138542 0.704059 -0.696496 -vn -0.109207 0.828645 -0.549019 -vn -0.000000 0.828645 -0.559775 -vn -0.000000 0.828645 -0.559775 -vn -0.000000 0.704059 -0.710141 -vn -0.138542 0.704059 -0.696496 -vn -0.271759 0.704059 -0.656085 -vn -0.214217 0.828645 -0.517165 -vn -0.109207 0.828645 -0.549019 -vn -0.109207 0.828645 -0.549019 -vn -0.138542 0.704059 -0.696496 -vn -0.271759 0.704059 -0.656085 -vn -0.394533 0.704059 -0.590461 -vn -0.310994 0.828645 -0.465436 -vn -0.214217 0.828645 -0.517165 -vn -0.214217 0.828645 -0.517165 -vn -0.271759 0.704059 -0.656085 -vn -0.394533 0.704059 -0.590461 -vn -0.502146 0.704059 -0.502146 -vn -0.395821 0.828645 -0.395821 -vn -0.310994 0.828645 -0.465436 -vn -0.310994 0.828645 -0.465436 -vn -0.394533 0.704059 -0.590461 -vn -0.502146 0.704059 -0.502146 -vn -0.590461 0.704059 -0.394533 -vn -0.465436 0.828645 -0.310995 -vn -0.395821 0.828645 -0.395821 -vn -0.395821 0.828645 -0.395821 -vn -0.502146 0.704059 -0.502146 -vn -0.590461 0.704059 -0.394533 -vn -0.656085 0.704059 -0.271759 -vn -0.517165 0.828645 -0.214216 -vn -0.465436 0.828645 -0.310995 -vn -0.465436 0.828645 -0.310995 -vn -0.590461 0.704059 -0.394533 -vn -0.656085 0.704059 -0.271759 -vn -0.696496 0.704059 -0.138541 -vn -0.549019 0.828645 -0.109207 -vn -0.517165 0.828645 -0.214216 -vn -0.517165 0.828645 -0.214216 -vn -0.656085 0.704059 -0.271759 -vn -0.696496 0.704059 -0.138541 -vn -0.710141 0.704059 0.000000 -vn -0.559775 0.828645 -0.000000 -vn -0.549019 0.828645 -0.109207 -vn -0.549019 0.828645 -0.109207 -vn -0.696496 0.704059 -0.138541 -vn -0.710141 0.704059 0.000000 -vn -0.696496 0.704059 0.138542 -vn -0.549019 0.828645 0.109207 -vn -0.559775 0.828645 -0.000000 -vn -0.559775 0.828645 -0.000000 -vn -0.710141 0.704059 0.000000 -vn -0.696496 0.704059 0.138542 -vn -0.656085 0.704059 0.271760 -vn -0.517165 0.828645 0.214217 -vn -0.549019 0.828645 0.109207 -vn -0.549019 0.828645 0.109207 -vn -0.696496 0.704059 0.138542 -vn -0.656085 0.704059 0.271760 -vn -0.590461 0.704059 0.394534 -vn -0.465436 0.828645 0.310995 -vn -0.517165 0.828645 0.214217 -vn -0.517165 0.828645 0.214217 -vn -0.656085 0.704059 0.271760 -vn -0.590461 0.704059 0.394534 -vn -0.502145 0.704059 0.502146 -vn -0.395821 0.828645 0.395821 -vn -0.465436 0.828645 0.310995 -vn -0.465436 0.828645 0.310995 -vn -0.590461 0.704059 0.394534 -vn -0.502145 0.704059 0.502146 -vn -0.394533 0.704059 0.590461 -vn -0.310994 0.828645 0.465436 -vn -0.395821 0.828645 0.395821 -vn -0.395821 0.828645 0.395821 -vn -0.502145 0.704059 0.502146 -vn -0.394533 0.704059 0.590461 -vn -0.271759 0.704059 0.656085 -vn -0.214216 0.828645 0.517165 -vn -0.310994 0.828645 0.465436 -vn -0.310994 0.828645 0.465436 -vn -0.394533 0.704059 0.590461 -vn -0.271759 0.704059 0.656085 -vn -0.138541 0.704059 0.696496 -vn -0.109206 0.828645 0.549019 -vn -0.214216 0.828645 0.517165 -vn -0.214216 0.828645 0.517165 -vn -0.271759 0.704059 0.656085 -vn -0.138541 0.704059 0.696496 -vn 0.000001 0.704059 0.710142 -vn 0.000001 0.828645 0.559775 -vn -0.109206 0.828645 0.549019 -vn -0.109206 0.828645 0.549019 -vn -0.138541 0.704059 0.696496 -vn 0.000001 0.704059 0.710142 -vn 0.138542 0.704059 0.696496 -vn 0.109207 0.828645 0.549019 -vn 0.000001 0.828645 0.559775 -vn 0.000001 0.828645 0.559775 -vn 0.000001 0.704059 0.710142 -vn 0.138542 0.704059 0.696496 -vn 0.271760 0.704059 0.656085 -vn 0.214217 0.828645 0.517165 -vn 0.109207 0.828645 0.549019 -vn 0.109207 0.828645 0.549019 -vn 0.138542 0.704059 0.696496 -vn 0.271760 0.704059 0.656085 -vn 0.394534 0.704059 0.590460 -vn 0.310995 0.828645 0.465436 -vn 0.214217 0.828645 0.517165 -vn 0.214217 0.828645 0.517165 -vn 0.271760 0.704059 0.656085 -vn 0.394534 0.704059 0.590460 -vn 0.502146 0.704059 0.502145 -vn 0.395821 0.828645 0.395820 -vn 0.310995 0.828645 0.465436 -vn 0.310995 0.828645 0.465436 -vn 0.394534 0.704059 0.590460 -vn 0.502146 0.704059 0.502145 -vn 0.590461 0.704059 0.394533 -vn 0.465436 0.828645 0.310994 -vn 0.395821 0.828645 0.395820 -vn 0.395821 0.828645 0.395820 -vn 0.502146 0.704059 0.502145 -vn 0.590461 0.704059 0.394533 -vn 0.656086 0.704059 0.271758 -vn 0.517165 0.828645 0.214216 -vn 0.465436 0.828645 0.310994 -vn 0.465436 0.828645 0.310994 -vn 0.590461 0.704059 0.394533 -vn 0.656086 0.704059 0.271758 -vn 0.696496 0.704059 0.138541 -vn 0.549019 0.828645 0.109206 -vn 0.517165 0.828645 0.214216 -vn 0.517165 0.828645 0.214216 -vn 0.656086 0.704059 0.271758 -vn 0.696496 0.704059 0.138541 -vn 0.710141 0.704059 -0.000001 -vn 0.559775 0.828645 -0.000001 -vn 0.549019 0.828645 0.109206 -vn 0.549019 0.828645 0.109206 -vn 0.696496 0.704059 0.138541 -vn 0.710141 0.704059 -0.000001 -vn 0.696496 0.704059 -0.138543 -vn 0.549019 0.828645 -0.109208 -vn 0.559775 0.828645 -0.000001 -vn 0.559775 0.828645 -0.000001 -vn 0.710141 0.704059 -0.000001 -vn 0.696496 0.704059 -0.138543 -vn 0.656085 0.704059 -0.271761 -vn 0.517165 0.828645 -0.214217 -vn 0.549019 0.828645 -0.109208 -vn 0.549019 0.828645 -0.109208 -vn 0.696496 0.704059 -0.138543 -vn 0.656085 0.704059 -0.271761 -vn 0.590460 0.704059 -0.394535 -vn 0.465435 0.828645 -0.310995 -vn 0.517165 0.828645 -0.214217 -vn 0.517165 0.828645 -0.214217 -vn 0.656085 0.704059 -0.271761 -vn 0.590460 0.704059 -0.394535 -vn 0.502145 0.704059 -0.502147 -vn 0.395820 0.828645 -0.395822 -vn 0.465435 0.828645 -0.310995 -vn 0.465435 0.828645 -0.310995 -vn 0.590460 0.704059 -0.394535 -vn 0.502145 0.704059 -0.502147 -vn 0.394532 0.704059 -0.590462 -vn 0.310993 0.828645 -0.465437 -vn 0.395820 0.828645 -0.395822 -vn 0.395820 0.828645 -0.395822 -vn 0.502145 0.704059 -0.502147 -vn 0.394532 0.704059 -0.590462 -vn 0.271758 0.704059 -0.656086 -vn 0.214216 0.828645 -0.517165 -vn 0.310993 0.828645 -0.465437 -vn 0.310993 0.828645 -0.465437 -vn 0.394532 0.704059 -0.590462 -vn 0.271758 0.704059 -0.656086 -vn 0.138540 0.704059 -0.696496 -vn 0.109206 0.828645 -0.549019 -vn 0.214216 0.828645 -0.517165 -vn 0.214216 0.828645 -0.517165 -vn 0.271758 0.704059 -0.656086 -vn 0.138540 0.704059 -0.696496 -vn -0.000000 0.704059 -0.710141 -vn -0.000000 0.828645 -0.559775 -vn 0.109206 0.828645 -0.549019 -vn 0.109206 0.828645 -0.549019 -vn 0.138540 0.704059 -0.696496 -vn -0.000000 0.704059 -0.710141 -vn -0.162576 0.552761 -0.817327 -vn -0.138542 0.704059 -0.696496 -vn -0.000000 0.704059 -0.710141 -vn -0.000000 0.704059 -0.710141 -vn -0.000000 0.552761 -0.833340 -vn -0.162576 0.552761 -0.817327 -vn -0.318905 0.552761 -0.769906 -vn -0.271759 0.704059 -0.656085 -vn -0.138542 0.704059 -0.696496 -vn -0.138542 0.704059 -0.696496 -vn -0.162576 0.552761 -0.817327 -vn -0.318905 0.552761 -0.769906 -vn -0.462979 0.552761 -0.692897 -vn -0.394533 0.704059 -0.590461 -vn -0.271759 0.704059 -0.656085 -vn -0.271759 0.704059 -0.656085 -vn -0.318905 0.552761 -0.769906 -vn -0.462979 0.552761 -0.692897 -vn -0.589260 0.552761 -0.589260 -vn -0.502146 0.704059 -0.502146 -vn -0.394533 0.704059 -0.590461 -vn -0.394533 0.704059 -0.590461 -vn -0.462979 0.552761 -0.692897 -vn -0.589260 0.552761 -0.589260 -vn -0.692897 0.552761 -0.462979 -vn -0.590461 0.704059 -0.394533 -vn -0.502146 0.704059 -0.502146 -vn -0.502146 0.704059 -0.502146 -vn -0.589260 0.552761 -0.589260 -vn -0.692897 0.552761 -0.462979 -vn -0.769906 0.552761 -0.318905 -vn -0.656085 0.704059 -0.271759 -vn -0.590461 0.704059 -0.394533 -vn -0.590461 0.704059 -0.394533 -vn -0.692897 0.552761 -0.462979 -vn -0.769906 0.552761 -0.318905 -vn -0.817327 0.552761 -0.162576 -vn -0.696496 0.704059 -0.138541 -vn -0.656085 0.704059 -0.271759 -vn -0.656085 0.704059 -0.271759 -vn -0.769906 0.552761 -0.318905 -vn -0.817327 0.552761 -0.162576 -vn -0.833340 0.552761 0.000000 -vn -0.710141 0.704059 0.000000 -vn -0.696496 0.704059 -0.138541 -vn -0.696496 0.704059 -0.138541 -vn -0.817327 0.552761 -0.162576 -vn -0.833340 0.552761 0.000000 -vn -0.817327 0.552761 0.162577 -vn -0.696496 0.704059 0.138542 -vn -0.710141 0.704059 0.000000 -vn -0.710141 0.704059 0.000000 -vn -0.833340 0.552761 0.000000 -vn -0.817327 0.552761 0.162577 -vn -0.769905 0.552761 0.318906 -vn -0.656085 0.704059 0.271760 -vn -0.696496 0.704059 0.138542 -vn -0.696496 0.704059 0.138542 -vn -0.817327 0.552761 0.162577 -vn -0.769905 0.552761 0.318906 -vn -0.692896 0.552761 0.462979 -vn -0.590461 0.704059 0.394534 -vn -0.656085 0.704059 0.271760 -vn -0.656085 0.704059 0.271760 -vn -0.769905 0.552761 0.318906 -vn -0.692896 0.552761 0.462979 -vn -0.589260 0.552761 0.589260 -vn -0.502145 0.704059 0.502146 -vn -0.590461 0.704059 0.394534 -vn -0.590461 0.704059 0.394534 -vn -0.692896 0.552761 0.462979 -vn -0.589260 0.552761 0.589260 -vn -0.462978 0.552761 0.692897 -vn -0.394533 0.704059 0.590461 -vn -0.502145 0.704059 0.502146 -vn -0.502145 0.704059 0.502146 -vn -0.589260 0.552761 0.589260 -vn -0.462978 0.552761 0.692897 -vn -0.318905 0.552761 0.769906 -vn -0.271759 0.704059 0.656085 -vn -0.394533 0.704059 0.590461 -vn -0.394533 0.704059 0.590461 -vn -0.462978 0.552761 0.692897 -vn -0.318905 0.552761 0.769906 -vn -0.162576 0.552761 0.817328 -vn -0.138541 0.704059 0.696496 -vn -0.271759 0.704059 0.656085 -vn -0.271759 0.704059 0.656085 -vn -0.318905 0.552761 0.769906 -vn -0.162576 0.552761 0.817328 -vn 0.000001 0.552761 0.833340 -vn 0.000001 0.704059 0.710142 -vn -0.138541 0.704059 0.696496 -vn -0.138541 0.704059 0.696496 -vn -0.162576 0.552761 0.817328 -vn 0.000001 0.552761 0.833340 -vn 0.162577 0.552761 0.817327 -vn 0.138542 0.704059 0.696496 -vn 0.000001 0.704059 0.710142 -vn 0.000001 0.704059 0.710142 -vn 0.000001 0.552761 0.833340 -vn 0.162577 0.552761 0.817327 -vn 0.318906 0.552761 0.769905 -vn 0.271760 0.704059 0.656085 -vn 0.138542 0.704059 0.696496 -vn 0.138542 0.704059 0.696496 -vn 0.162577 0.552761 0.817327 -vn 0.318906 0.552761 0.769905 -vn 0.462980 0.552761 0.692896 -vn 0.394534 0.704059 0.590460 -vn 0.271760 0.704059 0.656085 -vn 0.271760 0.704059 0.656085 -vn 0.318906 0.552761 0.769905 -vn 0.462980 0.552761 0.692896 -vn 0.589261 0.552761 0.589259 -vn 0.502146 0.704059 0.502145 -vn 0.394534 0.704059 0.590460 -vn 0.394534 0.704059 0.590460 -vn 0.462980 0.552761 0.692896 -vn 0.589261 0.552761 0.589259 -vn 0.692897 0.552761 0.462978 -vn 0.590461 0.704059 0.394533 -vn 0.502146 0.704059 0.502145 -vn 0.502146 0.704059 0.502145 -vn 0.589261 0.552761 0.589259 -vn 0.692897 0.552761 0.462978 -vn 0.769906 0.552761 0.318904 -vn 0.656086 0.704059 0.271758 -vn 0.590461 0.704059 0.394533 -vn 0.590461 0.704059 0.394533 -vn 0.692897 0.552761 0.462978 -vn 0.769906 0.552761 0.318904 -vn 0.817328 0.552761 0.162575 -vn 0.696496 0.704059 0.138541 -vn 0.656086 0.704059 0.271758 -vn 0.656086 0.704059 0.271758 -vn 0.769906 0.552761 0.318904 -vn 0.817328 0.552761 0.162575 -vn 0.833340 0.552761 -0.000001 -vn 0.710141 0.704059 -0.000001 -vn 0.696496 0.704059 0.138541 -vn 0.696496 0.704059 0.138541 -vn 0.817328 0.552761 0.162575 -vn 0.833340 0.552761 -0.000001 -vn 0.817327 0.552761 -0.162578 -vn 0.696496 0.704059 -0.138543 -vn 0.710141 0.704059 -0.000001 -vn 0.710141 0.704059 -0.000001 -vn 0.833340 0.552761 -0.000001 -vn 0.817327 0.552761 -0.162578 -vn 0.769905 0.552761 -0.318907 -vn 0.656085 0.704059 -0.271761 -vn 0.696496 0.704059 -0.138543 -vn 0.696496 0.704059 -0.138543 -vn 0.817327 0.552761 -0.162578 -vn 0.769905 0.552761 -0.318907 -vn 0.692896 0.552761 -0.462980 -vn 0.590460 0.704059 -0.394535 -vn 0.656085 0.704059 -0.271761 -vn 0.656085 0.704059 -0.271761 -vn 0.769905 0.552761 -0.318907 -vn 0.692896 0.552761 -0.462980 -vn 0.589259 0.552761 -0.589261 -vn 0.502145 0.704059 -0.502147 -vn 0.590460 0.704059 -0.394535 -vn 0.590460 0.704059 -0.394535 -vn 0.692896 0.552761 -0.462980 -vn 0.589259 0.552761 -0.589261 -vn 0.462977 0.552761 -0.692898 -vn 0.394532 0.704059 -0.590462 -vn 0.502145 0.704059 -0.502147 -vn 0.502145 0.704059 -0.502147 -vn 0.589259 0.552761 -0.589261 -vn 0.462977 0.552761 -0.692898 -vn 0.318904 0.552761 -0.769906 -vn 0.271758 0.704059 -0.656086 -vn 0.394532 0.704059 -0.590462 -vn 0.394532 0.704059 -0.590462 -vn 0.462977 0.552761 -0.692898 -vn 0.318904 0.552761 -0.769906 -vn 0.162575 0.552761 -0.817328 -vn 0.138540 0.704059 -0.696496 -vn 0.271758 0.704059 -0.656086 -vn 0.271758 0.704059 -0.656086 -vn 0.318904 0.552761 -0.769906 -vn 0.162575 0.552761 -0.817328 -vn -0.000000 0.552761 -0.833340 -vn -0.000000 0.704059 -0.710141 -vn 0.138540 0.704059 -0.696496 -vn 0.138540 0.704059 -0.696496 -vn 0.162575 0.552761 -0.817328 -vn -0.000000 0.552761 -0.833340 -vn -0.180413 0.380537 -0.906996 -vn -0.162576 0.552761 -0.817327 -vn -0.000000 0.552761 -0.833340 -vn -0.000000 0.552761 -0.833340 -vn -0.000001 0.380537 -0.924766 -vn -0.180413 0.380537 -0.906996 -vn -0.353893 0.380537 -0.854372 -vn -0.318905 0.552761 -0.769906 -vn -0.162576 0.552761 -0.817327 -vn -0.162576 0.552761 -0.817327 -vn -0.180413 0.380537 -0.906996 -vn -0.353893 0.380537 -0.854372 -vn -0.513772 0.380537 -0.768915 -vn -0.462979 0.552761 -0.692897 -vn -0.318905 0.552761 -0.769906 -vn -0.318905 0.552761 -0.769906 -vn -0.353893 0.380537 -0.854372 -vn -0.513772 0.380537 -0.768915 -vn -0.653908 0.380537 -0.653908 -vn -0.589260 0.552761 -0.589260 -vn -0.462979 0.552761 -0.692897 -vn -0.462979 0.552761 -0.692897 -vn -0.513772 0.380537 -0.768915 -vn -0.653908 0.380537 -0.653908 -vn -0.768915 0.380537 -0.513772 -vn -0.692897 0.552761 -0.462979 -vn -0.589260 0.552761 -0.589260 -vn -0.589260 0.552761 -0.589260 -vn -0.653908 0.380537 -0.653908 -vn -0.768915 0.380537 -0.513772 -vn -0.854372 0.380537 -0.353892 -vn -0.769906 0.552761 -0.318905 -vn -0.692897 0.552761 -0.462979 -vn -0.692897 0.552761 -0.462979 -vn -0.768915 0.380537 -0.513772 -vn -0.854372 0.380537 -0.353892 -vn -0.906997 0.380537 -0.180412 -vn -0.817327 0.552761 -0.162576 -vn -0.769906 0.552761 -0.318905 -vn -0.769906 0.552761 -0.318905 -vn -0.854372 0.380537 -0.353892 -vn -0.906997 0.380537 -0.180412 -vn -0.924766 0.380537 0.000000 -vn -0.833340 0.552761 0.000000 -vn -0.817327 0.552761 -0.162576 -vn -0.817327 0.552761 -0.162576 -vn -0.906997 0.380537 -0.180412 -vn -0.924766 0.380537 0.000000 -vn -0.906996 0.380537 0.180413 -vn -0.817327 0.552761 0.162577 -vn -0.833340 0.552761 0.000000 -vn -0.833340 0.552761 0.000000 -vn -0.924766 0.380537 0.000000 -vn -0.906996 0.380537 0.180413 -vn -0.854372 0.380537 0.353893 -vn -0.769905 0.552761 0.318906 -vn -0.817327 0.552761 0.162577 -vn -0.817327 0.552761 0.162577 -vn -0.906996 0.380537 0.180413 -vn -0.854372 0.380537 0.353893 -vn -0.768914 0.380537 0.513773 -vn -0.692896 0.552761 0.462979 -vn -0.769905 0.552761 0.318906 -vn -0.769905 0.552761 0.318906 -vn -0.854372 0.380537 0.353893 -vn -0.768914 0.380537 0.513773 -vn -0.653907 0.380537 0.653908 -vn -0.589260 0.552761 0.589260 -vn -0.692896 0.552761 0.462979 -vn -0.692896 0.552761 0.462979 -vn -0.768914 0.380537 0.513773 -vn -0.653907 0.380537 0.653908 -vn -0.513772 0.380537 0.768915 -vn -0.462978 0.552761 0.692897 -vn -0.589260 0.552761 0.589260 -vn -0.589260 0.552761 0.589260 -vn -0.653907 0.380537 0.653908 -vn -0.513772 0.380537 0.768915 -vn -0.353892 0.380537 0.854372 -vn -0.318905 0.552761 0.769906 -vn -0.462978 0.552761 0.692897 -vn -0.462978 0.552761 0.692897 -vn -0.513772 0.380537 0.768915 -vn -0.353892 0.380537 0.854372 -vn -0.180412 0.380537 0.906997 -vn -0.162576 0.552761 0.817328 -vn -0.318905 0.552761 0.769906 -vn -0.318905 0.552761 0.769906 -vn -0.353892 0.380537 0.854372 -vn -0.180412 0.380537 0.906997 -vn 0.000001 0.380537 0.924766 -vn 0.000001 0.552761 0.833340 -vn -0.162576 0.552761 0.817328 -vn -0.162576 0.552761 0.817328 -vn -0.180412 0.380537 0.906997 -vn 0.000001 0.380537 0.924766 -vn 0.180414 0.380537 0.906996 -vn 0.162577 0.552761 0.817327 -vn 0.000001 0.552761 0.833340 -vn 0.000001 0.552761 0.833340 -vn 0.000001 0.380537 0.924766 -vn 0.180414 0.380537 0.906996 -vn 0.353894 0.380537 0.854372 -vn 0.318906 0.552761 0.769905 -vn 0.162577 0.552761 0.817327 -vn 0.162577 0.552761 0.817327 -vn 0.180414 0.380537 0.906996 -vn 0.353894 0.380537 0.854372 -vn 0.513773 0.380537 0.768914 -vn 0.462980 0.552761 0.692896 -vn 0.318906 0.552761 0.769905 -vn 0.318906 0.552761 0.769905 -vn 0.353894 0.380537 0.854372 -vn 0.513773 0.380537 0.768914 -vn 0.653909 0.380537 0.653907 -vn 0.589261 0.552761 0.589259 -vn 0.462980 0.552761 0.692896 -vn 0.462980 0.552761 0.692896 -vn 0.513773 0.380537 0.768914 -vn 0.653909 0.380537 0.653907 -vn 0.768915 0.380537 0.513771 -vn 0.692897 0.552761 0.462978 -vn 0.589261 0.552761 0.589259 -vn 0.589261 0.552761 0.589259 -vn 0.653909 0.380537 0.653907 -vn 0.768915 0.380537 0.513771 -vn 0.854373 0.380537 0.353891 -vn 0.769906 0.552761 0.318904 -vn 0.692897 0.552761 0.462978 -vn 0.692897 0.552761 0.462978 -vn 0.768915 0.380537 0.513771 -vn 0.854373 0.380537 0.353891 -vn 0.906997 0.380537 0.180411 -vn 0.817328 0.552761 0.162575 -vn 0.769906 0.552761 0.318904 -vn 0.769906 0.552761 0.318904 -vn 0.854373 0.380537 0.353891 -vn 0.906997 0.380537 0.180411 -vn 0.924766 0.380537 -0.000001 -vn 0.833340 0.552761 -0.000001 -vn 0.817328 0.552761 0.162575 -vn 0.817328 0.552761 0.162575 -vn 0.906997 0.380537 0.180411 -vn 0.924766 0.380537 -0.000001 -vn 0.906996 0.380537 -0.180414 -vn 0.817327 0.552761 -0.162578 -vn 0.833340 0.552761 -0.000001 -vn 0.833340 0.552761 -0.000001 -vn 0.924766 0.380537 -0.000001 -vn 0.906996 0.380537 -0.180414 -vn 0.854371 0.380537 -0.353894 -vn 0.769905 0.552761 -0.318907 -vn 0.817327 0.552761 -0.162578 -vn 0.817327 0.552761 -0.162578 -vn 0.906996 0.380537 -0.180414 -vn 0.854371 0.380537 -0.353894 -vn 0.768913 0.380537 -0.513774 -vn 0.692896 0.552761 -0.462980 -vn 0.769905 0.552761 -0.318907 -vn 0.769905 0.552761 -0.318907 -vn 0.854371 0.380537 -0.353894 -vn 0.768913 0.380537 -0.513774 -vn 0.653907 0.380537 -0.653909 -vn 0.589259 0.552761 -0.589261 -vn 0.692896 0.552761 -0.462980 -vn 0.692896 0.552761 -0.462980 -vn 0.768913 0.380537 -0.513774 -vn 0.653907 0.380537 -0.653909 -vn 0.513771 0.380537 -0.768915 -vn 0.462977 0.552761 -0.692898 -vn 0.589259 0.552761 -0.589261 -vn 0.589259 0.552761 -0.589261 -vn 0.653907 0.380537 -0.653909 -vn 0.513771 0.380537 -0.768915 -vn 0.353891 0.380537 -0.854373 -vn 0.318904 0.552761 -0.769906 -vn 0.462977 0.552761 -0.692898 -vn 0.462977 0.552761 -0.692898 -vn 0.513771 0.380537 -0.768915 -vn 0.353891 0.380537 -0.854373 -vn 0.180411 0.380537 -0.906997 -vn 0.162575 0.552761 -0.817328 -vn 0.318904 0.552761 -0.769906 -vn 0.318904 0.552761 -0.769906 -vn 0.353891 0.380537 -0.854373 -vn 0.180411 0.380537 -0.906997 -vn -0.000001 0.380537 -0.924766 -vn -0.000000 0.552761 -0.833340 -vn 0.162575 0.552761 -0.817328 -vn 0.162575 0.552761 -0.817328 -vn 0.180411 0.380537 -0.906997 -vn -0.000001 0.380537 -0.924766 -vn -0.191387 0.193930 -0.962165 -vn -0.180413 0.380537 -0.906996 -vn -0.000001 0.380537 -0.924766 -vn -0.000001 0.380537 -0.924766 -vn -0.000001 0.193930 -0.981015 -vn -0.191387 0.193930 -0.962165 -vn -0.375418 0.193930 -0.906340 -vn -0.353893 0.380537 -0.854372 -vn -0.180413 0.380537 -0.906996 -vn -0.180413 0.380537 -0.906996 -vn -0.191387 0.193930 -0.962165 -vn -0.375418 0.193930 -0.906340 -vn -0.545023 0.193930 -0.815684 -vn -0.513772 0.380537 -0.768915 -vn -0.353893 0.380537 -0.854372 -vn -0.353893 0.380537 -0.854372 -vn -0.375418 0.193930 -0.906340 -vn -0.545023 0.193930 -0.815684 -vn -0.693682 0.193930 -0.693683 -vn -0.653908 0.380537 -0.653908 -vn -0.513772 0.380537 -0.768915 -vn -0.513772 0.380537 -0.768915 -vn -0.545023 0.193930 -0.815684 -vn -0.693682 0.193930 -0.693683 -vn -0.815684 0.193930 -0.545023 -vn -0.768915 0.380537 -0.513772 -vn -0.653908 0.380537 -0.653908 -vn -0.653908 0.380537 -0.653908 -vn -0.693682 0.193930 -0.693683 -vn -0.815684 0.193930 -0.545023 -vn -0.906340 0.193930 -0.375418 -vn -0.854372 0.380537 -0.353892 -vn -0.768915 0.380537 -0.513772 -vn -0.768915 0.380537 -0.513772 -vn -0.815684 0.193930 -0.545023 -vn -0.906340 0.193930 -0.375418 -vn -0.962165 0.193930 -0.191386 -vn -0.906997 0.380537 -0.180412 -vn -0.854372 0.380537 -0.353892 -vn -0.854372 0.380537 -0.353892 -vn -0.906340 0.193930 -0.375418 -vn -0.962165 0.193930 -0.191386 -vn -0.981015 0.193930 0.000000 -vn -0.924766 0.380537 0.000000 -vn -0.906997 0.380537 -0.180412 -vn -0.906997 0.380537 -0.180412 -vn -0.962165 0.193930 -0.191386 -vn -0.981015 0.193930 0.000000 -vn -0.962165 0.193930 0.191387 -vn -0.906996 0.380537 0.180413 -vn -0.924766 0.380537 0.000000 -vn -0.924766 0.380537 0.000000 -vn -0.981015 0.193930 0.000000 -vn -0.962165 0.193930 0.191387 -vn -0.906340 0.193930 0.375419 -vn -0.854372 0.380537 0.353893 -vn -0.906996 0.380537 0.180413 -vn -0.906996 0.380537 0.180413 -vn -0.962165 0.193930 0.191387 -vn -0.906340 0.193930 0.375419 -vn -0.815684 0.193930 0.545023 -vn -0.768914 0.380537 0.513773 -vn -0.854372 0.380537 0.353893 -vn -0.854372 0.380537 0.353893 -vn -0.906340 0.193930 0.375419 -vn -0.815684 0.193930 0.545023 -vn -0.693682 0.193930 0.693683 -vn -0.653907 0.380537 0.653908 -vn -0.768914 0.380537 0.513773 -vn -0.768914 0.380537 0.513773 -vn -0.815684 0.193930 0.545023 -vn -0.693682 0.193930 0.693683 -vn -0.545022 0.193930 0.815685 -vn -0.513772 0.380537 0.768915 -vn -0.653907 0.380537 0.653908 -vn -0.653907 0.380537 0.653908 -vn -0.693682 0.193930 0.693683 -vn -0.545022 0.193930 0.815685 -vn -0.375417 0.193930 0.906340 -vn -0.353892 0.380537 0.854372 -vn -0.513772 0.380537 0.768915 -vn -0.513772 0.380537 0.768915 -vn -0.545022 0.193930 0.815685 -vn -0.375417 0.193930 0.906340 -vn -0.191386 0.193930 0.962166 -vn -0.180412 0.380537 0.906997 -vn -0.353892 0.380537 0.854372 -vn -0.353892 0.380537 0.854372 -vn -0.375417 0.193930 0.906340 -vn -0.191386 0.193930 0.962166 -vn 0.000001 0.193930 0.981015 -vn 0.000001 0.380537 0.924766 -vn -0.180412 0.380537 0.906997 -vn -0.180412 0.380537 0.906997 -vn -0.191386 0.193930 0.962166 -vn 0.000001 0.193930 0.981015 -vn 0.191388 0.193930 0.962165 -vn 0.180414 0.380537 0.906996 -vn 0.000001 0.380537 0.924766 -vn 0.000001 0.380537 0.924766 -vn 0.000001 0.193930 0.981015 -vn 0.191388 0.193930 0.962165 -vn 0.375419 0.193930 0.906339 -vn 0.353894 0.380537 0.854372 -vn 0.180414 0.380537 0.906996 -vn 0.180414 0.380537 0.906996 -vn 0.191388 0.193930 0.962165 -vn 0.375419 0.193930 0.906339 -vn 0.545024 0.193930 0.815684 -vn 0.513773 0.380537 0.768914 -vn 0.353894 0.380537 0.854372 -vn 0.353894 0.380537 0.854372 -vn 0.375419 0.193930 0.906339 -vn 0.545024 0.193930 0.815684 -vn 0.693683 0.193930 0.693682 -vn 0.653909 0.380537 0.653907 -vn 0.513773 0.380537 0.768914 -vn 0.513773 0.380537 0.768914 -vn 0.545024 0.193930 0.815684 -vn 0.693683 0.193930 0.693682 -vn 0.815685 0.193930 0.545022 -vn 0.768915 0.380537 0.513771 -vn 0.653909 0.380537 0.653907 -vn 0.653909 0.380537 0.653907 -vn 0.693683 0.193930 0.693682 -vn 0.815685 0.193930 0.545022 -vn 0.906341 0.193930 0.375417 -vn 0.854373 0.380537 0.353891 -vn 0.768915 0.380537 0.513771 -vn 0.768915 0.380537 0.513771 -vn 0.815685 0.193930 0.545022 -vn 0.906341 0.193930 0.375417 -vn 0.962166 0.193931 0.191385 -vn 0.906997 0.380537 0.180411 -vn 0.854373 0.380537 0.353891 -vn 0.854373 0.380537 0.353891 -vn 0.906341 0.193930 0.375417 -vn 0.962166 0.193931 0.191385 -vn 0.981015 0.193930 -0.000001 -vn 0.924766 0.380537 -0.000001 -vn 0.906997 0.380537 0.180411 -vn 0.906997 0.380537 0.180411 -vn 0.962166 0.193931 0.191385 -vn 0.981015 0.193930 -0.000001 -vn 0.962165 0.193930 -0.191388 -vn 0.906996 0.380537 -0.180414 -vn 0.924766 0.380537 -0.000001 -vn 0.924766 0.380537 -0.000001 -vn 0.981015 0.193930 -0.000001 -vn 0.962165 0.193930 -0.191388 -vn 0.906339 0.193930 -0.375420 -vn 0.854371 0.380537 -0.353894 -vn 0.906996 0.380537 -0.180414 -vn 0.906996 0.380537 -0.180414 -vn 0.962165 0.193930 -0.191388 -vn 0.906339 0.193930 -0.375420 -vn 0.815683 0.193930 -0.545025 -vn 0.768913 0.380537 -0.513774 -vn 0.854371 0.380537 -0.353894 -vn 0.854371 0.380537 -0.353894 -vn 0.906339 0.193930 -0.375420 -vn 0.815683 0.193930 -0.545025 -vn 0.693681 0.193930 -0.693684 -vn 0.653907 0.380537 -0.653909 -vn 0.768913 0.380537 -0.513774 -vn 0.768913 0.380537 -0.513774 -vn 0.815683 0.193930 -0.545025 -vn 0.693681 0.193930 -0.693684 -vn 0.545021 0.193931 -0.815685 -vn 0.513771 0.380537 -0.768915 -vn 0.653907 0.380537 -0.653909 -vn 0.653907 0.380537 -0.653909 -vn 0.693681 0.193930 -0.693684 -vn 0.545021 0.193931 -0.815685 -vn 0.375416 0.193930 -0.906341 -vn 0.353891 0.380537 -0.854373 -vn 0.513771 0.380537 -0.768915 -vn 0.513771 0.380537 -0.768915 -vn 0.545021 0.193931 -0.815685 -vn 0.375416 0.193930 -0.906341 -vn 0.191385 0.193930 -0.962166 -vn 0.180411 0.380537 -0.906997 -vn 0.353891 0.380537 -0.854373 -vn 0.353891 0.380537 -0.854373 -vn 0.375416 0.193930 -0.906341 -vn 0.191385 0.193930 -0.962166 -vn -0.000001 0.193930 -0.981015 -vn -0.000001 0.380537 -0.924766 -vn 0.180411 0.380537 -0.906997 -vn 0.180411 0.380537 -0.906997 -vn 0.191385 0.193930 -0.962166 -vn -0.000001 0.193930 -0.981015 -vn -0.195090 0.000000 -0.980785 -vn -0.191387 0.193930 -0.962165 -vn -0.000001 0.193930 -0.981015 -vn -0.000001 0.193930 -0.981015 -vn -0.000000 0.000000 -1.000000 -vn -0.195090 0.000000 -0.980785 -vn -0.382683 0.000000 -0.923880 -vn -0.375418 0.193930 -0.906340 -vn -0.191387 0.193930 -0.962165 -vn -0.191387 0.193930 -0.962165 -vn -0.195090 0.000000 -0.980785 -vn -0.382683 0.000000 -0.923880 -vn -0.555570 0.000000 -0.831469 -vn -0.545023 0.193930 -0.815684 -vn -0.375418 0.193930 -0.906340 -vn -0.375418 0.193930 -0.906340 -vn -0.382683 0.000000 -0.923880 -vn -0.555570 0.000000 -0.831469 -vn -0.707107 0.000000 -0.707107 -vn -0.693682 0.193930 -0.693683 -vn -0.545023 0.193930 -0.815684 -vn -0.545023 0.193930 -0.815684 -vn -0.555570 0.000000 -0.831469 -vn -0.707107 0.000000 -0.707107 -vn -0.831470 0.000000 -0.555570 -vn -0.815684 0.193930 -0.545023 -vn -0.693682 0.193930 -0.693683 -vn -0.693682 0.193930 -0.693683 -vn -0.707107 0.000000 -0.707107 -vn -0.831470 0.000000 -0.555570 -vn -0.923880 0.000000 -0.382683 -vn -0.906340 0.193930 -0.375418 -vn -0.815684 0.193930 -0.545023 -vn -0.815684 0.193930 -0.545023 -vn -0.831470 0.000000 -0.555570 -vn -0.923880 0.000000 -0.382683 -vn -0.980785 0.000000 -0.195090 -vn -0.962165 0.193930 -0.191386 -vn -0.906340 0.193930 -0.375418 -vn -0.906340 0.193930 -0.375418 -vn -0.923880 0.000000 -0.382683 -vn -0.980785 0.000000 -0.195090 -vn -1.000000 0.000000 0.000000 -vn -0.981015 0.193930 0.000000 -vn -0.962165 0.193930 -0.191386 -vn -0.962165 0.193930 -0.191386 -vn -0.980785 0.000000 -0.195090 -vn -1.000000 0.000000 0.000000 -vn -0.980785 0.000000 0.195091 -vn -0.962165 0.193930 0.191387 -vn -0.981015 0.193930 0.000000 -vn -0.981015 0.193930 0.000000 -vn -1.000000 0.000000 0.000000 -vn -0.980785 0.000000 0.195091 -vn -0.923879 0.000000 0.382684 -vn -0.906340 0.193930 0.375419 -vn -0.962165 0.193930 0.191387 -vn -0.962165 0.193930 0.191387 -vn -0.980785 0.000000 0.195091 -vn -0.923879 0.000000 0.382684 -vn -0.831469 0.000000 0.555570 -vn -0.815684 0.193930 0.545023 -vn -0.906340 0.193930 0.375419 -vn -0.906340 0.193930 0.375419 -vn -0.923879 0.000000 0.382684 -vn -0.831469 0.000000 0.555570 -vn -0.707106 0.000000 0.707107 -vn -0.693682 0.193930 0.693683 -vn -0.815684 0.193930 0.545023 -vn -0.815684 0.193930 0.545023 -vn -0.831469 0.000000 0.555570 -vn -0.707106 0.000000 0.707107 -vn -0.555570 0.000000 0.831470 -vn -0.545022 0.193930 0.815685 -vn -0.693682 0.193930 0.693683 -vn -0.693682 0.193930 0.693683 -vn -0.707106 0.000000 0.707107 -vn -0.555570 0.000000 0.831470 -vn -0.382683 0.000000 0.923880 -vn -0.375417 0.193930 0.906340 -vn -0.545022 0.193930 0.815685 -vn -0.545022 0.193930 0.815685 -vn -0.555570 0.000000 0.831470 -vn -0.382683 0.000000 0.923880 -vn -0.195090 0.000000 0.980785 -vn -0.191386 0.193930 0.962166 -vn -0.375417 0.193930 0.906340 -vn -0.375417 0.193930 0.906340 -vn -0.382683 0.000000 0.923880 -vn -0.195090 0.000000 0.980785 -vn 0.000001 0.000000 1.000000 -vn 0.000001 0.193930 0.981015 -vn -0.191386 0.193930 0.962166 -vn -0.191386 0.193930 0.962166 -vn -0.195090 0.000000 0.980785 -vn 0.000001 0.000000 1.000000 -vn 0.195092 0.000000 0.980785 -vn 0.191388 0.193930 0.962165 -vn 0.000001 0.193930 0.981015 -vn 0.000001 0.193930 0.981015 -vn 0.000001 0.000000 1.000000 -vn 0.195092 0.000000 0.980785 -vn 0.382685 0.000000 0.923879 -vn 0.375419 0.193930 0.906339 -vn 0.191388 0.193930 0.962165 -vn 0.191388 0.193930 0.962165 -vn 0.195092 0.000000 0.980785 -vn 0.382685 0.000000 0.923879 -vn 0.555571 0.000000 0.831469 -vn 0.545024 0.193930 0.815684 -vn 0.375419 0.193930 0.906339 -vn 0.375419 0.193930 0.906339 -vn 0.382685 0.000000 0.923879 -vn 0.555571 0.000000 0.831469 -vn 0.707108 0.000000 0.707106 -vn 0.693683 0.193930 0.693682 -vn 0.545024 0.193930 0.815684 -vn 0.545024 0.193930 0.815684 -vn 0.555571 0.000000 0.831469 -vn 0.707108 0.000000 0.707106 -vn 0.831470 -0.000000 0.555569 -vn 0.815685 0.193930 0.545022 -vn 0.693683 0.193930 0.693682 -vn 0.693683 0.193930 0.693682 -vn 0.707108 0.000000 0.707106 -vn 0.831470 -0.000000 0.555569 -vn 0.923880 0.000000 0.382682 -vn 0.906341 0.193930 0.375417 -vn 0.815685 0.193930 0.545022 -vn 0.815685 0.193930 0.545022 -vn 0.831470 -0.000000 0.555569 -vn 0.923880 0.000000 0.382682 -vn 0.980786 0.000000 0.195089 -vn 0.962166 0.193931 0.191385 -vn 0.906341 0.193930 0.375417 -vn 0.906341 0.193930 0.375417 -vn 0.923880 0.000000 0.382682 -vn 0.980786 0.000000 0.195089 -vn 1.000000 0.000001 -0.000002 -vn 0.981015 0.193930 -0.000001 -vn 0.962166 0.193931 0.191385 -vn 0.962166 0.193931 0.191385 -vn 0.980786 0.000000 0.195089 -vn 1.000000 0.000001 -0.000002 -vn 0.980785 0.000000 -0.195092 -vn 0.962165 0.193930 -0.191388 -vn 0.981015 0.193930 -0.000001 -vn 0.981015 0.193930 -0.000001 -vn 1.000000 0.000001 -0.000002 -vn 0.980785 0.000000 -0.195092 -vn 0.923879 -0.000000 -0.382685 -vn 0.906339 0.193930 -0.375420 -vn 0.962165 0.193930 -0.191388 -vn 0.962165 0.193930 -0.191388 -vn 0.980785 0.000000 -0.195092 -vn 0.923879 -0.000000 -0.382685 -vn 0.831469 0.000000 -0.555572 -vn 0.815683 0.193930 -0.545025 -vn 0.906339 0.193930 -0.375420 -vn 0.906339 0.193930 -0.375420 -vn 0.923879 -0.000000 -0.382685 -vn 0.831469 0.000000 -0.555572 -vn 0.707106 0.000000 -0.707108 -vn 0.693681 0.193930 -0.693684 -vn 0.815683 0.193930 -0.545025 -vn 0.815683 0.193930 -0.545025 -vn 0.831469 0.000000 -0.555572 -vn 0.707106 0.000000 -0.707108 -vn 0.555569 0.000000 -0.831471 -vn 0.545021 0.193931 -0.815685 -vn 0.693681 0.193930 -0.693684 -vn 0.693681 0.193930 -0.693684 -vn 0.707106 0.000000 -0.707108 -vn 0.555569 0.000000 -0.831471 -vn 0.382681 0.000000 -0.923880 -vn 0.375416 0.193930 -0.906341 -vn 0.545021 0.193931 -0.815685 -vn 0.545021 0.193931 -0.815685 -vn 0.555569 0.000000 -0.831471 -vn 0.382681 0.000000 -0.923880 -vn 0.195089 0.000000 -0.980786 -vn 0.191385 0.193930 -0.962166 -vn 0.375416 0.193930 -0.906341 -vn 0.375416 0.193930 -0.906341 -vn 0.382681 0.000000 -0.923880 -vn 0.195089 0.000000 -0.980786 -vn -0.000000 0.000000 -1.000000 -vn -0.000001 0.193930 -0.981015 -vn 0.191385 0.193930 -0.962166 -vn 0.191385 0.193930 -0.962166 -vn 0.195089 0.000000 -0.980786 -vn -0.000000 0.000000 -1.000000 -vn -0.191387 -0.193930 -0.962165 -vn -0.195090 0.000000 -0.980785 -vn -0.000000 0.000000 -1.000000 -vn -0.000000 0.000000 -1.000000 -vn -0.000001 -0.193930 -0.981015 -vn -0.191387 -0.193930 -0.962165 -vn -0.375418 -0.193930 -0.906340 -vn -0.382683 0.000000 -0.923880 -vn -0.195090 0.000000 -0.980785 -vn -0.195090 0.000000 -0.980785 -vn -0.191387 -0.193930 -0.962165 -vn -0.375418 -0.193930 -0.906340 -vn -0.545023 -0.193930 -0.815684 -vn -0.555570 0.000000 -0.831469 -vn -0.382683 0.000000 -0.923880 -vn -0.382683 0.000000 -0.923880 -vn -0.375418 -0.193930 -0.906340 -vn -0.545023 -0.193930 -0.815684 -vn -0.693683 -0.193930 -0.693683 -vn -0.707107 0.000000 -0.707107 -vn -0.555570 0.000000 -0.831469 -vn -0.555570 0.000000 -0.831469 -vn -0.545023 -0.193930 -0.815684 -vn -0.693683 -0.193930 -0.693683 -vn -0.815684 -0.193930 -0.545023 -vn -0.831470 0.000000 -0.555570 -vn -0.707107 0.000000 -0.707107 -vn -0.707107 0.000000 -0.707107 -vn -0.693683 -0.193930 -0.693683 -vn -0.815684 -0.193930 -0.545023 -vn -0.906340 -0.193930 -0.375418 -vn -0.923880 0.000000 -0.382683 -vn -0.831470 0.000000 -0.555570 -vn -0.831470 0.000000 -0.555570 -vn -0.815684 -0.193930 -0.545023 -vn -0.906340 -0.193930 -0.375418 -vn -0.962165 -0.193930 -0.191386 -vn -0.980785 0.000000 -0.195090 -vn -0.923880 0.000000 -0.382683 -vn -0.923880 0.000000 -0.382683 -vn -0.906340 -0.193930 -0.375418 -vn -0.962165 -0.193930 -0.191386 -vn -0.981015 -0.193930 0.000000 -vn -1.000000 0.000000 0.000000 -vn -0.980785 0.000000 -0.195090 -vn -0.980785 0.000000 -0.195090 -vn -0.962165 -0.193930 -0.191386 -vn -0.981015 -0.193930 0.000000 -vn -0.962165 -0.193930 0.191387 -vn -0.980785 0.000000 0.195091 -vn -1.000000 0.000000 0.000000 -vn -1.000000 0.000000 0.000000 -vn -0.981015 -0.193930 0.000000 -vn -0.962165 -0.193930 0.191387 -vn -0.906340 -0.193930 0.375419 -vn -0.923879 0.000000 0.382684 -vn -0.980785 0.000000 0.195091 -vn -0.980785 0.000000 0.195091 -vn -0.962165 -0.193930 0.191387 -vn -0.906340 -0.193930 0.375419 -vn -0.815684 -0.193930 0.545023 -vn -0.831469 0.000000 0.555570 -vn -0.923879 0.000000 0.382684 -vn -0.923879 0.000000 0.382684 -vn -0.906340 -0.193930 0.375419 -vn -0.815684 -0.193930 0.545023 -vn -0.693682 -0.193930 0.693683 -vn -0.707106 0.000000 0.707107 -vn -0.831469 0.000000 0.555570 -vn -0.831469 0.000000 0.555570 -vn -0.815684 -0.193930 0.545023 -vn -0.693682 -0.193930 0.693683 -vn -0.545023 -0.193930 0.815685 -vn -0.555570 0.000000 0.831470 -vn -0.707106 0.000000 0.707107 -vn -0.707106 0.000000 0.707107 -vn -0.693682 -0.193930 0.693683 -vn -0.545023 -0.193930 0.815685 -vn -0.375417 -0.193930 0.906340 -vn -0.382683 0.000000 0.923880 -vn -0.555570 0.000000 0.831470 -vn -0.555570 0.000000 0.831470 -vn -0.545023 -0.193930 0.815685 -vn -0.375417 -0.193930 0.906340 -vn -0.191386 -0.193930 0.962166 -vn -0.195090 0.000000 0.980785 -vn -0.382683 0.000000 0.923880 -vn -0.382683 0.000000 0.923880 -vn -0.375417 -0.193930 0.906340 -vn -0.191386 -0.193930 0.962166 -vn 0.000001 -0.193930 0.981015 -vn 0.000001 0.000000 1.000000 -vn -0.195090 0.000000 0.980785 -vn -0.195090 0.000000 0.980785 -vn -0.191386 -0.193930 0.962166 -vn 0.000001 -0.193930 0.981015 -vn 0.191388 -0.193930 0.962165 -vn 0.195092 0.000000 0.980785 -vn 0.000001 0.000000 1.000000 -vn 0.000001 0.000000 1.000000 -vn 0.000001 -0.193930 0.981015 -vn 0.191388 -0.193930 0.962165 -vn 0.375419 -0.193930 0.906340 -vn 0.382685 0.000000 0.923879 -vn 0.195092 0.000000 0.980785 -vn 0.195092 0.000000 0.980785 -vn 0.191388 -0.193930 0.962165 -vn 0.375419 -0.193930 0.906340 -vn 0.545024 -0.193930 0.815684 -vn 0.555571 0.000000 0.831469 -vn 0.382685 0.000000 0.923879 -vn 0.382685 0.000000 0.923879 -vn 0.375419 -0.193930 0.906340 -vn 0.545024 -0.193930 0.815684 -vn 0.693684 -0.193930 0.693682 -vn 0.707108 0.000000 0.707106 -vn 0.555571 0.000000 0.831469 -vn 0.555571 0.000000 0.831469 -vn 0.545024 -0.193930 0.815684 -vn 0.693684 -0.193930 0.693682 -vn 0.815685 -0.193930 0.545022 -vn 0.831470 -0.000000 0.555569 -vn 0.707108 0.000000 0.707106 -vn 0.707108 0.000000 0.707106 -vn 0.693684 -0.193930 0.693682 -vn 0.815685 -0.193930 0.545022 -vn 0.906340 -0.193930 0.375417 -vn 0.923880 0.000000 0.382682 -vn 0.831470 -0.000000 0.555569 -vn 0.831470 -0.000000 0.555569 -vn 0.815685 -0.193930 0.545022 -vn 0.906340 -0.193930 0.375417 -vn 0.962166 -0.193930 0.191385 -vn 0.980786 0.000000 0.195089 -vn 0.923880 0.000000 0.382682 -vn 0.923880 0.000000 0.382682 -vn 0.906340 -0.193930 0.375417 -vn 0.962166 -0.193930 0.191385 -vn 0.981015 -0.193930 -0.000002 -vn 1.000000 0.000001 -0.000002 -vn 0.980786 0.000000 0.195089 -vn 0.980786 0.000000 0.195089 -vn 0.962166 -0.193930 0.191385 -vn 0.981015 -0.193930 -0.000002 -vn 0.962165 -0.193930 -0.191388 -vn 0.980785 0.000000 -0.195092 -vn 1.000000 0.000001 -0.000002 -vn 1.000000 0.000001 -0.000002 -vn 0.981015 -0.193930 -0.000002 -vn 0.962165 -0.193930 -0.191388 -vn 0.906339 -0.193930 -0.375420 -vn 0.923879 -0.000000 -0.382685 -vn 0.980785 0.000000 -0.195092 -vn 0.980785 0.000000 -0.195092 -vn 0.962165 -0.193930 -0.191388 -vn 0.906339 -0.193930 -0.375420 -vn 0.815684 -0.193930 -0.545024 -vn 0.831469 0.000000 -0.555572 -vn 0.923879 -0.000000 -0.382685 -vn 0.923879 -0.000000 -0.382685 -vn 0.906339 -0.193930 -0.375420 -vn 0.815684 -0.193930 -0.545024 -vn 0.693681 -0.193930 -0.693684 -vn 0.707106 0.000000 -0.707108 -vn 0.831469 0.000000 -0.555572 -vn 0.831469 0.000000 -0.555572 -vn 0.815684 -0.193930 -0.545024 -vn 0.693681 -0.193930 -0.693684 -vn 0.545021 -0.193930 -0.815686 -vn 0.555569 0.000000 -0.831471 -vn 0.707106 0.000000 -0.707108 -vn 0.707106 0.000000 -0.707108 -vn 0.693681 -0.193930 -0.693684 -vn 0.545021 -0.193930 -0.815686 -vn 0.375416 -0.193930 -0.906341 -vn 0.382681 0.000000 -0.923880 -vn 0.555569 0.000000 -0.831471 -vn 0.555569 0.000000 -0.831471 -vn 0.545021 -0.193930 -0.815686 -vn 0.375416 -0.193930 -0.906341 -vn 0.191385 -0.193930 -0.962166 -vn 0.195089 0.000000 -0.980786 -vn 0.382681 0.000000 -0.923880 -vn 0.382681 0.000000 -0.923880 -vn 0.375416 -0.193930 -0.906341 -vn 0.191385 -0.193930 -0.962166 -vn -0.000001 -0.193930 -0.981015 -vn -0.000000 0.000000 -1.000000 -vn 0.195089 0.000000 -0.980786 -vn 0.195089 0.000000 -0.980786 -vn 0.191385 -0.193930 -0.962166 -vn -0.000001 -0.193930 -0.981015 -vn -0.180413 -0.380537 -0.906996 -vn -0.191387 -0.193930 -0.962165 -vn -0.000001 -0.193930 -0.981015 -vn -0.000001 -0.193930 -0.981015 -vn -0.000001 -0.380537 -0.924766 -vn -0.180413 -0.380537 -0.906996 -vn -0.353893 -0.380537 -0.854372 -vn -0.375418 -0.193930 -0.906340 -vn -0.191387 -0.193930 -0.962165 -vn -0.191387 -0.193930 -0.962165 -vn -0.180413 -0.380537 -0.906996 -vn -0.353893 -0.380537 -0.854372 -vn -0.513772 -0.380537 -0.768914 -vn -0.545023 -0.193930 -0.815684 -vn -0.375418 -0.193930 -0.906340 -vn -0.375418 -0.193930 -0.906340 -vn -0.353893 -0.380537 -0.854372 -vn -0.513772 -0.380537 -0.768914 -vn -0.653908 -0.380537 -0.653908 -vn -0.693683 -0.193930 -0.693683 -vn -0.545023 -0.193930 -0.815684 -vn -0.545023 -0.193930 -0.815684 -vn -0.513772 -0.380537 -0.768914 -vn -0.653908 -0.380537 -0.653908 -vn -0.768914 -0.380537 -0.513772 -vn -0.815684 -0.193930 -0.545023 -vn -0.693683 -0.193930 -0.693683 -vn -0.693683 -0.193930 -0.693683 -vn -0.653908 -0.380537 -0.653908 -vn -0.768914 -0.380537 -0.513772 -vn -0.854372 -0.380537 -0.353892 -vn -0.906340 -0.193930 -0.375418 -vn -0.815684 -0.193930 -0.545023 -vn -0.815684 -0.193930 -0.545023 -vn -0.768914 -0.380537 -0.513772 -vn -0.854372 -0.380537 -0.353892 -vn -0.906996 -0.380537 -0.180413 -vn -0.962165 -0.193930 -0.191386 -vn -0.906340 -0.193930 -0.375418 -vn -0.906340 -0.193930 -0.375418 -vn -0.854372 -0.380537 -0.353892 -vn -0.906996 -0.380537 -0.180413 -vn -0.924766 -0.380537 0.000000 -vn -0.981015 -0.193930 0.000000 -vn -0.962165 -0.193930 -0.191386 -vn -0.962165 -0.193930 -0.191386 -vn -0.906996 -0.380537 -0.180413 -vn -0.924766 -0.380537 0.000000 -vn -0.906996 -0.380537 0.180413 -vn -0.962165 -0.193930 0.191387 -vn -0.981015 -0.193930 0.000000 -vn -0.981015 -0.193930 0.000000 -vn -0.924766 -0.380537 0.000000 -vn -0.906996 -0.380537 0.180413 -vn -0.854372 -0.380537 0.353893 -vn -0.906340 -0.193930 0.375419 -vn -0.962165 -0.193930 0.191387 -vn -0.962165 -0.193930 0.191387 -vn -0.906996 -0.380537 0.180413 -vn -0.854372 -0.380537 0.353893 -vn -0.768914 -0.380537 0.513773 -vn -0.815684 -0.193930 0.545023 -vn -0.906340 -0.193930 0.375419 -vn -0.906340 -0.193930 0.375419 -vn -0.854372 -0.380537 0.353893 -vn -0.768914 -0.380537 0.513773 -vn -0.653908 -0.380537 0.653908 -vn -0.693682 -0.193930 0.693683 -vn -0.815684 -0.193930 0.545023 -vn -0.815684 -0.193930 0.545023 -vn -0.768914 -0.380537 0.513773 -vn -0.653908 -0.380537 0.653908 -vn -0.513772 -0.380537 0.768915 -vn -0.545023 -0.193930 0.815685 -vn -0.693682 -0.193930 0.693683 -vn -0.693682 -0.193930 0.693683 -vn -0.653908 -0.380537 0.653908 -vn -0.513772 -0.380537 0.768915 -vn -0.353892 -0.380537 0.854372 -vn -0.375417 -0.193930 0.906340 -vn -0.545023 -0.193930 0.815685 -vn -0.545023 -0.193930 0.815685 -vn -0.513772 -0.380537 0.768915 -vn -0.353892 -0.380537 0.854372 -vn -0.180412 -0.380537 0.906997 -vn -0.191386 -0.193930 0.962166 -vn -0.375417 -0.193930 0.906340 -vn -0.375417 -0.193930 0.906340 -vn -0.353892 -0.380537 0.854372 -vn -0.180412 -0.380537 0.906997 -vn 0.000001 -0.380537 0.924766 -vn 0.000001 -0.193930 0.981015 -vn -0.191386 -0.193930 0.962166 -vn -0.191386 -0.193930 0.962166 -vn -0.180412 -0.380537 0.906997 -vn 0.000001 -0.380537 0.924766 -vn 0.180414 -0.380537 0.906996 -vn 0.191388 -0.193930 0.962165 -vn 0.000001 -0.193930 0.981015 -vn 0.000001 -0.193930 0.981015 -vn 0.000001 -0.380537 0.924766 -vn 0.180414 -0.380537 0.906996 -vn 0.353893 -0.380537 0.854372 -vn 0.375419 -0.193930 0.906340 -vn 0.191388 -0.193930 0.962165 -vn 0.191388 -0.193930 0.962165 -vn 0.180414 -0.380537 0.906996 -vn 0.353893 -0.380537 0.854372 -vn 0.513773 -0.380537 0.768914 -vn 0.545024 -0.193930 0.815684 -vn 0.375419 -0.193930 0.906340 -vn 0.375419 -0.193930 0.906340 -vn 0.353893 -0.380537 0.854372 -vn 0.513773 -0.380537 0.768914 -vn 0.653909 -0.380537 0.653907 -vn 0.693684 -0.193930 0.693682 -vn 0.545024 -0.193930 0.815684 -vn 0.545024 -0.193930 0.815684 -vn 0.513773 -0.380537 0.768914 -vn 0.653909 -0.380537 0.653907 -vn 0.768915 -0.380537 0.513771 -vn 0.815685 -0.193930 0.545022 -vn 0.693684 -0.193930 0.693682 -vn 0.693684 -0.193930 0.693682 -vn 0.653909 -0.380537 0.653907 -vn 0.768915 -0.380537 0.513771 -vn 0.854373 -0.380537 0.353891 -vn 0.906340 -0.193930 0.375417 -vn 0.815685 -0.193930 0.545022 -vn 0.815685 -0.193930 0.545022 -vn 0.768915 -0.380537 0.513771 -vn 0.854373 -0.380537 0.353891 -vn 0.906997 -0.380537 0.180411 -vn 0.962166 -0.193930 0.191385 -vn 0.906340 -0.193930 0.375417 -vn 0.906340 -0.193930 0.375417 -vn 0.854373 -0.380537 0.353891 -vn 0.906997 -0.380537 0.180411 -vn 0.924766 -0.380537 -0.000002 -vn 0.981015 -0.193930 -0.000002 -vn 0.962166 -0.193930 0.191385 -vn 0.962166 -0.193930 0.191385 -vn 0.906997 -0.380537 0.180411 -vn 0.924766 -0.380537 -0.000002 -vn 0.906996 -0.380537 -0.180414 -vn 0.962165 -0.193930 -0.191388 -vn 0.981015 -0.193930 -0.000002 -vn 0.981015 -0.193930 -0.000002 -vn 0.924766 -0.380537 -0.000002 -vn 0.906996 -0.380537 -0.180414 -vn 0.854371 -0.380537 -0.353894 -vn 0.906339 -0.193930 -0.375420 -vn 0.962165 -0.193930 -0.191388 -vn 0.962165 -0.193930 -0.191388 -vn 0.906996 -0.380537 -0.180414 -vn 0.854371 -0.380537 -0.353894 -vn 0.768914 -0.380537 -0.513774 -vn 0.815684 -0.193930 -0.545024 -vn 0.906339 -0.193930 -0.375420 -vn 0.906339 -0.193930 -0.375420 -vn 0.854371 -0.380537 -0.353894 -vn 0.768914 -0.380537 -0.513774 -vn 0.653907 -0.380537 -0.653909 -vn 0.693681 -0.193930 -0.693684 -vn 0.815684 -0.193930 -0.545024 -vn 0.815684 -0.193930 -0.545024 -vn 0.768914 -0.380537 -0.513774 -vn 0.653907 -0.380537 -0.653909 -vn 0.513770 -0.380537 -0.768916 -vn 0.545021 -0.193930 -0.815686 -vn 0.693681 -0.193930 -0.693684 -vn 0.693681 -0.193930 -0.693684 -vn 0.653907 -0.380537 -0.653909 -vn 0.513770 -0.380537 -0.768916 -vn 0.353891 -0.380537 -0.854373 -vn 0.375416 -0.193930 -0.906341 -vn 0.545021 -0.193930 -0.815686 -vn 0.545021 -0.193930 -0.815686 -vn 0.513770 -0.380537 -0.768916 -vn 0.353891 -0.380537 -0.854373 -vn 0.180412 -0.380537 -0.906997 -vn 0.191385 -0.193930 -0.962166 -vn 0.375416 -0.193930 -0.906341 -vn 0.375416 -0.193930 -0.906341 -vn 0.353891 -0.380537 -0.854373 -vn 0.180412 -0.380537 -0.906997 -vn -0.000001 -0.380537 -0.924766 -vn -0.000001 -0.193930 -0.981015 -vn 0.191385 -0.193930 -0.962166 -vn 0.191385 -0.193930 -0.962166 -vn 0.180412 -0.380537 -0.906997 -vn -0.000001 -0.380537 -0.924766 -vn -0.162576 -0.552761 -0.817327 -vn -0.180413 -0.380537 -0.906996 -vn -0.000001 -0.380537 -0.924766 -vn -0.000001 -0.380537 -0.924766 -vn -0.000001 -0.552761 -0.833340 -vn -0.162576 -0.552761 -0.817327 -vn -0.318905 -0.552761 -0.769906 -vn -0.353893 -0.380537 -0.854372 -vn -0.180413 -0.380537 -0.906996 -vn -0.180413 -0.380537 -0.906996 -vn -0.162576 -0.552761 -0.817327 -vn -0.318905 -0.552761 -0.769906 -vn -0.462979 -0.552761 -0.692897 -vn -0.513772 -0.380537 -0.768914 -vn -0.353893 -0.380537 -0.854372 -vn -0.353893 -0.380537 -0.854372 -vn -0.318905 -0.552761 -0.769906 -vn -0.462979 -0.552761 -0.692897 -vn -0.589260 -0.552761 -0.589260 -vn -0.653908 -0.380537 -0.653908 -vn -0.513772 -0.380537 -0.768914 -vn -0.513772 -0.380537 -0.768914 -vn -0.462979 -0.552761 -0.692897 -vn -0.589260 -0.552761 -0.589260 -vn -0.692897 -0.552761 -0.462979 -vn -0.768914 -0.380537 -0.513772 -vn -0.653908 -0.380537 -0.653908 -vn -0.653908 -0.380537 -0.653908 -vn -0.589260 -0.552761 -0.589260 -vn -0.692897 -0.552761 -0.462979 -vn -0.769906 -0.552761 -0.318905 -vn -0.854372 -0.380537 -0.353892 -vn -0.768914 -0.380537 -0.513772 -vn -0.768914 -0.380537 -0.513772 -vn -0.692897 -0.552761 -0.462979 -vn -0.769906 -0.552761 -0.318905 -vn -0.817327 -0.552761 -0.162576 -vn -0.906996 -0.380537 -0.180413 -vn -0.854372 -0.380537 -0.353892 -vn -0.854372 -0.380537 -0.353892 -vn -0.769906 -0.552761 -0.318905 -vn -0.817327 -0.552761 -0.162576 -vn -0.833340 -0.552761 0.000000 -vn -0.924766 -0.380537 0.000000 -vn -0.906996 -0.380537 -0.180413 -vn -0.906996 -0.380537 -0.180413 -vn -0.817327 -0.552761 -0.162576 -vn -0.833340 -0.552761 0.000000 -vn -0.817327 -0.552761 0.162577 -vn -0.906996 -0.380537 0.180413 -vn -0.924766 -0.380537 0.000000 -vn -0.924766 -0.380537 0.000000 -vn -0.833340 -0.552761 0.000000 -vn -0.817327 -0.552761 0.162577 -vn -0.769905 -0.552761 0.318906 -vn -0.854372 -0.380537 0.353893 -vn -0.906996 -0.380537 0.180413 -vn -0.906996 -0.380537 0.180413 -vn -0.817327 -0.552761 0.162577 -vn -0.769905 -0.552761 0.318906 -vn -0.692896 -0.552761 0.462979 -vn -0.768914 -0.380537 0.513773 -vn -0.854372 -0.380537 0.353893 -vn -0.854372 -0.380537 0.353893 -vn -0.769905 -0.552761 0.318906 -vn -0.692896 -0.552761 0.462979 -vn -0.589260 -0.552761 0.589260 -vn -0.653908 -0.380537 0.653908 -vn -0.768914 -0.380537 0.513773 -vn -0.768914 -0.380537 0.513773 -vn -0.692896 -0.552761 0.462979 -vn -0.589260 -0.552761 0.589260 -vn -0.462978 -0.552761 0.692897 -vn -0.513772 -0.380537 0.768915 -vn -0.653908 -0.380537 0.653908 -vn -0.653908 -0.380537 0.653908 -vn -0.589260 -0.552761 0.589260 -vn -0.462978 -0.552761 0.692897 -vn -0.318905 -0.552761 0.769906 -vn -0.353892 -0.380537 0.854372 -vn -0.513772 -0.380537 0.768915 -vn -0.513772 -0.380537 0.768915 -vn -0.462978 -0.552761 0.692897 -vn -0.318905 -0.552761 0.769906 -vn -0.162576 -0.552761 0.817327 -vn -0.180412 -0.380537 0.906997 -vn -0.353892 -0.380537 0.854372 -vn -0.353892 -0.380537 0.854372 -vn -0.318905 -0.552761 0.769906 -vn -0.162576 -0.552761 0.817327 -vn 0.000001 -0.552761 0.833340 -vn 0.000001 -0.380537 0.924766 -vn -0.180412 -0.380537 0.906997 -vn -0.180412 -0.380537 0.906997 -vn -0.162576 -0.552761 0.817327 -vn 0.000001 -0.552761 0.833340 -vn 0.162577 -0.552761 0.817327 -vn 0.180414 -0.380537 0.906996 -vn 0.000001 -0.380537 0.924766 -vn 0.000001 -0.380537 0.924766 -vn 0.000001 -0.552761 0.833340 -vn 0.162577 -0.552761 0.817327 -vn 0.318906 -0.552761 0.769905 -vn 0.353893 -0.380537 0.854372 -vn 0.180414 -0.380537 0.906996 -vn 0.180414 -0.380537 0.906996 -vn 0.162577 -0.552761 0.817327 -vn 0.318906 -0.552761 0.769905 -vn 0.462979 -0.552761 0.692896 -vn 0.513773 -0.380537 0.768914 -vn 0.353893 -0.380537 0.854372 -vn 0.353893 -0.380537 0.854372 -vn 0.318906 -0.552761 0.769905 -vn 0.462979 -0.552761 0.692896 -vn 0.589261 -0.552761 0.589259 -vn 0.653909 -0.380537 0.653907 -vn 0.513773 -0.380537 0.768914 -vn 0.513773 -0.380537 0.768914 -vn 0.462979 -0.552761 0.692896 -vn 0.589261 -0.552761 0.589259 -vn 0.692897 -0.552761 0.462978 -vn 0.768915 -0.380537 0.513771 -vn 0.653909 -0.380537 0.653907 -vn 0.653909 -0.380537 0.653907 -vn 0.589261 -0.552761 0.589259 -vn 0.692897 -0.552761 0.462978 -vn 0.769906 -0.552761 0.318904 -vn 0.854373 -0.380537 0.353891 -vn 0.768915 -0.380537 0.513771 -vn 0.768915 -0.380537 0.513771 -vn 0.692897 -0.552761 0.462978 -vn 0.769906 -0.552761 0.318904 -vn 0.817327 -0.552761 0.162576 -vn 0.906997 -0.380537 0.180411 -vn 0.854373 -0.380537 0.353891 -vn 0.854373 -0.380537 0.353891 -vn 0.769906 -0.552761 0.318904 -vn 0.817327 -0.552761 0.162576 -vn 0.833340 -0.552761 -0.000001 -vn 0.924766 -0.380537 -0.000002 -vn 0.906997 -0.380537 0.180411 -vn 0.906997 -0.380537 0.180411 -vn 0.817327 -0.552761 0.162576 -vn 0.833340 -0.552761 -0.000001 -vn 0.817327 -0.552761 -0.162578 -vn 0.906996 -0.380537 -0.180414 -vn 0.924766 -0.380537 -0.000002 -vn 0.924766 -0.380537 -0.000002 -vn 0.833340 -0.552761 -0.000001 -vn 0.817327 -0.552761 -0.162578 -vn 0.769905 -0.552761 -0.318907 -vn 0.854371 -0.380537 -0.353894 -vn 0.906996 -0.380537 -0.180414 -vn 0.906996 -0.380537 -0.180414 -vn 0.817327 -0.552761 -0.162578 -vn 0.769905 -0.552761 -0.318907 -vn 0.692896 -0.552761 -0.462980 -vn 0.768914 -0.380537 -0.513774 -vn 0.854371 -0.380537 -0.353894 -vn 0.854371 -0.380537 -0.353894 -vn 0.769905 -0.552761 -0.318907 -vn 0.692896 -0.552761 -0.462980 -vn 0.589259 -0.552761 -0.589261 -vn 0.653907 -0.380537 -0.653909 -vn 0.768914 -0.380537 -0.513774 -vn 0.768914 -0.380537 -0.513774 -vn 0.692896 -0.552761 -0.462980 -vn 0.589259 -0.552761 -0.589261 -vn 0.462977 -0.552761 -0.692898 -vn 0.513770 -0.380537 -0.768916 -vn 0.653907 -0.380537 -0.653909 -vn 0.653907 -0.380537 -0.653909 -vn 0.589259 -0.552761 -0.589261 -vn 0.462977 -0.552761 -0.692898 -vn 0.318904 -0.552761 -0.769906 -vn 0.353891 -0.380537 -0.854373 -vn 0.513770 -0.380537 -0.768916 -vn 0.513770 -0.380537 -0.768916 -vn 0.462977 -0.552761 -0.692898 -vn 0.318904 -0.552761 -0.769906 -vn 0.162575 -0.552761 -0.817328 -vn 0.180412 -0.380537 -0.906997 -vn 0.353891 -0.380537 -0.854373 -vn 0.353891 -0.380537 -0.854373 -vn 0.318904 -0.552761 -0.769906 -vn 0.162575 -0.552761 -0.817328 -vn -0.000001 -0.552761 -0.833340 -vn -0.000001 -0.380537 -0.924766 -vn 0.180412 -0.380537 -0.906997 -vn 0.180412 -0.380537 -0.906997 -vn 0.162575 -0.552761 -0.817328 -vn -0.000001 -0.552761 -0.833340 -vn -0.138542 -0.704059 -0.696496 -vn -0.162576 -0.552761 -0.817327 -vn -0.000001 -0.552761 -0.833340 -vn -0.000001 -0.552761 -0.833340 -vn -0.000000 -0.704059 -0.710141 -vn -0.138542 -0.704059 -0.696496 -vn -0.271759 -0.704059 -0.656085 -vn -0.318905 -0.552761 -0.769906 -vn -0.162576 -0.552761 -0.817327 -vn -0.162576 -0.552761 -0.817327 -vn -0.138542 -0.704059 -0.696496 -vn -0.271759 -0.704059 -0.656085 -vn -0.394533 -0.704059 -0.590461 -vn -0.462979 -0.552761 -0.692897 -vn -0.318905 -0.552761 -0.769906 -vn -0.318905 -0.552761 -0.769906 -vn -0.271759 -0.704059 -0.656085 -vn -0.394533 -0.704059 -0.590461 -vn -0.502146 -0.704059 -0.502146 -vn -0.589260 -0.552761 -0.589260 -vn -0.462979 -0.552761 -0.692897 -vn -0.462979 -0.552761 -0.692897 -vn -0.394533 -0.704059 -0.590461 -vn -0.502146 -0.704059 -0.502146 -vn -0.590461 -0.704059 -0.394533 -vn -0.692897 -0.552761 -0.462979 -vn -0.589260 -0.552761 -0.589260 -vn -0.589260 -0.552761 -0.589260 -vn -0.502146 -0.704059 -0.502146 -vn -0.590461 -0.704059 -0.394533 -vn -0.656085 -0.704059 -0.271759 -vn -0.769906 -0.552761 -0.318905 -vn -0.692897 -0.552761 -0.462979 -vn -0.692897 -0.552761 -0.462979 -vn -0.590461 -0.704059 -0.394533 -vn -0.656085 -0.704059 -0.271759 -vn -0.696496 -0.704059 -0.138541 -vn -0.817327 -0.552761 -0.162576 -vn -0.769906 -0.552761 -0.318905 -vn -0.769906 -0.552761 -0.318905 -vn -0.656085 -0.704059 -0.271759 -vn -0.696496 -0.704059 -0.138541 -vn -0.710141 -0.704059 0.000000 -vn -0.833340 -0.552761 0.000000 -vn -0.817327 -0.552761 -0.162576 -vn -0.817327 -0.552761 -0.162576 -vn -0.696496 -0.704059 -0.138541 -vn -0.710141 -0.704059 0.000000 -vn -0.696496 -0.704059 0.138542 -vn -0.817327 -0.552761 0.162577 -vn -0.833340 -0.552761 0.000000 -vn -0.833340 -0.552761 0.000000 -vn -0.710141 -0.704059 0.000000 -vn -0.696496 -0.704059 0.138542 -vn -0.656085 -0.704059 0.271760 -vn -0.769905 -0.552761 0.318906 -vn -0.817327 -0.552761 0.162577 -vn -0.817327 -0.552761 0.162577 -vn -0.696496 -0.704059 0.138542 -vn -0.656085 -0.704059 0.271760 -vn -0.590461 -0.704059 0.394534 -vn -0.692896 -0.552761 0.462979 -vn -0.769905 -0.552761 0.318906 -vn -0.769905 -0.552761 0.318906 -vn -0.656085 -0.704059 0.271760 -vn -0.590461 -0.704059 0.394534 -vn -0.502146 -0.704059 0.502146 -vn -0.589260 -0.552761 0.589260 -vn -0.692896 -0.552761 0.462979 -vn -0.692896 -0.552761 0.462979 -vn -0.590461 -0.704059 0.394534 -vn -0.502146 -0.704059 0.502146 -vn -0.394533 -0.704059 0.590461 -vn -0.462978 -0.552761 0.692897 -vn -0.589260 -0.552761 0.589260 -vn -0.589260 -0.552761 0.589260 -vn -0.502146 -0.704059 0.502146 -vn -0.394533 -0.704059 0.590461 -vn -0.271759 -0.704059 0.656085 -vn -0.318905 -0.552761 0.769906 -vn -0.462978 -0.552761 0.692897 -vn -0.462978 -0.552761 0.692897 -vn -0.394533 -0.704059 0.590461 -vn -0.271759 -0.704059 0.656085 -vn -0.138541 -0.704059 0.696496 -vn -0.162576 -0.552761 0.817327 -vn -0.318905 -0.552761 0.769906 -vn -0.318905 -0.552761 0.769906 -vn -0.271759 -0.704059 0.656085 -vn -0.138541 -0.704059 0.696496 -vn 0.000001 -0.704059 0.710142 -vn 0.000001 -0.552761 0.833340 -vn -0.162576 -0.552761 0.817327 -vn -0.162576 -0.552761 0.817327 -vn -0.138541 -0.704059 0.696496 -vn 0.000001 -0.704059 0.710142 -vn 0.138542 -0.704059 0.696496 -vn 0.162577 -0.552761 0.817327 -vn 0.000001 -0.552761 0.833340 -vn 0.000001 -0.552761 0.833340 -vn 0.000001 -0.704059 0.710142 -vn 0.138542 -0.704059 0.696496 -vn 0.271760 -0.704059 0.656085 -vn 0.318906 -0.552761 0.769905 -vn 0.162577 -0.552761 0.817327 -vn 0.162577 -0.552761 0.817327 -vn 0.138542 -0.704059 0.696496 -vn 0.271760 -0.704059 0.656085 -vn 0.394534 -0.704059 0.590461 -vn 0.462979 -0.552761 0.692896 -vn 0.318906 -0.552761 0.769905 -vn 0.318906 -0.552761 0.769905 -vn 0.271760 -0.704059 0.656085 -vn 0.394534 -0.704059 0.590461 -vn 0.502146 -0.704059 0.502145 -vn 0.589261 -0.552761 0.589259 -vn 0.462979 -0.552761 0.692896 -vn 0.462979 -0.552761 0.692896 -vn 0.394534 -0.704059 0.590461 -vn 0.502146 -0.704059 0.502145 -vn 0.590462 -0.704059 0.394533 -vn 0.692897 -0.552761 0.462978 -vn 0.589261 -0.552761 0.589259 -vn 0.589261 -0.552761 0.589259 -vn 0.502146 -0.704059 0.502145 -vn 0.590462 -0.704059 0.394533 -vn 0.656086 -0.704059 0.271758 -vn 0.769906 -0.552761 0.318904 -vn 0.692897 -0.552761 0.462978 -vn 0.692897 -0.552761 0.462978 -vn 0.590462 -0.704059 0.394533 -vn 0.656086 -0.704059 0.271758 -vn 0.696496 -0.704059 0.138541 -vn 0.817327 -0.552761 0.162576 -vn 0.769906 -0.552761 0.318904 -vn 0.769906 -0.552761 0.318904 -vn 0.656086 -0.704059 0.271758 -vn 0.696496 -0.704059 0.138541 -vn 0.710141 -0.704059 -0.000001 -vn 0.833340 -0.552761 -0.000001 -vn 0.817327 -0.552761 0.162576 -vn 0.817327 -0.552761 0.162576 -vn 0.696496 -0.704059 0.138541 -vn 0.710141 -0.704059 -0.000001 -vn 0.696496 -0.704059 -0.138543 -vn 0.817327 -0.552761 -0.162578 -vn 0.833340 -0.552761 -0.000001 -vn 0.833340 -0.552761 -0.000001 -vn 0.710141 -0.704059 -0.000001 -vn 0.696496 -0.704059 -0.138543 -vn 0.656085 -0.704059 -0.271761 -vn 0.769905 -0.552761 -0.318907 -vn 0.817327 -0.552761 -0.162578 -vn 0.817327 -0.552761 -0.162578 -vn 0.696496 -0.704059 -0.138543 -vn 0.656085 -0.704059 -0.271761 -vn 0.590460 -0.704059 -0.394535 -vn 0.692896 -0.552761 -0.462980 -vn 0.769905 -0.552761 -0.318907 -vn 0.769905 -0.552761 -0.318907 -vn 0.656085 -0.704059 -0.271761 -vn 0.590460 -0.704059 -0.394535 -vn 0.502145 -0.704059 -0.502147 -vn 0.589259 -0.552761 -0.589261 -vn 0.692896 -0.552761 -0.462980 -vn 0.692896 -0.552761 -0.462980 -vn 0.590460 -0.704059 -0.394535 -vn 0.502145 -0.704059 -0.502147 -vn 0.394532 -0.704059 -0.590462 -vn 0.462977 -0.552761 -0.692898 -vn 0.589259 -0.552761 -0.589261 -vn 0.589259 -0.552761 -0.589261 -vn 0.502145 -0.704059 -0.502147 -vn 0.394532 -0.704059 -0.590462 -vn 0.271758 -0.704059 -0.656086 -vn 0.318904 -0.552761 -0.769906 -vn 0.462977 -0.552761 -0.692898 -vn 0.462977 -0.552761 -0.692898 -vn 0.394532 -0.704059 -0.590462 -vn 0.271758 -0.704059 -0.656086 -vn 0.138541 -0.704059 -0.696497 -vn 0.162575 -0.552761 -0.817328 -vn 0.318904 -0.552761 -0.769906 -vn 0.318904 -0.552761 -0.769906 -vn 0.271758 -0.704059 -0.656086 -vn 0.138541 -0.704059 -0.696497 -vn -0.000000 -0.704059 -0.710141 -vn -0.000001 -0.552761 -0.833340 -vn 0.162575 -0.552761 -0.817328 -vn 0.162575 -0.552761 -0.817328 -vn 0.138541 -0.704059 -0.696497 -vn -0.000000 -0.704059 -0.710141 -vn -0.109207 -0.828645 -0.549019 -vn -0.138542 -0.704059 -0.696496 -vn -0.000000 -0.704059 -0.710141 -vn -0.000000 -0.704059 -0.710141 -vn -0.000000 -0.828645 -0.559775 -vn -0.109207 -0.828645 -0.549019 -vn -0.214217 -0.828645 -0.517165 -vn -0.271759 -0.704059 -0.656085 -vn -0.138542 -0.704059 -0.696496 -vn -0.138542 -0.704059 -0.696496 -vn -0.109207 -0.828645 -0.549019 -vn -0.214217 -0.828645 -0.517165 -vn -0.310994 -0.828645 -0.465436 -vn -0.394533 -0.704059 -0.590461 -vn -0.271759 -0.704059 -0.656085 -vn -0.271759 -0.704059 -0.656085 -vn -0.214217 -0.828645 -0.517165 -vn -0.310994 -0.828645 -0.465436 -vn -0.395821 -0.828645 -0.395821 -vn -0.502146 -0.704059 -0.502146 -vn -0.394533 -0.704059 -0.590461 -vn -0.394533 -0.704059 -0.590461 -vn -0.310994 -0.828645 -0.465436 -vn -0.395821 -0.828645 -0.395821 -vn -0.465436 -0.828645 -0.310994 -vn -0.590461 -0.704059 -0.394533 -vn -0.502146 -0.704059 -0.502146 -vn -0.502146 -0.704059 -0.502146 -vn -0.395821 -0.828645 -0.395821 -vn -0.465436 -0.828645 -0.310994 -vn -0.517165 -0.828645 -0.214216 -vn -0.656085 -0.704059 -0.271759 -vn -0.590461 -0.704059 -0.394533 -vn -0.590461 -0.704059 -0.394533 -vn -0.465436 -0.828645 -0.310994 -vn -0.517165 -0.828645 -0.214216 -vn -0.549019 -0.828645 -0.109206 -vn -0.696496 -0.704059 -0.138541 -vn -0.656085 -0.704059 -0.271759 -vn -0.656085 -0.704059 -0.271759 -vn -0.517165 -0.828645 -0.214216 -vn -0.549019 -0.828645 -0.109206 -vn -0.559775 -0.828645 0.000000 -vn -0.710141 -0.704059 0.000000 -vn -0.696496 -0.704059 -0.138541 -vn -0.696496 -0.704059 -0.138541 -vn -0.549019 -0.828645 -0.109206 -vn -0.559775 -0.828645 0.000000 -vn -0.549019 -0.828645 0.109207 -vn -0.696496 -0.704059 0.138542 -vn -0.710141 -0.704059 0.000000 -vn -0.710141 -0.704059 0.000000 -vn -0.559775 -0.828645 0.000000 -vn -0.549019 -0.828645 0.109207 -vn -0.517165 -0.828645 0.214217 -vn -0.656085 -0.704059 0.271760 -vn -0.696496 -0.704059 0.138542 -vn -0.696496 -0.704059 0.138542 -vn -0.549019 -0.828645 0.109207 -vn -0.517165 -0.828645 0.214217 -vn -0.465436 -0.828645 0.310995 -vn -0.590461 -0.704059 0.394534 -vn -0.656085 -0.704059 0.271760 -vn -0.656085 -0.704059 0.271760 -vn -0.517165 -0.828645 0.214217 -vn -0.465436 -0.828645 0.310995 -vn -0.395820 -0.828645 0.395821 -vn -0.502146 -0.704059 0.502146 -vn -0.590461 -0.704059 0.394534 -vn -0.590461 -0.704059 0.394534 -vn -0.465436 -0.828645 0.310995 -vn -0.395820 -0.828645 0.395821 -vn -0.310994 -0.828645 0.465436 -vn -0.394533 -0.704059 0.590461 -vn -0.502146 -0.704059 0.502146 -vn -0.502146 -0.704059 0.502146 -vn -0.395820 -0.828645 0.395821 -vn -0.310994 -0.828645 0.465436 -vn -0.214216 -0.828645 0.517165 -vn -0.271759 -0.704059 0.656085 -vn -0.394533 -0.704059 0.590461 -vn -0.394533 -0.704059 0.590461 -vn -0.310994 -0.828645 0.465436 -vn -0.214216 -0.828645 0.517165 -vn -0.109206 -0.828645 0.549019 -vn -0.138541 -0.704059 0.696496 -vn -0.271759 -0.704059 0.656085 -vn -0.271759 -0.704059 0.656085 -vn -0.214216 -0.828645 0.517165 -vn -0.109206 -0.828645 0.549019 -vn 0.000001 -0.828645 0.559775 -vn 0.000001 -0.704059 0.710142 -vn -0.138541 -0.704059 0.696496 -vn -0.138541 -0.704059 0.696496 -vn -0.109206 -0.828645 0.549019 -vn 0.000001 -0.828645 0.559775 -vn 0.109207 -0.828645 0.549019 -vn 0.138542 -0.704059 0.696496 -vn 0.000001 -0.704059 0.710142 -vn 0.000001 -0.704059 0.710142 -vn 0.000001 -0.828645 0.559775 -vn 0.109207 -0.828645 0.549019 -vn 0.214217 -0.828645 0.517164 -vn 0.271760 -0.704059 0.656085 -vn 0.138542 -0.704059 0.696496 -vn 0.138542 -0.704059 0.696496 -vn 0.109207 -0.828645 0.549019 -vn 0.214217 -0.828645 0.517164 -vn 0.310995 -0.828645 0.465436 -vn 0.394534 -0.704059 0.590461 -vn 0.271760 -0.704059 0.656085 -vn 0.271760 -0.704059 0.656085 -vn 0.214217 -0.828645 0.517164 -vn 0.310995 -0.828645 0.465436 -vn 0.395821 -0.828645 0.395820 -vn 0.502146 -0.704059 0.502145 -vn 0.394534 -0.704059 0.590461 -vn 0.394534 -0.704059 0.590461 -vn 0.310995 -0.828645 0.465436 -vn 0.395821 -0.828645 0.395820 -vn 0.465436 -0.828645 0.310994 -vn 0.590462 -0.704059 0.394533 -vn 0.502146 -0.704059 0.502145 -vn 0.502146 -0.704059 0.502145 -vn 0.395821 -0.828645 0.395820 -vn 0.465436 -0.828645 0.310994 -vn 0.517165 -0.828645 0.214216 -vn 0.656086 -0.704059 0.271758 -vn 0.590462 -0.704059 0.394533 -vn 0.590462 -0.704059 0.394533 -vn 0.465436 -0.828645 0.310994 -vn 0.517165 -0.828645 0.214216 -vn 0.549019 -0.828645 0.109206 -vn 0.696496 -0.704059 0.138541 -vn 0.656086 -0.704059 0.271758 -vn 0.656086 -0.704059 0.271758 -vn 0.517165 -0.828645 0.214216 -vn 0.549019 -0.828645 0.109206 -vn 0.559775 -0.828645 -0.000001 -vn 0.710141 -0.704059 -0.000001 -vn 0.696496 -0.704059 0.138541 -vn 0.696496 -0.704059 0.138541 -vn 0.549019 -0.828645 0.109206 -vn 0.559775 -0.828645 -0.000001 -vn 0.549019 -0.828645 -0.109208 -vn 0.696496 -0.704059 -0.138543 -vn 0.710141 -0.704059 -0.000001 -vn 0.710141 -0.704059 -0.000001 -vn 0.559775 -0.828645 -0.000001 -vn 0.549019 -0.828645 -0.109208 -vn 0.517164 -0.828645 -0.214218 -vn 0.656085 -0.704059 -0.271761 -vn 0.696496 -0.704059 -0.138543 -vn 0.696496 -0.704059 -0.138543 -vn 0.549019 -0.828645 -0.109208 -vn 0.517164 -0.828645 -0.214218 -vn 0.465435 -0.828645 -0.310995 -vn 0.590460 -0.704059 -0.394535 -vn 0.656085 -0.704059 -0.271761 -vn 0.656085 -0.704059 -0.271761 -vn 0.517164 -0.828645 -0.214218 -vn 0.465435 -0.828645 -0.310995 -vn 0.395820 -0.828645 -0.395821 -vn 0.502145 -0.704059 -0.502147 -vn 0.590460 -0.704059 -0.394535 -vn 0.590460 -0.704059 -0.394535 -vn 0.465435 -0.828645 -0.310995 -vn 0.395820 -0.828645 -0.395821 -vn 0.310994 -0.828645 -0.465436 -vn 0.394532 -0.704059 -0.590462 -vn 0.502145 -0.704059 -0.502147 -vn 0.502145 -0.704059 -0.502147 -vn 0.395820 -0.828645 -0.395821 -vn 0.310994 -0.828645 -0.465436 -vn 0.214215 -0.828645 -0.517165 -vn 0.271758 -0.704059 -0.656086 -vn 0.394532 -0.704059 -0.590462 -vn 0.394532 -0.704059 -0.590462 -vn 0.310994 -0.828645 -0.465436 -vn 0.214215 -0.828645 -0.517165 -vn 0.109206 -0.828645 -0.549019 -vn 0.138541 -0.704059 -0.696497 -vn 0.271758 -0.704059 -0.656086 -vn 0.271758 -0.704059 -0.656086 -vn 0.214215 -0.828645 -0.517165 -vn 0.109206 -0.828645 -0.549019 -vn -0.000000 -0.828645 -0.559775 -vn -0.000000 -0.704059 -0.710141 -vn 0.138541 -0.704059 -0.696497 -vn 0.138541 -0.704059 -0.696497 -vn 0.109206 -0.828645 -0.549019 -vn -0.000000 -0.828645 -0.559775 -vn -0.075673 -0.921707 -0.380434 -vn -0.109207 -0.828645 -0.549019 -vn -0.000000 -0.828645 -0.559775 -vn -0.000000 -0.828645 -0.559775 -vn -0.000000 -0.921707 -0.387887 -vn -0.075673 -0.921707 -0.380434 -vn -0.148438 -0.921707 -0.358361 -vn -0.214217 -0.828645 -0.517165 -vn -0.109207 -0.828645 -0.549019 -vn -0.109207 -0.828645 -0.549019 -vn -0.075673 -0.921707 -0.380434 -vn -0.148438 -0.921707 -0.358361 -vn -0.215498 -0.921707 -0.322516 -vn -0.310994 -0.828645 -0.465436 -vn -0.214217 -0.828645 -0.517165 -vn -0.214217 -0.828645 -0.517165 -vn -0.148438 -0.921707 -0.358361 -vn -0.215498 -0.921707 -0.322516 -vn -0.274278 -0.921707 -0.274277 -vn -0.395821 -0.828645 -0.395821 -vn -0.310994 -0.828645 -0.465436 -vn -0.310994 -0.828645 -0.465436 -vn -0.215498 -0.921707 -0.322516 -vn -0.274278 -0.921707 -0.274277 -vn -0.322516 -0.921707 -0.215498 -vn -0.465436 -0.828645 -0.310994 -vn -0.395821 -0.828645 -0.395821 -vn -0.395821 -0.828645 -0.395821 -vn -0.274278 -0.921707 -0.274277 -vn -0.322516 -0.921707 -0.215498 -vn -0.358361 -0.921707 -0.148438 -vn -0.517165 -0.828645 -0.214216 -vn -0.465436 -0.828645 -0.310994 -vn -0.465436 -0.828645 -0.310994 -vn -0.322516 -0.921707 -0.215498 -vn -0.358361 -0.921707 -0.148438 -vn -0.380434 -0.921707 -0.075673 -vn -0.549019 -0.828645 -0.109206 -vn -0.517165 -0.828645 -0.214216 -vn -0.517165 -0.828645 -0.214216 -vn -0.358361 -0.921707 -0.148438 -vn -0.380434 -0.921707 -0.075673 -vn -0.387887 -0.921707 0.000000 -vn -0.559775 -0.828645 0.000000 -vn -0.549019 -0.828645 -0.109206 -vn -0.549019 -0.828645 -0.109206 -vn -0.380434 -0.921707 -0.075673 -vn -0.387887 -0.921707 0.000000 -vn -0.380434 -0.921707 0.075673 -vn -0.549019 -0.828645 0.109207 -vn -0.559775 -0.828645 0.000000 -vn -0.559775 -0.828645 0.000000 -vn -0.387887 -0.921707 0.000000 -vn -0.380434 -0.921707 0.075673 -vn -0.358361 -0.921707 0.148438 -vn -0.517165 -0.828645 0.214217 -vn -0.549019 -0.828645 0.109207 -vn -0.549019 -0.828645 0.109207 -vn -0.380434 -0.921707 0.075673 -vn -0.358361 -0.921707 0.148438 -vn -0.322516 -0.921707 0.215499 -vn -0.465436 -0.828645 0.310995 -vn -0.517165 -0.828645 0.214217 -vn -0.517165 -0.828645 0.214217 -vn -0.358361 -0.921707 0.148438 -vn -0.322516 -0.921707 0.215499 -vn -0.274277 -0.921707 0.274278 -vn -0.395820 -0.828645 0.395821 -vn -0.465436 -0.828645 0.310995 -vn -0.465436 -0.828645 0.310995 -vn -0.322516 -0.921707 0.215499 -vn -0.274277 -0.921707 0.274278 -vn -0.215498 -0.921707 0.322516 -vn -0.310994 -0.828645 0.465436 -vn -0.395820 -0.828645 0.395821 -vn -0.395820 -0.828645 0.395821 -vn -0.274277 -0.921707 0.274278 -vn -0.215498 -0.921707 0.322516 -vn -0.148438 -0.921707 0.358361 -vn -0.214216 -0.828645 0.517165 -vn -0.310994 -0.828645 0.465436 -vn -0.310994 -0.828645 0.465436 -vn -0.215498 -0.921707 0.322516 -vn -0.148438 -0.921707 0.358361 -vn -0.075673 -0.921707 0.380434 -vn -0.109206 -0.828645 0.549019 -vn -0.214216 -0.828645 0.517165 -vn -0.214216 -0.828645 0.517165 -vn -0.148438 -0.921707 0.358361 -vn -0.075673 -0.921707 0.380434 -vn 0.000000 -0.921707 0.387887 -vn 0.000001 -0.828645 0.559775 -vn -0.109206 -0.828645 0.549019 -vn -0.109206 -0.828645 0.549019 -vn -0.075673 -0.921707 0.380434 -vn 0.000000 -0.921707 0.387887 -vn 0.075673 -0.921707 0.380434 -vn 0.109207 -0.828645 0.549019 -vn 0.000001 -0.828645 0.559775 -vn 0.000001 -0.828645 0.559775 -vn 0.000000 -0.921707 0.387887 -vn 0.075673 -0.921707 0.380434 -vn 0.148438 -0.921707 0.358361 -vn 0.214217 -0.828645 0.517164 -vn 0.109207 -0.828645 0.549019 -vn 0.109207 -0.828645 0.549019 -vn 0.075673 -0.921707 0.380434 -vn 0.148438 -0.921707 0.358361 -vn 0.215499 -0.921707 0.322516 -vn 0.310995 -0.828645 0.465436 -vn 0.214217 -0.828645 0.517164 -vn 0.214217 -0.828645 0.517164 -vn 0.148438 -0.921707 0.358361 -vn 0.215499 -0.921707 0.322516 -vn 0.274278 -0.921707 0.274277 -vn 0.395821 -0.828645 0.395820 -vn 0.310995 -0.828645 0.465436 -vn 0.310995 -0.828645 0.465436 -vn 0.215499 -0.921707 0.322516 -vn 0.274278 -0.921707 0.274277 -vn 0.322516 -0.921707 0.215498 -vn 0.465436 -0.828645 0.310994 -vn 0.395821 -0.828645 0.395820 -vn 0.395821 -0.828645 0.395820 -vn 0.274278 -0.921707 0.274277 -vn 0.322516 -0.921707 0.215498 -vn 0.358361 -0.921707 0.148437 -vn 0.517165 -0.828645 0.214216 -vn 0.465436 -0.828645 0.310994 -vn 0.465436 -0.828645 0.310994 -vn 0.322516 -0.921707 0.215498 -vn 0.358361 -0.921707 0.148437 -vn 0.380434 -0.921707 0.075672 -vn 0.549019 -0.828645 0.109206 -vn 0.517165 -0.828645 0.214216 -vn 0.517165 -0.828645 0.214216 -vn 0.358361 -0.921707 0.148437 -vn 0.380434 -0.921707 0.075672 -vn 0.387887 -0.921707 -0.000001 -vn 0.559775 -0.828645 -0.000001 -vn 0.549019 -0.828645 0.109206 -vn 0.549019 -0.828645 0.109206 -vn 0.380434 -0.921707 0.075672 -vn 0.387887 -0.921707 -0.000001 -vn 0.380433 -0.921707 -0.075674 -vn 0.549019 -0.828645 -0.109208 -vn 0.559775 -0.828645 -0.000001 -vn 0.559775 -0.828645 -0.000001 -vn 0.387887 -0.921707 -0.000001 -vn 0.380433 -0.921707 -0.075674 -vn 0.358360 -0.921707 -0.148438 -vn 0.517164 -0.828645 -0.214218 -vn 0.549019 -0.828645 -0.109208 -vn 0.549019 -0.828645 -0.109208 -vn 0.380433 -0.921707 -0.075674 -vn 0.358360 -0.921707 -0.148438 -vn 0.322516 -0.921707 -0.215499 -vn 0.465435 -0.828645 -0.310995 -vn 0.517164 -0.828645 -0.214218 -vn 0.517164 -0.828645 -0.214218 -vn 0.358360 -0.921707 -0.148438 -vn 0.322516 -0.921707 -0.215499 -vn 0.274277 -0.921707 -0.274278 -vn 0.395820 -0.828645 -0.395821 -vn 0.465435 -0.828645 -0.310995 -vn 0.465435 -0.828645 -0.310995 -vn 0.322516 -0.921707 -0.215499 -vn 0.274277 -0.921707 -0.274278 -vn 0.215498 -0.921707 -0.322516 -vn 0.310994 -0.828645 -0.465436 -vn 0.395820 -0.828645 -0.395821 -vn 0.395820 -0.828645 -0.395821 -vn 0.274277 -0.921707 -0.274278 -vn 0.215498 -0.921707 -0.322516 -vn 0.148437 -0.921707 -0.358361 -vn 0.214215 -0.828645 -0.517165 -vn 0.310994 -0.828645 -0.465436 -vn 0.310994 -0.828645 -0.465436 -vn 0.215498 -0.921707 -0.322516 -vn 0.148437 -0.921707 -0.358361 -vn 0.075672 -0.921707 -0.380434 -vn 0.109206 -0.828645 -0.549019 -vn 0.214215 -0.828645 -0.517165 -vn 0.214215 -0.828645 -0.517165 -vn 0.148437 -0.921707 -0.358361 -vn 0.075672 -0.921707 -0.380434 -vn -0.000000 -0.921707 -0.387887 -vn -0.000000 -0.828645 -0.559775 -vn 0.109206 -0.828645 -0.549019 -vn 0.109206 -0.828645 -0.549019 -vn 0.075672 -0.921707 -0.380434 -vn -0.000000 -0.921707 -0.387887 -vn -0.039207 -0.979598 -0.197107 -vn -0.075673 -0.921707 -0.380434 -vn -0.000000 -0.921707 -0.387887 -vn -0.000000 -0.921707 -0.387887 -vn -0.000000 -0.979598 -0.200969 -vn -0.039207 -0.979598 -0.197107 -vn -0.076907 -0.979598 -0.185671 -vn -0.148438 -0.921707 -0.358361 -vn -0.075673 -0.921707 -0.380434 -vn -0.075673 -0.921707 -0.380434 -vn -0.039207 -0.979598 -0.197107 -vn -0.076907 -0.979598 -0.185671 -vn -0.111652 -0.979598 -0.167099 -vn -0.215498 -0.921707 -0.322516 -vn -0.148438 -0.921707 -0.358361 -vn -0.148438 -0.921707 -0.358361 -vn -0.076907 -0.979598 -0.185671 -vn -0.111652 -0.979598 -0.167099 -vn -0.142106 -0.979598 -0.142106 -vn -0.274278 -0.921707 -0.274277 -vn -0.215498 -0.921707 -0.322516 -vn -0.215498 -0.921707 -0.322516 -vn -0.111652 -0.979598 -0.167099 -vn -0.142106 -0.979598 -0.142106 -vn -0.167099 -0.979598 -0.111652 -vn -0.322516 -0.921707 -0.215498 -vn -0.274278 -0.921707 -0.274277 -vn -0.274278 -0.921707 -0.274277 -vn -0.142106 -0.979598 -0.142106 -vn -0.167099 -0.979598 -0.111652 -vn -0.185671 -0.979598 -0.076907 -vn -0.358361 -0.921707 -0.148438 -vn -0.322516 -0.921707 -0.215498 -vn -0.322516 -0.921707 -0.215498 -vn -0.167099 -0.979598 -0.111652 -vn -0.185671 -0.979598 -0.076907 -vn -0.197107 -0.979598 -0.039207 -vn -0.380434 -0.921707 -0.075673 -vn -0.358361 -0.921707 -0.148438 -vn -0.358361 -0.921707 -0.148438 -vn -0.185671 -0.979598 -0.076907 -vn -0.197107 -0.979598 -0.039207 -vn -0.200969 -0.979598 -0.000000 -vn -0.387887 -0.921707 0.000000 -vn -0.380434 -0.921707 -0.075673 -vn -0.380434 -0.921707 -0.075673 -vn -0.197107 -0.979598 -0.039207 -vn -0.200969 -0.979598 -0.000000 -vn -0.197107 -0.979598 0.039207 -vn -0.380434 -0.921707 0.075673 -vn -0.387887 -0.921707 0.000000 -vn -0.387887 -0.921707 0.000000 -vn -0.200969 -0.979598 -0.000000 -vn -0.197107 -0.979598 0.039207 -vn -0.185671 -0.979598 0.076907 -vn -0.358361 -0.921707 0.148438 -vn -0.380434 -0.921707 0.075673 -vn -0.380434 -0.921707 0.075673 -vn -0.197107 -0.979598 0.039207 -vn -0.185671 -0.979598 0.076907 -vn -0.167099 -0.979598 0.111652 -vn -0.322516 -0.921707 0.215499 -vn -0.358361 -0.921707 0.148438 -vn -0.358361 -0.921707 0.148438 -vn -0.185671 -0.979598 0.076907 -vn -0.167099 -0.979598 0.111652 -vn -0.142106 -0.979598 0.142106 -vn -0.274277 -0.921707 0.274278 -vn -0.322516 -0.921707 0.215499 -vn -0.322516 -0.921707 0.215499 -vn -0.167099 -0.979598 0.111652 -vn -0.142106 -0.979598 0.142106 -vn -0.111652 -0.979598 0.167100 -vn -0.215498 -0.921707 0.322516 -vn -0.274277 -0.921707 0.274278 -vn -0.274277 -0.921707 0.274278 -vn -0.142106 -0.979598 0.142106 -vn -0.111652 -0.979598 0.167100 -vn -0.076907 -0.979598 0.185671 -vn -0.148438 -0.921707 0.358361 -vn -0.215498 -0.921707 0.322516 -vn -0.215498 -0.921707 0.322516 -vn -0.111652 -0.979598 0.167100 -vn -0.076907 -0.979598 0.185671 -vn -0.039207 -0.979598 0.197107 -vn -0.075673 -0.921707 0.380434 -vn -0.148438 -0.921707 0.358361 -vn -0.148438 -0.921707 0.358361 -vn -0.076907 -0.979598 0.185671 -vn -0.039207 -0.979598 0.197107 -vn 0.000000 -0.979598 0.200969 -vn 0.000000 -0.921707 0.387887 -vn -0.075673 -0.921707 0.380434 -vn -0.075673 -0.921707 0.380434 -vn -0.039207 -0.979598 0.197107 -vn 0.000000 -0.979598 0.200969 -vn 0.039207 -0.979598 0.197107 -vn 0.075673 -0.921707 0.380434 -vn 0.000000 -0.921707 0.387887 -vn 0.000000 -0.921707 0.387887 -vn 0.000000 -0.979598 0.200969 -vn 0.039207 -0.979598 0.197107 -vn 0.076908 -0.979598 0.185671 -vn 0.148438 -0.921707 0.358361 -vn 0.075673 -0.921707 0.380434 -vn 0.075673 -0.921707 0.380434 -vn 0.039207 -0.979598 0.197107 -vn 0.076908 -0.979598 0.185671 -vn 0.111653 -0.979598 0.167099 -vn 0.215499 -0.921707 0.322516 -vn 0.148438 -0.921707 0.358361 -vn 0.148438 -0.921707 0.358361 -vn 0.076908 -0.979598 0.185671 -vn 0.111653 -0.979598 0.167099 -vn 0.142106 -0.979598 0.142106 -vn 0.274278 -0.921707 0.274277 -vn 0.215499 -0.921707 0.322516 -vn 0.215499 -0.921707 0.322516 -vn 0.111653 -0.979598 0.167099 -vn 0.142106 -0.979598 0.142106 -vn 0.167099 -0.979598 0.111652 -vn 0.322516 -0.921707 0.215498 -vn 0.274278 -0.921707 0.274277 -vn 0.274278 -0.921707 0.274277 -vn 0.142106 -0.979598 0.142106 -vn 0.167099 -0.979598 0.111652 -vn 0.185671 -0.979598 0.076907 -vn 0.358361 -0.921707 0.148437 -vn 0.322516 -0.921707 0.215498 -vn 0.322516 -0.921707 0.215498 -vn 0.167099 -0.979598 0.111652 -vn 0.185671 -0.979598 0.076907 -vn 0.197107 -0.979598 0.039207 -vn 0.380434 -0.921707 0.075672 -vn 0.358361 -0.921707 0.148437 -vn 0.358361 -0.921707 0.148437 -vn 0.185671 -0.979598 0.076907 -vn 0.197107 -0.979598 0.039207 -vn 0.200969 -0.979598 -0.000000 -vn 0.387887 -0.921707 -0.000001 -vn 0.380434 -0.921707 0.075672 -vn 0.380434 -0.921707 0.075672 -vn 0.197107 -0.979598 0.039207 -vn 0.200969 -0.979598 -0.000000 -vn 0.197107 -0.979598 -0.039207 -vn 0.380433 -0.921707 -0.075674 -vn 0.387887 -0.921707 -0.000001 -vn 0.387887 -0.921707 -0.000001 -vn 0.200969 -0.979598 -0.000000 -vn 0.197107 -0.979598 -0.039207 -vn 0.185671 -0.979598 -0.076908 -vn 0.358360 -0.921707 -0.148438 -vn 0.380433 -0.921707 -0.075674 -vn 0.380433 -0.921707 -0.075674 -vn 0.197107 -0.979598 -0.039207 -vn 0.185671 -0.979598 -0.076908 -vn 0.167099 -0.979598 -0.111652 -vn 0.322516 -0.921707 -0.215499 -vn 0.358360 -0.921707 -0.148438 -vn 0.358360 -0.921707 -0.148438 -vn 0.185671 -0.979598 -0.076908 -vn 0.167099 -0.979598 -0.111652 -vn 0.142106 -0.979598 -0.142106 -vn 0.274277 -0.921707 -0.274278 -vn 0.322516 -0.921707 -0.215499 -vn 0.322516 -0.921707 -0.215499 -vn 0.167099 -0.979598 -0.111652 -vn 0.142106 -0.979598 -0.142106 -vn 0.111652 -0.979598 -0.167100 -vn 0.215498 -0.921707 -0.322516 -vn 0.274277 -0.921707 -0.274278 -vn 0.274277 -0.921707 -0.274278 -vn 0.142106 -0.979598 -0.142106 -vn 0.111652 -0.979598 -0.167100 -vn 0.076907 -0.979598 -0.185671 -vn 0.148437 -0.921707 -0.358361 -vn 0.215498 -0.921707 -0.322516 -vn 0.215498 -0.921707 -0.322516 -vn 0.111652 -0.979598 -0.167100 -vn 0.076907 -0.979598 -0.185671 -vn 0.039207 -0.979598 -0.197107 -vn 0.075672 -0.921707 -0.380434 -vn 0.148437 -0.921707 -0.358361 -vn 0.148437 -0.921707 -0.358361 -vn 0.076907 -0.979598 -0.185671 -vn 0.039207 -0.979598 -0.197107 -vn -0.000000 -0.979598 -0.200969 -vn -0.000000 -0.921707 -0.387887 -vn 0.075672 -0.921707 -0.380434 -vn 0.075672 -0.921707 -0.380434 -vn 0.039207 -0.979598 -0.197107 -vn -0.000000 -0.979598 -0.200969 -vn -0.000000 -1.000000 -0.000000 -vn -0.039207 -0.979598 -0.197107 -vn -0.000000 -0.979598 -0.200969 -vn -0.000000 -1.000000 -0.000000 -vn -0.076907 -0.979598 -0.185671 -vn -0.039207 -0.979598 -0.197107 -vn -0.000000 -1.000000 -0.000000 -vn -0.111652 -0.979598 -0.167099 -vn -0.076907 -0.979598 -0.185671 -vn -0.000000 -1.000000 -0.000000 -vn -0.142106 -0.979598 -0.142106 -vn -0.111652 -0.979598 -0.167099 -vn -0.000000 -1.000000 -0.000000 -vn -0.167099 -0.979598 -0.111652 -vn -0.142106 -0.979598 -0.142106 -vn -0.000000 -1.000000 -0.000000 -vn -0.185671 -0.979598 -0.076907 -vn -0.167099 -0.979598 -0.111652 -vn -0.000000 -1.000000 -0.000000 -vn -0.197107 -0.979598 -0.039207 -vn -0.185671 -0.979598 -0.076907 -vn -0.000000 -1.000000 -0.000000 -vn -0.200969 -0.979598 -0.000000 -vn -0.197107 -0.979598 -0.039207 -vn -0.000000 -1.000000 -0.000000 -vn -0.197107 -0.979598 0.039207 -vn -0.200969 -0.979598 -0.000000 -vn -0.000000 -1.000000 -0.000000 -vn -0.185671 -0.979598 0.076907 -vn -0.197107 -0.979598 0.039207 -vn -0.000000 -1.000000 -0.000000 -vn -0.167099 -0.979598 0.111652 -vn -0.185671 -0.979598 0.076907 -vn -0.000000 -1.000000 -0.000000 -vn -0.142106 -0.979598 0.142106 -vn -0.167099 -0.979598 0.111652 -vn -0.000000 -1.000000 -0.000000 -vn -0.111652 -0.979598 0.167100 -vn -0.142106 -0.979598 0.142106 -vn -0.000000 -1.000000 -0.000000 -vn -0.076907 -0.979598 0.185671 -vn -0.111652 -0.979598 0.167100 -vn -0.000000 -1.000000 -0.000000 -vn -0.039207 -0.979598 0.197107 -vn -0.076907 -0.979598 0.185671 -vn -0.000000 -1.000000 -0.000000 -vn 0.000000 -0.979598 0.200969 -vn -0.039207 -0.979598 0.197107 -vn -0.000000 -1.000000 -0.000000 -vn 0.039207 -0.979598 0.197107 -vn 0.000000 -0.979598 0.200969 -vn -0.000000 -1.000000 -0.000000 -vn 0.076908 -0.979598 0.185671 -vn 0.039207 -0.979598 0.197107 -vn -0.000000 -1.000000 -0.000000 -vn 0.111653 -0.979598 0.167099 -vn 0.076908 -0.979598 0.185671 -vn -0.000000 -1.000000 -0.000000 -vn 0.142106 -0.979598 0.142106 -vn 0.111653 -0.979598 0.167099 -vn -0.000000 -1.000000 -0.000000 -vn 0.167099 -0.979598 0.111652 -vn 0.142106 -0.979598 0.142106 -vn -0.000000 -1.000000 -0.000000 -vn 0.185671 -0.979598 0.076907 -vn 0.167099 -0.979598 0.111652 -vn -0.000000 -1.000000 -0.000000 -vn 0.197107 -0.979598 0.039207 -vn 0.185671 -0.979598 0.076907 -vn -0.000000 -1.000000 -0.000000 -vn 0.200969 -0.979598 -0.000000 -vn 0.197107 -0.979598 0.039207 -vn -0.000000 -1.000000 -0.000000 -vn 0.197107 -0.979598 -0.039207 -vn 0.200969 -0.979598 -0.000000 -vn -0.000000 -1.000000 -0.000000 -vn 0.185671 -0.979598 -0.076908 -vn 0.197107 -0.979598 -0.039207 -vn -0.000000 -1.000000 -0.000000 -vn 0.167099 -0.979598 -0.111652 -vn 0.185671 -0.979598 -0.076908 -vn -0.000000 -1.000000 -0.000000 -vn 0.142106 -0.979598 -0.142106 -vn 0.167099 -0.979598 -0.111652 -vn -0.000000 -1.000000 -0.000000 -vn 0.111652 -0.979598 -0.167100 -vn 0.142106 -0.979598 -0.142106 -vn -0.000000 -1.000000 -0.000000 -vn 0.076907 -0.979598 -0.185671 -vn 0.111652 -0.979598 -0.167100 -vn -0.000000 -1.000000 -0.000000 -vn 0.039207 -0.979598 -0.197107 -vn 0.076907 -0.979598 -0.185671 -vn -0.000000 -1.000000 -0.000000 -vn -0.000000 -0.979598 -0.200969 -vn 0.039207 -0.979598 -0.197107 -vn 0.889663 0.456618 -0.000000 -vn 0.859348 0.456618 -0.230262 -vn 0.859348 0.456618 -0.230262 -vn 0.859348 0.456618 -0.230262 -vn 0.889663 0.456618 0.000000 -vn 0.889663 0.456618 -0.000000 -vn 0.859348 0.456618 -0.230262 -vn 0.770470 0.456619 -0.444831 -vn 0.770470 0.456618 -0.444831 -vn 0.770470 0.456618 -0.444831 -vn 0.859348 0.456618 -0.230262 -vn 0.859348 0.456618 -0.230262 -vn 0.770470 0.456619 -0.444831 -vn 0.629086 0.456619 -0.629086 -vn 0.629087 0.456618 -0.629086 -vn 0.629087 0.456618 -0.629086 -vn 0.770470 0.456618 -0.444831 -vn 0.770470 0.456619 -0.444831 -vn 0.629086 0.456619 -0.629086 -vn 0.444831 0.456619 -0.770471 -vn 0.444831 0.456618 -0.770471 -vn 0.444831 0.456618 -0.770471 -vn 0.629087 0.456618 -0.629086 -vn 0.629086 0.456619 -0.629086 -vn 0.444831 0.456619 -0.770471 -vn 0.230262 0.456618 -0.859348 -vn 0.230262 0.456618 -0.859348 -vn 0.230262 0.456618 -0.859348 -vn 0.444831 0.456618 -0.770471 -vn 0.444831 0.456619 -0.770471 -vn 0.230262 0.456618 -0.859348 -vn 0.000000 0.456618 -0.889663 -vn 0.000000 0.456618 -0.889663 -vn 0.000000 0.456618 -0.889663 -vn 0.230262 0.456618 -0.859348 -vn 0.230262 0.456618 -0.859348 -vn 0.000000 0.456618 -0.889663 -vn -0.230261 0.456618 -0.859348 -vn -0.230262 0.456618 -0.859348 -vn -0.230262 0.456618 -0.859348 -vn 0.000000 0.456618 -0.889663 -vn 0.000000 0.456618 -0.889663 -vn -0.230261 0.456618 -0.859348 -vn -0.444831 0.456618 -0.770470 -vn -0.444831 0.456618 -0.770471 -vn -0.444831 0.456618 -0.770471 -vn -0.230262 0.456618 -0.859348 -vn -0.230261 0.456618 -0.859348 -vn -0.444831 0.456618 -0.770470 -vn -0.629086 0.456618 -0.629086 -vn -0.629086 0.456618 -0.629087 -vn -0.629086 0.456618 -0.629087 -vn -0.444831 0.456618 -0.770471 -vn -0.444831 0.456618 -0.770470 -vn -0.629086 0.456618 -0.629086 -vn -0.770470 0.456618 -0.444832 -vn -0.770470 0.456618 -0.444832 -vn -0.770470 0.456618 -0.444832 -vn -0.629086 0.456618 -0.629087 -vn -0.629086 0.456618 -0.629086 -vn -0.770470 0.456618 -0.444832 -vn -0.859348 0.456618 -0.230262 -vn -0.859348 0.456618 -0.230262 -vn -0.859348 0.456618 -0.230262 -vn -0.770470 0.456618 -0.444832 -vn -0.770470 0.456618 -0.444832 -vn -0.859348 0.456618 -0.230262 -vn -0.889663 0.456618 -0.000000 -vn -0.889663 0.456618 -0.000000 -vn -0.889663 0.456618 -0.000000 -vn -0.859348 0.456618 -0.230262 -vn -0.859348 0.456618 -0.230262 -vn -0.889663 0.456618 -0.000000 -vn -0.859348 0.456618 0.230261 -vn -0.859348 0.456618 0.230261 -vn -0.859348 0.456618 0.230261 -vn -0.889663 0.456618 -0.000000 -vn -0.889663 0.456618 -0.000000 -vn -0.859348 0.456618 0.230261 -vn -0.770471 0.456618 0.444831 -vn -0.770471 0.456618 0.444831 -vn -0.770471 0.456618 0.444831 -vn -0.859348 0.456618 0.230261 -vn -0.859348 0.456618 0.230261 -vn -0.770471 0.456618 0.444831 -vn -0.629087 0.456618 0.629086 -vn -0.629087 0.456618 0.629086 -vn -0.629087 0.456618 0.629086 -vn -0.770471 0.456618 0.444831 -vn -0.770471 0.456618 0.444831 -vn -0.629087 0.456618 0.629086 -vn -0.444832 0.456618 0.770470 -vn -0.444832 0.456618 0.770470 -vn -0.444832 0.456618 0.770470 -vn -0.629087 0.456618 0.629086 -vn -0.629087 0.456618 0.629086 -vn -0.444832 0.456618 0.770470 -vn -0.230262 0.456618 0.859348 -vn -0.230262 0.456618 0.859348 -vn -0.230262 0.456618 0.859348 -vn -0.444832 0.456618 0.770470 -vn -0.444832 0.456618 0.770470 -vn -0.230262 0.456618 0.859348 -vn -0.000001 0.456619 0.889663 -vn -0.000000 0.456618 0.889663 -vn -0.000000 0.456618 0.889663 -vn -0.230262 0.456618 0.859348 -vn -0.230262 0.456618 0.859348 -vn -0.000001 0.456619 0.889663 -vn 0.230261 0.456618 0.859348 -vn 0.230261 0.456618 0.859348 -vn 0.230261 0.456618 0.859348 -vn -0.000000 0.456618 0.889663 -vn -0.000001 0.456619 0.889663 -vn 0.230261 0.456618 0.859348 -vn 0.444831 0.456619 0.770471 -vn 0.444831 0.456618 0.770471 -vn 0.444831 0.456618 0.770471 -vn 0.230261 0.456618 0.859348 -vn 0.230261 0.456618 0.859348 -vn 0.444831 0.456619 0.770471 -vn 0.629086 0.456618 0.629087 -vn 0.629086 0.456618 0.629087 -vn 0.629086 0.456618 0.629087 -vn 0.444831 0.456618 0.770471 -vn 0.444831 0.456619 0.770471 -vn 0.629086 0.456618 0.629087 -vn 0.770470 0.456618 0.444832 -vn 0.770470 0.456618 0.444832 -vn 0.770470 0.456618 0.444832 -vn 0.629086 0.456618 0.629087 -vn 0.629086 0.456618 0.629087 -vn 0.770470 0.456618 0.444832 -vn 0.859348 0.456619 0.230262 -vn 0.859348 0.456618 0.230262 -vn 0.859348 0.456618 0.230262 -vn 0.770470 0.456618 0.444832 -vn 0.770470 0.456618 0.444832 -vn 0.859348 0.456619 0.230262 -vn 0.889663 0.456618 -0.000000 -vn 0.889663 0.456618 0.000000 -vn 0.889663 0.456618 0.000000 -vn 0.859348 0.456618 0.230262 -vn 0.859348 0.456619 0.230262 -vn 0.889663 0.456618 0.000000 -vn 0.859348 0.456618 -0.230262 -vn 0.859348 0.456618 -0.230261 -vn 0.859348 0.456618 -0.230261 -vn 0.889663 0.456618 0.000000 -vn 0.889663 0.456618 0.000000 -vn 0.859348 0.456618 -0.230262 -vn 0.770470 0.456618 -0.444831 -vn 0.770470 0.456618 -0.444832 -vn 0.770470 0.456618 -0.444832 -vn 0.859348 0.456618 -0.230261 -vn 0.859348 0.456618 -0.230262 -vn 0.770470 0.456618 -0.444831 -vn 0.629087 0.456618 -0.629086 -vn 0.629086 0.456618 -0.629087 -vn 0.629086 0.456618 -0.629087 -vn 0.770470 0.456618 -0.444832 -vn 0.770470 0.456618 -0.444831 -vn 0.629087 0.456618 -0.629086 -vn 0.444831 0.456618 -0.770471 -vn 0.444831 0.456618 -0.770471 -vn 0.444831 0.456618 -0.770471 -vn 0.629086 0.456618 -0.629087 -vn 0.629087 0.456618 -0.629086 -vn 0.444831 0.456618 -0.770471 -vn 0.230262 0.456618 -0.859348 -vn 0.230262 0.456618 -0.859348 -vn 0.230262 0.456618 -0.859348 -vn 0.444831 0.456618 -0.770471 -vn 0.444831 0.456618 -0.770471 -vn 0.230262 0.456618 -0.859348 -vn 0.000000 0.456618 -0.889663 -vn 0.000000 0.456618 -0.889663 -vn 0.000000 0.456618 -0.889663 -vn 0.230262 0.456618 -0.859348 -vn 0.230262 0.456618 -0.859348 -vn 0.000000 0.456618 -0.889663 -vn -0.230262 0.456618 -0.859348 -vn -0.230261 0.456618 -0.859348 -vn -0.230261 0.456618 -0.859348 -vn 0.000000 0.456618 -0.889663 -vn 0.000000 0.456618 -0.889663 -vn -0.230262 0.456618 -0.859348 -vn -0.444831 0.456618 -0.770471 -vn -0.444831 0.456618 -0.770471 -vn -0.444831 0.456618 -0.770471 -vn -0.230261 0.456618 -0.859348 -vn -0.230262 0.456618 -0.859348 -vn -0.444831 0.456618 -0.770471 -vn -0.629086 0.456618 -0.629087 -vn -0.629086 0.456618 -0.629087 -vn -0.629086 0.456618 -0.629087 -vn -0.444831 0.456618 -0.770471 -vn -0.444831 0.456618 -0.770471 -vn -0.629086 0.456618 -0.629087 -vn -0.770470 0.456618 -0.444832 -vn -0.770470 0.456618 -0.444832 -vn -0.770470 0.456618 -0.444832 -vn -0.629086 0.456618 -0.629087 -vn -0.629086 0.456618 -0.629087 -vn -0.770470 0.456618 -0.444832 -vn -0.859348 0.456618 -0.230262 -vn -0.859348 0.456618 -0.230262 -vn -0.859348 0.456618 -0.230262 -vn -0.770470 0.456618 -0.444832 -vn -0.770470 0.456618 -0.444832 -vn -0.859348 0.456618 -0.230262 -vn -0.889663 0.456618 -0.000000 -vn -0.889663 0.456618 -0.000000 -vn -0.889663 0.456618 -0.000000 -vn -0.859348 0.456618 -0.230262 -vn -0.859348 0.456618 -0.230262 -vn -0.889663 0.456618 -0.000000 -vn -0.859348 0.456618 0.230261 -vn -0.859348 0.456618 0.230261 -vn -0.859348 0.456618 0.230261 -vn -0.889663 0.456618 -0.000000 -vn -0.889663 0.456618 -0.000000 -vn -0.859348 0.456618 0.230261 -vn -0.770471 0.456618 0.444831 -vn -0.770471 0.456618 0.444831 -vn -0.770471 0.456618 0.444831 -vn -0.859348 0.456618 0.230261 -vn -0.859348 0.456618 0.230261 -vn -0.770471 0.456618 0.444831 -vn -0.629087 0.456618 0.629086 -vn -0.629087 0.456618 0.629086 -vn -0.629087 0.456618 0.629086 -vn -0.770471 0.456618 0.444831 -vn -0.770471 0.456618 0.444831 -vn -0.629087 0.456618 0.629086 -vn -0.444832 0.456618 0.770470 -vn -0.444831 0.456618 0.770471 -vn -0.444831 0.456618 0.770471 -vn -0.629087 0.456618 0.629086 -vn -0.629087 0.456618 0.629086 -vn -0.444832 0.456618 0.770470 -vn -0.230262 0.456618 0.859348 -vn -0.230262 0.456618 0.859348 -vn -0.230262 0.456618 0.859348 -vn -0.444831 0.456618 0.770471 -vn -0.444832 0.456618 0.770470 -vn -0.230262 0.456618 0.859348 -vn -0.000000 0.456618 0.889663 -vn -0.000001 0.456618 0.889663 -vn -0.000001 0.456618 0.889663 -vn -0.230262 0.456618 0.859348 -vn -0.230262 0.456618 0.859348 -vn -0.000000 0.456618 0.889663 -vn 0.230261 0.456618 0.859348 -vn 0.230261 0.456618 0.859348 -vn 0.230261 0.456618 0.859348 -vn -0.000001 0.456618 0.889663 -vn -0.000000 0.456618 0.889663 -vn 0.230261 0.456618 0.859348 -vn 0.444831 0.456618 0.770471 -vn 0.444831 0.456618 0.770471 -vn 0.444831 0.456618 0.770471 -vn 0.230261 0.456618 0.859348 -vn 0.230261 0.456618 0.859348 -vn 0.444831 0.456618 0.770471 -vn 0.629086 0.456618 0.629087 -vn 0.629086 0.456618 0.629087 -vn 0.629086 0.456618 0.629087 -vn 0.444831 0.456618 0.770471 -vn 0.444831 0.456618 0.770471 -vn 0.629086 0.456618 0.629087 -vn 0.770470 0.456618 0.444832 -vn 0.770470 0.456618 0.444832 -vn 0.770470 0.456618 0.444832 -vn 0.629086 0.456618 0.629087 -vn 0.629086 0.456618 0.629087 -vn 0.770470 0.456618 0.444832 -vn 0.859348 0.456618 0.230262 -vn 0.859348 0.456618 0.230262 -vn 0.859348 0.456618 0.230262 -vn 0.770470 0.456618 0.444832 -vn 0.770470 0.456618 0.444832 -vn 0.859348 0.456618 0.230262 -vn 0.889663 0.456618 0.000000 -vn 0.889663 0.456618 0.000000 -vn 0.889663 0.456618 0.000000 -vn 0.859348 0.456618 0.230262 -vn 0.859348 0.456618 0.230262 -vn 0.889663 0.456618 0.000000 -vn 0.859348 0.456618 -0.230261 -vn 0.859348 0.456618 -0.230261 -vn 0.859348 0.456618 -0.230261 -vn 0.889663 0.456618 0.000000 -vn 0.889663 0.456618 0.000000 -vn 0.859348 0.456618 -0.230261 -vn 0.770470 0.456618 -0.444832 -vn 0.770470 0.456619 -0.444831 -vn 0.770470 0.456619 -0.444831 -vn 0.859348 0.456618 -0.230261 -vn 0.859348 0.456618 -0.230261 -vn 0.770470 0.456618 -0.444832 -vn 0.629086 0.456618 -0.629087 -vn 0.629086 0.456618 -0.629087 -vn 0.629086 0.456618 -0.629087 -vn 0.770470 0.456619 -0.444831 -vn 0.770470 0.456618 -0.444832 -vn 0.629086 0.456618 -0.629087 -vn 0.444831 0.456618 -0.770471 -vn 0.444831 0.456618 -0.770470 -vn 0.444831 0.456618 -0.770470 -vn 0.629086 0.456618 -0.629087 -vn 0.629086 0.456618 -0.629087 -vn 0.444831 0.456618 -0.770471 -vn 0.230262 0.456618 -0.859348 -vn 0.230262 0.456618 -0.859348 -vn 0.230262 0.456618 -0.859348 -vn 0.444831 0.456618 -0.770470 -vn 0.444831 0.456618 -0.770471 -vn 0.230262 0.456618 -0.859348 -vn 0.000000 0.456618 -0.889663 -vn 0.000000 0.456618 -0.889663 -vn 0.000000 0.456618 -0.889663 -vn 0.230262 0.456618 -0.859348 -vn 0.230262 0.456618 -0.859348 -vn 0.000000 0.456618 -0.889663 -vn -0.230261 0.456618 -0.859348 -vn -0.230261 0.456618 -0.859348 -vn -0.230261 0.456618 -0.859348 -vn 0.000000 0.456618 -0.889663 -vn 0.000000 0.456618 -0.889663 -vn -0.230261 0.456618 -0.859348 -vn -0.444831 0.456618 -0.770471 -vn -0.444831 0.456618 -0.770470 -vn -0.444831 0.456618 -0.770470 -vn -0.230261 0.456618 -0.859348 -vn -0.230261 0.456618 -0.859348 -vn -0.444831 0.456618 -0.770471 -vn -0.629086 0.456618 -0.629087 -vn -0.629086 0.456618 -0.629087 -vn -0.629086 0.456618 -0.629087 -vn -0.444831 0.456618 -0.770470 -vn -0.444831 0.456618 -0.770471 -vn -0.629086 0.456618 -0.629087 -vn -0.770470 0.456618 -0.444832 -vn -0.770470 0.456618 -0.444831 -vn -0.770470 0.456618 -0.444831 -vn -0.629086 0.456618 -0.629087 -vn -0.629086 0.456618 -0.629087 -vn -0.770470 0.456618 -0.444832 -vn -0.859348 0.456618 -0.230262 -vn -0.859348 0.456618 -0.230262 -vn -0.859348 0.456618 -0.230262 -vn -0.770470 0.456618 -0.444831 -vn -0.770470 0.456618 -0.444832 -vn -0.859348 0.456618 -0.230262 -vn -0.889663 0.456618 -0.000000 -vn -0.889663 0.456618 -0.000000 -vn -0.889663 0.456618 -0.000000 -vn -0.859348 0.456618 -0.230262 -vn -0.859348 0.456618 -0.230262 -vn -0.889663 0.456618 -0.000000 -vn -0.859348 0.456618 0.230261 -vn -0.859348 0.456618 0.230261 -vn -0.859348 0.456618 0.230261 -vn -0.889663 0.456618 -0.000000 -vn -0.889663 0.456618 -0.000000 -vn -0.859348 0.456618 0.230261 -vn -0.770471 0.456618 0.444831 -vn -0.770471 0.456618 0.444831 -vn -0.770471 0.456618 0.444831 -vn -0.859348 0.456618 0.230261 -vn -0.859348 0.456618 0.230261 -vn -0.770471 0.456618 0.444831 -vn -0.629087 0.456618 0.629086 -vn -0.629087 0.456618 0.629086 -vn -0.629087 0.456618 0.629086 -vn -0.770471 0.456618 0.444831 -vn -0.770471 0.456618 0.444831 -vn -0.629087 0.456618 0.629086 -vn -0.444831 0.456618 0.770471 -vn -0.444832 0.456618 0.770470 -vn -0.444832 0.456618 0.770470 -vn -0.629087 0.456618 0.629086 -vn -0.629087 0.456618 0.629086 -vn -0.444831 0.456618 0.770471 -vn -0.230262 0.456618 0.859348 -vn -0.230262 0.456618 0.859348 -vn -0.230262 0.456618 0.859348 -vn -0.444832 0.456618 0.770470 -vn -0.444831 0.456618 0.770471 -vn -0.230262 0.456618 0.859348 -vn -0.000001 0.456618 0.889663 -vn -0.000001 0.456618 0.889663 -vn -0.000001 0.456618 0.889663 -vn -0.230262 0.456618 0.859348 -vn -0.230262 0.456618 0.859348 -vn -0.000001 0.456618 0.889663 -vn 0.230261 0.456618 0.859348 -vn 0.230261 0.456618 0.859348 -vn 0.230261 0.456618 0.859348 -vn -0.000001 0.456618 0.889663 -vn -0.000001 0.456618 0.889663 -vn 0.230261 0.456618 0.859348 -vn 0.444831 0.456618 0.770471 -vn 0.444831 0.456618 0.770471 -vn 0.444831 0.456618 0.770471 -vn 0.230261 0.456618 0.859348 -vn 0.230261 0.456618 0.859348 -vn 0.444831 0.456618 0.770471 -vn 0.629086 0.456618 0.629087 -vn 0.629086 0.456618 0.629087 -vn 0.629086 0.456618 0.629087 -vn 0.444831 0.456618 0.770471 -vn 0.444831 0.456618 0.770471 -vn 0.629086 0.456618 0.629087 -vn 0.770470 0.456618 0.444832 -vn 0.770470 0.456618 0.444831 -vn 0.770470 0.456618 0.444831 -vn 0.629086 0.456618 0.629087 -vn 0.629086 0.456618 0.629087 -vn 0.770470 0.456618 0.444832 -vn 0.859348 0.456618 0.230262 -vn 0.859348 0.456618 0.230262 -vn 0.859348 0.456618 0.230262 -vn 0.770470 0.456618 0.444831 -vn 0.770470 0.456618 0.444832 -vn 0.859348 0.456618 0.230262 -vn 0.889663 0.456618 0.000000 -vn 0.889663 0.456618 0.000000 -vn 0.889663 0.456618 0.000000 -vn 0.859348 0.456618 0.230262 -vn 0.859348 0.456618 0.230262 -vn 0.889663 0.456618 0.000000 -vn 0.859348 0.456618 -0.230261 -vn 0.859348 0.456618 -0.230262 -vn 0.859348 0.456618 -0.230262 -vn 0.889663 0.456618 0.000000 -vn 0.889663 0.456618 0.000000 -vn 0.859348 0.456618 -0.230261 -vn 0.770470 0.456619 -0.444831 -vn 0.770470 0.456618 -0.444831 -vn 0.770470 0.456618 -0.444831 -vn 0.859348 0.456618 -0.230262 -vn 0.859348 0.456618 -0.230261 -vn 0.770470 0.456619 -0.444831 -vn 0.629086 0.456618 -0.629087 -vn 0.629086 0.456618 -0.629087 -vn 0.629086 0.456618 -0.629087 -vn 0.770470 0.456618 -0.444831 -vn 0.770470 0.456619 -0.444831 -vn 0.629086 0.456618 -0.629087 -vn 0.444831 0.456618 -0.770470 -vn 0.444831 0.456618 -0.770470 -vn 0.444831 0.456618 -0.770470 -vn 0.629086 0.456618 -0.629087 -vn 0.629086 0.456618 -0.629087 -vn 0.444831 0.456618 -0.770470 -vn 0.230262 0.456618 -0.859348 -vn 0.230263 0.456618 -0.859348 -vn 0.230263 0.456618 -0.859348 -vn 0.444831 0.456618 -0.770470 -vn 0.444831 0.456618 -0.770470 -vn 0.230262 0.456618 -0.859348 -vn 0.000000 0.456618 -0.889663 -vn 0.000000 0.456618 -0.889663 -vn 0.000000 0.456618 -0.889663 -vn 0.230263 0.456618 -0.859348 -vn 0.230262 0.456618 -0.859348 -vn 0.000000 0.456618 -0.889663 -vn -0.230261 0.456618 -0.859348 -vn -0.230262 0.456618 -0.859348 -vn -0.230262 0.456618 -0.859348 -vn 0.000000 0.456618 -0.889663 -vn 0.000000 0.456618 -0.889663 -vn -0.230261 0.456618 -0.859348 -vn -0.444831 0.456618 -0.770470 -vn -0.444831 0.456618 -0.770471 -vn -0.444831 0.456618 -0.770471 -vn -0.230262 0.456618 -0.859348 -vn -0.230261 0.456618 -0.859348 -vn -0.444831 0.456618 -0.770470 -vn -0.629086 0.456618 -0.629087 -vn -0.629087 0.456619 -0.629086 -vn -0.629087 0.456619 -0.629086 -vn -0.444831 0.456618 -0.770471 -vn -0.444831 0.456618 -0.770470 -vn -0.629086 0.456618 -0.629087 -vn -0.770470 0.456618 -0.444831 -vn -0.770471 0.456618 -0.444831 -vn -0.770471 0.456618 -0.444831 -vn -0.629087 0.456619 -0.629086 -vn -0.629086 0.456618 -0.629087 -vn -0.770470 0.456618 -0.444831 -vn -0.859348 0.456618 -0.230262 -vn -0.859348 0.456618 -0.230262 -vn -0.859348 0.456618 -0.230262 -vn -0.770471 0.456618 -0.444831 -vn -0.770470 0.456618 -0.444831 -vn -0.859348 0.456618 -0.230262 -vn -0.889663 0.456618 -0.000000 -vn -0.889663 0.456618 -0.000000 -vn -0.889663 0.456618 -0.000000 -vn -0.859348 0.456618 -0.230262 -vn -0.859348 0.456618 -0.230262 -vn -0.889663 0.456618 -0.000000 -vn -0.859348 0.456618 0.230261 -vn -0.859348 0.456618 0.230261 -vn -0.859348 0.456618 0.230261 -vn -0.889663 0.456618 -0.000000 -vn -0.889663 0.456618 -0.000000 -vn -0.859348 0.456618 0.230261 -vn -0.770471 0.456618 0.444831 -vn -0.770471 0.456618 0.444831 -vn -0.770471 0.456618 0.444831 -vn -0.859348 0.456618 0.230261 -vn -0.859348 0.456618 0.230261 -vn -0.770471 0.456618 0.444831 -vn -0.629087 0.456618 0.629086 -vn -0.629087 0.456618 0.629086 -vn -0.629087 0.456618 0.629086 -vn -0.770471 0.456618 0.444831 -vn -0.770471 0.456618 0.444831 -vn -0.629087 0.456618 0.629086 -vn -0.444832 0.456618 0.770470 -vn -0.444832 0.456618 0.770470 -vn -0.444832 0.456618 0.770470 -vn -0.629087 0.456618 0.629086 -vn -0.629087 0.456618 0.629086 -vn -0.444832 0.456618 0.770470 -vn -0.230262 0.456618 0.859348 -vn -0.230261 0.456618 0.859348 -vn -0.230261 0.456618 0.859348 -vn -0.444832 0.456618 0.770470 -vn -0.444832 0.456618 0.770470 -vn -0.230262 0.456618 0.859348 -vn -0.000001 0.456618 0.889663 -vn -0.000001 0.456618 0.889663 -vn -0.000001 0.456618 0.889663 -vn -0.230261 0.456618 0.859348 -vn -0.230262 0.456618 0.859348 -vn -0.000001 0.456618 0.889663 -vn 0.230261 0.456618 0.859348 -vn 0.230261 0.456619 0.859348 -vn 0.230261 0.456619 0.859348 -vn -0.000001 0.456618 0.889663 -vn -0.000001 0.456618 0.889663 -vn 0.230261 0.456618 0.859348 -vn 0.444831 0.456618 0.770471 -vn 0.444831 0.456618 0.770471 -vn 0.444831 0.456618 0.770471 -vn 0.230261 0.456619 0.859348 -vn 0.230261 0.456618 0.859348 -vn 0.444831 0.456618 0.770471 -vn 0.629086 0.456618 0.629087 -vn 0.629086 0.456618 0.629086 -vn 0.629086 0.456618 0.629086 -vn 0.444831 0.456618 0.770471 -vn 0.444831 0.456618 0.770471 -vn 0.629086 0.456618 0.629087 -vn 0.770470 0.456618 0.444831 -vn 0.770470 0.456618 0.444832 -vn 0.770470 0.456618 0.444832 -vn 0.629086 0.456618 0.629086 -vn 0.629086 0.456618 0.629087 -vn 0.770470 0.456618 0.444831 -vn 0.859348 0.456618 0.230262 -vn 0.859348 0.456618 0.230263 -vn 0.859348 0.456618 0.230263 -vn 0.770470 0.456618 0.444832 -vn 0.770470 0.456618 0.444831 -vn 0.859348 0.456618 0.230262 -vn 0.889663 0.456618 0.000000 -vn 0.889663 0.456618 0.000000 -vn 0.889663 0.456618 0.000000 -vn 0.859348 0.456618 0.230263 -vn 0.859348 0.456618 0.230262 -vn 0.889663 0.456618 0.000000 -vn 0.859348 0.456618 -0.230262 -vn 0.883622 0.453518 -0.116331 -vn 0.883622 0.453518 -0.116331 -vn 0.883622 0.453518 0.116332 -vn 0.889663 0.456618 0.000000 -vn 0.859348 0.456618 -0.230262 -vn 0.770470 0.456618 -0.444831 -vn 0.823405 0.453518 -0.341066 -vn 0.823405 0.453518 -0.341066 -vn 0.883622 0.453518 -0.116331 -vn 0.859348 0.456618 -0.230262 -vn 0.770470 0.456618 -0.444831 -vn 0.629086 0.456618 -0.629087 -vn 0.707074 0.453518 -0.542557 -vn 0.707074 0.453518 -0.542557 -vn 0.823405 0.453518 -0.341066 -vn 0.770470 0.456618 -0.444831 -vn 0.629086 0.456618 -0.629087 -vn 0.444831 0.456618 -0.770470 -vn 0.542556 0.453518 -0.707074 -vn 0.542556 0.453518 -0.707074 -vn 0.707074 0.453518 -0.542557 -vn 0.629086 0.456618 -0.629087 -vn 0.444831 0.456618 -0.770470 -vn 0.230263 0.456618 -0.859348 -vn 0.341066 0.453518 -0.823405 -vn 0.341066 0.453518 -0.823405 -vn 0.542556 0.453518 -0.707074 -vn 0.444831 0.456618 -0.770470 -vn 0.230263 0.456618 -0.859348 -vn 0.000000 0.456618 -0.889663 -vn 0.116332 0.453518 -0.883622 -vn 0.116332 0.453518 -0.883622 -vn 0.341066 0.453518 -0.823405 -vn 0.230263 0.456618 -0.859348 -vn 0.000000 0.456618 -0.889663 -vn -0.230262 0.456618 -0.859348 -vn -0.116332 0.453518 -0.883622 -vn -0.116332 0.453518 -0.883622 -vn 0.116332 0.453518 -0.883622 -vn 0.000000 0.456618 -0.889663 -vn -0.230262 0.456618 -0.859348 -vn -0.444831 0.456618 -0.770471 -vn -0.341066 0.453518 -0.823405 -vn -0.341066 0.453518 -0.823405 -vn -0.116332 0.453518 -0.883622 -vn -0.230262 0.456618 -0.859348 -vn -0.444831 0.456618 -0.770471 -vn -0.629087 0.456619 -0.629086 -vn -0.542555 0.453518 -0.707075 -vn -0.542555 0.453518 -0.707075 -vn -0.341066 0.453518 -0.823405 -vn -0.444831 0.456618 -0.770471 -vn -0.629087 0.456619 -0.629086 -vn -0.770471 0.456618 -0.444831 -vn -0.707075 0.453518 -0.542555 -vn -0.707075 0.453518 -0.542555 -vn -0.542555 0.453518 -0.707075 -vn -0.629087 0.456619 -0.629086 -vn -0.770471 0.456618 -0.444831 -vn -0.859348 0.456618 -0.230262 -vn -0.823405 0.453518 -0.341066 -vn -0.823405 0.453518 -0.341066 -vn -0.707075 0.453518 -0.542555 -vn -0.770471 0.456618 -0.444831 -vn -0.859348 0.456618 -0.230262 -vn -0.889663 0.456618 -0.000000 -vn -0.883622 0.453518 -0.116332 -vn -0.883622 0.453518 -0.116332 -vn -0.823405 0.453518 -0.341066 -vn -0.859348 0.456618 -0.230262 -vn -0.889663 0.456618 -0.000000 -vn -0.859348 0.456618 0.230261 -vn -0.883622 0.453518 0.116331 -vn -0.883622 0.453518 0.116331 -vn -0.883622 0.453518 -0.116332 -vn -0.889663 0.456618 -0.000000 -vn -0.859348 0.456618 0.230261 -vn -0.770471 0.456618 0.444831 -vn -0.823405 0.453518 0.341065 -vn -0.823405 0.453518 0.341065 -vn -0.883622 0.453518 0.116331 -vn -0.859348 0.456618 0.230261 -vn -0.770471 0.456618 0.444831 -vn -0.629087 0.456618 0.629086 -vn -0.707074 0.453518 0.542557 -vn -0.707074 0.453518 0.542557 -vn -0.823405 0.453518 0.341065 -vn -0.770471 0.456618 0.444831 -vn -0.629087 0.456618 0.629086 -vn -0.444832 0.456618 0.770470 -vn -0.542558 0.453518 0.707073 -vn -0.542558 0.453518 0.707073 -vn -0.707074 0.453518 0.542557 -vn -0.629087 0.456618 0.629086 -vn -0.444832 0.456618 0.770470 -vn -0.230261 0.456618 0.859348 -vn -0.341066 0.453518 0.823405 -vn -0.341066 0.453518 0.823405 -vn -0.542558 0.453518 0.707073 -vn -0.444832 0.456618 0.770470 -vn -0.230261 0.456618 0.859348 -vn -0.000001 0.456618 0.889663 -vn -0.116330 0.453518 0.883622 -vn -0.116330 0.453518 0.883622 -vn -0.341066 0.453518 0.823405 -vn -0.230261 0.456618 0.859348 -vn -0.000001 0.456618 0.889663 -vn 0.230261 0.456619 0.859348 -vn 0.116328 0.453518 0.883623 -vn 0.116328 0.453518 0.883623 -vn -0.116330 0.453518 0.883622 -vn -0.000001 0.456618 0.889663 -vn 0.230261 0.456619 0.859348 -vn 0.444831 0.456618 0.770471 -vn 0.341066 0.453518 0.823405 -vn 0.341066 0.453518 0.823405 -vn 0.116328 0.453518 0.883623 -vn 0.230261 0.456619 0.859348 -vn 0.444831 0.456618 0.770471 -vn 0.629086 0.456618 0.629086 -vn 0.542556 0.453518 0.707075 -vn 0.542556 0.453518 0.707075 -vn 0.341066 0.453518 0.823405 -vn 0.444831 0.456618 0.770471 -vn 0.629086 0.456618 0.629086 -vn 0.770470 0.456618 0.444832 -vn 0.707075 0.453518 0.542556 -vn 0.707075 0.453518 0.542556 -vn 0.542556 0.453518 0.707075 -vn 0.629086 0.456618 0.629086 -vn 0.770470 0.456618 0.444832 -vn 0.859348 0.456618 0.230263 -vn 0.823404 0.453518 0.341068 -vn 0.823404 0.453518 0.341068 -vn 0.707075 0.453518 0.542556 -vn 0.770470 0.456618 0.444832 -vn 0.859348 0.456618 0.230263 -vn 0.889663 0.456618 0.000000 -vn 0.883622 0.453518 0.116332 -vn 0.883622 0.453518 0.116332 -vn 0.823404 0.453518 0.341068 -vn 0.859348 0.456618 0.230263 -vn 0.000000 -1.000000 -0.000000 -vn 0.000000 -1.000000 -0.000000 -vn 0.000000 -1.000000 -0.000000 -vn 0.000000 -1.000000 -0.000000 -vn 0.000000 -1.000000 -0.000000 -vn 0.000000 -1.000000 -0.000000 -vn 0.000000 -1.000000 -0.000000 -vn 0.000000 -1.000000 -0.000000 -vn 0.000000 -1.000000 -0.000000 -vn 0.000000 -1.000000 -0.000000 -vn 0.000000 -1.000000 -0.000000 -vn 0.000000 -1.000000 -0.000000 -vn 0.000000 -1.000000 -0.000000 -vn 0.000000 -1.000000 -0.000000 -vn 0.000000 -1.000000 -0.000000 -vn 0.000000 -1.000000 -0.000000 -vn 0.000000 -1.000000 -0.000000 -vn 0.000000 -1.000000 -0.000000 -vn 0.000000 -1.000000 -0.000000 -vn 0.000000 -1.000000 -0.000000 -vn 0.000000 -1.000000 -0.000000 -vn 0.000000 -1.000000 -0.000000 -vn 0.000000 -1.000000 -0.000000 -vn 0.000000 -1.000000 -0.000000 -vn 0.000000 -1.000000 -0.000000 -vn 0.000000 -1.000000 -0.000000 -vn 0.000000 -1.000000 -0.000000 -vn 0.000000 -1.000000 -0.000000 -vn 0.000000 -1.000000 -0.000000 -vn 0.000000 -1.000000 -0.000000 -vn 0.000000 -1.000000 -0.000000 -vn 0.000000 -1.000000 -0.000000 -vn 0.000000 -1.000000 -0.000000 -vn 0.000000 -1.000000 -0.000000 -vn 0.000000 -1.000000 -0.000000 -vn 0.000000 -1.000000 -0.000000 -vn 0.000000 -1.000000 -0.000000 -vn 0.000000 -1.000000 -0.000000 -vn 0.000000 -1.000000 -0.000000 -vn 0.000000 -1.000000 -0.000000 -vn 0.000000 -1.000000 -0.000000 -vn 0.000000 -1.000000 -0.000000 -vn 0.000000 -1.000000 -0.000000 -vn 0.000000 -1.000000 -0.000000 -vn 0.000000 -1.000000 -0.000000 -vn 0.000000 -1.000000 -0.000000 -vn 0.000000 -1.000000 -0.000000 -vn 0.000000 -1.000000 -0.000000 -vn 0.000000 -1.000000 -0.000000 -vn 0.000000 -1.000000 -0.000000 -vn 0.000000 -1.000000 -0.000000 -vn 0.000000 -1.000000 -0.000000 -vn 0.000000 -1.000000 -0.000000 -vn 0.000000 -1.000000 -0.000000 -vn 0.000000 -1.000000 -0.000000 -vn 0.000000 -1.000000 -0.000000 -vn 0.000000 -1.000000 -0.000000 -vn 0.000000 -1.000000 -0.000000 -vn 0.000000 -1.000000 -0.000000 -vn 0.000000 -1.000000 -0.000000 -vn 0.000000 -1.000000 -0.000000 -vn 0.000000 -1.000000 -0.000000 -vn 0.000000 -1.000000 -0.000000 -vn 0.000000 -1.000000 -0.000000 -vn 0.000000 -1.000000 -0.000000 -vn 0.000000 -1.000000 -0.000000 -vn 0.966881 0.000000 -0.255228 -vn 0.966881 0.000000 -0.255228 -vn 0.966881 0.000000 -0.255228 -vn 0.966881 0.000000 -0.255228 -vn 0.966881 0.000000 -0.255228 -vn 0.966881 0.000000 -0.255228 -vn 0.966881 0.000000 -0.255228 -vn 0.966881 0.000000 -0.255228 -vn 0.966881 0.000000 -0.255228 -vn 0.966881 0.000000 -0.255228 -vn 0.966881 0.000000 -0.255228 -vn 0.966881 0.000000 -0.255228 -vn 0.966881 0.000000 -0.255228 -vn 0.966881 0.000000 -0.255228 -vn 0.966881 0.000000 -0.255228 -vn 0.966881 0.000000 -0.255228 -vn 0.966881 0.000000 -0.255228 -vn 0.966881 0.000000 -0.255228 -vn 0.966881 0.000000 -0.255228 -vn 0.966881 0.000000 -0.255228 -vn 0.966881 0.000000 -0.255228 -vn 0.966881 0.000000 -0.255228 -vn 0.966881 0.000000 -0.255228 -vn 0.966881 0.000000 -0.255228 -vn 0.966881 0.000000 -0.255228 -vn 0.966881 0.000000 -0.255228 -vn 0.966881 0.000000 -0.255228 -vn 0.966881 0.000000 -0.255228 -vn 0.966881 0.000000 -0.255228 -vn 0.966881 0.000000 -0.255228 -vn 0.966881 0.000000 -0.255228 -vn 0.966881 0.000000 -0.255228 -vn 0.966881 0.000000 -0.255228 -vn 0.966881 0.000000 -0.255228 -vn 0.966881 0.000000 -0.255228 -vn 0.966881 0.000000 -0.255228 -vn 0.966881 0.000000 -0.255228 -vn 0.966881 0.000000 -0.255228 -vn 0.966881 0.000000 -0.255228 -vn 0.966881 0.000000 -0.255228 -vn 0.966881 0.000000 -0.255228 -vn 0.966881 0.000000 -0.255228 -vn 0.966881 0.000000 -0.255228 -vn 0.966881 0.000000 -0.255228 -vn 0.966881 0.000000 -0.255228 -vn 0.966881 0.000000 -0.255228 -vn 0.966881 0.000000 -0.255228 -vn 0.966881 0.000000 -0.255228 -vn 0.966881 0.000000 -0.255228 -vn 0.966881 0.000000 -0.255228 -vn 0.966881 0.000000 -0.255228 -vn 0.966881 0.000000 -0.255228 -vn 0.966881 0.000000 -0.255228 -vn 0.966881 0.000000 -0.255228 -vn 0.966881 0.000000 -0.255228 -vn 0.966881 0.000000 -0.255228 -vn 0.966881 0.000000 -0.255228 -vn 0.966881 0.000000 -0.255228 -vn 0.966881 0.000000 -0.255228 -vn 0.966881 0.000000 -0.255228 -vn 0.966881 0.000000 -0.255228 -vn 0.966881 0.000000 -0.255228 -vn 0.966881 0.000000 -0.255228 -vn 0.966881 0.000000 -0.255228 -vn 0.966881 0.000000 -0.255228 -vn 0.966881 0.000000 -0.255228 -# 3768 vertex normals - -vt 1.000000 0.000000 0.000000 -vt 0.000000 0.000000 0.000000 -vt 1.000000 1.000000 0.000000 -vt 0.000000 1.000000 0.000000 -vt 0.000000 0.000000 0.000000 -vt 1.000000 0.000000 0.000000 -vt 0.000000 1.000000 0.000000 -vt 1.000000 1.000000 0.000000 -vt 0.000000 0.000000 0.000000 -vt 1.000000 0.000000 0.000000 -vt 0.000000 1.000000 0.000000 -vt 1.000000 1.000000 0.000000 -vt 0.000000 0.000000 0.000000 -vt 1.000000 0.000000 0.000000 -vt 0.000000 1.000000 0.000000 -vt 1.000000 1.000000 0.000000 -vt 0.000000 0.000000 0.000000 -vt 1.000000 0.000000 0.000000 -vt 0.000000 1.000000 0.000000 -vt 1.000000 1.000000 0.000000 -vt 0.000000 0.000000 0.000000 -vt 1.000000 0.000000 0.000000 -vt 0.000000 1.000000 0.000000 -vt 1.000000 1.000000 0.000000 -vt 0.000000 1.000000 0.000000 -vt 0.031250 1.000000 0.000000 -vt 0.062500 1.000000 0.000000 -vt 0.093750 1.000000 0.000000 -vt 0.125000 1.000000 0.000000 -vt 0.156250 1.000000 0.000000 -vt 0.187500 1.000000 0.000000 -vt 0.218750 1.000000 0.000000 -vt 0.250000 1.000000 0.000000 -vt 0.281250 1.000000 0.000000 -vt 0.312500 1.000000 0.000000 -vt 0.343750 1.000000 0.000000 -vt 0.375000 1.000000 0.000000 -vt 0.406250 1.000000 0.000000 -vt 0.437500 1.000000 0.000000 -vt 0.468750 1.000000 0.000000 -vt 0.500000 1.000000 0.000000 -vt 0.531250 1.000000 0.000000 -vt 0.562500 1.000000 0.000000 -vt 0.593750 1.000000 0.000000 -vt 0.625000 1.000000 0.000000 -vt 0.656250 1.000000 0.000000 -vt 0.687500 1.000000 0.000000 -vt 0.718750 1.000000 0.000000 -vt 0.750000 1.000000 0.000000 -vt 0.781250 1.000000 0.000000 -vt 0.812500 1.000000 0.000000 -vt 0.843750 1.000000 0.000000 -vt 0.875000 1.000000 0.000000 -vt 0.906250 1.000000 0.000000 -vt 0.937500 1.000000 0.000000 -vt 0.968750 1.000000 0.000000 -vt 0.000000 0.937500 0.000000 -vt 0.031250 0.937500 0.000000 -vt 0.062500 0.937500 0.000000 -vt 0.093750 0.937500 0.000000 -vt 0.125000 0.937500 0.000000 -vt 0.156250 0.937500 0.000000 -vt 0.187500 0.937500 0.000000 -vt 0.218750 0.937500 0.000000 -vt 0.250000 0.937500 0.000000 -vt 0.281250 0.937500 0.000000 -vt 0.312500 0.937500 0.000000 -vt 0.343750 0.937500 0.000000 -vt 0.375000 0.937500 0.000000 -vt 0.406250 0.937500 0.000000 -vt 0.437500 0.937500 0.000000 -vt 0.468750 0.937500 0.000000 -vt 0.500000 0.937500 0.000000 -vt 0.531250 0.937500 0.000000 -vt 0.562500 0.937500 0.000000 -vt 0.593750 0.937500 0.000000 -vt 0.625000 0.937500 0.000000 -vt 0.656250 0.937500 0.000000 -vt 0.687500 0.937500 0.000000 -vt 0.718750 0.937500 0.000000 -vt 0.750000 0.937500 0.000000 -vt 0.781250 0.937500 0.000000 -vt 0.812500 0.937500 0.000000 -vt 0.843750 0.937500 0.000000 -vt 0.875000 0.937500 0.000000 -vt 0.906250 0.937500 0.000000 -vt 0.937500 0.937500 0.000000 -vt 0.968750 0.937500 0.000000 -vt 1.000000 0.937500 0.000000 -vt 0.000000 0.875000 0.000000 -vt 0.031250 0.875000 0.000000 -vt 0.062500 0.875000 0.000000 -vt 0.093750 0.875000 0.000000 -vt 0.125000 0.875000 0.000000 -vt 0.156250 0.875000 0.000000 -vt 0.187500 0.875000 0.000000 -vt 0.218750 0.875000 0.000000 -vt 0.250000 0.875000 0.000000 -vt 0.281250 0.875000 0.000000 -vt 0.312500 0.875000 0.000000 -vt 0.343750 0.875000 0.000000 -vt 0.375000 0.875000 0.000000 -vt 0.406250 0.875000 0.000000 -vt 0.437500 0.875000 0.000000 -vt 0.468750 0.875000 0.000000 -vt 0.500000 0.875000 0.000000 -vt 0.531250 0.875000 0.000000 -vt 0.562500 0.875000 0.000000 -vt 0.593750 0.875000 0.000000 -vt 0.625000 0.875000 0.000000 -vt 0.656250 0.875000 0.000000 -vt 0.687500 0.875000 0.000000 -vt 0.718750 0.875000 0.000000 -vt 0.750000 0.875000 0.000000 -vt 0.781250 0.875000 0.000000 -vt 0.812500 0.875000 0.000000 -vt 0.843750 0.875000 0.000000 -vt 0.875000 0.875000 0.000000 -vt 0.906250 0.875000 0.000000 -vt 0.937500 0.875000 0.000000 -vt 0.968750 0.875000 0.000000 -vt 1.000000 0.875000 0.000000 -vt 0.000000 0.812500 0.000000 -vt 0.031250 0.812500 0.000000 -vt 0.062500 0.812500 0.000000 -vt 0.093750 0.812500 0.000000 -vt 0.125000 0.812500 0.000000 -vt 0.156250 0.812500 0.000000 -vt 0.187500 0.812500 0.000000 -vt 0.218750 0.812500 0.000000 -vt 0.250000 0.812500 0.000000 -vt 0.281250 0.812500 0.000000 -vt 0.312500 0.812500 0.000000 -vt 0.343750 0.812500 0.000000 -vt 0.375000 0.812500 0.000000 -vt 0.406250 0.812500 0.000000 -vt 0.437500 0.812500 0.000000 -vt 0.468750 0.812500 0.000000 -vt 0.500000 0.812500 0.000000 -vt 0.531250 0.812500 0.000000 -vt 0.562500 0.812500 0.000000 -vt 0.593750 0.812500 0.000000 -vt 0.625000 0.812500 0.000000 -vt 0.656250 0.812500 0.000000 -vt 0.687500 0.812500 0.000000 -vt 0.718750 0.812500 0.000000 -vt 0.750000 0.812500 0.000000 -vt 0.781250 0.812500 0.000000 -vt 0.812500 0.812500 0.000000 -vt 0.843750 0.812500 0.000000 -vt 0.875000 0.812500 0.000000 -vt 0.906250 0.812500 0.000000 -vt 0.937500 0.812500 0.000000 -vt 0.968750 0.812500 0.000000 -vt 1.000000 0.812500 0.000000 -vt 0.000000 0.750000 0.000000 -vt 0.031250 0.750000 0.000000 -vt 0.062500 0.750000 0.000000 -vt 0.093750 0.750000 0.000000 -vt 0.125000 0.750000 0.000000 -vt 0.156250 0.750000 0.000000 -vt 0.187500 0.750000 0.000000 -vt 0.218750 0.750000 0.000000 -vt 0.250000 0.750000 0.000000 -vt 0.281250 0.750000 0.000000 -vt 0.312500 0.750000 0.000000 -vt 0.343750 0.750000 0.000000 -vt 0.375000 0.750000 0.000000 -vt 0.406250 0.750000 0.000000 -vt 0.437500 0.750000 0.000000 -vt 0.468750 0.750000 0.000000 -vt 0.500000 0.750000 0.000000 -vt 0.531250 0.750000 0.000000 -vt 0.562500 0.750000 0.000000 -vt 0.593750 0.750000 0.000000 -vt 0.625000 0.750000 0.000000 -vt 0.656250 0.750000 0.000000 -vt 0.687500 0.750000 0.000000 -vt 0.718750 0.750000 0.000000 -vt 0.750000 0.750000 0.000000 -vt 0.781250 0.750000 0.000000 -vt 0.812500 0.750000 0.000000 -vt 0.843750 0.750000 0.000000 -vt 0.875000 0.750000 0.000000 -vt 0.906250 0.750000 0.000000 -vt 0.937500 0.750000 0.000000 -vt 0.968750 0.750000 0.000000 -vt 1.000000 0.750000 0.000000 -vt 0.000000 0.687500 0.000000 -vt 0.031250 0.687500 0.000000 -vt 0.062500 0.687500 0.000000 -vt 0.093750 0.687500 0.000000 -vt 0.125000 0.687500 0.000000 -vt 0.156250 0.687500 0.000000 -vt 0.187500 0.687500 0.000000 -vt 0.218750 0.687500 0.000000 -vt 0.250000 0.687500 0.000000 -vt 0.281250 0.687500 0.000000 -vt 0.312500 0.687500 0.000000 -vt 0.343750 0.687500 0.000000 -vt 0.375000 0.687500 0.000000 -vt 0.406250 0.687500 0.000000 -vt 0.437500 0.687500 0.000000 -vt 0.468750 0.687500 0.000000 -vt 0.500000 0.687500 0.000000 -vt 0.531250 0.687500 0.000000 -vt 0.562500 0.687500 0.000000 -vt 0.593750 0.687500 0.000000 -vt 0.625000 0.687500 0.000000 -vt 0.656250 0.687500 0.000000 -vt 0.687500 0.687500 0.000000 -vt 0.718750 0.687500 0.000000 -vt 0.750000 0.687500 0.000000 -vt 0.781250 0.687500 0.000000 -vt 0.812500 0.687500 0.000000 -vt 0.843750 0.687500 0.000000 -vt 0.875000 0.687500 0.000000 -vt 0.906250 0.687500 0.000000 -vt 0.937500 0.687500 0.000000 -vt 0.968750 0.687500 0.000000 -vt 1.000000 0.687500 0.000000 -vt 0.000000 0.625000 0.000000 -vt 0.031250 0.625000 0.000000 -vt 0.062500 0.625000 0.000000 -vt 0.093750 0.625000 0.000000 -vt 0.125000 0.625000 0.000000 -vt 0.156250 0.625000 0.000000 -vt 0.187500 0.625000 0.000000 -vt 0.218750 0.625000 0.000000 -vt 0.250000 0.625000 0.000000 -vt 0.281250 0.625000 0.000000 -vt 0.312500 0.625000 0.000000 -vt 0.343750 0.625000 0.000000 -vt 0.375000 0.625000 0.000000 -vt 0.406250 0.625000 0.000000 -vt 0.437500 0.625000 0.000000 -vt 0.468750 0.625000 0.000000 -vt 0.500000 0.625000 0.000000 -vt 0.531250 0.625000 0.000000 -vt 0.562500 0.625000 0.000000 -vt 0.593750 0.625000 0.000000 -vt 0.625000 0.625000 0.000000 -vt 0.656250 0.625000 0.000000 -vt 0.687500 0.625000 0.000000 -vt 0.718750 0.625000 0.000000 -vt 0.750000 0.625000 0.000000 -vt 0.781250 0.625000 0.000000 -vt 0.812500 0.625000 0.000000 -vt 0.843750 0.625000 0.000000 -vt 0.875000 0.625000 0.000000 -vt 0.906250 0.625000 0.000000 -vt 0.937500 0.625000 0.000000 -vt 0.968750 0.625000 0.000000 -vt 1.000000 0.625000 0.000000 -vt 0.000000 0.562500 0.000000 -vt 0.031250 0.562500 0.000000 -vt 0.062500 0.562500 0.000000 -vt 0.093750 0.562500 0.000000 -vt 0.125000 0.562500 0.000000 -vt 0.156250 0.562500 0.000000 -vt 0.187500 0.562500 0.000000 -vt 0.218750 0.562500 0.000000 -vt 0.250000 0.562500 0.000000 -vt 0.281250 0.562500 0.000000 -vt 0.312500 0.562500 0.000000 -vt 0.343750 0.562500 0.000000 -vt 0.375000 0.562500 0.000000 -vt 0.406250 0.562500 0.000000 -vt 0.437500 0.562500 0.000000 -vt 0.468750 0.562500 0.000000 -vt 0.500000 0.562500 0.000000 -vt 0.531250 0.562500 0.000000 -vt 0.562500 0.562500 0.000000 -vt 0.593750 0.562500 0.000000 -vt 0.625000 0.562500 0.000000 -vt 0.656250 0.562500 0.000000 -vt 0.687500 0.562500 0.000000 -vt 0.718750 0.562500 0.000000 -vt 0.750000 0.562500 0.000000 -vt 0.781250 0.562500 0.000000 -vt 0.812500 0.562500 0.000000 -vt 0.843750 0.562500 0.000000 -vt 0.875000 0.562500 0.000000 -vt 0.906250 0.562500 0.000000 -vt 0.937500 0.562500 0.000000 -vt 0.968750 0.562500 0.000000 -vt 1.000000 0.562500 0.000000 -vt 0.000000 0.500000 0.000000 -vt 0.031250 0.500000 0.000000 -vt 0.062500 0.500000 0.000000 -vt 0.093750 0.500000 0.000000 -vt 0.125000 0.500000 0.000000 -vt 0.156250 0.500000 0.000000 -vt 0.187500 0.500000 0.000000 -vt 0.218750 0.500000 0.000000 -vt 0.250000 0.500000 0.000000 -vt 0.281250 0.500000 0.000000 -vt 0.312500 0.500000 0.000000 -vt 0.343750 0.500000 0.000000 -vt 0.375000 0.500000 0.000000 -vt 0.406250 0.500000 0.000000 -vt 0.437500 0.500000 0.000000 -vt 0.468750 0.500000 0.000000 -vt 0.500000 0.500000 0.000000 -vt 0.531250 0.500000 0.000000 -vt 0.562500 0.500000 0.000000 -vt 0.593750 0.500000 0.000000 -vt 0.625000 0.500000 0.000000 -vt 0.656250 0.500000 0.000000 -vt 0.687500 0.500000 0.000000 -vt 0.718750 0.500000 0.000000 -vt 0.750000 0.500000 0.000000 -vt 0.781250 0.500000 0.000000 -vt 0.812500 0.500000 0.000000 -vt 0.843750 0.500000 0.000000 -vt 0.875000 0.500000 0.000000 -vt 0.906250 0.500000 0.000000 -vt 0.937500 0.500000 0.000000 -vt 0.968750 0.500000 0.000000 -vt 1.000000 0.500000 0.000000 -vt 0.000000 0.437500 0.000000 -vt 0.031250 0.437500 0.000000 -vt 0.062500 0.437500 0.000000 -vt 0.093750 0.437500 0.000000 -vt 0.125000 0.437500 0.000000 -vt 0.156250 0.437500 0.000000 -vt 0.187500 0.437500 0.000000 -vt 0.218750 0.437500 0.000000 -vt 0.250000 0.437500 0.000000 -vt 0.281250 0.437500 0.000000 -vt 0.312500 0.437500 0.000000 -vt 0.343750 0.437500 0.000000 -vt 0.375000 0.437500 0.000000 -vt 0.406250 0.437500 0.000000 -vt 0.437500 0.437500 0.000000 -vt 0.468750 0.437500 0.000000 -vt 0.500000 0.437500 0.000000 -vt 0.531250 0.437500 0.000000 -vt 0.562500 0.437500 0.000000 -vt 0.593750 0.437500 0.000000 -vt 0.625000 0.437500 0.000000 -vt 0.656250 0.437500 0.000000 -vt 0.687500 0.437500 0.000000 -vt 0.718750 0.437500 0.000000 -vt 0.750000 0.437500 0.000000 -vt 0.781250 0.437500 0.000000 -vt 0.812500 0.437500 0.000000 -vt 0.843750 0.437500 0.000000 -vt 0.875000 0.437500 0.000000 -vt 0.906250 0.437500 0.000000 -vt 0.937500 0.437500 0.000000 -vt 0.968750 0.437500 0.000000 -vt 1.000000 0.437500 0.000000 -vt 0.000000 0.375000 0.000000 -vt 0.031250 0.375000 0.000000 -vt 0.062500 0.375000 0.000000 -vt 0.093750 0.375000 0.000000 -vt 0.125000 0.375000 0.000000 -vt 0.156250 0.375000 0.000000 -vt 0.187500 0.375000 0.000000 -vt 0.218750 0.375000 0.000000 -vt 0.250000 0.375000 0.000000 -vt 0.281250 0.375000 0.000000 -vt 0.312500 0.375000 0.000000 -vt 0.343750 0.375000 0.000000 -vt 0.375000 0.375000 0.000000 -vt 0.406250 0.375000 0.000000 -vt 0.437500 0.375000 0.000000 -vt 0.468750 0.375000 0.000000 -vt 0.500000 0.375000 0.000000 -vt 0.531250 0.375000 0.000000 -vt 0.562500 0.375000 0.000000 -vt 0.593750 0.375000 0.000000 -vt 0.625000 0.375000 0.000000 -vt 0.656250 0.375000 0.000000 -vt 0.687500 0.375000 0.000000 -vt 0.718750 0.375000 0.000000 -vt 0.750000 0.375000 0.000000 -vt 0.781250 0.375000 0.000000 -vt 0.812500 0.375000 0.000000 -vt 0.843750 0.375000 0.000000 -vt 0.875000 0.375000 0.000000 -vt 0.906250 0.375000 0.000000 -vt 0.937500 0.375000 0.000000 -vt 0.968750 0.375000 0.000000 -vt 1.000000 0.375000 0.000000 -vt 0.000000 0.312500 0.000000 -vt 0.031250 0.312500 0.000000 -vt 0.062500 0.312500 0.000000 -vt 0.093750 0.312500 0.000000 -vt 0.125000 0.312500 0.000000 -vt 0.156250 0.312500 0.000000 -vt 0.187500 0.312500 0.000000 -vt 0.218750 0.312500 0.000000 -vt 0.250000 0.312500 0.000000 -vt 0.281250 0.312500 0.000000 -vt 0.312500 0.312500 0.000000 -vt 0.343750 0.312500 0.000000 -vt 0.375000 0.312500 0.000000 -vt 0.406250 0.312500 0.000000 -vt 0.437500 0.312500 0.000000 -vt 0.468750 0.312500 0.000000 -vt 0.500000 0.312500 0.000000 -vt 0.531250 0.312500 0.000000 -vt 0.562500 0.312500 0.000000 -vt 0.593750 0.312500 0.000000 -vt 0.625000 0.312500 0.000000 -vt 0.656250 0.312500 0.000000 -vt 0.687500 0.312500 0.000000 -vt 0.718750 0.312500 0.000000 -vt 0.750000 0.312500 0.000000 -vt 0.781250 0.312500 0.000000 -vt 0.812500 0.312500 0.000000 -vt 0.843750 0.312500 0.000000 -vt 0.875000 0.312500 0.000000 -vt 0.906250 0.312500 0.000000 -vt 0.937500 0.312500 0.000000 -vt 0.968750 0.312500 0.000000 -vt 1.000000 0.312500 0.000000 -vt 0.000000 0.250000 0.000000 -vt 0.031250 0.250000 0.000000 -vt 0.062500 0.250000 0.000000 -vt 0.093750 0.250000 0.000000 -vt 0.125000 0.250000 0.000000 -vt 0.156250 0.250000 0.000000 -vt 0.187500 0.250000 0.000000 -vt 0.218750 0.250000 0.000000 -vt 0.250000 0.250000 0.000000 -vt 0.281250 0.250000 0.000000 -vt 0.312500 0.250000 0.000000 -vt 0.343750 0.250000 0.000000 -vt 0.375000 0.250000 0.000000 -vt 0.406250 0.250000 0.000000 -vt 0.437500 0.250000 0.000000 -vt 0.468750 0.250000 0.000000 -vt 0.500000 0.250000 0.000000 -vt 0.531250 0.250000 0.000000 -vt 0.562500 0.250000 0.000000 -vt 0.593750 0.250000 0.000000 -vt 0.625000 0.250000 0.000000 -vt 0.656250 0.250000 0.000000 -vt 0.687500 0.250000 0.000000 -vt 0.718750 0.250000 0.000000 -vt 0.750000 0.250000 0.000000 -vt 0.781250 0.250000 0.000000 -vt 0.812500 0.250000 0.000000 -vt 0.843750 0.250000 0.000000 -vt 0.875000 0.250000 0.000000 -vt 0.906250 0.250000 0.000000 -vt 0.937500 0.250000 0.000000 -vt 0.968750 0.250000 0.000000 -vt 1.000000 0.250000 0.000000 -vt 0.000000 0.187500 0.000000 -vt 0.031250 0.187500 0.000000 -vt 0.062500 0.187500 0.000000 -vt 0.093750 0.187500 0.000000 -vt 0.125000 0.187500 0.000000 -vt 0.156250 0.187500 0.000000 -vt 0.187500 0.187500 0.000000 -vt 0.218750 0.187500 0.000000 -vt 0.250000 0.187500 0.000000 -vt 0.281250 0.187500 0.000000 -vt 0.312500 0.187500 0.000000 -vt 0.343750 0.187500 0.000000 -vt 0.375000 0.187500 0.000000 -vt 0.406250 0.187500 0.000000 -vt 0.437500 0.187500 0.000000 -vt 0.468750 0.187500 0.000000 -vt 0.500000 0.187500 0.000000 -vt 0.531250 0.187500 0.000000 -vt 0.562500 0.187500 0.000000 -vt 0.593750 0.187500 0.000000 -vt 0.625000 0.187500 0.000000 -vt 0.656250 0.187500 0.000000 -vt 0.687500 0.187500 0.000000 -vt 0.718750 0.187500 0.000000 -vt 0.750000 0.187500 0.000000 -vt 0.781250 0.187500 0.000000 -vt 0.812500 0.187500 0.000000 -vt 0.843750 0.187500 0.000000 -vt 0.875000 0.187500 0.000000 -vt 0.906250 0.187500 0.000000 -vt 0.937500 0.187500 0.000000 -vt 0.968750 0.187500 0.000000 -vt 1.000000 0.187500 0.000000 -vt 0.000000 0.125000 0.000000 -vt 0.031250 0.125000 0.000000 -vt 0.062500 0.125000 0.000000 -vt 0.093750 0.125000 0.000000 -vt 0.125000 0.125000 0.000000 -vt 0.156250 0.125000 0.000000 -vt 0.187500 0.125000 0.000000 -vt 0.218750 0.125000 0.000000 -vt 0.250000 0.125000 0.000000 -vt 0.281250 0.125000 0.000000 -vt 0.312500 0.125000 0.000000 -vt 0.343750 0.125000 0.000000 -vt 0.375000 0.125000 0.000000 -vt 0.406250 0.125000 0.000000 -vt 0.437500 0.125000 0.000000 -vt 0.468750 0.125000 0.000000 -vt 0.500000 0.125000 0.000000 -vt 0.531250 0.125000 0.000000 -vt 0.562500 0.125000 0.000000 -vt 0.593750 0.125000 0.000000 -vt 0.625000 0.125000 0.000000 -vt 0.656250 0.125000 0.000000 -vt 0.687500 0.125000 0.000000 -vt 0.718750 0.125000 0.000000 -vt 0.750000 0.125000 0.000000 -vt 0.781250 0.125000 0.000000 -vt 0.812500 0.125000 0.000000 -vt 0.843750 0.125000 0.000000 -vt 0.875000 0.125000 0.000000 -vt 0.906250 0.125000 0.000000 -vt 0.937500 0.125000 0.000000 -vt 0.968750 0.125000 0.000000 -vt 1.000000 0.125000 0.000000 -vt 0.000000 0.062500 0.000000 -vt 0.031250 0.062500 0.000000 -vt 0.062500 0.062500 0.000000 -vt 0.093750 0.062500 0.000000 -vt 0.125000 0.062500 0.000000 -vt 0.156250 0.062500 0.000000 -vt 0.187500 0.062500 0.000000 -vt 0.218750 0.062500 0.000000 -vt 0.250000 0.062500 0.000000 -vt 0.281250 0.062500 0.000000 -vt 0.312500 0.062500 0.000000 -vt 0.343750 0.062500 0.000000 -vt 0.375000 0.062500 0.000000 -vt 0.406250 0.062500 0.000000 -vt 0.437500 0.062500 0.000000 -vt 0.468750 0.062500 0.000000 -vt 0.500000 0.062500 0.000000 -vt 0.531250 0.062500 0.000000 -vt 0.562500 0.062500 0.000000 -vt 0.593750 0.062500 0.000000 -vt 0.625000 0.062500 0.000000 -vt 0.656250 0.062500 0.000000 -vt 0.687500 0.062500 0.000000 -vt 0.718750 0.062500 0.000000 -vt 0.750000 0.062500 0.000000 -vt 0.781250 0.062500 0.000000 -vt 0.812500 0.062500 0.000000 -vt 0.843750 0.062500 0.000000 -vt 0.875000 0.062500 0.000000 -vt 0.906250 0.062500 0.000000 -vt 0.937500 0.062500 0.000000 -vt 0.968750 0.062500 0.000000 -vt 1.000000 0.062500 0.000000 -vt 0.000000 -0.000000 0.000000 -vt 0.031250 -0.000000 0.000000 -vt 0.062500 -0.000000 0.000000 -vt 0.093750 -0.000000 0.000000 -vt 0.125000 -0.000000 0.000000 -vt 0.156250 -0.000000 0.000000 -vt 0.187500 -0.000000 0.000000 -vt 0.218750 -0.000000 0.000000 -vt 0.250000 -0.000000 0.000000 -vt 0.281250 -0.000000 0.000000 -vt 0.312500 -0.000000 0.000000 -vt 0.343750 -0.000000 0.000000 -vt 0.375000 -0.000000 0.000000 -vt 0.406250 -0.000000 0.000000 -vt 0.437500 -0.000000 0.000000 -vt 0.468750 -0.000000 0.000000 -vt 0.500000 -0.000000 0.000000 -vt 0.531250 -0.000000 0.000000 -vt 0.562500 -0.000000 0.000000 -vt 0.593750 -0.000000 0.000000 -vt 0.625000 -0.000000 0.000000 -vt 0.656250 -0.000000 0.000000 -vt 0.687500 -0.000000 0.000000 -vt 0.718750 -0.000000 0.000000 -vt 0.750000 -0.000000 0.000000 -vt 0.781250 -0.000000 0.000000 -vt 0.812500 -0.000000 0.000000 -vt 0.843750 -0.000000 0.000000 -vt 0.875000 -0.000000 0.000000 -vt 0.906250 -0.000000 0.000000 -vt 0.937500 -0.000000 0.000000 -vt 0.968750 -0.000000 0.000000 -vt 0.750000 0.000000 1.000000 -vt 0.791667 0.000000 1.000000 -vt 0.833333 0.000000 1.000000 -vt 0.875000 0.000000 1.000000 -vt 0.916667 0.000000 1.000000 -vt 0.958333 0.000000 1.000000 -vt 1.000000 0.000000 1.000000 -vt 0.041667 0.000000 1.000000 -vt 0.083333 0.000000 1.000000 -vt 0.125000 0.000000 1.000000 -vt 0.166667 0.000000 1.000000 -vt 0.208333 0.000000 1.000000 -vt 0.250000 0.000000 1.000000 -vt 0.291667 0.000000 1.000000 -vt 0.333333 0.000000 1.000000 -vt 0.375000 0.000000 1.000000 -vt 0.416667 0.000000 1.000000 -vt 0.458333 0.000000 1.000000 -vt 0.500000 0.000000 1.000000 -vt 0.541667 0.000000 1.000000 -vt 0.583333 0.000000 1.000000 -vt 0.625000 0.000000 1.000000 -vt 0.666667 0.000000 1.000000 -vt 0.708333 0.000000 1.000000 -vt 0.750000 0.200000 0.800000 -vt 0.791667 0.200000 0.800000 -vt 0.833333 0.200000 0.800000 -vt 0.875000 0.200000 0.800000 -vt 0.916667 0.200000 0.800000 -vt 0.958333 0.200000 0.800000 -vt 1.000000 0.200000 0.800000 -vt 0.041667 0.200000 0.800000 -vt 0.083333 0.200000 0.800000 -vt 0.125000 0.200000 0.800000 -vt 0.166667 0.200000 0.800000 -vt 0.208333 0.200000 0.800000 -vt 0.250000 0.200000 0.800000 -vt 0.291667 0.200000 0.800000 -vt 0.333333 0.200000 0.800000 -vt 0.375000 0.200000 0.800000 -vt 0.416667 0.200000 0.800000 -vt 0.458333 0.200000 0.800000 -vt 0.500000 0.200000 0.800000 -vt 0.541667 0.200000 0.800000 -vt 0.583333 0.200000 0.800000 -vt 0.625000 0.200000 0.800000 -vt 0.666667 0.200000 0.800000 -vt 0.708333 0.200000 0.800000 -vt 0.750000 0.400000 0.600000 -vt 0.791667 0.400000 0.600000 -vt 0.833333 0.400000 0.600000 -vt 0.875000 0.400000 0.600000 -vt 0.916667 0.400000 0.600000 -vt 0.958333 0.400000 0.600000 -vt 1.000000 0.400000 0.600000 -vt 0.041667 0.400000 0.600000 -vt 0.083333 0.400000 0.600000 -vt 0.125000 0.400000 0.600000 -vt 0.166667 0.400000 0.600000 -vt 0.208333 0.400000 0.600000 -vt 0.250000 0.400000 0.600000 -vt 0.291667 0.400000 0.600000 -vt 0.333333 0.400000 0.600000 -vt 0.375000 0.400000 0.600000 -vt 0.416667 0.400000 0.600000 -vt 0.458333 0.400000 0.600000 -vt 0.500000 0.400000 0.600000 -vt 0.541667 0.400000 0.600000 -vt 0.583333 0.400000 0.600000 -vt 0.625000 0.400000 0.600000 -vt 0.666667 0.400000 0.600000 -vt 0.708333 0.400000 0.600000 -vt 0.750000 0.600000 0.400000 -vt 0.791667 0.600000 0.400000 -vt 0.833333 0.600000 0.400000 -vt 0.875000 0.600000 0.400000 -vt 0.916667 0.600000 0.400000 -vt 0.958333 0.600000 0.400000 -vt 1.000000 0.600000 0.400000 -vt 0.041667 0.600000 0.400000 -vt 0.083333 0.600000 0.400000 -vt 0.125000 0.600000 0.400000 -vt 0.166667 0.600000 0.400000 -vt 0.208333 0.600000 0.400000 -vt 0.250000 0.600000 0.400000 -vt 0.291667 0.600000 0.400000 -vt 0.333333 0.600000 0.400000 -vt 0.375000 0.600000 0.400000 -vt 0.416667 0.600000 0.400000 -vt 0.458333 0.600000 0.400000 -vt 0.500000 0.600000 0.400000 -vt 0.541667 0.600000 0.400000 -vt 0.583333 0.600000 0.400000 -vt 0.625000 0.600000 0.400000 -vt 0.666667 0.600000 0.400000 -vt 0.708333 0.600000 0.400000 -vt 0.750000 0.800000 0.200000 -vt 0.791667 0.800000 0.200000 -vt 0.833333 0.800000 0.200000 -vt 0.875000 0.800000 0.200000 -vt 0.916667 0.800000 0.200000 -vt 0.958333 0.800000 0.200000 -vt 1.000000 0.800000 0.200000 -vt 0.041667 0.800000 0.200000 -vt 0.083333 0.800000 0.200000 -vt 0.125000 0.800000 0.200000 -vt 0.166667 0.800000 0.200000 -vt 0.208333 0.800000 0.200000 -vt 0.250000 0.800000 0.200000 -vt 0.291667 0.800000 0.200000 -vt 0.333333 0.800000 0.200000 -vt 0.375000 0.800000 0.200000 -vt 0.416667 0.800000 0.200000 -vt 0.458333 0.800000 0.200000 -vt 0.500000 0.800000 0.200000 -vt 0.541667 0.800000 0.200000 -vt 0.583333 0.800000 0.200000 -vt 0.625000 0.800000 0.200000 -vt 0.666667 0.800000 0.200000 -vt 0.708333 0.800000 0.200000 -vt 0.500000 1.000000 0.000000 -vt 0.500000 1.000000 0.000000 -vt 0.500000 1.000000 0.000000 -vt 0.500000 1.000000 0.000000 -vt 0.500000 1.000000 0.000000 -vt 0.500000 1.000000 0.000000 -vt 0.500000 1.000000 0.000000 -vt 0.500000 1.000000 0.000000 -vt 0.500000 1.000000 0.000000 -vt 0.500000 1.000000 0.000000 -vt 0.500000 1.000000 0.000000 -vt 0.500000 1.000000 0.000000 -vt 0.500000 1.000000 0.000000 -vt 0.500000 1.000000 0.000000 -vt 0.500000 1.000000 0.000000 -vt 0.500000 1.000000 0.000000 -vt 0.500000 1.000000 0.000000 -vt 0.500000 1.000000 0.000000 -vt 0.500000 1.000000 0.000000 -vt 0.500000 1.000000 0.000000 -vt 0.500000 1.000000 0.000000 -vt 0.500000 1.000000 0.000000 -vt 0.500000 1.000000 0.000000 -vt 0.500000 1.000000 0.000000 -vt 1.041667 0.000000 1.000000 -vt 1.041667 0.200000 0.800000 -vt 1.041667 0.400000 0.600000 -vt 1.041667 0.600000 0.400000 -vt 1.041667 0.800000 0.200000 -vt 1.500000 1.000000 0.000000 -vt 1.500000 1.000000 0.000000 -vt 2.000000 0.800000 0.200000 -vt 0.629410 0.982963 -0.250000 -vt 0.750000 0.933013 -0.250000 -vt 0.853554 0.853553 -0.250000 -vt 0.933013 0.750000 -0.250000 -vt 0.982963 0.629409 -0.250000 -vt 1.000000 0.500000 -0.250000 -vt 0.982963 0.370590 -0.250000 -vt 0.933013 0.250000 -0.250000 -vt 0.853553 0.146446 -0.250000 -vt 0.750000 0.066987 -0.250000 -vt 0.629409 0.017037 -0.250000 -vt 0.500000 0.000000 -0.250000 -vt 0.370590 0.017037 -0.250000 -vt 0.250000 0.066987 -0.250000 -vt 0.146447 0.146447 -0.250000 -vt 0.066987 0.250000 -0.250000 -vt 0.017037 0.370591 -0.250000 -vt 0.000000 0.500000 -0.250000 -vt 0.017037 0.629410 -0.250000 -vt 0.066987 0.750000 -0.250000 -vt 0.146447 0.853553 -0.250000 -vt 0.250000 0.933013 -0.250000 -vt 0.370590 0.982963 -0.250000 -vt 0.500000 1.000000 -0.250000 -# 759 texture coords - -g Box001 -f 1/1/1 3/3/2 4/4/3 -f 4/4/4 2/2/5 1/1/6 -f 5/5/7 6/6/8 8/8/9 -f 8/8/10 7/7/11 5/5/12 -f 1/9/13 2/10/14 6/12/15 -f 6/12/16 5/11/17 1/9/18 -f 2/13/19 4/14/20 8/16/21 -f 8/16/22 6/15/23 2/13/24 -f 4/17/25 3/18/26 7/20/27 -f 7/20/28 8/19/29 4/17/30 -f 3/21/31 1/22/32 5/24/33 -f 5/24/34 7/23/35 3/21/36 -f 9/25/37 10/57/38 11/58/39 -f 9/26/40 11/58/41 12/59/42 -f 9/27/43 12/59/44 13/60/45 -f 9/28/46 13/60/47 14/61/48 -f 9/29/49 14/61/50 15/62/51 -f 9/30/52 15/62/53 16/63/54 -f 9/31/55 16/63/56 17/64/57 -f 9/32/58 17/64/59 18/65/60 -f 9/33/61 18/65/62 19/66/63 -f 9/34/64 19/66/65 20/67/66 -f 9/35/67 20/67/68 21/68/69 -f 9/36/70 21/68/71 22/69/72 -f 9/37/73 22/69/74 23/70/75 -f 9/38/76 23/70/77 24/71/78 -f 9/39/79 24/71/80 25/72/81 -f 9/40/82 25/72/83 26/73/84 -f 9/41/85 26/73/86 27/74/87 -f 9/42/88 27/74/89 28/75/90 -f 9/43/91 28/75/92 29/76/93 -f 9/44/94 29/76/95 30/77/96 -f 9/45/97 30/77/98 31/78/99 -f 9/46/100 31/78/101 32/79/102 -f 9/47/103 32/79/104 33/80/105 -f 9/48/106 33/80/107 34/81/108 -f 9/49/109 34/81/110 35/82/111 -f 9/50/112 35/82/113 36/83/114 -f 9/51/115 36/83/116 37/84/117 -f 9/52/118 37/84/119 38/85/120 -f 9/53/121 38/85/122 39/86/123 -f 9/54/124 39/86/125 40/87/126 -f 9/55/127 40/87/128 41/88/129 -f 9/56/130 41/88/131 10/89/132 -f 43/91/133 11/58/134 10/57/135 -f 10/57/136 42/90/137 43/91/138 -f 44/92/139 12/59/140 11/58/141 -f 11/58/142 43/91/143 44/92/144 -f 45/93/145 13/60/146 12/59/147 -f 12/59/148 44/92/149 45/93/150 -f 46/94/151 14/61/152 13/60/153 -f 13/60/154 45/93/155 46/94/156 -f 47/95/157 15/62/158 14/61/159 -f 14/61/160 46/94/161 47/95/162 -f 48/96/163 16/63/164 15/62/165 -f 15/62/166 47/95/167 48/96/168 -f 49/97/169 17/64/170 16/63/171 -f 16/63/172 48/96/173 49/97/174 -f 50/98/175 18/65/176 17/64/177 -f 17/64/178 49/97/179 50/98/180 -f 51/99/181 19/66/182 18/65/183 -f 18/65/184 50/98/185 51/99/186 -f 52/100/187 20/67/188 19/66/189 -f 19/66/190 51/99/191 52/100/192 -f 53/101/193 21/68/194 20/67/195 -f 20/67/196 52/100/197 53/101/198 -f 54/102/199 22/69/200 21/68/201 -f 21/68/202 53/101/203 54/102/204 -f 55/103/205 23/70/206 22/69/207 -f 22/69/208 54/102/209 55/103/210 -f 56/104/211 24/71/212 23/70/213 -f 23/70/214 55/103/215 56/104/216 -f 57/105/217 25/72/218 24/71/219 -f 24/71/220 56/104/221 57/105/222 -f 58/106/223 26/73/224 25/72/225 -f 25/72/226 57/105/227 58/106/228 -f 59/107/229 27/74/230 26/73/231 -f 26/73/232 58/106/233 59/107/234 -f 60/108/235 28/75/236 27/74/237 -f 27/74/238 59/107/239 60/108/240 -f 61/109/241 29/76/242 28/75/243 -f 28/75/244 60/108/245 61/109/246 -f 62/110/247 30/77/248 29/76/249 -f 29/76/250 61/109/251 62/110/252 -f 63/111/253 31/78/254 30/77/255 -f 30/77/256 62/110/257 63/111/258 -f 64/112/259 32/79/260 31/78/261 -f 31/78/262 63/111/263 64/112/264 -f 65/113/265 33/80/266 32/79/267 -f 32/79/268 64/112/269 65/113/270 -f 66/114/271 34/81/272 33/80/273 -f 33/80/274 65/113/275 66/114/276 -f 67/115/277 35/82/278 34/81/279 -f 34/81/280 66/114/281 67/115/282 -f 68/116/283 36/83/284 35/82/285 -f 35/82/286 67/115/287 68/116/288 -f 69/117/289 37/84/290 36/83/291 -f 36/83/292 68/116/293 69/117/294 -f 70/118/295 38/85/296 37/84/297 -f 37/84/298 69/117/299 70/118/300 -f 71/119/301 39/86/302 38/85/303 -f 38/85/304 70/118/305 71/119/306 -f 72/120/307 40/87/308 39/86/309 -f 39/86/310 71/119/311 72/120/312 -f 73/121/313 41/88/314 40/87/315 -f 40/87/316 72/120/317 73/121/318 -f 42/122/319 10/89/320 41/88/321 -f 41/88/322 73/121/323 42/122/324 -f 75/124/325 43/91/326 42/90/327 -f 42/90/328 74/123/329 75/124/330 -f 76/125/331 44/92/332 43/91/333 -f 43/91/334 75/124/335 76/125/336 -f 77/126/337 45/93/338 44/92/339 -f 44/92/340 76/125/341 77/126/342 -f 78/127/343 46/94/344 45/93/345 -f 45/93/346 77/126/347 78/127/348 -f 79/128/349 47/95/350 46/94/351 -f 46/94/352 78/127/353 79/128/354 -f 80/129/355 48/96/356 47/95/357 -f 47/95/358 79/128/359 80/129/360 -f 81/130/361 49/97/362 48/96/363 -f 48/96/364 80/129/365 81/130/366 -f 82/131/367 50/98/368 49/97/369 -f 49/97/370 81/130/371 82/131/372 -f 83/132/373 51/99/374 50/98/375 -f 50/98/376 82/131/377 83/132/378 -f 84/133/379 52/100/380 51/99/381 -f 51/99/382 83/132/383 84/133/384 -f 85/134/385 53/101/386 52/100/387 -f 52/100/388 84/133/389 85/134/390 -f 86/135/391 54/102/392 53/101/393 -f 53/101/394 85/134/395 86/135/396 -f 87/136/397 55/103/398 54/102/399 -f 54/102/400 86/135/401 87/136/402 -f 88/137/403 56/104/404 55/103/405 -f 55/103/406 87/136/407 88/137/408 -f 89/138/409 57/105/410 56/104/411 -f 56/104/412 88/137/413 89/138/414 -f 90/139/415 58/106/416 57/105/417 -f 57/105/418 89/138/419 90/139/420 -f 91/140/421 59/107/422 58/106/423 -f 58/106/424 90/139/425 91/140/426 -f 92/141/427 60/108/428 59/107/429 -f 59/107/430 91/140/431 92/141/432 -f 93/142/433 61/109/434 60/108/435 -f 60/108/436 92/141/437 93/142/438 -f 94/143/439 62/110/440 61/109/441 -f 61/109/442 93/142/443 94/143/444 -f 95/144/445 63/111/446 62/110/447 -f 62/110/448 94/143/449 95/144/450 -f 96/145/451 64/112/452 63/111/453 -f 63/111/454 95/144/455 96/145/456 -f 97/146/457 65/113/458 64/112/459 -f 64/112/460 96/145/461 97/146/462 -f 98/147/463 66/114/464 65/113/465 -f 65/113/466 97/146/467 98/147/468 -f 99/148/469 67/115/470 66/114/471 -f 66/114/472 98/147/473 99/148/474 -f 100/149/475 68/116/476 67/115/477 -f 67/115/478 99/148/479 100/149/480 -f 101/150/481 69/117/482 68/116/483 -f 68/116/484 100/149/485 101/150/486 -f 102/151/487 70/118/488 69/117/489 -f 69/117/490 101/150/491 102/151/492 -f 103/152/493 71/119/494 70/118/495 -f 70/118/496 102/151/497 103/152/498 -f 104/153/499 72/120/500 71/119/501 -f 71/119/502 103/152/503 104/153/504 -f 105/154/505 73/121/506 72/120/507 -f 72/120/508 104/153/509 105/154/510 -f 74/155/511 42/122/512 73/121/513 -f 73/121/514 105/154/515 74/155/516 -f 107/157/517 75/124/518 74/123/519 -f 74/123/520 106/156/521 107/157/522 -f 108/158/523 76/125/524 75/124/525 -f 75/124/526 107/157/527 108/158/528 -f 109/159/529 77/126/530 76/125/531 -f 76/125/532 108/158/533 109/159/534 -f 110/160/535 78/127/536 77/126/537 -f 77/126/538 109/159/539 110/160/540 -f 111/161/541 79/128/542 78/127/543 -f 78/127/544 110/160/545 111/161/546 -f 112/162/547 80/129/548 79/128/549 -f 79/128/550 111/161/551 112/162/552 -f 113/163/553 81/130/554 80/129/555 -f 80/129/556 112/162/557 113/163/558 -f 114/164/559 82/131/560 81/130/561 -f 81/130/562 113/163/563 114/164/564 -f 115/165/565 83/132/566 82/131/567 -f 82/131/568 114/164/569 115/165/570 -f 116/166/571 84/133/572 83/132/573 -f 83/132/574 115/165/575 116/166/576 -f 117/167/577 85/134/578 84/133/579 -f 84/133/580 116/166/581 117/167/582 -f 118/168/583 86/135/584 85/134/585 -f 85/134/586 117/167/587 118/168/588 -f 119/169/589 87/136/590 86/135/591 -f 86/135/592 118/168/593 119/169/594 -f 120/170/595 88/137/596 87/136/597 -f 87/136/598 119/169/599 120/170/600 -f 121/171/601 89/138/602 88/137/603 -f 88/137/604 120/170/605 121/171/606 -f 122/172/607 90/139/608 89/138/609 -f 89/138/610 121/171/611 122/172/612 -f 123/173/613 91/140/614 90/139/615 -f 90/139/616 122/172/617 123/173/618 -f 124/174/619 92/141/620 91/140/621 -f 91/140/622 123/173/623 124/174/624 -f 125/175/625 93/142/626 92/141/627 -f 92/141/628 124/174/629 125/175/630 -f 126/176/631 94/143/632 93/142/633 -f 93/142/634 125/175/635 126/176/636 -f 127/177/637 95/144/638 94/143/639 -f 94/143/640 126/176/641 127/177/642 -f 128/178/643 96/145/644 95/144/645 -f 95/144/646 127/177/647 128/178/648 -f 129/179/649 97/146/650 96/145/651 -f 96/145/652 128/178/653 129/179/654 -f 130/180/655 98/147/656 97/146/657 -f 97/146/658 129/179/659 130/180/660 -f 131/181/661 99/148/662 98/147/663 -f 98/147/664 130/180/665 131/181/666 -f 132/182/667 100/149/668 99/148/669 -f 99/148/670 131/181/671 132/182/672 -f 133/183/673 101/150/674 100/149/675 -f 100/149/676 132/182/677 133/183/678 -f 134/184/679 102/151/680 101/150/681 -f 101/150/682 133/183/683 134/184/684 -f 135/185/685 103/152/686 102/151/687 -f 102/151/688 134/184/689 135/185/690 -f 136/186/691 104/153/692 103/152/693 -f 103/152/694 135/185/695 136/186/696 -f 137/187/697 105/154/698 104/153/699 -f 104/153/700 136/186/701 137/187/702 -f 106/188/703 74/155/704 105/154/705 -f 105/154/706 137/187/707 106/188/708 -f 139/190/709 107/157/710 106/156/711 -f 106/156/712 138/189/713 139/190/714 -f 140/191/715 108/158/716 107/157/717 -f 107/157/718 139/190/719 140/191/720 -f 141/192/721 109/159/722 108/158/723 -f 108/158/724 140/191/725 141/192/726 -f 142/193/727 110/160/728 109/159/729 -f 109/159/730 141/192/731 142/193/732 -f 143/194/733 111/161/734 110/160/735 -f 110/160/736 142/193/737 143/194/738 -f 144/195/739 112/162/740 111/161/741 -f 111/161/742 143/194/743 144/195/744 -f 145/196/745 113/163/746 112/162/747 -f 112/162/748 144/195/749 145/196/750 -f 146/197/751 114/164/752 113/163/753 -f 113/163/754 145/196/755 146/197/756 -f 147/198/757 115/165/758 114/164/759 -f 114/164/760 146/197/761 147/198/762 -f 148/199/763 116/166/764 115/165/765 -f 115/165/766 147/198/767 148/199/768 -f 149/200/769 117/167/770 116/166/771 -f 116/166/772 148/199/773 149/200/774 -f 150/201/775 118/168/776 117/167/777 -f 117/167/778 149/200/779 150/201/780 -f 151/202/781 119/169/782 118/168/783 -f 118/168/784 150/201/785 151/202/786 -f 152/203/787 120/170/788 119/169/789 -f 119/169/790 151/202/791 152/203/792 -f 153/204/793 121/171/794 120/170/795 -f 120/170/796 152/203/797 153/204/798 -f 154/205/799 122/172/800 121/171/801 -f 121/171/802 153/204/803 154/205/804 -f 155/206/805 123/173/806 122/172/807 -f 122/172/808 154/205/809 155/206/810 -f 156/207/811 124/174/812 123/173/813 -f 123/173/814 155/206/815 156/207/816 -f 157/208/817 125/175/818 124/174/819 -f 124/174/820 156/207/821 157/208/822 -f 158/209/823 126/176/824 125/175/825 -f 125/175/826 157/208/827 158/209/828 -f 159/210/829 127/177/830 126/176/831 -f 126/176/832 158/209/833 159/210/834 -f 160/211/835 128/178/836 127/177/837 -f 127/177/838 159/210/839 160/211/840 -f 161/212/841 129/179/842 128/178/843 -f 128/178/844 160/211/845 161/212/846 -f 162/213/847 130/180/848 129/179/849 -f 129/179/850 161/212/851 162/213/852 -f 163/214/853 131/181/854 130/180/855 -f 130/180/856 162/213/857 163/214/858 -f 164/215/859 132/182/860 131/181/861 -f 131/181/862 163/214/863 164/215/864 -f 165/216/865 133/183/866 132/182/867 -f 132/182/868 164/215/869 165/216/870 -f 166/217/871 134/184/872 133/183/873 -f 133/183/874 165/216/875 166/217/876 -f 167/218/877 135/185/878 134/184/879 -f 134/184/880 166/217/881 167/218/882 -f 168/219/883 136/186/884 135/185/885 -f 135/185/886 167/218/887 168/219/888 -f 169/220/889 137/187/890 136/186/891 -f 136/186/892 168/219/893 169/220/894 -f 138/221/895 106/188/896 137/187/897 -f 137/187/898 169/220/899 138/221/900 -f 171/223/901 139/190/902 138/189/903 -f 138/189/904 170/222/905 171/223/906 -f 172/224/907 140/191/908 139/190/909 -f 139/190/910 171/223/911 172/224/912 -f 173/225/913 141/192/914 140/191/915 -f 140/191/916 172/224/917 173/225/918 -f 174/226/919 142/193/920 141/192/921 -f 141/192/922 173/225/923 174/226/924 -f 175/227/925 143/194/926 142/193/927 -f 142/193/928 174/226/929 175/227/930 -f 176/228/931 144/195/932 143/194/933 -f 143/194/934 175/227/935 176/228/936 -f 177/229/937 145/196/938 144/195/939 -f 144/195/940 176/228/941 177/229/942 -f 178/230/943 146/197/944 145/196/945 -f 145/196/946 177/229/947 178/230/948 -f 179/231/949 147/198/950 146/197/951 -f 146/197/952 178/230/953 179/231/954 -f 180/232/955 148/199/956 147/198/957 -f 147/198/958 179/231/959 180/232/960 -f 181/233/961 149/200/962 148/199/963 -f 148/199/964 180/232/965 181/233/966 -f 182/234/967 150/201/968 149/200/969 -f 149/200/970 181/233/971 182/234/972 -f 183/235/973 151/202/974 150/201/975 -f 150/201/976 182/234/977 183/235/978 -f 184/236/979 152/203/980 151/202/981 -f 151/202/982 183/235/983 184/236/984 -f 185/237/985 153/204/986 152/203/987 -f 152/203/988 184/236/989 185/237/990 -f 186/238/991 154/205/992 153/204/993 -f 153/204/994 185/237/995 186/238/996 -f 187/239/997 155/206/998 154/205/999 -f 154/205/1000 186/238/1001 187/239/1002 -f 188/240/1003 156/207/1004 155/206/1005 -f 155/206/1006 187/239/1007 188/240/1008 -f 189/241/1009 157/208/1010 156/207/1011 -f 156/207/1012 188/240/1013 189/241/1014 -f 190/242/1015 158/209/1016 157/208/1017 -f 157/208/1018 189/241/1019 190/242/1020 -f 191/243/1021 159/210/1022 158/209/1023 -f 158/209/1024 190/242/1025 191/243/1026 -f 192/244/1027 160/211/1028 159/210/1029 -f 159/210/1030 191/243/1031 192/244/1032 -f 193/245/1033 161/212/1034 160/211/1035 -f 160/211/1036 192/244/1037 193/245/1038 -f 194/246/1039 162/213/1040 161/212/1041 -f 161/212/1042 193/245/1043 194/246/1044 -f 195/247/1045 163/214/1046 162/213/1047 -f 162/213/1048 194/246/1049 195/247/1050 -f 196/248/1051 164/215/1052 163/214/1053 -f 163/214/1054 195/247/1055 196/248/1056 -f 197/249/1057 165/216/1058 164/215/1059 -f 164/215/1060 196/248/1061 197/249/1062 -f 198/250/1063 166/217/1064 165/216/1065 -f 165/216/1066 197/249/1067 198/250/1068 -f 199/251/1069 167/218/1070 166/217/1071 -f 166/217/1072 198/250/1073 199/251/1074 -f 200/252/1075 168/219/1076 167/218/1077 -f 167/218/1078 199/251/1079 200/252/1080 -f 201/253/1081 169/220/1082 168/219/1083 -f 168/219/1084 200/252/1085 201/253/1086 -f 170/254/1087 138/221/1088 169/220/1089 -f 169/220/1090 201/253/1091 170/254/1092 -f 203/256/1093 171/223/1094 170/222/1095 -f 170/222/1096 202/255/1097 203/256/1098 -f 204/257/1099 172/224/1100 171/223/1101 -f 171/223/1102 203/256/1103 204/257/1104 -f 205/258/1105 173/225/1106 172/224/1107 -f 172/224/1108 204/257/1109 205/258/1110 -f 206/259/1111 174/226/1112 173/225/1113 -f 173/225/1114 205/258/1115 206/259/1116 -f 207/260/1117 175/227/1118 174/226/1119 -f 174/226/1120 206/259/1121 207/260/1122 -f 208/261/1123 176/228/1124 175/227/1125 -f 175/227/1126 207/260/1127 208/261/1128 -f 209/262/1129 177/229/1130 176/228/1131 -f 176/228/1132 208/261/1133 209/262/1134 -f 210/263/1135 178/230/1136 177/229/1137 -f 177/229/1138 209/262/1139 210/263/1140 -f 211/264/1141 179/231/1142 178/230/1143 -f 178/230/1144 210/263/1145 211/264/1146 -f 212/265/1147 180/232/1148 179/231/1149 -f 179/231/1150 211/264/1151 212/265/1152 -f 213/266/1153 181/233/1154 180/232/1155 -f 180/232/1156 212/265/1157 213/266/1158 -f 214/267/1159 182/234/1160 181/233/1161 -f 181/233/1162 213/266/1163 214/267/1164 -f 215/268/1165 183/235/1166 182/234/1167 -f 182/234/1168 214/267/1169 215/268/1170 -f 216/269/1171 184/236/1172 183/235/1173 -f 183/235/1174 215/268/1175 216/269/1176 -f 217/270/1177 185/237/1178 184/236/1179 -f 184/236/1180 216/269/1181 217/270/1182 -f 218/271/1183 186/238/1184 185/237/1185 -f 185/237/1186 217/270/1187 218/271/1188 -f 219/272/1189 187/239/1190 186/238/1191 -f 186/238/1192 218/271/1193 219/272/1194 -f 220/273/1195 188/240/1196 187/239/1197 -f 187/239/1198 219/272/1199 220/273/1200 -f 221/274/1201 189/241/1202 188/240/1203 -f 188/240/1204 220/273/1205 221/274/1206 -f 222/275/1207 190/242/1208 189/241/1209 -f 189/241/1210 221/274/1211 222/275/1212 -f 223/276/1213 191/243/1214 190/242/1215 -f 190/242/1216 222/275/1217 223/276/1218 -f 224/277/1219 192/244/1220 191/243/1221 -f 191/243/1222 223/276/1223 224/277/1224 -f 225/278/1225 193/245/1226 192/244/1227 -f 192/244/1228 224/277/1229 225/278/1230 -f 226/279/1231 194/246/1232 193/245/1233 -f 193/245/1234 225/278/1235 226/279/1236 -f 227/280/1237 195/247/1238 194/246/1239 -f 194/246/1240 226/279/1241 227/280/1242 -f 228/281/1243 196/248/1244 195/247/1245 -f 195/247/1246 227/280/1247 228/281/1248 -f 229/282/1249 197/249/1250 196/248/1251 -f 196/248/1252 228/281/1253 229/282/1254 -f 230/283/1255 198/250/1256 197/249/1257 -f 197/249/1258 229/282/1259 230/283/1260 -f 231/284/1261 199/251/1262 198/250/1263 -f 198/250/1264 230/283/1265 231/284/1266 -f 232/285/1267 200/252/1268 199/251/1269 -f 199/251/1270 231/284/1271 232/285/1272 -f 233/286/1273 201/253/1274 200/252/1275 -f 200/252/1276 232/285/1277 233/286/1278 -f 202/287/1279 170/254/1280 201/253/1281 -f 201/253/1282 233/286/1283 202/287/1284 -f 235/289/1285 203/256/1286 202/255/1287 -f 202/255/1288 234/288/1289 235/289/1290 -f 236/290/1291 204/257/1292 203/256/1293 -f 203/256/1294 235/289/1295 236/290/1296 -f 237/291/1297 205/258/1298 204/257/1299 -f 204/257/1300 236/290/1301 237/291/1302 -f 238/292/1303 206/259/1304 205/258/1305 -f 205/258/1306 237/291/1307 238/292/1308 -f 239/293/1309 207/260/1310 206/259/1311 -f 206/259/1312 238/292/1313 239/293/1314 -f 240/294/1315 208/261/1316 207/260/1317 -f 207/260/1318 239/293/1319 240/294/1320 -f 241/295/1321 209/262/1322 208/261/1323 -f 208/261/1324 240/294/1325 241/295/1326 -f 242/296/1327 210/263/1328 209/262/1329 -f 209/262/1330 241/295/1331 242/296/1332 -f 243/297/1333 211/264/1334 210/263/1335 -f 210/263/1336 242/296/1337 243/297/1338 -f 244/298/1339 212/265/1340 211/264/1341 -f 211/264/1342 243/297/1343 244/298/1344 -f 245/299/1345 213/266/1346 212/265/1347 -f 212/265/1348 244/298/1349 245/299/1350 -f 246/300/1351 214/267/1352 213/266/1353 -f 213/266/1354 245/299/1355 246/300/1356 -f 247/301/1357 215/268/1358 214/267/1359 -f 214/267/1360 246/300/1361 247/301/1362 -f 248/302/1363 216/269/1364 215/268/1365 -f 215/268/1366 247/301/1367 248/302/1368 -f 249/303/1369 217/270/1370 216/269/1371 -f 216/269/1372 248/302/1373 249/303/1374 -f 250/304/1375 218/271/1376 217/270/1377 -f 217/270/1378 249/303/1379 250/304/1380 -f 251/305/1381 219/272/1382 218/271/1383 -f 218/271/1384 250/304/1385 251/305/1386 -f 252/306/1387 220/273/1388 219/272/1389 -f 219/272/1390 251/305/1391 252/306/1392 -f 253/307/1393 221/274/1394 220/273/1395 -f 220/273/1396 252/306/1397 253/307/1398 -f 254/308/1399 222/275/1400 221/274/1401 -f 221/274/1402 253/307/1403 254/308/1404 -f 255/309/1405 223/276/1406 222/275/1407 -f 222/275/1408 254/308/1409 255/309/1410 -f 256/310/1411 224/277/1412 223/276/1413 -f 223/276/1414 255/309/1415 256/310/1416 -f 257/311/1417 225/278/1418 224/277/1419 -f 224/277/1420 256/310/1421 257/311/1422 -f 258/312/1423 226/279/1424 225/278/1425 -f 225/278/1426 257/311/1427 258/312/1428 -f 259/313/1429 227/280/1430 226/279/1431 -f 226/279/1432 258/312/1433 259/313/1434 -f 260/314/1435 228/281/1436 227/280/1437 -f 227/280/1438 259/313/1439 260/314/1440 -f 261/315/1441 229/282/1442 228/281/1443 -f 228/281/1444 260/314/1445 261/315/1446 -f 262/316/1447 230/283/1448 229/282/1449 -f 229/282/1450 261/315/1451 262/316/1452 -f 263/317/1453 231/284/1454 230/283/1455 -f 230/283/1456 262/316/1457 263/317/1458 -f 264/318/1459 232/285/1460 231/284/1461 -f 231/284/1462 263/317/1463 264/318/1464 -f 265/319/1465 233/286/1466 232/285/1467 -f 232/285/1468 264/318/1469 265/319/1470 -f 234/320/1471 202/287/1472 233/286/1473 -f 233/286/1474 265/319/1475 234/320/1476 -f 267/322/1477 235/289/1478 234/288/1479 -f 234/288/1480 266/321/1481 267/322/1482 -f 268/323/1483 236/290/1484 235/289/1485 -f 235/289/1486 267/322/1487 268/323/1488 -f 269/324/1489 237/291/1490 236/290/1491 -f 236/290/1492 268/323/1493 269/324/1494 -f 270/325/1495 238/292/1496 237/291/1497 -f 237/291/1498 269/324/1499 270/325/1500 -f 271/326/1501 239/293/1502 238/292/1503 -f 238/292/1504 270/325/1505 271/326/1506 -f 272/327/1507 240/294/1508 239/293/1509 -f 239/293/1510 271/326/1511 272/327/1512 -f 273/328/1513 241/295/1514 240/294/1515 -f 240/294/1516 272/327/1517 273/328/1518 -f 274/329/1519 242/296/1520 241/295/1521 -f 241/295/1522 273/328/1523 274/329/1524 -f 275/330/1525 243/297/1526 242/296/1527 -f 242/296/1528 274/329/1529 275/330/1530 -f 276/331/1531 244/298/1532 243/297/1533 -f 243/297/1534 275/330/1535 276/331/1536 -f 277/332/1537 245/299/1538 244/298/1539 -f 244/298/1540 276/331/1541 277/332/1542 -f 278/333/1543 246/300/1544 245/299/1545 -f 245/299/1546 277/332/1547 278/333/1548 -f 279/334/1549 247/301/1550 246/300/1551 -f 246/300/1552 278/333/1553 279/334/1554 -f 280/335/1555 248/302/1556 247/301/1557 -f 247/301/1558 279/334/1559 280/335/1560 -f 281/336/1561 249/303/1562 248/302/1563 -f 248/302/1564 280/335/1565 281/336/1566 -f 282/337/1567 250/304/1568 249/303/1569 -f 249/303/1570 281/336/1571 282/337/1572 -f 283/338/1573 251/305/1574 250/304/1575 -f 250/304/1576 282/337/1577 283/338/1578 -f 284/339/1579 252/306/1580 251/305/1581 -f 251/305/1582 283/338/1583 284/339/1584 -f 285/340/1585 253/307/1586 252/306/1587 -f 252/306/1588 284/339/1589 285/340/1590 -f 286/341/1591 254/308/1592 253/307/1593 -f 253/307/1594 285/340/1595 286/341/1596 -f 287/342/1597 255/309/1598 254/308/1599 -f 254/308/1600 286/341/1601 287/342/1602 -f 288/343/1603 256/310/1604 255/309/1605 -f 255/309/1606 287/342/1607 288/343/1608 -f 289/344/1609 257/311/1610 256/310/1611 -f 256/310/1612 288/343/1613 289/344/1614 -f 290/345/1615 258/312/1616 257/311/1617 -f 257/311/1618 289/344/1619 290/345/1620 -f 291/346/1621 259/313/1622 258/312/1623 -f 258/312/1624 290/345/1625 291/346/1626 -f 292/347/1627 260/314/1628 259/313/1629 -f 259/313/1630 291/346/1631 292/347/1632 -f 293/348/1633 261/315/1634 260/314/1635 -f 260/314/1636 292/347/1637 293/348/1638 -f 294/349/1639 262/316/1640 261/315/1641 -f 261/315/1642 293/348/1643 294/349/1644 -f 295/350/1645 263/317/1646 262/316/1647 -f 262/316/1648 294/349/1649 295/350/1650 -f 296/351/1651 264/318/1652 263/317/1653 -f 263/317/1654 295/350/1655 296/351/1656 -f 297/352/1657 265/319/1658 264/318/1659 -f 264/318/1660 296/351/1661 297/352/1662 -f 266/353/1663 234/320/1664 265/319/1665 -f 265/319/1666 297/352/1667 266/353/1668 -f 299/355/1669 267/322/1670 266/321/1671 -f 266/321/1672 298/354/1673 299/355/1674 -f 300/356/1675 268/323/1676 267/322/1677 -f 267/322/1678 299/355/1679 300/356/1680 -f 301/357/1681 269/324/1682 268/323/1683 -f 268/323/1684 300/356/1685 301/357/1686 -f 302/358/1687 270/325/1688 269/324/1689 -f 269/324/1690 301/357/1691 302/358/1692 -f 303/359/1693 271/326/1694 270/325/1695 -f 270/325/1696 302/358/1697 303/359/1698 -f 304/360/1699 272/327/1700 271/326/1701 -f 271/326/1702 303/359/1703 304/360/1704 -f 305/361/1705 273/328/1706 272/327/1707 -f 272/327/1708 304/360/1709 305/361/1710 -f 306/362/1711 274/329/1712 273/328/1713 -f 273/328/1714 305/361/1715 306/362/1716 -f 307/363/1717 275/330/1718 274/329/1719 -f 274/329/1720 306/362/1721 307/363/1722 -f 308/364/1723 276/331/1724 275/330/1725 -f 275/330/1726 307/363/1727 308/364/1728 -f 309/365/1729 277/332/1730 276/331/1731 -f 276/331/1732 308/364/1733 309/365/1734 -f 310/366/1735 278/333/1736 277/332/1737 -f 277/332/1738 309/365/1739 310/366/1740 -f 311/367/1741 279/334/1742 278/333/1743 -f 278/333/1744 310/366/1745 311/367/1746 -f 312/368/1747 280/335/1748 279/334/1749 -f 279/334/1750 311/367/1751 312/368/1752 -f 313/369/1753 281/336/1754 280/335/1755 -f 280/335/1756 312/368/1757 313/369/1758 -f 314/370/1759 282/337/1760 281/336/1761 -f 281/336/1762 313/369/1763 314/370/1764 -f 315/371/1765 283/338/1766 282/337/1767 -f 282/337/1768 314/370/1769 315/371/1770 -f 316/372/1771 284/339/1772 283/338/1773 -f 283/338/1774 315/371/1775 316/372/1776 -f 317/373/1777 285/340/1778 284/339/1779 -f 284/339/1780 316/372/1781 317/373/1782 -f 318/374/1783 286/341/1784 285/340/1785 -f 285/340/1786 317/373/1787 318/374/1788 -f 319/375/1789 287/342/1790 286/341/1791 -f 286/341/1792 318/374/1793 319/375/1794 -f 320/376/1795 288/343/1796 287/342/1797 -f 287/342/1798 319/375/1799 320/376/1800 -f 321/377/1801 289/344/1802 288/343/1803 -f 288/343/1804 320/376/1805 321/377/1806 -f 322/378/1807 290/345/1808 289/344/1809 -f 289/344/1810 321/377/1811 322/378/1812 -f 323/379/1813 291/346/1814 290/345/1815 -f 290/345/1816 322/378/1817 323/379/1818 -f 324/380/1819 292/347/1820 291/346/1821 -f 291/346/1822 323/379/1823 324/380/1824 -f 325/381/1825 293/348/1826 292/347/1827 -f 292/347/1828 324/380/1829 325/381/1830 -f 326/382/1831 294/349/1832 293/348/1833 -f 293/348/1834 325/381/1835 326/382/1836 -f 327/383/1837 295/350/1838 294/349/1839 -f 294/349/1840 326/382/1841 327/383/1842 -f 328/384/1843 296/351/1844 295/350/1845 -f 295/350/1846 327/383/1847 328/384/1848 -f 329/385/1849 297/352/1850 296/351/1851 -f 296/351/1852 328/384/1853 329/385/1854 -f 298/386/1855 266/353/1856 297/352/1857 -f 297/352/1858 329/385/1859 298/386/1860 -f 331/388/1861 299/355/1862 298/354/1863 -f 298/354/1864 330/387/1865 331/388/1866 -f 332/389/1867 300/356/1868 299/355/1869 -f 299/355/1870 331/388/1871 332/389/1872 -f 333/390/1873 301/357/1874 300/356/1875 -f 300/356/1876 332/389/1877 333/390/1878 -f 334/391/1879 302/358/1880 301/357/1881 -f 301/357/1882 333/390/1883 334/391/1884 -f 335/392/1885 303/359/1886 302/358/1887 -f 302/358/1888 334/391/1889 335/392/1890 -f 336/393/1891 304/360/1892 303/359/1893 -f 303/359/1894 335/392/1895 336/393/1896 -f 337/394/1897 305/361/1898 304/360/1899 -f 304/360/1900 336/393/1901 337/394/1902 -f 338/395/1903 306/362/1904 305/361/1905 -f 305/361/1906 337/394/1907 338/395/1908 -f 339/396/1909 307/363/1910 306/362/1911 -f 306/362/1912 338/395/1913 339/396/1914 -f 340/397/1915 308/364/1916 307/363/1917 -f 307/363/1918 339/396/1919 340/397/1920 -f 341/398/1921 309/365/1922 308/364/1923 -f 308/364/1924 340/397/1925 341/398/1926 -f 342/399/1927 310/366/1928 309/365/1929 -f 309/365/1930 341/398/1931 342/399/1932 -f 343/400/1933 311/367/1934 310/366/1935 -f 310/366/1936 342/399/1937 343/400/1938 -f 344/401/1939 312/368/1940 311/367/1941 -f 311/367/1942 343/400/1943 344/401/1944 -f 345/402/1945 313/369/1946 312/368/1947 -f 312/368/1948 344/401/1949 345/402/1950 -f 346/403/1951 314/370/1952 313/369/1953 -f 313/369/1954 345/402/1955 346/403/1956 -f 347/404/1957 315/371/1958 314/370/1959 -f 314/370/1960 346/403/1961 347/404/1962 -f 348/405/1963 316/372/1964 315/371/1965 -f 315/371/1966 347/404/1967 348/405/1968 -f 349/406/1969 317/373/1970 316/372/1971 -f 316/372/1972 348/405/1973 349/406/1974 -f 350/407/1975 318/374/1976 317/373/1977 -f 317/373/1978 349/406/1979 350/407/1980 -f 351/408/1981 319/375/1982 318/374/1983 -f 318/374/1984 350/407/1985 351/408/1986 -f 352/409/1987 320/376/1988 319/375/1989 -f 319/375/1990 351/408/1991 352/409/1992 -f 353/410/1993 321/377/1994 320/376/1995 -f 320/376/1996 352/409/1997 353/410/1998 -f 354/411/1999 322/378/2000 321/377/2001 -f 321/377/2002 353/410/2003 354/411/2004 -f 355/412/2005 323/379/2006 322/378/2007 -f 322/378/2008 354/411/2009 355/412/2010 -f 356/413/2011 324/380/2012 323/379/2013 -f 323/379/2014 355/412/2015 356/413/2016 -f 357/414/2017 325/381/2018 324/380/2019 -f 324/380/2020 356/413/2021 357/414/2022 -f 358/415/2023 326/382/2024 325/381/2025 -f 325/381/2026 357/414/2027 358/415/2028 -f 359/416/2029 327/383/2030 326/382/2031 -f 326/382/2032 358/415/2033 359/416/2034 -f 360/417/2035 328/384/2036 327/383/2037 -f 327/383/2038 359/416/2039 360/417/2040 -f 361/418/2041 329/385/2042 328/384/2043 -f 328/384/2044 360/417/2045 361/418/2046 -f 330/419/2047 298/386/2048 329/385/2049 -f 329/385/2050 361/418/2051 330/419/2052 -f 363/421/2053 331/388/2054 330/387/2055 -f 330/387/2056 362/420/2057 363/421/2058 -f 364/422/2059 332/389/2060 331/388/2061 -f 331/388/2062 363/421/2063 364/422/2064 -f 365/423/2065 333/390/2066 332/389/2067 -f 332/389/2068 364/422/2069 365/423/2070 -f 366/424/2071 334/391/2072 333/390/2073 -f 333/390/2074 365/423/2075 366/424/2076 -f 367/425/2077 335/392/2078 334/391/2079 -f 334/391/2080 366/424/2081 367/425/2082 -f 368/426/2083 336/393/2084 335/392/2085 -f 335/392/2086 367/425/2087 368/426/2088 -f 369/427/2089 337/394/2090 336/393/2091 -f 336/393/2092 368/426/2093 369/427/2094 -f 370/428/2095 338/395/2096 337/394/2097 -f 337/394/2098 369/427/2099 370/428/2100 -f 371/429/2101 339/396/2102 338/395/2103 -f 338/395/2104 370/428/2105 371/429/2106 -f 372/430/2107 340/397/2108 339/396/2109 -f 339/396/2110 371/429/2111 372/430/2112 -f 373/431/2113 341/398/2114 340/397/2115 -f 340/397/2116 372/430/2117 373/431/2118 -f 374/432/2119 342/399/2120 341/398/2121 -f 341/398/2122 373/431/2123 374/432/2124 -f 375/433/2125 343/400/2126 342/399/2127 -f 342/399/2128 374/432/2129 375/433/2130 -f 376/434/2131 344/401/2132 343/400/2133 -f 343/400/2134 375/433/2135 376/434/2136 -f 377/435/2137 345/402/2138 344/401/2139 -f 344/401/2140 376/434/2141 377/435/2142 -f 378/436/2143 346/403/2144 345/402/2145 -f 345/402/2146 377/435/2147 378/436/2148 -f 379/437/2149 347/404/2150 346/403/2151 -f 346/403/2152 378/436/2153 379/437/2154 -f 380/438/2155 348/405/2156 347/404/2157 -f 347/404/2158 379/437/2159 380/438/2160 -f 381/439/2161 349/406/2162 348/405/2163 -f 348/405/2164 380/438/2165 381/439/2166 -f 382/440/2167 350/407/2168 349/406/2169 -f 349/406/2170 381/439/2171 382/440/2172 -f 383/441/2173 351/408/2174 350/407/2175 -f 350/407/2176 382/440/2177 383/441/2178 -f 384/442/2179 352/409/2180 351/408/2181 -f 351/408/2182 383/441/2183 384/442/2184 -f 385/443/2185 353/410/2186 352/409/2187 -f 352/409/2188 384/442/2189 385/443/2190 -f 386/444/2191 354/411/2192 353/410/2193 -f 353/410/2194 385/443/2195 386/444/2196 -f 387/445/2197 355/412/2198 354/411/2199 -f 354/411/2200 386/444/2201 387/445/2202 -f 388/446/2203 356/413/2204 355/412/2205 -f 355/412/2206 387/445/2207 388/446/2208 -f 389/447/2209 357/414/2210 356/413/2211 -f 356/413/2212 388/446/2213 389/447/2214 -f 390/448/2215 358/415/2216 357/414/2217 -f 357/414/2218 389/447/2219 390/448/2220 -f 391/449/2221 359/416/2222 358/415/2223 -f 358/415/2224 390/448/2225 391/449/2226 -f 392/450/2227 360/417/2228 359/416/2229 -f 359/416/2230 391/449/2231 392/450/2232 -f 393/451/2233 361/418/2234 360/417/2235 -f 360/417/2236 392/450/2237 393/451/2238 -f 362/452/2239 330/419/2240 361/418/2241 -f 361/418/2242 393/451/2243 362/452/2244 -f 395/454/2245 363/421/2246 362/420/2247 -f 362/420/2248 394/453/2249 395/454/2250 -f 396/455/2251 364/422/2252 363/421/2253 -f 363/421/2254 395/454/2255 396/455/2256 -f 397/456/2257 365/423/2258 364/422/2259 -f 364/422/2260 396/455/2261 397/456/2262 -f 398/457/2263 366/424/2264 365/423/2265 -f 365/423/2266 397/456/2267 398/457/2268 -f 399/458/2269 367/425/2270 366/424/2271 -f 366/424/2272 398/457/2273 399/458/2274 -f 400/459/2275 368/426/2276 367/425/2277 -f 367/425/2278 399/458/2279 400/459/2280 -f 401/460/2281 369/427/2282 368/426/2283 -f 368/426/2284 400/459/2285 401/460/2286 -f 402/461/2287 370/428/2288 369/427/2289 -f 369/427/2290 401/460/2291 402/461/2292 -f 403/462/2293 371/429/2294 370/428/2295 -f 370/428/2296 402/461/2297 403/462/2298 -f 404/463/2299 372/430/2300 371/429/2301 -f 371/429/2302 403/462/2303 404/463/2304 -f 405/464/2305 373/431/2306 372/430/2307 -f 372/430/2308 404/463/2309 405/464/2310 -f 406/465/2311 374/432/2312 373/431/2313 -f 373/431/2314 405/464/2315 406/465/2316 -f 407/466/2317 375/433/2318 374/432/2319 -f 374/432/2320 406/465/2321 407/466/2322 -f 408/467/2323 376/434/2324 375/433/2325 -f 375/433/2326 407/466/2327 408/467/2328 -f 409/468/2329 377/435/2330 376/434/2331 -f 376/434/2332 408/467/2333 409/468/2334 -f 410/469/2335 378/436/2336 377/435/2337 -f 377/435/2338 409/468/2339 410/469/2340 -f 411/470/2341 379/437/2342 378/436/2343 -f 378/436/2344 410/469/2345 411/470/2346 -f 412/471/2347 380/438/2348 379/437/2349 -f 379/437/2350 411/470/2351 412/471/2352 -f 413/472/2353 381/439/2354 380/438/2355 -f 380/438/2356 412/471/2357 413/472/2358 -f 414/473/2359 382/440/2360 381/439/2361 -f 381/439/2362 413/472/2363 414/473/2364 -f 415/474/2365 383/441/2366 382/440/2367 -f 382/440/2368 414/473/2369 415/474/2370 -f 416/475/2371 384/442/2372 383/441/2373 -f 383/441/2374 415/474/2375 416/475/2376 -f 417/476/2377 385/443/2378 384/442/2379 -f 384/442/2380 416/475/2381 417/476/2382 -f 418/477/2383 386/444/2384 385/443/2385 -f 385/443/2386 417/476/2387 418/477/2388 -f 419/478/2389 387/445/2390 386/444/2391 -f 386/444/2392 418/477/2393 419/478/2394 -f 420/479/2395 388/446/2396 387/445/2397 -f 387/445/2398 419/478/2399 420/479/2400 -f 421/480/2401 389/447/2402 388/446/2403 -f 388/446/2404 420/479/2405 421/480/2406 -f 422/481/2407 390/448/2408 389/447/2409 -f 389/447/2410 421/480/2411 422/481/2412 -f 423/482/2413 391/449/2414 390/448/2415 -f 390/448/2416 422/481/2417 423/482/2418 -f 424/483/2419 392/450/2420 391/449/2421 -f 391/449/2422 423/482/2423 424/483/2424 -f 425/484/2425 393/451/2426 392/450/2427 -f 392/450/2428 424/483/2429 425/484/2430 -f 394/485/2431 362/452/2432 393/451/2433 -f 393/451/2434 425/484/2435 394/485/2436 -f 427/487/2437 395/454/2438 394/453/2439 -f 394/453/2440 426/486/2441 427/487/2442 -f 428/488/2443 396/455/2444 395/454/2445 -f 395/454/2446 427/487/2447 428/488/2448 -f 429/489/2449 397/456/2450 396/455/2451 -f 396/455/2452 428/488/2453 429/489/2454 -f 430/490/2455 398/457/2456 397/456/2457 -f 397/456/2458 429/489/2459 430/490/2460 -f 431/491/2461 399/458/2462 398/457/2463 -f 398/457/2464 430/490/2465 431/491/2466 -f 432/492/2467 400/459/2468 399/458/2469 -f 399/458/2470 431/491/2471 432/492/2472 -f 433/493/2473 401/460/2474 400/459/2475 -f 400/459/2476 432/492/2477 433/493/2478 -f 434/494/2479 402/461/2480 401/460/2481 -f 401/460/2482 433/493/2483 434/494/2484 -f 435/495/2485 403/462/2486 402/461/2487 -f 402/461/2488 434/494/2489 435/495/2490 -f 436/496/2491 404/463/2492 403/462/2493 -f 403/462/2494 435/495/2495 436/496/2496 -f 437/497/2497 405/464/2498 404/463/2499 -f 404/463/2500 436/496/2501 437/497/2502 -f 438/498/2503 406/465/2504 405/464/2505 -f 405/464/2506 437/497/2507 438/498/2508 -f 439/499/2509 407/466/2510 406/465/2511 -f 406/465/2512 438/498/2513 439/499/2514 -f 440/500/2515 408/467/2516 407/466/2517 -f 407/466/2518 439/499/2519 440/500/2520 -f 441/501/2521 409/468/2522 408/467/2523 -f 408/467/2524 440/500/2525 441/501/2526 -f 442/502/2527 410/469/2528 409/468/2529 -f 409/468/2530 441/501/2531 442/502/2532 -f 443/503/2533 411/470/2534 410/469/2535 -f 410/469/2536 442/502/2537 443/503/2538 -f 444/504/2539 412/471/2540 411/470/2541 -f 411/470/2542 443/503/2543 444/504/2544 -f 445/505/2545 413/472/2546 412/471/2547 -f 412/471/2548 444/504/2549 445/505/2550 -f 446/506/2551 414/473/2552 413/472/2553 -f 413/472/2554 445/505/2555 446/506/2556 -f 447/507/2557 415/474/2558 414/473/2559 -f 414/473/2560 446/506/2561 447/507/2562 -f 448/508/2563 416/475/2564 415/474/2565 -f 415/474/2566 447/507/2567 448/508/2568 -f 449/509/2569 417/476/2570 416/475/2571 -f 416/475/2572 448/508/2573 449/509/2574 -f 450/510/2575 418/477/2576 417/476/2577 -f 417/476/2578 449/509/2579 450/510/2580 -f 451/511/2581 419/478/2582 418/477/2583 -f 418/477/2584 450/510/2585 451/511/2586 -f 452/512/2587 420/479/2588 419/478/2589 -f 419/478/2590 451/511/2591 452/512/2592 -f 453/513/2593 421/480/2594 420/479/2595 -f 420/479/2596 452/512/2597 453/513/2598 -f 454/514/2599 422/481/2600 421/480/2601 -f 421/480/2602 453/513/2603 454/514/2604 -f 455/515/2605 423/482/2606 422/481/2607 -f 422/481/2608 454/514/2609 455/515/2610 -f 456/516/2611 424/483/2612 423/482/2613 -f 423/482/2614 455/515/2615 456/516/2616 -f 457/517/2617 425/484/2618 424/483/2619 -f 424/483/2620 456/516/2621 457/517/2622 -f 426/518/2623 394/485/2624 425/484/2625 -f 425/484/2626 457/517/2627 426/518/2628 -f 459/520/2629 427/487/2630 426/486/2631 -f 426/486/2632 458/519/2633 459/520/2634 -f 460/521/2635 428/488/2636 427/487/2637 -f 427/487/2638 459/520/2639 460/521/2640 -f 461/522/2641 429/489/2642 428/488/2643 -f 428/488/2644 460/521/2645 461/522/2646 -f 462/523/2647 430/490/2648 429/489/2649 -f 429/489/2650 461/522/2651 462/523/2652 -f 463/524/2653 431/491/2654 430/490/2655 -f 430/490/2656 462/523/2657 463/524/2658 -f 464/525/2659 432/492/2660 431/491/2661 -f 431/491/2662 463/524/2663 464/525/2664 -f 465/526/2665 433/493/2666 432/492/2667 -f 432/492/2668 464/525/2669 465/526/2670 -f 466/527/2671 434/494/2672 433/493/2673 -f 433/493/2674 465/526/2675 466/527/2676 -f 467/528/2677 435/495/2678 434/494/2679 -f 434/494/2680 466/527/2681 467/528/2682 -f 468/529/2683 436/496/2684 435/495/2685 -f 435/495/2686 467/528/2687 468/529/2688 -f 469/530/2689 437/497/2690 436/496/2691 -f 436/496/2692 468/529/2693 469/530/2694 -f 470/531/2695 438/498/2696 437/497/2697 -f 437/497/2698 469/530/2699 470/531/2700 -f 471/532/2701 439/499/2702 438/498/2703 -f 438/498/2704 470/531/2705 471/532/2706 -f 472/533/2707 440/500/2708 439/499/2709 -f 439/499/2710 471/532/2711 472/533/2712 -f 473/534/2713 441/501/2714 440/500/2715 -f 440/500/2716 472/533/2717 473/534/2718 -f 474/535/2719 442/502/2720 441/501/2721 -f 441/501/2722 473/534/2723 474/535/2724 -f 475/536/2725 443/503/2726 442/502/2727 -f 442/502/2728 474/535/2729 475/536/2730 -f 476/537/2731 444/504/2732 443/503/2733 -f 443/503/2734 475/536/2735 476/537/2736 -f 477/538/2737 445/505/2738 444/504/2739 -f 444/504/2740 476/537/2741 477/538/2742 -f 478/539/2743 446/506/2744 445/505/2745 -f 445/505/2746 477/538/2747 478/539/2748 -f 479/540/2749 447/507/2750 446/506/2751 -f 446/506/2752 478/539/2753 479/540/2754 -f 480/541/2755 448/508/2756 447/507/2757 -f 447/507/2758 479/540/2759 480/541/2760 -f 481/542/2761 449/509/2762 448/508/2763 -f 448/508/2764 480/541/2765 481/542/2766 -f 482/543/2767 450/510/2768 449/509/2769 -f 449/509/2770 481/542/2771 482/543/2772 -f 483/544/2773 451/511/2774 450/510/2775 -f 450/510/2776 482/543/2777 483/544/2778 -f 484/545/2779 452/512/2780 451/511/2781 -f 451/511/2782 483/544/2783 484/545/2784 -f 485/546/2785 453/513/2786 452/512/2787 -f 452/512/2788 484/545/2789 485/546/2790 -f 486/547/2791 454/514/2792 453/513/2793 -f 453/513/2794 485/546/2795 486/547/2796 -f 487/548/2797 455/515/2798 454/514/2799 -f 454/514/2800 486/547/2801 487/548/2802 -f 488/549/2803 456/516/2804 455/515/2805 -f 455/515/2806 487/548/2807 488/549/2808 -f 489/550/2809 457/517/2810 456/516/2811 -f 456/516/2812 488/549/2813 489/550/2814 -f 458/551/2815 426/518/2816 457/517/2817 -f 457/517/2818 489/550/2819 458/551/2820 -f 490/552/2821 459/520/2822 458/519/2823 -f 490/553/2824 460/521/2825 459/520/2826 -f 490/554/2827 461/522/2828 460/521/2829 -f 490/555/2830 462/523/2831 461/522/2832 -f 490/556/2833 463/524/2834 462/523/2835 -f 490/557/2836 464/525/2837 463/524/2838 -f 490/558/2839 465/526/2840 464/525/2841 -f 490/559/2842 466/527/2843 465/526/2844 -f 490/560/2845 467/528/2846 466/527/2847 -f 490/561/2848 468/529/2849 467/528/2850 -f 490/562/2851 469/530/2852 468/529/2853 -f 490/563/2854 470/531/2855 469/530/2856 -f 490/564/2857 471/532/2858 470/531/2859 -f 490/565/2860 472/533/2861 471/532/2862 -f 490/566/2863 473/534/2864 472/533/2865 -f 490/567/2866 474/535/2867 473/534/2868 -f 490/568/2869 475/536/2870 474/535/2871 -f 490/569/2872 476/537/2873 475/536/2874 -f 490/570/2875 477/538/2876 476/537/2877 -f 490/571/2878 478/539/2879 477/538/2880 -f 490/572/2881 479/540/2882 478/539/2883 -f 490/573/2884 480/541/2885 479/540/2886 -f 490/574/2887 481/542/2888 480/541/2889 -f 490/575/2890 482/543/2891 481/542/2892 -f 490/576/2893 483/544/2894 482/543/2895 -f 490/577/2896 484/545/2897 483/544/2898 -f 490/578/2899 485/546/2900 484/545/2901 -f 490/579/2902 486/547/2903 485/546/2904 -f 490/580/2905 487/548/2906 486/547/2907 -f 490/581/2908 488/549/2909 487/548/2910 -f 490/582/2911 489/550/2912 488/549/2913 -f 490/583/2914 458/551/2915 489/550/2916 -f 491/584/2917 492/585/2918 516/609/2919 -f 516/609/2920 515/608/2921 491/584/2922 -f 492/585/2923 493/586/2924 517/610/2925 -f 517/610/2926 516/609/2927 492/585/2928 -f 493/586/2929 494/587/2930 518/611/2931 -f 518/611/2932 517/610/2933 493/586/2934 -f 494/587/2935 495/588/2936 519/612/2937 -f 519/612/2938 518/611/2939 494/587/2940 -f 495/588/2941 496/589/2942 520/613/2943 -f 520/613/2944 519/612/2945 495/588/2946 -f 496/589/2947 497/590/2948 521/614/2949 -f 521/614/2950 520/613/2951 496/589/2952 -f 497/590/2953 498/728/2954 522/729/2955 -f 522/729/2956 521/614/2957 497/590/2958 -f 498/591/2959 499/592/2960 523/616/2961 -f 523/616/2962 522/615/2963 498/591/2964 -f 499/592/2965 500/593/2966 524/617/2967 -f 524/617/2968 523/616/2969 499/592/2970 -f 500/593/2971 501/594/2972 525/618/2973 -f 525/618/2974 524/617/2975 500/593/2976 -f 501/594/2977 502/595/2978 526/619/2979 -f 526/619/2980 525/618/2981 501/594/2982 -f 502/595/2983 503/596/2984 527/620/2985 -f 527/620/2986 526/619/2987 502/595/2988 -f 503/596/2989 504/597/2990 528/621/2991 -f 528/621/2992 527/620/2993 503/596/2994 -f 504/597/2995 505/598/2996 529/622/2997 -f 529/622/2998 528/621/2999 504/597/3000 -f 505/598/3001 506/599/3002 530/623/3003 -f 530/623/3004 529/622/3005 505/598/3006 -f 506/599/3007 507/600/3008 531/624/3009 -f 531/624/3010 530/623/3011 506/599/3012 -f 507/600/3013 508/601/3014 532/625/3015 -f 532/625/3016 531/624/3017 507/600/3018 -f 508/601/3019 509/602/3020 533/626/3021 -f 533/626/3022 532/625/3023 508/601/3024 -f 509/602/3025 510/603/3026 534/627/3027 -f 534/627/3028 533/626/3029 509/602/3030 -f 510/603/3031 511/604/3032 535/628/3033 -f 535/628/3034 534/627/3035 510/603/3036 -f 511/604/3037 512/605/3038 536/629/3039 -f 536/629/3040 535/628/3041 511/604/3042 -f 512/605/3043 513/606/3044 537/630/3045 -f 537/630/3046 536/629/3047 512/605/3048 -f 513/606/3049 514/607/3050 538/631/3051 -f 538/631/3052 537/630/3053 513/606/3054 -f 514/607/3055 491/584/3056 515/608/3057 -f 515/608/3058 538/631/3059 514/607/3060 -f 515/608/3061 516/609/3062 540/633/3063 -f 540/633/3064 539/632/3065 515/608/3066 -f 516/609/3067 517/610/3068 541/634/3069 -f 541/634/3070 540/633/3071 516/609/3072 -f 517/610/3073 518/611/3074 542/635/3075 -f 542/635/3076 541/634/3077 517/610/3078 -f 518/611/3079 519/612/3080 543/636/3081 -f 543/636/3082 542/635/3083 518/611/3084 -f 519/612/3085 520/613/3086 544/637/3087 -f 544/637/3088 543/636/3089 519/612/3090 -f 520/613/3091 521/614/3092 545/638/3093 -f 545/638/3094 544/637/3095 520/613/3096 -f 521/614/3097 522/729/3098 546/730/3099 -f 546/730/3100 545/638/3101 521/614/3102 -f 522/615/3103 523/616/3104 547/640/3105 -f 547/640/3106 546/639/3107 522/615/3108 -f 523/616/3109 524/617/3110 548/641/3111 -f 548/641/3112 547/640/3113 523/616/3114 -f 524/617/3115 525/618/3116 549/642/3117 -f 549/642/3118 548/641/3119 524/617/3120 -f 525/618/3121 526/619/3122 550/643/3123 -f 550/643/3124 549/642/3125 525/618/3126 -f 526/619/3127 527/620/3128 551/644/3129 -f 551/644/3130 550/643/3131 526/619/3132 -f 527/620/3133 528/621/3134 552/645/3135 -f 552/645/3136 551/644/3137 527/620/3138 -f 528/621/3139 529/622/3140 553/646/3141 -f 553/646/3142 552/645/3143 528/621/3144 -f 529/622/3145 530/623/3146 554/647/3147 -f 554/647/3148 553/646/3149 529/622/3150 -f 530/623/3151 531/624/3152 555/648/3153 -f 555/648/3154 554/647/3155 530/623/3156 -f 531/624/3157 532/625/3158 556/649/3159 -f 556/649/3160 555/648/3161 531/624/3162 -f 532/625/3163 533/626/3164 557/650/3165 -f 557/650/3166 556/649/3167 532/625/3168 -f 533/626/3169 534/627/3170 558/651/3171 -f 558/651/3172 557/650/3173 533/626/3174 -f 534/627/3175 535/628/3176 559/652/3177 -f 559/652/3178 558/651/3179 534/627/3180 -f 535/628/3181 536/629/3182 560/653/3183 -f 560/653/3184 559/652/3185 535/628/3186 -f 536/629/3187 537/630/3188 561/654/3189 -f 561/654/3190 560/653/3191 536/629/3192 -f 537/630/3193 538/631/3194 562/655/3195 -f 562/655/3196 561/654/3197 537/630/3198 -f 538/631/3199 515/608/3200 539/632/3201 -f 539/632/3202 562/655/3203 538/631/3204 -f 539/632/3205 540/633/3206 564/657/3207 -f 564/657/3208 563/656/3209 539/632/3210 -f 540/633/3211 541/634/3212 565/658/3213 -f 565/658/3214 564/657/3215 540/633/3216 -f 541/634/3217 542/635/3218 566/659/3219 -f 566/659/3220 565/658/3221 541/634/3222 -f 542/635/3223 543/636/3224 567/660/3225 -f 567/660/3226 566/659/3227 542/635/3228 -f 543/636/3229 544/637/3230 568/661/3231 -f 568/661/3232 567/660/3233 543/636/3234 -f 544/637/3235 545/638/3236 569/662/3237 -f 569/662/3238 568/661/3239 544/637/3240 -f 545/638/3241 546/730/3242 570/731/3243 -f 570/731/3244 569/662/3245 545/638/3246 -f 546/639/3247 547/640/3248 571/664/3249 -f 571/664/3250 570/663/3251 546/639/3252 -f 547/640/3253 548/641/3254 572/665/3255 -f 572/665/3256 571/664/3257 547/640/3258 -f 548/641/3259 549/642/3260 573/666/3261 -f 573/666/3262 572/665/3263 548/641/3264 -f 549/642/3265 550/643/3266 574/667/3267 -f 574/667/3268 573/666/3269 549/642/3270 -f 550/643/3271 551/644/3272 575/668/3273 -f 575/668/3274 574/667/3275 550/643/3276 -f 551/644/3277 552/645/3278 576/669/3279 -f 576/669/3280 575/668/3281 551/644/3282 -f 552/645/3283 553/646/3284 577/670/3285 -f 577/670/3286 576/669/3287 552/645/3288 -f 553/646/3289 554/647/3290 578/671/3291 -f 578/671/3292 577/670/3293 553/646/3294 -f 554/647/3295 555/648/3296 579/672/3297 -f 579/672/3298 578/671/3299 554/647/3300 -f 555/648/3301 556/649/3302 580/673/3303 -f 580/673/3304 579/672/3305 555/648/3306 -f 556/649/3307 557/650/3308 581/674/3309 -f 581/674/3310 580/673/3311 556/649/3312 -f 557/650/3313 558/651/3314 582/675/3315 -f 582/675/3316 581/674/3317 557/650/3318 -f 558/651/3319 559/652/3320 583/676/3321 -f 583/676/3322 582/675/3323 558/651/3324 -f 559/652/3325 560/653/3326 584/677/3327 -f 584/677/3328 583/676/3329 559/652/3330 -f 560/653/3331 561/654/3332 585/678/3333 -f 585/678/3334 584/677/3335 560/653/3336 -f 561/654/3337 562/655/3338 586/679/3339 -f 586/679/3340 585/678/3341 561/654/3342 -f 562/655/3343 539/632/3344 563/656/3345 -f 563/656/3346 586/679/3347 562/655/3348 -f 563/656/3349 564/657/3350 588/681/3351 -f 588/681/3352 587/680/3353 563/656/3354 -f 564/657/3355 565/658/3356 589/682/3357 -f 589/682/3358 588/681/3359 564/657/3360 -f 565/658/3361 566/659/3362 590/683/3363 -f 590/683/3364 589/682/3365 565/658/3366 -f 566/659/3367 567/660/3368 591/684/3369 -f 591/684/3370 590/683/3371 566/659/3372 -f 567/660/3373 568/661/3374 592/685/3375 -f 592/685/3376 591/684/3377 567/660/3378 -f 568/661/3379 569/662/3380 593/686/3381 -f 593/686/3382 592/685/3383 568/661/3384 -f 569/662/3385 570/731/3386 594/732/3387 -f 594/732/3388 593/686/3389 569/662/3390 -f 570/663/3391 571/664/3392 595/688/3393 -f 595/688/3394 594/687/3395 570/663/3396 -f 571/664/3397 572/665/3398 596/689/3399 -f 596/689/3400 595/688/3401 571/664/3402 -f 572/665/3403 573/666/3404 597/690/3405 -f 597/690/3406 596/689/3407 572/665/3408 -f 573/666/3409 574/667/3410 598/691/3411 -f 598/691/3412 597/690/3413 573/666/3414 -f 574/667/3415 575/668/3416 599/692/3417 -f 599/692/3418 598/691/3419 574/667/3420 -f 575/668/3421 576/669/3422 600/693/3423 -f 600/693/3424 599/692/3425 575/668/3426 -f 576/669/3427 577/670/3428 601/694/3429 -f 601/694/3430 600/693/3431 576/669/3432 -f 577/670/3433 578/671/3434 602/695/3435 -f 602/695/3436 601/694/3437 577/670/3438 -f 578/671/3439 579/672/3440 603/696/3441 -f 603/696/3442 602/695/3443 578/671/3444 -f 579/672/3445 580/673/3446 604/697/3447 -f 604/697/3448 603/696/3449 579/672/3450 -f 580/673/3451 581/674/3452 605/698/3453 -f 605/698/3454 604/697/3455 580/673/3456 -f 581/674/3457 582/675/3458 606/699/3459 -f 606/699/3460 605/698/3461 581/674/3462 -f 582/675/3463 583/676/3464 607/700/3465 -f 607/700/3466 606/699/3467 582/675/3468 -f 583/676/3469 584/677/3470 608/701/3471 -f 608/701/3472 607/700/3473 583/676/3474 -f 584/677/3475 585/678/3476 609/702/3477 -f 609/702/3478 608/701/3479 584/677/3480 -f 585/678/3481 586/679/3482 610/703/3483 -f 610/703/3484 609/702/3485 585/678/3486 -f 586/679/3487 563/656/3488 587/680/3489 -f 587/680/3490 610/703/3491 586/679/3492 -f 587/680/3493 588/681/3494 612/705/3495 -f 612/705/3496 611/704/3497 587/680/3498 -f 588/681/3499 589/682/3500 613/706/3501 -f 613/706/3502 612/705/3503 588/681/3504 -f 589/682/3505 590/683/3506 614/707/3507 -f 614/707/3508 613/706/3509 589/682/3510 -f 590/683/3511 591/684/3512 615/708/3513 -f 615/708/3514 614/707/3515 590/683/3516 -f 591/684/3517 592/685/3518 616/709/3519 -f 616/709/3520 615/708/3521 591/684/3522 -f 592/685/3523 593/686/3524 617/710/3525 -f 617/710/3526 616/709/3527 592/685/3528 -f 593/735/3529 594/732/3530 618/733/3531 -f 618/733/3532 617/734/3533 593/735/3534 -f 594/687/3535 595/688/3536 619/712/3537 -f 619/712/3538 618/711/3539 594/687/3540 -f 595/688/3541 596/689/3542 620/713/3543 -f 620/713/3544 619/712/3545 595/688/3546 -f 596/689/3547 597/690/3548 621/714/3549 -f 621/714/3550 620/713/3551 596/689/3552 -f 597/690/3553 598/691/3554 622/715/3555 -f 622/715/3556 621/714/3557 597/690/3558 -f 598/691/3559 599/692/3560 623/716/3561 -f 623/716/3562 622/715/3563 598/691/3564 -f 599/692/3565 600/693/3566 624/717/3567 -f 624/717/3568 623/716/3569 599/692/3570 -f 600/693/3571 601/694/3572 625/718/3573 -f 625/718/3574 624/717/3575 600/693/3576 -f 601/694/3577 602/695/3578 626/719/3579 -f 626/719/3580 625/718/3581 601/694/3582 -f 602/695/3583 603/696/3584 627/720/3585 -f 627/720/3586 626/719/3587 602/695/3588 -f 603/696/3589 604/697/3590 628/721/3591 -f 628/721/3592 627/720/3593 603/696/3594 -f 604/697/3595 605/698/3596 629/722/3597 -f 629/722/3598 628/721/3599 604/697/3600 -f 605/698/3601 606/699/3602 630/723/3603 -f 630/723/3604 629/722/3605 605/698/3606 -f 606/699/3607 607/700/3608 631/724/3609 -f 631/724/3610 630/723/3611 606/699/3612 -f 607/700/3613 608/701/3614 632/725/3615 -f 632/725/3616 631/724/3617 607/700/3618 -f 608/701/3619 609/702/3620 633/726/3621 -f 633/726/3622 632/725/3623 608/701/3624 -f 609/702/3625 610/703/3626 634/727/3627 -f 634/727/3628 633/726/3629 609/702/3630 -f 610/703/3631 587/680/3632 611/704/3633 -f 611/704/3634 634/727/3635 610/703/3636 -f 513/737/3637 512/738/3638 511/739/3639 -f 511/739/3640 510/740/3641 509/741/3642 -f 509/741/3643 508/742/3644 507/743/3645 -f 511/739/3646 509/741/3647 507/743/3648 -f 507/743/3649 506/744/3650 505/745/3651 -f 505/745/3652 504/746/3653 503/747/3654 -f 507/743/3655 505/745/3656 503/747/3657 -f 503/747/3658 502/748/3659 501/749/3660 -f 501/749/3661 500/750/3662 499/751/3663 -f 503/747/3664 501/749/3665 499/751/3666 -f 507/743/3667 503/747/3668 499/751/3669 -f 499/751/3670 498/752/3671 497/753/3672 -f 497/753/3673 496/754/3674 495/755/3675 -f 499/751/3676 497/753/3677 495/755/3678 -f 495/755/3679 494/756/3680 493/757/3681 -f 493/757/3682 492/758/3683 491/759/3684 -f 495/755/3685 493/757/3686 491/759/3687 -f 499/751/3688 495/755/3689 491/759/3690 -f 507/743/3691 499/751/3692 491/759/3693 -f 511/739/3694 507/743/3695 491/759/3696 -f 513/737/3697 511/739/3698 491/759/3699 -f 514/736/3700 513/737/3701 491/759/3702 -f 612/705/3703 613/706/3704 614/707/3705 -f 614/707/3706 615/708/3707 616/709/3708 -f 616/709/3709 617/710/3710 618/711/3711 -f 614/707/3712 616/709/3713 618/711/3714 -f 618/711/3715 619/712/3716 620/713/3717 -f 620/713/3718 621/714/3719 622/715/3720 -f 618/711/3721 620/713/3722 622/715/3723 -f 622/715/3724 623/716/3725 624/717/3726 -f 624/717/3727 625/718/3728 626/719/3729 -f 622/715/3730 624/717/3731 626/719/3732 -f 618/711/3733 622/715/3734 626/719/3735 -f 626/719/3736 627/720/3737 628/721/3738 -f 628/721/3739 629/722/3740 630/723/3741 -f 626/719/3742 628/721/3743 630/723/3744 -f 630/723/3745 631/724/3746 632/725/3747 -f 632/725/3748 633/726/3749 634/727/3750 -f 630/723/3751 632/725/3752 634/727/3753 -f 626/719/3754 630/723/3755 634/727/3756 -f 618/711/3757 626/719/3758 634/727/3759 -f 614/707/3760 618/711/3761 634/727/3762 -f 612/705/3763 614/707/3764 634/727/3765 -f 611/704/3766 612/705/3767 634/727/3768 -# 1256 faces - diff --git a/examples/resources/ps3.png b/examples/resources/ps3.png Binary files differnew file mode 100644 index 00000000..98befacc --- /dev/null +++ b/examples/resources/ps3.png diff --git a/examples/resources/shaders/bloom.fs b/examples/resources/shaders/bloom.fs deleted file mode 100644 index 2833ce33..00000000 --- a/examples/resources/shaders/bloom.fs +++ /dev/null @@ -1,42 +0,0 @@ -#version 330 - -in vec2 fragTexCoord; - -out vec4 fragColor; - -uniform sampler2D texture0; -uniform vec4 fragTintColor; - -// NOTE: Add here your custom variables - -void main() -{ - vec4 sum = vec4(0); - vec4 tc = vec4(0); - - for (int i = -4; i < 4; i++) - { - for (int j = -3; j < 3; j++) - { - sum += texture2D(texture0, fragTexCoord + vec2(j, i)*0.004) * 0.25; - } - } - - if (texture2D(texture0, fragTexCoord).r < 0.3) - { - tc = sum*sum*0.012 + texture2D(texture0, fragTexCoord); - } - else - { - if (texture2D(texture0, fragTexCoord).r < 0.5) - { - tc = sum*sum*0.009 + texture2D(texture0, fragTexCoord); - } - else - { - tc = sum*sum*0.0075 + texture2D(texture0, fragTexCoord); - } - } - - fragColor = tc; -}
\ No newline at end of file diff --git a/examples/resources/shaders/glsl100/base.vs b/examples/resources/shaders/glsl100/base.vs new file mode 100644 index 00000000..e9386939 --- /dev/null +++ b/examples/resources/shaders/glsl100/base.vs @@ -0,0 +1,26 @@ +#version 100 + +// Input vertex attributes +attribute vec3 vertexPosition; +attribute vec2 vertexTexCoord; +attribute vec3 vertexNormal; +attribute vec4 vertexColor; + +// Input uniform values +uniform mat4 mvpMatrix; + +// Output vertex attributes (to fragment shader) +varying vec2 fragTexCoord; +varying vec4 fragColor; + +// NOTE: Add here your custom variables + +void main() +{ + // Send vertex attributes to fragment shader + fragTexCoord = vertexTexCoord; + fragColor = vertexColor; + + // Calculate final vertex position + gl_Position = mvpMatrix*vec4(vertexPosition, 1.0); +}
\ No newline at end of file diff --git a/examples/resources/shaders/glsl100/bloom.fs b/examples/resources/shaders/glsl100/bloom.fs new file mode 100644 index 00000000..a8e1d20f --- /dev/null +++ b/examples/resources/shaders/glsl100/bloom.fs @@ -0,0 +1,39 @@ +#version 100 + +precision mediump float; + +// Input vertex attributes (from vertex shader) +varying vec2 fragTexCoord; +varying vec4 fragColor; + +// Input uniform values +uniform sampler2D texture0; +uniform vec4 colDiffuse; + +// NOTE: Add here your custom variables + +const vec2 size = vec2(800, 450); // render size +const float samples = 5.0; // pixels per axis; higher = bigger glow, worse performance +const float quality = 2.5; // lower = smaller glow, better quality + +void main() +{ + vec4 sum = vec4(0); + vec2 sizeFactor = vec2(1)/size*quality; + + // Texel color fetching from texture sampler + vec4 source = texture2D(texture0, fragTexCoord); + + const int range = 2; // should be = (samples - 1)/2; + + for (int x = -range; x <= range; x++) + { + for (int y = -range; y <= range; y++) + { + sum += texture2D(texture0, fragTexCoord + vec2(x, y)*sizeFactor); + } + } + + // Calculate final fragment color + gl_FragColor = ((sum/(samples*samples)) + source)*colDiffuse; +}
\ No newline at end of file diff --git a/examples/resources/shaders/glsl100/distortion.fs b/examples/resources/shaders/glsl100/distortion.fs new file mode 100644 index 00000000..50116ce0 --- /dev/null +++ b/examples/resources/shaders/glsl100/distortion.fs @@ -0,0 +1,54 @@ +#version 100 + +precision mediump float; + +// Input vertex attributes (from vertex shader) +varying vec2 fragTexCoord; + +// Input uniform values +uniform sampler2D texture0; + +// NOTE: Default parameters for Oculus Rift DK2 device +const vec2 LeftLensCenter = vec2(0.2863248, 0.5); +const vec2 RightLensCenter = vec2(0.7136753, 0.5); +const vec2 LeftScreenCenter = vec2(0.25, 0.5); +const vec2 RightScreenCenter = vec2(0.75, 0.5); +const vec2 Scale = vec2(0.25, 0.45); +const vec2 ScaleIn = vec2(4.0, 2.5); +const vec4 HmdWarpParam = vec4(1.0, 0.22, 0.24, 0.0); +const vec4 ChromaAbParam = vec4(0.996, -0.004, 1.014, 0.0); + +void main() +{ + // The following two variables need to be set per eye + vec2 LensCenter = fragTexCoord.x < 0.5 ? LeftLensCenter : RightLensCenter; + vec2 ScreenCenter = fragTexCoord.x < 0.5 ? LeftScreenCenter : RightScreenCenter; + + // Scales input texture coordinates for distortion: vec2 HmdWarp(vec2 fragTexCoord, vec2 LensCenter) + vec2 theta = (fragTexCoord - LensCenter)*ScaleIn; // Scales to [-1, 1] + float rSq = theta.x*theta.x + theta.y*theta.y; + vec2 theta1 = theta*(HmdWarpParam.x + HmdWarpParam.y*rSq + HmdWarpParam.z*rSq*rSq + HmdWarpParam.w*rSq*rSq*rSq); + //vec2 tc = LensCenter + Scale*theta1; + + // Detect whether blue texture coordinates are out of range since these will scaled out the furthest + vec2 thetaBlue = theta1*(ChromaAbParam.z + ChromaAbParam.w*rSq); + vec2 tcBlue = LensCenter + Scale*thetaBlue; + + if (any(bvec2(clamp(tcBlue, ScreenCenter - vec2(0.25, 0.5), ScreenCenter + vec2(0.25, 0.5)) - tcBlue))) gl_FragColor = vec4(0.0, 0.0, 0.0, 1.0); + else + { + // Do blue texture lookup + float blue = texture2D(texture0, tcBlue).b; + + // Do green lookup (no scaling) + vec2 tcGreen = LensCenter + Scale*theta1; + float green = texture2D(texture0, tcGreen).g; + + // Do red scale and lookup + vec2 thetaRed = theta1*(ChromaAbParam.x + ChromaAbParam.y*rSq); + vec2 tcRed = LensCenter + Scale*thetaRed; + float red = texture2D(texture0, tcRed).r; + + gl_FragColor = vec4(red, green, blue, 1.0); + } +} diff --git a/examples/resources/shaders/glsl100/grayscale.fs b/examples/resources/shaders/glsl100/grayscale.fs new file mode 100644 index 00000000..15174ea5 --- /dev/null +++ b/examples/resources/shaders/glsl100/grayscale.fs @@ -0,0 +1,25 @@ +#version 100 + +precision mediump float; + +// Input vertex attributes (from vertex shader) +varying vec2 fragTexCoord; +varying vec4 fragColor; + +// Input uniform values +uniform sampler2D texture0; +uniform vec4 colDiffuse; + +// NOTE: Add here your custom variables + +void main() +{ + // Texel color fetching from texture sampler + vec4 texelColor = texture2D(texture0, fragTexCoord)*colDiffuse*fragColor; + + // Convert texel color to grayscale using NTSC conversion weights + float gray = dot(texelColor.rgb, vec3(0.299, 0.587, 0.114)); + + // Calculate final fragment color + gl_FragColor = vec4(gray, gray, gray, texelColor.a); +}
\ No newline at end of file diff --git a/examples/resources/shaders/glsl100/standard.fs b/examples/resources/shaders/glsl100/standard.fs new file mode 100644 index 00000000..fe604e2a --- /dev/null +++ b/examples/resources/shaders/glsl100/standard.fs @@ -0,0 +1,152 @@ +#version 100 + +precision mediump float; + +varying vec3 fragPosition; +varying vec2 fragTexCoord; +varying vec4 fragColor; +varying vec3 fragNormal; + +uniform sampler2D texture0; +uniform sampler2D texture1; +uniform sampler2D texture2; + +uniform vec4 colAmbient; +uniform vec4 colDiffuse; +uniform vec4 colSpecular; +uniform float glossiness; + +uniform int useNormal; +uniform int useSpecular; + +uniform mat4 modelMatrix; +uniform vec3 viewDir; + +struct Light { + int enabled; + int type; + vec3 position; + vec3 direction; + vec4 diffuse; + float intensity; + float radius; + float coneAngle; +}; + +const int maxLights = 8; +uniform Light lights[maxLights]; + +vec3 ComputeLightPoint(Light l, vec3 n, vec3 v, float s) +{ + vec3 surfacePos = vec3(modelMatrix*vec4(fragPosition, 1.0)); + vec3 surfaceToLight = l.position - surfacePos; + + // Diffuse shading + float brightness = clamp(float(dot(n, surfaceToLight)/(length(surfaceToLight)*length(n))), 0.0, 1.0); + float diff = 1.0/dot(surfaceToLight/l.radius, surfaceToLight/l.radius)*brightness*l.intensity; + + // Specular shading + float spec = 0.0; + if (diff > 0.0) + { + vec3 h = normalize(-l.direction + v); + spec = pow(abs(dot(n, h)), 3.0 + glossiness)*s; + } + + return (diff*l.diffuse.rgb + spec*colSpecular.rgb); +} + +vec3 ComputeLightDirectional(Light l, vec3 n, vec3 v, float s) +{ + vec3 lightDir = normalize(-l.direction); + + // Diffuse shading + float diff = clamp(float(dot(n, lightDir)), 0.0, 1.0)*l.intensity; + + // Specular shading + float spec = 0.0; + if (diff > 0.0) + { + vec3 h = normalize(lightDir + v); + spec = pow(abs(dot(n, h)), 3.0 + glossiness)*s; + } + + // Combine results + return (diff*l.intensity*l.diffuse.rgb + spec*colSpecular.rgb); +} + +vec3 ComputeLightSpot(Light l, vec3 n, vec3 v, float s) +{ + vec3 surfacePos = vec3(modelMatrix*vec4(fragPosition, 1)); + vec3 lightToSurface = normalize(surfacePos - l.position); + vec3 lightDir = normalize(-l.direction); + + // Diffuse shading + float diff = clamp(float(dot(n, lightDir)), 0.0, 1.0)*l.intensity; + + // Spot attenuation + float attenuation = clamp(float(dot(n, lightToSurface)), 0.0, 1.0); + attenuation = dot(lightToSurface, -lightDir); + + float lightToSurfaceAngle = degrees(acos(attenuation)); + if (lightToSurfaceAngle > l.coneAngle) attenuation = 0.0; + + float falloff = (l.coneAngle - lightToSurfaceAngle)/l.coneAngle; + + // Combine diffuse and attenuation + float diffAttenuation = diff*attenuation; + + // Specular shading + float spec = 0.0; + if (diffAttenuation > 0.0) + { + vec3 h = normalize(lightDir + v); + spec = pow(abs(dot(n, h)), 3.0 + glossiness)*s; + } + + return (falloff*(diffAttenuation*l.diffuse.rgb + spec*colSpecular.rgb)); +} + +void main() +{ + // Calculate fragment normal in screen space + // NOTE: important to multiply model matrix by fragment normal to apply model transformation (rotation and scale) + mat3 normalMatrix = mat3(modelMatrix); + vec3 normal = normalize(normalMatrix*fragNormal); + + // Normalize normal and view direction vectors + vec3 n = normalize(normal); + vec3 v = normalize(viewDir); + + // Calculate diffuse texture color fetching + vec4 texelColor = texture2D(texture0, fragTexCoord); + vec3 lighting = colAmbient.rgb; + + // Calculate normal texture color fetching or set to maximum normal value by default + if (useNormal == 1) + { + n *= texture2D(texture1, fragTexCoord).rgb; + n = normalize(n); + } + + // Calculate specular texture color fetching or set to maximum specular value by default + float spec = 1.0; + if (useSpecular == 1) spec = texture2D(texture2, fragTexCoord).r; + + for (int i = 0; i < maxLights; i++) + { + // Check if light is enabled + if (lights[i].enabled == 1) + { + // Calculate lighting based on light type + if(lights[i].type == 0) lighting += ComputeLightPoint(lights[i], n, v, spec); + else if(lights[i].type == 1) lighting += ComputeLightDirectional(lights[i], n, v, spec); + else if(lights[i].type == 2) lighting += ComputeLightSpot(lights[i], n, v, spec); + + // NOTE: It seems that too many ComputeLight*() operations inside for loop breaks the shader on RPI + } + } + + // Calculate final fragment color + gl_FragColor = vec4(texelColor.rgb*lighting*colDiffuse.rgb, texelColor.a*colDiffuse.a); +} diff --git a/examples/resources/shaders/shapes_base.vs b/examples/resources/shaders/glsl100/standard.vs index ad272dc1..49c5a3eb 100644 --- a/examples/resources/shaders/shapes_base.vs +++ b/examples/resources/shaders/glsl100/standard.vs @@ -1,18 +1,23 @@ -#version 330 +#version 100 attribute vec3 vertexPosition; +attribute vec3 vertexNormal; attribute vec2 vertexTexCoord; attribute vec4 vertexColor; -uniform mat4 mvpMatrix; - +varying vec3 fragPosition; varying vec2 fragTexCoord; -varying vec4 fragTintColor; +varying vec4 fragColor; +varying vec3 fragNormal; + +uniform mat4 mvpMatrix; void main() { + fragPosition = vertexPosition; fragTexCoord = vertexTexCoord; - fragTintColor = vertexColor; - + fragColor = vertexColor; + fragNormal = vertexNormal; + gl_Position = mvpMatrix*vec4(vertexPosition, 1.0); }
\ No newline at end of file diff --git a/examples/resources/shaders/glsl100/swirl.fs b/examples/resources/shaders/glsl100/swirl.fs new file mode 100644 index 00000000..ca7668b2 --- /dev/null +++ b/examples/resources/shaders/glsl100/swirl.fs @@ -0,0 +1,45 @@ +#version 100 + +precision mediump float; + +// Input vertex attributes (from vertex shader) +varying vec2 fragTexCoord; +varying vec4 fragColor; + +// Input uniform values +uniform sampler2D texture0; +uniform vec4 colDiffuse; + +// NOTE: Add here your custom variables + +const float renderWidth = 800.0; // HARDCODED for example! +const float renderHeight = 480.0; // Use uniforms instead... + +float radius = 250.0; +float angle = 0.8; + +uniform vec2 center; + +void main() +{ + vec2 texSize = vec2(renderWidth, renderHeight); + vec2 tc = fragTexCoord*texSize; + tc -= center; + + float dist = length(tc); + + if (dist < radius) + { + float percent = (radius - dist)/radius; + float theta = percent*percent*angle*8.0; + float s = sin(theta); + float c = cos(theta); + + tc = vec2(dot(tc, vec2(c, -s)), dot(tc, vec2(s, c))); + } + + tc += center; + vec4 color = texture2D(texture0, tc/texSize)*colDiffuse*fragColor;; + + gl_FragColor = vec4(color.rgb, 1.0);; +}
\ No newline at end of file diff --git a/examples/resources/shaders/glsl330/base.vs b/examples/resources/shaders/glsl330/base.vs new file mode 100644 index 00000000..638cb8ae --- /dev/null +++ b/examples/resources/shaders/glsl330/base.vs @@ -0,0 +1,26 @@ +#version 330 + +// Input vertex attributes +in vec3 vertexPosition; +in vec2 vertexTexCoord; +in vec3 vertexNormal; +in vec4 vertexColor; + +// Input uniform values +uniform mat4 mvpMatrix; + +// Output vertex attributes (to fragment shader) +out vec2 fragTexCoord; +out vec4 fragColor; + +// NOTE: Add here your custom variables + +void main() +{ + // Send vertex attributes to fragment shader + fragTexCoord = vertexTexCoord; + fragColor = vertexColor; + + // Calculate final vertex position + gl_Position = mvpMatrix*vec4(vertexPosition, 1.0); +}
\ No newline at end of file diff --git a/examples/resources/shaders/glsl330/bloom.fs b/examples/resources/shaders/glsl330/bloom.fs new file mode 100644 index 00000000..333d5b05 --- /dev/null +++ b/examples/resources/shaders/glsl330/bloom.fs @@ -0,0 +1,40 @@ +#version 330 + +// Input vertex attributes (from vertex shader) +in vec2 fragTexCoord; +in vec4 fragColor; + +// Input uniform values +uniform sampler2D texture0; +uniform vec4 colDiffuse; + +// Output fragment color +out vec4 finalColor; + +// NOTE: Add here your custom variables + +const vec2 size = vec2(800, 450); // render size +const float samples = 5.0; // pixels per axis; higher = bigger glow, worse performance +const float quality = 2.5; // lower = smaller glow, better quality + +void main() +{ + vec4 sum = vec4(0); + vec2 sizeFactor = vec2(1)/size*quality; + + // Texel color fetching from texture sampler + vec4 source = texture(texture0, fragTexCoord); + + const int range = 2; // should be = (samples - 1)/2; + + for (int x = -range; x <= range; x++) + { + for (int y = -range; y <= range; y++) + { + sum += texture(texture0, fragTexCoord + vec2(x, y)*sizeFactor); + } + } + + // Calculate final fragment color + finalColor = ((sum/(samples*samples)) + source)*colDiffuse; +}
\ No newline at end of file diff --git a/examples/resources/shaders/glsl330/depth.fs b/examples/resources/shaders/glsl330/depth.fs new file mode 100644 index 00000000..06d399f9 --- /dev/null +++ b/examples/resources/shaders/glsl330/depth.fs @@ -0,0 +1,27 @@ +#version 330 + +// Input vertex attributes (from vertex shader) +in vec2 fragTexCoord; +in vec4 fragColor; + +// Input uniform values +uniform sampler2D texture0; // Depth texture +uniform vec4 fragTintColor; + +// Output fragment color +out vec4 finalColor; + +// NOTE: Add here your custom variables + +void main() +{ + float zNear = 0.01; // camera z near + float zFar = 10.0; // camera z far + float z = texture(texture0, fragTexCoord).x; + + // Linearize depth value + float depth = (2.0*zNear)/(zFar + zNear - z*(zFar - zNear)); + + // Calculate final fragment color + finalColor = vec4(depth, depth, depth, 1.0f); +}
\ No newline at end of file diff --git a/examples/resources/shaders/glsl330/distortion.fs b/examples/resources/shaders/glsl330/distortion.fs new file mode 100644 index 00000000..cb4be8fc --- /dev/null +++ b/examples/resources/shaders/glsl330/distortion.fs @@ -0,0 +1,56 @@ +#version 330 + +// Input vertex attributes (from vertex shader) +in vec2 fragTexCoord; + +// Input uniform values +uniform sampler2D texture0; + +// Output fragment color +out vec4 finalColor; + +// NOTE: Default parameters for Oculus Rift DK2 device +const vec2 LeftLensCenter = vec2(0.2863248, 0.5); +const vec2 RightLensCenter = vec2(0.7136753, 0.5); +const vec2 LeftScreenCenter = vec2(0.25, 0.5); +const vec2 RightScreenCenter = vec2(0.75, 0.5); +const vec2 Scale = vec2(0.25, 0.45); +const vec2 ScaleIn = vec2(4.0, 2.5); +const vec4 HmdWarpParam = vec4(1.0, 0.22, 0.24, 0.0); +const vec4 ChromaAbParam = vec4(0.996, -0.004, 1.014, 0.0); + +void main() +{ + // The following two variables need to be set per eye + vec2 LensCenter = fragTexCoord.x < 0.5 ? LeftLensCenter : RightLensCenter; + vec2 ScreenCenter = fragTexCoord.x < 0.5 ? LeftScreenCenter : RightScreenCenter; + + // Scales input texture coordinates for distortion: vec2 HmdWarp(vec2 fragTexCoord, vec2 LensCenter) + vec2 theta = (fragTexCoord - LensCenter)*ScaleIn; // Scales to [-1, 1] + float rSq = theta.x*theta.x + theta.y*theta.y; + vec2 theta1 = theta*(HmdWarpParam.x + HmdWarpParam.y*rSq + HmdWarpParam.z*rSq*rSq + HmdWarpParam.w*rSq*rSq*rSq); + //vec2 tc = LensCenter + Scale*theta1; + + // Detect whether blue texture coordinates are out of range since these will scaled out the furthest + vec2 thetaBlue = theta1*(ChromaAbParam.z + ChromaAbParam.w*rSq); + vec2 tcBlue = LensCenter + Scale*thetaBlue; + + if (any(bvec2(clamp(tcBlue, ScreenCenter - vec2(0.25, 0.5), ScreenCenter + vec2(0.25, 0.5)) - tcBlue))) finalColor = vec4(0.0, 0.0, 0.0, 1.0); + else + { + // Do blue texture lookup + float blue = texture(texture0, tcBlue).b; + + // Do green lookup (no scaling) + vec2 tcGreen = LensCenter + Scale*theta1; + float green = texture(texture0, tcGreen).g; + + // Do red scale and lookup + vec2 thetaRed = theta1*(ChromaAbParam.x + ChromaAbParam.y*rSq); + vec2 tcRed = LensCenter + Scale*thetaRed; + float red = texture(texture0, tcRed).r; + + finalColor = vec4(red, green, blue, 1.0); + } +} + diff --git a/examples/resources/shaders/glsl330/grayscale.fs b/examples/resources/shaders/glsl330/grayscale.fs new file mode 100644 index 00000000..5b3e11be --- /dev/null +++ b/examples/resources/shaders/glsl330/grayscale.fs @@ -0,0 +1,26 @@ +#version 330 + +// Input vertex attributes (from vertex shader) +in vec2 fragTexCoord; +in vec4 fragColor; + +// Input uniform values +uniform sampler2D texture0; +uniform vec4 colDiffuse; + +// Output fragment color +out vec4 finalColor; + +// NOTE: Add here your custom variables + +void main() +{ + // Texel color fetching from texture sampler + vec4 texelColor = texture(texture0, fragTexCoord)*colDiffuse*fragColor; + + // Convert texel color to grayscale using NTSC conversion weights + float gray = dot(texelColor.rgb, vec3(0.299, 0.587, 0.114)); + + // Calculate final fragment color + finalColor = vec4(gray, gray, gray, texelColor.a); +}
\ No newline at end of file diff --git a/examples/resources/shaders/glsl330/standard.fs b/examples/resources/shaders/glsl330/standard.fs new file mode 100644 index 00000000..0d461484 --- /dev/null +++ b/examples/resources/shaders/glsl330/standard.fs @@ -0,0 +1,150 @@ +#version 330 + +in vec3 fragPosition; +in vec2 fragTexCoord; +in vec4 fragColor; +in vec3 fragNormal; + +out vec4 finalColor; + +uniform sampler2D texture0; +uniform sampler2D texture1; +uniform sampler2D texture2; + +uniform vec4 colAmbient; +uniform vec4 colDiffuse; +uniform vec4 colSpecular; +uniform float glossiness; + +uniform int useNormal; +uniform int useSpecular; + +uniform mat4 modelMatrix; +uniform vec3 viewDir; + +struct Light { + int enabled; + int type; + vec3 position; + vec3 direction; + vec4 diffuse; + float intensity; + float radius; + float coneAngle; +}; + +const int maxLights = 8; +uniform Light lights[maxLights]; + +vec3 ComputeLightPoint(Light l, vec3 n, vec3 v, float s) +{ + vec3 surfacePos = vec3(modelMatrix*vec4(fragPosition, 1)); + vec3 surfaceToLight = l.position - surfacePos; + + // Diffuse shading + float brightness = clamp(float(dot(n, surfaceToLight)/(length(surfaceToLight)*length(n))), 0.0, 1.0); + float diff = 1.0/dot(surfaceToLight/l.radius, surfaceToLight/l.radius)*brightness*l.intensity; + + // Specular shading + float spec = 0.0; + if (diff > 0.0) + { + vec3 h = normalize(-l.direction + v); + spec = pow(abs(dot(n, h)), 3.0 + glossiness)*s; + } + + return (diff*l.diffuse.rgb + spec*colSpecular.rgb); +} + +vec3 ComputeLightDirectional(Light l, vec3 n, vec3 v, float s) +{ + vec3 lightDir = normalize(-l.direction); + + // Diffuse shading + float diff = clamp(float(dot(n, lightDir)), 0.0, 1.0)*l.intensity; + + // Specular shading + float spec = 0.0; + if (diff > 0.0) + { + vec3 h = normalize(lightDir + v); + spec = pow(abs(dot(n, h)), 3.0 + glossiness)*s; + } + + // Combine results + return (diff*l.intensity*l.diffuse.rgb + spec*colSpecular.rgb); +} + +vec3 ComputeLightSpot(Light l, vec3 n, vec3 v, float s) +{ + vec3 surfacePos = vec3(modelMatrix*vec4(fragPosition, 1)); + vec3 lightToSurface = normalize(surfacePos - l.position); + vec3 lightDir = normalize(-l.direction); + + // Diffuse shading + float diff = clamp(float(dot(n, lightDir)), 0.0, 1.0)*l.intensity; + + // Spot attenuation + float attenuation = clamp(float(dot(n, lightToSurface)), 0.0, 1.0); + attenuation = dot(lightToSurface, -lightDir); + + float lightToSurfaceAngle = degrees(acos(attenuation)); + if (lightToSurfaceAngle > l.coneAngle) attenuation = 0.0; + + float falloff = (l.coneAngle - lightToSurfaceAngle)/l.coneAngle; + + // Combine diffuse and attenuation + float diffAttenuation = diff*attenuation; + + // Specular shading + float spec = 0.0; + if (diffAttenuation > 0.0) + { + vec3 h = normalize(lightDir + v); + spec = pow(abs(dot(n, h)), 3.0 + glossiness)*s; + } + + return (falloff*(diffAttenuation*l.diffuse.rgb + spec*colSpecular.rgb)); +} + +void main() +{ + // Calculate fragment normal in screen space + // NOTE: important to multiply model matrix by fragment normal to apply model transformation (rotation and scale) + mat3 normalMatrix = mat3(modelMatrix); + vec3 normal = normalize(normalMatrix*fragNormal); + + // Normalize normal and view direction vectors + vec3 n = normalize(normal); + vec3 v = normalize(viewDir); + + // Calculate diffuse texture color fetching + vec4 texelColor = texture(texture0, fragTexCoord); + vec3 lighting = colAmbient.rgb; + + // Calculate normal texture color fetching or set to maximum normal value by default + if (useNormal == 1) + { + n *= texture(texture1, fragTexCoord).rgb; + n = normalize(n); + } + + // Calculate specular texture color fetching or set to maximum specular value by default + float spec = 1.0; + if (useSpecular == 1) spec = texture(texture2, fragTexCoord).r; + + for (int i = 0; i < maxLights; i++) + { + // Check if light is enabled + if (lights[i].enabled == 1) + { + // Calculate lighting based on light type + if (lights[i].type == 0) lighting += ComputeLightPoint(lights[i], n, v, spec); + else if (lights[i].type == 1) lighting += ComputeLightDirectional(lights[i], n, v, spec); + else if (lights[i].type == 2) lighting += ComputeLightSpot(lights[i], n, v, spec); + } + } + + // Calculate final fragment color + finalColor = vec4(texelColor.rgb*lighting*colDiffuse.rgb, texelColor.a*colDiffuse.a); +} diff --git a/examples/resources/shaders/base.vs b/examples/resources/shaders/glsl330/standard.vs index b0f930b7..fc0a5ff4 100644 --- a/examples/resources/shaders/base.vs +++ b/examples/resources/shaders/glsl330/standard.vs @@ -1,18 +1,23 @@ -#version 330 +#version 330 in vec3 vertexPosition; -in vec2 vertexTexCoord; in vec3 vertexNormal; +in vec2 vertexTexCoord; +in vec4 vertexColor; +out vec3 fragPosition; out vec2 fragTexCoord; +out vec4 fragColor; +out vec3 fragNormal; uniform mat4 mvpMatrix; -// NOTE: Add here your custom variables - void main() { + fragPosition = vertexPosition; fragTexCoord = vertexTexCoord; - + fragColor = vertexColor; + fragNormal = vertexNormal; + gl_Position = mvpMatrix*vec4(vertexPosition, 1.0); }
\ No newline at end of file diff --git a/examples/resources/shaders/swirl.fs b/examples/resources/shaders/glsl330/swirl.fs index f89ef406..5d238ac9 100644 --- a/examples/resources/shaders/swirl.fs +++ b/examples/resources/shaders/glsl330/swirl.fs @@ -1,11 +1,15 @@ #version 330 +// Input vertex attributes (from vertex shader) in vec2 fragTexCoord; +in vec4 fragColor; -out vec4 fragColor; - +// Input uniform values uniform sampler2D texture0; -uniform vec4 fragTintColor; +uniform vec4 colDiffuse; + +// Output fragment color +out vec4 finalColor; // NOTE: Add here your custom variables @@ -17,11 +21,12 @@ float angle = 0.8; uniform vec2 center = vec2(200.0, 200.0); -void main (void) +void main() { vec2 texSize = vec2(renderWidth, renderHeight); vec2 tc = fragTexCoord*texSize; tc -= center; + float dist = length(tc); if (dist < radius) @@ -35,7 +40,7 @@ void main (void) } tc += center; - vec3 color = texture2D(texture0, tc/texSize).rgb; + vec4 color = texture2D(texture0, tc/texSize)*colDiffuse*fragColor;; - fragColor = vec4(color, 1.0);; + finalColor = vec4(color.rgb, 1.0);; }
\ No newline at end of file diff --git a/examples/resources/shaders/grayscale.fs b/examples/resources/shaders/grayscale.fs deleted file mode 100644 index af50b8c1..00000000 --- a/examples/resources/shaders/grayscale.fs +++ /dev/null @@ -1,20 +0,0 @@ -#version 330 - -in vec2 fragTexCoord; - -out vec4 fragColor; - -uniform sampler2D texture0; -uniform vec4 fragTintColor; - -// NOTE: Add here your custom variables - -void main() -{ - vec4 base = texture2D(texture0, fragTexCoord)*fragTintColor; - - // Convert to grayscale using NTSC conversion weights - float gray = dot(base.rgb, vec3(0.299, 0.587, 0.114)); - - fragColor = vec4(gray, gray, gray, fragTintColor.a); -}
\ No newline at end of file diff --git a/examples/resources/shaders/phong.fs b/examples/resources/shaders/phong.fs deleted file mode 100644 index f79413d9..00000000 --- a/examples/resources/shaders/phong.fs +++ /dev/null @@ -1,76 +0,0 @@ -#version 330 - -// Vertex shader input data -in vec2 fragTexCoord; -in vec3 fragNormal; - -// Diffuse data -uniform sampler2D texture0; -uniform vec4 fragTintColor; - -// Light attributes -uniform vec3 light_ambientColor = vec3(0.6, 0.3, 0.0); -uniform vec3 light_diffuseColor = vec3(1.0, 0.5, 0.0); -uniform vec3 light_specularColor = vec3(0.0, 1.0, 0.0); -uniform float light_intensity = 1.0; -uniform float light_specIntensity = 1.0; - -// Material attributes -uniform vec3 mat_ambientColor = vec3(1.0, 1.0, 1.0); -uniform vec3 mat_specularColor = vec3(1.0, 1.0, 1.0); -uniform float mat_glossiness = 50.0; - -// World attributes -uniform vec3 lightPos; -uniform vec3 cameraPos; - -// Fragment shader output data -out vec4 fragColor; - -vec3 AmbientLighting() -{ - return (mat_ambientColor*light_ambientColor); -} - -vec3 DiffuseLighting(in vec3 N, in vec3 L) -{ - // Lambertian reflection calculation - float diffuse = clamp(dot(N, L), 0, 1); - - return (fragTintColor.xyz*light_diffuseColor*light_intensity*diffuse); -} - -vec3 SpecularLighting(in vec3 N, in vec3 L, in vec3 V) -{ - float specular = 0.0; - - // Calculate specular reflection only if the surface is oriented to the light source - if (dot(N, L) > 0) - { - // Calculate half vector - vec3 H = normalize(L + V); - - // Calculate specular intensity - specular = pow(dot(N, H), 3 + mat_glossiness); - } - - return (mat_specularColor*light_specularColor*light_specIntensity*specular); -} - -void main() -{ - // Normalize input vectors - vec3 L = normalize(lightPos); - vec3 V = normalize(cameraPos); - vec3 N = normalize(fragNormal); - - vec3 ambient = AmbientLighting(); - vec3 diffuse = DiffuseLighting(N, L); - vec3 specular = SpecularLighting(N, L, V); - - // Get base color from texture - vec4 textureColor = texture(texture0, fragTexCoord); - vec3 finalColor = textureColor.rgb; - - fragColor = vec4(finalColor * (ambient + diffuse + specular), textureColor.a); -}
\ No newline at end of file diff --git a/examples/resources/shaders/phong.vs b/examples/resources/shaders/phong.vs deleted file mode 100644 index 52cc2227..00000000 --- a/examples/resources/shaders/phong.vs +++ /dev/null @@ -1,29 +0,0 @@ -#version 330 - -// Vertex input data -in vec3 vertexPosition; -in vec2 vertexTexCoord; -in vec3 vertexNormal; - -// Projection and model data -uniform mat4 mvpMatrix; - -uniform mat4 modelMatrix; -//uniform mat4 viewMatrix; // Not used - -// Attributes to fragment shader -out vec2 fragTexCoord; -out vec3 fragNormal; - -void main() -{ - // Send texture coord to fragment shader - fragTexCoord = vertexTexCoord; - - // Calculate view vector normal from model - mat3 normalMatrix = transpose(inverse(mat3(modelMatrix))); - fragNormal = normalize(normalMatrix*vertexNormal); - - // Calculate final vertex position - gl_Position = mvpMatrix*vec4(vertexPosition, 1.0); -}
\ No newline at end of file diff --git a/examples/resources/shaders/shapes_grayscale.fs b/examples/resources/shaders/shapes_grayscale.fs deleted file mode 100644 index 0698e1bf..00000000 --- a/examples/resources/shaders/shapes_grayscale.fs +++ /dev/null @@ -1,15 +0,0 @@ -#version 330 - -uniform sampler2D texture0; -varying vec2 fragTexCoord; -varying vec4 fragTintColor; - -void main() -{ - vec4 base = texture2D(texture0, fragTexCoord)*fragTintColor; - - // Convert to grayscale using NTSC conversion weights - float gray = dot(base.rgb, vec3(0.299, 0.587, 0.114)); - - gl_FragColor = vec4(gray, gray, gray, base.a); -}
\ No newline at end of file diff --git a/examples/resources/xbox.png b/examples/resources/xbox.png Binary files differnew file mode 100644 index 00000000..029c9109 --- /dev/null +++ b/examples/resources/xbox.png diff --git a/examples/rlgl_oculus_rift.c b/examples/rlgl_oculus_rift.c new file mode 100644 index 00000000..30ef6f3b --- /dev/null +++ b/examples/rlgl_oculus_rift.c @@ -0,0 +1,393 @@ +/******************************************************************************************* +* +* raylib [rlgl] example - Oculus minimum sample +* +* NOTE: This example requires OpenGL 3.3 or ES2 versions for shaders support, +* OpenGL 1.1 does not support shaders but it can also be used. +* +* Compile rlgl module using: +* gcc -c rlgl.c -Wall -std=c99 -DRLGL_STANDALONE -DRAYMATH_IMPLEMENTATION -DGRAPHICS_API_OPENGL_33 -DRLGL_OCULUS_SUPPORT +* +* NOTE 1: rlgl module requires the following header-only files: +* external/glad.h - OpenGL extensions loader (stripped to only required extensions) +* shader_standard.h - Standard shader for materials and lighting +* shader_distortion.h - Distortion shader for VR +* raymath.h - Vector and matrix math functions +* +* NOTE 2: rlgl requires LibOVR (Oculus PC SDK) to support Oculus Rift CV1 +* +* Compile example using: +* gcc -o rlgl_oculus_rift.exe rlgl_oculus_rift.c rlgl.o -L. -lLibOVRRT32_1 -lglfw3 -lopengl32 -lgdi32 -std=c99 +* +* NOTE: Example must be linked against LibOVRRT32_1.dll that comes with Oculus Rift runtime. +* +* This example has been created using raylib 1.5 (www.raylib.com) +* raylib is licensed under an unmodified zlib/libpng license (View raylib.h for details) +* +* Copyright (c) 2015 Ramon Santamaria (@raysan5) +* +********************************************************************************************/ + +#include <stdlib.h> +#include <stdarg.h> +#include <stdio.h> +#include <string.h> +#include <math.h> + +#include <GLFW/glfw3.h> // Windows/Context and inputs management + +#define RLGL_STANDALONE +#include "rlgl.h" // rlgl library: OpenGL 1.1 immediate-mode style coding + +#define RED (Color){ 230, 41, 55, 255 } // Red +#define RAYWHITE (Color){ 245, 245, 245, 255 } // My own White (raylib logo) +#define DARKGRAY (Color){ 80, 80, 80, 255 } // Dark Gray + +//---------------------------------------------------------------------------------- +// Module specific Functions Declaration +//---------------------------------------------------------------------------------- +static void ErrorCallback(int error, const char* description); +static void KeyCallback(GLFWwindow* window, int key, int scancode, int action, int mods); + +// Drawing functions (uses rlgl functionality) +static void DrawGrid(int slices, float spacing); +static void DrawCube(Vector3 position, float width, float height, float length, Color color); +static void DrawCubeWires(Vector3 position, float width, float height, float length, Color color); +static void DrawRectangleV(Vector2 position, Vector2 size, Color color); + +//---------------------------------------------------------------------------------- +// Main Entry point +//---------------------------------------------------------------------------------- +int main(void) +{ + // Initialization + //-------------------------------------------------------------------------------------- + int screenWidth = 1080; // Mirror screen width (set to hmdDesc.Resolution.w/2) + int screenHeight = 600; // Mirror screen height (set to hmdDesc.Resolution.h/2) + + // NOTE: Mirror screen size can be set to any desired resolution! + + // GLFW3 Initialization + OpenGL 3.3 Context + Extensions + //-------------------------------------------------------- + glfwSetErrorCallback(ErrorCallback); + + if (!glfwInit()) + { + TraceLog(WARNING, "GLFW3: Can not initialize GLFW"); + return 1; + } + else TraceLog(INFO, "GLFW3: GLFW initialized successfully"); + + glfwWindowHint(GLFW_SAMPLES, 4); + glfwWindowHint(GLFW_DEPTH_BITS, 16); + glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3); + glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3); + glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE); + glfwWindowHint(GLFW_OPENGL_DEBUG_CONTEXT, GL_TRUE); + + GLFWwindow *window = glfwCreateWindow(screenWidth, screenHeight, "rlgl oculus rift", NULL, NULL); + + if (!window) + { + glfwTerminate(); + return 2; + } + else TraceLog(INFO, "GLFW3: Window created successfully"); + + glfwSetKeyCallback(window, KeyCallback); + + glfwMakeContextCurrent(window); + glfwSwapInterval(0); + + // Load OpenGL 3.3 supported extensions + rlglLoadExtensions(glfwGetProcAddress); + //-------------------------------------------------------- + + // Initialize OpenGL context (states and resources) + rlglInit(screenWidth, screenHeight); + + rlClearColor(245, 245, 245, 255); // Define clear color + rlEnableDepthTest(); // Enable DEPTH_TEST for 3D + + // Define custom camera to initialize projection and view matrices + Camera camera; + camera.position = (Vector3){ 5.0f, 5.0f, 5.0f }; // Camera position + camera.target = (Vector3){ 0.0f, 0.0f, 0.0f }; // Camera looking at point + camera.up = (Vector3){ 0.0f, 1.0f, 0.0f }; // Camera up vector (rotation towards target) + camera.fovy = 45.0f; // Camera field-of-view Y + + // Initialize viewport and internal projection/modelview matrices + rlViewport(0, 0, screenWidth, screenHeight); + rlMatrixMode(RL_PROJECTION); // Switch to PROJECTION matrix + rlLoadIdentity(); // Reset current matrix (PROJECTION) + + // Setup perspective projection + float aspect = (float)screenWidth/(float)screenHeight; + double top = 0.01*tan(camera.fovy*PI/360.0); + double right = top*aspect; + rlFrustum(-right, right, -top, top, 0.01, 1000.0); + + rlMatrixMode(RL_MODELVIEW); // Switch back to MODELVIEW matrix + rlLoadIdentity(); // Reset current matrix (MODELVIEW) + + // Setup Camera view + Matrix cameraView = MatrixLookAt(camera.position, camera.target, camera.up); + rlMultMatrixf(MatrixToFloat(cameraView)); // Multiply MODELVIEW matrix by view matrix (camera) + + InitOculusDevice(); // Initialize Oculus Rift CV1 + + Vector3 cubePosition = { 0.0f, 0.0f, 0.0f }; + //-------------------------------------------------------------------------------------- + + // Main game loop + while (!glfwWindowShouldClose(window)) + { + // Update + //---------------------------------------------------------------------------------- + UpdateOculusTracking(&camera); + //---------------------------------------------------------------------------------- + + // Draw + //---------------------------------------------------------------------------------- + BeginOculusDrawing(); + + rlClearScreenBuffers(); // Clear current framebuffer(s) + + DrawCube(cubePosition, 2.0f, 2.0f, 2.0f, RED); + DrawCubeWires(cubePosition, 2.0f, 2.0f, 2.0f, RAYWHITE); + DrawGrid(10, 1.0f); + + // NOTE: Internal buffers drawing (3D data) + rlglDraw(); + + EndOculusDrawing(); + + glfwSwapBuffers(window); + glfwPollEvents(); + //---------------------------------------------------------------------------------- + } + + // De-Initialization + //-------------------------------------------------------------------------------------- + CloseOculusDevice(); // Close Oculus device and clear resources + + rlglClose(); // Unload rlgl internal buffers and default shader/texture + + glfwDestroyWindow(window); // Close window + glfwTerminate(); // Free GLFW3 resources + //-------------------------------------------------------------------------------------- + + return 0; +} + +//---------------------------------------------------------------------------------- +// Module specific Functions Definitions +//---------------------------------------------------------------------------------- + +// GLFW3: Error callback +static void ErrorCallback(int error, const char* description) +{ + TraceLog(ERROR, description); +} + +// GLFW3: Keyboard callback +static void KeyCallback(GLFWwindow* window, int key, int scancode, int action, int mods) +{ + if (key == GLFW_KEY_ESCAPE && action == GLFW_PRESS) + { + glfwSetWindowShouldClose(window, GL_TRUE); + } +} + +// Draw rectangle using rlgl OpenGL 1.1 style coding (translated to OpenGL 3.3 internally) +static void DrawRectangleV(Vector2 position, Vector2 size, Color color) +{ + rlBegin(RL_TRIANGLES); + rlColor4ub(color.r, color.g, color.b, color.a); + + rlVertex2i(position.x, position.y); + rlVertex2i(position.x, position.y + size.y); + rlVertex2i(position.x + size.x, position.y + size.y); + + rlVertex2i(position.x, position.y); + rlVertex2i(position.x + size.x, position.y + size.y); + rlVertex2i(position.x + size.x, position.y); + rlEnd(); +} + +// Draw a grid centered at (0, 0, 0) +static void DrawGrid(int slices, float spacing) +{ + int halfSlices = slices / 2; + + rlBegin(RL_LINES); + for(int i = -halfSlices; i <= halfSlices; i++) + { + if (i == 0) + { + rlColor3f(0.5f, 0.5f, 0.5f); + rlColor3f(0.5f, 0.5f, 0.5f); + rlColor3f(0.5f, 0.5f, 0.5f); + rlColor3f(0.5f, 0.5f, 0.5f); + } + else + { + rlColor3f(0.75f, 0.75f, 0.75f); + rlColor3f(0.75f, 0.75f, 0.75f); + rlColor3f(0.75f, 0.75f, 0.75f); + rlColor3f(0.75f, 0.75f, 0.75f); + } + + rlVertex3f((float)i*spacing, 0.0f, (float)-halfSlices*spacing); + rlVertex3f((float)i*spacing, 0.0f, (float)halfSlices*spacing); + + rlVertex3f((float)-halfSlices*spacing, 0.0f, (float)i*spacing); + rlVertex3f((float)halfSlices*spacing, 0.0f, (float)i*spacing); + } + rlEnd(); +} + +// Draw cube +// NOTE: Cube position is the center position +void DrawCube(Vector3 position, float width, float height, float length, Color color) +{ + float x = 0.0f; + float y = 0.0f; + float z = 0.0f; + + rlPushMatrix(); + + // NOTE: Be careful! Function order matters (rotate -> scale -> translate) + rlTranslatef(position.x, position.y, position.z); + //rlScalef(2.0f, 2.0f, 2.0f); + //rlRotatef(45, 0, 1, 0); + + rlBegin(RL_TRIANGLES); + rlColor4ub(color.r, color.g, color.b, color.a); + + // Front Face ----------------------------------------------------- + rlVertex3f(x-width/2, y-height/2, z+length/2); // Bottom Left + rlVertex3f(x+width/2, y-height/2, z+length/2); // Bottom Right + rlVertex3f(x-width/2, y+height/2, z+length/2); // Top Left + + rlVertex3f(x+width/2, y+height/2, z+length/2); // Top Right + rlVertex3f(x-width/2, y+height/2, z+length/2); // Top Left + rlVertex3f(x+width/2, y-height/2, z+length/2); // Bottom Right + + // Back Face ------------------------------------------------------ + rlVertex3f(x-width/2, y-height/2, z-length/2); // Bottom Left + rlVertex3f(x-width/2, y+height/2, z-length/2); // Top Left + rlVertex3f(x+width/2, y-height/2, z-length/2); // Bottom Right + + rlVertex3f(x+width/2, y+height/2, z-length/2); // Top Right + rlVertex3f(x+width/2, y-height/2, z-length/2); // Bottom Right + rlVertex3f(x-width/2, y+height/2, z-length/2); // Top Left + + // Top Face ------------------------------------------------------- + rlVertex3f(x-width/2, y+height/2, z-length/2); // Top Left + rlVertex3f(x-width/2, y+height/2, z+length/2); // Bottom Left + rlVertex3f(x+width/2, y+height/2, z+length/2); // Bottom Right + + rlVertex3f(x+width/2, y+height/2, z-length/2); // Top Right + rlVertex3f(x-width/2, y+height/2, z-length/2); // Top Left + rlVertex3f(x+width/2, y+height/2, z+length/2); // Bottom Right + + // Bottom Face ---------------------------------------------------- + rlVertex3f(x-width/2, y-height/2, z-length/2); // Top Left + rlVertex3f(x+width/2, y-height/2, z+length/2); // Bottom Right + rlVertex3f(x-width/2, y-height/2, z+length/2); // Bottom Left + + rlVertex3f(x+width/2, y-height/2, z-length/2); // Top Right + rlVertex3f(x+width/2, y-height/2, z+length/2); // Bottom Right + rlVertex3f(x-width/2, y-height/2, z-length/2); // Top Left + + // Right face ----------------------------------------------------- + rlVertex3f(x+width/2, y-height/2, z-length/2); // Bottom Right + rlVertex3f(x+width/2, y+height/2, z-length/2); // Top Right + rlVertex3f(x+width/2, y+height/2, z+length/2); // Top Left + + rlVertex3f(x+width/2, y-height/2, z+length/2); // Bottom Left + rlVertex3f(x+width/2, y-height/2, z-length/2); // Bottom Right + rlVertex3f(x+width/2, y+height/2, z+length/2); // Top Left + + // Left Face ------------------------------------------------------ + rlVertex3f(x-width/2, y-height/2, z-length/2); // Bottom Right + rlVertex3f(x-width/2, y+height/2, z+length/2); // Top Left + rlVertex3f(x-width/2, y+height/2, z-length/2); // Top Right + + rlVertex3f(x-width/2, y-height/2, z+length/2); // Bottom Left + rlVertex3f(x-width/2, y+height/2, z+length/2); // Top Left + rlVertex3f(x-width/2, y-height/2, z-length/2); // Bottom Right + rlEnd(); + rlPopMatrix(); +} + +// Draw cube wires +void DrawCubeWires(Vector3 position, float width, float height, float length, Color color) +{ + float x = 0.0f; + float y = 0.0f; + float z = 0.0f; + + rlPushMatrix(); + + rlTranslatef(position.x, position.y, position.z); + //rlRotatef(45, 0, 1, 0); + + rlBegin(RL_LINES); + rlColor4ub(color.r, color.g, color.b, color.a); + + // Front Face ----------------------------------------------------- + // Bottom Line + rlVertex3f(x-width/2, y-height/2, z+length/2); // Bottom Left + rlVertex3f(x+width/2, y-height/2, z+length/2); // Bottom Right + + // Left Line + rlVertex3f(x+width/2, y-height/2, z+length/2); // Bottom Right + rlVertex3f(x+width/2, y+height/2, z+length/2); // Top Right + + // Top Line + rlVertex3f(x+width/2, y+height/2, z+length/2); // Top Right + rlVertex3f(x-width/2, y+height/2, z+length/2); // Top Left + + // Right Line + rlVertex3f(x-width/2, y+height/2, z+length/2); // Top Left + rlVertex3f(x-width/2, y-height/2, z+length/2); // Bottom Left + + // Back Face ------------------------------------------------------ + // Bottom Line + rlVertex3f(x-width/2, y-height/2, z-length/2); // Bottom Left + rlVertex3f(x+width/2, y-height/2, z-length/2); // Bottom Right + + // Left Line + rlVertex3f(x+width/2, y-height/2, z-length/2); // Bottom Right + rlVertex3f(x+width/2, y+height/2, z-length/2); // Top Right + + // Top Line + rlVertex3f(x+width/2, y+height/2, z-length/2); // Top Right + rlVertex3f(x-width/2, y+height/2, z-length/2); // Top Left + + // Right Line + rlVertex3f(x-width/2, y+height/2, z-length/2); // Top Left + rlVertex3f(x-width/2, y-height/2, z-length/2); // Bottom Left + + // Top Face ------------------------------------------------------- + // Left Line + rlVertex3f(x-width/2, y+height/2, z+length/2); // Top Left Front + rlVertex3f(x-width/2, y+height/2, z-length/2); // Top Left Back + + // Right Line + rlVertex3f(x+width/2, y+height/2, z+length/2); // Top Right Front + rlVertex3f(x+width/2, y+height/2, z-length/2); // Top Right Back + + // Bottom Face --------------------------------------------------- + // Left Line + rlVertex3f(x-width/2, y-height/2, z+length/2); // Top Left Front + rlVertex3f(x-width/2, y-height/2, z-length/2); // Top Left Back + + // Right Line + rlVertex3f(x+width/2, y-height/2, z+length/2); // Top Right Front + rlVertex3f(x+width/2, y-height/2, z-length/2); // Top Right Back + rlEnd(); + rlPopMatrix(); +}
\ No newline at end of file diff --git a/examples/rlgl_standalone.c b/examples/rlgl_standalone.c new file mode 100644 index 00000000..be0cfc52 --- /dev/null +++ b/examples/rlgl_standalone.c @@ -0,0 +1,395 @@ +/******************************************************************************************* +* +* raylib [rlgl] example - Using rlgl module as standalone module +* +* NOTE: This example requires OpenGL 3.3 or ES2 versions for shaders support, +* OpenGL 1.1 does not support shaders but it can also be used. +* +* Compile rlgl module using: +* gcc -c rlgl.c -Wall -std=c99 -DRLGL_STANDALONE -DRAYMATH_IMPLEMENTATION -DGRAPHICS_API_OPENGL_33 +* +* NOTE: rlgl module requires the following header-only files: +* external/glad.h - OpenGL extensions loader (stripped to only required extensions) +* shader_standard.h - Standard shader for materials and lighting +* shader_distortion.h - Distortion shader for VR +* raymath.h - Vector and matrix math functions +* +* Compile example using: +* gcc -o rlgl_standalone.exe rlgl_standalone.c rlgl.o -lglfw3 -lopengl32 -lgdi32 -std=c99 +* +* This example has been created using raylib 1.5 (www.raylib.com) +* raylib is licensed under an unmodified zlib/libpng license (View raylib.h for details) +* +* Copyright (c) 2015 Ramon Santamaria (@raysan5) +* +********************************************************************************************/ + +#include <GLFW/glfw3.h> // Windows/Context and inputs management + +#define RLGL_STANDALONE +#include "rlgl.h" // rlgl library: OpenGL 1.1 immediate-mode style coding + +#define RED (Color){ 230, 41, 55, 255 } // Red +#define RAYWHITE (Color){ 245, 245, 245, 255 } // My own White (raylib logo) +#define DARKGRAY (Color){ 80, 80, 80, 255 } // Dark Gray + +//---------------------------------------------------------------------------------- +// Module specific Functions Declaration +//---------------------------------------------------------------------------------- +static void ErrorCallback(int error, const char* description); +static void KeyCallback(GLFWwindow* window, int key, int scancode, int action, int mods); + +// Drawing functions (uses rlgl functionality) +static void DrawGrid(int slices, float spacing); +static void DrawCube(Vector3 position, float width, float height, float length, Color color); +static void DrawCubeWires(Vector3 position, float width, float height, float length, Color color); +static void DrawRectangleV(Vector2 position, Vector2 size, Color color); + +//---------------------------------------------------------------------------------- +// Main Entry point +//---------------------------------------------------------------------------------- +int main(void) +{ + // Initialization + //-------------------------------------------------------------------------------------- + const int screenWidth = 800; + const int screenHeight = 450; + + // GLFW3 Initialization + OpenGL 3.3 Context + Extensions + //-------------------------------------------------------- + glfwSetErrorCallback(ErrorCallback); + + if (!glfwInit()) + { + TraceLog(WARNING, "GLFW3: Can not initialize GLFW"); + return 1; + } + else TraceLog(INFO, "GLFW3: GLFW initialized successfully"); + + glfwWindowHint(GLFW_SAMPLES, 4); + glfwWindowHint(GLFW_DEPTH_BITS, 16); + glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3); + glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3); + glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE); + glfwWindowHint(GLFW_OPENGL_DEBUG_CONTEXT, GL_TRUE); + + GLFWwindow *window = glfwCreateWindow(screenWidth, screenHeight, "rlgl standalone", NULL, NULL); + + if (!window) + { + glfwTerminate(); + return 2; + } + else TraceLog(INFO, "GLFW3: Window created successfully"); + + glfwSetWindowPos(window, 200, 200); + + glfwSetKeyCallback(window, KeyCallback); + + glfwMakeContextCurrent(window); + glfwSwapInterval(1); + + // Load OpenGL 3.3 supported extensions + rlglLoadExtensions(glfwGetProcAddress); + //-------------------------------------------------------- + + // Initialize OpenGL context (states and resources) + rlglInit(screenWidth, screenHeight); + + // Initialize viewport and internal projection/modelview matrices + rlViewport(0, 0, screenWidth, screenHeight); + rlMatrixMode(RL_PROJECTION); // Switch to PROJECTION matrix + rlLoadIdentity(); // Reset current matrix (PROJECTION) + rlOrtho(0, screenWidth, screenHeight, 0, 0.0f, 1.0f); // Orthographic projection with top-left corner at (0,0) + rlMatrixMode(RL_MODELVIEW); // Switch back to MODELVIEW matrix + rlLoadIdentity(); // Reset current matrix (MODELVIEW) + + rlClearColor(245, 245, 245, 255); // Define clear color + rlEnableDepthTest(); // Enable DEPTH_TEST for 3D + + Camera camera; + camera.position = (Vector3){ 5.0f, 5.0f, 5.0f }; // Camera position + camera.target = (Vector3){ 0.0f, 0.0f, 0.0f }; // Camera looking at point + camera.up = (Vector3){ 0.0f, 1.0f, 0.0f }; // Camera up vector (rotation towards target) + camera.fovy = 45.0f; // Camera field-of-view Y + + Vector3 cubePosition = { 0.0f, 0.0f, 0.0f }; // Cube default position (center) + //-------------------------------------------------------------------------------------- + + // Main game loop + while (!glfwWindowShouldClose(window)) + { + // Update + //---------------------------------------------------------------------------------- + // ... + //---------------------------------------------------------------------------------- + + // Draw + //---------------------------------------------------------------------------------- + rlClearScreenBuffers(); // Clear current framebuffer + + // Calculate projection matrix (from perspective) and view matrix from camera look at + Matrix matProj = MatrixPerspective(camera.fovy, (double)screenWidth/(double)screenHeight, 0.01, 1000.0); + MatrixTranspose(&matProj); + Matrix matView = MatrixLookAt(camera.position, camera.target, camera.up); + + SetMatrixModelview(matView); // Replace internal modelview matrix by a custom one + SetMatrixProjection(matProj); // Replace internal projection matrix by a custom one + + DrawCube(cubePosition, 2.0f, 2.0f, 2.0f, RED); + DrawCubeWires(cubePosition, 2.0f, 2.0f, 2.0f, RAYWHITE); + DrawGrid(10, 1.0f); + + // NOTE: Internal buffers drawing (3D data) + rlglDraw(); + + // Draw '2D' elements in the scene (GUI) +#define RLGL_CREATE_MATRIX_MANUALLY +#if defined(RLGL_CREATE_MATRIX_MANUALLY) + matProj = MatrixOrtho(0.0, screenWidth, screenHeight, 0.0, 0.0, 1.0); + MatrixTranspose(&matProj); + matView = MatrixIdentity(); + + SetMatrixModelview(matView); // Replace internal modelview matrix by a custom one + SetMatrixProjection(matProj); // Replace internal projection matrix by a custom one + +#else // Let rlgl generate and multiply matrix internally + + rlMatrixMode(RL_PROJECTION); // Enable internal projection matrix + rlLoadIdentity(); // Reset internal projection matrix + rlOrtho(0.0, screenWidth, screenHeight, 0.0, 0.0, 1.0); // Recalculate internal projection matrix + rlMatrixMode(RL_MODELVIEW); // Enable internal modelview matrix + rlLoadIdentity(); // Reset internal modelview matrix +#endif + DrawRectangleV((Vector2){ 10.0f, 10.0f }, (Vector2){ 780.0f, 20.0f }, DARKGRAY); + + // NOTE: Internal buffers drawing (2D data) + rlglDraw(); + + glfwSwapBuffers(window); + glfwPollEvents(); + //---------------------------------------------------------------------------------- + } + + // De-Initialization + //-------------------------------------------------------------------------------------- + rlglClose(); // Unload rlgl internal buffers and default shader/texture + + glfwDestroyWindow(window); // Close window + glfwTerminate(); // Free GLFW3 resources + //-------------------------------------------------------------------------------------- + + return 0; +} + +//---------------------------------------------------------------------------------- +// Module specific Functions Definitions +//---------------------------------------------------------------------------------- + +// GLFW3: Error callback +static void ErrorCallback(int error, const char* description) +{ + TraceLog(ERROR, description); +} + +// GLFW3: Keyboard callback +static void KeyCallback(GLFWwindow* window, int key, int scancode, int action, int mods) +{ + if (key == GLFW_KEY_ESCAPE && action == GLFW_PRESS) + { + glfwSetWindowShouldClose(window, GL_TRUE); + } +} + +// Draw rectangle using rlgl OpenGL 1.1 style coding (translated to OpenGL 3.3 internally) +static void DrawRectangleV(Vector2 position, Vector2 size, Color color) +{ + rlBegin(RL_TRIANGLES); + rlColor4ub(color.r, color.g, color.b, color.a); + + rlVertex2i(position.x, position.y); + rlVertex2i(position.x, position.y + size.y); + rlVertex2i(position.x + size.x, position.y + size.y); + + rlVertex2i(position.x, position.y); + rlVertex2i(position.x + size.x, position.y + size.y); + rlVertex2i(position.x + size.x, position.y); + rlEnd(); +} + +// Draw a grid centered at (0, 0, 0) +static void DrawGrid(int slices, float spacing) +{ + int halfSlices = slices / 2; + + rlBegin(RL_LINES); + for(int i = -halfSlices; i <= halfSlices; i++) + { + if (i == 0) + { + rlColor3f(0.5f, 0.5f, 0.5f); + rlColor3f(0.5f, 0.5f, 0.5f); + rlColor3f(0.5f, 0.5f, 0.5f); + rlColor3f(0.5f, 0.5f, 0.5f); + } + else + { + rlColor3f(0.75f, 0.75f, 0.75f); + rlColor3f(0.75f, 0.75f, 0.75f); + rlColor3f(0.75f, 0.75f, 0.75f); + rlColor3f(0.75f, 0.75f, 0.75f); + } + + rlVertex3f((float)i*spacing, 0.0f, (float)-halfSlices*spacing); + rlVertex3f((float)i*spacing, 0.0f, (float)halfSlices*spacing); + + rlVertex3f((float)-halfSlices*spacing, 0.0f, (float)i*spacing); + rlVertex3f((float)halfSlices*spacing, 0.0f, (float)i*spacing); + } + rlEnd(); +} + +// Draw cube +// NOTE: Cube position is the center position +void DrawCube(Vector3 position, float width, float height, float length, Color color) +{ + float x = 0.0f; + float y = 0.0f; + float z = 0.0f; + + rlPushMatrix(); + + // NOTE: Be careful! Function order matters (rotate -> scale -> translate) + rlTranslatef(position.x, position.y, position.z); + //rlScalef(2.0f, 2.0f, 2.0f); + //rlRotatef(45, 0, 1, 0); + + rlBegin(RL_TRIANGLES); + rlColor4ub(color.r, color.g, color.b, color.a); + + // Front Face ----------------------------------------------------- + rlVertex3f(x-width/2, y-height/2, z+length/2); // Bottom Left + rlVertex3f(x+width/2, y-height/2, z+length/2); // Bottom Right + rlVertex3f(x-width/2, y+height/2, z+length/2); // Top Left + + rlVertex3f(x+width/2, y+height/2, z+length/2); // Top Right + rlVertex3f(x-width/2, y+height/2, z+length/2); // Top Left + rlVertex3f(x+width/2, y-height/2, z+length/2); // Bottom Right + + // Back Face ------------------------------------------------------ + rlVertex3f(x-width/2, y-height/2, z-length/2); // Bottom Left + rlVertex3f(x-width/2, y+height/2, z-length/2); // Top Left + rlVertex3f(x+width/2, y-height/2, z-length/2); // Bottom Right + + rlVertex3f(x+width/2, y+height/2, z-length/2); // Top Right + rlVertex3f(x+width/2, y-height/2, z-length/2); // Bottom Right + rlVertex3f(x-width/2, y+height/2, z-length/2); // Top Left + + // Top Face ------------------------------------------------------- + rlVertex3f(x-width/2, y+height/2, z-length/2); // Top Left + rlVertex3f(x-width/2, y+height/2, z+length/2); // Bottom Left + rlVertex3f(x+width/2, y+height/2, z+length/2); // Bottom Right + + rlVertex3f(x+width/2, y+height/2, z-length/2); // Top Right + rlVertex3f(x-width/2, y+height/2, z-length/2); // Top Left + rlVertex3f(x+width/2, y+height/2, z+length/2); // Bottom Right + + // Bottom Face ---------------------------------------------------- + rlVertex3f(x-width/2, y-height/2, z-length/2); // Top Left + rlVertex3f(x+width/2, y-height/2, z+length/2); // Bottom Right + rlVertex3f(x-width/2, y-height/2, z+length/2); // Bottom Left + + rlVertex3f(x+width/2, y-height/2, z-length/2); // Top Right + rlVertex3f(x+width/2, y-height/2, z+length/2); // Bottom Right + rlVertex3f(x-width/2, y-height/2, z-length/2); // Top Left + + // Right face ----------------------------------------------------- + rlVertex3f(x+width/2, y-height/2, z-length/2); // Bottom Right + rlVertex3f(x+width/2, y+height/2, z-length/2); // Top Right + rlVertex3f(x+width/2, y+height/2, z+length/2); // Top Left + + rlVertex3f(x+width/2, y-height/2, z+length/2); // Bottom Left + rlVertex3f(x+width/2, y-height/2, z-length/2); // Bottom Right + rlVertex3f(x+width/2, y+height/2, z+length/2); // Top Left + + // Left Face ------------------------------------------------------ + rlVertex3f(x-width/2, y-height/2, z-length/2); // Bottom Right + rlVertex3f(x-width/2, y+height/2, z+length/2); // Top Left + rlVertex3f(x-width/2, y+height/2, z-length/2); // Top Right + + rlVertex3f(x-width/2, y-height/2, z+length/2); // Bottom Left + rlVertex3f(x-width/2, y+height/2, z+length/2); // Top Left + rlVertex3f(x-width/2, y-height/2, z-length/2); // Bottom Right + rlEnd(); + rlPopMatrix(); +} + +// Draw cube wires +void DrawCubeWires(Vector3 position, float width, float height, float length, Color color) +{ + float x = 0.0f; + float y = 0.0f; + float z = 0.0f; + + rlPushMatrix(); + + rlTranslatef(position.x, position.y, position.z); + //rlRotatef(45, 0, 1, 0); + + rlBegin(RL_LINES); + rlColor4ub(color.r, color.g, color.b, color.a); + + // Front Face ----------------------------------------------------- + // Bottom Line + rlVertex3f(x-width/2, y-height/2, z+length/2); // Bottom Left + rlVertex3f(x+width/2, y-height/2, z+length/2); // Bottom Right + + // Left Line + rlVertex3f(x+width/2, y-height/2, z+length/2); // Bottom Right + rlVertex3f(x+width/2, y+height/2, z+length/2); // Top Right + + // Top Line + rlVertex3f(x+width/2, y+height/2, z+length/2); // Top Right + rlVertex3f(x-width/2, y+height/2, z+length/2); // Top Left + + // Right Line + rlVertex3f(x-width/2, y+height/2, z+length/2); // Top Left + rlVertex3f(x-width/2, y-height/2, z+length/2); // Bottom Left + + // Back Face ------------------------------------------------------ + // Bottom Line + rlVertex3f(x-width/2, y-height/2, z-length/2); // Bottom Left + rlVertex3f(x+width/2, y-height/2, z-length/2); // Bottom Right + + // Left Line + rlVertex3f(x+width/2, y-height/2, z-length/2); // Bottom Right + rlVertex3f(x+width/2, y+height/2, z-length/2); // Top Right + + // Top Line + rlVertex3f(x+width/2, y+height/2, z-length/2); // Top Right + rlVertex3f(x-width/2, y+height/2, z-length/2); // Top Left + + // Right Line + rlVertex3f(x-width/2, y+height/2, z-length/2); // Top Left + rlVertex3f(x-width/2, y-height/2, z-length/2); // Bottom Left + + // Top Face ------------------------------------------------------- + // Left Line + rlVertex3f(x-width/2, y+height/2, z+length/2); // Top Left Front + rlVertex3f(x-width/2, y+height/2, z-length/2); // Top Left Back + + // Right Line + rlVertex3f(x+width/2, y+height/2, z+length/2); // Top Right Front + rlVertex3f(x+width/2, y+height/2, z-length/2); // Top Right Back + + // Bottom Face --------------------------------------------------- + // Left Line + rlVertex3f(x-width/2, y-height/2, z+length/2); // Top Left Front + rlVertex3f(x-width/2, y-height/2, z-length/2); // Top Left Back + + // Right Line + rlVertex3f(x+width/2, y-height/2, z+length/2); // Top Right Front + rlVertex3f(x+width/2, y-height/2, z-length/2); // Top Right Back + rlEnd(); + rlPopMatrix(); +} diff --git a/examples/shaders_basic_lighting.c b/examples/shaders_basic_lighting.c deleted file mode 100644 index 84bd1af4..00000000 --- a/examples/shaders_basic_lighting.c +++ /dev/null @@ -1,171 +0,0 @@ -/******************************************************************************************* -* -* raylib [shaders] example - Basic lighting: Blinn-Phong -* -* This example has been created using raylib 1.3 (www.raylib.com) -* raylib is licensed under an unmodified zlib/libpng license (View raylib.h for details) -* -* Copyright (c) 2014 Ramon Santamaria (@raysan5) -* -********************************************************************************************/ - -#include "raylib.h" - -#define SHININESS_SPEED 1.0f -#define LIGHT_SPEED 0.25f - -// Light type -typedef struct Light { - Vector3 position; - Vector3 direction; - float intensity; - float specIntensity; - Color diffuse; - Color ambient; - Color specular; -} Light; - -int main() -{ - // Initialization - //-------------------------------------------------------------------------------------- - const int screenWidth = 800; - const int screenHeight = 450; - - SetConfigFlags(FLAG_MSAA_4X_HINT); - InitWindow(screenWidth, screenHeight, "raylib [shaders] example - basic lighting"); - - // Camera initialization - Camera camera = {{ 8.0f, 8.0f, 8.0f }, { 0.0f, 3.0f, 0.0f }, { 0.0f, 1.0f, 0.0f }}; - - // Model initialization - Vector3 position = { 0.0f, 0.0f, 0.0f }; - Model model = LoadModel("resources/model/dwarf.obj"); - Shader shader = LoadShader("resources/shaders/phong.vs", "resources/shaders/phong.fs"); - SetModelShader(&model, shader); - - // Shader locations initialization - int lIntensityLoc = GetShaderLocation(shader, "light_intensity"); - int lAmbientLoc = GetShaderLocation(shader, "light_ambientColor"); - int lDiffuseLoc = GetShaderLocation(shader, "light_diffuseColor"); - int lSpecularLoc = GetShaderLocation(shader, "light_specularColor"); - int lSpecIntensityLoc = GetShaderLocation(shader, "light_specIntensity"); - - int mAmbientLoc = GetShaderLocation(shader, "mat_ambientColor"); - int mSpecularLoc = GetShaderLocation(shader, "mat_specularColor"); - int mGlossLoc = GetShaderLocation(shader, "mat_glossiness"); - - // Camera and light vectors shader locations - int cameraLoc = GetShaderLocation(shader, "cameraPos"); - int lightLoc = GetShaderLocation(shader, "lightPos"); - - // Model and View matrix locations (required for lighting) - int modelLoc = GetShaderLocation(shader, "modelMatrix"); - //int viewLoc = GetShaderLocation(shader, "viewMatrix"); // Not used - - // Light and material definitions - Light light; - Material matBlinn; - - // Light initialization - light.position = (Vector3){ 4.0f, 2.0f, 0.0f }; - light.direction = (Vector3){ 5.0f, 1.0f, 1.0f }; - light.intensity = 1.0f; - light.diffuse = WHITE; - light.ambient = (Color){ 150, 75, 0, 255 }; - light.specular = WHITE; - light.specIntensity = 1.0f; - - // Material initialization - matBlinn.colDiffuse = WHITE; - matBlinn.colAmbient = (Color){ 50, 50, 50, 255 }; - matBlinn.colSpecular = WHITE; - matBlinn.glossiness = 50.0f; - - // Setup camera - SetCameraMode(CAMERA_FREE); // Set camera mode - SetCameraPosition(camera.position); // Set internal camera position to match our camera position - SetCameraTarget(camera.target); // Set internal camera target to match our camera target - - SetTargetFPS(60); - //-------------------------------------------------------------------------------------- - - // Main game loop - while (!WindowShouldClose()) // Detect window close button or ESC key - { - // Update - //---------------------------------------------------------------------------------- - UpdateCamera(&camera); // Update camera position - - // NOTE: Model transform can be set in model.transform or directly with params at draw... WATCH OUT! - SetShaderValueMatrix(shader, modelLoc, model.transform); // Send model matrix to shader - //SetShaderValueMatrix(shader, viewLoc, GetCameraMatrix(camera)); // Not used - - // Glossiness input control - if(IsKeyDown(KEY_UP)) matBlinn.glossiness += SHININESS_SPEED; - else if(IsKeyDown(KEY_DOWN)) - { - matBlinn.glossiness -= SHININESS_SPEED; - if( matBlinn.glossiness < 0) matBlinn.glossiness = 0.0f; - } - - // Light X movement - if (IsKeyDown(KEY_D)) light.position.x += LIGHT_SPEED; - else if(IsKeyDown(KEY_A)) light.position.x -= LIGHT_SPEED; - - // Light Y movement - if (IsKeyDown(KEY_LEFT_SHIFT)) light.position.y += LIGHT_SPEED; - else if (IsKeyDown(KEY_LEFT_CONTROL)) light.position.y -= LIGHT_SPEED; - - // Light Z movement - if (IsKeyDown(KEY_S)) light.position.z += LIGHT_SPEED; - else if (IsKeyDown(KEY_W)) light.position.z -= LIGHT_SPEED; - - // Send light values to shader - SetShaderValue(shader, lIntensityLoc, &light.intensity, 1); - SetShaderValue(shader, lAmbientLoc, ColorToFloat(light.ambient), 3); - SetShaderValue(shader, lDiffuseLoc, ColorToFloat(light.diffuse), 3); - SetShaderValue(shader, lSpecularLoc, ColorToFloat(light.specular), 3); - SetShaderValue(shader, lSpecIntensityLoc, &light.specIntensity, 1); - - // Send material values to shader - SetShaderValue(shader, mAmbientLoc, ColorToFloat(matBlinn.colAmbient), 3); - SetShaderValue(shader, mSpecularLoc, ColorToFloat(matBlinn.colSpecular), 3); - SetShaderValue(shader, mGlossLoc, &matBlinn.glossiness, 1); - - // Send camera and light transform values to shader - SetShaderValue(shader, cameraLoc, VectorToFloat(camera.position), 3); - SetShaderValue(shader, lightLoc, VectorToFloat(light.position), 3); - //---------------------------------------------------------------------------------- - - // Draw - //---------------------------------------------------------------------------------- - BeginDrawing(); - - ClearBackground(RAYWHITE); - - Begin3dMode(camera); - - DrawModel(model, position, 4.0f, matBlinn.colDiffuse); - DrawSphere(light.position, 0.5f, GOLD); - - DrawGrid(20, 1.0f); - - End3dMode(); - - DrawFPS(10, 10); // Draw FPS - - EndDrawing(); - //---------------------------------------------------------------------------------- - } - - // De-Initialization - //-------------------------------------------------------------------------------------- - UnloadShader(shader); - UnloadModel(model); - - CloseWindow(); // Close window and OpenGL context - //-------------------------------------------------------------------------------------- - - return 0; -} diff --git a/examples/shaders_custom_uniform.c b/examples/shaders_custom_uniform.c index 0377cfff..89f87df9 100644 --- a/examples/shaders_custom_uniform.c +++ b/examples/shaders_custom_uniform.c @@ -30,16 +30,16 @@ int main() InitWindow(screenWidth, screenHeight, "raylib [shaders] example - custom uniform variable"); // Define the camera to look into our 3d world - Camera camera = {{ 3.0f, 3.0f, 3.0f }, { 0.0f, 1.5f, 0.0f }, { 0.0f, 1.0f, 0.0f }}; + Camera camera = {{ 3.0f, 3.0f, 3.0f }, { 0.0f, 1.5f, 0.0f }, { 0.0f, 1.0f, 0.0f }, 45.0f }; Model dwarf = LoadModel("resources/model/dwarf.obj"); // Load OBJ model - Texture2D texture = LoadTexture("resources/model/dwarf_diffuse.png"); // Load model texture - SetModelTexture(&dwarf, texture); // Bind texture to model + Texture2D texture = LoadTexture("resources/model/dwarf_diffuse.png"); // Load model texture (diffuse map) + dwarf.material.texDiffuse = texture; // Set dwarf model diffuse texture - Vector3 position = { 0.0f, 0.0f, 0.0f }; // Set model position + Vector3 position = { 0.0f, 0.0f, 0.0f }; // Set model position - Shader shader = LoadShader("resources/shaders/base.vs", - "resources/shaders/swirl.fs"); // Load postpro shader + Shader shader = LoadShader("resources/shaders/glsl330/base.vs", + "resources/shaders/glsl330/swirl.fs"); // Load postpro shader // Get variable (uniform) location on the shader to connect with the program // NOTE: If uniform variable could not be found in the shader, function returns -1 @@ -47,12 +47,11 @@ int main() float swirlCenter[2] = { (float)screenWidth/2, (float)screenHeight/2 }; - SetPostproShader(shader); // Set fullscreen postprocessing shader + // Create a RenderTexture2D to be used for render to texture + RenderTexture2D target = LoadRenderTexture(screenWidth, screenHeight); // Setup orbital camera - SetCameraMode(CAMERA_ORBITAL); // Set an orbital camera mode - SetCameraPosition(camera.position); // Set internal camera position to match our camera position - SetCameraTarget(camera.target); // Set internal camera target to match our camera target + SetCameraMode(camera, CAMERA_ORBITAL); // Set an orbital camera mode SetTargetFPS(60); // Set our game to run at 60 frames-per-second //-------------------------------------------------------------------------------------- @@ -70,7 +69,7 @@ int main() // Send new value to the shader to be used on drawing SetShaderValue(shader, swirlCenterLoc, swirlCenter, 2); - UpdateCamera(&camera); // Update internal camera and our camera + UpdateCamera(&camera); // Update camera //---------------------------------------------------------------------------------- // Draw @@ -78,14 +77,27 @@ int main() BeginDrawing(); ClearBackground(RAYWHITE); + + BeginTextureMode(target); // Enable drawing to texture - Begin3dMode(camera); + Begin3dMode(camera); - DrawModel(dwarf, position, 2.0f, WHITE); // Draw 3d model with texture + DrawModel(dwarf, position, 2.0f, WHITE); // Draw 3d model with texture - DrawGrid(10, 1.0f); // Draw a grid + DrawGrid(10, 1.0f); // Draw a grid - End3dMode(); + End3dMode(); + + DrawText("TEXT DRAWN IN RENDER TEXTURE", 200, 10, 30, RED); + + EndTextureMode(); // End drawing to texture (now we have a texture available for next passes) + + BeginShaderMode(shader); + + // NOTE: Render texture must be y-flipped due to default OpenGL coordinates (left-bottom) + DrawTextureRec(target.texture, (Rectangle){ 0, 0, target.texture.width, -target.texture.height }, (Vector2){ 0, 0 }, WHITE); + + EndShaderMode(); DrawText("(c) Dwarf 3D model by David Moreno", screenWidth - 200, screenHeight - 20, 10, GRAY); @@ -97,11 +109,12 @@ int main() // De-Initialization //-------------------------------------------------------------------------------------- - UnloadShader(shader); // Unload shader - UnloadTexture(texture); // Unload texture - UnloadModel(dwarf); // Unload model + UnloadShader(shader); // Unload shader + UnloadTexture(texture); // Unload texture + UnloadModel(dwarf); // Unload model + UnloadRenderTexture(target); // Unload render texture - CloseWindow(); // Close window and OpenGL context + CloseWindow(); // Close window and OpenGL context //-------------------------------------------------------------------------------------- return 0; diff --git a/examples/shaders_custom_uniform.png b/examples/shaders_custom_uniform.png Binary files differindex 7d5400a1..dfddc3a7 100644 --- a/examples/shaders_custom_uniform.png +++ b/examples/shaders_custom_uniform.png diff --git a/examples/shaders_model_shader.c b/examples/shaders_model_shader.c index 5d8c3711..51e9c1b3 100644 --- a/examples/shaders_model_shader.c +++ b/examples/shaders_model_shader.c @@ -30,32 +30,29 @@ int main() InitWindow(screenWidth, screenHeight, "raylib [shaders] example - model shader"); // Define the camera to look into our 3d world - Camera camera = {{ 3.0f, 3.0f, 3.0f }, { 0.0f, 1.5f, 0.0f }, { 0.0f, 1.0f, 0.0f }}; + Camera camera = {{ 3.0f, 3.0f, 3.0f }, { 0.0f, 1.5f, 0.0f }, { 0.0f, 1.0f, 0.0f }, 45.0f }; Model dwarf = LoadModel("resources/model/dwarf.obj"); // Load OBJ model Texture2D texture = LoadTexture("resources/model/dwarf_diffuse.png"); // Load model texture - Shader shader = LoadShader("resources/shaders/base.vs", - "resources/shaders/grayscale.fs"); // Load model shader + Shader shader = LoadShader("resources/shaders/glsl330/base.vs", + "resources/shaders/glsl330/grayscale.fs"); // Load model shader - SetModelShader(&dwarf, shader); // Set shader effect to 3d model - SetModelTexture(&dwarf, texture); // Bind texture to model + dwarf.material.shader = shader; // Set shader effect to 3d model + dwarf.material.texDiffuse = texture; // Bind texture to model - Vector3 position = { 0.0f, 0.0f, 0.0f }; // Set model position + Vector3 position = { 0.0f, 0.0f, 0.0f }; // Set model position - // Setup orbital camera - SetCameraMode(CAMERA_ORBITAL); // Set an orbital camera mode - SetCameraPosition(camera.position); // Set internal camera position to match our camera position - SetCameraTarget(camera.target); // Set internal camera target to match our camera target + SetCameraMode(camera, CAMERA_FREE); // Set an orbital camera mode - SetTargetFPS(60); // Set our game to run at 60 frames-per-second + SetTargetFPS(60); // Set our game to run at 60 frames-per-second //-------------------------------------------------------------------------------------- // Main game loop - while (!WindowShouldClose()) // Detect window close button or ESC key + while (!WindowShouldClose()) // Detect window close button or ESC key { // Update //---------------------------------------------------------------------------------- - UpdateCamera(&camera); // Update internal camera and our camera + UpdateCamera(&camera); // Update camera //---------------------------------------------------------------------------------- // Draw @@ -73,6 +70,9 @@ int main() End3dMode(); DrawText("(c) Dwarf 3D model by David Moreno", screenWidth - 200, screenHeight - 20, 10, GRAY); + + DrawText(FormatText("Camera position: (%.2f, %.2f, %.2f)", camera.position.x, camera.position.y, camera.position.z), 600, 20, 10, BLACK); + DrawText(FormatText("Camera target: (%.2f, %.2f, %.2f)", camera.target.x, camera.target.y, camera.target.z), 600, 40, 10, GRAY); DrawFPS(10, 10); diff --git a/examples/shaders_postprocessing.c b/examples/shaders_postprocessing.c index 0f851658..43d1af72 100644 --- a/examples/shaders_postprocessing.c +++ b/examples/shaders_postprocessing.c @@ -30,23 +30,22 @@ int main() InitWindow(screenWidth, screenHeight, "raylib [shaders] example - postprocessing shader"); // Define the camera to look into our 3d world - Camera camera = {{ 3.0f, 3.0f, 3.0f }, { 0.0f, 1.5f, 0.0f }, { 0.0f, 1.0f, 0.0f }}; + Camera camera = {{ 3.0f, 3.0f, 3.0f }, { 0.0f, 1.5f, 0.0f }, { 0.0f, 1.0f, 0.0f }, 45.0f }; Model dwarf = LoadModel("resources/model/dwarf.obj"); // Load OBJ model - Texture2D texture = LoadTexture("resources/model/dwarf_diffuse.png"); // Load model texture - SetModelTexture(&dwarf, texture); // Bind texture to model + Texture2D texture = LoadTexture("resources/model/dwarf_diffuse.png"); // Load model texture (diffuse map) + dwarf.material.texDiffuse = texture; // Set dwarf model diffuse texture Vector3 position = { 0.0f, 0.0f, 0.0f }; // Set model position - Shader shader = LoadShader("resources/shaders/base.vs", - "resources/shaders/bloom.fs"); // Load postpro shader + Shader shader = LoadShader("resources/shaders/glsl330/base.vs", + "resources/shaders/glsl330/bloom.fs"); // Load postpro shader - SetPostproShader(shader); // Set fullscreen postprocessing shader + // Create a RenderTexture2D to be used for render to texture + RenderTexture2D target = LoadRenderTexture(screenWidth, screenHeight); // Setup orbital camera - SetCameraMode(CAMERA_ORBITAL); // Set an orbital camera mode - SetCameraPosition(camera.position); // Set internal camera position to match our camera position - SetCameraTarget(camera.target); // Set internal camera target to match our camera target + SetCameraMode(camera, CAMERA_ORBITAL); // Set an orbital camera mode SetTargetFPS(60); // Set our game to run at 60 frames-per-second //-------------------------------------------------------------------------------------- @@ -56,7 +55,7 @@ int main() { // Update //---------------------------------------------------------------------------------- - UpdateCamera(&camera); // Update internal camera and our camera + UpdateCamera(&camera); // Update camera //---------------------------------------------------------------------------------- // Draw @@ -65,15 +64,28 @@ int main() ClearBackground(RAYWHITE); - Begin3dMode(camera); + BeginTextureMode(target); // Enable drawing to texture + + Begin3dMode(camera); - DrawModel(dwarf, position, 2.0f, WHITE); // Draw 3d model with texture + DrawModel(dwarf, position, 2.0f, WHITE); // Draw 3d model with texture - DrawGrid(10, 1.0f); // Draw a grid + DrawGrid(10, 1.0f); // Draw a grid - End3dMode(); + End3dMode(); + + DrawText("HELLO POSTPROCESSING!", 70, 190, 50, RED); + + EndTextureMode(); // End drawing to texture (now we have a texture available for next passes) + + BeginShaderMode(shader); + + // NOTE: Render texture must be y-flipped due to default OpenGL coordinates (left-bottom) + DrawTextureRec(target.texture, (Rectangle){ 0, 0, target.texture.width, -target.texture.height }, (Vector2){ 0, 0 }, WHITE); + + EndShaderMode(); - DrawText("(c) Dwarf 3D model by David Moreno", screenWidth - 200, screenHeight - 20, 10, BLACK); + DrawText("(c) Dwarf 3D model by David Moreno", screenWidth - 200, screenHeight - 20, 10, DARKGRAY); DrawFPS(10, 10); @@ -83,11 +95,12 @@ int main() // De-Initialization //-------------------------------------------------------------------------------------- - UnloadShader(shader); // Unload shader - UnloadTexture(texture); // Unload texture - UnloadModel(dwarf); // Unload model + UnloadShader(shader); // Unload shader + UnloadTexture(texture); // Unload texture + UnloadModel(dwarf); // Unload model + UnloadRenderTexture(target); // Unload render texture - CloseWindow(); // Close window and OpenGL context + CloseWindow(); // Close window and OpenGL context //-------------------------------------------------------------------------------------- return 0; diff --git a/examples/shaders_postprocessing.png b/examples/shaders_postprocessing.png Binary files differindex 139080d1..684cbd41 100644 --- a/examples/shaders_postprocessing.png +++ b/examples/shaders_postprocessing.png diff --git a/examples/shaders_shapes_textures.c b/examples/shaders_shapes_textures.c index 37180cec..0a14469f 100644 --- a/examples/shaders_shapes_textures.c +++ b/examples/shaders_shapes_textures.c @@ -32,10 +32,9 @@ int main() Texture2D sonic = LoadTexture("resources/texture_formats/sonic.png"); - // NOTE: This shader is a bit different than model/postprocessing shaders, - // it requires the color data for every vertice to use it in every shape or texture independently - Shader shader = LoadShader("resources/shaders/shapes_base.vs", - "resources/shaders/shapes_grayscale.fs"); + // NOTE: Using GLSL 330 shader version, on OpenGL ES 2.0 use GLSL 100 shader version + Shader shader = LoadShader("resources/shaders/glsl330/base.vs", + "resources/shaders/glsl330/grayscale.fs"); // Shader usage is also different than models/postprocessing, shader is just activated when required @@ -66,16 +65,16 @@ int main() // Activate our custom shader to be applied on next shapes/textures drawings - SetCustomShader(shader); + BeginShaderMode(shader); - DrawText("USING CUSTOM SHADER", 190, 40, 10, RED); + DrawText("USING CUSTOM SHADER", 190, 40, 10, RED); - DrawRectangle(250 - 60, 90, 120, 60, RED); - DrawRectangleGradient(250 - 90, 170, 180, 130, MAROON, GOLD); - DrawRectangleLines(250 - 40, 320, 80, 60, ORANGE); + DrawRectangle(250 - 60, 90, 120, 60, RED); + DrawRectangleGradient(250 - 90, 170, 180, 130, MAROON, GOLD); + DrawRectangleLines(250 - 40, 320, 80, 60, ORANGE); // Activate our default shader for next drawings - SetDefaultShader(); + EndShaderMode(); DrawText("USING DEFAULT SHADER", 370, 40, 10, RED); @@ -90,12 +89,12 @@ int main() DrawPoly((Vector2){430, 320}, 6, 80, 0, BROWN); // Activate our custom shader to be applied on next shapes/textures drawings - SetCustomShader(shader); + BeginShaderMode(shader); - DrawTexture(sonic, 380, -10, WHITE); // Using custom shader + DrawTexture(sonic, 380, -10, WHITE); // Using custom shader // Activate our default shader for next drawings - SetDefaultShader(); + EndShaderMode(); EndDrawing(); //---------------------------------------------------------------------------------- diff --git a/examples/shaders_standard_lighting.c b/examples/shaders_standard_lighting.c new file mode 100644 index 00000000..16cd7ff6 --- /dev/null +++ b/examples/shaders_standard_lighting.c @@ -0,0 +1,482 @@ +/******************************************************************************************* +* +* raylib [shaders] example - Standard lighting (materials and lights) +* +* NOTE: This example requires raylib OpenGL 3.3 or ES2 versions for shaders support, +* OpenGL 1.1 does not support shaders, recompile raylib to OpenGL 3.3 version. +* +* NOTE: Shaders used in this example are #version 330 (OpenGL 3.3), to test this example +* on OpenGL ES 2.0 platforms (Android, Raspberry Pi, HTML5), use #version 100 shaders +* raylib comes with shaders ready for both versions, check raylib/shaders install folder +* +* This example has been created using raylib 1.7 (www.raylib.com) +* raylib is licensed under an unmodified zlib/libpng license (View raylib.h for details) +* +* Copyright (c) 2016-2017 Ramon Santamaria (@raysan5) +* +********************************************************************************************/ + +#include "raylib.h" + +#include <stdlib.h> // Required for: NULL +#include <string.h> // Required for: strcpy() +#include <math.h> // Required for: vector math + +//---------------------------------------------------------------------------------- +// Defines and Macros +//---------------------------------------------------------------------------------- +#define MAX_LIGHTS 8 // Max lights supported by standard shader + +//---------------------------------------------------------------------------------- +// Types and Structures Definition +//---------------------------------------------------------------------------------- + +// Light type +typedef struct LightData { + unsigned int id; // Light unique id + bool enabled; // Light enabled + int type; // Light type: LIGHT_POINT, LIGHT_DIRECTIONAL, LIGHT_SPOT + + Vector3 position; // Light position + Vector3 target; // Light direction: LIGHT_DIRECTIONAL and LIGHT_SPOT (cone direction target) + float radius; // Light attenuation radius light intensity reduced with distance (world distance) + + Color diffuse; // Light diffuse color + float intensity; // Light intensity level + + float coneAngle; // Light cone max angle: LIGHT_SPOT +} LightData, *Light; + +// Light types +typedef enum { LIGHT_POINT, LIGHT_DIRECTIONAL, LIGHT_SPOT } LightType; + +//---------------------------------------------------------------------------------- +// Global Variables Definition +//---------------------------------------------------------------------------------- +static Light lights[MAX_LIGHTS]; // Lights pool +static int lightsCount = 0; // Enabled lights counter +static int lightsLocs[MAX_LIGHTS][8]; // Lights location points in shader: 8 possible points per light: + // enabled, type, position, target, radius, diffuse, intensity, coneAngle + +//---------------------------------------------------------------------------------- +// Module Functions Declaration +//---------------------------------------------------------------------------------- +static Light CreateLight(int type, Vector3 position, Color diffuse); // Create a new light, initialize it and add to pool +static void DestroyLight(Light light); // Destroy a light and take it out of the list +static void DrawLight(Light light); // Draw light in 3D world + +static void GetShaderLightsLocations(Shader shader); // Get shader locations for lights (up to MAX_LIGHTS) +static void SetShaderLightsValues(Shader shader); // Set shader uniform values for lights + +// Vector3 math functions +static float VectorLength(const Vector3 v); // Calculate vector lenght +static void VectorNormalize(Vector3 *v); // Normalize provided vector +static Vector3 VectorSubtract(Vector3 v1, Vector3 v2); // Substract two vectors + + +//https://www.gamedev.net/topic/655969-speed-gluniform-vs-uniform-buffer-objects/ +//https://www.reddit.com/r/opengl/comments/4ri20g/is_gluniform_more_expensive_than_glprogramuniform/ +//http://cg.alexandra.dk/?p=3778 - AZDO +//https://developer.apple.com/library/content/documentation/3DDrawing/Conceptual/OpenGLES_ProgrammingGuide/BestPracticesforShaders/BestPracticesforShaders.html + +//------------------------------------------------------------------------------------ +// Program main entry point +//------------------------------------------------------------------------------------ +int main() +{ + // Initialization + //-------------------------------------------------------------------------------------- + int screenWidth = 800; + int screenHeight = 450; + + SetConfigFlags(FLAG_MSAA_4X_HINT); // Enable Multi Sampling Anti Aliasing 4x (if available) + + InitWindow(screenWidth, screenHeight, "raylib [shaders] example - model shader"); + + // Define the camera to look into our 3d world + Camera camera = {{ 4.0f, 4.0f, 4.0f }, { 0.0f, 1.5f, 0.0f }, { 0.0f, 1.0f, 0.0f }, 45.0f }; + Vector3 position = { 0.0f, 0.0f, 0.0f }; // Set model position + + Model dwarf = LoadModel("resources/model/dwarf.obj"); // Load OBJ model + + Material material;// = LoadStandardMaterial(); + + material.shader = LoadShader("resources/shaders/glsl330/standard.vs", "resources/shaders/glsl330/standard.fs"); + + // Try to get lights location points (if available) + GetShaderLightsLocations(material.shader); + + material.texDiffuse = LoadTexture("resources/model/dwarf_diffuse.png"); // Load model diffuse texture + material.texNormal = LoadTexture("resources/model/dwarf_normal.png"); // Load model normal texture + material.texSpecular = LoadTexture("resources/model/dwarf_specular.png"); // Load model specular texture + material.colDiffuse = WHITE; + material.colAmbient = (Color){0, 0, 10, 255}; + material.colSpecular = WHITE; + material.glossiness = 50.0f; + + dwarf.material = material; // Apply material to model + + Light spotLight = CreateLight(LIGHT_SPOT, (Vector3){3.0f, 5.0f, 2.0f}, (Color){255, 255, 255, 255}); + spotLight->target = (Vector3){0.0f, 0.0f, 0.0f}; + spotLight->intensity = 2.0f; + spotLight->diffuse = (Color){255, 100, 100, 255}; + spotLight->coneAngle = 60.0f; + + Light dirLight = CreateLight(LIGHT_DIRECTIONAL, (Vector3){0.0f, -3.0f, -3.0f}, (Color){255, 255, 255, 255}); + dirLight->target = (Vector3){1.0f, -2.0f, -2.0f}; + dirLight->intensity = 2.0f; + dirLight->diffuse = (Color){100, 255, 100, 255}; + + Light pointLight = CreateLight(LIGHT_POINT, (Vector3){0.0f, 4.0f, 5.0f}, (Color){255, 255, 255, 255}); + pointLight->intensity = 2.0f; + pointLight->diffuse = (Color){100, 100, 255, 255}; + pointLight->radius = 3.0f; + + // Set shader lights values for enabled lights + // NOTE: If values are not changed in real time, they can be set at initialization!!! + SetShaderLightsValues(material.shader); + + //SetShaderActive(0); + + // Setup orbital camera + SetCameraMode(camera, CAMERA_ORBITAL); // Set an orbital camera mode + + SetTargetFPS(60); // Set our game to run at 60 frames-per-second + //-------------------------------------------------------------------------------------- + + // Main game loop + while (!WindowShouldClose()) // Detect window close button or ESC key + { + // Update + //---------------------------------------------------------------------------------- + UpdateCamera(&camera); // Update camera + //---------------------------------------------------------------------------------- + + // Draw + //---------------------------------------------------------------------------------- + BeginDrawing(); + + ClearBackground(RAYWHITE); + + Begin3dMode(camera); + + DrawModel(dwarf, position, 2.0f, WHITE); // Draw 3d model with texture + + DrawLight(spotLight); // Draw spot light + DrawLight(dirLight); // Draw directional light + DrawLight(pointLight); // Draw point light + + DrawGrid(10, 1.0f); // Draw a grid + + End3dMode(); + + DrawText("(c) Dwarf 3D model by David Moreno", screenWidth - 200, screenHeight - 20, 10, GRAY); + + DrawFPS(10, 10); + + EndDrawing(); + //---------------------------------------------------------------------------------- + } + + // De-Initialization + //-------------------------------------------------------------------------------------- + UnloadMaterial(material); // Unload material and assigned textures + UnloadModel(dwarf); // Unload model + + // Destroy all created lights + DestroyLight(pointLight); + DestroyLight(dirLight); + DestroyLight(spotLight); + + // Unload lights + if (lightsCount > 0) + { + for (int i = 0; i < lightsCount; i++) free(lights[i]); + lightsCount = 0; + } + + CloseWindow(); // Close window and OpenGL context + //-------------------------------------------------------------------------------------- + + return 0; +} + +//-------------------------------------------------------------------------------------------- +// Module Functions Definitions +//-------------------------------------------------------------------------------------------- + +// Create a new light, initialize it and add to pool +Light CreateLight(int type, Vector3 position, Color diffuse) +{ + Light light = NULL; + + if (lightsCount < MAX_LIGHTS) + { + // Allocate dynamic memory + light = (Light)malloc(sizeof(LightData)); + + // Initialize light values with generic values + light->id = lightsCount; + light->type = type; + light->enabled = true; + + light->position = position; + light->target = (Vector3){ 0.0f, 0.0f, 0.0f }; + light->intensity = 1.0f; + light->diffuse = diffuse; + + // Add new light to the array + lights[lightsCount] = light; + + // Increase enabled lights count + lightsCount++; + } + else + { + // NOTE: Returning latest created light to avoid crashes + light = lights[lightsCount]; + } + + return light; +} + +// Destroy a light and take it out of the list +void DestroyLight(Light light) +{ + if (light != NULL) + { + int lightId = light->id; + + // Free dynamic memory allocation + free(lights[lightId]); + + // Remove *obj from the pointers array + for (int i = lightId; i < lightsCount; i++) + { + // Resort all the following pointers of the array + if ((i + 1) < lightsCount) + { + lights[i] = lights[i + 1]; + lights[i]->id = lights[i + 1]->id; + } + } + + // Decrease enabled physic objects count + lightsCount--; + } +} + +// Draw light in 3D world +void DrawLight(Light light) +{ + switch (light->type) + { + case LIGHT_POINT: + { + DrawSphereWires(light->position, 0.3f*light->intensity, 8, 8, (light->enabled ? light->diffuse : GRAY)); + + DrawCircle3D(light->position, light->radius, (Vector3){ 0, 0, 0 }, 0.0f, (light->enabled ? light->diffuse : GRAY)); + DrawCircle3D(light->position, light->radius, (Vector3){ 1, 0, 0 }, 90.0f, (light->enabled ? light->diffuse : GRAY)); + DrawCircle3D(light->position, light->radius, (Vector3){ 0, 1, 0 },90.0f, (light->enabled ? light->diffuse : GRAY)); + } break; + case LIGHT_DIRECTIONAL: + { + DrawLine3D(light->position, light->target, (light->enabled ? light->diffuse : GRAY)); + + DrawSphereWires(light->position, 0.3f*light->intensity, 8, 8, (light->enabled ? light->diffuse : GRAY)); + DrawCubeWires(light->target, 0.3f, 0.3f, 0.3f, (light->enabled ? light->diffuse : GRAY)); + } break; + case LIGHT_SPOT: + { + DrawLine3D(light->position, light->target, (light->enabled ? light->diffuse : GRAY)); + + Vector3 dir = VectorSubtract(light->target, light->position); + VectorNormalize(&dir); + + DrawCircle3D(light->position, 0.5f, dir, 0.0f, (light->enabled ? light->diffuse : GRAY)); + + //DrawCylinderWires(light->position, 0.0f, 0.3f*light->coneAngle/50, 0.6f, 5, (light->enabled ? light->diffuse : GRAY)); + DrawCubeWires(light->target, 0.3f, 0.3f, 0.3f, (light->enabled ? light->diffuse : GRAY)); + } break; + default: break; + } +} + +// Get shader locations for lights (up to MAX_LIGHTS) +static void GetShaderLightsLocations(Shader shader) +{ + char locName[32] = "lights[x].\0"; + char locNameUpdated[64]; + + for (int i = 0; i < MAX_LIGHTS; i++) + { + locName[7] = '0' + i; + + strcpy(locNameUpdated, locName); + strcat(locNameUpdated, "enabled\0"); + lightsLocs[i][0] = GetShaderLocation(shader, locNameUpdated); + + locNameUpdated[0] = '\0'; + strcpy(locNameUpdated, locName); + strcat(locNameUpdated, "type\0"); + lightsLocs[i][1] = GetShaderLocation(shader, locNameUpdated); + + locNameUpdated[0] = '\0'; + strcpy(locNameUpdated, locName); + strcat(locNameUpdated, "position\0"); + lightsLocs[i][2] = GetShaderLocation(shader, locNameUpdated); + + locNameUpdated[0] = '\0'; + strcpy(locNameUpdated, locName); + strcat(locNameUpdated, "direction\0"); + lightsLocs[i][3] = GetShaderLocation(shader, locNameUpdated); + + locNameUpdated[0] = '\0'; + strcpy(locNameUpdated, locName); + strcat(locNameUpdated, "radius\0"); + lightsLocs[i][4] = GetShaderLocation(shader, locNameUpdated); + + locNameUpdated[0] = '\0'; + strcpy(locNameUpdated, locName); + strcat(locNameUpdated, "diffuse\0"); + lightsLocs[i][5] = GetShaderLocation(shader, locNameUpdated); + + locNameUpdated[0] = '\0'; + strcpy(locNameUpdated, locName); + strcat(locNameUpdated, "intensity\0"); + lightsLocs[i][6] = GetShaderLocation(shader, locNameUpdated); + + locNameUpdated[0] = '\0'; + strcpy(locNameUpdated, locName); + strcat(locNameUpdated, "coneAngle\0"); + lightsLocs[i][7] = GetShaderLocation(shader, locNameUpdated); + } +} + +// Set shader uniform values for lights +// NOTE: It would be far easier with shader UBOs but are not supported on OpenGL ES 2.0 +// TODO: Replace glUniform1i(), glUniform1f(), glUniform3f(), glUniform4f(): +//SetShaderValue(Shader shader, int uniformLoc, float *value, int size) +//SetShaderValuei(Shader shader, int uniformLoc, int *value, int size) +static void SetShaderLightsValues(Shader shader) +{ + int tempInt[8] = { 0 }; + float tempFloat[8] = { 0.0f }; + + for (int i = 0; i < MAX_LIGHTS; i++) + { + if (i < lightsCount) + { + tempInt[0] = lights[i]->enabled; + SetShaderValuei(shader, lightsLocs[i][0], tempInt, 1); //glUniform1i(lightsLocs[i][0], lights[i]->enabled); + + tempInt[0] = lights[i]->type; + SetShaderValuei(shader, lightsLocs[i][1], tempInt, 1); //glUniform1i(lightsLocs[i][1], lights[i]->type); + + tempFloat[0] = (float)lights[i]->diffuse.r/255.0f; + tempFloat[1] = (float)lights[i]->diffuse.g/255.0f; + tempFloat[2] = (float)lights[i]->diffuse.b/255.0f; + tempFloat[3] = (float)lights[i]->diffuse.a/255.0f; + SetShaderValue(shader, lightsLocs[i][5], tempFloat, 4); + //glUniform4f(lightsLocs[i][5], (float)lights[i]->diffuse.r/255, (float)lights[i]->diffuse.g/255, (float)lights[i]->diffuse.b/255, (float)lights[i]->diffuse.a/255); + + tempFloat[0] = lights[i]->intensity; + SetShaderValue(shader, lightsLocs[i][6], tempFloat, 1); + + switch (lights[i]->type) + { + case LIGHT_POINT: + { + tempFloat[0] = lights[i]->position.x; + tempFloat[1] = lights[i]->position.y; + tempFloat[2] = lights[i]->position.z; + SetShaderValue(shader, lightsLocs[i][2], tempFloat, 3); + + tempFloat[0] = lights[i]->radius; + SetShaderValue(shader, lightsLocs[i][4], tempFloat, 1); + + //glUniform3f(lightsLocs[i][2], lights[i]->position.x, lights[i]->position.y, lights[i]->position.z); + //glUniform1f(lightsLocs[i][4], lights[i]->radius); + } break; + case LIGHT_DIRECTIONAL: + { + Vector3 direction = VectorSubtract(lights[i]->target, lights[i]->position); + VectorNormalize(&direction); + + tempFloat[0] = direction.x; + tempFloat[1] = direction.y; + tempFloat[2] = direction.z; + SetShaderValue(shader, lightsLocs[i][3], tempFloat, 3); + + //glUniform3f(lightsLocs[i][3], direction.x, direction.y, direction.z); + } break; + case LIGHT_SPOT: + { + tempFloat[0] = lights[i]->position.x; + tempFloat[1] = lights[i]->position.y; + tempFloat[2] = lights[i]->position.z; + SetShaderValue(shader, lightsLocs[i][2], tempFloat, 3); + + //glUniform3f(lightsLocs[i][2], lights[i]->position.x, lights[i]->position.y, lights[i]->position.z); + + Vector3 direction = VectorSubtract(lights[i]->target, lights[i]->position); + VectorNormalize(&direction); + + tempFloat[0] = direction.x; + tempFloat[1] = direction.y; + tempFloat[2] = direction.z; + SetShaderValue(shader, lightsLocs[i][3], tempFloat, 3); + //glUniform3f(lightsLocs[i][3], direction.x, direction.y, direction.z); + + tempFloat[0] = lights[i]->coneAngle; + SetShaderValue(shader, lightsLocs[i][7], tempFloat, 1); + //glUniform1f(lightsLocs[i][7], lights[i]->coneAngle); + } break; + default: break; + } + } + else + { + tempInt[0] = 0; + SetShaderValuei(shader, lightsLocs[i][0], tempInt, 1); //glUniform1i(lightsLocs[i][0], 0); // Light disabled + } + } +} + +// Calculate vector lenght +float VectorLength(const Vector3 v) +{ + float length; + + length = sqrtf(v.x*v.x + v.y*v.y + v.z*v.z); + + return length; +} + +// Normalize provided vector +void VectorNormalize(Vector3 *v) +{ + float length, ilength; + + length = VectorLength(*v); + + if (length == 0.0f) length = 1.0f; + + ilength = 1.0f/length; + + v->x *= ilength; + v->y *= ilength; + v->z *= ilength; +} + +// Substract two vectors +Vector3 VectorSubtract(Vector3 v1, Vector3 v2) +{ + Vector3 result; + + result.x = v1.x - v2.x; + result.y = v1.y - v2.y; + result.z = v1.z - v2.z; + + return result; +} diff --git a/examples/shaders_standard_lighting.png b/examples/shaders_standard_lighting.png Binary files differnew file mode 100644 index 00000000..65efe47f --- /dev/null +++ b/examples/shaders_standard_lighting.png diff --git a/examples/shapes_basic_shapes.png b/examples/shapes_basic_shapes.png Binary files differindex 03ecf2ec..a7d4a991 100644 --- a/examples/shapes_basic_shapes.png +++ b/examples/shapes_basic_shapes.png diff --git a/examples/text_bmfont_ttf.c b/examples/text_bmfont_ttf.c index caece548..4d060915 100644 --- a/examples/text_bmfont_ttf.c +++ b/examples/text_bmfont_ttf.c @@ -29,8 +29,8 @@ int main() Vector2 fontPosition; - fontPosition.x = screenWidth/2 - MeasureTextEx(fontBm, msgBm, fontBm.size, 0).x/2; - fontPosition.y = screenHeight/2 - fontBm.size/2 - 80; + fontPosition.x = screenWidth/2 - MeasureTextEx(fontBm, msgBm, fontBm.baseSize, 0).x/2; + fontPosition.y = screenHeight/2 - fontBm.baseSize/2 - 80; SetTargetFPS(60); //-------------------------------------------------------------------------------------- @@ -49,8 +49,8 @@ int main() ClearBackground(RAYWHITE); - DrawTextEx(fontBm, msgBm, fontPosition, fontBm.size, 0, MAROON); - DrawTextEx(fontTtf, msgTtf, (Vector2){ 75.0f, 240.0f }, fontTtf.size*0.8f, 2, LIME); + DrawTextEx(fontBm, msgBm, fontPosition, fontBm.baseSize, 0, MAROON); + DrawTextEx(fontTtf, msgTtf, (Vector2){ 75.0f, 240.0f }, fontTtf.baseSize*0.8f, 2, LIME); EndDrawing(); //---------------------------------------------------------------------------------- diff --git a/examples/text_bmfont_unordered.c b/examples/text_bmfont_unordered.c new file mode 100644 index 00000000..6fec3256 --- /dev/null +++ b/examples/text_bmfont_unordered.c @@ -0,0 +1,65 @@ +/******************************************************************************************* +* +* raylib [text] example - BMFont unordered chars loading and drawing +* +* This example has been created using raylib 1.4 (www.raylib.com) +* raylib is licensed under an unmodified zlib/libpng license (View raylib.h for details) +* +* Copyright (c) 2016 Ramon Santamaria (@raysan5) +* +********************************************************************************************/ + +#include "raylib.h" + +int main() +{ + // Initialization + //-------------------------------------------------------------------------------------- + int screenWidth = 800; + int screenHeight = 450; + + InitWindow(screenWidth, screenHeight, "raylib [text] example - bmfont unordered loading and drawing"); + + // NOTE: Using chars outside the [32..127] limits! + // NOTE: If a character is not found in the font, it just renders a space + const char msg[256] = "ASCII extended characters:\n¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆ\nÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæ\nçèéêëìíîïðñòóôõö÷øùúûüýþÿ"; + + // NOTE: Loaded font has an unordered list of characters (chars in the range 32..255) + SpriteFont font = LoadSpriteFont("resources/fonts/pixantiqua.fnt"); // BMFont (AngelCode) + + SetTargetFPS(60); + //-------------------------------------------------------------------------------------- + + // Main game loop + while (!WindowShouldClose()) // Detect window close button or ESC key + { + // Update + //---------------------------------------------------------------------------------- + // TODO: Update variables here... + //---------------------------------------------------------------------------------- + + // Draw + //---------------------------------------------------------------------------------- + BeginDrawing(); + + ClearBackground(RAYWHITE); + + DrawText("Font name: PixAntiqua", 40, 50, 20, GRAY); + DrawText(FormatText("Font base size: %i", font.baseSize), 40, 80, 20, GRAY); + DrawText(FormatText("Font chars number: %i", font.charsCount), 40, 110, 20, GRAY); + + DrawTextEx(font, msg, (Vector2){ 40, 180 }, font.baseSize, 0, MAROON); + + EndDrawing(); + //---------------------------------------------------------------------------------- + } + + // De-Initialization + //-------------------------------------------------------------------------------------- + UnloadSpriteFont(font); // AngelCode SpriteFont unloading + + CloseWindow(); // Close window and OpenGL context + //-------------------------------------------------------------------------------------- + + return 0; +}
\ No newline at end of file diff --git a/examples/text_bmfont_unordered.png b/examples/text_bmfont_unordered.png Binary files differnew file mode 100644 index 00000000..c6767567 --- /dev/null +++ b/examples/text_bmfont_unordered.png diff --git a/examples/text_font_select.c b/examples/text_font_select.c index fe586db8..5891bef7 100644 --- a/examples/text_font_select.c +++ b/examples/text_font_select.c @@ -41,7 +41,7 @@ int main() const char text[50] = "THIS is THE FONT you SELECTED!"; // Main text - Vector2 textSize = MeasureTextEx(fonts[currentFont], text, fonts[currentFont].size*3, 1); + Vector2 textSize = MeasureTextEx(fonts[currentFont], text, fonts[currentFont].baseSize*3, 1); Vector2 mousePoint; @@ -118,7 +118,7 @@ int main() } // Text measurement for better positioning on screen - textSize = MeasureTextEx(fonts[currentFont], text, fonts[currentFont].size*3, 1); + textSize = MeasureTextEx(fonts[currentFont], text, fonts[currentFont].baseSize*3, 1); //---------------------------------------------------------------------------------- // Draw @@ -140,7 +140,7 @@ int main() DrawText("NEXT", 700, positionY + 13, 20, btnNextOutColor); DrawTextEx(fonts[currentFont], text, (Vector2){ screenWidth/2 - textSize.x/2, - 260 + (70 - textSize.y)/2 }, fonts[currentFont].size*3, + 260 + (70 - textSize.y)/2 }, fonts[currentFont].baseSize*3, 1, colors[currentFont]); EndDrawing(); diff --git a/examples/text_rbmf_fonts.c b/examples/text_rbmf_fonts.c index b4bd851b..cd5da1fe 100644 --- a/examples/text_rbmf_fonts.c +++ b/examples/text_rbmf_fonts.c @@ -50,8 +50,8 @@ int main() for (int i = 0; i < 8; i++) { - positions[i].x = screenWidth/2 - MeasureTextEx(fonts[i], messages[i], fonts[i].size*2, spacings[i]).x/2; - positions[i].y = 60 + fonts[i].size + 50*i; + positions[i].x = screenWidth/2 - MeasureTextEx(fonts[i], messages[i], fonts[i].baseSize*2, spacings[i]).x/2; + positions[i].y = 60 + fonts[i].baseSize + 50*i; } Color colors[8] = { MAROON, ORANGE, DARKGREEN, DARKBLUE, DARKPURPLE, LIME, GOLD }; @@ -76,7 +76,7 @@ int main() for (int i = 0; i < 8; i++) { - DrawTextEx(fonts[i], messages[i], positions[i], fonts[i].size*2, spacings[i], colors[i]); + DrawTextEx(fonts[i], messages[i], positions[i], fonts[i].baseSize*2, spacings[i], colors[i]); } EndDrawing(); diff --git a/examples/text_sprite_fonts.c b/examples/text_sprite_fonts.c index c73eda85..bded266e 100644 --- a/examples/text_sprite_fonts.c +++ b/examples/text_sprite_fonts.c @@ -31,14 +31,14 @@ int main() Vector2 fontPosition1, fontPosition2, fontPosition3; - fontPosition1.x = screenWidth/2 - MeasureTextEx(font1, msg1, font1.size, -3).x/2; - fontPosition1.y = screenHeight/2 - font1.size/2 - 80; + fontPosition1.x = screenWidth/2 - MeasureTextEx(font1, msg1, font1.baseSize, -3).x/2; + fontPosition1.y = screenHeight/2 - font1.baseSize/2 - 80; - fontPosition2.x = screenWidth/2 - MeasureTextEx(font2, msg2, font2.size, -2).x/2; - fontPosition2.y = screenHeight/2 - font2.size/2 - 10; + fontPosition2.x = screenWidth/2 - MeasureTextEx(font2, msg2, font2.baseSize, -2).x/2; + fontPosition2.y = screenHeight/2 - font2.baseSize/2 - 10; - fontPosition3.x = screenWidth/2 - MeasureTextEx(font3, msg3, font3.size, 2).x/2; - fontPosition3.y = screenHeight/2 - font3.size/2 + 50; + fontPosition3.x = screenWidth/2 - MeasureTextEx(font3, msg3, font3.baseSize, 2).x/2; + fontPosition3.y = screenHeight/2 - font3.baseSize/2 + 50; //-------------------------------------------------------------------------------------- @@ -56,9 +56,9 @@ int main() ClearBackground(RAYWHITE); - DrawTextEx(font1, msg1, fontPosition1, font1.size, -3, WHITE); - DrawTextEx(font2, msg2, fontPosition2, font2.size, -2, WHITE); - DrawTextEx(font3, msg3, fontPosition3, font3.size, 2, WHITE); + DrawTextEx(font1, msg1, fontPosition1, font1.baseSize, -3, WHITE); + DrawTextEx(font2, msg2, fontPosition2, font2.baseSize, -2, WHITE); + DrawTextEx(font3, msg3, fontPosition3, font3.baseSize, 2, WHITE); EndDrawing(); //---------------------------------------------------------------------------------- diff --git a/examples/text_ttf_loading.c b/examples/text_ttf_loading.c new file mode 100644 index 00000000..10025c2f --- /dev/null +++ b/examples/text_ttf_loading.c @@ -0,0 +1,130 @@ +/******************************************************************************************* +* +* raylib [text] example - TTF loading and usage +* +* This example has been created using raylib 1.3.0 (www.raylib.com) +* raylib is licensed under an unmodified zlib/libpng license (View raylib.h for details) +* +* Copyright (c) 2015 Ramon Santamaria (Ray San - [email protected]) +* +********************************************************************************************/ + +#include "raylib.h" + +int main() +{ + // Initialization + //-------------------------------------------------------------------------------------- + int screenWidth = 800; + int screenHeight = 450; + + InitWindow(screenWidth, screenHeight, "raylib [text] example - ttf loading"); + + const char msg[50] = "TTF SpriteFont"; + + // NOTE: Textures/Fonts MUST be loaded after Window initialization (OpenGL context is required) + + // TTF SpriteFont loading with custom generation parameters + SpriteFont font = LoadSpriteFontTTF("resources/fonts/KAISG.ttf", 96, 0, 0); + + // Generate mipmap levels to use trilinear filtering + // NOTE: On 2D drawing it won't be noticeable, it looks like FILTER_BILINEAR + GenTextureMipmaps(&font.texture); + + float fontSize = font.baseSize; + Vector2 fontPosition = { 40, screenHeight/2 + 50 }; + Vector2 textSize; + + SetTextureFilter(font.texture, FILTER_POINT); + int currentFontFilter = 0; // FILTER_POINT + + int count = 0; + char **droppedFiles; + + SetTargetFPS(60); + //-------------------------------------------------------------------------------------- + + // Main game loop + while (!WindowShouldClose()) // Detect window close button or ESC key + { + // Update + //---------------------------------------------------------------------------------- + fontSize += GetMouseWheelMove()*4.0f; + + // Choose font texture filter method + if (IsKeyPressed(KEY_ONE)) + { + SetTextureFilter(font.texture, FILTER_POINT); + currentFontFilter = 0; + } + else if (IsKeyPressed(KEY_TWO)) + { + SetTextureFilter(font.texture, FILTER_BILINEAR); + currentFontFilter = 1; + } + else if (IsKeyPressed(KEY_THREE)) + { + // NOTE: Trilinear filter won't be noticed on 2D drawing + SetTextureFilter(font.texture, FILTER_TRILINEAR); + currentFontFilter = 2; + } + + textSize = MeasureTextEx(font, msg, fontSize, 0); + + if (IsKeyDown(KEY_LEFT)) fontPosition.x -= 10; + else if (IsKeyDown(KEY_RIGHT)) fontPosition.x += 10; + + // Load a dropped TTF file dynamically (at current fontSize) + if (IsFileDropped()) + { + droppedFiles = GetDroppedFiles(&count); + + if (count == 1) // Only support one ttf file dropped + { + UnloadSpriteFont(font); + font = LoadSpriteFontTTF(droppedFiles[0], fontSize, 0, 0); + ClearDroppedFiles(); + } + } + //---------------------------------------------------------------------------------- + + // Draw + //---------------------------------------------------------------------------------- + BeginDrawing(); + + ClearBackground(RAYWHITE); + + DrawText("Use mouse wheel to change font size", 20, 20, 10, GRAY); + DrawText("Use KEY_RIGHT and KEY_LEFT to move text", 20, 40, 10, GRAY); + DrawText("Use 1, 2, 3 to change texture filter", 20, 60, 10, GRAY); + DrawText("Drop a new TTF font for dynamic loading", 20, 80, 10, DARKGRAY); + + DrawTextEx(font, msg, fontPosition, fontSize, 0, BLACK); + + // TODO: It seems texSize measurement is not accurate due to chars offsets... + //DrawRectangleLines(fontPosition.x, fontPosition.y, textSize.x, textSize.y, RED); + + DrawRectangle(0, screenHeight - 80, screenWidth, 80, LIGHTGRAY); + DrawText(FormatText("Font size: %02.02f", fontSize), 20, screenHeight - 50, 10, DARKGRAY); + DrawText(FormatText("Text size: [%02.02f, %02.02f]", textSize.x, textSize.y), 20, screenHeight - 30, 10, DARKGRAY); + DrawText("CURRENT TEXTURE FILTER:", 250, 400, 20, GRAY); + + if (currentFontFilter == 0) DrawText("POINT", 570, 400, 20, BLACK); + else if (currentFontFilter == 1) DrawText("BILINEAR", 570, 400, 20, BLACK); + else if (currentFontFilter == 2) DrawText("TRILINEAR", 570, 400, 20, BLACK); + + EndDrawing(); + //---------------------------------------------------------------------------------- + } + + // De-Initialization + //-------------------------------------------------------------------------------------- + UnloadSpriteFont(font); // SpriteFont unloading + + ClearDroppedFiles(); // Clear internal buffers + + CloseWindow(); // Close window and OpenGL context + //-------------------------------------------------------------------------------------- + + return 0; +}
\ No newline at end of file diff --git a/examples/text_ttf_loading.png b/examples/text_ttf_loading.png Binary files differnew file mode 100644 index 00000000..29ea263a --- /dev/null +++ b/examples/text_ttf_loading.png diff --git a/examples/text_writing_anim.c b/examples/text_writing_anim.c index 5f19b468..5563b561 100644 --- a/examples/text_writing_anim.c +++ b/examples/text_writing_anim.c @@ -32,7 +32,8 @@ int main() { // Update //---------------------------------------------------------------------------------- - framesCounter++; + if (IsKeyDown(KEY_SPACE)) framesCounter += 8; + else framesCounter++; if (IsKeyPressed(KEY_ENTER)) framesCounter = 0; //---------------------------------------------------------------------------------- @@ -45,7 +46,8 @@ int main() DrawText(SubText(message, 0, framesCounter/10), 210, 160, 20, MAROON); - DrawText("PRESS [ENTER] to RESTART!", 240, 280, 20, LIGHTGRAY); + DrawText("PRESS [ENTER] to RESTART!", 240, 260, 20, LIGHTGRAY); + DrawText("PRESS [SPACE] to SPEED UP!", 239, 300, 20, LIGHTGRAY); EndDrawing(); //---------------------------------------------------------------------------------- diff --git a/examples/textures_particles_trail_blending.c b/examples/textures_particles_trail_blending.c index 76cd0423..0b47c790 100644 --- a/examples/textures_particles_trail_blending.c +++ b/examples/textures_particles_trail_blending.c @@ -102,20 +102,22 @@ int main() ClearBackground(DARKGRAY); - SetBlendMode(blending); + BeginBlendMode(blending); - // Draw active particles - for (int i = 0; i < MAX_PARTICLES; i++) - { - if (mouseTail[i].active) DrawTexturePro(smoke, (Rectangle){ 0, 0, smoke.width, smoke.height }, - (Rectangle){ mouseTail[i].position.x, mouseTail[i].position.y, smoke.width*mouseTail[i].size, smoke.height*mouseTail[i].size }, - (Vector2){ smoke.width*mouseTail[i].size/2, smoke.height*mouseTail[i].size/2 }, mouseTail[i].rotation, - Fade(mouseTail[i].color, mouseTail[i].alpha)); - } + // Draw active particles + for (int i = 0; i < MAX_PARTICLES; i++) + { + if (mouseTail[i].active) DrawTexturePro(smoke, (Rectangle){ 0, 0, smoke.width, smoke.height }, + (Rectangle){ mouseTail[i].position.x, mouseTail[i].position.y, smoke.width*mouseTail[i].size, smoke.height*mouseTail[i].size }, + (Vector2){ smoke.width*mouseTail[i].size/2, smoke.height*mouseTail[i].size/2 }, mouseTail[i].rotation, + Fade(mouseTail[i].color, mouseTail[i].alpha)); + } + + EndBlendMode(); - DrawText("PRESS SPACE to CHANGE BLENDING MODE", 180, 20, 20, RAYWHITE); + DrawText("PRESS SPACE to CHANGE BLENDING MODE", 180, 20, 20, BLACK); - if (blending == BLEND_ALPHA) DrawText("ALPHA BLENDING", 290, screenHeight - 40, 20, RAYWHITE); + if (blending == BLEND_ALPHA) DrawText("ALPHA BLENDING", 290, screenHeight - 40, 20, BLACK); else DrawText("ADDITIVE BLENDING", 280, screenHeight - 40, 20, RAYWHITE); EndDrawing(); diff --git a/examples/textures_srcrec_dstrec.png b/examples/textures_srcrec_dstrec.png Binary files differindex 7459d6ec..9ea00fe4 100644 --- a/examples/textures_srcrec_dstrec.png +++ b/examples/textures_srcrec_dstrec.png |
