summaryrefslogtreecommitdiffhomepage
path: root/examples
diff options
context:
space:
mode:
Diffstat (limited to 'examples')
-rw-r--r--examples/Makefile (renamed from examples/makefile)185
-rw-r--r--examples/audio_module_playing.c141
-rw-r--r--examples/audio_module_playing.pngbin0 -> 47970 bytes
-rw-r--r--examples/audio_music_stream.c63
-rw-r--r--examples/audio_raw_stream.c114
-rw-r--r--examples/audio_raw_stream.pngbin0 -> 16736 bytes
-rw-r--r--examples/audio_sound_loading.c3
-rw-r--r--examples/audio_standalone.c123
-rw-r--r--examples/core_2d_camera.c139
-rw-r--r--examples/core_2d_camera.pngbin0 -> 21470 bytes
-rw-r--r--examples/core_3d_camera_first_person.c17
-rw-r--r--examples/core_3d_camera_first_person.pngbin18402 -> 17403 bytes
-rw-r--r--examples/core_3d_camera_free.c28
-rw-r--r--examples/core_3d_camera_free.pngbin25167 -> 25317 bytes
-rw-r--r--examples/core_3d_mode.c1
-rw-r--r--examples/core_3d_picking.c28
-rw-r--r--examples/core_3d_picking.pngbin24383 -> 24402 bytes
-rw-r--r--examples/core_basic_window.cpp62
-rw-r--r--examples/core_color_select.c4
-rw-r--r--examples/core_drop_files.c2
-rw-r--r--examples/core_gestures_detection.c12
-rw-r--r--examples/core_input_gamepad.c166
-rw-r--r--examples/core_input_gamepad.pngbin10840 -> 38066 bytes
-rw-r--r--examples/core_input_mouse.pngbin10644 -> 15444 bytes
-rw-r--r--examples/core_oculus_rift.c85
-rw-r--r--examples/core_oculus_rift.pngbin0 -> 177237 bytes
-rw-r--r--examples/core_world_screen.c11
-rw-r--r--examples/core_world_screen.pngbin0 -> 23813 bytes
-rw-r--r--examples/lighting_blinn_phong.pngbin50097 -> 0 bytes
-rw-r--r--examples/models_billboard.c12
-rw-r--r--examples/models_box_collisions.c42
-rw-r--r--examples/models_cubicmap.c13
-rw-r--r--examples/models_geometric_shapes.c2
-rw-r--r--examples/models_heightmap.c15
-rw-r--r--examples/models_obj_loading.c6
-rw-r--r--examples/models_ray_picking.c197
-rw-r--r--examples/physics_basic_rigidbody.c124
-rw-r--r--examples/physics_basic_rigidbody.pngbin18144 -> 0 bytes
-rw-r--r--examples/physics_demo.c122
-rw-r--r--examples/physics_demo.pngbin0 -> 23466 bytes
-rw-r--r--examples/physics_friction.c136
-rw-r--r--examples/physics_friction.pngbin0 -> 18150 bytes
-rw-r--r--examples/physics_movement.c122
-rw-r--r--examples/physics_movement.pngbin0 -> 15947 bytes
-rw-r--r--examples/physics_restitution.c115
-rw-r--r--examples/physics_restitution.pngbin0 -> 17833 bytes
-rw-r--r--examples/physics_rigidbody_force.c135
-rw-r--r--examples/physics_rigidbody_force.pngbin18510 -> 0 bytes
-rw-r--r--examples/physics_shatter.c107
-rw-r--r--examples/physics_shatter.pngbin0 -> 23197 bytes
-rw-r--r--examples/resources/audio/chiptun1.modbin0 -> 2142 bytes
-rw-r--r--examples/resources/audio/mini1111.xmbin0 -> 25676 bytes
-rw-r--r--examples/resources/audio/sound.wavbin0 -> 97512 bytes
-rw-r--r--examples/resources/audio/tanatana.flacbin0 -> 100733 bytes
-rw-r--r--examples/resources/fonts/KAISG.ttfbin0 -> 79912 bytes
-rw-r--r--examples/resources/fonts/pixantiqua.fnt188
-rw-r--r--examples/resources/fonts/pixantiqua_0.pngbin0 -> 4531 bytes
-rw-r--r--examples/resources/model/dwarf_normal.pngbin0 -> 4053623 bytes
-rw-r--r--examples/resources/model/dwarf_specular.pngbin0 -> 2938756 bytes
-rw-r--r--examples/resources/model/lowpoly-tower.obj456
-rw-r--r--examples/resources/model/lowpoly-tower.pngbin0 -> 24939 bytes
-rw-r--r--examples/resources/model/shapes.obj6433
-rw-r--r--examples/resources/ps3.pngbin0 -> 19345 bytes
-rw-r--r--examples/resources/shaders/bloom.fs42
-rw-r--r--examples/resources/shaders/glsl100/base.vs26
-rw-r--r--examples/resources/shaders/glsl100/bloom.fs39
-rw-r--r--examples/resources/shaders/glsl100/distortion.fs54
-rw-r--r--examples/resources/shaders/glsl100/grayscale.fs25
-rw-r--r--examples/resources/shaders/glsl100/standard.fs152
-rw-r--r--examples/resources/shaders/glsl100/standard.vs (renamed from examples/resources/shaders/shapes_base.vs)17
-rw-r--r--examples/resources/shaders/glsl100/swirl.fs45
-rw-r--r--examples/resources/shaders/glsl330/base.vs26
-rw-r--r--examples/resources/shaders/glsl330/bloom.fs40
-rw-r--r--examples/resources/shaders/glsl330/depth.fs27
-rw-r--r--examples/resources/shaders/glsl330/distortion.fs56
-rw-r--r--examples/resources/shaders/glsl330/grayscale.fs26
-rw-r--r--examples/resources/shaders/glsl330/standard.fs150
-rw-r--r--examples/resources/shaders/glsl330/standard.vs (renamed from examples/resources/shaders/base.vs)15
-rw-r--r--examples/resources/shaders/glsl330/swirl.fs (renamed from examples/resources/shaders/swirl.fs)17
-rw-r--r--examples/resources/shaders/grayscale.fs20
-rw-r--r--examples/resources/shaders/phong.fs76
-rw-r--r--examples/resources/shaders/phong.vs29
-rw-r--r--examples/resources/shaders/shapes_grayscale.fs15
-rw-r--r--examples/resources/xbox.pngbin0 -> 16177 bytes
-rw-r--r--examples/rlgl_oculus_rift.c393
-rw-r--r--examples/rlgl_standalone.c395
-rw-r--r--examples/shaders_basic_lighting.c171
-rw-r--r--examples/shaders_custom_uniform.c51
-rw-r--r--examples/shaders_custom_uniform.pngbin255357 -> 257677 bytes
-rw-r--r--examples/shaders_model_shader.c26
-rw-r--r--examples/shaders_postprocessing.c51
-rw-r--r--examples/shaders_postprocessing.pngbin222360 -> 237145 bytes
-rw-r--r--examples/shaders_shapes_textures.c25
-rw-r--r--examples/shaders_standard_lighting.c482
-rw-r--r--examples/shaders_standard_lighting.pngbin0 -> 251479 bytes
-rw-r--r--examples/shapes_basic_shapes.pngbin26439 -> 30382 bytes
-rw-r--r--examples/text_bmfont_ttf.c8
-rw-r--r--examples/text_bmfont_unordered.c65
-rw-r--r--examples/text_bmfont_unordered.pngbin0 -> 18713 bytes
-rw-r--r--examples/text_font_select.c6
-rw-r--r--examples/text_rbmf_fonts.c6
-rw-r--r--examples/text_sprite_fonts.c18
-rw-r--r--examples/text_ttf_loading.c130
-rw-r--r--examples/text_ttf_loading.pngbin0 -> 55588 bytes
-rw-r--r--examples/text_writing_anim.c6
-rw-r--r--examples/textures_particles_trail_blending.c24
-rw-r--r--examples/textures_srcrec_dstrec.pngbin48478 -> 47563 bytes
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
new file mode 100644
index 00000000..8bde9879
--- /dev/null
+++ b/examples/audio_module_playing.png
Binary files differ
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
new file mode 100644
index 00000000..344f4a71
--- /dev/null
+++ b/examples/audio_raw_stream.png
Binary files differ
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
new file mode 100644
index 00000000..d2f9e634
--- /dev/null
+++ b/examples/core_2d_camera.png
Binary files differ
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
index 9373da2d..a995591f 100644
--- a/examples/core_3d_camera_first_person.png
+++ b/examples/core_3d_camera_first_person.png
Binary files differ
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
index 17920620..7874eedc 100644
--- a/examples/core_3d_camera_free.png
+++ b/examples/core_3d_camera_free.png
Binary files differ
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
index bb7660b0..254f2f88 100644
--- a/examples/core_3d_picking.png
+++ b/examples/core_3d_picking.png
Binary files differ
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
index f7e55658..5996eece 100644
--- a/examples/core_input_gamepad.png
+++ b/examples/core_input_gamepad.png
Binary files differ
diff --git a/examples/core_input_mouse.png b/examples/core_input_mouse.png
index 76567281..a96e7faf 100644
--- a/examples/core_input_mouse.png
+++ b/examples/core_input_mouse.png
Binary files differ
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
new file mode 100644
index 00000000..aa4d0932
--- /dev/null
+++ b/examples/core_oculus_rift.png
Binary files differ
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
new file mode 100644
index 00000000..b4853b45
--- /dev/null
+++ b/examples/core_world_screen.png
Binary files differ
diff --git a/examples/lighting_blinn_phong.png b/examples/lighting_blinn_phong.png
deleted file mode 100644
index 4a3c5d18..00000000
--- a/examples/lighting_blinn_phong.png
+++ /dev/null
Binary files differ
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
deleted file mode 100644
index 3d691637..00000000
--- a/examples/physics_basic_rigidbody.png
+++ /dev/null
Binary files differ
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
new file mode 100644
index 00000000..12dc7e72
--- /dev/null
+++ b/examples/physics_demo.png
Binary files differ
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
new file mode 100644
index 00000000..e791ec2b
--- /dev/null
+++ b/examples/physics_friction.png
Binary files differ
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
new file mode 100644
index 00000000..a88a7d79
--- /dev/null
+++ b/examples/physics_movement.png
Binary files differ
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
new file mode 100644
index 00000000..8ec4b3f3
--- /dev/null
+++ b/examples/physics_restitution.png
Binary files differ
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
deleted file mode 100644
index 48afa91b..00000000
--- a/examples/physics_rigidbody_force.png
+++ /dev/null
Binary files differ
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
new file mode 100644
index 00000000..68f9a1b7
--- /dev/null
+++ b/examples/physics_shatter.png
Binary files differ
diff --git a/examples/resources/audio/chiptun1.mod b/examples/resources/audio/chiptun1.mod
new file mode 100644
index 00000000..00d16885
--- /dev/null
+++ b/examples/resources/audio/chiptun1.mod
Binary files differ
diff --git a/examples/resources/audio/mini1111.xm b/examples/resources/audio/mini1111.xm
new file mode 100644
index 00000000..a185c1a2
--- /dev/null
+++ b/examples/resources/audio/mini1111.xm
Binary files differ
diff --git a/examples/resources/audio/sound.wav b/examples/resources/audio/sound.wav
new file mode 100644
index 00000000..b5d01c9b
--- /dev/null
+++ b/examples/resources/audio/sound.wav
Binary files differ
diff --git a/examples/resources/audio/tanatana.flac b/examples/resources/audio/tanatana.flac
new file mode 100644
index 00000000..dfe735cd
--- /dev/null
+++ b/examples/resources/audio/tanatana.flac
Binary files differ
diff --git a/examples/resources/fonts/KAISG.ttf b/examples/resources/fonts/KAISG.ttf
new file mode 100644
index 00000000..04478b25
--- /dev/null
+++ b/examples/resources/fonts/KAISG.ttf
Binary files differ
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
new file mode 100644
index 00000000..2aa2870f
--- /dev/null
+++ b/examples/resources/fonts/pixantiqua_0.png
Binary files differ
diff --git a/examples/resources/model/dwarf_normal.png b/examples/resources/model/dwarf_normal.png
new file mode 100644
index 00000000..ae2babfd
--- /dev/null
+++ b/examples/resources/model/dwarf_normal.png
Binary files differ
diff --git a/examples/resources/model/dwarf_specular.png b/examples/resources/model/dwarf_specular.png
new file mode 100644
index 00000000..5f51039f
--- /dev/null
+++ b/examples/resources/model/dwarf_specular.png
Binary files differ
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
new file mode 100644
index 00000000..7c9239e2
--- /dev/null
+++ b/examples/resources/model/lowpoly-tower.png
Binary files differ
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
new file mode 100644
index 00000000..98befacc
--- /dev/null
+++ b/examples/resources/ps3.png
Binary files differ
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
new file mode 100644
index 00000000..029c9109
--- /dev/null
+++ b/examples/resources/xbox.png
Binary files differ
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
index 7d5400a1..dfddc3a7 100644
--- a/examples/shaders_custom_uniform.png
+++ b/examples/shaders_custom_uniform.png
Binary files differ
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
index 139080d1..684cbd41 100644
--- a/examples/shaders_postprocessing.png
+++ b/examples/shaders_postprocessing.png
Binary files differ
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
new file mode 100644
index 00000000..65efe47f
--- /dev/null
+++ b/examples/shaders_standard_lighting.png
Binary files differ
diff --git a/examples/shapes_basic_shapes.png b/examples/shapes_basic_shapes.png
index 03ecf2ec..a7d4a991 100644
--- a/examples/shapes_basic_shapes.png
+++ b/examples/shapes_basic_shapes.png
Binary files differ
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
new file mode 100644
index 00000000..c6767567
--- /dev/null
+++ b/examples/text_bmfont_unordered.png
Binary files differ
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
new file mode 100644
index 00000000..29ea263a
--- /dev/null
+++ b/examples/text_ttf_loading.png
Binary files differ
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
index 7459d6ec..9ea00fe4 100644
--- a/examples/textures_srcrec_dstrec.png
+++ b/examples/textures_srcrec_dstrec.png
Binary files differ